SelectionToggle::SelectionToggle(QWidget* parent) :
QAbstractButton(parent),
m_isHovered(false),
+ m_leftMouseButtonPressed(false),
m_fadingValue(0),
m_icon(),
m_fadingTimeLine(0)
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);
}
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) {
const char* icon = checked ? "list-remove" : "list-add";
m_icon = KIconLoader::global()->loadIcon(icon,
KIconLoader::NoGroup,
- KIconLoader::SizeSmall);
+ qMin(width(), height()));
update();
}