You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
6.5 KiB
209 lines
6.5 KiB
/*
|
|
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
|
|
#include "fileoperationdialog.h"
|
|
#include "fileoperation.h"
|
|
#include "renamedialog.h"
|
|
#include <QLabel>
|
|
#include <QMessageBox>
|
|
#include <libfm/fm-config.h>
|
|
#include "utilities.h"
|
|
#include "ui_file-operation-dialog.h"
|
|
|
|
|
|
namespace Fm {
|
|
|
|
FileOperationDialog::FileOperationDialog(FileOperation* _operation):
|
|
QDialog(nullptr),
|
|
operation(_operation),
|
|
defaultOption(-1),
|
|
ignoreNonCriticalErrors_(false) {
|
|
|
|
ui = new Ui::FileOperationDialog();
|
|
ui->setupUi(this);
|
|
|
|
QString title;
|
|
QString message;
|
|
switch(_operation->type()) {
|
|
case FileOperation::Move:
|
|
title = tr("Move files");
|
|
message = tr("Moving the following files to destination folder:");
|
|
break;
|
|
case FileOperation::Copy:
|
|
title = tr("Copy Files");
|
|
message = tr("Copying the following files to destination folder:");
|
|
break;
|
|
case FileOperation::Trash:
|
|
title = tr("Trash Files");
|
|
message = tr("Moving the following files to trash can:");
|
|
break;
|
|
case FileOperation::Delete:
|
|
title = tr("Delete Files");
|
|
message = tr("Deleting the following files:");
|
|
ui->dest->hide();
|
|
ui->destLabel->hide();
|
|
break;
|
|
case FileOperation::Link:
|
|
title = tr("Create Symlinks");
|
|
message = tr("Creating symlinks for the following files:");
|
|
break;
|
|
case FileOperation::ChangeAttr:
|
|
title = tr("Change Attributes");
|
|
message = tr("Changing attributes of the following files:");
|
|
ui->dest->hide();
|
|
ui->destLabel->hide();
|
|
break;
|
|
case FileOperation::UnTrash:
|
|
title = tr("Restore Trashed Files");
|
|
message = tr("Restoring the following files from trash can:");
|
|
ui->dest->hide();
|
|
ui->destLabel->hide();
|
|
break;
|
|
}
|
|
ui->message->setText(message);
|
|
setWindowTitle(title);
|
|
}
|
|
|
|
|
|
FileOperationDialog::~FileOperationDialog() {
|
|
delete ui;
|
|
}
|
|
|
|
void FileOperationDialog::setDestPath(const Fm::FilePath &dest) {
|
|
ui->dest->setText(dest.displayName().get());
|
|
}
|
|
|
|
void FileOperationDialog::setSourceFiles(const Fm::FilePathList &srcFiles) {
|
|
for(auto& srcFile : srcFiles) {
|
|
ui->sourceFiles->addItem(srcFile.displayName().get());
|
|
}
|
|
}
|
|
|
|
int FileOperationDialog::ask(QString /*question*/, char* const* /*options*/) {
|
|
// TODO: implement FileOperationDialog::ask()
|
|
return 0;
|
|
}
|
|
|
|
|
|
FileOperationJob::FileExistsAction FileOperationDialog::askRename(const FileInfo &src, const FileInfo &dest, FilePath &newDest) {
|
|
FileOperationJob::FileExistsAction ret;
|
|
if(defaultOption == -1) { // default action is not set, ask the user
|
|
RenameDialog dlg(src, dest, this);
|
|
dlg.exec();
|
|
switch(dlg.action()) {
|
|
case RenameDialog::ActionOverwrite:
|
|
ret = FileOperationJob::OVERWRITE;
|
|
if(dlg.applyToAll()) {
|
|
defaultOption = ret;
|
|
}
|
|
break;
|
|
case RenameDialog::ActionRename: {
|
|
ret = FileOperationJob::RENAME;
|
|
auto newName = dlg.newName();
|
|
if(!newName.isEmpty()) {
|
|
auto destDirPath = dest.path().parent();
|
|
newDest = destDirPath.child(newName.toUtf8().constData());
|
|
}
|
|
break;
|
|
}
|
|
case RenameDialog::ActionIgnore:
|
|
ret = FileOperationJob::SKIP;
|
|
if(dlg.applyToAll()) {
|
|
defaultOption = ret;
|
|
}
|
|
break;
|
|
default:
|
|
ret = FileOperationJob::CANCEL;
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
ret = (FileOperationJob::FileExistsAction)defaultOption;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
Job::ErrorAction FileOperationDialog::error(GError* err, Job::ErrorSeverity severity) {
|
|
if(severity >= Job::ErrorSeverity::MODERATE) {
|
|
if(severity == Job::ErrorSeverity::CRITICAL) {
|
|
QMessageBox::critical(this, tr("Error"), QString::fromUtf8(err->message));
|
|
return Job::ErrorAction::ABORT;
|
|
}
|
|
if (ignoreNonCriticalErrors_) {
|
|
return Job::ErrorAction::CONTINUE;
|
|
}
|
|
QMessageBox::StandardButton stb = QMessageBox::critical(this, tr("Error"), QString::fromUtf8(err->message),
|
|
QMessageBox::Ok | QMessageBox::Ignore);
|
|
if (stb == QMessageBox::Ignore) {
|
|
ignoreNonCriticalErrors_ = true;
|
|
}
|
|
}
|
|
return Job::ErrorAction::CONTINUE;
|
|
}
|
|
|
|
void FileOperationDialog::setCurFile(QString cur_file) {
|
|
ui->curFile->setText(cur_file);
|
|
}
|
|
|
|
void FileOperationDialog::setDataTransferred(uint64_t finishedSize, std::uint64_t totalSize) {
|
|
ui->filesProcessed->setText(QString("%1 / %2")
|
|
.arg(formatFileSize(finishedSize, fm_config->si_unit))
|
|
.arg(formatFileSize(totalSize, fm_config->si_unit)));
|
|
}
|
|
|
|
void FileOperationDialog::setFilesProcessed(uint64_t finishedCount, uint64_t totalCount) {
|
|
ui->filesProcessed->setText(QString("%1 / %2")
|
|
.arg(finishedCount)
|
|
.arg(totalCount));
|
|
}
|
|
|
|
void FileOperationDialog::setPercent(unsigned int percent) {
|
|
ui->progressBar->setValue(percent);
|
|
}
|
|
|
|
|
|
void FileOperationDialog::setRemainingTime(unsigned int sec) {
|
|
unsigned int min = 0;
|
|
unsigned int hr = 0;
|
|
if(sec > 60) {
|
|
min = sec / 60;
|
|
sec %= 60;
|
|
if(min > 60) {
|
|
hr = min / 60;
|
|
min %= 60;
|
|
}
|
|
}
|
|
ui->timeRemaining->setText(QString("%1:%2:%3")
|
|
.arg(hr, 2, 10, QChar('0'))
|
|
.arg(min, 2, 10, QChar('0'))
|
|
.arg(sec, 2, 10, QChar('0')));
|
|
}
|
|
|
|
void FileOperationDialog::setPrepared() {
|
|
}
|
|
|
|
void FileOperationDialog::reject() {
|
|
operation->cancel();
|
|
QDialog::reject();
|
|
}
|
|
|
|
|
|
} // namespace Fm
|