diff options
| author | Peter Penz <[email protected]> | 2008-01-26 21:45:28 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2008-01-26 21:45:28 +0000 |
| commit | f6c7b90edf05a52fba6e2a06caa0247e909b43e8 (patch) | |
| tree | cda08606cd172d460d404f7f822b528985fa8e03 /src/selectiontoggle.cpp | |
| parent | 453131d6e8a59af87e943455e26074ce8e3ddae3 (diff) | |
Blend in a toggle button when hovering items. This allows selecting items without using the rubberband or Ctrl/Shift-keys in the single-click mode. Any feedback from users is highly welcome (I think people will either love or hate this feature, I'm really not sure -> it can be turned off too).
svn path=/trunk/KDE/kdebase/apps/; revision=766901
Diffstat (limited to 'src/selectiontoggle.cpp')
| -rw-r--r-- | src/selectiontoggle.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/src/selectiontoggle.cpp b/src/selectiontoggle.cpp new file mode 100644 index 000000000..244f51583 --- /dev/null +++ b/src/selectiontoggle.cpp @@ -0,0 +1,113 @@ +/*************************************************************************** + * 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 <kdebug.h> + +SelectionToggle::SelectionToggle(QWidget* parent) : + QAbstractButton(parent), + m_showIcon(false), + m_isHovered(false), + m_icon(), + m_timer(0) +{ + parent->installEventFilter(this); + resize(sizeHint()); + m_icon = KIconLoader::global()->loadIcon("dialog-ok", + KIconLoader::NoGroup, + KIconLoader::SizeSmall); + m_timer = new QTimer(this); + connect(m_timer, SIGNAL(timeout()), + this, SLOT(showIcon())); +} + +SelectionToggle::~SelectionToggle() +{ +} + +QSize SelectionToggle::sizeHint() const +{ + return QSize(16, 16); +} + +void SelectionToggle::setVisible(bool visible) +{ + QAbstractButton::setVisible(visible); + if (visible) { + m_timer->start(1000); + } else { + m_timer->stop(); + m_showIcon = false; + } +} + +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); + m_isHovered = true; + m_showIcon = true; + 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()); + + if (m_isHovered) { + KIconEffect iconEffect; + QPixmap activeIcon = iconEffect.apply(m_icon, KIconLoader::Desktop, KIconLoader::ActiveState); + painter.drawPixmap(0, 0, activeIcon); + } else if (m_showIcon) { + painter.drawPixmap(0, 0, m_icon); + } +} + +void SelectionToggle::showIcon() +{ + m_showIcon = true; + update(); +} + +#include "selectiontoggle.moc" |
