diff options
Diffstat (limited to 'src/selectiontoggle.cpp')
| -rw-r--r-- | src/selectiontoggle.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/selectiontoggle.cpp b/src/selectiontoggle.cpp new file mode 100644 index 000000000..eb02edcb2 --- /dev/null +++ b/src/selectiontoggle.cpp @@ -0,0 +1,197 @@ +/*************************************************************************** + * Copyright (C) 2008 by Peter Penz <[email protected]> * + * * + * 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 of the License, 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. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "selectiontoggle.h" + +#include <kicon.h> +#include <kiconloader.h> +#include <kiconeffect.h> + +#include <QPainter> +#include <QPaintEvent> +#include <QRect> +#include <QTimer> +#include <QTimeLine> + +SelectionToggle::SelectionToggle(QWidget* parent) : + QAbstractButton(parent), + m_isHovered(false), + m_fadingValue(0), + m_icon(), + m_fadingTimeLine(0) +{ + parent->installEventFilter(this); + resize(sizeHint()); + setIconOverlay(isChecked()); + connect(this, SIGNAL(toggled(bool)), + this, SLOT(setIconOverlay(bool))); +} + +SelectionToggle::~SelectionToggle() +{ +} + +QSize SelectionToggle::sizeHint() const +{ + return QSize(16, 16); +} + +void SelectionToggle::reset() +{ + m_url = KUrl(); + hide(); +} + +void SelectionToggle::setUrl(const KUrl& url) +{ + m_url = url; + if (!url.isEmpty()) { + startFading(); + } +} + +KUrl SelectionToggle::url() const +{ + return m_url; +} + +void SelectionToggle::setVisible(bool visible) +{ + QAbstractButton::setVisible(visible); + + stopFading(); + if (visible) { + startFading(); + } + +} + +bool SelectionToggle::eventFilter(QObject* obj, QEvent* event) +{ + if ((obj == parent()) && (event->type() == QEvent::Leave)) { + hide(); + } + return QAbstractButton::eventFilter(obj, event); +} + +void SelectionToggle::enterEvent(QEvent* event) +{ + QAbstractButton::enterEvent(event); + + // if the mouse cursor is above the selection toggle, display + // it immediately without fading timer + m_isHovered = true; + if (m_fadingTimeLine != 0) { + m_fadingTimeLine->stop(); + } + m_fadingValue = 255; + update(); +} + +void SelectionToggle::leaveEvent(QEvent* event) +{ + QAbstractButton::leaveEvent(event); + m_isHovered = false; + update(); +} + +void SelectionToggle::paintEvent(QPaintEvent* event) +{ + QPainter painter(this); + painter.setClipRect(event->rect()); + painter.setRenderHint(QPainter::Antialiasing); + + // draw an alpha blended circle as background + const QPalette& palette = parentWidget()->palette(); + + const QBrush& backgroundBrush = palette.brush(QPalette::Normal, QPalette::Window); + QColor background = backgroundBrush.color(); + background.setAlpha(m_fadingValue / 2); + painter.setBrush(background); + + const QBrush& foregroundBrush = palette.brush(QPalette::Normal, QPalette::WindowText); + QColor foreground = foregroundBrush.color(); + foreground.setAlpha(m_fadingValue / 4); + painter.setPen(foreground); + + painter.drawEllipse(0, 0, width(), height()); + + // draw the icon overlay + if (m_isHovered) { + KIconEffect iconEffect; + QPixmap activeIcon = iconEffect.apply(m_icon, KIconLoader::Desktop, KIconLoader::ActiveState); + painter.drawPixmap(0, 0, activeIcon); + } else { + if (m_fadingValue < 255) { + // apply an alpha mask respecting the fading value to the icon + QPixmap icon = m_icon; + QPixmap alphaMask(icon.width(), icon.height()); + const QColor color(m_fadingValue, m_fadingValue, m_fadingValue); + alphaMask.fill(color); + icon.setAlphaChannel(alphaMask); + painter.drawPixmap(0, 0, icon); + } else { + // no fading is required + painter.drawPixmap(0, 0, m_icon); + } + } +} + +void SelectionToggle::setFadingValue(int value) +{ + m_fadingValue = value; + if (m_fadingValue >= 255) { + Q_ASSERT(m_fadingTimeLine != 0); + m_fadingTimeLine->stop(); + } + update(); +} + +void SelectionToggle::setIconOverlay(bool checked) +{ + const char* icon = checked ? "list-remove" : "list-add"; + m_icon = KIconLoader::global()->loadIcon(icon, + KIconLoader::NoGroup, + KIconLoader::SizeSmall); + update(); +} + +void SelectionToggle::startFading() +{ + Q_ASSERT(m_fadingTimeLine == 0); + + m_fadingTimeLine = new QTimeLine(1500, this); + connect(m_fadingTimeLine, SIGNAL(frameChanged(int)), + this, SLOT(setFadingValue(int))); + m_fadingTimeLine->setFrameRange(0, 255); + m_fadingTimeLine->start(); + m_fadingValue = 0; +} + +void SelectionToggle::stopFading() +{ + if (m_fadingTimeLine != 0) { + m_fadingTimeLine->stop(); + delete m_fadingTimeLine; + m_fadingTimeLine = 0; + } + m_fadingValue = 0; +} + +#include "selectiontoggle.moc" |
