Skip to content

Commit 0dcff44

Browse files
committedDec 5, 2016
Respect QgsTask::CanCancel flag in gui
1 parent 466b0b9 commit 0dcff44

File tree

4 files changed

+27
-23
lines changed

4 files changed

+27
-23
lines changed
 

‎python/core/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,12 @@ def copy_func(f):
199199

200200
class QgsTaskWrapper(QgsTask):
201201

202-
def __init__(self, description, function, on_finished, *args, **kwargs):
203-
QgsTask.__init__(self, description)
202+
def __init__(self, description, flags, function, on_finished, *args, **kwargs):
203+
QgsTask.__init__(self, description, flags)
204204
self.args = args
205205
self.kwargs = kwargs
206206
self.function = copy_func(function)
207-
self.on_finished = copy_func(on_finished)
207+
self.on_finished = copy_func(on_finished) if on_finished else None
208208
self.returned_values = None
209209
self.exception = None
210210

@@ -235,7 +235,8 @@ def finished(self, result):
235235
self.exception = ex
236236

237237

238-
def fromFunction(cls, description, function, *args, on_finished=None, **kwargs):
239-
return QgsTaskWrapper(description, function, on_finished, *args, **kwargs)
238+
def fromFunction(cls, description, function, *args, on_finished=None, flags=QgsTask.AllFlags, **kwargs):
239+
assert function
240+
return QgsTaskWrapper(description, flags, function, on_finished, *args, **kwargs)
240241

241242
QgsTask.fromFunction = classmethod(fromFunction)

‎src/core/qgstaskmanager.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,22 @@ void QgsTask::run()
8787

8888
void QgsTask::cancel()
8989
{
90-
#if QT_VERSION < 0x050500
91-
//can't cancel with qt < 5.5
92-
return;
93-
#else
90+
if ( mOverallStatus == Complete || mOverallStatus == Terminated )
91+
return;
9492

9593
mShouldTerminate = true;
96-
QThreadPool::globalInstance()->cancel( this );
9794

95+
#if QT_VERSION >= 0x050500
96+
//can't cancel queued tasks with qt < 5.5
97+
QThreadPool::globalInstance()->cancel( this );
9898
if ( mStatus == Queued || mStatus == OnHold )
9999
{
100100
// immediately terminate unstarted jobs
101101
terminated();
102102
}
103-
else if ( mStatus == Terminated )
103+
#endif
104+
105+
if ( mStatus == Terminated )
104106
{
105107
processSubTasksForTermination();
106108
}
@@ -109,7 +111,6 @@ void QgsTask::cancel()
109111
{
110112
subTask.task->cancel();
111113
}
112-
#endif
113114
}
114115

115116
void QgsTask::hold()

‎src/gui/qgstaskmanagerwidget.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ QgsTaskManagerWidget::QgsTaskManagerWidget( QgsTaskManager *manager, QWidget *pa
3737

3838
QVBoxLayout* vLayout = new QVBoxLayout();
3939
vLayout->setMargin( 0 );
40-
#if 0
41-
QToolBar* toolbar = new QToolBar();
42-
toolbar->setIconSize( QSize( 16, 16 ) );
43-
toolbar->addAction( new QAction( "test", this ) );
44-
vLayout->addWidget( toolbar );
45-
#endif
4640
mTreeView = new QTreeView();
4741
mModel = new QgsTaskManagerModel( manager, this );
4842
mTreeView->setModel( mModel );
@@ -54,7 +48,6 @@ QgsTaskManagerWidget::QgsTaskManagerWidget( QgsTaskManager *manager, QWidget *pa
5448

5549
vLayout->addWidget( mTreeView );
5650

57-
5851
setLayout( vLayout );
5952
}
6053

@@ -202,10 +195,11 @@ Qt::ItemFlags QgsTaskManagerModel::flags( const QModelIndex &index ) const
202195
return flags;
203196
}
204197

198+
QgsTask* task = indexToTask( index );
205199
if ( index.column() == Status )
206200
{
207-
//if ( static_cast< QgsTask::TaskStatus >( data( index, StatusRole ).toInt() ) == QgsTask::Running )
208-
flags = flags | Qt::ItemIsEditable;
201+
if ( task && task->canCancel() )
202+
flags = flags | Qt::ItemIsEditable;
209203
}
210204
return flags | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
211205
}
@@ -225,7 +219,7 @@ bool QgsTaskManagerModel::setData( const QModelIndex &index, const QVariant &val
225219
{
226220
case Status:
227221
{
228-
if ( value.toBool() )
222+
if ( value.toBool() && task->canCancel() )
229223
task->cancel();
230224
return true;
231225
}
@@ -388,8 +382,8 @@ QgsTaskManagerFloatingWidget::QgsTaskManagerFloatingWidget( QgsTaskManager *mana
388382
: QgsFloatingWidget( parent )
389383
{
390384
setLayout( new QVBoxLayout() );
391-
setMinimumSize( 250, 150 );
392385
QgsTaskManagerWidget* w = new QgsTaskManagerWidget( manager );
386+
setMinimumSize( w->sizeHint() );
393387
layout()->addWidget( w );
394388
setStyleSheet( ".QgsTaskManagerFloatingWidget { border-top-left-radius: 8px;"
395389
"border-top-right-radius: 8px; background-color: rgb(0, 0, 0, 70%); }" );

‎tests/src/python/test_qgstaskmanager.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ def testTaskFromFunction(self):
110110
self.assertTrue(bad_task.exception)
111111
self.assertEqual(bad_task.status(), QgsTask.Terminated)
112112

113+
def testTaskFromFunctionWithFlags(self):
114+
""" test creating task from function with flags"""
115+
116+
task = QgsTask.fromFunction('test task', run, 20, flags=QgsTask.Flags())
117+
self.assertFalse(task.canCancel())
118+
task2 = QgsTask.fromFunction('test task', run, 20, flags=QgsTask.CanCancel)
119+
self.assertTrue(task2.canCancel())
120+
113121
def testTaskFromFunctionWithKwargs(self):
114122
""" test creating task from function using kwargs """
115123

0 commit comments

Comments
 (0)
Please sign in to comment.