summaryrefslogtreecommitdiffstats
path: root/Swift
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2015-06-20 22:23:59 (GMT)
committerTobias Markmann <tm@ayena.de>2015-07-10 11:36:00 (GMT)
commit84dcfb6263b46b62504706d69198675690f759be (patch)
tree246b524c40dad61cef2d3dcfb759a9ab5505dc3f /Swift
parent23481aa1306b7d77b18be3b1c8764cccdc80e32d (diff)
downloadswift-84dcfb6263b46b62504706d69198675690f759be.zip
swift-84dcfb6263b46b62504706d69198675690f759be.tar.bz2
Add 'Open file' button for successfully transferred files
The button is shown after the 'Transfer completed successful.' message and asks the desktop environment to open the file with the default program. Test-Information: Send a file to another Swift on OS X 10.9.5 and verified that it opens the file on button click. Change-Id: I602e534ef07a119247cbf979e13551be7771880c
Diffstat (limited to 'Swift')
-rw-r--r--Swift/QtUI/QtWebKitChatView.cpp47
-rw-r--r--Swift/QtUI/QtWebKitChatView.h11
2 files changed, 37 insertions, 21 deletions
diff --git a/Swift/QtUI/QtWebKitChatView.cpp b/Swift/QtUI/QtWebKitChatView.cpp
index 60e5440..d6dc6f5 100644
--- a/Swift/QtUI/QtWebKitChatView.cpp
+++ b/Swift/QtUI/QtWebKitChatView.cpp
@@ -2,40 +2,40 @@
2 * Copyright (c) 2010-2015 Isode Limited. 2 * Copyright (c) 2010-2015 Isode Limited.
3 * All rights reserved. 3 * All rights reserved.
4 * See the COPYING file for more information. 4 * See the COPYING file for more information.
5 */ 5 */
6 6
7#include "QtWebKitChatView.h" 7#include <Swift/QtUI/QtWebKitChatView.h>
8 8
9#include <QtDebug> 9#include <QApplication>
10#include <QDesktopServices>
10#include <QEventLoop> 11#include <QEventLoop>
11#include <QFile> 12#include <QFile>
12#include <QDesktopServices> 13#include <QFileDialog>
13#include <QVBoxLayout> 14#include <QInputDialog>
14#include <QWebFrame>
15#include <QKeyEvent> 15#include <QKeyEvent>
16#include <QMessageBox>
16#include <QStackedWidget> 17#include <QStackedWidget>
17#include <QTimer> 18#include <QTimer>
18#include <QMessageBox> 19#include <QVBoxLayout>
19#include <QApplication> 20#include <QWebFrame>
20#include <QInputDialog> 21#include <QtDebug>
21#include <QFileDialog>
22 22
23#include <Swiften/Base/Log.h>
24#include <Swiften/Base/FileSize.h> 23#include <Swiften/Base/FileSize.h>
24#include <Swiften/Base/Log.h>
25#include <Swiften/StringCodecs/Base64.h> 25#include <Swiften/StringCodecs/Base64.h>
26 26
27#include <Swift/Controllers/UIEvents/UIEventStream.h>
28#include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h> 27#include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>
28#include <Swift/Controllers/UIEvents/UIEventStream.h>
29 29
30#include <Swift/QtUI/QtWebView.h> 30#include <Swift/QtUI/MessageSnippet.h>
31#include <Swift/QtUI/QtChatWindow.h> 31#include <Swift/QtUI/QtChatWindow.h>
32#include <Swift/QtUI/QtChatWindowJSBridge.h> 32#include <Swift/QtUI/QtChatWindowJSBridge.h>
33#include <Swift/QtUI/QtScaledAvatarCache.h> 33#include <Swift/QtUI/QtScaledAvatarCache.h>
34#include <Swift/QtUI/QtSwiftUtil.h> 34#include <Swift/QtUI/QtSwiftUtil.h>
35#include <Swift/QtUI/QtUtilities.h> 35#include <Swift/QtUI/QtUtilities.h>
36#include <Swift/QtUI/MessageSnippet.h> 36#include <Swift/QtUI/QtWebView.h>
37#include <Swift/QtUI/SystemMessageSnippet.h> 37#include <Swift/QtUI/SystemMessageSnippet.h>
38 38
39namespace Swift { 39namespace Swift {
40 40
41const QString QtWebKitChatView::ButtonWhiteboardSessionCancel = QString("whiteboard-cancel"); 41const QString QtWebKitChatView::ButtonWhiteboardSessionCancel = QString("whiteboard-cancel");
@@ -43,10 +43,11 @@ const QString QtWebKitChatView::ButtonWhiteboardSessionAcceptRequest = QString("
43const QString QtWebKitChatView::ButtonWhiteboardShowWindow = QString("whiteboard-showwindow"); 43const QString QtWebKitChatView::ButtonWhiteboardShowWindow = QString("whiteboard-showwindow");
44const QString QtWebKitChatView::ButtonFileTransferCancel = QString("filetransfer-cancel"); 44const QString QtWebKitChatView::ButtonFileTransferCancel = QString("filetransfer-cancel");
45const QString QtWebKitChatView::ButtonFileTransferSetDescription = QString("filetransfer-setdescription"); 45const QString QtWebKitChatView::ButtonFileTransferSetDescription = QString("filetransfer-setdescription");
46const QString QtWebKitChatView::ButtonFileTransferSendRequest = QString("filetransfer-sendrequest"); 46const QString QtWebKitChatView::ButtonFileTransferSendRequest = QString("filetransfer-sendrequest");
47const QString QtWebKitChatView::ButtonFileTransferAcceptRequest = QString("filetransfer-acceptrequest"); 47const QString QtWebKitChatView::ButtonFileTransferAcceptRequest = QString("filetransfer-acceptrequest");
48const QString QtWebKitChatView::ButtonFileTransferOpenFile = QString("filetransfer-openfile");
48const QString QtWebKitChatView::ButtonMUCInvite = QString("mucinvite"); 49const QString QtWebKitChatView::ButtonMUCInvite = QString("mucinvite");
49 50
50QtWebKitChatView::QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, bool disableAutoScroll) : QtChatView(parent), window_(window), eventStream_(eventStream), fontSizeSteps_(0), disableAutoScroll_(disableAutoScroll), previousMessageKind_(PreviosuMessageWasNone), previousMessageWasSelf_(false), showEmoticons_(false), insertingLastLine_(false), idCounter_(0) { 51QtWebKitChatView::QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, bool disableAutoScroll) : QtChatView(parent), window_(window), eventStream_(eventStream), fontSizeSteps_(0), disableAutoScroll_(disableAutoScroll), previousMessageKind_(PreviosuMessageWasNone), previousMessageWasSelf_(false), showEmoticons_(false), insertingLastLine_(false), idCounter_(0) {
51 theme_ = theme; 52 theme_ = theme;
52 53
@@ -460,11 +461,12 @@ void QtWebKitChatView::setFileTransferStatus(QString id, const ChatWindow::FileT
460 else if (state == ChatWindow::Canceled) { 461 else if (state == ChatWindow::Canceled) {
461 newInnerHTML = tr("Transfer has been canceled!"); 462 newInnerHTML = tr("Transfer has been canceled!");
462 } 463 }
463 else if (state == ChatWindow::Finished) { 464 else if (state == ChatWindow::Finished) {
464 // text "Successful transfer" 465 // text "Successful transfer"
465 newInnerHTML = tr("Transfer completed successfully."); 466 newInnerHTML = tr("Transfer completed successfully." ) + " " + buildChatWindowButton(tr("Open file"), ButtonFileTransferOpenFile, id, filePaths_[id]);
467 filePaths_.erase(id);
466 } 468 }
467 else if (state == ChatWindow::FTFailed) { 469 else if (state == ChatWindow::FTFailed) {
468 newInnerHTML = tr("Transfer failed."); 470 newInnerHTML = tr("Transfer failed.");
469 } 471 }
470 472
@@ -490,10 +492,17 @@ void QtWebKitChatView::setMUCInvitationJoined(QString id) {
490 if (!buttonElement.isNull()) { 492 if (!buttonElement.isNull()) {
491 buttonElement.setAttribute("value", tr("Return to room")); 493 buttonElement.setAttribute("value", tr("Return to room"));
492 } 494 }
493} 495}
494 496
497void QtWebKitChatView::askDesktopToOpenFile(const QString& filename) {
498 QFileInfo fileInfo(filename);
499 if (fileInfo.exists() && fileInfo.isFile()) {
500 QDesktopServices::openUrl(QUrl::fromLocalFile(filename));
501 }
502}
503
495void QtWebKitChatView::handleScrollRequested(int, int dy, const QRect&) { 504void QtWebKitChatView::handleScrollRequested(int, int dy, const QRect&) {
496 rememberScrolledToBottom(); 505 rememberScrolledToBottom();
497 506
498 int pos = webPage_->mainFrame()->scrollBarValue(Qt::Vertical) - dy; 507 int pos = webPage_->mainFrame()->scrollBarValue(Qt::Vertical) - dy;
499 emit scrollRequested(pos); 508 emit scrollRequested(pos);
@@ -650,10 +659,11 @@ std::string QtWebKitChatView::addFileTransfer(const std::string& senderName, boo
650 QString actionText; 659 QString actionText;
651 QString htmlString; 660 QString htmlString;
652 QString formattedFileSize = P2QSTRING(formatSize(sizeInBytes)); 661 QString formattedFileSize = P2QSTRING(formatSize(sizeInBytes));
653 if (senderIsSelf) { 662 if (senderIsSelf) {
654 // outgoing 663 // outgoing
664 filePaths_[ft_id] = P2QSTRING(filename);
655 actionText = tr("Send file"); 665 actionText = tr("Send file");
656 htmlString = actionText + ": " + P2QSTRING(filename) + " ( " + formattedFileSize + ") <br/>" + 666 htmlString = actionText + ": " + P2QSTRING(filename) + " ( " + formattedFileSize + ") <br/>" +
657 "<div id='" + ft_id + "'>" + 667 "<div id='" + ft_id + "'>" +
658 buildChatWindowButton(tr("Cancel"), ButtonFileTransferCancel, ft_id) + 668 buildChatWindowButton(tr("Cancel"), ButtonFileTransferCancel, ft_id) +
659 buildChatWindowButton(tr("Set Description"), ButtonFileTransferSetDescription, ft_id) + 669 buildChatWindowButton(tr("Set Description"), ButtonFileTransferSetDescription, ft_id) +
@@ -717,13 +727,10 @@ std::string QtWebKitChatView::addWhiteboardRequest(const QString& contact, bool
717 727
718void QtWebKitChatView::setWhiteboardSessionStatus(const std::string& id, const ChatWindow::WhiteboardSessionState state) { 728void QtWebKitChatView::setWhiteboardSessionStatus(const std::string& id, const ChatWindow::WhiteboardSessionState state) {
719 setWhiteboardSessionStatus(P2QSTRING(id), state); 729 setWhiteboardSessionStatus(P2QSTRING(id), state);
720} 730}
721 731
722
723
724
725void QtWebKitChatView::handleHTMLButtonClicked(QString id, QString encodedArgument1, QString encodedArgument2, QString encodedArgument3, QString encodedArgument4, QString encodedArgument5) { 732void QtWebKitChatView::handleHTMLButtonClicked(QString id, QString encodedArgument1, QString encodedArgument2, QString encodedArgument3, QString encodedArgument4, QString encodedArgument5) {
726 QString arg1 = decodeButtonArgument(encodedArgument1); 733 QString arg1 = decodeButtonArgument(encodedArgument1);
727 QString arg2 = decodeButtonArgument(encodedArgument2); 734 QString arg2 = decodeButtonArgument(encodedArgument2);
728 QString arg3 = decodeButtonArgument(encodedArgument3); 735 QString arg3 = decodeButtonArgument(encodedArgument3);
729 QString arg4 = decodeButtonArgument(encodedArgument4); 736 QString arg4 = decodeButtonArgument(encodedArgument4);
@@ -751,13 +758,19 @@ void QtWebKitChatView::handleHTMLButtonClicked(QString id, QString encodedArgume
751 QString ft_id = arg1; 758 QString ft_id = arg1;
752 QString filename = arg2; 759 QString filename = arg2;
753 760
754 QString path = QFileDialog::getSaveFileName(this, tr("Save File"), filename); 761 QString path = QFileDialog::getSaveFileName(this, tr("Save File"), filename);
755 if (!path.isEmpty()) { 762 if (!path.isEmpty()) {
763 filePaths_[ft_id] = path;
756 window_->onFileTransferAccept(Q2PSTRING(ft_id), Q2PSTRING(path)); 764 window_->onFileTransferAccept(Q2PSTRING(ft_id), Q2PSTRING(path));
757 } 765 }
758 } 766 }
767 else if (id.startsWith(ButtonFileTransferOpenFile)) {
768 QString ft_id = arg1;
769 QString filename = arg2;
770 askDesktopToOpenFile(filename);
771 }
759 else if (id.startsWith(ButtonWhiteboardSessionAcceptRequest)) { 772 else if (id.startsWith(ButtonWhiteboardSessionAcceptRequest)) {
760 QString id = arg1; 773 QString id = arg1;
761 setWhiteboardSessionStatus(id, ChatWindow::WhiteboardAccepted); 774 setWhiteboardSessionStatus(id, ChatWindow::WhiteboardAccepted);
762 window_->onWhiteboardSessionAccept(); 775 window_->onWhiteboardSessionAccept();
763 } 776 }
diff --git a/Swift/QtUI/QtWebKitChatView.h b/Swift/QtUI/QtWebKitChatView.h
index ea9a57c..af2da01 100644
--- a/Swift/QtUI/QtWebKitChatView.h
+++ b/Swift/QtUI/QtWebKitChatView.h
@@ -4,16 +4,16 @@
4 * See the COPYING file for more information. 4 * See the COPYING file for more information.
5 */ 5 */
6 6
7#pragma once 7#pragma once
8 8
9#include <QString> 9#include <boost/shared_ptr.hpp>
10#include <QWidget> 10
11#include <QList> 11#include <QList>
12#include <QString>
12#include <QWebElement> 13#include <QWebElement>
13 14#include <QWidget>
14#include <boost/shared_ptr.hpp>
15 15
16#include <Swiften/Base/Override.h> 16#include <Swiften/Base/Override.h>
17 17
18#include <Swift/Controllers/UIInterfaces/ChatWindow.h> 18#include <Swift/Controllers/UIInterfaces/ChatWindow.h>
19 19
@@ -39,10 +39,11 @@ namespace Swift {
39 static const QString ButtonWhiteboardShowWindow; 39 static const QString ButtonWhiteboardShowWindow;
40 static const QString ButtonFileTransferCancel; 40 static const QString ButtonFileTransferCancel;
41 static const QString ButtonFileTransferSetDescription; 41 static const QString ButtonFileTransferSetDescription;
42 static const QString ButtonFileTransferSendRequest; 42 static const QString ButtonFileTransferSendRequest;
43 static const QString ButtonFileTransferAcceptRequest; 43 static const QString ButtonFileTransferAcceptRequest;
44 static const QString ButtonFileTransferOpenFile;
44 static const QString ButtonMUCInvite; 45 static const QString ButtonMUCInvite;
45 public: 46 public:
46 QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, bool disableAutoScroll = false); 47 QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, bool disableAutoScroll = false);
47 ~QtWebKitChatView(); 48 ~QtWebKitChatView();
48 49
@@ -94,10 +95,11 @@ namespace Swift {
94 void addToJSEnvironment(const QString&, QObject*); 95 void addToJSEnvironment(const QString&, QObject*);
95 void setFileTransferProgress(QString id, const int percentageDone); 96 void setFileTransferProgress(QString id, const int percentageDone);
96 void setFileTransferStatus(QString id, const ChatWindow::FileTransferState state, const QString& msg); 97 void setFileTransferStatus(QString id, const ChatWindow::FileTransferState state, const QString& msg);
97 void setWhiteboardSessionStatus(QString id, const ChatWindow::WhiteboardSessionState state); 98 void setWhiteboardSessionStatus(QString id, const ChatWindow::WhiteboardSessionState state);
98 void setMUCInvitationJoined(QString id); 99 void setMUCInvitationJoined(QString id);
100 void askDesktopToOpenFile(const QString& filename);
99 101
100 signals: 102 signals:
101 void gotFocus(); 103 void gotFocus();
102 void fontResized(int); 104 void fontResized(int);
103 void logCleared(); 105 void logCleared();
@@ -184,7 +186,8 @@ namespace Swift {
184 bool showEmoticons_; 186 bool showEmoticons_;
185 bool insertingLastLine_; 187 bool insertingLastLine_;
186 int idCounter_; 188 int idCounter_;
187 QString previousSenderName_; 189 QString previousSenderName_;
188 std::map<QString, QString> descriptions_; 190 std::map<QString, QString> descriptions_;
191 std::map<QString, QString> filePaths_;
189 }; 192 };
190} 193}