10#include <QApplication> 
   11#include <QDesktopServices> 
   12#include <QLoggingCategory> 
   13#include "FrmFileTransfer.h" 
   14#include "ui_FrmFileTransfer.h" 
   16static Q_LOGGING_CATEGORY(log, 
"FileTransfer.Widget")
 
   20    , m_pModelLocalDir(
nullptr)
 
   21    , m_pModelLocalFile(
nullptr)
 
   22    , m_pModelRemoteDir(
nullptr)
 
   23    , m_pModelRemoteFile(
nullptr)
 
   24    , m_pListFileModel(
nullptr)
 
   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);
 
   39    SetLocalRoot(QString());
 
   40    ui->treeLocal->setHeaderHidden(
true);
 
   41    ui->treeLocal->header()->hide();
 
   43    ui->treeLocal->header()->hideSection(1);
 
   44    ui->treeLocal->header()->hideSection(2);
 
   45    ui->treeLocal->header()->hideSection(3);
 
   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);
 
   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);
 
   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();
 
   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);
 
  109CFrmFileTransfer::~CFrmFileTransfer()
 
  111    qDebug(log) << Q_FUNC_INFO;
 
  120    check = connect(
this, SIGNAL(sigGetDir(
CRemoteFileSystem*, QVector<QSharedPointer<CRemoteFileSystem> > , 
bool)),
 
  121                    p, SLOT(slotGetDir(
CRemoteFileSystem*, QVector<QSharedPointer<CRemoteFileSystem> > , 
bool)));
 
  123    check = connect(p, SIGNAL(sigRemoveDir(
const QString&)),
 
  124                    this, SIGNAL(sigRemoveDir(
const QString&)));
 
  126    check = connect(p, SIGNAL(sigRemoveFile(
const QString&)),
 
  127                    this, SIGNAL(sigRemoveFile(
const QString&)));
 
  129    check = connect(p, SIGNAL(sigRename(
const QString&, 
const QString&)),
 
  130                    this, SIGNAL(sigRename(
const QString&, 
const QString&)));
 
  132    check = connect(p, SIGNAL(sigMakeDir(
const QString&)),
 
  133                    this, SIGNAL(sigMakeDir(
const QString&)));
 
  139    auto index = m_pModelLocalDir->setRootPath(root);
 
  140    ui->treeLocal->setRootIndex(index);
 
  141    slotTreeLocalClicked(index);
 
 
  147    return m_pModelLocalDir->rootPath();
 
 
  150void CFrmFileTransfer::slotTreeLocalClicked(
const QModelIndex &index)
 
  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);
 
  161void CFrmFileTransfer::on_cbLocal_editTextChanged(
const QString &szPath)
 
  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);
 
  171void CFrmFileTransfer::on_treeLocal_customContextMenuRequested(
const QPoint &pos)
 
  173    qDebug(log) << Q_FUNC_INFO;
 
  174    auto idx = ui->treeLocal->currentIndex();
 
  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()));
 
  184    menu.addAction(QIcon::fromTheme(
"document-new"), tr(
"New"),
 
  185                   this, SLOT(slotTreeLocalNew()));
 
  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()));
 
  194    menu.exec(ui->treeLocal->viewport()->mapToGlobal(pos));
 
  197void CFrmFileTransfer::slotTreeLocalOpen()
 
  199    auto idx = ui->treeLocal->currentIndex();
 
  200    auto szPath = m_pModelLocalDir->filePath(idx);
 
  201    QDesktopServices::openUrl(QUrl(szPath));
 
  204void CFrmFileTransfer::slotTreeLocalNew()
 
  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);
 
  213void CFrmFileTransfer::slotTreeLocalDelete()
 
  215    auto idx = ui->treeLocal->currentIndex();
 
  216    m_pModelLocalDir->remove(idx);
 
  219void CFrmFileTransfer::slotTreeLocalRename()
 
  221    ui->treeLocal->edit(ui->treeLocal->currentIndex());
 
  224void CFrmFileTransfer::slotTreeLocalUpload()
 
  229int CFrmFileTransfer::EnumLocalDirectory(QDir d, 
const QString& szRemote)
 
  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";
 
  238        QFileInfo fi(szLocal);
 
  240            QMessageBox::critical(
this, tr(
"Error"), tr(
"The file is not exists:") + szLocal);
 
  243        QString szRemoteFile = szRemote;
 
  244        if(szRemote.right(1) == 
"/")
 
  245            szRemoteFile += fi.fileName();
 
  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);
 
  254    foreach(
auto file, d.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
 
  256        QDir dir(d.absoluteFilePath(file));
 
  257        nRet = EnumLocalDirectory(dir, szRemote + 
"/" + file);
 
  262void CFrmFileTransfer::slotTreeLocalAddToList()
 
  264    QString szRemote = ui->cbRemote->currentText();
 
  265    if(szRemote.isEmpty()) {
 
  266        QMessageBox::critical(
this, tr(
"Error"), tr(
"Please select remote directory"));
 
  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());
 
  277void CFrmFileTransfer::slotTreeLocalCopyToClipboard()
 
  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);
 
  286void CFrmFileTransfer::on_tabLocal_customContextMenuRequested(
const QPoint &pos)
 
  288    qDebug(log) << Q_FUNC_INFO;
 
  289    auto idx = ui->tabLocal->currentIndex();
 
  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()));
 
  307    menu.exec(ui->tabLocal->viewport()->mapToGlobal(pos));
 
  310void CFrmFileTransfer::slotTabLocalCopyToClipboard()
 
  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);
 
  320void CFrmFileTransfer::slotTabLocalUpload()
 
  322    auto idx = ui->tabLocal->currentIndex();
 
  323    if(!idx.isValid()) 
return;
 
  324    QString szPath = m_pModelLocalDir->filePath(idx);
 
  325    if(szPath.isEmpty()) 
return;
 
  328void CFrmFileTransfer::slotTabLocalAddToList()
 
  330    QString szRemote = ui->cbRemote->currentText();
 
  331    if(szRemote.isEmpty()) {
 
  332        QMessageBox::critical(
this, tr(
"Error"), tr(
"Please select remote directory"));
 
  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;
 
  342        QFileInfo fi(szLocal);
 
  344            QMessageBox::critical(
this, tr(
"Error"), tr(
"The file is not exists:") + szLocal);
 
  347        QString szRemoteFile = szRemote;
 
  348        if(szRemote.right(1) == 
"/")
 
  349            szRemoteFile += fi.fileName();
 
  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);
 
  360void CFrmFileTransfer::slotTabLocalOpen()
 
  362    auto idx = ui->tabLocal->currentIndex();
 
  363    if(!idx.isValid()) 
return;
 
  364    auto szPath = m_pModelLocalFile->filePath(idx);
 
  365    QDesktopServices::openUrl(QUrl(szPath));
 
  368void CFrmFileTransfer::slotTabLocalEdit()
 
  371    qDebug(log) << Q_FUNC_INFO << 
"Not implemented";
 
  374void CFrmFileTransfer::slotTabLocalDelete()
 
  376    auto idx = ui->tabLocal->currentIndex();
 
  378        m_pModelLocalDir->remove(idx);
 
  381void CFrmFileTransfer::slotTabLocalRename()
 
  383    auto idx = ui->tabLocal->currentIndex();
 
  385        ui->tabLocal->edit(idx);
 
  388void CFrmFileTransfer::on_cbRemote_editTextChanged(
const QString &szPath)
 
  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);
 
  399    auto idx = m_pModelRemoteDir->SetRootPath(szPath);
 
  400    ui->treeRemote->setRootIndex(idx);
 
  413void CFrmFileTransfer::on_cbRemote_currentIndexChanged(
int index)
 
  415    QModelIndex idx = ui->cbRemote->itemData(index).value<QModelIndex>();
 
  417        ui->treeRemote->setCurrentIndex(idx);
 
  418        on_treeRemote_clicked(idx);
 
  421    QString szPath = ui->cbRemote->itemText(index);
 
  422    on_cbRemote_editTextChanged(szPath);
 
  425void CFrmFileTransfer::on_treeRemote_clicked(
const QModelIndex &index)
 
  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);
 
  436    if(-1 == ui->cbRemote->findText(szPath)) {
 
  437        ui->cbRemote->addItem(szPath, index);
 
  439    ui->cbRemote->setCurrentText(szPath);
 
  442void CFrmFileTransfer::on_treeRemote_doubleClicked(
const QModelIndex &index)
 
  444    qDebug(log) << Q_FUNC_INFO << index;
 
  446        ui->treeRemote->expand(index);
 
  449void CFrmFileTransfer::on_treeRemote_customContextMenuRequested(
const QPoint &pos)
 
  451    qDebug(log) << Q_FUNC_INFO;
 
  452    auto idx = ui->treeRemote->currentIndex();
 
  460    menu.addAction(QIcon::fromTheme(
"document-new"), tr(
"New"),
 
  461                   this, SLOT(slotTreeRemoteNew()));
 
  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()));
 
  472    menu.exec(ui->treeRemote->viewport()->mapToGlobal(pos));
 
  475void CFrmFileTransfer::slotTreeRemoteDownload()
 
  479int CFrmFileTransfer::EnumRemoteDirectory(
CRemoteFileSystem *p, 
const QString &szLocal)
 
  486void CFrmFileTransfer::slotTreeRemoteAddToList()
 
  488    QString szLocal = ui->cbLocal->currentText();
 
  489    if(szLocal.isEmpty()) {
 
  490        QMessageBox::critical(
this, tr(
"Error"), tr(
"Please select local directory"));
 
  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);
 
  500void CFrmFileTransfer::slotTreeRemoteNew()
 
  502    QString szName = QInputDialog::getText(
 
  503        this, tr(
"New folder"), tr(
"Folder name:"));
 
  504    if(szName.isEmpty()) 
return;
 
  505    auto idx = ui->treeRemote->currentIndex();
 
  507        m_pModelRemoteDir->CreateDir(idx, szName);
 
  510void CFrmFileTransfer::slotTreeRemoteDelete()
 
  512    auto idx = ui->treeRemote->currentIndex();
 
  514        m_pModelRemoteDir->RemoveDir(idx);
 
  517void CFrmFileTransfer::slotTreeRemoteRefresh()
 
  519    auto idx = ui->treeRemote->currentIndex();
 
  521        auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
 
  522        if(p && !p->GetPath().isEmpty()) {
 
  523            p->SetState(CRemoteFileSystem::State::No);
 
  524            m_pModelRemoteDir->fetchMore(idx);
 
  529void CFrmFileTransfer::slotTreeRemoteRename()
 
  531    auto idx = ui->treeRemote->currentIndex();
 
  532    if(!idx.isValid()) 
return;
 
  533    ui->treeRemote->edit(idx);
 
  536void CFrmFileTransfer::slotTreeRemoteCopyToClipboard()
 
  538    auto idx = ui->treeRemote->currentIndex();
 
  540        auto p = m_pModelRemoteDir->GetRemoteFileSystemFromIndex(idx);
 
  542            QString szPath = p->GetPath();
 
  543            emit sigCopyUrlToClipboard(szPath);
 
  548void CFrmFileTransfer::on_tabRemote_customContextMenuRequested(
const QPoint &pos)
 
  550    qDebug(log) << Q_FUNC_INFO;
 
  551    auto idx = ui->tabRemote->currentIndex();
 
  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()));
 
  559    menu.addAction(QIcon::fromTheme(
"document-new"), tr(
"New"),
 
  560                   this, SLOT(slotTabRemoteNew()));
 
  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()));
 
  569    menu.exec(ui->tabRemote->viewport()->mapToGlobal(pos));
 
  572void CFrmFileTransfer::slotTabRemoteDownload()
 
  576void CFrmFileTransfer::slotTabRemoteAddToList()
 
  578    QString szLocal = ui->cbLocal->currentText();
 
  579    if(szLocal.isEmpty()) {
 
  580        QMessageBox::critical(
this, tr(
"Error"), tr(
"Please select local directory"));
 
  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;
 
  591        QString szLocalFile = szLocal;
 
  592        if(szLocalFile.right(1) == 
"/" || szLocalFile.right(1) == 
"\\")
 
  593            szLocalFile += p->GetName();
 
  595            szLocalFile += QDir::separator() + p->GetName();
 
  596        QSharedPointer<CFileTransfer> f(
 
  598                              szRemote, CFileTransfer::Direction::Download));
 
  599        f->SetFileSize(p->GetSize());
 
  600        f->SetRemotePermission(p->GetPermissions());
 
  601        m_pListFileModel->AddFileTransfer(f);
 
  605void CFrmFileTransfer::slotTabRemoteNew()
 
  609void CFrmFileTransfer::slotTabRemoteDelete()
 
  613void CFrmFileTransfer::slotTabRemoteRename()
 
  616void CFrmFileTransfer::slotTabRemoteCopyToClipboard()
 
  618    auto idx = ui->tabRemote->currentIndex();
 
  620        auto p = m_pModelRemoteFile->GetRemoteFileSystemFromIndex(idx);
 
  622            QString szPath = p->GetPath();
 
  623            emit sigCopyUrlToClipboard(szPath);
 
  628void CFrmFileTransfer::on_tabList_customContextMenuRequested(
const QPoint &pos)
 
  630    qDebug(log) << Q_FUNC_INFO;
 
  631    auto idx = ui->tabList->currentIndex();
 
  634        auto f = m_pListFileModel->GetFileTransfer(idx);
 
  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()));
 
  643        menu.addAction(QIcon::fromTheme(
"remove"), tr(
"Delete"),
 
  644                       this, SLOT(slotTabListDelete()));
 
  646    menu.exec(ui->tabList->viewport()->mapToGlobal(pos));
 
  649void CFrmFileTransfer::slotTabListDelete()
 
  651    auto indexes = ui->tabList->selectionModel()->selectedRows();
 
  653    std::sort(indexes.begin(), indexes.end(),
 
  654              [](
const QModelIndex &a, 
const QModelIndex &b) {
 
  655                  return a.row() > b.row();
 
  657    foreach(
const QModelIndex &idx, indexes) {
 
  658        auto f = m_pListFileModel->GetFileTransfer(idx);
 
  660            if((
int)f->GetState() & (
int)CFileTransfer::State::Process) {
 
  661                QMessageBox::critical(
this, tr(
"Error"), tr(
"Please stop the file transfer first"));
 
  665        m_pListFileModel->removeRow(idx.row(), idx.parent());
 
  670void CFrmFileTransfer::slotProcessFileTransfer()
 
  672    auto idx = ui->tabList->currentIndex();
 
  673    if(!idx.isValid()) 
return;
 
  674    auto f = m_pListFileModel->GetFileTransfer(idx);
 
  676    if((
int)f->GetState() & (
int)CFileTransfer::State::Process) {
 
  677        emit sigStopFileTransfer(f);
 
  679    if((
int)f->GetState() & (
int)CFileTransfer::State::CanStart) {
 
  680        f->slotSetstate(CFileTransfer::State::Opening);
 
  681        emit sigStartFileTransfer(f);
 
  685void CFrmFileTransfer::slotFileTransferUpdate(QSharedPointer<CFileTransfer> f)
 
  688    m_pListFileModel->UpdateFileTransfer(f);
 
  691int CFrmFileTransfer::Load(QSettings &set)
 
  693    m_pListFileModel->Load(set);
 
  697int CFrmFileTransfer::Save(QSettings &set)
 
  700        m_pListFileModel->Save(set);
 
int SetLocalRoot(const QString &root)
Set local root path.
 
QString GetLocalRoot() const
Get local root path.