1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

Add context menu to save chat log

Fixes #10
This commit is contained in:
Tux3 / Mlkj / !Lev.uXFMLA 2014-06-28 01:48:54 +02:00
parent e2d67e4250
commit 885b874ef3
6 changed files with 119 additions and 9 deletions

View File

@ -7,6 +7,7 @@
#include <QTime> #include <QTime>
#include <QScrollBar> #include <QScrollBar>
#include <QFileDialog> #include <QFileDialog>
#include <QMenu>
ChatForm::ChatForm(Friend* chatFriend) ChatForm::ChatForm(Friend* chatFriend)
: f(chatFriend), curRow{0}, lockSliderToBottom{true} : f(chatFriend), curRow{0}, lockSliderToBottom{true}
@ -30,6 +31,7 @@ ChatForm::ChatForm(Friend* chatFriend)
chatAreaWidget->setLayout(mainChatLayout); chatAreaWidget->setLayout(mainChatLayout);
chatArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); chatArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
chatArea->setWidgetResizable(true); chatArea->setWidgetResizable(true);
chatArea->setContextMenuPolicy(Qt::CustomContextMenu);
mainChatLayout->setColumnStretch(1,1); mainChatLayout->setColumnStretch(1,1);
mainChatLayout->setSpacing(10); mainChatLayout->setSpacing(10);
@ -96,6 +98,7 @@ ChatForm::ChatForm(Friend* chatFriend)
connect(callButton, SIGNAL(clicked()), this, SLOT(onCallTriggered())); connect(callButton, SIGNAL(clicked()), this, SLOT(onCallTriggered()));
connect(msgEdit, SIGNAL(enterPressed()), this, SLOT(onSendTriggered())); connect(msgEdit, SIGNAL(enterPressed()), this, SLOT(onSendTriggered()));
connect(chatArea->verticalScrollBar(), SIGNAL(rangeChanged(int,int)), this, SLOT(onSliderRangeChanged())); connect(chatArea->verticalScrollBar(), SIGNAL(rangeChanged(int,int)), this, SLOT(onSliderRangeChanged()));
connect(chatArea, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
} }
ChatForm::~ChatForm() ChatForm::~ChatForm()
@ -169,16 +172,24 @@ void ChatForm::addMessage(QLabel* author, QLabel* message, QLabel* date)
{ {
mainChatLayout->setRowStretch(curRow, 0); mainChatLayout->setRowStretch(curRow, 0);
mainChatLayout->addItem(new QSpacerItem(0,AUTHOR_CHANGE_SPACING),curRow,0,1,3); mainChatLayout->addItem(new QSpacerItem(0,AUTHOR_CHANGE_SPACING),curRow,0,1,3);
curRow++;
} }
mainChatLayout->addWidget(author, curRow, 0); previousName = author->text();
curRow++;
} }
previousName = author->text(); else if (curRow)// onSaveLogClicked expects 0 or 3 QLabel per line
author->setText("");
mainChatLayout->addWidget(author, curRow, 0);
mainChatLayout->addWidget(message, curRow, 1); mainChatLayout->addWidget(message, curRow, 1);
mainChatLayout->addWidget(date, curRow, 3); mainChatLayout->addWidget(date, curRow, 3);
mainChatLayout->setRowStretch(curRow+1, 1); mainChatLayout->setRowStretch(curRow+1, 1);
mainChatLayout->setRowStretch(curRow, 0); mainChatLayout->setRowStretch(curRow, 0);
curRow++; curRow++;
author->setContextMenuPolicy(Qt::CustomContextMenu);
message->setContextMenuPolicy(Qt::CustomContextMenu);
date->setContextMenuPolicy(Qt::CustomContextMenu);
connect(author, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
connect(message, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
connect(date, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
} }
void ChatForm::onAttachClicked() void ChatForm::onAttachClicked()
@ -400,3 +411,44 @@ void ChatForm::onCancelCallTriggered()
connect(callButton, SIGNAL(clicked()), this, SLOT(onCallTriggered())); connect(callButton, SIGNAL(clicked()), this, SLOT(onCallTriggered()));
emit cancelCall(callId, f->friendId); emit cancelCall(callId, f->friendId);
} }
void ChatForm::onChatContextMenuRequested(QPoint pos)
{
QWidget* sender = (QWidget*)QObject::sender();
pos = sender->mapToGlobal(pos);
QMenu menu;
menu.addAction("Save chat log", this, SLOT(onSaveLogClicked()));
menu.exec(pos);
}
void ChatForm::onSaveLogClicked()
{
QString path = QFileDialog::getSaveFileName(0,"Save chat log");
if (path.isEmpty())
return;
QFile file(path);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QString log;
QList<QLabel*> labels = chatAreaWidget->findChildren<QLabel*>();
int i=0;
for (QLabel* label : labels)
{
log += label->text();
if (i==2)
{
i=0;
log += '\n';
}
else
{
log += '\t';
i++;
}
}
file.write(log.toUtf8());
file.close();
}

View File

@ -9,6 +9,7 @@
#include <QTextEdit> #include <QTextEdit>
#include <QScrollArea> #include <QScrollArea>
#include <QTime> #include <QTime>
#include <QPoint>
#include "widget/tool/chattextedit.h" #include "widget/tool/chattextedit.h"
#include "ui_widget.h" #include "ui_widget.h"
@ -61,6 +62,8 @@ private slots:
void onAnswerCallTriggered(); void onAnswerCallTriggered();
void onHangupCallTriggered(); void onHangupCallTriggered();
void onCancelCallTriggered(); void onCancelCallTriggered();
void onChatContextMenuRequested(QPoint pos);
void onSaveLogClicked();
private: private:
Friend* f; Friend* f;

View File

@ -7,6 +7,9 @@
#include <QFont> #include <QFont>
#include <QTime> #include <QTime>
#include <QScrollBar> #include <QScrollBar>
#include <QMenu>
#include <QFile>
#include <QFileDialog>
GroupChatForm::GroupChatForm(Group* chatGroup) GroupChatForm::GroupChatForm(Group* chatGroup)
: group(chatGroup), curRow{0}, lockSliderToBottom{true} : group(chatGroup), curRow{0}, lockSliderToBottom{true}
@ -38,6 +41,7 @@ GroupChatForm::GroupChatForm(Group* chatGroup)
chatAreaWidget->setLayout(mainChatLayout); chatAreaWidget->setLayout(mainChatLayout);
chatArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); chatArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
chatArea->setWidgetResizable(true); chatArea->setWidgetResizable(true);
chatArea->setContextMenuPolicy(Qt::CustomContextMenu);
mainChatLayout->setColumnStretch(1,1); mainChatLayout->setColumnStretch(1,1);
mainChatLayout->setHorizontalSpacing(10); mainChatLayout->setHorizontalSpacing(10);
@ -78,6 +82,7 @@ GroupChatForm::GroupChatForm(Group* chatGroup)
connect(sendButton, SIGNAL(clicked()), this, SLOT(onSendTriggered())); connect(sendButton, SIGNAL(clicked()), this, SLOT(onSendTriggered()));
connect(msgEdit, SIGNAL(enterPressed()), this, SLOT(onSendTriggered())); connect(msgEdit, SIGNAL(enterPressed()), this, SLOT(onSendTriggered()));
connect(chatArea->verticalScrollBar(), SIGNAL(rangeChanged(int,int)), this, SLOT(onSliderRangeChanged())); connect(chatArea->verticalScrollBar(), SIGNAL(rangeChanged(int,int)), this, SLOT(onSliderRangeChanged()));
connect(chatArea, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
} }
GroupChatForm::~GroupChatForm() GroupChatForm::~GroupChatForm()
@ -149,16 +154,24 @@ void GroupChatForm::addMessage(QLabel* author, QLabel* message, QLabel* date)
{ {
mainChatLayout->setRowStretch(curRow, 0); mainChatLayout->setRowStretch(curRow, 0);
mainChatLayout->addItem(new QSpacerItem(0,AUTHOR_CHANGE_SPACING),curRow,0,1,3); mainChatLayout->addItem(new QSpacerItem(0,AUTHOR_CHANGE_SPACING),curRow,0,1,3);
curRow++;
} }
mainChatLayout->addWidget(author, curRow, 0); previousName = author->text();
curRow++;
} }
previousName = author->text(); else if (curRow)// onSaveLogClicked expects 0 or 3 QLabel per line
author->setText("");
mainChatLayout->addWidget(author, curRow, 0);
mainChatLayout->addWidget(message, curRow, 1); mainChatLayout->addWidget(message, curRow, 1);
mainChatLayout->addWidget(date, curRow, 3); mainChatLayout->addWidget(date, curRow, 3);
mainChatLayout->setRowStretch(curRow+1, 1); mainChatLayout->setRowStretch(curRow+1, 1);
mainChatLayout->setRowStretch(curRow, 0); mainChatLayout->setRowStretch(curRow, 0);
curRow++; curRow++;
author->setContextMenuPolicy(Qt::CustomContextMenu);
message->setContextMenuPolicy(Qt::CustomContextMenu);
date->setContextMenuPolicy(Qt::CustomContextMenu);
connect(author, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
connect(message, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
connect(date, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint)));
} }
void GroupChatForm::onSliderRangeChanged() void GroupChatForm::onSliderRangeChanged()
@ -177,3 +190,44 @@ void GroupChatForm::onUserListChanged()
names.chop(2); names.chop(2);
namesList->setText(names); namesList->setText(names);
} }
void GroupChatForm::onChatContextMenuRequested(QPoint pos)
{
QWidget* sender = (QWidget*)QObject::sender();
pos = sender->mapToGlobal(pos);
QMenu menu;
menu.addAction("Save chat log", this, SLOT(onSaveLogClicked()));
menu.exec(pos);
}
void GroupChatForm::onSaveLogClicked()
{
QString path = QFileDialog::getSaveFileName(0,"Save chat log");
if (path.isEmpty())
return;
QFile file(path);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QString log;
QList<QLabel*> labels = chatAreaWidget->findChildren<QLabel*>();
int i=0;
for (QLabel* label : labels)
{
log += label->text();
if (i==2)
{
i=0;
log += '\n';
}
else
{
log += '\t';
i++;
}
}
file.write(log.toUtf8());
file.close();
}

View File

@ -37,6 +37,8 @@ signals:
private slots: private slots:
void onSendTriggered(); void onSendTriggered();
void onSliderRangeChanged(); void onSliderRangeChanged();
void onChatContextMenuRequested(QPoint pos);
void onSaveLogClicked();
private: private:
Group* group; Group* group;

View File

@ -405,7 +405,7 @@ void Widget::removeFriend(int friendId)
onAddClicked(); onAddClicked();
} }
void Widget::onGroupInviteReceived(int friendId, uint8_t* publicKey) void Widget::onGroupInviteReceived(int32_t friendId, uint8_t* publicKey)
{ {
int groupId = core->joinGroupchat(friendId, publicKey); int groupId = core->joinGroupchat(friendId, publicKey);
if (groupId == -1) if (groupId == -1)
@ -413,7 +413,6 @@ void Widget::onGroupInviteReceived(int friendId, uint8_t* publicKey)
qWarning() << "Widget::onGroupInviteReceived: Unable to accept invitation"; qWarning() << "Widget::onGroupInviteReceived: Unable to accept invitation";
return; return;
} }
//createGroup(groupId);
} }
void Widget::onGroupMessageReceived(int groupnumber, int friendgroupnumber, const QString& message) void Widget::onGroupMessageReceived(int groupnumber, int friendgroupnumber, const QString& message)

View File

@ -62,7 +62,7 @@ private slots:
void onFriendWidgetClicked(FriendWidget* widget); void onFriendWidgetClicked(FriendWidget* widget);
void onFriendMessageReceived(int friendId, const QString& message); void onFriendMessageReceived(int friendId, const QString& message);
void onFriendRequestReceived(const QString& userId, const QString& message); void onFriendRequestReceived(const QString& userId, const QString& message);
void onGroupInviteReceived(int friendId, uint8_t *publicKey); void onGroupInviteReceived(int32_t friendId, uint8_t *publicKey);
void onGroupMessageReceived(int groupnumber, int friendgroupnumber, const QString& message); void onGroupMessageReceived(int groupnumber, int friendgroupnumber, const QString& message);
void onGroupNamelistChanged(int groupnumber, int peernumber, uint8_t change); void onGroupNamelistChanged(int groupnumber, int peernumber, uint8_t change);
void onGroupWidgetClicked(GroupWidget* widget); void onGroupWidgetClicked(GroupWidget* widget);