35824 Commits

Author SHA1 Message Date
Nyall Dawson
466b0b96b7 Tasks are treated as progressless until they first report a progress 2016-12-05 14:08:11 +10:00
Nyall Dawson
4dc3dd9077 Allow task priority to be specified 2016-12-05 14:08:11 +10:00
Nyall Dawson
9b763741b8 QThreadPool::cancel was introduced in Qt5.5, so no cancellation
possible for Qt < 5.5

Moral of the story: if you run outdated libraries, you can't
expect full functionality from your apps ;)
2016-12-05 14:08:11 +10:00
Nyall Dawson
5216220872 Fix more racy conditions
Switch from QtConcurrent::run to QThreadPool::start

QtConcurrent doesn't give us anyway to cancel queued but not
started tasks. QThreadPool does (and also allows us to specify
task priority)
2016-12-05 14:08:11 +10:00
Nyall Dawson
01d6afaf2c Avoid recursive locks 2016-12-05 14:08:11 +10:00
Nyall Dawson
14b6b3f6ee Harden everything up
And finally fix a racy condition which has been plaguing me for
ages
2016-12-05 14:08:11 +10:00
Nyall Dawson
32a9e1e9d6 QgsTasks can have subtasks
Now, a QgsTask can have subtask QgsTasks set by calling
QgsTask::addSubTask. Sub tasks can have their own set of
dependent tasks.

Subtasks are not visible to users, and users only see the overall
progress and status of the parent task.

This allows creation of tasks which are themselves built off
many smaller component tasks. The task manager will still handle
firing up and scheduling the subtasks, so eg subtasks can run
in parallel (if their dependancies allow this).

Subtasks can themselves have subtasks.

This change is designed to allow the processing concept of
algorithms and modeller algorithms to be translatable
directly to the task manager architecture.
2016-12-05 14:08:11 +10:00
Nyall Dawson
3999a3710f Remove QgsTaskManager singleton, and instead attach an instance
to QgsApplication.

ie instead of QgsTaskManager.instance(), use
QgsApplication.taskManager()
2016-12-05 14:08:11 +10:00
Nyall Dawson
b6b7a7f8c6 Remove delete* methods from QgsTaskManager API
On further consideration allowing external control of task
deletion is a bad idea.
2016-12-05 14:08:11 +10:00
Nyall Dawson
ad71dc443d Fix failing tests 2016-12-05 14:08:11 +10:00
Nyall Dawson
6d4392a0f7 Allow QgsTask subclasses to defined a finished function, which is
called when the task has completed (successfully or otherwise).

This allows for simpler task design when the signal/slot
based approach is not required. Just implement run() with your
heavy lifting, and finished() to do whatever follow up stuff
should happen after the task is complete. finished is always
called from the main thread, so it's safe to do GUI operations
here.

Python based tasks using the simplified QgsTask.fromFunction
approach can now set a on_finished argument to a function
to call when the task is complete.

eg:

def calculate(task):
    # pretend this is some complex maths and stuff we want
    # to run in the background
    return 5*6

def calculation_finished(result, value=None):
    if result == QgsTask.ResultSuccess:
	iface.messageBar().pushMessage(
            'the magic number is {}'.format(value))
    elif result == QgsTask.ResultFail:
        iface.messageBar().pushMessage(
            'couldn\'t work it out, sorry')

task = QgsTask.fromFunction('my task', calculate,
		on_finished=calculation_finished)
QgsTaskManager.instance().addTask(task)

Multiple values can also be returned, eg:

def calculate(task):
    return (4, 8, 15)

def calculation_finished(result, count=None, max=None, sum=None):
    # here:
    # count = 4
    # max = 8
    # sum = 15

task = QgsTask.fromFunction('my task', calculate,
		on_finished=calculation_finished)
QgsTaskManager.instance().addTask(task)
2016-12-05 14:08:11 +10:00
Nyall Dawson
252f2e1102 Rename overloaded signal, flip remaining connects to new style 2016-12-05 14:08:11 +10:00
Nyall Dawson
f71c78e14f Rename stopped to terminated for consistency 2016-12-05 14:08:11 +10:00
Nyall Dawson
e01c306edb Simplify reporting completion of tasks
QgsTask subclasses can now return a result (success or fail)
directly from QgsTask::run. If they do so then there's no
need for them to manually call completed() or stopped()
to report their completion.

Alternatively, tasks can also return the ResultPending value
to indicate that the task is still operating and will
manually report its completion by calling completed() or
stopped(). This may be useful for tasks which rely on external
events for completion, eg downloading a file. In this case
Qt slots could be created which are connected to the download
completion or termination and which call completed() or
stopped() to indicate the task has finished operations.
2016-12-05 14:08:11 +10:00
Nyall Dawson
2590f685fe Documentation updates and small API cleanups 2016-12-05 14:08:11 +10:00
Nyall Dawson
bc37b40179 Smaller header updates, switch connect style 2016-12-05 14:08:11 +10:00
Nyall Dawson
95dbb3a7e3 Add deleteAllTasks to manager 2016-12-05 14:08:11 +10:00
Nyall Dawson
b64025df5c Add python test for task manager 2016-12-05 14:08:11 +10:00
Nyall Dawson
d270b4f9c2 Improvements to task manager ui 2016-12-05 14:08:11 +10:00
Nyall Dawson
5da25136a6 New QgsFloatingWidget widget for easy creation of widgets which "float"
above a layout.

Supports setting another widget as a anchor point for the widget, eg
the floating widget could be set so that it's always placed to the
top-right of the anchor widget.
2016-12-05 14:08:11 +10:00
Nyall Dawson
f85d24e9c7 Fix some crashes 2016-12-05 14:08:11 +10:00
Nyall Dawson
55e9d32671 Add handling of dependent layers to task manager
If a task has dependent layers which are about to be removed,
the task will automatically be cancelled
2016-12-05 14:08:11 +10:00
Nyall Dawson
eb34079c01 Don't crash when python exceptions occur in non-main thread 2016-12-05 14:08:11 +10:00
Nyall Dawson
4c0f4ee6f0 Resolve circular dependencies 2016-12-05 14:08:11 +10:00
Nyall Dawson
b065edeed7 Improvements to QgsTaskWrapper 2016-12-05 14:08:11 +10:00
Nyall Dawson
4291904c8d Support for dependent tasks
Cancelling a task on which others depend leads to all these other
tasks getting cancelled as well.
2016-12-05 14:08:11 +10:00
Nyall Dawson
73e72fa590 Don't block when deleting tasks 2016-12-05 14:08:10 +10:00
Nyall Dawson
dcecf4476f Add support for placing queued tasks on hold 2016-12-05 14:08:10 +10:00
Nyall Dawson
cf5eeb758b API cleanups 2016-12-05 14:08:10 +10:00
Nyall Dawson
5d4689294d Add simple python method QgsTask.fromFunction for creation of tasks
from a function without having to create a QgsTask subclass
2016-12-05 14:08:10 +10:00
Nyall Dawson
e29dd79432 Api + test cleanups 2016-12-05 14:08:10 +10:00
Nyall Dawson
6021d7806e Make QgsTaskManager handle threading of tasks 2016-12-05 14:08:10 +10:00
Nyall Dawson
ebae15f23a Framework for task manager
Adds new classes:
- QgsTask. An interface for long-running background tasks
- QgsTaskManager. Handles groups of tasks - also available as a global
instance for tracking application wide tasks
- QgsTaskManagerWidget. A list view for showing active tasks and their
progress, and for cancelling them

A new dock widget has been added with a task manager widget showing
global tasks
2016-12-05 14:08:10 +10:00
Nyall Dawson
dc697d0590 Followup 59a0e2 2016-12-05 11:23:23 +10:00
mj10777
59a0e2fb88 Fix #15829 georeferencer - resolve logical error during loadGCPs 2016-12-05 11:09:24 +10:00
Nyall Dawson
be4c8156c6 Merge pull request #3787 from nyalldawson/spatialite_index
[FEATURE] Create attribute index support for spatialite provider
2016-12-05 10:54:19 +10:00
Nyall Dawson
5f13cbe37b Blacklist flaky PyQgsAuthManagerPKIOWSTest test 2016-12-05 10:26:00 +10:00
Nyall Dawson
c800998df3 Remove goto's from qgsspatialiteprovider.cpp 2016-12-05 10:22:29 +10:00
Nyall Dawson
bd8d2121dc [FEATURE] Create attribute index support for spatialite provider
Allows creation of attribute indexes for spatialite layers
2016-12-05 10:22:29 +10:00
Nyall Dawson
6a61179451 Disable a bunch of actions which don't apply to vector layers
without geometry (fix #15933)
2016-12-05 09:53:07 +10:00
Nyall Dawson
e9274475f8 Remove unused network header includes from qgsgeometry.cpp 2016-12-05 08:54:35 +10:00
Mathieu Pellerin
08ee1806a6 [FEATURE] cpt-city catalog support in color ramp's gradient-only mode (#3832)
cpt-city catalog ramps are now available for gradient-only:
- shapeburst fill
- gradient fill
- inner/outer glow effect
2016-12-04 11:39:41 +07:00
Mathieu Pellerin
e94a352e08 [color ramp] improve invert() for discrete gradient ramps (#3833) 2016-12-04 11:34:16 +07:00
Mathieu Pellerin
e135e79770 Merge pull request #3827 from nirvn/color_ramp_migration
Migration of remaining color ramp widgets
2016-12-03 14:16:33 +07:00
nirvn
6009f5a41d [raster] fix singleband pseudo-color crash on single-color color presets ramp 2016-12-03 14:12:30 +07:00
nirvn
137a211bae [color ramp] do not automatically save new ramps 2016-12-03 14:12:16 +07:00
nirvn
4a5876854c [style manager] update ramp type naming button shortcuts 2016-12-03 14:04:09 +07:00
Mathieu Pellerin
a26434e8bd Merge pull request #3829 from nirvn/colorrampbutton_save
- [FEATURE] save existing color ramp function
- improve new color ramp type naming
2016-12-03 13:41:46 +07:00
nirvn
0b9fbeb983 QgsColorRampComboBox is dead, long live QgsColorRampButton 2016-12-03 13:40:27 +07:00
nirvn
56c5534455 [symblogy] migrate heatmap renderer color ramp widget 2016-12-03 13:40:27 +07:00