aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/desktop-utils/lumina-fm/OPWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/desktop-utils/lumina-fm/OPWidget.cpp')
-rw-r--r--src-qt5/desktop-utils/lumina-fm/OPWidget.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src-qt5/desktop-utils/lumina-fm/OPWidget.cpp b/src-qt5/desktop-utils/lumina-fm/OPWidget.cpp
new file mode 100644
index 00000000..3638e2a8
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-fm/OPWidget.cpp
@@ -0,0 +1,117 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "OPWidget.h"
+#include "ui_OPWidget.h"
+
+#include "ScrollDialog.h"
+
+OPWidget::OPWidget(QWidget *parent) : QWidget(parent), ui(new Ui::OPWidget()){
+ starttime = endtime = -1;
+ WA = new QWidgetAction(0);
+ WA->setDefaultWidget(this);
+ worker = 0;
+ workthread = 0;
+ dlg = 0;
+ //Now create the widget
+ ui->setupUi(this);
+ ui->tool_close->setIcon( LXDG::findIcon("dialog-close","view-close") );
+ ui->tool_showerrors->setIcon(LXDG::findIcon("dialog-warning",""));
+ //connect the widget buttons
+ connect(ui->tool_close, SIGNAL(clicked()), this, SLOT(closeWidget()) );
+ connect(ui->tool_showerrors, SIGNAL(clicked()), this, SLOT(showErrors()) );
+}
+
+OPWidget::~OPWidget(){
+ if(worker!=0){ worker->stopped = true; worker->deleteLater(); }
+ if(workthread!=0){ workthread->quit(); workthread->wait(); delete workthread; }
+ WA->deleteLater();
+ if(dlg!=0){ dlg->deleteLater(); }
+}
+
+QWidgetAction* OPWidget::widgetAction(){
+ return WA;
+}
+
+void OPWidget::setupOperation(QString optype, QStringList oldF, QStringList newF){
+ if(workthread==0){ workthread = new QThread(); }
+ if(worker==0){
+ worker = new FOWorker();
+ connect(worker, SIGNAL(startingItem(int,int,QString,QString)), this, SLOT(opUpdate(int,int,QString,QString)) );
+ connect(worker, SIGNAL(finished(QStringList)), this, SLOT(opFinished(QStringList)) );
+ worker->moveToThread(workthread);
+ }
+ workthread->start();
+ //Now setup the worker with the desired operation
+ optype = optype.toLower();
+ worker->ofiles = oldF;
+ worker->nfiles = newF;
+ if(optype=="move"){ worker->isMV = true; tract = tr("Move"); }
+ else if(optype=="copy"){ worker->isCP = true; tract = tr("Copy"); }
+ else if(optype=="delete"){ worker->isRM = true; tract = tr("Remove"); }
+
+}
+
+
+bool OPWidget::isDone(){
+ return (endtime>0);
+}
+
+bool OPWidget::hasErrors(){
+ return !Errors.isEmpty();
+}
+
+float OPWidget::duration(){
+ return ( (endtime-starttime)/1000.0); //convert from ms to s
+}
+
+
+QString OPWidget::finalStat(){
+ return ui->label->text();
+}
+
+
+//PUBLIC SLOTS
+void OPWidget::startOperation(){
+ starttime = QDateTime::currentMSecsSinceEpoch();
+ endtime = -1;
+ QTimer::singleShot(0, worker, SLOT(slotStartOperations()) );
+ emit starting(this->whatsThis());
+}
+
+
+// PRIVATE SLOTS
+void OPWidget::closeWidget(){
+ if(!isDone()){ worker->stopped = true; }
+ else{ emit closed(this->whatsThis()); }
+}
+
+void OPWidget::showErrors(){
+ qDebug() << "Errors:" << Errors;
+ if(dlg==0){
+ dlg = new ScrollDialog(); //need this to persist outside this function
+ dlg->setWindowTitle(tr("File Operation Errors"));
+ dlg->setText( Errors.join("\n") );
+ }
+ dlg->showNormal();
+}
+
+void OPWidget::opFinished(QStringList errors){
+ Errors = errors;
+ endtime = QDateTime::currentMSecsSinceEpoch();
+ emit finished(this->whatsThis());
+ ui->progressBar->setValue(ui->progressBar->maximum()); //last item finished
+ ui->tool_showerrors->setVisible(!Errors.isEmpty());
+ ui->label->setText( QString(tr("%1 Finished")).arg(tract) + (errors.isEmpty() ? "" : (" ("+tr("Errors Occured")+")") ) );
+}
+
+void OPWidget::opUpdate(int cur, int tot, QString ofile, QString nfile){ //current, total, old file, new file
+ ui->progressBar->setRange(0,tot);
+ ui->progressBar->setValue(cur);
+ QString txt = tract +": "+ofile.section("/",-1);
+ if(!nfile.isEmpty()){txt.append(" -> "+nfile.section("/",-1) ); }
+ ui->label->setText( txt);
+}
bgstack15