KDEPrint
cjanuswidget.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "cjanuswidget.h"
00021
00022 #include <QtCore/QEvent>
00023 #include <QtGui/QLabel>
00024 #include <QtGui/QLayout>
00025 #include <QtGui/QPainter>
00026 #include <QtGui/QScrollBar>
00027 #include <QtGui/QStackedWidget>
00028 #include <QtGui/QItemDelegate>
00029
00030 #include <klistwidget.h>
00031 #include <kseparator.h>
00032
00033 class CJanusWidget::CPage
00034 {
00035 public:
00036 QWidget *m_widget;
00037 QString m_text;
00038 QString m_header;
00039 QPixmap m_pixmap;
00040 QListWidgetItem *m_item;
00041 };
00042
00043
00044
00045
00046
00047
00048 class CJanusWidget::CListBox : public KListWidget
00049 {
00050 public:
00051 CListBox(QWidget *parent = 0);
00052 ~CListBox();
00053
00054 void computeWidth();
00055
00056 protected:
00057 virtual bool eventFilter(QObject*, QEvent*);
00058 };
00059
00060 CJanusWidget::CListBox::CListBox(QWidget *parent)
00061 : KListWidget(parent)
00062 {
00063 verticalScrollBar()->installEventFilter(this);
00064 }
00065
00066 CJanusWidget::CListBox::~CListBox()
00067 {
00068 }
00069
00070 bool CJanusWidget::CListBox::eventFilter(QObject *o, QEvent *e)
00071 {
00072 if (e->type() == QEvent::Show || e->type() == QEvent::Hide)
00073 computeWidth();
00074 return KListWidget::eventFilter(o, e);
00075 }
00076
00077 void CJanusWidget::CListBox::computeWidth()
00078 {
00079 int w(40);
00080 for (int rowIndex = 0 ; rowIndex < count() ; rowIndex++) {
00081 QListWidgetItem *listItem = item(rowIndex);
00082 w = qMax(w, visualItemRect(listItem).width());
00083 }
00084
00085 if (verticalScrollBar()->isVisible())
00086 w += verticalScrollBar()->sizeHint().width();
00087 w += (frameWidth() * 2);
00088 setFixedWidth(w);
00089 }
00090
00091
00092
00093 CJanusWidget::CJanusWidget(QWidget *parent)
00094 : QWidget(parent)
00095 {
00096
00097 m_stack = new QStackedWidget(this);
00098 m_header = new QLabel(this);
00099 QFont f(m_header->font());
00100 f.setBold(true);
00101 m_header->setFont(f);
00102
00103 KSeparator* sep = new KSeparator(Qt::Horizontal, this);
00104 sep->setFixedHeight(5);
00105
00106 m_iconlist = new CListBox(this);
00107 f = m_iconlist->font();
00108 f.setBold(true);
00109 m_iconlist->setFont(f);
00110 connect(m_iconlist, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), SLOT(slotSelected(QListWidgetItem*)));
00111
00112 m_empty = new QWidget(this);
00113 m_empty->setObjectName("Empty");
00114 m_stack->insertWidget(0, m_empty);
00115
00116 QHBoxLayout *main_ = new QHBoxLayout(this);
00117 main_->setMargin(0);
00118 main_->setSpacing(10);
00119 QVBoxLayout *sub_ = new QVBoxLayout();
00120 main_->addWidget(m_iconlist, 0);
00121 main_->addLayout(sub_, 1);
00122 sub_->setMargin(0);
00123 sub_->setSpacing(5);
00124 sub_->addWidget(m_header, 0);
00125 sub_->addWidget(sep, 0);
00126 sub_->addWidget(m_stack, 1);
00127 }
00128
00129 CJanusWidget::~CJanusWidget()
00130 {
00131 qDeleteAll(m_pages);
00132 m_pages.clear();
00133 }
00134
00135 void CJanusWidget::addPage(QWidget *w, const QString& text, const QString& header, const QPixmap& pix)
00136 {
00137 CPage *page = new CPage();
00138 m_pages.append(page);
00139 page->m_widget = w;
00140 page->m_text = text;
00141 page->m_header = header;
00142 page->m_pixmap = pix;
00143 page->m_item = new QListWidgetItem(pix, text, m_iconlist);
00144 m_iconlist->computeWidth();
00145 m_stack->insertWidget(m_pages.count(), w);
00146
00147 if (m_iconlist->count() == 1) {
00148 page->m_item->setSelected(true);
00149 slotSelected(page->m_item);
00150 }
00151 }
00152
00153 void CJanusWidget::enablePage(QWidget *w)
00154 {
00155 CPage *page = findPage(w);
00156 if (page && !page->m_item) {
00157 page->m_item = new QListWidgetItem(page->m_pixmap, page->m_text, m_iconlist);
00158 m_iconlist->computeWidth();
00159 if (m_iconlist->count() == 1)
00160 page->m_item->setSelected(true);
00161 }
00162 }
00163
00164 void CJanusWidget::disablePage(QWidget *w)
00165 {
00166 CPage *page = findPage(w);
00167 if (page && page->m_item) {
00168 bool needReselect(page->m_item->isSelected());
00169 delete page->m_item;
00170 page->m_item = 0;
00171 m_iconlist->computeWidth();
00172 if (needReselect)
00173 if (m_iconlist->count() > 0)
00174 m_iconlist->item(0)->setSelected(true);
00175 else
00176 slotSelected(0);
00177 }
00178 }
00179
00180 void CJanusWidget::slotSelected(QListWidgetItem *item)
00181 {
00182 CPage *page = findPage(item);
00183 if (page) {
00184 m_stack->setCurrentWidget(page->m_widget);
00185 m_header->setText(page->m_header);
00186 } else {
00187 m_header->setText("");
00188 m_stack->setCurrentWidget(m_empty);
00189 }
00190 }
00191
00192 CJanusWidget::CPage* CJanusWidget::findPage(QWidget *w)
00193 {
00194 QListIterator<CPage*> it(m_pages);
00195 while (it.hasNext()) {
00196 CPage *item = it.next();
00197 if (item->m_widget == w)
00198 return item;
00199 }
00200 return NULL;
00201 }
00202
00203 CJanusWidget::CPage* CJanusWidget::findPage(QListWidgetItem *i)
00204 {
00205 QListIterator<CPage*> it(m_pages);
00206 while (it.hasNext()) {
00207 CPage *item = it.next();
00208 if (item->m_item == i)
00209 return item;
00210 }
00211 return NULL;
00212 }
00213
00214 QListWidgetItem* CJanusWidget::findPrevItem(CPage *p)
00215 {
00216 QListIterator<CPage*> it(m_pages);
00217
00218 if (it.findNext(p))
00219 it.previous();
00220
00221 while (it.hasPrevious()) {
00222 CPage *item = it.previous();
00223 if (item->m_item)
00224 return item->m_item;
00225 }
00226 return NULL;
00227 }
00228
00229 void CJanusWidget::clearPages()
00230 {
00231 QListIterator<CPage*> it(m_pages);
00232 while (it.hasNext()) {
00233 CPage *item = it.next();
00234 delete item->m_widget;
00235 delete item->m_item;
00236 }
00237 m_pages.clear();
00238 }
00239
00240 #include "cjanuswidget.moc"