diff options
Diffstat (limited to 'src/libs/widgets/common/statuszoombar.cpp')
-rw-r--r-- | src/libs/widgets/common/statuszoombar.cpp | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/src/libs/widgets/common/statuszoombar.cpp b/src/libs/widgets/common/statuszoombar.cpp new file mode 100644 index 00000000..44302481 --- /dev/null +++ b/src/libs/widgets/common/statuszoombar.cpp @@ -0,0 +1,208 @@ +/* ============================================================ + * + * This file is a part of digiKam project + * http://www.digikam.org + * + * Date : 2007-04-15 + * Description : a zoom bar used in status bar. + * + * Copyright (C) 2007 by Gilles Caulier <caulier dot gilles at gmail dot com> + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software Foundation; + * either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * ============================================================ */ + +// TQt includes. + +#include <tqtoolbutton.h> +#include <tqtimer.h> +#include <tqslider.h> +#include <tqtooltip.h> +#include <tqevent.h> + +// KDE includes. + +#include <tdelocale.h> +#include <kiconloader.h> + +// Local includes. + +#include "thumbnailsize.h" +#include "dcursortracker.h" +#include "statuszoombar.h" +#include "statuszoombar.moc" + +namespace Digikam +{ + +TQSliderReverseWheel::TQSliderReverseWheel(TQWidget *parent) + : TQSlider(parent) +{ + // empty, we just need to re-implement wheelEvent to reverse the wheel +} + +TQSliderReverseWheel::~TQSliderReverseWheel() +{ +} + +void TQSliderReverseWheel::wheelEvent(TQWheelEvent * e) +{ + if ( e->orientation() != orientation() && !rect().contains(e->pos()) ) + return; + + static float offset = 0; + static TQSlider* offset_owner = 0; + if (offset_owner != this){ + offset_owner = this; + offset = 0; + } + // note: different sign in front of e->delta vs. original implementation + offset += e->delta()*TQMAX(pageStep(),lineStep())/120; + if (TQABS(offset)<1) + return; + setValue( value() + int(offset) ); + offset -= int(offset); + e->accept(); +} + +// ---------------------------------------------------------------------- + +class StatusZoomBarPriv +{ + +public: + + StatusZoomBarPriv() + { + zoomTracker = 0; + zoomMinusButton = 0; + zoomPlusButton = 0; + zoomSlider = 0; + zoomTimer = 0; + } + + TQToolButton *zoomPlusButton; + TQToolButton *zoomMinusButton; + + TQTimer *zoomTimer; + + TQSlider *zoomSlider; + + DTipTracker *zoomTracker; +}; + +StatusZoomBar::StatusZoomBar(TQWidget *parent) + : TQHBox(parent, 0, TQt::WDestructiveClose) +{ + d = new StatusZoomBarPriv; + setFocusPolicy(TQWidget::NoFocus); + + d->zoomMinusButton = new TQToolButton(this); + d->zoomMinusButton->setAutoRaise(true); + d->zoomMinusButton->setFocusPolicy(TQWidget::NoFocus); + d->zoomMinusButton->setIconSet(SmallIconSet("zoom-out")); + TQToolTip::add(d->zoomMinusButton, i18n("Zoom Out")); + + d->zoomSlider = new TQSliderReverseWheel(this); + d->zoomSlider->setMinValue(ThumbnailSize::Small); + d->zoomSlider->setMaxValue(ThumbnailSize::Huge); + d->zoomSlider->setPageStep(ThumbnailSize::Step); + d->zoomSlider->setValue(ThumbnailSize::Medium); + d->zoomSlider->setOrientation(TQt::Horizontal); + d->zoomSlider->setLineStep(ThumbnailSize::Step); + d->zoomSlider->setMaximumHeight(fontMetrics().height()+2); + d->zoomSlider->setFixedWidth(120); + d->zoomSlider->setFocusPolicy(TQWidget::NoFocus); + + d->zoomPlusButton = new TQToolButton(this); + d->zoomPlusButton->setAutoRaise(true); + d->zoomPlusButton->setIconSet(SmallIconSet("zoom-in")); + d->zoomPlusButton->setFocusPolicy(TQWidget::NoFocus); + TQToolTip::add(d->zoomPlusButton, i18n("Zoom In")); + + d->zoomTracker = new DTipTracker("", d->zoomSlider); + + // ------------------------------------------------------------- + + connect(d->zoomMinusButton, TQ_SIGNAL(clicked()), + this, TQ_SIGNAL(signalZoomMinusClicked())); + + connect(d->zoomPlusButton, TQ_SIGNAL(clicked()), + this, TQ_SIGNAL(signalZoomPlusClicked())); + + connect(d->zoomSlider, TQ_SIGNAL(valueChanged(int)), + this, TQ_SIGNAL(signalZoomSliderChanged(int))); + + connect(d->zoomSlider, TQ_SIGNAL(valueChanged(int)), + this, TQ_SLOT(slotZoomSliderChanged(int))); + + connect(d->zoomSlider, TQ_SIGNAL(sliderReleased()), + this, TQ_SLOT(slotZoomSliderReleased())); +} + +StatusZoomBar::~StatusZoomBar() +{ + if (d->zoomTimer) + delete d->zoomTimer; + + delete d->zoomTracker; + delete d; +} + +void StatusZoomBar::slotZoomSliderChanged(int) +{ + if (d->zoomTimer) + { + d->zoomTimer->stop(); + delete d->zoomTimer; + } + + d->zoomTimer = new TQTimer( this ); + connect(d->zoomTimer, TQ_SIGNAL(timeout()), + this, TQ_SLOT(slotDelayedZoomSliderChanged()) ); + d->zoomTimer->start(300, true); +} + +void StatusZoomBar::slotDelayedZoomSliderChanged() +{ + emit signalDelayedZoomSliderChanged(d->zoomSlider->value()); +} + +void StatusZoomBar::slotZoomSliderReleased() +{ + emit signalZoomSliderReleased(d->zoomSlider->value()); +} + +void StatusZoomBar::setZoomSliderValue(int v) +{ + d->zoomSlider->blockSignals(true); + d->zoomSlider->setValue(v); + d->zoomSlider->blockSignals(false); +} + +void StatusZoomBar::setZoomTrackerText(const TQString& text) +{ + d->zoomTracker->setText(text); +} + +void StatusZoomBar::setEnableZoomPlus(bool e) +{ + d->zoomPlusButton->setEnabled(e); +} + +void StatusZoomBar::setEnableZoomMinus(bool e) +{ + d->zoomMinusButton->setEnabled(e); +} + +} // namespace Digikam + |