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