diff options
| author | Tobias Markmann <tm@ayena.de> | 2015-06-20 22:23:59 (GMT) |
|---|---|---|
| committer | Tobias Markmann <tm@ayena.de> | 2015-07-10 11:36:00 (GMT) |
| commit | 84dcfb6263b46b62504706d69198675690f759be (patch) | |
| tree | 246b524c40dad61cef2d3dcfb759a9ab5505dc3f /Swift | |
| parent | 23481aa1306b7d77b18be3b1c8764cccdc80e32d (diff) | |
| download | swift-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.cpp | 47 | ||||
| -rw-r--r-- | Swift/QtUI/QtWebKitChatView.h | 11 |
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 | ||
| 39 | namespace Swift { | 39 | namespace Swift { |
| 40 | 40 | ||
| 41 | const QString QtWebKitChatView::ButtonWhiteboardSessionCancel = QString("whiteboard-cancel"); | 41 | const QString QtWebKitChatView::ButtonWhiteboardSessionCancel = QString("whiteboard-cancel"); |
| @@ -43,10 +43,11 @@ const QString QtWebKitChatView::ButtonWhiteboardSessionAcceptRequest = QString(" | |||
| 43 | const QString QtWebKitChatView::ButtonWhiteboardShowWindow = QString("whiteboard-showwindow"); | 43 | const QString QtWebKitChatView::ButtonWhiteboardShowWindow = QString("whiteboard-showwindow"); |
| 44 | const QString QtWebKitChatView::ButtonFileTransferCancel = QString("filetransfer-cancel"); | 44 | const QString QtWebKitChatView::ButtonFileTransferCancel = QString("filetransfer-cancel"); |
| 45 | const QString QtWebKitChatView::ButtonFileTransferSetDescription = QString("filetransfer-setdescription"); | 45 | const QString QtWebKitChatView::ButtonFileTransferSetDescription = QString("filetransfer-setdescription"); |
| 46 | const QString QtWebKitChatView::ButtonFileTransferSendRequest = QString("filetransfer-sendrequest"); | 46 | const QString QtWebKitChatView::ButtonFileTransferSendRequest = QString("filetransfer-sendrequest"); |
| 47 | const QString QtWebKitChatView::ButtonFileTransferAcceptRequest = QString("filetransfer-acceptrequest"); | 47 | const QString QtWebKitChatView::ButtonFileTransferAcceptRequest = QString("filetransfer-acceptrequest"); |
| 48 | const QString QtWebKitChatView::ButtonFileTransferOpenFile = QString("filetransfer-openfile"); | ||
| 48 | const QString QtWebKitChatView::ButtonMUCInvite = QString("mucinvite"); | 49 | const QString QtWebKitChatView::ButtonMUCInvite = QString("mucinvite"); |
| 49 | 50 | ||
| 50 | QtWebKitChatView::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 | QtWebKitChatView::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 | ||
| 497 | void QtWebKitChatView::askDesktopToOpenFile(const QString& filename) { | ||
| 498 | QFileInfo fileInfo(filename); | ||
| 499 | if (fileInfo.exists() && fileInfo.isFile()) { | ||
| 500 | QDesktopServices::openUrl(QUrl::fromLocalFile(filename)); | ||
| 501 | } | ||
| 502 | } | ||
| 503 | |||
| 495 | void QtWebKitChatView::handleScrollRequested(int, int dy, const QRect&) { | 504 | void 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 | ||
| 718 | void QtWebKitChatView::setWhiteboardSessionStatus(const std::string& id, const ChatWindow::WhiteboardSessionState state) { | 728 | void 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 | |||
| 725 | void QtWebKitChatView::handleHTMLButtonClicked(QString id, QString encodedArgument1, QString encodedArgument2, QString encodedArgument3, QString encodedArgument4, QString encodedArgument5) { | 732 | void 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 | } |
Swift