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"