void ChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) {
if(_selectionMode != NoSelection && !event->buttons() & Qt::LeftButton) {
- QString selection
- = data(MessageModel::DisplayRole).toString().mid(qMin(_selectionStart, _selectionEnd), qAbs(_selectionStart - _selectionEnd));
- chatScene()->putToClipboard(selection);
+ chatScene()->selectionToClipboard(QClipboard::Selection);
event->accept();
} else
event->ignore();
}
+void ChatItem::addActionsToMenu(QMenu *menu, const QPointF &pos) {
+ Q_UNUSED(menu);
+ Q_UNUSED(pos);
+
+}
+
// ************************************************************
// SenderChatItem
// ************************************************************
// ************************************************************
// ContentsChatItem
// ************************************************************
+
+ContentsChatItem::ActionProxy ContentsChatItem::_actionProxy;
+
ContentsChatItem::ContentsChatItem(const qreal &width, const QPointF &pos, QGraphicsItem *parent)
: ChatItem(0, 0, pos, parent)
{
return result;
}
+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;
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) {
} 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);
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();
event->accept();
}
-void ContentsChatItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
- 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) {
- QMenu menu;
- QAction *copyToClipboard = menu.addAction(QObject::tr("Copy to Clipboard"));
- QAction *selected = menu.exec(event->screenPos());
- if(selected == copyToClipboard) {
- QString url = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length);
-# ifdef Q_WS_X11
- QApplication::clipboard()->setText(url, QClipboard::Selection);
-# endif
-//# else
- QApplication::clipboard()->setText(url);
-//# endif
- }
- }
+void ContentsChatItem::addActionsToMenu(QMenu *menu, const QPointF &pos) {
+ Q_UNUSED(pos); // we assume that the current mouse cursor pos is the point of invocation
+
+ if(privateData()->currentClickable.isValid()) {
+ switch(privateData()->currentClickable.type) {
+ case Clickable::Url:
+ privateData()->activeClickable = privateData()->currentClickable;
+ menu->addAction(tr("Copy Link Address"), &_actionProxy, SLOT(copyLinkToClipboard()))->setData(QVariant::fromValue<void *>(this));
+ break;
+
+ default:
+ break;
}
}
}
+void ContentsChatItem::copyLinkToClipboard() {
+ Clickable click = privateData()->activeClickable;
+ if(click.isValid() && click.type == Clickable::Url) {
+ QString url = data(ChatLineModel::DisplayRole).toString().mid(click.start, click.length);
+ if(!url.contains("://"))
+ url = "http://" + url;
+ chatScene()->stringToClipboard(url);
+ }
+}
+
+/******** WEB PREVIEW *****************************************************************************/
+
void ContentsChatItem::showWebPreview(const Clickable &click) {
#ifndef HAVE_WEBKIT
Q_UNUSED(click);
return -1;
}
+/*************************************************************************************************/
+