summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
9ce9c0a)
This finishes the mouse event handling overhaul (except for marking-by double/triple clicks).
Saves us a couple event handlers, and we don't need to check for drags in ChatItem anymore.
if(_selectionMode == FullSelection)
return true;
if(_selectionMode == PartialSelection) {
if(_selectionMode == FullSelection)
return true;
if(_selectionMode == PartialSelection) {
- int cursor = posToCursor(pos); qDebug() << cursor << _selectionStart << _selectionEnd;
+ int cursor = posToCursor(pos);
return cursor >= qMin(_selectionStart, _selectionEnd) && cursor <= qMax(_selectionStart, _selectionEnd);
}
return false;
return cursor >= qMin(_selectionStart, _selectionEnd) && cursor <= qMax(_selectionStart, _selectionEnd);
}
return false;
}
void ChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) {
}
void ChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) {
- if(clickMode == ChatScene::SingleClick) {
+ // single clicks are already handled by the scene (for clearing the selection)
+ if(clickMode == ChatScene::DragStartClick) {
chatScene()->setSelectingItem(this);
_selectionStart = _selectionEnd = posToCursor(pos);
_selectionMode = NoSelection; // will be set to PartialSelection by mouseMoveEvent
update();
chatScene()->setSelectingItem(this);
_selectionStart = _selectionEnd = posToCursor(pos);
_selectionMode = NoSelection; // will be set to PartialSelection by mouseMoveEvent
update();
+ } else if(clickMode == ChatScene::DoubleClick) {
+ //_selectionMode = PartialSelection;
+
+ } else if(clickMode == ChatScene::TripleClick) {
+
-void ContentsChatItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
- privateData()->hasDragged = false;
- ChatItem::mousePressEvent(event);
-}
-
-void ContentsChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
- if(!event->buttons() && !privateData()->hasDragged) {
- // got a click
+void ContentsChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) {
+ if(clickMode == ChatScene::SingleClick) {
Clickable click = privateData()->currentClickable;
if(click.isValid()) {
QString str = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length);
switch(click.type) {
case Clickable::Url:
Clickable click = privateData()->currentClickable;
if(click.isValid()) {
QString str = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length);
switch(click.type) {
case Clickable::Url:
- if(!str.contains("://"))
- str = "http://" + str;
+ if(!str.contains("://"))
+ str = "http://" + str;
QDesktopServices::openUrl(QUrl::fromEncoded(str.toAscii()));
break;
case Clickable::Channel:
QDesktopServices::openUrl(QUrl::fromEncoded(str.toAscii()));
break;
case Clickable::Channel:
- ChatItem::mouseReleaseEvent(event);
+ ChatItem::handleClick(pos, clickMode);
}
void ContentsChatItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
// mouse move events always mean we're not hovering anymore...
endHoverMode();
}
void ContentsChatItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
// mouse move events always mean we're not hovering anymore...
endHoverMode();
- // also, check if we have dragged the mouse
- if(hasPrivateData() && !privateData()->hasDragged && event->buttons() & Qt::LeftButton
- && (event->buttonDownScreenPos(Qt::LeftButton) - event->screenPos()).manhattanLength() >= QApplication::startDragDistance())
- privateData()->hasDragged = true;
ChatItem::mouseMoveEvent(event);
}
ChatItem::mouseMoveEvent(event);
}
if(idx >= click.start && idx < click.start + click.length) {
if(click.type == Clickable::Url) {
onClickable = true;
if(idx >= click.start && idx < click.start + click.length) {
if(click.type == Clickable::Url) {
onClickable = true;
} else if(click.type == Clickable::Channel) {
// TODO: don't make clickable if it's our own name
//onClickable = true; //FIXME disabled for now
} else if(click.type == Clickable::Channel) {
// TODO: don't make clickable if it's our own name
//onClickable = true; //FIXME disabled for now
protected:
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
protected:
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
+ virtual void handleClick(const QPointF &pos, ChatScene::ClickMode clickMode);
virtual QVector<QTextLayout::FormatRange> additionalFormats() const;
virtual QVector<QTextLayout::FormatRange> additionalFormats() const;
ContentsChatItem *contentsItem;
QList<ContentsChatItem::Clickable> clickables;
ContentsChatItem::Clickable currentClickable;
ContentsChatItem *contentsItem;
QList<ContentsChatItem::Clickable> clickables;
ContentsChatItem::Clickable currentClickable;
ContentsChatItemPrivate(QTextLayout *l, const QList<ContentsChatItem::Clickable> &c, ContentsChatItem *parent)
ContentsChatItemPrivate(QTextLayout *l, const QList<ContentsChatItem::Clickable> &c, ContentsChatItem *parent)
- : ChatItemPrivate(l), contentsItem(parent), clickables(c), hasDragged(false) {}
+ : ChatItemPrivate(l), contentsItem(parent), clickables(c) {}
};
//inlines regarding ContentsChatItemPrivate
};
//inlines regarding ContentsChatItemPrivate
if(_clickTimer.isActive()) _clickTimer.stop();
if(_clickMode == SingleClick && isPosOverSelection(_clickPos))
initiateDrag(event->widget());
if(_clickTimer.isActive()) _clickTimer.stop();
if(_clickMode == SingleClick && isPosOverSelection(_clickPos))
initiateDrag(event->widget());
+ else {
+ _clickMode = DragStartClick;
handleClick(Qt::LeftButton, _clickPos);
handleClick(Qt::LeftButton, _clickPos);
_clickMode = NoClick;
}
if(_isSelecting) {
_clickMode = NoClick;
}
if(_isSelecting) {
NoClick,
SingleClick,
DoubleClick,
NoClick,
SingleClick,
DoubleClick,
+ TripleClick,
+ DragStartClick
};
ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, ChatView *parent);
};
ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, ChatView *parent);