25 #include "splittercollapser.moc"
28 #include <QApplication>
30 #include <QMouseEvent>
32 #include <QStyleOptionToolButton>
33 #include <QStylePainter>
41 namespace KSaneIface {
58 : visible(Qt::NoArrow), notVisible(Qt::NoArrow){}
60 ArrowTypes(Qt::ArrowType t1, Qt::ArrowType t2)
61 : visible(t1), notVisible(t2) {}
63 Qt::ArrowType visible,
66 Qt::ArrowType
get(
bool isVisible) {
67 return isVisible ? visible : notVisible;
72 struct SplitterCollapserPrivate {
77 QTimeLine* mOpacityTimeLine;
80 bool isVertical()
const {
84 bool isVisible()
const {
85 bool isVisible = mWidget->isVisible();
86 QRect widgetRect = mWidget->geometry();
88 QPoint br = widgetRect.bottomRight();
89 if ((br.x() <= 0) || (br.y() <=0)) {
96 void updatePosition() {
98 QRect widgetRect = mWidget->geometry();
99 int splitterWidth = mSplitter->width();
100 int handleWidth = mSplitter->handleWidth();
101 int width = q->width();
106 if (mDirection ==
LTR) {
108 x = widgetRect.right() + handleWidth;
114 x = widgetRect.left() - handleWidth - width;
116 x = splitterWidth - handleWidth - width;
129 static QMap<Direction, ArrowTypes> arrowForDirection;
130 if (arrowForDirection.isEmpty()) {
131 arrowForDirection[
LTR] = ArrowTypes(Qt::LeftArrow, Qt::RightArrow);
132 arrowForDirection[
RTL] = ArrowTypes(Qt::RightArrow, Qt::LeftArrow);
133 arrowForDirection[
TTB] = ArrowTypes(Qt::UpArrow, Qt::DownArrow);
134 arrowForDirection[
BTT] = ArrowTypes(Qt::DownArrow, Qt::UpArrow);
136 q->setArrowType(arrowForDirection[mDirection].
get(isVisible()));
140 void widgetEventFilter(QEvent* event) {
141 switch (event->type()) {
161 void updateOpacity() {
162 QPoint pos = q->parentWidget()->mapFromGlobal(QCursor::pos());
163 QRect opaqueRect = q->geometry();
164 bool opaqueCollapser = opaqueRect.contains(pos);
165 int frame = mOpacityTimeLine->currentFrame();
166 if (opaqueCollapser && frame == mOpacityTimeLine->startFrame()) {
167 mOpacityTimeLine->setDirection(QTimeLine::Forward);
169 }
else if (!opaqueCollapser && frame == mOpacityTimeLine->endFrame()) {
170 mOpacityTimeLine->setDirection(QTimeLine::Backward);
176 void startTimeLine() {
177 if (mOpacityTimeLine->state() != QTimeLine::Running) {
178 mOpacityTimeLine->start();
186 d(new SplitterCollapserPrivate)
192 setAttribute(Qt::WA_NoChildEventsForParent);
196 connect(d->mOpacityTimeLine, SIGNAL(valueChanged(qreal)), SLOT(update()));
199 d->mWidget->installEventFilter(
this);
201 qApp->installEventFilter(
this);
203 d->mSplitter = splitter;
204 setParent(d->mSplitter);
206 if (splitter->indexOf(widget) < splitter->count() / 2) {
213 d->mDirection =
static_cast<Direction>(int(d->mDirection) + int(
TTB));
216 connect(
this, SIGNAL(clicked()), SLOT(slotClicked()));
228 if (
object == d->mWidget) {
229 d->widgetEventFilter(event);
231 if (event->type() == QEvent::MouseMove) {
240 int extent = style()->pixelMetric(QStyle::PM_ScrollBarExtent);
241 QSize sh(extent * 3 / 4, extent * 240 / 100);
242 if (d->isVertical()) {
249 void SplitterCollapser::slotClicked() {
250 QList<int> sizes = d->mSplitter->sizes();
251 int index = d->mSplitter->indexOf(d->mWidget);
252 if (d->isVisible()) {
253 d->mSizeAtCollaps = sizes[index];
257 if (d->mSizeAtCollaps != 0) {
258 sizes[index] = d->mSizeAtCollaps;
261 if (d->isVertical()) {
262 sizes[index] = d->mWidget->sizeHint().height();
265 sizes[index] = d->mWidget->sizeHint().width();
269 d->mSplitter->setSizes(sizes);
273 if (d->isVisible()) slotClicked();
278 if (!d->isVisible()) slotClicked();
283 if (collapse == d->isVisible()) slotClicked();
288 QStylePainter painter(
this);
289 qreal opacity = d->mOpacityTimeLine->currentFrame() / 1000.;
290 painter.setOpacity(opacity);
292 QStyleOptionToolButton opt;
293 initStyleOption(&opt);
294 if (d->mDirection ==
LTR) {
295 opt.rect.setLeft(-width());
297 opt.rect.setWidth(width() * 2);
299 painter.drawPrimitive(QStyle::PE_PanelButtonTool, opt);
301 QStyleOptionToolButton opt2;
302 initStyleOption(&opt2);
303 painter.drawControl(QStyle::CE_ToolButtonLabel, opt2);
virtual void paintEvent(QPaintEvent *)
const int TIMELINE_DURATION
virtual QSize sizeHint() const
SplitterCollapser(QSplitter *, QWidget *widget)
const qreal MINIMUM_OPACITY
virtual bool eventFilter(QObject *, QEvent *)
void slotSetCollapsed(bool collapsed)