#include "selectiontoggle.h"
+#include <kglobalsettings.h>
#include <kicon.h>
#include <kiconloader.h>
#include <kiconeffect.h>
+#include <klocale.h>
#include <QPainter>
#include <QPaintEvent>
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());
- m_icon = KIconLoader::global()->loadIcon("dialog-ok",
- KIconLoader::NoGroup,
- KIconLoader::SizeSmall);
+ setIconOverlay(isChecked());
+ connect(this, SIGNAL(toggled(bool)),
+ this, SLOT(setIconOverlay(bool)));
+ connect(KGlobalSettings::self(), SIGNAL(iconChanged(int)),
+ this, SLOT(refreshIcon()));
}
SelectionToggle::~SelectionToggle()
void SelectionToggle::reset()
{
- m_item = KFileItem();
+ m_url = KUrl();
hide();
}
-void SelectionToggle::setFileItem(const KFileItem& item)
+void SelectionToggle::setUrl(const KUrl& url)
{
- m_item = item;
- if (!item.isNull()) {
+ m_url = url;
+ if (!url.isEmpty()) {
startFading();
}
}
-KFileItem SelectionToggle::fileItem() const
+KUrl SelectionToggle::url() const
{
- return m_item;
+ return m_url;
}
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);
}
m_fadingTimeLine->stop();
}
m_fadingValue = 255;
+ setToolTip(isChecked() ? i18nc("@info:tooltip", "Deselect Item") :
+ i18nc("@info:tooltip", "Select Item"));
update();
}
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::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);
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::refreshIcon()
+{
+ setIconOverlay(isChecked());
+}
+
void SelectionToggle::startFading()
{
Q_ASSERT(m_fadingTimeLine == 0);
- m_fadingTimeLine = new QTimeLine(2000, 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);