Skip to content

Commit 5e641db

Browse files
committed
Plugins::FileTransfer: add local file browser
1 parent 4d043ad commit 5e641db

7 files changed

Lines changed: 346 additions & 18 deletions

File tree

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,174 @@
11
// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
22
// Author Kang Lin <kl222@126.com>
33

4+
#include <QInputDialog>
5+
#include <QMenu>
6+
#include <QDesktopServices>
7+
#include <QLoggingCategory>
48
#include "FrmFileTransfer.h"
59
#include "ui_FrmFileTransfer.h"
610

11+
static Q_LOGGING_CATEGORY(log, "FileTransfer.Widget")
712
CFrmFileTransfer::CFrmFileTransfer(QWidget *parent)
813
: QWidget(parent)
914
, ui(new Ui::CFrmFileTransfer)
15+
, m_pModelLocalDir(new QFileSystemModel(this))
16+
, m_pModelLocalFile(new QFileSystemModel(this))
1017
{
18+
bool check = false;
1119
ui->setupUi(this);
20+
21+
m_pModelLocalDir->setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
22+
m_pModelLocalDir->setReadOnly(false);
23+
ui->treeLocal->setEditTriggers(QAbstractItemView::NoEditTriggers);
24+
ui->treeLocal->setModel(m_pModelLocalDir);
25+
ui->treeLocal->setContextMenuPolicy(Qt::CustomContextMenu);
26+
check = connect(ui->treeLocal, &QTreeView::clicked,
27+
this, &CFrmFileTransfer::slotTreeLocalClicked);
28+
Q_ASSERT(check);
29+
SetLocalRoot(QString());
30+
ui->treeLocal->setHeaderHidden(true);
31+
// 注意:必须在 setModel 之后才会生效
32+
ui->treeLocal->header()->hideSection(1);
33+
ui->treeLocal->header()->hideSection(2);
34+
ui->treeLocal->header()->hideSection(3);
35+
36+
m_pModelLocalFile->setFilter(QDir::Files);
37+
m_pModelLocalFile->setReadOnly(false);
38+
ui->tabLocal->setEditTriggers(QAbstractItemView::NoEditTriggers);
39+
ui->tabLocal->setModel(m_pModelLocalFile);
40+
ui->tabLocal->setContextMenuPolicy(Qt::CustomContextMenu);
41+
ui->tabLocal->setShowGrid(false);
42+
ui->tabLocal->verticalHeader()->hide();
43+
ui->tabLocal->horizontalHeader()->setSectionResizeMode(
44+
QHeaderView::ResizeToContents);
1245
}
1346

1447
CFrmFileTransfer::~CFrmFileTransfer()
1548
{
1649
delete ui;
1750
}
51+
52+
int CFrmFileTransfer::SetLocalRoot(const QString &root)
53+
{
54+
auto index = m_pModelLocalDir->setRootPath(root);
55+
ui->treeLocal->setRootIndex(index);
56+
slotTreeLocalClicked(index);
57+
return 0;
58+
}
59+
60+
QString CFrmFileTransfer::GetLocalRoot() const
61+
{
62+
return m_pModelLocalDir->rootPath();
63+
}
64+
65+
void CFrmFileTransfer::slotTreeLocalClicked(const QModelIndex &index)
66+
{
67+
QString szPath = m_pModelLocalDir->filePath(index);
68+
if(szPath.isEmpty()) return;
69+
if(-1 == ui->cbLocal->findText(szPath))
70+
ui->cbLocal->addItem(szPath);
71+
ui->cbLocal->setCurrentText(szPath);
72+
QModelIndex idx = m_pModelLocalFile->setRootPath(szPath);
73+
ui->tabLocal->setRootIndex(idx);
74+
}
75+
76+
void CFrmFileTransfer::on_cbLocal_editTextChanged(const QString &text)
77+
{
78+
qDebug(log) << Q_FUNC_INFO << text;
79+
auto idx = m_pModelLocalDir->index(text);
80+
if(!idx.isValid()) return;
81+
if(text.length() > 1 && (text.right(1) == '/' || text.right(1) == '\\')) return;
82+
ui->treeLocal->setCurrentIndex(idx);
83+
slotTreeLocalClicked(idx);
84+
}
85+
86+
void CFrmFileTransfer::on_treeLocal_customContextMenuRequested(const QPoint &pos)
87+
{
88+
qDebug(log) << Q_FUNC_INFO;
89+
QMenu menu;
90+
menu.addAction(QIcon::fromTheme("folder-open"), tr("Open"),
91+
this, SLOT(slotTreeLocalOpen()));
92+
menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
93+
this, SLOT(slotTreeLocalNew()));
94+
menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
95+
this, SLOT(slotTreeLocalDelete()));
96+
menu.addAction(tr("Rename"),
97+
this, SLOT(slotTreeLocalRename()));
98+
menu.exec(ui->treeLocal->viewport()->mapToGlobal(pos));
99+
}
100+
101+
void CFrmFileTransfer::slotTreeLocalOpen()
102+
{
103+
auto idx = ui->treeLocal->currentIndex();
104+
auto szPath = m_pModelLocalDir->filePath(idx);
105+
QDesktopServices::openUrl(QUrl(szPath));
106+
}
107+
108+
void CFrmFileTransfer::slotTreeLocalNew()
109+
{
110+
QString szName = QInputDialog::getText(this, tr("New folder"), tr("Folder name:"));
111+
if(szName.isEmpty()) return;
112+
auto idx = ui->treeLocal->currentIndex();
113+
m_pModelLocalDir->mkdir(idx, szName);
114+
}
115+
116+
void CFrmFileTransfer::slotTreeLocalDelete()
117+
{
118+
auto idx = ui->treeLocal->currentIndex();
119+
m_pModelLocalDir->remove(idx);
120+
}
121+
122+
void CFrmFileTransfer::slotTreeLocalRename()
123+
{
124+
ui->treeLocal->edit(ui->treeLocal->currentIndex());
125+
}
126+
127+
void CFrmFileTransfer::slotTreeLocalUpload()
128+
{
129+
// TODO: implemented
130+
}
131+
132+
void CFrmFileTransfer::slotTreeLocalAddToList()
133+
{
134+
// TODO: implemented
135+
}
136+
137+
void CFrmFileTransfer::on_tabLocal_customContextMenuRequested(const QPoint &pos)
138+
{
139+
qDebug(log) << Q_FUNC_INFO;
140+
QMenu menu;
141+
menu.addAction(QIcon::fromTheme("file-open"), tr("Open"),
142+
this, SLOT(slotTabLocalOpen()));
143+
menu.addAction(QIcon::fromTheme("file-edit"), tr("Edit"),
144+
this, SLOT(slotTabLocalEdit()));
145+
menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
146+
this, SLOT(slotTabLocalDelete()));
147+
menu.addAction(tr("Rename"),
148+
this, SLOT(slotTabLocalRename()));
149+
menu.exec(ui->tabLocal->viewport()->mapToGlobal(pos));
150+
}
151+
152+
void CFrmFileTransfer::slotTabLocalOpen()
153+
{
154+
auto idx = ui->tabLocal->currentIndex();
155+
auto szPath = m_pModelLocalFile->filePath(idx);
156+
QDesktopServices::openUrl(QUrl(szPath));
157+
}
158+
159+
void CFrmFileTransfer::slotTabLocalEdit()
160+
{
161+
// TODO: implemented
162+
qDebug(log) << Q_FUNC_INFO << "Not implemented";
163+
}
164+
165+
void CFrmFileTransfer::slotTabLocalDelete()
166+
{
167+
auto idx = ui->tabLocal->currentIndex();
168+
m_pModelLocalDir->remove(idx);
169+
}
170+
171+
void CFrmFileTransfer::slotTabLocalRename()
172+
{
173+
ui->tabLocal->edit(ui->tabLocal->currentIndex());
174+
}

Plugins/FileTransfer/FrmFileTransfer.h

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#pragma once
44

55
#include <QWidget>
6+
#include <QFileSystemModel>
67

78
namespace Ui {
89
class CFrmFileTransfer;
@@ -14,8 +15,37 @@ class CFrmFileTransfer : public QWidget
1415

1516
public:
1617
explicit CFrmFileTransfer(QWidget *parent = nullptr);
17-
~CFrmFileTransfer();
18+
virtual ~CFrmFileTransfer();
19+
20+
Q_SIGNALS:
21+
void sigUpload(const QString& source, const QString& destination);
1822

23+
private:
24+
//! Set local root path
25+
int SetLocalRoot(const QString &root);
26+
//! Get local root path
27+
[[nodiscard]] QString GetLocalRoot() const;
28+
29+
private Q_SLOTS:
30+
void on_cbLocal_editTextChanged(const QString &arg1);
31+
32+
void slotTreeLocalClicked(const QModelIndex &index);
33+
void on_treeLocal_customContextMenuRequested(const QPoint &pos);
34+
void slotTreeLocalUpload();
35+
void slotTreeLocalAddToList();
36+
void slotTreeLocalOpen();
37+
void slotTreeLocalNew();
38+
void slotTreeLocalRename();
39+
void slotTreeLocalDelete();
40+
41+
void on_tabLocal_customContextMenuRequested(const QPoint &pos);
42+
void slotTabLocalOpen();
43+
void slotTabLocalEdit();
44+
void slotTabLocalRename();
45+
void slotTabLocalDelete();
46+
1947
private:
2048
Ui::CFrmFileTransfer *ui;
49+
QFileSystemModel* m_pModelLocalDir;
50+
QFileSystemModel* m_pModelLocalFile;
2151
};

Plugins/FileTransfer/FrmFileTransfer.ui

Lines changed: 140 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,151 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>400</width>
10-
<height>300</height>
9+
<width>491</width>
10+
<height>295</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
1414
<string>Form</string>
1515
</property>
16+
<layout class="QGridLayout" name="gridLayout">
17+
<item row="0" column="0">
18+
<layout class="QVBoxLayout" name="verticalLayout_2">
19+
<item>
20+
<layout class="QHBoxLayout" name="horizontalLayout">
21+
<item>
22+
<widget class="QLabel" name="label">
23+
<property name="text">
24+
<string>Local:</string>
25+
</property>
26+
</widget>
27+
</item>
28+
<item>
29+
<widget class="QComboBox" name="cbLocal">
30+
<property name="sizePolicy">
31+
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
32+
<horstretch>0</horstretch>
33+
<verstretch>0</verstretch>
34+
</sizepolicy>
35+
</property>
36+
<property name="editable">
37+
<bool>true</bool>
38+
</property>
39+
</widget>
40+
</item>
41+
</layout>
42+
</item>
43+
<item>
44+
<widget class="QTreeView" name="treeLocal">
45+
<property name="sizePolicy">
46+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
47+
<horstretch>0</horstretch>
48+
<verstretch>0</verstretch>
49+
</sizepolicy>
50+
</property>
51+
</widget>
52+
</item>
53+
<item>
54+
<widget class="QTableView" name="tabLocal"/>
55+
</item>
56+
</layout>
57+
</item>
58+
<item row="0" column="1">
59+
<layout class="QVBoxLayout" name="verticalLayout">
60+
<item>
61+
<layout class="QHBoxLayout" name="horizontalLayout_2">
62+
<item>
63+
<widget class="QLabel" name="label_2">
64+
<property name="text">
65+
<string>Remote:</string>
66+
</property>
67+
</widget>
68+
</item>
69+
<item>
70+
<widget class="QComboBox" name="cbRemote">
71+
<property name="sizePolicy">
72+
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
73+
<horstretch>0</horstretch>
74+
<verstretch>0</verstretch>
75+
</sizepolicy>
76+
</property>
77+
<property name="editable">
78+
<bool>true</bool>
79+
</property>
80+
</widget>
81+
</item>
82+
</layout>
83+
</item>
84+
<item>
85+
<widget class="QTreeView" name="tvRemote"/>
86+
</item>
87+
<item>
88+
<widget class="QTableWidget" name="tabRemote"/>
89+
</item>
90+
</layout>
91+
</item>
92+
<item row="1" column="0" colspan="2">
93+
<widget class="QTabWidget" name="tabWidget">
94+
<property name="tabPosition">
95+
<enum>QTabWidget::TabPosition::South</enum>
96+
</property>
97+
<property name="currentIndex">
98+
<number>2</number>
99+
</property>
100+
<widget class="QWidget" name="List">
101+
<attribute name="icon">
102+
<iconset theme="QIcon::ThemeIcon::DialogInformation"/>
103+
</attribute>
104+
<attribute name="title">
105+
<string>List</string>
106+
</attribute>
107+
<widget class="QTableView" name="tabList">
108+
<property name="geometry">
109+
<rect>
110+
<x>90</x>
111+
<y>10</y>
112+
<width>256</width>
113+
<height>192</height>
114+
</rect>
115+
</property>
116+
</widget>
117+
</widget>
118+
<widget class="QWidget" name="Fail">
119+
<attribute name="icon">
120+
<iconset theme="QIcon::ThemeIcon::DialogError"/>
121+
</attribute>
122+
<attribute name="title">
123+
<string>Fail</string>
124+
</attribute>
125+
<widget class="QTableView" name="tabFail">
126+
<property name="geometry">
127+
<rect>
128+
<x>110</x>
129+
<y>10</y>
130+
<width>256</width>
131+
<height>192</height>
132+
</rect>
133+
</property>
134+
</widget>
135+
</widget>
136+
<widget class="QWidget" name="Success">
137+
<attribute name="title">
138+
<string>Success</string>
139+
</attribute>
140+
<widget class="QTableView" name="tabSuccess">
141+
<property name="geometry">
142+
<rect>
143+
<x>220</x>
144+
<y>10</y>
145+
<width>256</width>
146+
<height>192</height>
147+
</rect>
148+
</property>
149+
</widget>
150+
</widget>
151+
</widget>
152+
</item>
153+
</layout>
16154
</widget>
17155
<resources/>
18156
<connections/>

Plugins/FileTransfer/PluginFileTransfer.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
22
// Author Kang Lin <kl222@126.com>
33

4+
#include <QApplication>
5+
#include <QStyle>
46
#include <QLoggingCategory>
57
#include "PluginFileTransfer.h"
68
#include "OperateFileTransfer.h"
@@ -51,6 +53,7 @@ const QString CPluginFileTransfer::Version() const
5153
const QIcon CPluginFileTransfer::Icon() const
5254
{
5355
return QIcon::fromTheme("system-file-manager");
56+
//return QApplication::style()->standardIcon(QStyle::SP_FileIcon);
5457
}
5558

5659
COperate *CPluginFileTransfer::OnCreateOperate(const QString &szId)

0 commit comments

Comments
 (0)