Skip to content

Commit 78718f6

Browse files
committed
qimageuploader: add copy links to treeview context menu
1 parent 0a49fe0 commit 78718f6

File tree

6 files changed

+99
-10
lines changed

6 files changed

+99
-10
lines changed

Source/qimageuploader/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ set(SOURCE_FILES
4747
QtScriptFunctionsImpl.cpp
4848
Gui/controls/ServerSelectorWidget.cpp
4949
Gui/controls/ProgressRingWidget.cpp
50+
Gui/controls/UploadTreeView.cpp
51+
Gui/controls/UploadTreeView.h
5052
../Core/Settings/QtGuiSettings.cpp
5153
../Core/Settings/CommonGuiSettings.cpp
5254
../Core/AbstractServerIconCache.cpp

Source/qimageuploader/Gui/MainWindow.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ MainWindow::MainWindow(CUploadEngineList* engineList, LogWindow* logWindow, QWid
6565
ui->treeView->setColumnWidth(0, 150); // Filename column
6666
ui->treeView->setColumnWidth(1, 150); // Status column
6767
ui->treeView->setColumnWidth(2, 150); // Progress column
68-
68+
ui->treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
6969
connect(ui->treeView, &QTreeView::doubleClicked, this, &MainWindow::itemDoubleClicked);
7070
connect(ui->treeView, &QTreeView::customContextMenuRequested, this, &MainWindow::onCustomContextMenu);
7171

@@ -310,11 +310,33 @@ void MainWindow::onCustomContextMenu(const QPoint& point) {
310310
contextMenu->setDefaultAction(viewCodeAction);
311311

312312
if (internalItem->task) {
313-
auto uploadResult = internalItem->task->uploadResult();
314-
QString url = QString::fromUtf8(uploadResult->getDirectUrl().c_str());
315-
if (url.isEmpty()) {
316-
url = QString::fromUtf8(uploadResult->getDownloadUrl().c_str());
313+
auto* uploadResult = internalItem->task->uploadResult();
314+
QString directUrl = QString::fromStdString(uploadResult->getDirectUrl());
315+
QString viewUrl = QString::fromStdString(uploadResult->getDownloadUrl());
316+
317+
if (!directUrl.isEmpty()) {
318+
QAction* copyDirectLinkAction = new QAction(tr("Copy direct link"), contextMenu);
319+
copyDirectLinkAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C));
320+
connect(copyDirectLinkAction, &QAction::triggered, [directUrl](bool checked) {
321+
QClipboard* clipboard = QApplication::clipboard();
322+
clipboard->setText(directUrl);
323+
});
324+
contextMenu->addAction(copyDirectLinkAction);
325+
}
326+
327+
if (!viewUrl.isEmpty()) {
328+
QAction* copyViewLinkAction = new QAction(tr("Copy view link"), contextMenu);
329+
if (directUrl.isEmpty()) {
330+
copyViewLinkAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C));
331+
}
332+
connect(copyViewLinkAction, &QAction::triggered, [viewUrl](bool checked) {
333+
QClipboard* clipboard = QApplication::clipboard();
334+
clipboard->setText(viewUrl);
335+
});
336+
contextMenu->addAction(copyViewLinkAction);
317337
}
338+
contextMenu->addSeparator();
339+
QString url = directUrl.isEmpty() ? viewUrl : directUrl;
318340
if (!url.isEmpty()) {
319341
QAction* viewInBrowser = new QAction(tr("Open in browser"), contextMenu);
320342
connect(viewInBrowser, &QAction::triggered, [url](bool checked)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "UploadTreeView.h"
2+
3+
#include <algorithm>
4+
5+
#include <QApplication>
6+
#include <QClipboard>
7+
8+
UploadTreeView::UploadTreeView(QWidget *parent): QTreeView(parent) {
9+
10+
}
11+
12+
void UploadTreeView::keyPressEvent(QKeyEvent * event)
13+
{
14+
if(event->matches(QKeySequence::Copy)) {
15+
copy();
16+
} else {
17+
QTreeView::keyPressEvent(event);
18+
}
19+
}
20+
21+
void UploadTreeView::copy() {
22+
QItemSelectionModel * selection = selectionModel();
23+
QModelIndexList indexes = selection->selectedIndexes();
24+
25+
if(indexes.size() < 1) {
26+
return;
27+
}
28+
std::sort(indexes.begin(), indexes.end());
29+
QModelIndex index = indexes.first();
30+
31+
QString url = model()->data(index, Qt::UserRole).toString();
32+
QApplication::clipboard()->setText(url);
33+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef UPLOADTREEVIEW_H
2+
#define UPLOADTREEVIEW_H
3+
4+
#include <QTreeView>
5+
#include <QWidget>
6+
#include <QKeyEvent>
7+
8+
class UploadTreeView : public QTreeView
9+
{
10+
Q_OBJECT
11+
public:
12+
UploadTreeView(QWidget *parent = nullptr);
13+
void keyPressEvent(QKeyEvent * event) override;
14+
private:
15+
void copy();
16+
};
17+
18+
#endif // UPLOADTREEVIEW_H

Source/qimageuploader/Gui/models/uploadtreemodel.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ QVariant UploadTreeModel::data(const QModelIndex &index, int role) const
5050
return QBrush(QColor(Qt::darkGreen));
5151
}
5252
}
53+
54+
if (role == Qt::UserRole && index.column() == 0 && obj->task) {
55+
std::string directUrl = obj->task->uploadResult()->getDirectUrl();
56+
std::string viewUrl = obj->task->uploadResult()->getDownloadUrl();
57+
return directUrl.empty() ? QString::fromStdString(viewUrl) : QString::fromStdString(directUrl);
58+
}
59+
5360
if (role != Qt::DisplayRole)
5461
return {};
5562

@@ -58,8 +65,8 @@ QVariant UploadTreeModel::data(const QModelIndex &index, int role) const
5865
QString result;
5966
if(index.column() == 0)
6067
{
61-
if ( obj->task ) {
62-
result = U2Q(obj->task->title());
68+
if (obj->task ) {
69+
result = U2Q(obj->task->title());
6370
} else if ( obj->session) {
6471

6572
result = QString(tr("Session %1 (%2 files)").arg(obj->index + 1).arg(obj->session->taskCount()));

Source/qimageuploader/Gui/ui/MainWindow.ui

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<widget class="QWidget" name="centralWidget">
2121
<layout class="QVBoxLayout" name="verticalLayout">
2222
<item>
23-
<widget class="QTreeView" name="treeView">
23+
<widget class="UploadTreeView" name="treeView">
2424
<property name="expandsOnDoubleClick">
2525
<bool>false</bool>
2626
</property>
@@ -38,7 +38,7 @@
3838
<item>
3939
<spacer name="horizontalSpacer">
4040
<property name="orientation">
41-
<enum>Qt::Horizontal</enum>
41+
<enum>Qt::Orientation::Horizontal</enum>
4242
</property>
4343
<property name="sizeHint" stdset="0">
4444
<size>
@@ -70,7 +70,7 @@
7070
<bool>false</bool>
7171
</property>
7272
<property name="toolButtonStyle">
73-
<enum>Qt::ToolButtonTextBesideIcon</enum>
73+
<enum>Qt::ToolButtonStyle::ToolButtonTextBesideIcon</enum>
7474
</property>
7575
<property name="floatable">
7676
<bool>false</bool>
@@ -145,6 +145,13 @@
145145
</action>
146146
</widget>
147147
<layoutdefault spacing="6" margin="11"/>
148+
<customwidgets>
149+
<customwidget>
150+
<class>UploadTreeView</class>
151+
<extends>QTreeView</extends>
152+
<header>Gui/controls/uploadtreeview.h</header>
153+
</customwidget>
154+
</customwidgets>
148155
<resources>
149156
<include location="../../qimageuploader.qrc"/>
150157
</resources>

0 commit comments

Comments
 (0)