From b1d9c3ea56467245c910ac1de1252c2a91c234f0 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Wed, 30 Jun 2010 18:33:02 +0200 Subject: [PATCH] Fix and Qt-4.6-ify ColumnHandleItem Now that we depend on Qt 4.6, use QGraphicsObject and QPropertyAnimation. Also, the columnhandle can now no longer get lost while moving. Fixes #247, fixes #687. --- src/qtui/chatitem.cpp | 2 +- src/qtui/chatscene.cpp | 8 --- src/qtui/chatscene.h | 2 - src/qtui/columnhandleitem.cpp | 105 +++++++++++++++++----------------- src/qtui/columnhandleitem.h | 58 +++++++++---------- 5 files changed, 81 insertions(+), 94 deletions(-) diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index ec45d873..5e2942cc 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -597,7 +597,7 @@ QVector ContentsChatItem::additionalFormats() const { void ContentsChatItem::endHoverMode() { if(privateData()) { if(privateData()->currentClickable.isValid()) { - chatLine()->setCursor(Qt::ArrowCursor); + chatLine()->unsetCursor(); privateData()->currentClickable = Clickable(); } clearWebPreview(); diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 3ab059a3..e5537a05 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -1017,14 +1017,6 @@ void ChatScene::updateSceneRect(const QRectF &rect) { update(); } -bool ChatScene::event(QEvent *e) { - if(e->type() == QEvent::ApplicationPaletteChange) { - _firstColHandle->setColor(QApplication::palette().windowText().color()); - _secondColHandle->setColor(QApplication::palette().windowText().color()); - } - return QGraphicsScene::event(e); -} - // ======================================== // Webkit Only stuff // ======================================== diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index a5cbe7bd..c54c1862 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -123,8 +123,6 @@ public: bool isScrollingAllowed() const; - virtual bool event(QEvent *e); - public slots: void updateForViewport(qreal width, qreal height); void setWidth(qreal width); diff --git a/src/qtui/columnhandleitem.cpp b/src/qtui/columnhandleitem.cpp index f79019c4..3db40532 100644 --- a/src/qtui/columnhandleitem.cpp +++ b/src/qtui/columnhandleitem.cpp @@ -1,52 +1,55 @@ /*************************************************************************** -* Copyright (C) 2005-09 by the Quassel Project * -* devel@quassel-irc.org * -* * -* 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) version 3. * -* * -* 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., * -* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * -***************************************************************************/ - + * Copyright (C) 2005-2010 by the Quassel Project * + * devel@quassel-irc.org * + * * + * 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) version 3. * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include "chatview.h" #include "columnhandleitem.h" #include #include -#include #include #include #include -#include - ColumnHandleItem::ColumnHandleItem(qreal w, QGraphicsItem *parent) - : QGraphicsItem(parent), + : QGraphicsObject(parent), _width(w), _boundingRect(-_width/2, 0, _width, 0), - _hover(0), _moving(false), + _offset(0), _minXPos(0), _maxXPos(0), - _timeLine(350), - _rulerColor(QApplication::palette().windowText().color()) + _opacity(0), + _animation(new QPropertyAnimation(this, "opacity", this)) { - _timeLine.setUpdateInterval(20); setAcceptsHoverEvents(true); setZValue(10); setCursor(QCursor(Qt::OpenHandCursor)); - connect(&_timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(hoverChanged(qreal))); + _animation->setStartValue(0); + _animation->setEndValue(1); + _animation->setDirection(QPropertyAnimation::Forward); + _animation->setDuration(350); + _animation->setEasingCurve(QEasingCurve::InOutSine); + + //connect(&_timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(hoverChanged(qreal))); } void ColumnHandleItem::setXPos(qreal xpos) { @@ -68,14 +71,19 @@ void ColumnHandleItem::sceneRectChanged(const QRectF &rect) { _boundingRect = QRectF(-_width/2, rect.y(), _width, rect.height()); } +void ColumnHandleItem::setOpacity(qreal opacity) { + _opacity = opacity; + update(); +} + void ColumnHandleItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if(event->buttons() & Qt::LeftButton && _moving) { - if(contains(event->lastPos())) { - qreal newx = x() + (event->scenePos() - event->lastScenePos()).x(); - if(newx < _minXPos) newx = _minXPos; - else if(newx + width() > _maxXPos) newx = _maxXPos - width(); - setPos(newx, 0); - } + qreal newx = event->scenePos().x() - _offset; + if(newx < _minXPos) + newx = _minXPos; + else if(newx + width() > _maxXPos) + newx = _maxXPos - width(); + setPos(newx, 0); event->accept(); } else { event->ignore(); @@ -84,8 +92,9 @@ void ColumnHandleItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { void ColumnHandleItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { if(event->buttons() & Qt::LeftButton) { - setCursor(QCursor(Qt::ClosedHandCursor)); + QApplication::setOverrideCursor(Qt::ClosedHandCursor); _moving = true; + _offset = event->pos().x(); event->accept(); } else { event->ignore(); @@ -95,11 +104,11 @@ void ColumnHandleItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { void ColumnHandleItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if(_moving) { _moving = false; - setCursor(QCursor(Qt::OpenHandCursor)); QRectF sceneBRect = _boundingRect.translated(x(), 0); _sceneLeft = sceneBRect.left(); _sceneRight = sceneBRect.right(); emit positionChanged(x()); + QApplication::restoreOverrideCursor(); event->accept(); } else { event->ignore(); @@ -109,22 +118,15 @@ void ColumnHandleItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { void ColumnHandleItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); - _timeLine.setDirection(QTimeLine::Forward); - if(_timeLine.state() != QTimeLine::Running) - _timeLine.start(); + _animation->setDirection(QPropertyAnimation::Forward); + _animation->start(); } void ColumnHandleItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); - _timeLine.setDirection(QTimeLine::Backward); - if(_timeLine.state() != QTimeLine::Running) - _timeLine.start(); -} - -void ColumnHandleItem::hoverChanged(qreal value) { - _hover = value; - update(); + _animation->setDirection(QPropertyAnimation::Backward); + _animation->start(); } void ColumnHandleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { @@ -132,12 +134,11 @@ void ColumnHandleItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * Q_UNUSED(widget); QLinearGradient gradient(boundingRect().topLeft(), boundingRect().topRight()); - QColor _rulerColor = QApplication::palette().windowText().color(); - _rulerColor.setAlphaF(_hover); + QColor color = QApplication::palette().windowText().color(); + color.setAlphaF(_opacity); gradient.setColorAt(0, Qt::transparent); - gradient.setColorAt(0.4, _rulerColor); - gradient.setColorAt(0.6, _rulerColor); + gradient.setColorAt(0.45, color); + gradient.setColorAt(0.55, color); gradient.setColorAt(1, Qt::transparent); painter->fillRect(boundingRect(), gradient); } - diff --git a/src/qtui/columnhandleitem.h b/src/qtui/columnhandleitem.h index 2947bba5..aba5ac2b 100644 --- a/src/qtui/columnhandleitem.h +++ b/src/qtui/columnhandleitem.h @@ -1,38 +1,35 @@ /*************************************************************************** -* Copyright (C) 2005-09 by the Quassel Project * -* devel@quassel-irc.org * -* * -* 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) version 3. * -* * -* 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., * -* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * -***************************************************************************/ + * Copyright (C) 2005-2010 by the Quassel Project * + * devel@quassel-irc.org * + * * + * 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) version 3. * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ #ifndef COLUMNHANDLEITEM_H_ #define COLUMNHANDLEITEM_H_ -#include #include #include -#include +#include #include "chatscene.h" -class ColumnHandleItem : public QObject, public QGraphicsItem { +class ColumnHandleItem : public QGraphicsObject { Q_OBJECT -#if QT_VERSION >= 0x040600 - Q_INTERFACES(QGraphicsItem) -#endif + Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity) public: ColumnHandleItem(qreal width, QGraphicsItem *parent = 0); @@ -43,6 +40,8 @@ public: inline qreal sceneLeft() const { return _sceneLeft; } inline qreal sceneRight() const { return _sceneRight; } + inline qreal opacity() const { return _opacity; } + void setXPos(qreal xpos); void setXLimits(qreal min, qreal max); @@ -50,7 +49,7 @@ public: public slots: void sceneRectChanged(const QRectF &); - inline void setColor(const QColor &color) { _rulerColor = color; } + void setOpacity(qreal opacity); protected: void hoverEnterEvent(QGraphicsSceneHoverEvent *event); @@ -62,18 +61,15 @@ protected: signals: void positionChanged(qreal x); -private slots: - void hoverChanged(qreal value); - private: qreal _width; qreal _sceneLeft, _sceneRight; QRectF _boundingRect; - qreal _hover; bool _moving; + qreal _offset; qreal _minXPos, _maxXPos; - QTimeLine _timeLine; - QColor _rulerColor; + qreal _opacity; + QPropertyAnimation *_animation; }; #endif -- 2.20.1