玉兔远程控制 0.1.0-bate1
载入中...
搜索中...
未找到
FrmFileTransfer.cpp
1// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2// Author Kang Lin <kl222@126.com>
3
4#include <QInputDialog>
5#include <QMenu>
6#include <QUrl>
7#include <QClipboard>
8#include <QMimeData>
9#include <QApplication>
10#include <QDesktopServices>
11#include <QLoggingCategory>
12#include "FrmFileTransfer.h"
13#include "ui_FrmFileTransfer.h"
14
15static Q_LOGGING_CATEGORY(log, "FileTransfer.Widget")
16CFrmFileTransfer::CFrmFileTransfer(QWidget *parent)
17 : QWidget(parent)
18 , ui(new Ui::CFrmFileTransfer)
19 , m_pModelLocalDir(nullptr)
20 , m_pModelLocalFile(nullptr)
21 , m_pModelRemoteDir(nullptr)
22 , m_pModelRemoteFile(nullptr)
23 , m_pListFileModel(nullptr)
24{
25 bool check = false;
26 ui->setupUi(this);
27
28 m_pModelLocalDir = new QFileSystemModel(ui->treeLocal);
29 m_pModelLocalDir->setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
30 m_pModelLocalDir->setReadOnly(false);
31 ui->treeLocal->setEditTriggers(QAbstractItemView::NoEditTriggers);
32 ui->treeLocal->setModel(m_pModelLocalDir);
33 ui->treeLocal->setContextMenuPolicy(Qt::CustomContextMenu);
34 ui->treeLocal->setSelectionBehavior(QAbstractItemView::SelectRows);
35 check = connect(ui->treeLocal, &QTreeView::clicked,
36 this, &CFrmFileTransfer::slotTreeLocalClicked);
37 Q_ASSERT(check);
38 SetLocalRoot(QString());
39 ui->treeLocal->setHeaderHidden(true);
40 ui->treeLocal->header()->hide();
41 // 注意:必须在 setModel 之后才会生效
42 ui->treeLocal->header()->hideSection(1);
43 ui->treeLocal->header()->hideSection(2);
44 ui->treeLocal->header()->hideSection(3);
45
46 m_pModelLocalFile = new QFileSystemModel(ui->tabLocal);
47 m_pModelLocalFile->setFilter(QDir::Files);
48 m_pModelLocalFile->setReadOnly(false);
49 ui->tabLocal->setEditTriggers(QAbstractItemView::NoEditTriggers);
50 ui->tabLocal->setModel(m_pModelLocalFile);
51 ui->tabLocal->setContextMenuPolicy(Qt::CustomContextMenu);
52 ui->tabLocal->setShowGrid(false);
53 ui->tabLocal->setSelectionBehavior(QAbstractItemView::SelectRows);
54 ui->tabLocal->verticalHeader()->hide();
55 ui->tabLocal->horizontalHeader()->setSectionResizeMode(
56 QHeaderView::ResizeToContents);
57
58 m_pModelRemoteDir = new CRemoteFileSystemModel(ui->treeRemote, CRemoteFileSystem::TYPE::DIRS);
59 SetRemoteConnecter(m_pModelRemoteDir);
60 ui->treeRemote->setModel(m_pModelRemoteDir);
61 QModelIndex index = m_pModelRemoteDir->SetRootPath("/");
62 ui->treeRemote->setRootIndex(index);
63 ui->treeRemote->setContextMenuPolicy(Qt::CustomContextMenu);
64 ui->treeRemote->setEditTriggers(QAbstractItemView::NoEditTriggers);
65 ui->treeRemote->setSelectionBehavior(QAbstractItemView::SelectRows);
66 ui->treeRemote->header()->hide();
67 ui->treeRemote->header()->hideSection((int)CRemoteFileSystem::ColumnValue::Type);
68 ui->treeRemote->header()->hideSection((int)CRemoteFileSystem::ColumnValue::Size);
69 ui->treeRemote->header()->hideSection((int)CRemoteFileSystem::ColumnValue::LastModified);
70 ui->treeRemote->header()->hideSection((int)CRemoteFileSystem::ColumnValue::Permission);
71 ui->treeRemote->header()->hideSection((int)CRemoteFileSystem::ColumnValue::Owner);
72
73 m_pModelRemoteFile = new CRemoteFileSystemModel(ui->tabRemote, CRemoteFileSystem::TYPE::FILE);
74 SetRemoteConnecter(m_pModelRemoteFile);
75 ui->tabRemote->setModel(m_pModelRemoteFile);
76 ui->tabRemote->setContextMenuPolicy(Qt::CustomContextMenu);
77 ui->tabRemote->setEditTriggers(QAbstractItemView::NoEditTriggers);
78 ui->tabRemote->setSelectionBehavior(QAbstractItemView::SelectRows);
79 ui->tabRemote->verticalHeader()->hide();
80 // ui->tabRemote->horizontalHeader()->setSectionResizeMode(
81 // QHeaderView::ResizeToContents);
82
83 m_pListFileModel = new CListFileModel(ui->tabList);
84 ui->tabList->setModel(m_pListFileModel);
85 ui->tabList->verticalHeader()->hide();
86 ui->tabList->setSelectionBehavior(QAbstractItemView::SelectRows);
87 ui->tabList->setContextMenuPolicy(Qt::CustomContextMenu);
88 ui->tabList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
89 ui->tabList->setColumnHidden((int)CFileTransfer::ColumnValue::Explanation, true);
90 ui->tabList->setColumnHidden((int)CFileTransfer::ColumnValue::Time, true);
91 ui->tabFail->setModel(m_pListFileModel);
92 ui->tabFail->verticalHeader()->hide();
93 ui->tabFail->setSelectionBehavior(QAbstractItemView::SelectRows);
94 ui->tabFail->setContextMenuPolicy(Qt::CustomContextMenu);
95 ui->tabFail->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
96 ui->tabFail->setColumnHidden((int)CFileTransfer::ColumnValue::State, true);
97 ui->tabFail->setColumnHidden((int)CFileTransfer::ColumnValue::Speed, true);
98 ui->tabSuccess->setModel(m_pListFileModel);
99 ui->tabSuccess->verticalHeader()->hide();
100 ui->tabSuccess->setSelectionBehavior(QAbstractItemView::SelectRows);
101 ui->tabSuccess->setContextMenuPolicy(Qt::CustomContextMenu);
102 ui->tabSuccess->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
103 ui->tabSuccess->setColumnHidden((int)CFileTransfer::ColumnValue::State, true);
104 ui->tabSuccess->setColumnHidden((int)CFileTransfer::ColumnValue::Speed, true);
105 ui->tabSuccess->setColumnHidden((int)CFileTransfer::ColumnValue::Explanation, true);
106}
107
108CFrmFileTransfer::~CFrmFileTransfer()
109{
110 qDebug(log) << Q_FUNC_INFO;
111 delete ui;
112}
113
114void CFrmFileTransfer::SetRemoteConnecter(CRemoteFileSystemModel *p)
115{
116 bool check = connect(p, SIGNAL(sigGetDir(CRemoteFileSystem*)),
117 this, SIGNAL(sigGetDir(CRemoteFileSystem*)));
118 Q_ASSERT(check);
119 check = connect(this, SIGNAL(sigGetDir(CRemoteFileSystem*, QVector<QSharedPointer<CRemoteFileSystem> > , bool)),
120 p, SLOT(slotGetDir(CRemoteFileSystem*, QVector<QSharedPointer<CRemoteFileSystem> > , bool)));
121 Q_ASSERT(check);
122 check = connect(p, SIGNAL(sigRemoveDir(const QString&)),
123 this, SIGNAL(sigRemoveDir(const QString&)));
124 Q_ASSERT(check);
125 check = connect(p, SIGNAL(sigRemoveFile(const QString&)),
126 this, SIGNAL(sigRemoveFile(const QString&)));
127 Q_ASSERT(check);
128 check = connect(p, SIGNAL(sigRename(const QString&, const QString&)),
129 this, SIGNAL(sigRename(const QString&, const QString&)));
130 Q_ASSERT(check);
131 check = connect(p, SIGNAL(sigMakeDir(const QString&)),
132 this, SIGNAL(sigMakeDir(const QString&)));
133 Q_ASSERT(check);
134}
135
136int CFrmFileTransfer::SetLocalRoot(const QString &root)
137{
138 auto index = m_pModelLocalDir->setRootPath(root);
139 ui->treeLocal->setRootIndex(index);
140 slotTreeLocalClicked(index);
141 return 0;
142}
143
145{
146 return m_pModelLocalDir->rootPath();
147}
148
149void CFrmFileTransfer::slotTreeLocalClicked(const QModelIndex &index)
150{
151 QString szPath = m_pModelLocalDir->filePath(index);
152 if(szPath.isEmpty()) return;
153 if(-1 == ui->cbLocal->findText(szPath))
154 ui->cbLocal->addItem(szPath);
155 ui->cbLocal->setCurrentText(szPath);
156 QModelIndex idx = m_pModelLocalFile->setRootPath(szPath);
157 ui->tabLocal->setRootIndex(idx);
158}
159
160void CFrmFileTransfer::on_cbLocal_editTextChanged(const QString &szPath)
161{
162 qDebug(log) << Q_FUNC_INFO << szPath;
163 auto idx = m_pModelLocalDir->index(szPath);
164 if(!idx.isValid()) return;
165 if(szPath.length() > 1 && (szPath.right(1) == '/' || szPath.right(1) == '\\')) return;
166 ui->treeLocal->setCurrentIndex(idx);
167 slotTreeLocalClicked(idx);
168}
169
170void CFrmFileTransfer::on_treeLocal_customContextMenuRequested(const QPoint &pos)
171{
172 qDebug(log) << Q_FUNC_INFO;
173 auto idx = ui->treeLocal->currentIndex();
174 QMenu menu;
175 if(idx.isValid()) {
176 menu.addAction(QIcon::fromTheme("go-up"), tr("Upload"),
177 this, SLOT(slotTreeLocalUpload()));
178 menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
179 this, SLOT(slotTreeLocalAddToList()));
180 menu.addAction(QIcon::fromTheme("folder-open"), tr("Open"),
181 this, SLOT(slotTreeLocalOpen()));
182 }
183 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
184 this, SLOT(slotTreeLocalNew()));
185 if(idx.isValid()) {
186 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
187 this, SLOT(slotTreeLocalDelete()));
188 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
189 this, SLOT(slotTreeLocalRename()));
190 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy path to clipboard"),
191 this, SLOT(slotTreeLocalCopyToClipboard()));
192 }
193 menu.exec(ui->treeLocal->viewport()->mapToGlobal(pos));
194}
195
196void CFrmFileTransfer::slotTreeLocalOpen()
197{
198 auto idx = ui->treeLocal->currentIndex();
199 auto szPath = m_pModelLocalDir->filePath(idx);
200 QDesktopServices::openUrl(QUrl(szPath));
201}
202
203void CFrmFileTransfer::slotTreeLocalNew()
204{
205 QString szName = QInputDialog::getText(
206 this, tr("New folder"), tr("Folder name:"));
207 if(szName.isEmpty()) return;
208 auto idx = ui->treeLocal->currentIndex();
209 m_pModelLocalDir->mkdir(idx, szName);
210}
211
212void CFrmFileTransfer::slotTreeLocalDelete()
213{
214 auto idx = ui->treeLocal->currentIndex();
215 m_pModelLocalDir->remove(idx);
216}
217
218void CFrmFileTransfer::slotTreeLocalRename()
219{
220 ui->treeLocal->edit(ui->treeLocal->currentIndex());
221}
222
223void CFrmFileTransfer::slotTreeLocalUpload()
224{
225 // TODO: implemented
226}
227
228int CFrmFileTransfer::EnumLocalDirectory(QDir d, const QString& szRemote)
229{
230 int nRet = 0;
231 foreach (auto f, d.entryList(QDir::Files | QDir::NoDotAndDotDot)) {
232 QString szLocal = d.absoluteFilePath(f);
233 if(szLocal.isEmpty()) {
234 qDebug(log) << "The select is empty";
235 continue;
236 }
237 QFileInfo fi(szLocal);
238 if(!fi.exists()) {
239 QMessageBox::critical(this, tr("Error"), tr("The file is not exists:") + szLocal);
240 continue;
241 }
242 QString szRemoteFile = szRemote;
243 if(szRemote.right(1) == "/")
244 szRemoteFile += fi.fileName();
245 else
246 szRemoteFile += "/" + fi.fileName();
247 QSharedPointer<CFileTransfer> fileTransfer(new CFileTransfer(
248 szLocal, szRemoteFile,
249 CFileTransfer::Direction::Upload));
250 fileTransfer->SetFileSize(fi.size());
251 m_pListFileModel->AddFileTransfer(fileTransfer);
252 }
253 foreach(auto file, d.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
254 {
255 QDir dir(d.absoluteFilePath(file));
256 nRet = EnumLocalDirectory(dir, szRemote + "/" + file);
257 }
258 return nRet;
259}
260
261void CFrmFileTransfer::slotTreeLocalAddToList()
262{
263 QString szRemote = ui->cbRemote->currentText();
264 if(szRemote.isEmpty()) {
265 QMessageBox::critical(this, tr("Error"), tr("Please select remote directory"));
266 return;
267 }
268 auto idx = ui->treeLocal->currentIndex();
269 if(!idx.isValid()) return;
270 QString szPath = m_pModelLocalDir->filePath(idx);
271 if(!m_pModelLocalDir->isDir(idx) || szPath.isEmpty()) return;
272 QFileInfo fi(szPath);
273 EnumLocalDirectory(QDir(szPath), szRemote + "/" + fi.fileName());
274}
275
276void CFrmFileTransfer::slotTreeLocalCopyToClipboard()
277{
278 auto idx = ui->treeLocal->currentIndex();
279 QString szPath = m_pModelLocalDir->filePath(idx);
280 if(szPath.isEmpty()) return;
281 QClipboard* pClipboard = QApplication::clipboard();
282 pClipboard->setText(szPath);
283}
284
285void CFrmFileTransfer::on_tabLocal_customContextMenuRequested(const QPoint &pos)
286{
287 qDebug(log) << Q_FUNC_INFO;
288 auto idx = ui->tabLocal->currentIndex();
289 QMenu menu;
290 if(idx.isValid()) {
291 menu.addAction(QIcon::fromTheme("go-up"), tr("Upload"),
292 this, SLOT(slotTabLocalUpload()));
293 menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
294 this, SLOT(slotTabLocalAddToList()));
295 menu.addAction(QIcon::fromTheme("file-open"), tr("Open"),
296 this, SLOT(slotTabLocalOpen()));
297 menu.addAction(QIcon::fromTheme("file-edit"), tr("Edit"),
298 this, SLOT(slotTabLocalEdit()));
299 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
300 this, SLOT(slotTabLocalDelete()));
301 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
302 this, SLOT(slotTabLocalRename()));
303 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy path to clipboard"),
304 this, SLOT(slotTabLocalCopyToClipboard()));
305 }
306 menu.exec(ui->tabLocal->viewport()->mapToGlobal(pos));
307}
308
309void CFrmFileTransfer::slotTabLocalCopyToClipboard()
310{
311 auto idx = ui->tabLocal->currentIndex();
312 if(!idx.isValid()) return;
313 QString szPath = m_pModelLocalDir->filePath(idx);
314 if(szPath.isEmpty()) return;
315 QClipboard* pClipboard = QApplication::clipboard();
316 pClipboard->setText(szPath);
317}
318
319void CFrmFileTransfer::slotTabLocalUpload()
320{
321 auto idx = ui->tabLocal->currentIndex();
322 if(!idx.isValid()) return;
323 QString szPath = m_pModelLocalDir->filePath(idx);
324 if(szPath.isEmpty()) return;
325}
326
327void CFrmFileTransfer::slotTabLocalAddToList()
328{
329 QString szRemote = ui->cbRemote->currentText();
330 if(szRemote.isEmpty()) {
331 QMessageBox::critical(this, tr("Error"), tr("Please select remote directory"));
332 return;
333 }
334 auto indexes = ui->tabLocal->selectionModel()->selectedRows();
335 foreach(auto idx, indexes) {
336 QString szLocal = m_pModelLocalFile->filePath(idx);
337 if(szLocal.isEmpty()) {
338 qDebug(log) << "The select is empty:" << idx;
339 continue;
340 }
341 QFileInfo fi(szLocal);
342 if(!fi.exists()) {
343 QMessageBox::critical(this, tr("Error"), tr("The file is not exists:") + szLocal);
344 continue;
345 }
346 QString szRemoteFile = szRemote;
347 if(szRemote.right(1) == "/")
348 szRemoteFile += fi.fileName();
349 else
350 szRemoteFile += "/" + fi.fileName();
351 QSharedPointer<CFileTransfer> f(new CFileTransfer(szLocal, szRemoteFile,
352 CFileTransfer::Direction::Upload));
353 f->SetFileSize(fi.size());
354 f->SetLocalPermission(m_pModelLocalFile->permissions(idx));
355 m_pListFileModel->AddFileTransfer(f);
356 }
357}
358
359void CFrmFileTransfer::slotTabLocalOpen()
360{
361 auto idx = ui->tabLocal->currentIndex();
362 if(!idx.isValid()) return;
363 auto szPath = m_pModelLocalFile->filePath(idx);
364 QDesktopServices::openUrl(QUrl(szPath));
365}
366
367void CFrmFileTransfer::slotTabLocalEdit()
368{
369 // TODO: implemented
370 qDebug(log) << Q_FUNC_INFO << "Not implemented";
371}
372
373void CFrmFileTransfer::slotTabLocalDelete()
374{
375 auto idx = ui->tabLocal->currentIndex();
376 if(idx.isValid())
377 m_pModelLocalDir->remove(idx);
378}
379
380void CFrmFileTransfer::slotTabLocalRename()
381{
382 auto idx = ui->tabLocal->currentIndex();
383 if(idx.isValid())
384 ui->tabLocal->edit(idx);
385}
386
387void CFrmFileTransfer::on_cbRemote_editTextChanged(const QString &szPath)
388{
389 qDebug(log) << Q_FUNC_INFO << szPath;
390 if(szPath.isEmpty()) return;
391 if(!m_pModelRemoteDir) return;
392 QModelIndex index = m_pModelRemoteDir->index(szPath);
393 if(index.isValid()) {
394 on_treeRemote_clicked(index);
395 return;
396 }
397
398 auto idx = m_pModelRemoteDir->SetRootPath(szPath);
399 ui->treeRemote->setRootIndex(idx);
400}
401
402// void CFrmFileTransfer::on_cbRemote_currentTextChanged(const QString &szPath)
403// {
404// qDebug(log) << Q_FUNC_INFO << szPath;
405// if(szPath.length() > 1 && (szPath.right(1) == '/' || szPath.right(1) == '\\')) return;
406// if(m_pModelRemoteFile) {
407// auto idx = m_pModelRemoteFile->SetRootPath(szPath);
408// ui->tabRemote->setRootIndex(idx);
409// }
410// }
411
412void CFrmFileTransfer::on_cbRemote_currentIndexChanged(int index)
413{
414 QModelIndex idx = ui->cbRemote->itemData(index).value<QModelIndex>();
415 if(idx.isValid()) {
416 ui->treeRemote->setCurrentIndex(idx);
417 on_treeRemote_clicked(idx);
418 return;
419 }
420 QString szPath = ui->cbRemote->itemText(index);
421 on_cbRemote_editTextChanged(szPath);
422}
423
424void CFrmFileTransfer::on_treeRemote_clicked(const QModelIndex &index)
425{
426 CRemoteFileSystem* pRemoteFileSystem = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(index);
427 if(!pRemoteFileSystem) return;
428 QString szPath = pRemoteFileSystem->GetPath();
429 if(szPath.isEmpty()) return;
430 qDebug(log) << Q_FUNC_INFO << szPath;
431 if(m_pModelRemoteFile) {
432 auto idx = m_pModelRemoteFile->SetRootPath(pRemoteFileSystem->GetPath());
433 ui->tabRemote->setRootIndex(idx);
434 }
435 if(-1 == ui->cbRemote->findText(szPath)) {
436 ui->cbRemote->addItem(szPath, index);
437 }
438 ui->cbRemote->setCurrentText(szPath);
439}
440
441void CFrmFileTransfer::on_treeRemote_doubleClicked(const QModelIndex &index)
442{
443 qDebug(log) << Q_FUNC_INFO << index;
444 if(index.isValid())
445 ui->treeRemote->expand(index);
446}
447
448void CFrmFileTransfer::on_treeRemote_customContextMenuRequested(const QPoint &pos)
449{
450 qDebug(log) << Q_FUNC_INFO;
451 auto idx = ui->treeRemote->currentIndex();
452 QMenu menu;
453 // if(idx.isValid()) {
454 // menu.addAction(QIcon::fromTheme("emblem-downloads"), tr("Download"),
455 // this, SLOT(slotTreeRemoteDownload()));
456 // menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
457 // this, SLOT(slotTreeRemoteAddToList()));
458 // }
459 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
460 this, SLOT(slotTreeRemoteNew()));
461 if(idx.isValid()) {
462 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
463 this, SLOT(slotTreeRemoteDelete()));
464 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
465 this, SLOT(slotTreeRemoteRename()));
466 menu.addAction(QIcon::fromTheme("view-refresh"), tr("Refresh"),
467 this, SLOT(slotTreeRemoteRefresh()));
468 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy url to clipboard"),
469 this, SLOT(slotTreeRemoteCopyToClipboard()));
470 }
471 menu.exec(ui->treeRemote->viewport()->mapToGlobal(pos));
472}
473
474void CFrmFileTransfer::slotTreeRemoteDownload()
475{
476}
477
478int CFrmFileTransfer::EnumRemoteDirectory(CRemoteFileSystem *p, const QString &szLocal)
479{
480 int nRet = 0;
481
482 return nRet;
483}
484
485void CFrmFileTransfer::slotTreeRemoteAddToList()
486{
487 QString szLocal = ui->cbLocal->currentText();
488 if(szLocal.isEmpty()) {
489 QMessageBox::critical(this, tr("Error"), tr("Please select local directory"));
490 return;
491 }
492 auto idx = ui->treeRemote->currentIndex();
493 if(!idx.isValid()) return;
494 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
495 if(p && !(p->GetType() & CRemoteFileSystem::TYPE::FILE))
496 EnumRemoteDirectory(p, szLocal);
497}
498
499void CFrmFileTransfer::slotTreeRemoteNew()
500{
501 QString szName = QInputDialog::getText(
502 this, tr("New folder"), tr("Folder name:"));
503 if(szName.isEmpty()) return;
504 auto idx = ui->treeRemote->currentIndex();
505 if(idx.isValid())
506 m_pModelRemoteDir->CreateDir(idx, szName);
507}
508
509void CFrmFileTransfer::slotTreeRemoteDelete()
510{
511 auto idx = ui->treeRemote->currentIndex();
512 if(idx.isValid())
513 m_pModelRemoteDir->RemoveDir(idx);
514}
515
516void CFrmFileTransfer::slotTreeRemoteRefresh()
517{
518 auto idx = ui->treeRemote->currentIndex();
519 if(idx.isValid()) {
520 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
521 if(p && !p->GetPath().isEmpty()) {
522 p->SetState(CRemoteFileSystem::State::No);
523 m_pModelRemoteDir->fetchMore(idx);
524 }
525 }
526}
527
528void CFrmFileTransfer::slotTreeRemoteRename()
529{
530 auto idx = ui->treeRemote->currentIndex();
531 if(!idx.isValid()) return;
532 ui->treeRemote->edit(idx);
533}
534
535void CFrmFileTransfer::slotTreeRemoteCopyToClipboard()
536{
537 auto idx = ui->treeRemote->currentIndex();
538 if(idx.isValid()) {
539 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
540 if(p) {
541 QString szPath = p->GetPath();
542 emit sigCopyUrlToClipboard(szPath);
543 }
544 }
545}
546
547void CFrmFileTransfer::on_tabRemote_customContextMenuRequested(const QPoint &pos)
548{
549 qDebug(log) << Q_FUNC_INFO;
550 auto idx = ui->tabRemote->currentIndex();
551 QMenu menu;
552 if(idx.isValid()) {
553 menu.addAction(QIcon::fromTheme("emblem-downloads"), tr("Download"),
554 this, SLOT(slotTabRemoteDownload()));
555 menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
556 this, SLOT(slotTabRemoteAddToList()));
557 }
558 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
559 this, SLOT(slotTabRemoteNew()));
560 if(idx.isValid()) {
561 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
562 this, SLOT(slotTabRemoteDelete()));
563 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
564 this, SLOT(slotTabRemoteRename()));
565 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy url to clipboard"),
566 this, SLOT(slotTabRemoteCopyToClipboard()));
567 }
568 menu.exec(ui->tabRemote->viewport()->mapToGlobal(pos));
569}
570
571void CFrmFileTransfer::slotTabRemoteDownload()
572{
573}
574
575void CFrmFileTransfer::slotTabRemoteAddToList()
576{
577 QString szLocal = ui->cbLocal->currentText();
578 if(szLocal.isEmpty()) {
579 QMessageBox::critical(this, tr("Error"), tr("Please select local directory"));
580 return;
581 }
582 auto indexes = ui->tabRemote->selectionModel()->selectedRows();
583 foreach(auto idx, indexes) {
584 auto p = m_pModelRemoteFile->GetRemoteFileSystemFromIndex(idx);
585 QString szRemote = p->GetPath();
586 if(szRemote.isEmpty()) {
587 qDebug(log) << "The select is empty:" << idx;
588 continue;
589 }
590 QString szLocalFile = szLocal;
591 if(szLocalFile.right(1) == "/" || szLocalFile.right(1) == "\\")
592 szLocalFile += p->GetName();
593 else
594 szLocalFile += QDir::separator() + p->GetName();
595 QSharedPointer<CFileTransfer> f(
596 new CFileTransfer(szLocalFile,
597 szRemote, CFileTransfer::Direction::Download));
598 f->SetFileSize(p->GetSize());
599 f->SetRemotePermission(p->GetPermissions());
600 m_pListFileModel->AddFileTransfer(f);
601 }
602}
603
604void CFrmFileTransfer::slotTabRemoteNew()
605{
606}
607
608void CFrmFileTransfer::slotTabRemoteDelete()
609{
610}
611
612void CFrmFileTransfer::slotTabRemoteRename()
613{}
614
615void CFrmFileTransfer::slotTabRemoteCopyToClipboard()
616{
617 auto idx = ui->tabRemote->currentIndex();
618 if(idx.isValid()) {
619 auto p = m_pModelRemoteFile->GetRemoteFileSystemFromIndex(idx);
620 if(p) {
621 QString szPath = p->GetPath();
622 emit sigCopyUrlToClipboard(szPath);
623 }
624 }
625}
626
627void CFrmFileTransfer::on_tabList_customContextMenuRequested(const QPoint &pos)
628{
629 qDebug(log) << Q_FUNC_INFO;
630 auto idx = ui->tabList->currentIndex();
631 QMenu menu;
632 if(idx.isValid()) {
633 auto f = m_pListFileModel->GetFileTransfer(idx);
634 if(f) {
635 if(((int)f->GetState() & (int)CFileTransfer::State::Process))
636 menu.addAction(QIcon::fromTheme("media-playback-stop"),
637 tr("Stop"), this, SLOT(slotProcessFileTransfer()));
638 else if(f->GetState() != CFileTransfer::State::Finish)
639 menu.addAction(QIcon::fromTheme("media-playback-start"),
640 tr("Start"), this, SLOT(slotProcessFileTransfer()));
641 }
642 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
643 this, SLOT(slotTabListDelete()));
644 }
645 menu.exec(ui->tabList->viewport()->mapToGlobal(pos));
646}
647
648void CFrmFileTransfer::slotTabListDelete()
649{
650 auto indexes = ui->tabList->selectionModel()->selectedRows();
651 // 倒序排序
652 std::sort(indexes.begin(), indexes.end(),
653 [](const QModelIndex &a, const QModelIndex &b) {
654 return a.row() > b.row();
655 });
656 foreach(const QModelIndex &idx, indexes) {
657 auto f = m_pListFileModel->GetFileTransfer(idx);
658 if(f) {
659 if((int)f->GetState() & (int)CFileTransfer::State::Process) {
660 QMessageBox::critical(this, tr("Error"), tr("Please stop the file transfer first"));
661 return;
662 }
663 }
664 m_pListFileModel->removeRow(idx.row(), idx.parent());
665 }
666 return;
667}
668
669void CFrmFileTransfer::slotProcessFileTransfer()
670{
671 auto idx = ui->tabList->currentIndex();
672 if(!idx.isValid()) return;
673 auto f = m_pListFileModel->GetFileTransfer(idx);
674 if(!f) return;
675 if((int)f->GetState() & (int)CFileTransfer::State::Process) {
676 emit sigStopFileTransfer(f);
677 }
678 if((int)f->GetState() & (int)CFileTransfer::State::CanStart) {
679 f->slotSetstate(CFileTransfer::State::Opening);
680 emit sigStartFileTransfer(f);
681 }
682}
683
684void CFrmFileTransfer::slotFileTransferUpdate(QSharedPointer<CFileTransfer> f)
685{
686 if(!f) return;
687 m_pListFileModel->UpdateFileTransfer(f);
688}
689
690int CFrmFileTransfer::Load(QSettings &set)
691{
692 m_pListFileModel->Load(set);
693 return 0;
694}
695
696int CFrmFileTransfer::Save(QSettings &set)
697{
698 if(m_pListFileModel)
699 m_pListFileModel->Save(set);
700 return 0;
701}
int SetLocalRoot(const QString &root)
Set local root path
QString GetLocalRoot() const
Get local root path