mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
Moved the context menu to GenericChatForm
This commit is contained in:
parent
f4c6bc3452
commit
64024c77a6
|
@ -21,10 +21,8 @@
|
|||
#include <QDebug>
|
||||
#include <QScrollBar>
|
||||
#include <QApplication>
|
||||
#include <QMenu>
|
||||
#include <QClipboard>
|
||||
#include <QFile>
|
||||
#include <QFileDialog>
|
||||
#include <QAction>
|
||||
|
||||
template<class T>
|
||||
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()
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -71,6 +71,8 @@ protected slots:
|
|||
void onChatContextMenuRequested(QPoint pos);
|
||||
void onEmoteButtonClicked();
|
||||
void onEmoteInsertRequested(QString str);
|
||||
void onSaveLogClicked();
|
||||
void onCopyLogClicked();
|
||||
void clearChatArea(bool);
|
||||
|
||||
protected:
|
||||
|
|
Loading…
Reference in New Issue
Block a user