X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/bad99f25fee78ccf36971da00e3ef18d493c22fe..ae17139546eedbc1e7cc1e887b06a07122ee3a2a:/src/selectiontoggle.cpp diff --git a/src/selectiontoggle.cpp b/src/selectiontoggle.cpp index eb02edcb2..6608b5821 100644 --- a/src/selectiontoggle.cpp +++ b/src/selectiontoggle.cpp @@ -19,9 +19,11 @@ #include "selectiontoggle.h" +#include #include #include #include +#include #include #include @@ -32,15 +34,19 @@ SelectionToggle::SelectionToggle(QWidget* parent) : QAbstractButton(parent), m_isHovered(false), + m_leftMouseButtonPressed(false), m_fadingValue(0), m_icon(), m_fadingTimeLine(0) { + setFocusPolicy(Qt::NoFocus); parent->installEventFilter(this); resize(sizeHint()); setIconOverlay(isChecked()); connect(this, SIGNAL(toggled(bool)), this, SLOT(setIconOverlay(bool))); + connect(KGlobalSettings::self(), SIGNAL(iconChanged(int)), + this, SLOT(refreshIcon())); } SelectionToggle::~SelectionToggle() @@ -84,9 +90,27 @@ void SelectionToggle::setVisible(bool visible) 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); } @@ -101,6 +125,8 @@ void SelectionToggle::enterEvent(QEvent* event) m_fadingTimeLine->stop(); } m_fadingValue = 255; + setToolTip(isChecked() ? i18nc("@info:tooltip", "Deselect Item") : + i18nc("@info:tooltip", "Select Item")); update(); } @@ -111,26 +137,28 @@ void SelectionToggle::leaveEvent(QEvent* event) update(); } -void SelectionToggle::paintEvent(QPaintEvent* event) +void SelectionToggle::mousePressEvent(QMouseEvent* event) { - QPainter painter(this); - painter.setClipRect(event->rect()); - painter.setRenderHint(QPainter::Antialiasing); - - // draw an alpha blended circle as background - const QPalette& palette = parentWidget()->palette(); + QAbstractButton::mousePressEvent(event); + m_leftMouseButtonPressed = (event->buttons() & Qt::LeftButton); +} - const QBrush& backgroundBrush = palette.brush(QPalette::Normal, QPalette::Window); - QColor background = backgroundBrush.color(); - background.setAlpha(m_fadingValue / 2); - painter.setBrush(background); +void SelectionToggle::mouseReleaseEvent(QMouseEvent* event) +{ + QAbstractButton::mouseReleaseEvent(event); + m_leftMouseButtonPressed = (event->buttons() & Qt::LeftButton); +} - const QBrush& foregroundBrush = palette.brush(QPalette::Normal, QPalette::WindowText); - QColor foreground = foregroundBrush.color(); - foreground.setAlpha(m_fadingValue / 4); - painter.setPen(foreground); +void SelectionToggle::resizeEvent(QResizeEvent* event) +{ + QAbstractButton::resizeEvent(event); + setIconOverlay(isChecked()); +} - painter.drawEllipse(0, 0, width(), height()); +void SelectionToggle::paintEvent(QPaintEvent* event) +{ + QPainter painter(this); + painter.setClipRect(event->rect()); // draw the icon overlay if (m_isHovered) { @@ -168,15 +196,23 @@ void SelectionToggle::setIconOverlay(bool checked) const char* icon = checked ? "list-remove" : "list-add"; m_icon = KIconLoader::global()->loadIcon(icon, KIconLoader::NoGroup, - KIconLoader::SizeSmall); + qMin(width(), height())); update(); } +void SelectionToggle::refreshIcon() +{ + setIconOverlay(isChecked()); +} + void SelectionToggle::startFading() { Q_ASSERT(m_fadingTimeLine == 0); - m_fadingTimeLine = new QTimeLine(1500, this); + 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);