/* * This file is part of the KDE libraries * Copyright (c) 2001 Michael Goffioul * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. **/ #include "cjanuswidget.h" #include #include #include #include #include #include class CJanusWidget::CPage { public: QWidget *m_widget; QString m_text; QString m_header; QPixmap m_pixmap; CListBoxItem *m_item; }; //*********************************************************************************** class CJanusWidget::CListBoxItem : public QListBoxItem { public: CListBoxItem(TQListBox *lb, TQListBoxItem *after, const TQPixmap& pix, const TQString& text); int height(const TQListBox*) const; int width(const TQListBox*) const; protected: void paint(TQPainter*); private: QPixmap m_pix; }; CJanusWidget::CListBoxItem::CListBoxItem(TQListBox *lb, TQListBoxItem *after, const TQPixmap& pix, const TQString& text) : TQListBoxItem(lb, after), m_pix(pix) { setText(text); } int CJanusWidget::CListBoxItem::height(const TQListBox *lb) const { return (m_pix.height() + lb->fontMetrics().lineSpacing() + 12); } int CJanusWidget::CListBoxItem::width(const TQListBox *lb) const { int w = QMAX(lb->fontMetrics().width(text()),m_pix.width()); return (w + 10); } void CJanusWidget::CListBoxItem::paint(TQPainter *p) { int w1 = (listBox()->contentsWidth()-m_pix.width())/2; p->drawPixmap(w1,5,m_pix); p->drawText(0,7+m_pix.height(),listBox()->contentsWidth(),p->fontMetrics().lineSpacing(),Qt::AlignHCenter,text()); } //*********************************************************************************** class CJanusWidget::CListBox : public KListBox { public: CListBox(TQWidget *parent = 0, const char *name = 0); ~CListBox(); void computeWidth(); protected: virtual bool eventFilter(TQObject*, TQEvent*); }; CJanusWidget::CListBox::CListBox(TQWidget *parent, const char *name) : KListBox(parent,name) { verticalScrollBar()->installEventFilter(this); } CJanusWidget::CListBox::~CListBox() { } bool CJanusWidget::CListBox::eventFilter(TQObject *o, TQEvent *e) { if (e->type() == TQEvent::Show || e->type() == TQEvent::Hide) computeWidth(); return KListBox::eventFilter(o,e); } void CJanusWidget::CListBox::computeWidth() { QListBoxItem *item = firstItem(); int w(40); while (item) { w = QMAX(w,item->width(this)); item = item->next(); } if (verticalScrollBar()->isVisible()) w += verticalScrollBar()->tqsizeHint().width(); w += (frameWidth()*2); setFixedWidth(w); } //*********************************************************************************** CJanusWidget::CJanusWidget(TQWidget *parent, const char *name) : TQWidget(parent,name) { m_pages.setAutoDelete(true); m_stack = new TQWidgetStack(this); m_header = new TQLabel(this); QFont f(m_header->font()); f.setBold(true); m_header->setFont(f); KSeparator* sep = new KSeparator( KSeparator::HLine, this); sep->setFixedHeight(5); m_iconlist = new CListBox(this); f = m_iconlist->font(); f.setBold(true); m_iconlist->setFont(f); connect(m_iconlist,TQT_SIGNAL(selectionChanged(TQListBoxItem*)),TQT_SLOT(slotSelected(TQListBoxItem*))); m_empty = new TQWidget(this, "Empty"); m_stack->addWidget(m_empty,0); QHBoxLayout *main_ = new TQHBoxLayout(this, 0, 10); QVBoxLayout *sub_ = new TQVBoxLayout(0, 0, 5); main_->addWidget(m_iconlist,0); main_->addLayout(sub_,1); sub_->addWidget(m_header,0); sub_->addWidget(sep,0); sub_->addWidget(m_stack,1); } CJanusWidget::~CJanusWidget() { } void CJanusWidget::addPage(TQWidget *w, const TQString& text, const TQString& header, const TQPixmap& pix) { CPage *page = new CPage(); m_pages.append(page); page->m_widget = w; page->m_text = text; page->m_header = header; page->m_pixmap = pix; page->m_item = new CListBoxItem(m_iconlist,findPrevItem(page),pix,text); m_iconlist->computeWidth(); m_stack->addWidget(w,m_pages.count()); if (m_iconlist->count() == 1) m_iconlist->setSelected(page->m_item,true); } void CJanusWidget::enablePage(TQWidget *w) { CPage *page = findPage(w); if (page && !page->m_item) { page->m_item = new CListBoxItem(m_iconlist,findPrevItem(page),page->m_pixmap,page->m_text); m_iconlist->computeWidth(); if (m_iconlist->count() == 1) m_iconlist->setSelected(page->m_item,true); } } void CJanusWidget::disablePage(TQWidget *w) { CPage *page = findPage(w); if (page && page->m_item) { bool needReselect(m_iconlist->isSelected(page->m_item)); delete page->m_item; page->m_item = 0; m_iconlist->computeWidth(); if (needReselect) if (m_iconlist->count() > 0) m_iconlist->setSelected(m_iconlist->firstItem(),true); else slotSelected(0); } } void CJanusWidget::slotSelected(TQListBoxItem *item) { CPage *page = findPage(item); if (page) { m_stack->raiseWidget(page->m_widget); m_header->setText(page->m_header); } else { m_header->setText(""); m_stack->raiseWidget(m_empty); } } CJanusWidget::CPage* CJanusWidget::findPage(TQWidget *w) { TQPtrListIterator it(m_pages); for (;it.current();++it) if (it.current()->m_widget == w) return it.current(); return 0; } CJanusWidget::CPage* CJanusWidget::findPage(TQListBoxItem *i) { TQPtrListIterator it(m_pages); for (;it.current();++it) if (it.current()->m_item == i) return it.current(); return 0; } TQListBoxItem* CJanusWidget::findPrevItem(CPage *p) { if (m_pages.findRef(p) == -1) m_pages.last(); else m_pages.prev(); for (;m_pages.current();m_pages.prev()) if (m_pages.current()->m_item) return m_pages.current()->m_item; return 0; } void CJanusWidget::clearPages() { TQPtrListIterator it(m_pages); for (;it.current(); ++it) { delete it.current()->m_widget; delete it.current()->m_item; } m_pages.clear(); } #include "cjanuswidget.moc"