X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f6c7b90edf05a52fba6e2a06caa0247e909b43e8..d009bf5eae4760e4ced150ff08a6351fb96f640e:/src/selectiontoggle.cpp diff --git a/src/selectiontoggle.cpp b/src/selectiontoggle.cpp index 244f51583..6608b5821 100644 --- a/src/selectiontoggle.cpp +++ b/src/selectiontoggle.cpp @@ -19,32 +19,34 @@ #include "selectiontoggle.h" +#include #include #include #include +#include #include #include #include #include - -#include +#include SelectionToggle::SelectionToggle(QWidget* parent) : QAbstractButton(parent), - m_showIcon(false), m_isHovered(false), + m_leftMouseButtonPressed(false), + m_fadingValue(0), m_icon(), - m_timer(0) + m_fadingTimeLine(0) { + setFocusPolicy(Qt::NoFocus); 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())); + setIconOverlay(isChecked()); + connect(this, SIGNAL(toggled(bool)), + this, SLOT(setIconOverlay(bool))); + connect(KGlobalSettings::self(), SIGNAL(iconChanged(int)), + this, SLOT(refreshIcon())); } SelectionToggle::~SelectionToggle() @@ -56,30 +58,75 @@ 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) { - m_timer->start(1000); - } else { - m_timer->stop(); - m_showIcon = false; + startFading(); } + } bool SelectionToggle::eventFilter(QObject* obj, QEvent* event) { - if ((obj == parent()) && (event->type() == QEvent::Leave)) { - hide(); + if (obj == parent()) { + switch (event->type()) { + case QEvent::Leave: + hide(); + break; + + case QEvent::MouseMove: + if (m_leftMouseButtonPressed) { + // Don't forward mouse move events to the viewport, + // otherwise a rubberband selection will be shown when + // clicking on the selection toggle and moving the mouse + // above the viewport. + return true; + } + break; + + default: + break; + } } + 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; - m_showIcon = true; + if (m_fadingTimeLine != 0) { + m_fadingTimeLine->stop(); + } + m_fadingValue = 255; + setToolTip(isChecked() ? i18nc("@info:tooltip", "Deselect Item") : + i18nc("@info:tooltip", "Select Item")); update(); } @@ -90,24 +137,97 @@ void SelectionToggle::leaveEvent(QEvent* event) update(); } +void SelectionToggle::mousePressEvent(QMouseEvent* event) +{ + QAbstractButton::mousePressEvent(event); + m_leftMouseButtonPressed = (event->buttons() & Qt::LeftButton); +} + +void SelectionToggle::mouseReleaseEvent(QMouseEvent* event) +{ + QAbstractButton::mouseReleaseEvent(event); + m_leftMouseButtonPressed = (event->buttons() & Qt::LeftButton); +} + +void SelectionToggle::resizeEvent(QResizeEvent* event) +{ + QAbstractButton::resizeEvent(event); + setIconOverlay(isChecked()); +} + void SelectionToggle::paintEvent(QPaintEvent* event) { QPainter painter(this); painter.setClipRect(event->rect()); + // 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_showIcon) { - painter.drawPixmap(0, 0, m_icon); + } 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::showIcon() +void SelectionToggle::setFadingValue(int value) { - m_showIcon = true; + 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, + qMin(width(), height())); update(); } +void SelectionToggle::refreshIcon() +{ + setIconOverlay(isChecked()); +} + +void SelectionToggle::startFading() +{ + Q_ASSERT(m_fadingTimeLine == 0); + + const bool animate = KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects; + const int duration = animate ? 600 : 1; + + m_fadingTimeLine = new QTimeLine(duration, 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"