ktabzoomframe.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
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"
This file is part of the documentation for KDevelop Version 3.1.2.