Rabbit Remote Control 0.1.0-bate5
Loading...
Searching...
No Matches
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 *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 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 if(!m_pModelLocalDir) return;
313 auto idx = ui->tabLocal->currentIndex();
314 if(!idx.isValid()) return;
315 QString szPath = m_pModelLocalDir->filePath(idx);
316 if(szPath.isEmpty()) return;
317 QClipboard* pClipboard = QApplication::clipboard();
318 pClipboard->setText(szPath);
319}
320
321void CFrmFileTransfer::slotTabLocalUpload()
322{
323 if(!m_pModelLocalDir) return;
324 auto idx = ui->tabLocal->currentIndex();
325 if(!idx.isValid()) return;
326 QString szPath;
327 szPath = m_pModelLocalDir->filePath(idx);
328 if(szPath.isEmpty()) return;
329}
330
331void CFrmFileTransfer::slotTabLocalAddToList()
332{
333 QString szRemote = ui->cbRemote->currentText();
334 if(szRemote.isEmpty()) {
335 QMessageBox::critical(this, tr("Error"), tr("Please select remote directory"));
336 return;
337 }
338 auto indexes = ui->tabLocal->selectionModel()->selectedRows();
339 foreach(auto idx, indexes) {
340 QString szLocal = m_pModelLocalFile->filePath(idx);
341 if(szLocal.isEmpty()) {
342 qDebug(log) << "The select is empty:" << idx;
343 continue;
344 }
345 QFileInfo fi(szLocal);
346 if(!fi.exists()) {
347 QMessageBox::critical(this, tr("Error"), tr("The file is not exists:") + szLocal);
348 continue;
349 }
350 QString szRemoteFile = szRemote;
351 if(szRemote.right(1) == "/")
352 szRemoteFile += fi.fileName();
353 else
354 szRemoteFile += "/" + fi.fileName();
355 QSharedPointer<CFileTransfer> f(new CFileTransfer(szLocal, szRemoteFile,
356 CFileTransfer::Direction::Upload));
357 f->SetFileSize(fi.size());
358 f->SetLocalPermission(m_pModelLocalFile->permissions(idx));
359 m_pListFileModel->AddFileTransfer(f);
360 }
361}
362
363void CFrmFileTransfer::slotTabLocalOpen()
364{
365 auto idx = ui->tabLocal->currentIndex();
366 if(!idx.isValid()) return;
367 auto szPath = m_pModelLocalFile->filePath(idx);
368 QDesktopServices::openUrl(QUrl(szPath));
369}
370
371void CFrmFileTransfer::slotTabLocalEdit()
372{
373 // TODO: implemented
374 qDebug(log) << Q_FUNC_INFO << "Not implemented";
375}
376
377void CFrmFileTransfer::slotTabLocalDelete()
378{
379 auto idx = ui->tabLocal->currentIndex();
380 if(idx.isValid())
381 m_pModelLocalDir->remove(idx);
382}
383
384void CFrmFileTransfer::slotTabLocalRename()
385{
386 auto idx = ui->tabLocal->currentIndex();
387 if(idx.isValid())
388 ui->tabLocal->edit(idx);
389}
390
391void CFrmFileTransfer::on_cbRemote_editTextChanged(const QString &szPath)
392{
393 qDebug(log) << Q_FUNC_INFO << szPath;
394 if(szPath.isEmpty()) return;
395 if(!m_pModelRemoteDir) return;
396 QModelIndex index = m_pModelRemoteDir->index(szPath);
397 if(index.isValid()) {
398 on_treeRemote_clicked(index);
399 return;
400 }
401
402 auto idx = m_pModelRemoteDir->SetRootPath(szPath);
403 ui->treeRemote->setRootIndex(idx);
404}
405
406// void CFrmFileTransfer::on_cbRemote_currentTextChanged(const QString &szPath)
407// {
408// qDebug(log) << Q_FUNC_INFO << szPath;
409// if(szPath.length() > 1 && (szPath.right(1) == '/' || szPath.right(1) == '\\')) return;
410// if(m_pModelRemoteFile) {
411// auto idx = m_pModelRemoteFile->SetRootPath(szPath);
412// ui->tabRemote->setRootIndex(idx);
413// }
414// }
415
416void CFrmFileTransfer::on_cbRemote_currentIndexChanged(int index)
417{
418 QModelIndex idx = ui->cbRemote->itemData(index).value<QModelIndex>();
419 if(idx.isValid()) {
420 ui->treeRemote->setCurrentIndex(idx);
421 on_treeRemote_clicked(idx);
422 return;
423 }
424 QString szPath = ui->cbRemote->itemText(index);
425 on_cbRemote_editTextChanged(szPath);
426}
427
428void CFrmFileTransfer::on_treeRemote_clicked(const QModelIndex &index)
429{
430 CRemoteFileSystem* pRemoteFileSystem = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(index);
431 if(!pRemoteFileSystem) return;
432 QString szPath = pRemoteFileSystem->GetPath();
433 if(szPath.isEmpty()) return;
434 qDebug(log) << Q_FUNC_INFO << szPath;
435 if(m_pModelRemoteFile) {
436 auto idx = m_pModelRemoteFile->SetRootPath(pRemoteFileSystem->GetPath());
437 ui->tabRemote->setRootIndex(idx);
438 }
439 if(-1 == ui->cbRemote->findText(szPath)) {
440 ui->cbRemote->addItem(szPath, index);
441 }
442 ui->cbRemote->setCurrentText(szPath);
443}
444
445void CFrmFileTransfer::on_treeRemote_doubleClicked(const QModelIndex &index)
446{
447 qDebug(log) << Q_FUNC_INFO << index;
448 if(index.isValid())
449 ui->treeRemote->expand(index);
450}
451
452void CFrmFileTransfer::on_treeRemote_customContextMenuRequested(const QPoint &pos)
453{
454 qDebug(log) << Q_FUNC_INFO;
455 auto idx = ui->treeRemote->currentIndex();
456 QMenu menu;
457 // if(idx.isValid()) {
458 // menu.addAction(QIcon::fromTheme("emblem-downloads"), tr("Download"),
459 // this, SLOT(slotTreeRemoteDownload()));
460 // menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
461 // this, SLOT(slotTreeRemoteAddToList()));
462 // }
463 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
464 this, SLOT(slotTreeRemoteNew()));
465 if(idx.isValid()) {
466 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
467 this, SLOT(slotTreeRemoteDelete()));
468 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
469 this, SLOT(slotTreeRemoteRename()));
470 menu.addAction(QIcon::fromTheme("view-refresh"), tr("Refresh"),
471 this, SLOT(slotTreeRemoteRefresh()));
472 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy url to clipboard"),
473 this, SLOT(slotTreeRemoteCopyToClipboard()));
474 }
475 menu.exec(ui->treeRemote->viewport()->mapToGlobal(pos));
476}
477
478void CFrmFileTransfer::slotTreeRemoteDownload()
479{
480}
481
482int CFrmFileTransfer::EnumRemoteDirectory(CRemoteFileSystem *pRfs, const QString &szLocal)
483{
484 int nRet = 0;
485
486 return nRet;
487}
488
489void CFrmFileTransfer::slotTreeRemoteAddToList()
490{
491 QString szLocal = ui->cbLocal->currentText();
492 if(szLocal.isEmpty()) {
493 QMessageBox::critical(this, tr("Error"), tr("Please select local directory"));
494 return;
495 }
496 auto idx = ui->treeRemote->currentIndex();
497 if(!idx.isValid()) return;
498 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
499 if(p && !(p->GetType() & CRemoteFileSystem::TYPE::FILE))
500 EnumRemoteDirectory(p, szLocal);
501}
502
503void CFrmFileTransfer::slotTreeRemoteNew()
504{
505 QString szName = QInputDialog::getText(
506 this, tr("New folder"), tr("Folder name:"));
507 if(szName.isEmpty()) return;
508 auto idx = ui->treeRemote->currentIndex();
509 if(idx.isValid())
510 m_pModelRemoteDir->CreateDir(idx, szName);
511}
512
513void CFrmFileTransfer::slotTreeRemoteDelete()
514{
515 auto idx = ui->treeRemote->currentIndex();
516 if(idx.isValid())
517 m_pModelRemoteDir->RemoveDir(idx);
518}
519
520void CFrmFileTransfer::slotTreeRemoteRefresh()
521{
522 auto idx = ui->treeRemote->currentIndex();
523 if(idx.isValid()) {
524 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
525 if(p && !p->GetPath().isEmpty()) {
526 p->SetState(CRemoteFileSystem::State::No);
527 m_pModelRemoteDir->fetchMore(idx);
528 }
529 }
530}
531
532void CFrmFileTransfer::slotTreeRemoteRename()
533{
534 auto idx = ui->treeRemote->currentIndex();
535 if(!idx.isValid()) return;
536 ui->treeRemote->edit(idx);
537}
538
539void CFrmFileTransfer::slotTreeRemoteCopyToClipboard()
540{
541 auto idx = ui->treeRemote->currentIndex();
542 if(idx.isValid()) {
543 auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
544 if(p) {
545 QString szPath = p->GetPath();
546 emit sigCopyUrlToClipboard(szPath);
547 }
548 }
549}
550
551void CFrmFileTransfer::on_tabRemote_customContextMenuRequested(const QPoint &pos)
552{
553 qDebug(log) << Q_FUNC_INFO;
554 auto idx = ui->tabRemote->currentIndex();
555 QMenu menu;
556 if(idx.isValid()) {
557 menu.addAction(QIcon::fromTheme("emblem-downloads"), tr("Download"),
558 this, SLOT(slotTabRemoteDownload()));
559 menu.addAction(QIcon::fromTheme("list-add"), tr("Add to list"),
560 this, SLOT(slotTabRemoteAddToList()));
561 }
562 menu.addAction(QIcon::fromTheme("document-new"), tr("New"),
563 this, SLOT(slotTabRemoteNew()));
564 if(idx.isValid()) {
565 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
566 this, SLOT(slotTabRemoteDelete()));
567 menu.addAction(QIcon::fromTheme("rename"), tr("Rename"),
568 this, SLOT(slotTabRemoteRename()));
569 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy url to clipboard"),
570 this, SLOT(slotTabRemoteCopyToClipboard()));
571 }
572 menu.exec(ui->tabRemote->viewport()->mapToGlobal(pos));
573}
574
575void CFrmFileTransfer::slotTabRemoteDownload()
576{
577}
578
579void CFrmFileTransfer::slotTabRemoteAddToList()
580{
581 QString szLocal = ui->cbLocal->currentText();
582 if(szLocal.isEmpty()) {
583 QMessageBox::critical(this, tr("Error"), tr("Please select local directory"));
584 return;
585 }
586 auto indexes = ui->tabRemote->selectionModel()->selectedRows();
587 foreach(auto idx, indexes) {
588 auto p = m_pModelRemoteFile->GetRemoteFileSystemFromIndex(idx);
589 QString szRemote = p->GetPath();
590 if(szRemote.isEmpty()) {
591 qDebug(log) << "The select is empty:" << idx;
592 continue;
593 }
594 QString szLocalFile = szLocal;
595 if(szLocalFile.right(1) == "/" || szLocalFile.right(1) == "\\")
596 szLocalFile += p->GetName();
597 else
598 szLocalFile += QDir::separator() + p->GetName();
599 QSharedPointer<CFileTransfer> f(
600 new CFileTransfer(szLocalFile,
601 szRemote, CFileTransfer::Direction::Download));
602 f->SetFileSize(p->GetSize());
603 f->SetRemotePermission(p->GetPermissions());
604 m_pListFileModel->AddFileTransfer(f);
605 }
606}
607
608void CFrmFileTransfer::slotTabRemoteNew()
609{
610}
611
612void CFrmFileTransfer::slotTabRemoteDelete()
613{
614}
615
616void CFrmFileTransfer::slotTabRemoteRename()
617{}
618
619void CFrmFileTransfer::slotTabRemoteCopyToClipboard()
620{
621 auto idx = ui->tabRemote->currentIndex();
622 if(idx.isValid()) {
623 auto p = m_pModelRemoteFile->GetRemoteFileSystemFromIndex(idx);
624 if(p) {
625 QString szPath = p->GetPath();
626 emit sigCopyUrlToClipboard(szPath);
627 }
628 }
629}
630
631void CFrmFileTransfer::on_tabList_customContextMenuRequested(const QPoint &pos)
632{
633 qDebug(log) << Q_FUNC_INFO;
634 auto idx = ui->tabList->currentIndex();
635 QMenu menu;
636 if(idx.isValid()) {
637 auto f = m_pListFileModel->GetFileTransfer(idx);
638 if(f) {
639 if(((int)f->GetState() & (int)CFileTransfer::State::Process))
640 menu.addAction(QIcon::fromTheme("media-playback-stop"),
641 tr("Stop"), this, SLOT(slotProcessFileTransfer()));
642 else if(f->GetState() != CFileTransfer::State::Finish)
643 menu.addAction(QIcon::fromTheme("media-playback-start"),
644 tr("Start"), this, SLOT(slotProcessFileTransfer()));
645 }
646 menu.addAction(QIcon::fromTheme("remove"), tr("Delete"),
647 this, SLOT(slotTabListDelete()));
648 }
649 menu.exec(ui->tabList->viewport()->mapToGlobal(pos));
650}
651
652void CFrmFileTransfer::slotTabListDelete()
653{
654 auto indexes = ui->tabList->selectionModel()->selectedRows();
655 // 倒序排序
656 std::sort(indexes.begin(), indexes.end(),
657 [](const QModelIndex &a, const QModelIndex &b) {
658 return a.row() > b.row();
659 });
660 foreach(const QModelIndex &idx, indexes) {
661 auto f = m_pListFileModel->GetFileTransfer(idx);
662 if(f) {
663 if((int)f->GetState() & (int)CFileTransfer::State::Process) {
664 QMessageBox::critical(this, tr("Error"), tr("Please stop the file transfer first"));
665 return;
666 }
667 }
668 m_pListFileModel->removeRow(idx.row(), idx.parent());
669 }
670 return;
671}
672
673void CFrmFileTransfer::slotProcessFileTransfer()
674{
675 auto idx = ui->tabList->currentIndex();
676 if(!idx.isValid()) return;
677 auto f = m_pListFileModel->GetFileTransfer(idx);
678 if(!f) return;
679 if((int)f->GetState() & (int)CFileTransfer::State::Process) {
680 emit sigStopFileTransfer(f);
681 }
682 if((int)f->GetState() & (int)CFileTransfer::State::CanStart) {
683 f->slotSetstate(CFileTransfer::State::Opening);
684 emit sigStartFileTransfer(f);
685 }
686}
687
688void CFrmFileTransfer::slotFileTransferUpdate(QSharedPointer<CFileTransfer> f)
689{
690 if(!f) return;
691 m_pListFileModel->UpdateFileTransfer(f);
692}
693
694int CFrmFileTransfer::Load(QSettings &set)
695{
696 m_pListFileModel->Load(set);
697 return 0;
698}
699
700int CFrmFileTransfer::Save(QSettings &set)
701{
702 if(m_pListFileModel)
703 m_pListFileModel->Save(set);
704 return 0;
705}
int SetLocalRoot(const QString &root)
Set local root path.
QString GetLocalRoot() const
Get local root path.