diff --git a/src/chatlog/chatlog.cpp b/src/chatlog/chatlog.cpp index 089a70eb1..93ff2a1fc 100644 --- a/src/chatlog/chatlog.cpp +++ b/src/chatlog/chatlog.cpp @@ -21,10 +21,8 @@ #include #include #include -#include #include -#include -#include +#include template T clamp(T x, T min, T max) @@ -50,6 +48,7 @@ ChatLog::ChatLog(QWidget* parent) setViewportUpdateMode(BoundingRectViewportUpdate); //setRenderHint(QPainter::TextAntialiasing); setAcceptDrops(false); + setContextMenuPolicy(Qt::CustomContextMenu); const QColor selGraphColor = QColor(166,225,255); selGraphItem = scene->addRect(0,0,0,0,selGraphColor.darker(120),selGraphColor); @@ -228,14 +227,22 @@ void ChatLog::mousePressEvent(QMouseEvent* ev) { if(!isOverSelection(scenePos)) clearSelection(); - - showContextMenu(ev->globalPos(), scenePos); } } void ChatLog::mouseReleaseEvent(QMouseEvent* ev) { QGraphicsView::mouseReleaseEvent(ev); + + QPointF scenePos = mapToScene(ev->pos()); + + if(ev->button() == Qt::RightButton) + { + if(!isOverSelection(scenePos)) + clearSelection(); + + emit customContextMenuRequested(ev->pos()); + } } void ChatLog::mouseMoveEvent(QMouseEvent* ev) @@ -461,41 +468,9 @@ bool ChatLog::isEmpty() const return lines.isEmpty(); } -void ChatLog::showContextMenu(const QPoint& globalPos, const QPointF& scenePos) +bool ChatLog::hasTextToBeCopied() const { - QMenu menu; - - // populate - QAction* copyAction = menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy")); - menu.addSeparator(); - QAction* clearAction = menu.addAction(QIcon::fromTheme("edit-clear") ,tr("Clear chat log")); - QAction* saveAction = menu.addAction(QIcon::fromTheme("document-save") ,tr("Save chat log")); - - if(!isOverSelection(scenePos)) - copyAction->setDisabled(true); - - // show - QAction* action = menu.exec(globalPos); - - if(action == copyAction) - copySelectedText(); - - if(action == clearAction) - clear(); - - if(action == saveAction) - { - QString path = QFileDialog::getSaveFileName(0, tr("Save chat log")); - if (path.isEmpty()) - return; - - QFile file(path); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) - return; - - file.write(toPlainText().toUtf8()); - file.close(); - } + return selectionMode != None; } void ChatLog::clear() diff --git a/src/chatlog/chatlog.h b/src/chatlog/chatlog.h index 9052b31a5..f2f293c7b 100644 --- a/src/chatlog/chatlog.h +++ b/src/chatlog/chatlog.h @@ -53,6 +53,7 @@ public: QString toPlainText() const; bool isEmpty() const; + bool hasTextToBeCopied() const; protected: QRect getVisibleRect() const; @@ -71,7 +72,6 @@ protected: void fullUpdate(); void checkVisibility(); void scrollToBottom(); - void showContextMenu(const QPoint& globalPos, const QPointF& scenePos); virtual void mousePressEvent(QMouseEvent* ev); virtual void mouseReleaseEvent(QMouseEvent* ev); diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index 2e9a942a1..ace5e0ff2 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -50,12 +50,12 @@ GenericChatForm::GenericChatForm(QWidget *parent) : avatar = new MaskablePixmapWidget(this, QSize(40,40), ":/img/avatar_mask.png"); QHBoxLayout *headLayout = new QHBoxLayout(), - *mainFootLayout = new QHBoxLayout(); + *mainFootLayout = new QHBoxLayout(); QVBoxLayout *mainLayout = new QVBoxLayout(), - *footButtonsSmall = new QVBoxLayout(), - *volMicLayout = new QVBoxLayout(); - headTextLayout = new QVBoxLayout(); + *footButtonsSmall = new QVBoxLayout(), + *volMicLayout = new QVBoxLayout(); + headTextLayout = new QVBoxLayout(); chatWidget = new ChatLog(this); @@ -79,7 +79,7 @@ GenericChatForm::GenericChatForm(QWidget *parent) : //volButton->setFixedSize(25,20); volButton->setToolTip(tr("Toggle speakers volume: RED is OFF")); micButton = new QPushButton(); - // micButton->setFixedSize(25,20); + // micButton->setFixedSize(25,20); micButton->setToolTip(tr("Toggle microphone: RED is OFF")); footButtonsSmall->setSpacing(2); @@ -122,7 +122,7 @@ GenericChatForm::GenericChatForm(QWidget *parent) : headTextLayout->addStretch(); headTextLayout->addWidget(nameLabel); - + volMicLayout->addWidget(micButton, Qt::AlignTop); volMicLayout->addSpacing(2); volMicLayout->addWidget(volButton, Qt::AlignBottom); @@ -143,13 +143,17 @@ GenericChatForm::GenericChatForm(QWidget *parent) : fileButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); emoteButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); - connect(emoteButton, SIGNAL(clicked()), this, SLOT(onEmoteButtonClicked())); - connect(chatWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint))); + menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy"), this, SLOT(onCopyLogClicked())); + menu.addSeparator(); + menu.addAction(QIcon::fromTheme("document-save"), tr("Save chat log"), this, SLOT(onSaveLogClicked())); + menu.addAction(QIcon::fromTheme("edit-clear"), tr("Clear displayed messages"), this, SLOT(clearChatArea(bool))); + menu.addSeparator(); + + connect(emoteButton, &QPushButton::clicked, this, &GenericChatForm::onEmoteButtonClicked); + connect(chatWidget, &ChatLog::customContextMenuRequested, this, &GenericChatForm::onChatContextMenuRequested); chatWidget->setStyleSheet(Style::getStylesheet(":/ui/chatArea/chatArea.css")); headWidget->setStyleSheet(Style::getStylesheet(":/ui/chatArea/chatHead.css")); - - //ChatAction::setupFormat(); } bool GenericChatForm::isEmpty() @@ -180,6 +184,10 @@ void GenericChatForm::onChatContextMenuRequested(QPoint pos) { QWidget* sender = (QWidget*)QObject::sender(); pos = sender->mapToGlobal(pos); + + //copy action + menu.actions().first()->setEnabled(chatWidget->hasTextToBeCopied()); + menu.exec(pos); } @@ -243,6 +251,25 @@ void GenericChatForm::onEmoteInsertRequested(QString str) msgEdit->setFocus(); // refocus so that we can continue typing } +void GenericChatForm::onSaveLogClicked() +{ + QString path = QFileDialog::getSaveFileName(0, tr("Save chat log")); + if (path.isEmpty()) + return; + + QFile file(path); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + return; + + file.write(chatWidget->toPlainText().toUtf8()); + file.close(); +} + +void GenericChatForm::onCopyLogClicked() +{ + chatWidget->copySelectedText(); +} + void GenericChatForm::focusInput() { msgEdit->setFocus(); diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h index 594d00208..0e8caaa0d 100644 --- a/src/widget/form/genericchatform.h +++ b/src/widget/form/genericchatform.h @@ -71,6 +71,8 @@ protected slots: void onChatContextMenuRequested(QPoint pos); void onEmoteButtonClicked(); void onEmoteInsertRequested(QString str); + void onSaveLogClicked(); + void onCopyLogClicked(); void clearChatArea(bool); protected: