KDevelop API Documentation

ktabzoomframe.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2001-2003                                               *
00003  *   The KDevelop Team                                                     *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00012 #include <qlayout.h>
00013 #include <qlabel.h>
00014 #include <qwidgetstack.h>
00015 #include <qtoolbutton.h>
00016 #include <qptrlist.h>
00017 #include <qframe.h>
00018 #include <qtimer.h>
00019 #include <qiconset.h>
00020 
00021 
00022 #include <kglobalsettings.h>
00023 #include <kdebug.h>
00024 #include <kapplication.h>
00025 
00026 
00027 #include "sticky.xpm"
00028 
00029 
00030 #include "ktabzoomframe.h"
00031 
00032 
00033 class KTZFWidgetInfo
00034 {
00035 public:
00036 
00037   QWidget *m_widget;
00038   int     m_index;
00039   QString m_title;
00040 
00041 };
00042 
00043 
00044 class KTabZoomFramePrivate
00045 {
00046 public:
00047 
00048   KTabZoomPosition::Position m_position;
00049   QLabel                     *m_title;
00050   QWidgetStack               *m_stack;
00051   int                        m_count;
00052   QPtrList<KTZFWidgetInfo>   m_info;
00053   QFrame                     *m_slider;
00054   bool                       m_sliding;
00055   QPoint                     m_slideStart;
00056   int                        m_initialPos, m_initialSize;
00057   QToolButton            *m_closeButton, *m_dockButton;
00058 
00059 };
00060 
00061 
00062 KTabZoomFrame::KTabZoomFrame(QWidget *parent, KTabZoomPosition::Position pos, const char *name)
00063   : QWidget(parent, name)
00064 {
00065   d = new KTabZoomFramePrivate;
00066   d->m_info.setAutoDelete(true);
00067 
00068   d->m_position = pos;
00069 
00070   QFrame *frame = new QFrame(this);
00071 
00072   frame->setFrameStyle(QFrame::Box | QFrame::Plain);
00073 
00074   QVBoxLayout *vbox = new QVBoxLayout(frame);
00075   vbox->setMargin(2);
00076 
00077   QFrame *f = new QFrame(frame);
00078   f->setBackgroundColor(KGlobalSettings::activeTitleColor());
00079   vbox->addWidget(f);
00080 
00081   QHBoxLayout *hbox = new QHBoxLayout(f);
00082   if (pos == KTabZoomPosition::Right)
00083     hbox->setDirection(QBoxLayout::RightToLeft);
00084 
00085   d->m_title = new QLabel(f);
00086   d->m_title->setPaletteBackgroundColor(KGlobalSettings::activeTitleColor());
00087   d->m_title->setPaletteForegroundColor(KGlobalSettings::activeTextColor());
00088   d->m_title->setAlignment(Qt::AlignCenter | Qt::ShowPrefix);
00089   hbox->addWidget(d->m_title, 1);
00090 
00091   QToolButton::ArrowType arrow = QToolButton::LeftArrow;
00092   switch (pos)
00093   {
00094   case KTabZoomPosition::Right:
00095     arrow = QToolButton::RightArrow;
00096     break;
00097   case KTabZoomPosition::Bottom:
00098     arrow = QToolButton::DownArrow;
00099     break;
00100   case KTabZoomPosition::Top:
00101     arrow = QToolButton::UpArrow;
00102     break;
00103   default:
00104     break;
00105   }
00106 
00107   d->m_dockButton = new QToolButton(f);
00108   d->m_dockButton->setPixmap(QPixmap((const char **)sticky));
00109   d->m_dockButton->setFixedSize(12,12);
00110   d->m_dockButton->setToggleButton(true);
00111 
00112   QPalette pal = d->m_dockButton->palette();
00113   QColorGroup cg = pal.active();
00114   cg.setColor(QColorGroup::Background, KGlobalSettings::activeTitleColor());
00115   pal.setActive(cg) ;
00116 
00117   hbox->addWidget(d->m_dockButton);
00118 
00119   connect(d->m_dockButton, SIGNAL(toggled(bool)), this, SLOT(slotDockButtonToggled(bool)));
00120 
00121   hbox->addSpacing(4);
00122 
00123   d->m_closeButton = new QToolButton(arrow, f);
00124   d->m_closeButton->setFixedSize(12,12);
00125   d->m_closeButton->setPalette(pal);
00126 
00127   hbox->addWidget(d->m_closeButton);
00128 
00129   connect(d->m_closeButton, SIGNAL(clicked()), this, SIGNAL(closeClicked()));
00130 
00131   hbox->addSpacing(4);
00132 
00133   d->m_stack = new QWidgetStack(frame);
00134   d->m_stack->setMinimumHeight(100);
00135   vbox->addWidget(d->m_stack, 1);
00136 
00137   QBoxLayout *box = 0;
00138   d->m_slider = new QFrame(this);
00139   d->m_slider->setFrameStyle(QFrame::Panel | QFrame::Raised);
00140 
00141   switch (pos)
00142   {
00143   case KTabZoomPosition::Left:
00144     box = new QHBoxLayout(this);
00145     box->addWidget(frame,1);
00146     box->addWidget(d->m_slider);
00147     d->m_slider->setFixedWidth(4);
00148     d->m_slider->setCursor(Qt::sizeHorCursor);
00149     break;
00150 
00151   case KTabZoomPosition::Right:
00152     box = new QHBoxLayout(this);
00153     box->addWidget(d->m_slider);
00154     box->addWidget(frame,1);
00155     d->m_slider->setFixedWidth(4);
00156     d->m_slider->setCursor(Qt::sizeHorCursor);
00157     break;
00158 
00159   case KTabZoomPosition::Bottom:
00160     box = new QVBoxLayout(this);
00161     box->addWidget(d->m_slider);
00162     box->addWidget(frame,1);
00163     d->m_slider->setFixedHeight(4);
00164     d->m_slider->setCursor(Qt::sizeVerCursor);
00165     break;
00166 
00167   case KTabZoomPosition::Top:
00168     box = new QVBoxLayout(this);
00169     box->addWidget(frame,1);
00170     box->addWidget(d->m_slider);
00171     d->m_slider->setFixedHeight(4);
00172     d->m_slider->setCursor(Qt::sizeVerCursor);
00173     break;
00174   }
00175 
00176   if (box)
00177     box->activate();
00178 
00179   d->m_sliding = false;
00180 
00181   d->m_count = 0;
00182 }
00183 
00184 
00185 KTabZoomFrame::~KTabZoomFrame()
00186 {
00187   delete d;
00188 }
00189 
00190 
00191 void KTabZoomFrame::setDockMode(bool docked)
00192 {
00193   d->m_dockButton->setOn(docked);
00194 }
00195 
00196 
00197 void KTabZoomFrame::slotDockButtonToggled(bool toggle)
00198 {
00199   setDockMode(toggle);
00200 
00201   emit dockToggled(toggle);
00202 }
00203 
00204 
00205 int KTabZoomFrame::addTab(QWidget *widget, const QString &title)
00206 {
00207   int index = d->m_count++;
00208 
00209   KTZFWidgetInfo *info = new KTZFWidgetInfo;
00210 
00211   info->m_index = d->m_stack->addWidget(widget, index);
00212   info->m_widget = widget;
00213   info->m_title = title;
00214 
00215   d->m_info.append(info);
00216   
00217   return index;
00218 }
00219 
00220 
00221 void KTabZoomFrame::removeTab(int index)
00222 {
00223   for (KTZFWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00224     if (i->m_index == index)
00225     {
00226       if(d->m_title->text()==i->m_title) emit closeClicked();
00227       d->m_info.remove(i);
00228       return;
00229     }
00230 }
00231 
00232 void KTabZoomFrame::selected(int index)
00233 {
00234   for (KTZFWidgetInfo *i=d->m_info.first(); i != 0; i = d->m_info.next())
00235     if (i->m_index == index)
00236     {
00237       d->m_stack->raiseWidget(i->m_widget);
00238       i->m_widget->setFocus();
00239       d->m_title->setText(i->m_title);
00240       i->m_widget->setFocus();
00241       return;
00242     }
00243 }
00244 
00245 void KTabZoomFrame::mousePressEvent(QMouseEvent *ev)
00246 {
00247   if (d->m_sliding || ev->button() != LeftButton)
00248     return;
00249 
00250   if (!d->m_slider->geometry().contains(ev->pos()))
00251     return;
00252 
00253   d->m_sliding = true;
00254   d->m_slideStart = ev->globalPos();
00255 
00256   switch (d->m_position)
00257   {
00258   case KTabZoomPosition::Left:
00259     d->m_initialSize = width();
00260     break;
00261 
00262   case KTabZoomPosition::Right:
00263     d->m_initialSize = width();
00264     d->m_initialPos = x() + width();
00265     break;
00266 
00267   case KTabZoomPosition::Top:
00268     d->m_initialSize = height();
00269     break;
00270 
00271   case KTabZoomPosition::Bottom:
00272     d->m_initialSize = height();
00273     d->m_initialPos = y()+height();
00274     break;
00275   }
00276 }
00277 
00278 void KTabZoomFrame::mouseReleaseEvent(QMouseEvent *)
00279 {
00280   if (d->m_sliding)
00281     d->m_sliding = false;
00282 
00283   emit sizeChanged();
00284 }
00285 
00286 void KTabZoomFrame::mouseMoveEvent(QMouseEvent *ev)
00287 {
00288   if (!d->m_sliding)
00289     return;
00290 
00291 
00292   int extend;
00293   switch (d->m_position)
00294   {
00295   case KTabZoomPosition::Left:
00296     extend = ev->globalPos().x() - d->m_slideStart.x() + d->m_initialSize;
00297     if (extend < minimumWidth()) extend = minimumWidth();  
00298     else if(extend > (int)(kapp->mainWidget()->width() / 2)) extend = (int)(kapp->mainWidget()->width() / 2);
00299     resize(extend, height());
00300     break;
00301 
00302   case KTabZoomPosition::Right:
00303     extend = d->m_slideStart.x() - ev->globalPos().x() + d->m_initialSize;
00304     if (extend < minimumWidth()) extend = minimumWidth(); 
00305     else if(extend > (int)(kapp->mainWidget()->width() / 2)) extend = (int)(kapp->mainWidget()->width() / 2);
00306     setGeometry(d->m_initialPos - extend, y(), extend, height());
00307     break;
00308 
00309   case KTabZoomPosition::Top:
00310     extend = ev->globalPos().y() - d->m_slideStart.y() + d->m_initialSize;
00311     if (extend < minimumHeight()) extend = minimumHeight();  
00312     else if(extend > (int)(kapp->mainWidget()->height() / 2)) extend = (int)(kapp->mainWidget()->height() / 2);
00313     resize(width(), extend);
00314     break;
00315 
00316   case KTabZoomPosition::Bottom:
00317     extend = d->m_slideStart.y() - ev->globalPos().y() + d->m_initialSize;
00318     if (extend < minimumHeight()) extend = minimumHeight();  
00319     else if(extend > (int)(kapp->mainWidget()->height() / 2)) extend = (int)(kapp->mainWidget()->height() / 2);
00320     setGeometry(x(), d->m_initialPos - extend, width(), extend);
00321     break;
00322   }
00323   emit sizeChanged();
00324 }
00325 
00326 
00327 #include "ktabzoomframe.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:53 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003