玉兔远程控制 0.1.0-bate5
载入中...
搜索中...
未找到
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 SetRemoteConnect(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 SetRemoteConnect(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::SetRemoteConnect(CRemoteFileSystemModel *pRfs)
116{
117 bool check = connect(pRfs, SIGNAL(sigGetDir(CRemoteFileSystem*)),
118 this, SIGNAL(sigGetDir(CRemoteFileSystem*)));
119 Q_ASSERT(check);
120 check = connect(this, SIGNAL(sigGetDir(CRemoteFileSystem*, QVector<QSharedPointer<CRemoteFileSystem> > , bool)),
121 pRfs, SLOT(slotGetDir(CRemoteFileSystem*, QVector<QSharedPointer<CRemoteFileSystem> > , bool)));
122 Q_ASSERT(check);
123 check = connect(pRfs, SIGNAL(sigRemoveDir(const QString&)),
124 this, SIGNAL(sigRemoveDir(const QString&)));
125 Q_ASSERT(check);
126 check = connect(pRfs, SIGNAL(sigRemoveFile(const QString&)),
127 this, SIGNAL(sigRemoveFile(const QString&)));
128 Q_ASSERT(check);
129 check = connect(pRfs, SIGNAL(sigRename(const QString&, const QString&)),
130 this, SIGNAL(sigRename(const QString&, const QString&)));
131 Q_ASSERT(check);
132 check = connect(pRfs, 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 if(m_pModelLocalDir)
148 return m_pModelLocalDir->rootPath();
149 return QString();
150}
151
152void CFrmFileTransfer::slotTreeLocalClicked(const QModelIndex &index)
153{
154 QString szPath = m_pModelLocalDir->filePath(index);
155 if(szPath.isEmpty()) return;
156 if(-1 == ui->cbLocal->findText(szPath))
157 ui->cbLocal->addItem(szPath);
158 ui->cbLocal->setCurrentText(szPath);
159 QModelIndex idx = m_pModelLocalFile->setRootPath(szPath);
160 ui->tabLocal->setRootIndex(idx);
161}
162
163void CFrmFileTransfer::on_cbLocal_editTextChanged(const QString &szPath)
164{
165 //qDebug(log) << Q_FUNC_INFO << szPath;
166 if(!m_pModelLocalDir) return;
167 auto idx = m_pModelLocalDir->index(szPath);
168 if(!idx.isValid()) return;
169 if(szPath.length() > 1 && (szPath.right(1) == '/' || szPath.right(1) == '\\')) return;
170 ui->treeLocal->setCurrentIndex(idx);
171 slotTreeLocalClicked(idx);
172}
173
174void CFrmFileTransfer::on_treeLocal_customContextMenuRequested(const QPoint &pos)
175{
176 //qDebug(log) << Q_FUNC_INFO;
177 auto idx = ui->treeLocal->currentIndex();
178 QMenu menu;
179 if(idx.isValid()) {
180 menu.addAction(QIcon::fromTheme("go-up"), tr("Upload"),
181 this, SLOT(slotTreeLocalUpload()));
182 menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
183 this, SLOT(slotTreeLocalAddToList()));
184 menu.addAction(QIcon::fromTheme("folder-open"), tr("Open"),
185 this, SLOT(slotTreeLocalOpen()));
186 }
187 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
188 this, SLOT(slotTreeLocalNew()));
189 if(idx.isValid()) {
190 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
191 this, SLOT(slotTreeLocalDelete()));
192 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
193 this, SLOT(slotTreeLocalRename()));
194 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy path to clipboard"),
195 this, SLOT(slotTreeLocalCopyToClipboard()));
196 }
197 menu.exec(ui->treeLocal->viewport()->mapToGlobal(pos));
198}
199
200void CFrmFileTransfer::slotTreeLocalOpen()
201{
202 if(!m_pModelLocalDir) return;
203 auto idx = ui->treeLocal->currentIndex();
204 auto szPath = m_pModelLocalDir->filePath(idx);
205 QDesktopServices::openUrl(QUrl(szPath));
206}
207
208void CFrmFileTransfer::slotTreeLocalNew()
209{
210 if(!m_pModelLocalDir) return;
211 QString szName = QInputDialog::getText(
212 this, tr("New folder"), tr("Folder name:"));
213 if(szName.isEmpty()) return;
214 auto idx = ui->treeLocal->currentIndex();
215 m_pModelLocalDir->mkdir(idx, szName);
216}
217
218void CFrmFileTransfer::slotTreeLocalDelete()
219{
220 if(!m_pModelLocalDir) return;
221 auto idx = ui->treeLocal->currentIndex();
222 m_pModelLocalDir->remove(idx);
223}
224
225void CFrmFileTransfer::slotTreeLocalRename()
226{
227 ui->treeLocal->edit(ui->treeLocal->currentIndex());
228}
229
230void CFrmFileTransfer::slotTreeLocalUpload()
231{
232 qDebug(log) << Q_FUNC_INFO << "Complete it!";
233 // TODO: implemented
234}
235
236int CFrmFileTransfer::EnumLocalDirectory(QDir d, const QString& szRemoteDir)
237{
238 foreach (auto f, d.entryList(QDir::Files | QDir::NoDotAndDotDot)) {
239 QString szLocal = d.absoluteFilePath(f);
240 if(szLocal.isEmpty()) {
241 qDebug(log) << "The select is empty";
242 continue;
243 }
244 QFileInfo fi(szLocal);
245 if(!fi.exists()) {
246 QMessageBox::critical(this, tr("Error"),
247 tr("The file is not exists:") + szLocal);
248 continue;
249 }
250 QString szRemoteFile = szRemoteDir;
251 if(szRemoteDir.right(1) == "/")
252 szRemoteFile += fi.fileName();
253 else
254 szRemoteFile += "/" + fi.fileName();
255 QSharedPointer<CFileTransfer> fileTransfer(new CFileTransfer(
256 szLocal, szRemoteFile,
257 CFileTransfer::Direction::Upload));
258 fileTransfer->SetFileSize(fi.size());
259 m_pListFileModel->AddFileTransfer(fileTransfer);
260 }
261 foreach(auto folder, d.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
262 {
263 QDir dir(d.absoluteFilePath(folder));
264 EnumLocalDirectory(dir, szRemoteDir + "/" + folder);
265 }
266 return 0;
267}
268
269void CFrmFileTransfer::slotTreeLocalAddToList()
270{
271 QString szRemote = ui->cbRemote->currentText();
272 if(szRemote.isEmpty()) {
273 QMessageBox::critical(this, tr("Error"), tr("Please select remote directory"));
274 return;
275 }
276 auto idx = ui->treeLocal->currentIndex();
277 if(!idx.isValid()) return;
278 QString szPath = m_pModelLocalDir->filePath(idx);
279 if(!m_pModelLocalDir->isDir(idx) || szPath.isEmpty()) return;
280 QFileInfo fi(szPath);
281 EnumLocalDirectory(QDir(szPath), szRemote + "/" + fi.fileName());
282}
283
284void CFrmFileTransfer::slotTreeLocalCopyToClipboard()
285{
286 if(!m_pModelLocalDir) return;
287 auto idx = ui->treeLocal->currentIndex();
288 QString szPath = m_pModelLocalDir->filePath(idx);
289 if(szPath.isEmpty()) return;
290 QClipboard* pClipboard = QApplication::clipboard();
291 pClipboard->setText(szPath);
292}
293
294void CFrmFileTransfer::on_tabLocal_customContextMenuRequested(const QPoint &pos)
295{
296 qDebug(log) << Q_FUNC_INFO;
297 auto idx = ui->tabLocal->currentIndex();
298 QMenu menu;
299 if(idx.isValid()) {
300 menu.addAction(QIcon::fromTheme("go-up"), tr("Upload"),
301 this, SLOT(slotTabLocalUpload()));
302 menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
303 this, SLOT(slotTabLocalAddToList()));
304 menu.addAction(QIcon::fromTheme("file-open"), tr("Open"),
305 this, SLOT(slotTabLocalOpen()));
306 menu.addAction(QIcon::fromTheme("file-edit"), tr("Edit"),
307 this, SLOT(slotTabLocalEdit()));
308 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
309 this, SLOT(slotTabLocalDelete()));
310 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
311 this, SLOT(slotTabLocalRename()));
312 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy path to clipboard"),
313 this, SLOT(slotTabLocalCopyToClipboard()));
314 }
315 menu.exec(ui->tabLocal->viewport()->mapToGlobal(pos));
316}
317
318void CFrmFileTransfer::slotTabLocalCopyToClipboard()
319{
320 if(!m_pModelLocalDir) return;
321 auto idx = ui->tabLocal->currentIndex();
322 if(!idx.isValid()) return;
323 QString szPath = m_pModelLocalDir->filePath(idx);
324 if(szPath.isEmpty()) return;
325 QClipboard* pClipboard = QApplication::clipboard();
326 pClipboard->setText(szPath);
327}
328
329void CFrmFileTransfer::slotTabLocalUpload()
330{
331 if(!m_pModelLocalDir) return;
332 auto idx = ui->tabLocal->currentIndex();
333 if(!idx.isValid()) return;
334 QString szPath;
335 szPath = m_pModelLocalDir->filePath(idx);
336 if(szPath.isEmpty()) return;
337}
338
339void CFrmFileTransfer::slotTabLocalAddToList()
340{
341 QString szRemote = ui->cbRemote->currentText();
342 if(szRemote.isEmpty()) {
343 QMessageBox::critical(this, tr("Error"), tr("Please select remote directory"));
344 return;
345 }
346 auto indexes = ui->tabLocal->selectionModel()->selectedRows();
347 foreach(auto idx, indexes) {
348 QString szLocal = m_pModelLocalFile->filePath(idx);
349 if(szLocal.isEmpty()) {
350 qDebug(log) << "The select is empty:" << idx;
351 continue;
352 }
353 QFileInfo fi(szLocal);
354 if(!fi.exists()) {
355 QMessageBox::critical(this, tr("Error"), tr("The file is not exists:") + szLocal);
356 continue;
357 }
358 QString szRemoteFile = szRemote;
359 if(szRemote.right(1) == "/")
360 szRemoteFile += fi.fileName();
361 else
362 szRemoteFile += "/" + fi.fileName();
363 QSharedPointer<CFileTransfer> f(new CFileTransfer(szLocal, szRemoteFile,
364 CFileTransfer::Direction::Upload));
365 f->SetFileSize(fi.size());
366 f->SetLocalPermission(m_pModelLocalFile->permissions(idx));
367 m_pListFileModel->AddFileTransfer(f);
368 }
369}
370
371void CFrmFileTransfer::slotTabLocalOpen()
372{
373 auto idx = ui->tabLocal->currentIndex();
374 if(!idx.isValid()) return;
375 auto szPath = m_pModelLocalFile->filePath(idx);
376 QDesktopServices::openUrl(QUrl(szPath));
377}
378
379void CFrmFileTransfer::slotTabLocalEdit()
380{
381 // TODO: implemented
382 qDebug(log) << Q_FUNC_INFO << "Not implemented";
383}
384
385void CFrmFileTransfer::slotTabLocalDelete()
386{
387 auto idx = ui->tabLocal->currentIndex();
388 if(idx.isValid())
389 m_pModelLocalDir->remove(idx);
390}
391
392void CFrmFileTransfer::slotTabLocalRename()
393{
394 auto idx = ui->tabLocal->currentIndex();
395 if(idx.isValid())
396 ui->tabLocal->edit(idx);
397}
398
399void CFrmFileTransfer::on_cbRemote_editTextChanged(const QString &szPath)
400{
401 qDebug(log) << Q_FUNC_INFO << szPath;
402 if(szPath.isEmpty()) return;
403 if(!m_pModelRemoteDir) return;
404 QModelIndex index = m_pModelRemoteDir->index(szPath);
405 if(index.isValid()) {
406 on_treeRemote_clicked(index);
407 return;
408 }
409
410 auto idx = m_pModelRemoteDir->SetRootPath(szPath);
411 ui->treeRemote->setRootIndex(idx);
412}
413
414// void CFrmFileTransfer::on_cbRemote_currentTextChanged(const QString &szPath)
415// {
416// qDebug(log) << Q_FUNC_INFO << szPath;
417// if(szPath.length() > 1 && (szPath.right(1) == '/' || szPath.right(1) == '\\')) return;
418// if(m_pModelRemoteFile) {
419// auto idx = m_pModelRemoteFile->SetRootPath(szPath);
420// ui->tabRemote->setRootIndex(idx);
421// }
422// }
423
424void CFrmFileTransfer::on_cbRemote_currentIndexChanged(int index)
425{
426 QModelIndex idx = ui->cbRemote->itemData(index).value<QModelIndex>();
427 if(idx.isValid()) {
428 ui->treeRemote->setCurrentIndex(idx);
429 on_treeRemote_clicked(idx);
430 return;
431 }
432 QString szPath = ui->cbRemote->itemText(index);
433 on_cbRemote_editTextChanged(szPath);
434}
435
436void CFrmFileTransfer::on_treeRemote_clicked(const QModelIndex &index)
437{
438 CRemoteFileSystem* pRemoteFileSystem = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(index);
439 if(!pRemoteFileSystem) return;
440 QString szPath = pRemoteFileSystem->GetPath();
441 if(szPath.isEmpty()) return;
442 qDebug(log) << Q_FUNC_INFO << szPath;
443 if(m_pModelRemoteFile) {
444 auto idx = m_pModelRemoteFile->SetRootPath(pRemoteFileSystem->GetPath());
445 ui->tabRemote->setRootIndex(idx);
446 }
447 if(-1 == ui->cbRemote->findText(szPath)) {
448 ui->cbRemote->addItem(szPath, index);
449 }
450 ui->cbRemote->setCurrentText(szPath);
451}
452
453void CFrmFileTransfer::on_treeRemote_doubleClicked(const QModelIndex &index)
454{
455 qDebug(log) << Q_FUNC_INFO << index;
456 if(index.isValid())
457 ui->treeRemote->expand(index);
458}
459
460void CFrmFileTransfer::on_treeRemote_customContextMenuRequested(const QPoint &pos)
461{
462 qDebug(log) << Q_FUNC_INFO;
463 auto idx = ui->treeRemote->currentIndex();
464 QMenu menu;
465 // if(idx.isValid()) {
466 // menu.addAction(QIcon::fromTheme("emblem-downloads"), tr("Download"),
467 // this, SLOT(slotTreeRemoteDownload()));
468 // menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
469 // this, SLOT(slotTreeRemoteAddToList()));
470 // }
471 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
472 this, SLOT(slotTreeRemoteNew()));
473 if(idx.isValid()) {
474 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
475 this, SLOT(slotTreeRemoteDelete()));
476 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
477 this, SLOT(slotTreeRemoteRename()));
478 menu.addAction(QIcon::fromTheme("view-refresh"), tr("Refresh"),
479 this, SLOT(slotTreeRemoteRefresh()));
480 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy url to clipboard"),
481 this, SLOT(slotTreeRemoteCopyToClipboard()));
482 }
483 menu.exec(ui->treeRemote->viewport()->mapToGlobal(pos));
484}
485
486void CFrmFileTransfer::slotTreeRemoteDownload()
487{
488 qDebug(log) << Q_FUNC_INFO;
489}
490
492 const QString &szLocalDir)
493{
494 qDebug(log) << Q_FUNC_INFO;
495 if(!pRfs || !pRfs->IsDir()) return -1;
496
497 for(int index = 0; index < pRfs->ChildCount(); index++) {
498 //TODO: Complete it
499 }
500 return 0;
501}
502
503void CFrmFileTransfer::slotTreeRemoteAddToList()
504{
505 QString szLocal = ui->cbLocal->currentText();
506 if(szLocal.isEmpty()) {
507 QMessageBox::critical(this, tr("Error"), tr("Please select local directory"));
508 return;
509 }
510 auto idx = ui->treeRemote->currentIndex();
511 if(!idx.isValid()) return;
512 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
513 if(p && !(p->GetType() & CRemoteFileSystem::TYPE::FILE))
514 EnumRemoteDirectory(p, szLocal);
515}
516
517void CFrmFileTransfer::slotTreeRemoteNew()
518{
519 QString szName = QInputDialog::getText(
520 this, tr("New folder"), tr("Folder name:"));
521 if(szName.isEmpty()) return;
522 auto idx = ui->treeRemote->currentIndex();
523 if(idx.isValid())
524 m_pModelRemoteDir->CreateDir(idx, szName);
525}
526
527void CFrmFileTransfer::slotTreeRemoteDelete()
528{
529 auto idx = ui->treeRemote->currentIndex();
530 if(idx.isValid())
531 m_pModelRemoteDir->RemoveDir(idx);
532}
533
534void CFrmFileTransfer::slotTreeRemoteRefresh()
535{
536 auto idx = ui->treeRemote->currentIndex();
537 if(idx.isValid()) {
538 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
539 if(p && !p->GetPath().isEmpty()) {
540 p->SetState(CRemoteFileSystem::State::No);
541 m_pModelRemoteDir->fetchMore(idx);
542 }
543 }
544}
545
546void CFrmFileTransfer::slotTreeRemoteRename()
547{
548 auto idx = ui->treeRemote->currentIndex();
549 if(!idx.isValid()) return;
550 ui->treeRemote->edit(idx);
551}
552
553void CFrmFileTransfer::slotTreeRemoteCopyToClipboard()
554{
555 auto idx = ui->treeRemote->currentIndex();
556 if(idx.isValid()) {
557 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
558 if(p) {
559 QString szPath = p->GetPath();
560 emit sigCopyUrlToClipboard(szPath);
561 }
562 }
563}
564
565void CFrmFileTransfer::on_tabRemote_customContextMenuRequested(const QPoint &pos)
566{
567 qDebug(log) << Q_FUNC_INFO;
568 auto idx = ui->tabRemote->currentIndex();
569 QMenu menu;
570 if(idx.isValid()) {
571 menu.addAction(QIcon::fromTheme("emblem-downloads"), tr("Download"),
572 this, SLOT(slotTabRemoteDownload()));
573 menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
574 this, SLOT(slotTabRemoteAddToList()));
575 }
576 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
577 this, SLOT(slotTabRemoteNew()));
578 if(idx.isValid()) {
579 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
580 this, SLOT(slotTabRemoteDelete()));
581 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
582 this, SLOT(slotTabRemoteRename()));
583 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy url to clipboard"),
584 this, SLOT(slotTabRemoteCopyToClipboard()));
585 }
586 menu.exec(ui->tabRemote->viewport()->mapToGlobal(pos));
587}
588
589void CFrmFileTransfer::slotTabRemoteDownload()
590{
591}
592
593void CFrmFileTransfer::slotTabRemoteAddToList()
594{
595 QString szLocal = ui->cbLocal->currentText();
596 if(szLocal.isEmpty()) {
597 QMessageBox::critical(this, tr("Error"), tr("Please select local directory"));
598 return;
599 }
600 auto indexes = ui->tabRemote->selectionModel()->selectedRows();
601 foreach(auto idx, indexes) {
602 auto p = m_pModelRemoteFile->GetRemoteFileSystemFromIndex(idx);
603 QString szRemote = p->GetPath();
604 if(szRemote.isEmpty()) {
605 qDebug(log) << "The select is empty:" << idx;
606 continue;
607 }
608 QString szLocalFile = szLocal;
609 if(szLocalFile.right(1) == "/" || szLocalFile.right(1) == "\\")
610 szLocalFile += p->GetName();
611 else
612 szLocalFile += QDir::separator() + p->GetName();
613 QSharedPointer<CFileTransfer> f(
614 new CFileTransfer(szLocalFile,
615 szRemote, CFileTransfer::Direction::Download));
616 f->SetFileSize(p->GetSize());
617 f->SetRemotePermission(p->GetPermissions());
618 m_pListFileModel->AddFileTransfer(f);
619 }
620}
621
622void CFrmFileTransfer::slotTabRemoteNew()
623{
624}
625
626void CFrmFileTransfer::slotTabRemoteDelete()
627{
628}
629
630void CFrmFileTransfer::slotTabRemoteRename()
631{}
632
633void CFrmFileTransfer::slotTabRemoteCopyToClipboard()
634{
635 auto idx = ui->tabRemote->currentIndex();
636 if(idx.isValid()) {
637 auto p = m_pModelRemoteFile->GetRemoteFileSystemFromIndex(idx);
638 if(p) {
639 QString szPath = p->GetPath();
640 emit sigCopyUrlToClipboard(szPath);
641 }
642 }
643}
644
645void CFrmFileTransfer::on_tabList_customContextMenuRequested(const QPoint &pos)
646{
647 qDebug(log) << Q_FUNC_INFO;
648 auto idx = ui->tabList->currentIndex();
649 QMenu menu;
650 if(idx.isValid()) {
651 auto f = m_pListFileModel->GetFileTransfer(idx);
652 if(f) {
653 if(((int)f->GetState() & (int)CFileTransfer::State::Process))
654 menu.addAction(QIcon::fromTheme("media-playback-stop"),
655 tr("Stop"), this, SLOT(slotProcessFileTransfer()));
656 else if(f->GetState() != CFileTransfer::State::Finish)
657 menu.addAction(QIcon::fromTheme("media-playback-start"),
658 tr("Start"), this, SLOT(slotProcessFileTransfer()));
659 }
660 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
661 this, SLOT(slotTabListDelete()));
662 }
663 menu.exec(ui->tabList->viewport()->mapToGlobal(pos));
664}
665
666void CFrmFileTransfer::slotTabListDelete()
667{
668 auto indexes = ui->tabList->selectionModel()->selectedRows();
669 // 倒序排序
670 std::sort(indexes.begin(), indexes.end(),
671 [](const QModelIndex &a, const QModelIndex &b) {
672 return a.row() > b.row();
673 });
674 foreach(const QModelIndex &idx, indexes) {
675 auto f = m_pListFileModel->GetFileTransfer(idx);
676 if(f) {
677 if((int)f->GetState() & (int)CFileTransfer::State::Process) {
678 QMessageBox::critical(this, tr("Error"), tr("Please stop the file transfer first"));
679 return;
680 }
681 }
682 m_pListFileModel->removeRow(idx.row(), idx.parent());
683 }
684 return;
685}
686
687void CFrmFileTransfer::slotProcessFileTransfer()
688{
689 auto idx = ui->tabList->currentIndex();
690 if(!idx.isValid()) return;
691 auto f = m_pListFileModel->GetFileTransfer(idx);
692 if(!f) return;
693 if((int)f->GetState() & (int)CFileTransfer::State::Process) {
694 emit sigStopFileTransfer(f);
695 }
696 if((int)f->GetState() & (int)CFileTransfer::State::CanStart) {
697 f->slotSetstate(CFileTransfer::State::Opening);
698 emit sigStartFileTransfer(f);
699 }
700}
701
702void CFrmFileTransfer::slotFileTransferUpdate(QSharedPointer<CFileTransfer> f)
703{
704 if(!f) return;
705 m_pListFileModel->UpdateFileTransfer(f);
706}
707
708int CFrmFileTransfer::Load(QSettings &set)
709{
710 m_pListFileModel->Load(set);
711 return 0;
712}
713
714int CFrmFileTransfer::Save(QSettings &set)
715{
716 if(m_pListFileModel)
717 m_pListFileModel->Save(set);
718 return 0;
719}
int SetLocalRoot(const QString &root)
Set local root path
int EnumLocalDirectory(QDir d, const QString &szRemoteDir)
Enum local directory, update to remote directory
int EnumRemoteDirectory(CRemoteFileSystem *pRfs, const QString &szLocalDir)
Enum remote directory, download to local directory
QString GetLocalRoot() const
Get local root path