Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/fileutil.cpp b/src/fileutil.cpp
- index 0992adef..97e83721 100644
- --- a/src/fileutil.cpp
- +++ b/src/fileutil.cpp
- @@ -58,7 +58,7 @@ void FileUtil::setLastUsedSavePath(const QString& path)
- QString FileUtil::getOpenFileName(QWidget* parent, const QString& caption, const QString& filter, QString* selectedFilter)
- {
- - while (1) {
- + while (true) {
- if (lastUsedOpenPath().isEmpty()) {
- setLastUsedOpenPath(QDir::homePath());
- }
- @@ -79,6 +79,29 @@ QString FileUtil::getOpenFileName(QWidget* parent, const QString& caption, const
- return QString();
- }
- +QStringList FileUtil::getOpenFileNames(QWidget* parent, const QString& caption, const QString& filter, QString* selectedFilter)
- +{
- + while (true) {
- + if (lastUsedOpenPath().isEmpty()) {
- + setLastUsedOpenPath(QDir::homePath());
- + }
- + QStringList fileNames = QFileDialog::getOpenFileNames(parent, caption, lastUsedOpenPath(), filter, selectedFilter);
- + foreach (const QString &fileName, fileNames) {
- + QFileInfo fi(fileName);
- + if (!fi.exists()) {
- + QMessageBox::information(parent, tr("Error"), tr("The file specified does not exist."));
- + continue;
- + }
- +
- + setLastUsedOpenPath(fi.path());
- + }
- + return fileNames;
- + break;
- + }
- +
- + return QStringList();
- +}
- +
- QString FileUtil::getSaveFileName(QWidget* parent, const QString& caption, const QString& defaultFileName, const QString& filter, QString* selectedFilter)
- {
- if (lastUsedSavePath().isEmpty()) {
- diff --git a/src/fileutil.h b/src/fileutil.h
- index 41ea97b6..3e0cfad0 100644
- --- a/src/fileutil.h
- +++ b/src/fileutil.h
- @@ -37,8 +37,9 @@ public:
- static QString getImageFileName(QWidget* parent, QString caption = QString());
- static QString getInbandImageFileName(QWidget* parent);
- - static QString getOpenFileName(QWidget* parent = 0, const QString& caption = QString(), const QString& filter = QString(), QString* selectedFilter = 0);
- - static QString getSaveFileName(QWidget* parent = 0, const QString& caption = QString(), const QString& defaultFileName = QString(), const QString& filter = QString(), QString* selectedFilter = 0);
- + static QString getOpenFileName(QWidget* parent = nullptr, const QString& caption = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr);
- + static QStringList getOpenFileNames(QWidget* parent = nullptr, const QString &caption = QString(), const QString& filter = QString(), QString* selectedFilter = nullptr);
- + static QString getSaveFileName(QWidget* parent = nullptr, const QString& caption = QString(), const QString& defaultFileName = QString(), const QString& filter = QString(), QString* selectedFilter = 0);
- static QString getSaveDirName(QWidget *parent, const QString &caption);
- static QString mimeToFileExt(const QString &mime);
- diff --git a/src/multifiletransferdlg.cpp b/src/multifiletransferdlg.cpp
- index 6b894f94..4549bc13 100644
- --- a/src/multifiletransferdlg.cpp
- +++ b/src/multifiletransferdlg.cpp
- @@ -92,6 +92,18 @@ MultiFileTransferDlg::MultiFileTransferDlg(PsiAccount *acc, QWidget *parent) :
- ui->listView->setItemDelegate(new MultiFileTransferDelegate(this));
- ui->listView->setModel(d->model);
- ui->buttonBox->button(QDialogButtonBox::Abort)->hide();
- + connect(ui->listView, &QListView::activated, this, [&] (QModelIndex index) {
- + auto state = index.data(MultiFileTransferModel::StateRole).toInt();
- + if (state == MultiFileTransferModel::AddTemplate) {
- + QStringList files_ = FileUtil::getOpenFileNames(this, tr("Open Files"));
- + if(d->session) {
- + appendOutgoing(files_);
- + }
- + else{
- + initOutgoing(d->peer, files_);
- + }
- + }
- + });
- updateMyVisuals();
- }
- @@ -204,7 +216,6 @@ void MultiFileTransferDlg::initOutgoing(const XMPP::Jid &jid, const QStringList
- app->setFile(file);
- d->session->addContent(app);
- }
- -
- d->session->initiate();
- });
- }
- @@ -283,6 +294,71 @@ void MultiFileTransferDlg::initIncoming(XMPP::Jingle::Session *session)
- updateComonVisuals();
- }
- +void MultiFileTransferDlg::appendOutgoing(const QStringList &fileList)
- +{
- + d->isOutgoing = true;
- + updatePeerVisuals();
- + for (auto const &fname: fileList) {
- + QFileInfo fi(fname);
- + if (fi.isFile() && fi.isReadable()) {
- + auto mftItem = d->model->addTransfer(MultiFileTransferModel::Outgoing, fi.fileName(), fi.size());
- + mftItem->setThumbnail(QFileIconProvider().icon(fi));
- + mftItem->setFileName(fname);
- + QMimeDatabase mimeDb;
- + QFileInfo fi(mftItem->filePath());
- + if (!fi.isReadable()) {
- + delete mftItem;
- + continue;
- + }
- + auto app = static_cast<Jingle::FileTransfer::Application*>(d->session->newContent(Jingle::FileTransfer::NS, d->session->role()));
- + if (!app) {
- + qWarning("Nothing registered in Jingle for %s", qPrintable(Jingle::FileTransfer::NS));
- + return;
- + }
- + connect(app, &Jingle::FileTransfer::Application::deviceRequested, mftItem, [app,mftItem](quint64 offset, quint64 size){
- + auto f = new QFile(mftItem->filePath(), app);
- + f->open(QIODevice::ReadOnly);
- + f->seek(offset);
- + app->setDevice(f);
- + Q_UNUSED(size);
- + });
- + connect(app, &Jingle::FileTransfer::Application::stateChanged, mftItem, [app,mftItem](Jingle::State state){
- + Q_UNUSED(state);
- + setMFTItemStateFromJingleState(mftItem, app);
- + });
- + connect(app, &Jingle::FileTransfer::Application::progress, mftItem, &MultiFileTransferItem::setCurrentSize);
- + // compute file hash
- + XMPP::Hash hash(XMPP::Hash::Blake2b512);
- + QFile f(mftItem->filePath());
- + hash.computeFromDevice(&f); // FIXME it will freeze Psi for awhile on large files
- +
- + // take thumbnail
- + QImage img(mftItem->filePath());
- + XMPP::Thumbnail thumb;
- + if (!img.isNull()) {
- + QByteArray ba;
- + QBuffer buffer(&ba);
- + buffer.open(QIODevice::WriteOnly);
- + img = img.scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation);
- + img.save(&buffer, "PNG");
- + thumb = XMPP::Thumbnail(ba, "image/png", img.width(), img.height());
- + }
- +
- + Jingle::FileTransfer::File file;
- + file.setDate(fi.lastModified());
- + file.setDescription(mftItem->description());
- + file.setHash(hash);
- + file.setMediaType(mimeDb.mimeTypeForFile(fi).name());
- + file.setName(fi.fileName());
- + file.setRange(); // indicate range support
- + file.setSize(fi.size());
- + file.setThumbnail(thumb);
- + app->setFile(file);
- + d->session->addContent(app);
- + }
- + }
- +}
- +
- void MultiFileTransferDlg::updateMyVisuals()
- {
- QPixmap avatar;
- @@ -329,3 +405,39 @@ void MultiFileTransferDlg::updateComonVisuals()
- {
- ui->lblStatus->setText(tr("%1 File(s)").arg(d->model->rowCount() - 1));
- }
- +
- +void MultiFileTransferDlg::dragEnterEvent(QDragEnterEvent *event)
- +{
- + event->acceptProposedAction();
- +}
- +
- +void MultiFileTransferDlg::dragMoveEvent(QDragMoveEvent *event)
- +{
- + event->acceptProposedAction();
- +}
- +
- +void MultiFileTransferDlg::dragLeaveEvent(QDragLeaveEvent *event)
- +{
- + event->accept();
- +}
- +
- +void MultiFileTransferDlg::dropEvent(QDropEvent *event)
- +{
- + //QList <QFileInfo> dragFiles;
- + QStringList dragFiles;
- + const QMimeData* mimeData = event->mimeData();
- + if (mimeData->hasUrls()) {
- + foreach(const QUrl & url_, mimeData->urls()) {
- + dragFiles << url_.toLocalFile();
- + }
- + }
- + if (!dragFiles.isEmpty()) {
- + if (d->session) {
- + appendOutgoing(dragFiles);
- + }
- + else{
- + initOutgoing(d->peer, dragFiles);
- + }
- + event->acceptProposedAction();
- + }
- +}
- diff --git a/src/multifiletransferdlg.h b/src/multifiletransferdlg.h
- index c3e7b09e..cc9352d9 100644
- --- a/src/multifiletransferdlg.h
- +++ b/src/multifiletransferdlg.h
- @@ -46,10 +46,18 @@ public:
- void initOutgoing(const XMPP::Jid &jid, const QStringList &fileList);
- void initIncoming(XMPP::Jingle::Session *session);
- +
- +protected:
- + void dragEnterEvent(QDragEnterEvent *event);
- + void dragMoveEvent(QDragMoveEvent *event);
- + void dragLeaveEvent(QDragLeaveEvent *event);
- + void dropEvent(QDropEvent *event);
- +
- private:
- void updatePeerVisuals();
- void updateMyVisuals();
- void updateComonVisuals();
- + void appendOutgoing(const QStringList &fileList);
- private:
- Ui::MultiFileTransferDlg *ui;
- diff --git a/src/multifiletransferdlg.ui b/src/multifiletransferdlg.ui
- index c5c19fd3..6017b60d 100644
- --- a/src/multifiletransferdlg.ui
- +++ b/src/multifiletransferdlg.ui
- @@ -10,6 +10,9 @@
- <height>300</height>
- </rect>
- </property>
- + <property name="acceptDrops">
- + <bool>true</bool>
- + </property>
- <property name="windowTitle">
- <string notr="true">File Transfer</string>
- </property>
- @@ -206,7 +209,14 @@
- </layout>
- </item>
- <item>
- - <widget class="QListView" name="listView"/>
- + <widget class="QListView" name="listView">
- + <property name="acceptDrops">
- + <bool>true</bool>
- + </property>
- + <property name="dragDropMode">
- + <enum>QAbstractItemView::DropOnly</enum>
- + </property>
- + </widget>
- </item>
- <item>
- <widget class="QDialogButtonBox" name="buttonBox">
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement