From 2f242db979569a5e9ae731461d30a4e2c861c120 Mon Sep 17 00:00:00 2001 From: csoler Date: Sun, 14 Mar 2010 19:58:33 +0000 Subject: [PATCH] fixed RS link copy/paste from shared/search to transfers/forums/Pmessages git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5.0@2544 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- retroshare-gui/src/gui/RetroShareLink.cpp | 6 +++ retroshare-gui/src/gui/RetroShareLink.h | 45 +++++++++++++++- retroshare-gui/src/gui/SearchDialog.cpp | 10 ++-- retroshare-gui/src/gui/SharedFilesDialog.cpp | 53 ++++++++++--------- retroshare-gui/src/gui/SharedFilesDialog.h | 2 +- retroshare-gui/src/gui/TransfersDialog.cpp | 17 +++--- .../src/gui/forums/CreateForumMsg.cpp | 13 ++--- 7 files changed, 94 insertions(+), 52 deletions(-) diff --git a/retroshare-gui/src/gui/RetroShareLink.cpp b/retroshare-gui/src/gui/RetroShareLink.cpp index 5c2fc05a1..fc1ea2ec5 100644 --- a/retroshare-gui/src/gui/RetroShareLink.cpp +++ b/retroshare-gui/src/gui/RetroShareLink.cpp @@ -25,6 +25,8 @@ const QString RetroShareLink::HEADER_NAME("retroshare://file"); +std::vector RSLinkClipboard::_links ; + RetroShareLink::RetroShareLink(const QUrl& url) { // parse @@ -94,6 +96,10 @@ QString RetroShareLink::toString() const { return HEADER_NAME + "|" + _name + "|" + QString::number(_size) + "|" + _hash ; } +QString RetroShareLink::toHtml() const +{ + return QString("" + toString() + "" ; +} bool RetroShareLink::checkName(const QString& name) { diff --git a/retroshare-gui/src/gui/RetroShareLink.h b/retroshare-gui/src/gui/RetroShareLink.h index e34da95b6..d1278cf5c 100644 --- a/retroshare-gui/src/gui/RetroShareLink.h +++ b/retroshare-gui/src/gui/RetroShareLink.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2009 * + * Copyright (C) 2009 Cyril Soler * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -24,6 +24,14 @@ // // The link is done in a way that if valid()==true, then the link can be used. // +// The following combinations have been tested: +// copy paste-> Transfers (DL) | Message compose (forums) | Private msg | Public chat | private Chat +// -------------+----------------+--------------------------+------------------+-------------+------------- +// search | Y | Y | Y (send RS link) | Paste menu? | Paste menu? +// -------------+----------------+--------------------------+------------------+-------------+------------- +// shared | Y | Y | Y (send RS link) | Paste menu? | Paste menu? +// -------------+----------------+--------------------------+------------------+-------------+------------- +// #include #include #include @@ -39,7 +47,10 @@ class RetroShareLink const QString& name() const { return _name ; } const QString& hash() const { return _hash ; } + /// returns the string retroshare://file|name|size|hash QString toString() const ; + /// returns the string retroshare://file|name|size|hash + QString toHtml() const ; QUrl toUrl() const ; bool valid() const { return _size > 0 ; } @@ -55,5 +66,37 @@ class RetroShareLink QString _hash; }; +/// This class handles the copy/paste of links. Every member is static to ensure unicity. +/// I put no mutex, because all calls supposely com from the GUI thread. +// +class RSLinkClipboard +{ + public: + static void copyLinks(const std::vector& links) + { + _links = links ; + } + static const std::vector& pasteLinks() + { + return _links ; + } + static QString toHtml() + { + QString res ; + for(uint32_t i=0;i<_links.size();++i) + res += _links[i].toHtml() + "
" ; + + return res ; + } + static bool empty() + { + return _links.empty(); + } + private: + static std::vector _links ; +}; + + + #endif diff --git a/retroshare-gui/src/gui/SearchDialog.cpp b/retroshare-gui/src/gui/SearchDialog.cpp index 67412cff0..b37a8f80a 100644 --- a/retroshare-gui/src/gui/SearchDialog.cpp +++ b/retroshare-gui/src/gui/SearchDialog.cpp @@ -1192,7 +1192,7 @@ void SearchDialog::copysearchLink() int numdls = itemsForCopy.size(); QTreeWidgetItem * item; - QList urls ; + std::vector urls ; for (int i = 0; i < numdls; ++i) { @@ -1212,12 +1212,10 @@ void SearchDialog::copysearchLink() std::cerr << "new link added to clipboard: " << link.toString().toStdString() << std::endl ; if(link.valid()) - urls.push_back(link.toUrl()) ; + urls.push_back(link) ; } } - QMimeData *dt = new QMimeData; - dt->setUrls(urls) ; - QApplication::clipboard()->setMimeData(dt) ; + RSLinkClipboard::copyLinks(urls) ; } void SearchDialog::sendLinkTo( ) @@ -1229,8 +1227,8 @@ void SearchDialog::sendLinkTo( ) nMsgDialog->newMsg(); nMsgDialog->insertTitleText("New RetroShare Link(s)"); - nMsgDialog->insertHtmlText(QApplication::clipboard()->text().toStdString()); + nMsgDialog->insertMsgText(RSLinkClipboard::toHtml().toStdString()) ; nMsgDialog->show(); } diff --git a/retroshare-gui/src/gui/SharedFilesDialog.cpp b/retroshare-gui/src/gui/SharedFilesDialog.cpp index 2483acf3e..254f3a8c1 100644 --- a/retroshare-gui/src/gui/SharedFilesDialog.cpp +++ b/retroshare-gui/src/gui/SharedFilesDialog.cpp @@ -251,7 +251,7 @@ void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) else localModel->getDirDetailsFromSelect(lst, dirVec); - QList urls ; + std::vector urls ; for (int i = 0, n = dirVec.size(); i < n; ++i) { @@ -275,19 +275,20 @@ void SharedFilesDialog::copyLink (const QModelIndexList& lst, bool remote) continue; RetroShareLink link(details.name.c_str(), details.count, details.hash.c_str()); - urls.push_back(link.toUrl()) ; + + if(link.valid()) + urls.push_back(link) ; } } else { RetroShareLink link(details.name.c_str(), details.count, details.hash.c_str()); - urls.push_back(link.toUrl()) ; + if(link.valid()) + urls.push_back(link) ; } } - QMimeData *dt = new QMimeData ; - dt->setUrls(urls) ; - QApplication::clipboard()->setMimeData(dt) ; + RSLinkClipboard::copyLinks(urls) ; } void SharedFilesDialog::copyLinkRemote() @@ -327,7 +328,7 @@ void SharedFilesDialog::sendremoteLinkTo() std::cerr << "SharedFilesDialog::sendremoteLinkTo()" << std::endl; nMsgDialog->newMsg(); nMsgDialog->insertTitleText("RetroShare Link"); - nMsgDialog->insertMsgText(QApplication::clipboard()->text().toStdString()); + nMsgDialog->insertMsgText(RSLinkClipboard::toHtml().toStdString()); nMsgDialog->show(); } @@ -347,7 +348,8 @@ void SharedFilesDialog::sendLinkTo() std::cerr << "SharedFilesDialog::sendLinkTo()" << std::endl; nMsgDialog->newMsg(); nMsgDialog->insertTitleText("RetroShare Link"); - nMsgDialog->insertMsgText(QApplication::clipboard()->text().toStdString()); + + nMsgDialog->insertMsgText(RSLinkClipboard::toHtml().toStdString()); nMsgDialog->show(); } @@ -359,7 +361,6 @@ void SharedFilesDialog::sendHtmlLinkTo( ) /* create a message */ ChanMsgDialog *nMsgDialog = new ChanMsgDialog(true); - /* fill it in * files are receommended already * just need to set peers @@ -367,22 +368,22 @@ void SharedFilesDialog::sendHtmlLinkTo( ) std::cerr << "SharedFilesDialog::sendLinkTo()" << std::endl; nMsgDialog->newMsg(); nMsgDialog->insertTitleText("RetroShare Link"); - nMsgDialog->insertHtmlText(QApplication::clipboard()->text().toStdString()); + // nMsgDialog->insertHtmlText(QApplication::clipboard()->text().toStdString());// not compatible with multiple links + nMsgDialog->insertMsgText(RSLinkClipboard::toHtml().toStdString()); nMsgDialog->show(); } -void SharedFilesDialog::sendLinktoChat() -{ - copyLinkLocal (); - - static SendLinkDialog *slinkDialog = new SendLinkDialog(this); - - slinkDialog->insertHtmlText(QApplication::clipboard()->text().toStdString()); - - slinkDialog->show(); - -} +//void SharedFilesDialog::sendLinktoChat() +//{ +// copyLinkLocal (); +// +// static SendLinkDialog *slinkDialog = new SendLinkDialog(this); +// +// slinkDialog->insertMsgText(RSLinkClipboard::toHtml().toStdString()); +// slinkDialog->show(); +// +//} void SharedFilesDialog::sendLinkToCloud() { @@ -673,8 +674,8 @@ void SharedFilesDialog::sharedDirTreeWidgetContextMenu( QPoint point ) sendhtmllinkAct = new QAction(QIcon(IMAGE_COPYLINK), tr( "Send retroshare Links (HTML)" ), this ); connect( sendhtmllinkAct , SIGNAL( triggered() ), this, SLOT( sendHtmlLinkTo( ) ) ); - sendchatlinkAct = new QAction(QIcon(IMAGE_COPYLINK), tr( "Send retroshare Links to Chat" ), this ); - connect( sendchatlinkAct , SIGNAL( triggered() ), this, SLOT( sendLinktoChat( ) ) ); +// sendchatlinkAct = new QAction(QIcon(IMAGE_COPYLINK), tr( "Send retroshare Links to Chat" ), this ); +// connect( sendchatlinkAct , SIGNAL( triggered() ), this, SLOT( sendLinktoChat( ) ) ); sendlinkCloudAct = new QAction(QIcon(IMAGE_COPYLINK), tr( "Send retroshare Links to Cloud" ), this ); connect( sendlinkCloudAct , SIGNAL( triggered() ), this, SLOT( sendLinkToCloud( ) ) ); @@ -702,10 +703,10 @@ void SharedFilesDialog::sharedDirTreeWidgetContextMenu( QPoint point ) if(!localModel->isDir( midx ) ) { contextMnu2.addAction( copylinklocalAct); - contextMnu2.addAction( copylinklocalhtmlAct); +// contextMnu2.addAction( copylinklocalhtmlAct); contextMnu2.addAction( sendlinkAct); - contextMnu2.addAction( sendhtmllinkAct); - contextMnu2.addAction( sendchatlinkAct); +// contextMnu2.addAction( sendhtmllinkAct); +// contextMnu2.addAction( sendchatlinkAct); contextMnu2.addSeparator(); #ifndef RS_RELEASE_VERSION contextMnu2.addAction( sendlinkCloudAct); diff --git a/retroshare-gui/src/gui/SharedFilesDialog.h b/retroshare-gui/src/gui/SharedFilesDialog.h index d5e669fd3..c4bfa9918 100644 --- a/retroshare-gui/src/gui/SharedFilesDialog.h +++ b/retroshare-gui/src/gui/SharedFilesDialog.h @@ -70,7 +70,7 @@ private slots: void sendHtmlLinkTo(); void sendLinkToCloud(); void addLinkToCloud(); - void sendLinktoChat(); +// void sendLinktoChat(); void showFrame(bool show); void showFrameRemote(bool show); diff --git a/retroshare-gui/src/gui/TransfersDialog.cpp b/retroshare-gui/src/gui/TransfersDialog.cpp index eb0af8df9..448577511 100644 --- a/retroshare-gui/src/gui/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/TransfersDialog.cpp @@ -414,7 +414,9 @@ void TransfersDialog::downloadListCostumPopupMenu( QPoint point ) if(single) contextMnu.addAction( copylinkAct); #endif - contextMnu.addAction( pastelinkAct); + if(!RSLinkClipboard::empty()) + contextMnu.addAction( pastelinkAct); + contextMnu.addSeparator(); // contextMnu.addAction( clearQueueAct); contextMnu.addSeparator(); @@ -1072,15 +1074,12 @@ void TransfersDialog::showDetailsDialog() void TransfersDialog::pasteLink() { - QList urllist = QApplication::clipboard()->mimeData()->urls() ; + const std::vector& links(RSLinkClipboard::pasteLinks()) ; - for(QList::const_iterator it(urllist.begin());it!=urllist.end();++it) - { - RetroShareLink link(*it) ; - - if (link.valid()) - rsFiles->FileRequest(link.name().toStdString(), link.hash().toStdString(),link.size(), "", RS_FILE_HINTS_NETWORK_WIDE, std::list()); - } + for(uint32_t i=0;iFileRequest(links[i].name().toStdString(), links[i].hash().toStdString(),links[i].size(), "", RS_FILE_HINTS_NETWORK_WIDE, std::list())) + QMessageBox::critical(NULL,"Download refused","The file "+links[i].name()+" could not be downloaded. Do you already have it ?") ; } void TransfersDialog::getIdOfSelectedItems(std::set& items) diff --git a/retroshare-gui/src/gui/forums/CreateForumMsg.cpp b/retroshare-gui/src/gui/forums/CreateForumMsg.cpp index 4e1afdd5d..2d416d663 100644 --- a/retroshare-gui/src/gui/forums/CreateForumMsg.cpp +++ b/retroshare-gui/src/gui/forums/CreateForumMsg.cpp @@ -84,6 +84,9 @@ CreateForumMsg::CreateForumMsg(std::string fId, std::string pId) void CreateForumMsg::forumMessageCostumPopupMenu( QPoint point ) { + if(RSLinkClipboard::empty()) + return ; + contextMnu = new QMenu( this ); pasteLinkAct = new QAction(QIcon(":/images/pasterslink.png"), tr( "Paste retroshare Link" ), this ); @@ -415,14 +418,6 @@ void CreateForumMsg::fileHashingFinished(AttachFileItem* file) { void CreateForumMsg::pasteLink() { - QList list = QApplication::clipboard()->mimeData()->urls(); - - for(QList::const_iterator it(list.begin());it!=list.end();++it) - { - RetroShareLink link(*it) ; - - if(link.valid()) - ui.forumMessage->insertHtml(" " + link.toString() + "
") ; - } + ui.forumMessage->insertHtml(RSLinkClipboard::toHtml()) ; }