Advertisement
Guest User

more work with jft 2

a guest
May 16th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.96 KB | None | 0 0
  1. diff --git a/src/fileutil.cpp b/src/fileutil.cpp
  2. index 0992adef..3edd73e2 100644
  3. --- a/src/fileutil.cpp
  4. +++ b/src/fileutil.cpp
  5. @@ -58,7 +58,7 @@ void FileUtil::setLastUsedSavePath(const QString& path)
  6.  
  7.  QString FileUtil::getOpenFileName(QWidget* parent, const QString& caption, const QString& filter, QString* selectedFilter)
  8.  {
  9. -    while (1) {
  10. +    while (true) {
  11.          if (lastUsedOpenPath().isEmpty()) {
  12.              setLastUsedOpenPath(QDir::homePath());
  13.          }
  14. @@ -79,6 +79,27 @@ QString FileUtil::getOpenFileName(QWidget* parent, const QString& caption, const
  15.      return QString();
  16.  }
  17.  
  18. +QStringList FileUtil::getOpenFileNames(QWidget* parent, const QString& caption, const QString& filter, QString* selectedFilter)
  19. +{
  20. +    while (true) {
  21. +        if (lastUsedOpenPath().isEmpty()) {
  22. +            setLastUsedOpenPath(QDir::homePath());
  23. +        }
  24. +        QStringList result;
  25. +        QStringList fileNames = QFileDialog::getOpenFileNames(parent, caption, lastUsedOpenPath(), filter, selectedFilter);
  26. +        foreach (const QString &fileName, fileNames) {
  27. +            QFileInfo fi(fileName);
  28. +            if (!fi.exists()) {
  29. +                QMessageBox::information(parent, tr("Error"), tr("The file specified does not exist."));
  30. +                continue;
  31. +            }
  32. +            result << fileName;
  33. +            setLastUsedOpenPath(fi.path());
  34. +        }
  35. +        return result;
  36. +    }
  37. +}
  38. +
  39.  QString FileUtil::getSaveFileName(QWidget* parent, const QString& caption, const QString& defaultFileName, const QString& filter, QString* selectedFilter)
  40.  {
  41.      if (lastUsedSavePath().isEmpty()) {
  42. diff --git a/src/fileutil.h b/src/fileutil.h
  43. index 41ea97b6..3e0cfad0 100644
  44. --- a/src/fileutil.h
  45. +++ b/src/fileutil.h
  46. @@ -37,8 +37,9 @@ public:
  47.  
  48.      static QString getImageFileName(QWidget* parent, QString caption = QString());
  49.      static QString getInbandImageFileName(QWidget* parent);
  50. -    static QString getOpenFileName(QWidget* parent = 0, const QString& caption = QString(), const QString& filter = QString(), QString* selectedFilter = 0);
  51. -    static QString getSaveFileName(QWidget* parent = 0, const QString& caption = QString(), const QString& defaultFileName = QString(), const QString& filter = QString(), QString* selectedFilter = 0);
  52. +    static QString getOpenFileName(QWidget* parent = nullptr, const QString& caption = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr);
  53. +    static QStringList getOpenFileNames(QWidget* parent = nullptr, const QString &caption = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr);
  54. +    static QString getSaveFileName(QWidget* parent = nullptr, const QString& caption = QString(), const QString& defaultFileName = QString(), const QString& filter = QString(), QString* selectedFilter = 0);
  55.      static QString getSaveDirName(QWidget *parent, const QString &caption);
  56.  
  57.      static QString mimeToFileExt(const QString &mime);
  58. diff --git a/src/multifiletransferdlg.cpp b/src/multifiletransferdlg.cpp
  59. index 6b894f94..07603f59 100644
  60. --- a/src/multifiletransferdlg.cpp
  61. +++ b/src/multifiletransferdlg.cpp
  62. @@ -92,6 +92,13 @@ MultiFileTransferDlg::MultiFileTransferDlg(PsiAccount *acc, QWidget *parent) :
  63.      ui->listView->setItemDelegate(new MultiFileTransferDelegate(this));
  64.      ui->listView->setModel(d->model);
  65.      ui->buttonBox->button(QDialogButtonBox::Abort)->hide();
  66. +    connect(ui->listView, &QListView::activated, this, [&] (QModelIndex index) {
  67. +        auto state = index.data(MultiFileTransferModel::StateRole).toInt();
  68. +        if (state == MultiFileTransferModel::AddTemplate) {
  69. +            QStringList files_ = FileUtil::getOpenFileNames(this, tr("Open Files"));
  70. +            appendOutgoing(files_);
  71. +        }
  72. +    });
  73.  
  74.      updateMyVisuals();
  75.  }
  76. @@ -154,57 +161,8 @@ void MultiFileTransferDlg::initOutgoing(const XMPP::Jid &jid, const QStringList
  77.                  delete item;
  78.                  continue;
  79.              }
  80. -
  81. -            auto app = static_cast<Jingle::FileTransfer::Application*>(d->session->newContent(Jingle::FileTransfer::NS, d->session->role()));
  82. -            if (!app) {
  83. -                qWarning("Nothing registered in Jingle for %s", qPrintable(Jingle::FileTransfer::NS));
  84. -                return;
  85. -            }
  86. -
  87. -            connect(app, &Jingle::FileTransfer::Application::deviceRequested, item, [app,item](quint64 offset, quint64 size){
  88. -                auto f = new QFile(item->filePath(), app);
  89. -                f->open(QIODevice::ReadOnly);
  90. -                f->seek(offset);
  91. -                app->setDevice(f);
  92. -                Q_UNUSED(size);
  93. -            });
  94. -            connect(app, &Jingle::FileTransfer::Application::stateChanged, item, [app,item](Jingle::State state){
  95. -                Q_UNUSED(state);
  96. -                setMFTItemStateFromJingleState(item, app);
  97. -            });
  98. -            connect(app, &Jingle::FileTransfer::Application::progress, item, &MultiFileTransferItem::setCurrentSize);
  99. -
  100. -            // compute file hash
  101. -            XMPP::Hash hash(XMPP::Hash::Blake2b512);
  102. -            QFile f(item->filePath());
  103. -            hash.computeFromDevice(&f); // FIXME it will freeze Psi for awhile on large files
  104. -
  105. -            // take thumbnail
  106. -            QImage img(item->filePath());
  107. -            XMPP::Thumbnail thumb;
  108. -            if (!img.isNull()) {
  109. -                QByteArray ba;
  110. -                QBuffer buffer(&ba);
  111. -                buffer.open(QIODevice::WriteOnly);
  112. -                img = img.scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  113. -                img.save(&buffer, "PNG");
  114. -                thumb = XMPP::Thumbnail(ba, "image/png", img.width(), img.height());
  115. -            }
  116. -
  117. -            Jingle::FileTransfer::File file;
  118. -            file.setDate(fi.lastModified());
  119. -            file.setDescription(item->description());
  120. -            file.setHash(hash);
  121. -            file.setMediaType(mimeDb.mimeTypeForFile(fi).name());
  122. -            file.setName(fi.fileName());
  123. -            file.setRange(); // indicate range support
  124. -            file.setSize(fi.size());
  125. -            file.setThumbnail(thumb);
  126. -
  127. -            app->setFile(file);
  128. -            d->session->addContent(app);
  129. +            addTransferContent(item);
  130.          }
  131. -
  132.          d->session->initiate();
  133.      });
  134.  }
  135. @@ -283,6 +241,81 @@ void MultiFileTransferDlg::initIncoming(XMPP::Jingle::Session *session)
  136.      updateComonVisuals();
  137.  }
  138.  
  139. +void MultiFileTransferDlg::addTransferContent(MultiFileTransferItem *item)
  140. +{
  141. +    QMimeDatabase mimeDb;
  142. +    auto app = static_cast<Jingle::FileTransfer::Application*>(d->session->newContent(Jingle::FileTransfer::NS, d->session->role()));
  143. +    if (!app) {
  144. +        qWarning("Nothing registered in Jingle for %s", qPrintable(Jingle::FileTransfer::NS));
  145. +        return;
  146. +    }
  147. +
  148. +    connect(app, &Jingle::FileTransfer::Application::deviceRequested, item, [app,item](quint64 offset, quint64 size){
  149. +        auto f = new QFile(item->filePath(), app);
  150. +        f->open(QIODevice::ReadOnly);
  151. +        f->seek(offset);
  152. +        app->setDevice(f);
  153. +        Q_UNUSED(size);
  154. +    });
  155. +    connect(app, &Jingle::FileTransfer::Application::stateChanged, item, [app,item](Jingle::State state){
  156. +        Q_UNUSED(state);
  157. +        setMFTItemStateFromJingleState(item, app);
  158. +    });
  159. +    connect(app, &Jingle::FileTransfer::Application::progress, item, &MultiFileTransferItem::setCurrentSize);
  160. +
  161. +    // compute file hash
  162. +    XMPP::Hash hash(XMPP::Hash::Blake2b512);
  163. +    QFile f(item->filePath());
  164. +    hash.computeFromDevice(&f); // FIXME it will freeze Psi for awhile on large files
  165. +
  166. +    // take thumbnail
  167. +    QImage img(item->filePath());
  168. +    XMPP::Thumbnail thumb;
  169. +    if (!img.isNull()) {
  170. +        QByteArray ba;
  171. +        QBuffer buffer(&ba);
  172. +        buffer.open(QIODevice::WriteOnly);
  173. +        img = img.scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation);
  174. +        img.save(&buffer, "PNG");
  175. +        thumb = XMPP::Thumbnail(ba, "image/png", img.width(), img.height());
  176. +    }
  177. +
  178. +    Jingle::FileTransfer::File file;
  179. +    QFileInfo fi(item->filePath());
  180. +    file.setDate(fi.lastModified());
  181. +    file.setDescription(item->description());
  182. +    file.setHash(hash);
  183. +    file.setMediaType(mimeDb.mimeTypeForFile(fi).name());
  184. +    file.setName(fi.fileName());
  185. +    file.setRange(); // indicate range support
  186. +    file.setSize(fi.size());
  187. +    file.setThumbnail(thumb);
  188. +
  189. +    app->setFile(file);
  190. +    d->session->addContent(app);
  191. +}
  192. +
  193. +void MultiFileTransferDlg::appendOutgoing(const QStringList &fileList)
  194. +{
  195. +    d->isOutgoing = true;
  196. +    if (d->session) {
  197. +        updatePeerVisuals();
  198. +        for (auto const &fname: fileList) {
  199. +            QFileInfo fi(fname);
  200. +            if (fi.isFile() && fi.isReadable()) {
  201. +                auto mftItem = d->model->addTransfer(MultiFileTransferModel::Outgoing, fi.fileName(), fi.size());
  202. +                mftItem->setThumbnail(QFileIconProvider().icon(fi));
  203. +                mftItem->setFileName(fname);
  204. +                addTransferContent(mftItem);
  205. +            }
  206. +        }
  207. +        updateComonVisuals();
  208. +    }
  209. +    else {
  210. +        initOutgoing(d->peer, fileList);
  211. +    }
  212. +}
  213. +
  214.  void MultiFileTransferDlg::updateMyVisuals()
  215.  {
  216.      QPixmap avatar;
  217. @@ -329,3 +362,34 @@ void MultiFileTransferDlg::updateComonVisuals()
  218.  {
  219.      ui->lblStatus->setText(tr("%1 File(s)").arg(d->model->rowCount() - 1));
  220.  }
  221. +
  222. +void MultiFileTransferDlg::dragEnterEvent(QDragEnterEvent *event)
  223. +{
  224. +    event->acceptProposedAction();
  225. +}
  226. +
  227. +void MultiFileTransferDlg::dragMoveEvent(QDragMoveEvent *event)
  228. +{
  229. +    event->acceptProposedAction();
  230. +}
  231. +
  232. +void MultiFileTransferDlg::dragLeaveEvent(QDragLeaveEvent *event)
  233. +{
  234. +    event->accept();
  235. +}
  236. +
  237. +void MultiFileTransferDlg::dropEvent(QDropEvent *event)
  238. +{
  239. +    //QList <QFileInfo> dragFiles;
  240. +    QStringList dragFiles;
  241. +    const QMimeData* mimeData = event->mimeData();
  242. +    if (mimeData->hasUrls()) {
  243. +        foreach(const QUrl & url_, mimeData->urls()) {
  244. +            dragFiles << url_.toLocalFile();
  245. +        }
  246. +    }
  247. +    if (!dragFiles.isEmpty()) {
  248. +        appendOutgoing(dragFiles);
  249. +        event->acceptProposedAction();
  250. +    }
  251. +}
  252. diff --git a/src/multifiletransferdlg.h b/src/multifiletransferdlg.h
  253. index c3e7b09e..22886ff2 100644
  254. --- a/src/multifiletransferdlg.h
  255. +++ b/src/multifiletransferdlg.h
  256. @@ -35,6 +35,7 @@ namespace XMPP {
  257.  }
  258.  
  259.  class PsiAccount;
  260. +class MultiFileTransferItem;
  261.  
  262.  class MultiFileTransferDlg : public QDialog
  263.  {
  264. @@ -46,10 +47,19 @@ public:
  265.  
  266.      void initOutgoing(const XMPP::Jid &jid, const QStringList &fileList);
  267.      void initIncoming(XMPP::Jingle::Session *session);
  268. +
  269. +protected:
  270. +    void dragEnterEvent(QDragEnterEvent *event);
  271. +    void dragMoveEvent(QDragMoveEvent *event);
  272. +    void dragLeaveEvent(QDragLeaveEvent *event);
  273. +    void dropEvent(QDropEvent *event);
  274. +
  275.  private:
  276.      void updatePeerVisuals();
  277.      void updateMyVisuals();
  278.      void updateComonVisuals();
  279. +    void addTransferContent(MultiFileTransferItem *item);
  280. +    void appendOutgoing(const QStringList &fileList);
  281.  
  282.  private:
  283.      Ui::MultiFileTransferDlg *ui;
  284. diff --git a/src/multifiletransferdlg.ui b/src/multifiletransferdlg.ui
  285. index c5c19fd3..6017b60d 100644
  286. --- a/src/multifiletransferdlg.ui
  287. +++ b/src/multifiletransferdlg.ui
  288. @@ -10,6 +10,9 @@
  289.      <height>300</height>
  290.     </rect>
  291.    </property>
  292. +  <property name="acceptDrops">
  293. +   <bool>true</bool>
  294. +  </property>
  295.    <property name="windowTitle">
  296.     <string notr="true">File Transfer</string>
  297.    </property>
  298. @@ -206,7 +209,14 @@
  299.      </layout>
  300.     </item>
  301.     <item>
  302. -    <widget class="QListView" name="listView"/>
  303. +    <widget class="QListView" name="listView">
  304. +     <property name="acceptDrops">
  305. +      <bool>true</bool>
  306. +     </property>
  307. +     <property name="dragDropMode">
  308. +      <enum>QAbstractItemView::DropOnly</enum>
  309. +     </property>
  310. +    </widget>
  311.     </item>
  312.     <item>
  313.      <widget class="QDialogButtonBox" name="buttonBox">
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement