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 <qwidgetstack.h>
00023 #include <qlabel.h>
00024 #include <qpainter.h>
00025 #include <klistbox.h>
00026 #include <qlayout.h>
00027 #include <kseparator.h>
00028
00029 class CJanusWidget::CPage
00030 {
00031 public:
00032 QWidget *m_widget;
00033 QString m_text;
00034 QString m_header;
00035 QPixmap m_pixmap;
00036 CListBoxItem *m_item;
00037 };
00038
00039
00040
00041 class CJanusWidget::CListBoxItem : public QListBoxItem
00042 {
00043 public:
00044 CListBoxItem(QListBox *lb, QListBoxItem *after, const QPixmap& pix, const QString& text);
00045 int height(const QListBox*) const;
00046 int width(const QListBox*) const;
00047
00048 protected:
00049 void paint(QPainter*);
00050
00051 private:
00052 QPixmap m_pix;
00053 };
00054
00055 CJanusWidget::CListBoxItem::CListBoxItem(QListBox *lb, QListBoxItem *after, const QPixmap& pix, const QString& text)
00056 : QListBoxItem(lb, after), m_pix(pix)
00057 {
00058 setText(text);
00059 }
00060
00061 int CJanusWidget::CListBoxItem::height(const QListBox *lb) const
00062 {
00063 return (m_pix.height() + lb->fontMetrics().lineSpacing() + 12);
00064 }
00065
00066 int CJanusWidget::CListBoxItem::width(const QListBox *lb) const
00067 {
00068 int w = QMAX(lb->fontMetrics().width(text()),m_pix.width());
00069 return (w + 10);
00070 }
00071
00072 void CJanusWidget::CListBoxItem::paint(QPainter *p)
00073 {
00074 int w1 = (listBox()->contentsWidth()-m_pix.width())/2;
00075
00076 p->drawPixmap(w1,5,m_pix);
00077 p->drawText(0,7+m_pix.height(),listBox()->contentsWidth(),p->fontMetrics().lineSpacing(),Qt::AlignHCenter,text());
00078 }
00079
00080
00081
00082 class CJanusWidget::CListBox : public KListBox
00083 {
00084 public:
00085 CListBox(QWidget *parent = 0, const char *name = 0);
00086 ~CListBox();
00087
00088 void computeWidth();
00089
00090 protected:
00091 virtual bool eventFilter(QObject*, QEvent*);
00092 };
00093
00094 CJanusWidget::CListBox::CListBox(QWidget *parent, const char *name)
00095 : KListBox(parent,name)
00096 {
00097 verticalScrollBar()->installEventFilter(this);
00098 }
00099
00100 CJanusWidget::CListBox::~CListBox()
00101 {
00102 }
00103
00104 bool CJanusWidget::CListBox::eventFilter(QObject *o, QEvent *e)
00105 {
00106 if (e->type() == QEvent::Show || e->type() == QEvent::Hide)
00107 computeWidth();
00108 return KListBox::eventFilter(o,e);
00109 }
00110
00111 void CJanusWidget::CListBox::computeWidth()
00112 {
00113 QListBoxItem *item = firstItem();
00114 int w(40);
00115 while (item)
00116 {
00117 w = QMAX(w,item->width(this));
00118 item = item->next();
00119 }
00120 if (verticalScrollBar()->isVisible())
00121 w += verticalScrollBar()->sizeHint().width();
00122 w += (frameWidth()*2);
00123 setFixedWidth(w);
00124 }
00125
00126
00127
00128 CJanusWidget::CJanusWidget(QWidget *parent, const char *name)
00129 : QWidget(parent,name)
00130 {
00131 m_pages.setAutoDelete(true);
00132
00133 m_stack = new QWidgetStack(this);
00134 m_header = new QLabel(this);
00135 QFont f(m_header->font());
00136 f.setBold(true);
00137 m_header->setFont(f);
00138
00139 KSeparator* sep = new KSeparator( KSeparator::HLine, this);
00140 sep->setFixedHeight(5);
00141
00142 m_iconlist = new CListBox(this);
00143 f = m_iconlist->font();
00144 f.setBold(true);
00145 m_iconlist->setFont(f);
00146 connect(m_iconlist,SIGNAL(selectionChanged(QListBoxItem*)),SLOT(slotSelected(QListBoxItem*)));
00147
00148 m_empty = new QWidget(this, "Empty");
00149 m_stack->addWidget(m_empty,0);
00150
00151 QHBoxLayout *main_ = new QHBoxLayout(this, 0, 10);
00152 QVBoxLayout *sub_ = new QVBoxLayout(0, 0, 5);
00153 main_->addWidget(m_iconlist,0);
00154 main_->addLayout(sub_,1);
00155 sub_->addWidget(m_header,0);
00156 sub_->addWidget(sep,0);
00157 sub_->addWidget(m_stack,1);
00158 }
00159
00160 CJanusWidget::~CJanusWidget()
00161 {
00162 }
00163
00164 void CJanusWidget::addPage(QWidget *w, const QString& text, const QString& header, const QPixmap& pix)
00165 {
00166 CPage *page = new CPage();
00167 m_pages.append(page);
00168 page->m_widget = w;
00169 page->m_text = text;
00170 page->m_header = header;
00171 page->m_pixmap = pix;
00172 page->m_item = new CListBoxItem(m_iconlist,findPrevItem(page),pix,text);
00173 m_iconlist->computeWidth();
00174 m_stack->addWidget(w,m_pages.count());
00175
00176 if (m_iconlist->count() == 1)
00177 m_iconlist->setSelected(page->m_item,true);
00178 }
00179
00180 void CJanusWidget::enablePage(QWidget *w)
00181 {
00182 CPage *page = findPage(w);
00183 if (page && !page->m_item)
00184 {
00185 page->m_item = new CListBoxItem(m_iconlist,findPrevItem(page),page->m_pixmap,page->m_text);
00186 m_iconlist->computeWidth();
00187 if (m_iconlist->count() == 1)
00188 m_iconlist->setSelected(page->m_item,true);
00189 }
00190 }
00191
00192 void CJanusWidget::disablePage(QWidget *w)
00193 {
00194 CPage *page = findPage(w);
00195 if (page && page->m_item)
00196 {
00197 bool needReselect(m_iconlist->isSelected(page->m_item));
00198 delete page->m_item;
00199 page->m_item = 0;
00200 m_iconlist->computeWidth();
00201 if (needReselect)
00202 if (m_iconlist->count() > 0)
00203 m_iconlist->setSelected(m_iconlist->firstItem(),true);
00204 else
00205 slotSelected(0);
00206 }
00207 }
00208
00209 void CJanusWidget::slotSelected(QListBoxItem *item)
00210 {
00211 CPage *page = findPage(item);
00212 if (page)
00213 {
00214 m_stack->raiseWidget(page->m_widget);
00215 m_header->setText(page->m_header);
00216 }
00217 else
00218 {
00219 m_header->setText("");
00220 m_stack->raiseWidget(m_empty);
00221 }
00222 }
00223
00224 CJanusWidget::CPage* CJanusWidget::findPage(QWidget *w)
00225 {
00226 QPtrListIterator<CPage> it(m_pages);
00227 for (;it.current();++it)
00228 if (it.current()->m_widget == w)
00229 return it.current();
00230 return 0;
00231 }
00232
00233 CJanusWidget::CPage* CJanusWidget::findPage(QListBoxItem *i)
00234 {
00235 QPtrListIterator<CPage> it(m_pages);
00236 for (;it.current();++it)
00237 if (it.current()->m_item == i)
00238 return it.current();
00239 return 0;
00240 }
00241
00242 QListBoxItem* CJanusWidget::findPrevItem(CPage *p)
00243 {
00244 if (m_pages.findRef(p) == -1)
00245 m_pages.last();
00246 else
00247 m_pages.prev();
00248 for (;m_pages.current();m_pages.prev())
00249 if (m_pages.current()->m_item)
00250 return m_pages.current()->m_item;
00251 return 0;
00252 }
00253
00254 void CJanusWidget::clearPages()
00255 {
00256 QPtrListIterator<CPage> it(m_pages);
00257 for (;it.current(); ++it)
00258 {
00259 delete it.current()->m_widget;
00260 delete it.current()->m_item;
00261 }
00262 m_pages.clear();
00263 }
00264
00265 #include "cjanuswidget.moc"