KDevelop API Documentation

lib/widgets/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.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Oct 6 17:39:08 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003