From: <ck...@us...> - 2008-09-29 19:22:07
|
Revision: 6097 http://krusader.svn.sourceforge.net/krusader/?rev=6097&view=rev Author: ckarai Date: 2008-09-29 19:21:26 +0000 (Mon, 29 Sep 2008) Log Message: ----------- QueueManager GUI Modified Paths: -------------- trunk/krusader_kde4/ChangeLog trunk/krusader_kde4/krusader/Queue/queue.cpp trunk/krusader_kde4/krusader/Queue/queue.h trunk/krusader_kde4/krusader/Queue/queue_mgr.cpp trunk/krusader_kde4/krusader/Queue/queue_mgr.h trunk/krusader_kde4/krusader/Queue/queuedialog.cpp trunk/krusader_kde4/krusader/Queue/queuedialog.h trunk/krusader_kde4/krusader/Queue/queuewidget.cpp trunk/krusader_kde4/krusader/Queue/queuewidget.h trunk/krusader_kde4/krusader/VFS/kiojobwrapper.cpp trunk/krusader_kde4/krusader/VFS/kiojobwrapper.h Modified: trunk/krusader_kde4/ChangeLog =================================================================== --- trunk/krusader_kde4/ChangeLog 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/ChangeLog 2008-09-29 19:21:26 UTC (rev 6097) @@ -1,4 +1,4 @@ - ADDED: enqueue operation for copy / move (alpha without gui) + ADDED: enqueue operation for copy / move (with an almost finished gui) ADDED: Konfigurator mouse selection mode: Possibility to select a predefined mode and change a detail. ADDED: [ 1704953 ] highlight quick search match Modified: trunk/krusader_kde4/krusader/Queue/queue.cpp =================================================================== --- trunk/krusader_kde4/krusader/Queue/queue.cpp 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queue.cpp 2008-09-29 19:21:26 UTC (rev 6097) @@ -3,13 +3,20 @@ #include <kdebug.h> #include <klocale.h> #include <kmessagebox.h> +#include <QTime> Queue::Queue(const QString& name): _name(name), _suspended( false ) { + connect( &_scheduleTimer, SIGNAL( timeout() ), this, SLOT( resume() ) ); } Queue::~Queue() { + foreach( KIOJobWrapper * job, _jobs ) { + job->abort(); + delete job; + } + _jobs.clear(); // TODO: save queue on delete? or just delete jobs } @@ -66,6 +73,10 @@ case KMessageBox::Yes: // continue break; case KMessageBox::No: // delete the queue + foreach( KIOJobWrapper * job, _jobs ) { + job->abort(); + delete job; + } _jobs.clear(); emit changed(); emit emptied(); @@ -108,15 +119,52 @@ _suspended = true; if(( _jobs.count() > 0 ) && _jobs[ 0 ]->isStarted() ) _jobs[ 0 ]->suspend(); + + emit stateChanged(); } void Queue::resume() { _suspended = false; + _scheduleTimer.stop(); if( _jobs.count() > 0 ) { if( _jobs[ 0 ]->isSuspended() ) _jobs[ 0 ]->resume(); else if( !_jobs[ 0 ]->isStarted() ) _jobs[ 0 ]->start(); } + + emit stateChanged(); } + +void Queue::schedule( const QTime &time ) +{ + QTime nowTime = QTime::currentTime(); + _suspended = true; + if(( _jobs.count() > 0 ) && _jobs[ 0 ]->isStarted() ) + _jobs[ 0 ]->suspend(); + + int now = ((nowTime.hour() * 60) + nowTime.minute() ) * 60 + nowTime.second(); + int schedule = ((time.hour() * 60) + time.minute() ) * 60 + time.second(); + + int diff = schedule - now; + if( diff < 0 ) + diff += 24 * 60 * 60; // 1 day plus + + diff *= 1000; // milliseconds + _scheduleTime = time; + + _scheduleTimer.stop(); + _scheduleTimer.setSingleShot( true ); + _scheduleTimer.start( diff ); + + emit stateChanged(); +} + +QTime Queue::scheduleTime() +{ + if( _suspended && _scheduleTimer.isActive() ) + return _scheduleTime; + else + return QTime(); +} \ No newline at end of file Modified: trunk/krusader_kde4/krusader/Queue/queue.h =================================================================== --- trunk/krusader_kde4/krusader/Queue/queue.h 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queue.h 2008-09-29 19:21:26 UTC (rev 6097) @@ -4,6 +4,8 @@ #include <qobject.h> #include "../VFS/kiojobwrapper.h" #include <QList> +#include <QTimer> +#include <QTime> class KJob; @@ -25,6 +27,7 @@ void enqueue(KIOJobWrapper *job); int count() { return _jobs.size(); } bool isSuspended() { return _suspended; } + QTime scheduleTime(); QList<QString> itemDescriptions(); QList<KIOJobWrapper *> items(); @@ -32,6 +35,7 @@ public slots: void suspend(); void resume(); + void schedule( const QTime & ); protected slots: void slotJobDestroyed( QObject * ); @@ -43,11 +47,14 @@ QString _name; QList<KIOJobWrapper *> _jobs; bool _suspended; + QTimer _scheduleTimer; + QTime _scheduleTime; signals: void showQueueDialog(); void changed(); void emptied(); + void stateChanged(); }; #endif // QUEUE_H Modified: trunk/krusader_kde4/krusader/Queue/queue_mgr.cpp =================================================================== --- trunk/krusader_kde4/krusader/Queue/queue_mgr.cpp 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queue_mgr.cpp 2008-09-29 19:21:26 UTC (rev 6097) @@ -1,21 +1,18 @@ #include "queue_mgr.h" #include "queuedialog.h" +#include "queue.h" #include <QList> #include <klocale.h> const QString QueueManager::defaultName=i18n( "default" ); QMap<QString, Queue*> QueueManager::_queues; -QString QueueManager::_current=QueueManager::defaultName; +Queue * QueueManager::_current=0; QueueManager * QueueManager::_self = 0; QueueManager::QueueManager() { - Queue *defaultQ = new Queue(defaultName); - connect( defaultQ, SIGNAL( showQueueDialog() ), this, SLOT( slotShowQueueDialog() ) ); - connect( defaultQ, SIGNAL( emptied() ), this, SLOT( slotQueueEmptied() ) ); - _queues.insert(defaultQ->name(), defaultQ); - _current = defaultName; _self = this; + createQueue( defaultName ); } QueueManager::~QueueManager() @@ -41,13 +38,15 @@ Queue* QueueManager::currentQueue() { - return queue( _current ); + return _current; } -void QueueManager::setCurrentQueue(const QString& queueName) +void QueueManager::setCurrentQueue(Queue * queue) { - if (_queues.contains(queueName)) - _current = queueName; + if (_queues.contains(queue->name())) { + _current = queue; + _self->emit currentChanged( queue ); + } } void QueueManager::slotShowQueueDialog() @@ -67,3 +66,33 @@ } QueueDialog::everyQueueIsEmpty(); } + +Queue * QueueManager::createQueue(const QString& queueName) +{ + if( _queues.contains( queueName ) ) + return 0; + Queue *queue = new Queue(queueName); + connect( queue, SIGNAL( showQueueDialog() ), _self, SLOT( slotShowQueueDialog() ) ); + connect( queue, SIGNAL( emptied() ), _self, SLOT( slotQueueEmptied() ) ); + _queues.insert(queue->name(), queue); + _current = queue; + + _self->emit queueInserted( queue ); + _self->emit currentChanged( queue ); + return queue; +} + +void QueueManager::removeQueue( Queue * queue ) +{ + if( _queues.count() < 2 && _queues.contains( queue->name() ) ) + return; + + _self->emit queueDeleted( queue ); + _queues.remove( queue->name() ); + + QMap<QString, Queue*>::iterator it; + _current = _queues.begin().value(); + _self->emit currentChanged( queue ); + + delete queue; +} Modified: trunk/krusader_kde4/krusader/Queue/queue_mgr.h =================================================================== --- trunk/krusader_kde4/krusader/Queue/queue_mgr.h 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queue_mgr.h 2008-09-29 19:21:26 UTC (rev 6097) @@ -23,17 +23,24 @@ static QList<QString> queues(); static Queue* currentQueue(); - static void setCurrentQueue(const QString& queueName); + static void setCurrentQueue( Queue * queue ); + static Queue* createQueue(const QString& queueName); + static void removeQueue( Queue * queue ); - QueueManager * instance() { return _self; } + static QueueManager * instance() { return _self; } protected slots: void slotShowQueueDialog(); void slotQueueEmptied(); + +signals: + void queueInserted( Queue * ); + void queueDeleted( Queue * ); + void currentChanged( Queue * ); protected: static QMap<QString, Queue*> _queues; - static QString _current; + static Queue * _current; static QueueManager * _self; }; Modified: trunk/krusader_kde4/krusader/Queue/queuedialog.cpp =================================================================== --- trunk/krusader_kde4/krusader/Queue/queuedialog.cpp 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queuedialog.cpp 2008-09-29 19:21:26 UTC (rev 6097) @@ -35,6 +35,7 @@ #include <qlayout.h> #include <qframe.h> #include <klocale.h> +#include <kdialog.h> #include <qevent.h> #include <qpainter.h> #include <qrect.h> @@ -45,6 +46,10 @@ #include <qtoolbutton.h> #include <qimage.h> #include <kiconeffect.h> +#include <kinputdialog.h> +#include <kmessagebox.h> +#include <QTimeEdit> +#include <QProgressBar> class KrImageButton : public QToolButton { @@ -92,6 +97,33 @@ bool _onIcon; }; +class KrTimeDialog : public KDialog { +public: + KrTimeDialog( QWidget * parent = 0 ) : KDialog( parent ) { + setWindowTitle( i18n( "Krusader::Queue Manager" ) ); + setButtons( KDialog::Ok | KDialog::Cancel ); + setDefaultButton( KDialog::Ok ); + setWindowModality( Qt::WindowModal ); + + QWidget *mainWidget = new QWidget( this ); + QGridLayout *grid_time = new QGridLayout; + QLabel * label = new QLabel( i18n( "Please enter the time to start processing the queue:" ), mainWidget ); + grid_time->addWidget( label, 0, 0 ); + + QTime time = QTime::currentTime(); + time = time.addSecs( 60 * 60 ); // add 1 hour + _timeEdit = new QTimeEdit( time, mainWidget ); + _timeEdit->setDisplayFormat( "hh:mm:ss" ); + grid_time->addWidget( _timeEdit, 1, 0 ); + mainWidget->setLayout( grid_time ); + setMainWidget( mainWidget ); + } + QTime getStartTime() { return _timeEdit->time(); } + +private: + QTimeEdit * _timeEdit; +}; + QueueDialog * QueueDialog::_queueDialog = 0; QueueDialog::QueueDialog() : QDialog( 0, Qt::FramelessWindowHint ), _autoHide( true ) @@ -138,19 +170,53 @@ QWidget *toolWg = new QWidget( this ); QHBoxLayout * hbox2 = new QHBoxLayout( toolWg ); + hbox2->setSpacing( 0 ); + _newTabButton = new QToolButton( this ); + _newTabButton->setIcon( KIcon( "tab-new" ) ); + _newTabButton->setToolTip( i18n( "Create a new queue" ) ); + connect( _newTabButton, SIGNAL( clicked() ), this, SLOT( slotNewTab() ) ); + hbox2->addWidget( _newTabButton ); + + _closeTabButton = new QToolButton( this ); + _closeTabButton->setIcon( KIcon( "tab-close" ) ); + _closeTabButton->setToolTip( i18n( "Remove the current queue" ) ); + connect( _closeTabButton, SIGNAL( clicked() ), this, SLOT( slotDeleteCurrentTab() ) ); + hbox2->addWidget( _closeTabButton ); + _pauseButton = new QToolButton( this ); _pauseButton->setIcon( KIcon( "media-playback-pause" ) ); connect( _pauseButton, SIGNAL( clicked() ), this, SLOT( slotPauseClicked() ) ); hbox2->addWidget( _pauseButton ); - hbox2->addItem( new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum) ); + _progressBar = new QProgressBar( this ); + _progressBar->setMinimum( 0 ); + _progressBar->setMaximum( 100 ); + _progressBar->setValue( 0 ); + _progressBar->setFormat( i18n( "unused" ) ); + _progressBar->setTextVisible( true ); + hbox2->addWidget( _progressBar ); + _scheduleButton = new QToolButton( this ); + _scheduleButton->setIcon( KIcon( "chronometer" ) ); + _scheduleButton->setToolTip( i18n( "Schedule queue starting" ) ); + connect( _scheduleButton, SIGNAL( clicked() ), this, SLOT( slotScheduleClicked() ) ); + hbox2->addWidget( _scheduleButton ); + grid_main->addWidget( toolWg, 1, 0 ); - QueueWidget *wdg = new QueueWidget( this ); - grid_main->addWidget( wdg, 2, 0 ); + _queueWidget = new QueueWidget( this ); + connect( _queueWidget, SIGNAL( currentChanged() ), this, SLOT( slotUpdateToolbar() ) ); + grid_main->addWidget( _queueWidget, 2, 0 ); + _statusLabel = new QLabel( this ); + QSizePolicy statuspolicy( QSizePolicy::Expanding, QSizePolicy::Minimum); + statuspolicy.setHeightForWidth( _statusLabel->sizePolicy().hasHeightForWidth() ); + _statusLabel->setSizePolicy( statuspolicy ); + _statusLabel->setFrameShape( QLabel::StyledPanel ); + _statusLabel->setFrameShadow( QLabel::Sunken ); + grid_main->addWidget( _statusLabel, 3, 0 ); + setLayout( grid_main ); KConfigGroup group( krConfig, "QueueManager"); @@ -170,6 +236,9 @@ move( 20, 20 ); slotUpdateToolbar(); + + connect( QueueManager::instance(), SIGNAL( queueInserted( Queue * ) ), this, SLOT( slotUpdateToolbar() ) ); + show(); _queueDialog = this; @@ -266,10 +335,19 @@ if( currentQueue->isSuspended() ) { _pauseButton->setIcon( KIcon( "media-playback-start" ) ); _pauseButton->setToolTip( i18n( "Start processing the queue" ) ); + QTime time = currentQueue->scheduleTime(); + if( time.isNull() ) + _statusLabel->setText( i18n( "The queue is paused." ) ); + else + _statusLabel->setText( i18n( "Scheduled to start at %1." ) + .arg( time.toString( "hh:mm:ss" ) ) ); } else { + _statusLabel->setText( i18n( "The queue is running." ) ); _pauseButton->setIcon( KIcon( "media-playback-pause" ) ); _pauseButton->setToolTip( i18n( "Pause processing the queue" ) ); } + + _closeTabButton->setEnabled( _queueWidget->count() > 1 ); } } @@ -282,7 +360,49 @@ currentQueue->resume(); else currentQueue->suspend(); + } +} - slotUpdateToolbar(); +void QueueDialog::slotScheduleClicked() +{ + KrTimeDialog dialog( this ); + if( dialog.exec() == QDialog::Accepted ) + { + QTime startTime = dialog.getStartTime(); + Queue * queue = QueueManager::currentQueue(); + queue->schedule( startTime ); } } + +void QueueDialog::slotNewTab() +{ + bool ok = false; + QString queueName = KInputDialog::getText( + i18n("Krusader::Queue Manager"), // Caption + i18n("Please enter the name of the new queue"), // Questiontext + QString(), // Default + &ok, this ); + + if( !ok || queueName.isEmpty() ) + return; + + Queue * queue = QueueManager::createQueue( queueName ); + if( queue == 0 ) { + KMessageBox::error( this, i18n( "A queue already exists with this name!" ) ); + } +} + +void QueueDialog::slotDeleteCurrentTab() +{ + Queue * currentQueue = QueueManager::currentQueue(); + if( currentQueue ) + { + if( currentQueue->count() != 0 ) + { + if( KMessageBox::warningContinueCancel(this, + i18n("Deleting the queue requires aborting all pending jobs. Do you wish to continue?"), + i18n("Warning") ) != KMessageBox::Continue ) return; + } + QueueManager::removeQueue( currentQueue ); + } +} Modified: trunk/krusader_kde4/krusader/Queue/queuedialog.h =================================================================== --- trunk/krusader_kde4/krusader/Queue/queuedialog.h 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queuedialog.h 2008-09-29 19:21:26 UTC (rev 6097) @@ -35,6 +35,9 @@ class QPaintEvent; class QToolButton; +class QueueWidget; +class QLabel; +class QProgressBar; class QueueDialog : public QDialog { @@ -56,6 +59,9 @@ void slotUpdateToolbar(); void slotPauseClicked(); + void slotScheduleClicked(); + void slotNewTab(); + void slotDeleteCurrentTab(); protected: virtual void paintEvent ( QPaintEvent * event ); @@ -67,8 +73,15 @@ private: static QueueDialog * _queueDialog; + QToolButton * _newTabButton; + QToolButton * _closeTabButton; QToolButton * _pauseButton; + QToolButton * _scheduleButton; + QProgressBar * _progressBar; + QueueWidget * _queueWidget; + QLabel * _statusLabel; + QPoint _clickPos; QPoint _startPos; bool _autoHide; Modified: trunk/krusader_kde4/krusader/Queue/queuewidget.cpp =================================================================== --- trunk/krusader_kde4/krusader/Queue/queuewidget.cpp 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queuewidget.cpp 2008-09-29 19:21:26 UTC (rev 6097) @@ -6,8 +6,23 @@ QList<QString> queueList = QueueManager::queues(); foreach( QString name, queueList ) { KrQueueListWidget * jobWidget = new KrQueueListWidget( QueueManager::queue( name ), this ); + connect( jobWidget, SIGNAL( stateChanged() ), this, SIGNAL( currentChanged() ) ); addTab( jobWidget, name ); + _queueWidgets[ name ] = jobWidget; } + + connect( QueueManager::instance(), SIGNAL( queueInserted( Queue * ) ), this, SLOT( slotQueueAdded( Queue * ) ) ); + connect( QueueManager::instance(), SIGNAL( queueDeleted( Queue * ) ), this, SLOT( slotQueueDeleted( Queue * ) ) ); + connect( QueueManager::instance(), SIGNAL( currentChanged( Queue * ) ), this, SLOT( slotCurrentChanged( Queue * ) ) ); + + Queue * current = QueueManager::currentQueue(); + if( current ) + { + QString name = current->name(); + setCurrentWidget( _queueWidgets[ name ] ); + } + + connect( this, SIGNAL( currentChanged ( int ) ), this, SLOT( slotCurrentChanged ( int ) ) ); } @@ -15,11 +30,44 @@ { } +void QueueWidget::slotQueueAdded( Queue * queue ) +{ + KrQueueListWidget * jobWidget = new KrQueueListWidget( queue, this ); + connect( jobWidget, SIGNAL( stateChanged() ), this, SIGNAL( currentChanged() ) ); + addTab( jobWidget, queue->name() ); + _queueWidgets[ queue->name() ] = jobWidget; + setCurrentWidget( jobWidget ); +} +void QueueWidget::slotQueueDeleted( Queue * queue ) +{ + KrQueueListWidget * queueWidget = _queueWidgets[ queue->name() ]; + _queueWidgets.remove( queue->name() ); + int index = indexOf( queueWidget ); + removeTab( index ); + delete queueWidget; +} + +void QueueWidget::slotCurrentChanged( int index ) +{ + KrQueueListWidget * queueWidget = dynamic_cast<KrQueueListWidget *>( widget( index ) ); + if( queueWidget->queue() ) + QueueManager::setCurrentQueue( queueWidget->queue() ); + + emit currentChanged(); +} + +void QueueWidget::slotCurrentChanged( Queue * queue ) +{ + KrQueueListWidget * queueWidget = _queueWidgets[ queue->name() ]; + setCurrentWidget( queueWidget ); +} + KrQueueListWidget::KrQueueListWidget( Queue * queue, QWidget * parent ) : QListWidget( parent ), _queue( queue ) { connect( queue, SIGNAL( changed() ), this, SLOT( slotChanged() ) ); + connect( queue, SIGNAL( stateChanged() ), this, SIGNAL( stateChanged() ) ); slotChanged(); } Modified: trunk/krusader_kde4/krusader/Queue/queuewidget.h =================================================================== --- trunk/krusader_kde4/krusader/Queue/queuewidget.h 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/Queue/queuewidget.h 2008-09-29 19:21:26 UTC (rev 6097) @@ -6,12 +6,26 @@ #include <qlistwidget.h> #include <qpointer.h> +class KrQueueListWidget; + class QueueWidget: public KTabWidget { Q_OBJECT public: QueueWidget( QWidget * parent = 0 ); ~QueueWidget(); + +protected slots: + void slotQueueAdded( Queue * ); + void slotQueueDeleted( Queue * ); + void slotCurrentChanged( Queue * ); + void slotCurrentChanged( int ); + +signals: + void currentChanged(); + +private: + QMap<QString, KrQueueListWidget*> _queueWidgets; }; class KrQueueListWidget : public QListWidget @@ -19,10 +33,14 @@ Q_OBJECT public: KrQueueListWidget( Queue * queue, QWidget * parent ); + Queue * queue() { return _queue; } public slots: void slotChanged(); +signals: + void stateChanged(); + private: QPointer<Queue> _queue; }; Modified: trunk/krusader_kde4/krusader/VFS/kiojobwrapper.cpp =================================================================== --- trunk/krusader_kde4/krusader/VFS/kiojobwrapper.cpp 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/VFS/kiojobwrapper.cpp 2008-09-29 19:21:26 UTC (rev 6097) @@ -207,3 +207,7 @@ m_job->resume(); } +void KIOJobWrapper::abort() { + if( m_job ) + m_job->kill(); +} \ No newline at end of file Modified: trunk/krusader_kde4/krusader/VFS/kiojobwrapper.h =================================================================== --- trunk/krusader_kde4/krusader/VFS/kiojobwrapper.h 2008-09-29 16:01:15 UTC (rev 6096) +++ trunk/krusader_kde4/krusader/VFS/kiojobwrapper.h 2008-09-29 19:21:26 UTC (rev 6097) @@ -82,6 +82,7 @@ void suspend(); void resume(); + void abort(); void connectTo( const char * signal, const QObject * receiver, const char * method ); void setAutoErrorHandlingEnabled( bool err ) { m_autoErrorHandling = err; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |