diff --git a/krusader/Dialogs/krdialogs.h b/krusader/Dialogs/krdialogs.h --- a/krusader/Dialogs/krdialogs.h +++ b/krusader/Dialogs/krdialogs.h @@ -86,7 +86,7 @@ QUrl selectedURL() const; QUrl baseURL() const; bool preserveAttrs(); - bool enqueue() { return queueBox->isChecked(); } + bool enqueue() { return queue; }; bool copyDirStructure(); void hidePreserveAttrs() { // preserveAttrsCB->hide(); @@ -94,7 +94,12 @@ KUrlRequester *urlRequester(); +protected: + virtual void keyPressEvent(QKeyEvent *e) Q_DECL_OVERRIDE; + + private slots: + void slotQueue(); void slotTextChanged(const QString &); void slotDirStructCBChanged(); private: @@ -102,8 +107,8 @@ QComboBox *baseUrlCombo; // QCheckBox *preserveAttrsCB; QCheckBox *copyDirStructureCB; - QCheckBox *queueBox; QPushButton *okButton; + bool queue = false; }; class KRGetDate : public QDialog diff --git a/krusader/Dialogs/krdialogs.cpp b/krusader/Dialogs/krdialogs.cpp --- a/krusader/Dialogs/krdialogs.cpp +++ b/krusader/Dialogs/krdialogs.cpp @@ -42,6 +42,7 @@ #include "../krglobal.h" #include "../VFS/vfs.h" #include "../defaults.h" +#include "../JobMan/jobman.h" QUrl KChooseDir::getFile(const QString &text, const QUrl& url, const QUrl& cwd) @@ -150,11 +151,13 @@ okButton = buttonBox->button(QDialogButtonBox::Ok); okButton->setDefault(true); okButton->setShortcut(Qt::CTRL | Qt::Key_Return); - queueBox = new QCheckBox(i18n("Start &Paused"), this); - buttonBox->addButton(queueBox, QDialogButtonBox::ActionRole); + QPushButton *queueButton = new QPushButton(krJobMan->isQueueModeEnabled() ? i18n("F2 In Parallel") : i18n("F2 Queue"), this); + buttonBox->addButton(queueButton, QDialogButtonBox::ActionRole); + connect(buttonBox, SIGNAL(accepted()), SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), SLOT(reject())); + connect(queueButton, SIGNAL(clicked()), SLOT(slotQueue())); connect(urlRequester_, SIGNAL(textChanged(QString)), SLOT(slotTextChanged(QString))); urlRequester_->setFocus(); @@ -162,6 +165,24 @@ okButton->setEnabled(state); } +void KUrlRequesterDlgForCopy::keyPressEvent(QKeyEvent *e) +{ + switch (e->key()) { + case Qt::Key_F2: + slotQueue(); + return; + default: + QDialog::keyPressEvent(e); + } +} + +void KUrlRequesterDlgForCopy::slotQueue() +{ + queue = true; + accept(); +} + + bool KUrlRequesterDlgForCopy::preserveAttrs() { // return preserveAttrsCB->isChecked(); diff --git a/krusader/JobMan/jobman.h b/krusader/JobMan/jobman.h --- a/krusader/JobMan/jobman.h +++ b/krusader/JobMan/jobman.h @@ -78,11 +78,15 @@ */ bool waitForJobs(bool waitForUserInput); + /* Curent info about _queueMode state */ + bool isQueueModeEnabled() { return _queueMode; }; + public slots: /** Display, monitor and give user ability to control a job. - * If enqueued the job is not started. Otherwise this depends on the job manager mode. + * If reverseQueueMode is false, job is queued or run in parallel accordingly + * to job manager mode. When reverseQueueMode is true, opposite manager mode is chosen. */ - void manageJob(KrJob *krJob, bool enqueue = false); + void manageJob(KrJob *krJob, bool reverseQueueMode = false); protected slots: void slotKJobStarted(KJob *krJob); diff --git a/krusader/JobMan/jobman.cpp b/krusader/JobMan/jobman.cpp --- a/krusader/JobMan/jobman.cpp +++ b/krusader/JobMan/jobman.cpp @@ -247,7 +247,7 @@ return false; } -void JobMan::manageJob(KrJob *job, bool enqueue) +void JobMan::manageJob(KrJob *job, bool reverseQueueMode) { JobMenuAction *menuAction = new JobMenuAction(job, _controlAction); @@ -258,7 +258,9 @@ connect(job, &KrJob::started, this, &JobMan::slotKJobStarted); connect(job, &KrJob::terminated, this, &JobMan::slotTerminated); - if (!enqueue && !(_queueMode && jobsAreRunning())) { + bool isQueueMode = (_queueMode && !reverseQueueMode) || (!_queueMode && reverseQueueMode); + + if (!isQueueMode || (isQueueMode && !jobsAreRunning())) { job->start(); } @@ -321,9 +323,14 @@ { _jobs.removeAll(krJob); - if (_queueMode && !_jobs.isEmpty() && !jobsAreRunning()) { - // start next job - _jobs.first()->start(); + if (!_jobs.isEmpty() && !jobsAreRunning()) { + foreach (KrJob *job, _jobs) { + if (!job->isManuallyPaused()) { + // start next job + job->start(); + break; + } + } } updateUI(); diff --git a/krusader/JobMan/krjob.h b/krusader/JobMan/krjob.h --- a/krusader/JobMan/krjob.h +++ b/krusader/JobMan/krjob.h @@ -54,6 +54,8 @@ /** Return true if job was started and is not suspended(). */ bool isRunning() const { return _job && !_job->isSuspended(); } + /** Return true if job was started and then paused by user. */ + bool isManuallyPaused() const { return _manuallyPaused; } /** Return percent progress of job. */ int percent() const { return _job ? _job->percent() : 0; } @@ -78,6 +80,8 @@ const KIO::JobFlags _flags; const QString _description; + bool _manuallyPaused = false; + KIO::Job *_job; }; diff --git a/krusader/JobMan/krjob.cpp b/krusader/JobMan/krjob.cpp --- a/krusader/JobMan/krjob.cpp +++ b/krusader/JobMan/krjob.cpp @@ -123,4 +123,5 @@ { if (_job) _job->suspend(); + _manuallyPaused = true; }