blob: 1167799c6c62e8762b0e696c7da9045e62d4abd7 [file] [log] [blame]
Yingdi Yu348f5ea2014-03-01 14:47:25 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2013, Regents of the University of California
4 * Yingdi Yu
5 *
6 * BSD license, See the LICENSE file for more information
7 *
8 * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
9 * Alexander Afanasyev <alexander.afanasyev@ucla.edu>
10 * Yingdi Yu <yingdi@cs.ucla.edu>
11 */
12
Yingdi Yu0b0a7362014-08-05 16:31:30 -070013#include "chat-dialog.hpp"
Yingdi Yu348f5ea2014-03-01 14:47:25 -080014#include "ui_chat-dialog.h"
15
16#include <QScrollBar>
17#include <QMessageBox>
18#include <QCloseEvent>
19
Yingdi Yud45777b2014-10-16 23:54:11 -070020Q_DECLARE_METATYPE(ndn::Name)
21Q_DECLARE_METATYPE(time_t)
Yingdi Yueb692ac2015-02-10 18:46:18 -080022Q_DECLARE_METATYPE(std::vector<chronochat::NodeInfo>)
Qiuhan Ding7a4e7ef2015-02-03 20:25:50 -080023Q_DECLARE_METATYPE(uint64_t)
Yingdi Yu0b0a7362014-08-05 16:31:30 -070024
Yingdi Yueb692ac2015-02-10 18:46:18 -080025namespace chronochat {
Yingdi Yu0b0a7362014-08-05 16:31:30 -070026
Yingdi Yud45777b2014-10-16 23:54:11 -070027static const Name PRIVATE_PREFIX("/private/local");
Qiuhan Dingba3e57a2015-01-08 19:07:39 -080028static const ndn::Name::Component ROUTING_HINT_SEPARATOR =
29 ndn::name::Component::fromEscapedString("%F0%2E");
Yingdi Yu0b0a7362014-08-05 16:31:30 -070030
Yingdi Yud45777b2014-10-16 23:54:11 -070031ChatDialog::ChatDialog(const Name& chatroomPrefix,
32 const Name& userChatPrefix,
33 const Name& routingPrefix,
34 const std::string& chatroomName,
Yingdi Yu17032f82014-03-25 15:48:23 -070035 const std::string& nick,
Yingdi Yud45777b2014-10-16 23:54:11 -070036 bool isSecured,
Yingdi Yu45da92a2015-02-02 13:17:03 -080037 const Name& signingId,
Yingdi Yufa0b6a02014-04-30 14:26:42 -070038 QWidget* parent)
Yingdi Yu348f5ea2014-03-01 14:47:25 -080039 : QDialog(parent)
40 , ui(new Ui::ChatDialog)
Yingdi Yu45da92a2015-02-02 13:17:03 -080041 , m_backend(chatroomPrefix, userChatPrefix, routingPrefix, chatroomName, nick, signingId)
Yingdi Yud45777b2014-10-16 23:54:11 -070042 , m_chatroomName(chatroomName)
Qiuhan Ding43c8e162015-02-02 15:16:48 -080043 , m_chatroomPrefix(chatroomPrefix)
Yingdi Yud45777b2014-10-16 23:54:11 -070044 , m_nick(nick.c_str())
45 , m_isSecured(isSecured)
Yingdi Yu348f5ea2014-03-01 14:47:25 -080046{
Yingdi Yud45777b2014-10-16 23:54:11 -070047 qRegisterMetaType<ndn::Name>("ndn::Name");
48 qRegisterMetaType<time_t>("time_t");
Yingdi Yueb692ac2015-02-10 18:46:18 -080049 qRegisterMetaType<std::vector<chronochat::NodeInfo> >("std::vector<chronochat::NodeInfo>");
Qiuhan Ding7a4e7ef2015-02-03 20:25:50 -080050 qRegisterMetaType<uint64_t>("uint64_t");
Yingdi Yu348f5ea2014-03-01 14:47:25 -080051
52 m_scene = new DigestTreeScene(this);
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -070053 m_trustScene = new TrustTreeScene(this);
Yingdi Yu348f5ea2014-03-01 14:47:25 -080054 m_rosterModel = new QStringListModel(this);
Yingdi Yu348f5ea2014-03-01 14:47:25 -080055
56 ui->setupUi(this);
Yingdi Yud45777b2014-10-16 23:54:11 -070057
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -070058 ui->syncTreeViewer->setScene(m_scene);
Yingdi Yu348f5ea2014-03-01 14:47:25 -080059 m_scene->setSceneRect(m_scene->itemsBoundingRect());
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -070060 ui->syncTreeViewer->hide();
Yingdi Yud45777b2014-10-16 23:54:11 -070061
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -070062 ui->trustTreeViewer->setScene(m_trustScene);
63 m_trustScene->setSceneRect(m_trustScene->itemsBoundingRect());
64 ui->trustTreeViewer->hide();
Yingdi Yud45777b2014-10-16 23:54:11 -070065
Yingdi Yu348f5ea2014-03-01 14:47:25 -080066 ui->listView->setModel(m_rosterModel);
67
Yingdi Yud45777b2014-10-16 23:54:11 -070068 Name routablePrefix;
Yingdi Yud85e29f2014-09-09 17:20:04 -070069
Yingdi Yud45777b2014-10-16 23:54:11 -070070 if (routingPrefix.isPrefixOf(userChatPrefix))
71 routablePrefix = userChatPrefix;
72 else
73 routablePrefix.append(routingPrefix)
Qiuhan Dingba3e57a2015-01-08 19:07:39 -080074 .append(ROUTING_HINT_SEPARATOR)
Yingdi Yud45777b2014-10-16 23:54:11 -070075 .append(userChatPrefix);
Yingdi Yud85e29f2014-09-09 17:20:04 -070076
Yingdi Yud45777b2014-10-16 23:54:11 -070077 updateLabels(routablePrefix);
Yingdi Yu348f5ea2014-03-01 14:47:25 -080078
Yingdi Yud45777b2014-10-16 23:54:11 -070079 QStringList roster;
80 roster << "- " + m_nick;
81 m_rosterModel->setStringList(roster);
82
Qiuhan Ding7a4e7ef2015-02-03 20:25:50 -080083 ui->syncTreeButton->setText("Hide ChronoSync Tree");
84
Yingdi Yud45777b2014-10-16 23:54:11 -070085 // When backend receives a sync update, notify frontend to update sync tree
Yingdi Yueb692ac2015-02-10 18:46:18 -080086 connect(&m_backend, SIGNAL(syncTreeUpdated(std::vector<chronochat::NodeInfo>, QString)),
87 this, SLOT(updateSyncTree(std::vector<chronochat::NodeInfo>, QString)));
Yingdi Yud45777b2014-10-16 23:54:11 -070088
89 // When backend receives a new chat message, notify frontent to print it out.
90 connect(&m_backend, SIGNAL(chatMessageReceived(QString, QString, time_t)),
91 this, SLOT(receiveChatMessage(QString, QString, time_t)));
92
Yingdi Yud45777b2014-10-16 23:54:11 -070093 // When backend detects a deleted session, notify frontend to print the message.
94 connect(&m_backend, SIGNAL(sessionRemoved(QString, QString, time_t)),
95 this, SLOT(removeSession(QString, QString, time_t)));
96
Yingdi Yud45777b2014-10-16 23:54:11 -070097 // When backend receives a new message, notify frontend to print notification
Qiuhan Ding7a4e7ef2015-02-03 20:25:50 -080098 connect(&m_backend, SIGNAL(messageReceived(QString, QString, uint64_t, time_t, bool)),
99 this, SLOT(receiveMessage(QString, QString, uint64_t, time_t, bool)));
Yingdi Yud45777b2014-10-16 23:54:11 -0700100
101 // When backend updates prefix, notify frontend to update labels.
102 connect(&m_backend, SIGNAL(chatPrefixChanged(ndn::Name)),
103 this, SLOT(updateLabels(ndn::Name)));
104
105 // When frontend gets a message to send, notify backend.
106 connect(this, SIGNAL(msgToSent(QString, time_t)),
107 &m_backend, SLOT(sendChatMessage(QString, time_t)));
108
109 // When frontend gets a shutdown command, notify backend.
110 connect(this, SIGNAL(shutdownBackend()),
111 &m_backend, SLOT(shutdown()));
112
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800113 m_scene->plot("Empty");
114
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700115 connect(ui->lineEdit, SIGNAL(returnPressed()),
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800116 this, SLOT(onReturnPressed()));
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700117 connect(ui->syncTreeButton, SIGNAL(pressed()),
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700118 this, SLOT(onSyncTreeButtonPressed()));
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700119 connect(ui->trustTreeButton, SIGNAL(pressed()),
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700120 this, SLOT(onTrustTreeButtonPressed()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800121
Yingdi Yud45777b2014-10-16 23:54:11 -0700122 disableSyncTreeDisplay();
123 QTimer::singleShot(2200, this, SLOT(enableSyncTreeDisplay()));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800124
Yingdi Yud45777b2014-10-16 23:54:11 -0700125 m_backend.start();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800126}
127
128
129ChatDialog::~ChatDialog()
130{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800131}
132
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800133void
134ChatDialog::closeEvent(QCloseEvent *e)
135{
Yingdi Yud45777b2014-10-16 23:54:11 -0700136 // When close button is clicked, do not close the dialog immediately.
137
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800138 QMessageBox::information(this, tr("ChronoChat"),
139 tr("The chatroom will keep running in the "
140 "system tray. To close the chatroom, "
141 "choose <b>Close chatroom</b> in the "
142 "context memu of the system tray entry."));
Yingdi Yue8323b62014-09-02 17:24:15 -0700143 hide();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800144 e->ignore();
145}
146
147void
Yingdi Yu233a9722014-03-07 15:47:09 -0800148ChatDialog::changeEvent(QEvent *e)
149{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700150 switch(e->type()) {
Yingdi Yu233a9722014-03-07 15:47:09 -0800151 case QEvent::ActivationChange:
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700152 if (isActiveWindow()) {
Yingdi Yu233a9722014-03-07 15:47:09 -0800153 emit resetIcon();
154 }
155 break;
156 default:
157 break;
158 }
159}
160
161void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800162ChatDialog::resizeEvent(QResizeEvent *e)
163{
164 fitView();
165}
166
167void
168ChatDialog::showEvent(QShowEvent *e)
169{
170 fitView();
171}
172
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800173ChatroomInfo
Yingdi Yud45777b2014-10-16 23:54:11 -0700174ChatDialog::getChatroomInfo()
175{
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800176 ChatroomInfo chatroomInfo;
177 chatroomInfo.setName(Name::Component(m_chatroomName));
Yingdi Yud45777b2014-10-16 23:54:11 -0700178 QStringList prefixList = m_scene->getRosterPrefixList();
179 for(QStringList::iterator it = prefixList.begin();
180 it != prefixList.end(); ++it ) {
181 Name participant = Name(it->toStdString()).getPrefix(-3);
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800182 chatroomInfo.addParticipant(participant);
Yingdi Yud45777b2014-10-16 23:54:11 -0700183 }
184
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800185 chatroomInfo.setSyncPrefix(m_chatroomPrefix);
Yingdi Yud45777b2014-10-16 23:54:11 -0700186 if (m_isSecured)
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800187 chatroomInfo.setTrustModel(ChatroomInfo::TRUST_MODEL_HIERARCHICAL);
Yingdi Yud45777b2014-10-16 23:54:11 -0700188 else
Qiuhan Ding43c8e162015-02-02 15:16:48 -0800189 chatroomInfo.setTrustModel(ChatroomInfo::TRUST_MODEL_NONE);
Yingdi Yud45777b2014-10-16 23:54:11 -0700190 return chatroomInfo;
191}
192
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800193// private methods:
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700194void ChatDialog::disableSyncTreeDisplay()
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800195{
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700196 ui->syncTreeButton->setEnabled(false);
197 ui->syncTreeViewer->hide();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800198 fitView();
199}
200
201void
Yingdi Yud45777b2014-10-16 23:54:11 -0700202ChatDialog::appendChatMessage(const QString& nick, const QString& text, time_t timestamp)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800203{
Yingdi Yud45777b2014-10-16 23:54:11 -0700204 QTextCharFormat nickFormat;
205 nickFormat.setForeground(Qt::darkGreen);
206 nickFormat.setFontWeight(QFont::Bold);
207 nickFormat.setFontUnderline(true);
208 nickFormat.setUnderlineColor(Qt::gray);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800209
Yingdi Yud45777b2014-10-16 23:54:11 -0700210 // Print who & when
211 QTextCursor cursor(ui->textEdit->textCursor());
212 cursor.movePosition(QTextCursor::End);
213 QTextTableFormat tableFormat;
214 tableFormat.setBorder(0);
215 QTextTable *table = cursor.insertTable(1, 2, tableFormat);
216 QString from = QString("%1 ").arg(nick);
217 QTextTableCell fromCell = table->cellAt(0, 0);
218 fromCell.setFormat(nickFormat);
219 fromCell.firstCursorPosition().insertText(from);
220 printTimeInCell(table, timestamp);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800221
Yingdi Yud45777b2014-10-16 23:54:11 -0700222 // Print what
223 QTextCursor nextCursor(ui->textEdit->textCursor());
224 nextCursor.movePosition(QTextCursor::End);
225 table = nextCursor.insertTable(1, 1, tableFormat);
226 table->cellAt(0, 0).firstCursorPosition().insertText(text);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800227
Yingdi Yud45777b2014-10-16 23:54:11 -0700228 // Popup notification
229 showMessage(from, text);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800230
231 QScrollBar *bar = ui->textEdit->verticalScrollBar();
232 bar->setValue(bar->maximum());
233}
234
235void
Yingdi Yud45777b2014-10-16 23:54:11 -0700236ChatDialog::appendControlMessage(const QString& nick,
237 const QString& action,
238 time_t timestamp)
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800239{
Yingdi Yud45777b2014-10-16 23:54:11 -0700240 QTextCharFormat nickFormat;
241 nickFormat.setForeground(Qt::gray);
242 nickFormat.setFontWeight(QFont::Bold);
243 nickFormat.setFontUnderline(true);
244 nickFormat.setUnderlineColor(Qt::gray);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800245
Yingdi Yud45777b2014-10-16 23:54:11 -0700246 QTextCursor cursor(ui->textEdit->textCursor());
247 cursor.movePosition(QTextCursor::End);
248 QTextTableFormat tableFormat;
249 tableFormat.setBorder(0);
250 QTextTable *table = cursor.insertTable(1, 2, tableFormat);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800251
Yingdi Yud45777b2014-10-16 23:54:11 -0700252 QString controlMsg = QString("%1 %2 ").arg(nick).arg(action);
253 QTextTableCell fromCell = table->cellAt(0, 0);
254 fromCell.setFormat(nickFormat);
255 fromCell.firstCursorPosition().insertText(controlMsg);
256 printTimeInCell(table, timestamp);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800257}
258
259QString
260ChatDialog::formatTime(time_t timestamp)
261{
Qiuhan Ding4b8cfaa2015-03-10 17:03:48 -0700262 struct tm* localTime = localtime(&timestamp);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800263
Qiuhan Ding4b8cfaa2015-03-10 17:03:48 -0700264 return QString("%1:%2:%3")
265 .arg(localTime->tm_hour, 2, 10, QChar('0'))
266 .arg(localTime->tm_min, 2, 10, QChar('0'))
267 .arg(localTime->tm_sec, 2, 10, QChar('0'));
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800268}
269
270void
271ChatDialog::printTimeInCell(QTextTable *table, time_t timestamp)
272{
273 QTextCharFormat timeFormat;
274 timeFormat.setForeground(Qt::gray);
275 timeFormat.setFontUnderline(true);
276 timeFormat.setUnderlineColor(Qt::gray);
277 QTextTableCell timeCell = table->cellAt(0, 1);
278 timeCell.setFormat(timeFormat);
279 timeCell.firstCursorPosition().insertText(formatTime(timestamp));
280}
281
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800282void
283ChatDialog::showMessage(const QString& from, const QString& data)
284{
285 if (!isActiveWindow())
286 emit showChatMessage(QString::fromStdString(m_chatroomName),
287 from, data);
288}
289
290void
291ChatDialog::fitView()
292{
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800293 QRectF rect = m_scene->itemsBoundingRect();
294 m_scene->setSceneRect(rect);
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700295 ui->syncTreeViewer->fitInView(m_scene->itemsBoundingRect(), Qt::KeepAspectRatio);
296
297 QRectF trustRect = m_trustScene->itemsBoundingRect();
298 m_trustScene->setSceneRect(trustRect);
299 ui->trustTreeViewer->fitInView(m_trustScene->itemsBoundingRect(), Qt::KeepAspectRatio);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800300}
301
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800302// public slots:
303void
Yingdi Yue8323b62014-09-02 17:24:15 -0700304ChatDialog::onShow()
305{
306 this->show();
307 this->raise();
308 this->activateWindow();
309}
310
311void
Yingdi Yud45777b2014-10-16 23:54:11 -0700312ChatDialog::shutdown()
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800313{
Yingdi Yud45777b2014-10-16 23:54:11 -0700314 if (m_backend.isRunning()) {
315 emit shutdownBackend();
316 m_backend.wait();
317 }
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800318 hide();
319 emit closeChatDialog(QString::fromStdString(m_chatroomName));
320}
321
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800322// private slots:
323void
Yingdi Yueb692ac2015-02-10 18:46:18 -0800324ChatDialog::updateSyncTree(std::vector<chronochat::NodeInfo> updates, QString rootDigest)
Yingdi Yud45777b2014-10-16 23:54:11 -0700325{
326 m_scene->processSyncUpdate(updates, rootDigest);
327}
328
329void
330ChatDialog::receiveChatMessage(QString nick, QString text, time_t timestamp)
331{
332 appendChatMessage(nick, text, timestamp);
333}
334
335void
Yingdi Yud45777b2014-10-16 23:54:11 -0700336ChatDialog::removeSession(QString sessionPrefix, QString nick, time_t timestamp)
337{
338 appendControlMessage(nick, "leaves room", timestamp);
339 m_scene->removeNode(sessionPrefix);
340 m_rosterModel->setStringList(m_scene->getRosterList());
Qiuhan Ding112ee482015-03-11 11:54:11 -0700341 fitView();
Yingdi Yud45777b2014-10-16 23:54:11 -0700342}
343
344void
Qiuhan Ding7a4e7ef2015-02-03 20:25:50 -0800345ChatDialog::receiveMessage(QString sessionPrefix, QString nick, uint64_t seqNo, time_t timestamp,
346 bool addSession)
Yingdi Yud45777b2014-10-16 23:54:11 -0700347{
Qiuhan Ding7a4e7ef2015-02-03 20:25:50 -0800348 m_scene->updateNode(sessionPrefix, nick, seqNo);
Yingdi Yud45777b2014-10-16 23:54:11 -0700349 m_scene->messageReceived(sessionPrefix);
Qiuhan Ding7a4e7ef2015-02-03 20:25:50 -0800350 if (addSession) {
351 appendControlMessage(nick, "enters room", timestamp);
352 m_rosterModel->setStringList(m_scene->getRosterList());
353 }
Yingdi Yud45777b2014-10-16 23:54:11 -0700354}
355
356void
357ChatDialog::updateLabels(Name newChatPrefix)
358{
359 // Reset DigestTree
360 m_scene->clearAll();
361 m_scene->plot("Empty");
362
363 // Display chatroom name
364 QString chatroomName = QString("Chatroom: %1").arg(QString::fromStdString(m_chatroomName));
365 ui->infoLabel->setStyleSheet("QLabel {color: #630; font-size: 16px; font: bold \"Verdana\";}");
366 ui->infoLabel->setText(chatroomName);
367
368 // Display chat message prefix
369 QString chatPrefix;
370 if (PRIVATE_PREFIX.isPrefixOf(newChatPrefix)) {
371 chatPrefix =
372 QString("<Warning: no connection to hub or hub does not support prefix autoconfig.>\n"
373 "<Prefix = %1>")
374 .arg(QString::fromStdString(newChatPrefix.toUri()));
375 ui->prefixLabel->setStyleSheet(
376 "QLabel {color: red; font-size: 12px; font: bold \"Verdana\";}");
377 }
378 else {
379 chatPrefix = QString("<Prefix = %1>")
380 .arg(QString::fromStdString(newChatPrefix.toUri()));
381 ui->prefixLabel->setStyleSheet(
382 "QLabel {color: Green; font-size: 12px; font: bold \"Verdana\";}");
383 }
384 ui->prefixLabel->setText(chatPrefix);
Qiuhan Ding112ee482015-03-11 11:54:11 -0700385 fitView();
Yingdi Yud45777b2014-10-16 23:54:11 -0700386}
387
388void
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800389ChatDialog::onReturnPressed()
390{
391 QString text = ui->lineEdit->text();
Yingdi Yud45777b2014-10-16 23:54:11 -0700392
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800393 if (text.isEmpty())
394 return;
395
396 ui->lineEdit->clear();
397
Yingdi Yud45777b2014-10-16 23:54:11 -0700398 time_t timestamp =
399 static_cast<time_t>(time::toUnixTimestamp(time::system_clock::now()).count() / 1000);
400 // appendChatMessage(m_nick, text, timestamp);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800401
Yingdi Yud45777b2014-10-16 23:54:11 -0700402 emit msgToSent(text, timestamp);
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800403
404 fitView();
405}
406
Yingdi Yufa0b6a02014-04-30 14:26:42 -0700407void
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700408ChatDialog::onSyncTreeButtonPressed()
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800409{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700410 if (ui->syncTreeViewer->isVisible()) {
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700411 ui->syncTreeViewer->hide();
412 ui->syncTreeButton->setText("Show ChronoSync Tree");
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800413 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700414 else {
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700415 ui->syncTreeViewer->show();
416 ui->syncTreeButton->setText("Hide ChronoSync Tree");
417 }
418
419 fitView();
420}
421
422void
423ChatDialog::onTrustTreeButtonPressed()
424{
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700425 if (ui->trustTreeViewer->isVisible()) {
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700426 ui->trustTreeViewer->hide();
427 ui->trustTreeButton->setText("Show Trust Tree");
428 }
Yingdi Yu0b0a7362014-08-05 16:31:30 -0700429 else {
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700430 ui->trustTreeViewer->show();
431 ui->trustTreeButton->setText("Hide Trust Tree");
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800432 }
433
434 fitView();
435}
436
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700437void ChatDialog::enableSyncTreeDisplay()
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800438{
Yingdi Yuf4aaa8b2014-03-10 11:24:31 -0700439 ui->syncTreeButton->setEnabled(true);
Yingdi Yud45777b2014-10-16 23:54:11 -0700440 ui->syncTreeViewer->show();
441 fitView();
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800442}
443
Yingdi Yueb692ac2015-02-10 18:46:18 -0800444} // namespace chronochat
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800445
Mengjin Yanaec70742014-08-25 10:37:45 -0700446
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800447#if WAF
448#include "chat-dialog.moc"
Yingdi Yu42125862014-08-07 17:04:28 -0700449// #include "chat-dialog.cpp.moc"
Yingdi Yu348f5ea2014-03-01 14:47:25 -0800450#endif