Advertisement
Guest User

more work with jft

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