This might/should fix issues where a single click not always opened a link. At least
I can't reproduce this anymore. As a side benefit, it also now ignores mouse movements
during click that for some reason sometimes screwed up things.
+ContentsChatItem::Clickable ContentsChatItem::clickableAt(const QPointF &pos) const {
+ qint16 idx = posToCursor(pos);
+ for(int i = 0; i < privateData()->clickables.count(); i++) {
+ Clickable click = privateData()->clickables.at(i);
+ if(idx >= click.start && idx < click.start + click.length)
+ return click;
+ }
+ return Clickable();
+}
+
QVector<QTextLayout::FormatRange> ContentsChatItem::additionalFormats() const {
// mark a clickable if hovered upon
QVector<QTextLayout::FormatRange> fmt;
QVector<QTextLayout::FormatRange> ContentsChatItem::additionalFormats() const {
// mark a clickable if hovered upon
QVector<QTextLayout::FormatRange> fmt;
void ContentsChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) {
if(clickMode == ChatScene::SingleClick) {
void ContentsChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) {
if(clickMode == ChatScene::SingleClick) {
- Clickable click = privateData()->currentClickable;
+ Clickable click = clickableAt(pos);
if(click.isValid()) {
QString str = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length);
switch(click.type) {
if(click.isValid()) {
QString str = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length);
switch(click.type) {
} else if(clickMode == ChatScene::DoubleClick) {
chatScene()->setSelectingItem(this);
setSelectionMode(PartialSelection);
} else if(clickMode == ChatScene::DoubleClick) {
chatScene()->setSelectingItem(this);
setSelectionMode(PartialSelection);
- Clickable click = privateData()->currentClickable;
+ Clickable click = clickableAt(pos);
if(click.isValid()) {
setSelectionStart(click.start);
setSelectionEnd(click.start + click.length);
if(click.isValid()) {
setSelectionStart(click.start);
setSelectionEnd(click.start + click.length);
void ContentsChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
bool onClickable = false;
void ContentsChatItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event) {
bool onClickable = false;
- qint16 idx = posToCursor(event->pos());
- for(int i = 0; i < privateData()->clickables.count(); i++) {
- Clickable click = privateData()->clickables.at(i);
- if(idx >= click.start && idx < click.start + click.length) {
- if(click.type == Clickable::Url) {
- onClickable = true;
- showWebPreview(click);
- } else if(click.type == Clickable::Channel) {
- // TODO: don't make clickable if it's our own name
- // onClickable = true; //FIXME disabled for now
- }
- if(onClickable) {
- setCursor(Qt::PointingHandCursor);
- privateData()->currentClickable = click;
- update();
- break;
- }
+ Clickable click = clickableAt(event->pos());
+ if(click.isValid()) {
+ if(click.type == Clickable::Url) {
+ onClickable = true;
+ showWebPreview(click);
+ } else if(click.type == Clickable::Channel) {
+ // TODO: don't make clickable if it's our own name
+ // onClickable = true; //FIXME disabled for now
+ }
+ if(onClickable) {
+ setCursor(Qt::PointingHandCursor);
+ privateData()->currentClickable = click;
+ update();
+ return;
}
}
if(!onClickable) endHoverMode();
}
}
if(!onClickable) endHoverMode();
inline ContentsChatItemPrivate *privateData() const;
QList<Clickable> findClickables() const;
inline ContentsChatItemPrivate *privateData() const;
QList<Clickable> findClickables() const;
+ Clickable clickableAt(const QPointF &pos) const;
+
void endHoverMode();
void showWebPreview(const Clickable &click);
void clearWebPreview();
void endHoverMode();
void showWebPreview(const Clickable &click);
void clearWebPreview();