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"