diff --git a/libtaskmanager/abstractgroupingstrategy.cpp b/libtaskmanager/abstractgroupingstrategy.cpp index f4b1fd1d0..5dad8595f 100644 --- a/libtaskmanager/abstractgroupingstrategy.cpp +++ b/libtaskmanager/abstractgroupingstrategy.cpp @@ -34,13 +34,15 @@ class AbstractGroupingStrategy::Private { public: Private() - : type(GroupManager::NoGrouping) { + : type(GroupManager::NoGrouping) + , destroyGroupsOnDestruction(true) { } GroupManager *groupManager; QStringList usedNames; QList createdGroups; GroupManager::TaskGroupingStrategy type; + bool destroyGroupsOnDestruction : 1; }; AbstractGroupingStrategy::AbstractGroupingStrategy(GroupManager *groupManager) @@ -52,17 +54,26 @@ AbstractGroupingStrategy::AbstractGroupingStrategy(GroupManager *groupManager) AbstractGroupingStrategy::~AbstractGroupingStrategy() { - destroy(); - qDeleteAll(d->createdGroups); + if (d->destroyGroupsOnDestruction) { + destroyGroups(); + qDeleteAll(d->createdGroups); + } + delete d; } -void AbstractGroupingStrategy::destroy() +bool AbstractGroupingStrategy::destroyGroupsOnDestruction() const { - if (!d->groupManager) { - return; - } + return d->destroyGroupsOnDestruction; +} +void AbstractGroupingStrategy::setDestroyGroupsOnDestruction(bool destroy) +{ + d->destroyGroupsOnDestruction = destroy; +} + +void AbstractGroupingStrategy::destroyGroups() +{ // cleanup all created groups foreach (TaskGroup * group, d->createdGroups) { disconnect(group, 0, this, 0); @@ -84,9 +95,6 @@ void AbstractGroupingStrategy::destroy() foreach (TaskGroup * group, d->createdGroups) { emit groupRemoved(group); } - - d->groupManager = 0; - deleteLater(); } GroupManager::TaskGroupingStrategy AbstractGroupingStrategy::type() const diff --git a/libtaskmanager/abstractgroupingstrategy.h b/libtaskmanager/abstractgroupingstrategy.h index 45cdd6932..d90de2a57 100644 --- a/libtaskmanager/abstractgroupingstrategy.h +++ b/libtaskmanager/abstractgroupingstrategy.h @@ -47,7 +47,23 @@ public: AbstractGroupingStrategy(GroupManager *groupManager); virtual ~AbstractGroupingStrategy(); - void destroy(); + /** + * Whether the grouping strategy will undo the current group topology + * when it is destroyed. + * + * See also destroyGroups(). + */ + bool destroyGroupsOnDestruction() const; + + /** + * Setting this to false prevents the grouping strategy from undoing + * the current group toplogy when it is destroyed. This is mostly + * useful to avoid unnecessary work during shutdown. + * + * See also destroyGroups(). + */ + void setDestroyGroupsOnDestruction(bool destroy); + /** Handles a new item */ virtual void handleItem(AbstractGroupableItem *) = 0; @@ -106,6 +122,9 @@ Q_SIGNALS: void groupRemoved(TaskGroup*); protected Q_SLOTS: + /** Uncollapse all groups into the root group. */ + void destroyGroups(); + /** Adds all group members to the parentgroup of group and removes the group */ virtual void closeGroup(TaskGroup *group); diff --git a/libtaskmanager/groupmanager.cpp b/libtaskmanager/groupmanager.cpp index 12da0998f..657a35c11 100644 --- a/libtaskmanager/groupmanager.cpp +++ b/libtaskmanager/groupmanager.cpp @@ -172,8 +172,12 @@ GroupManager::GroupManager(QObject *parent) GroupManager::~GroupManager() { TaskManager::self()->setTrackGeometry(false, d->configToken); + delete d->abstractSortingStrategy; + + d->abstractGroupingStrategy->setDestroyGroupsOnDestruction(false); delete d->abstractGroupingStrategy; + delete d; } @@ -1256,7 +1260,7 @@ void GroupManager::setGroupingStrategy(TaskGroupingStrategy strategy) if (d->abstractGroupingStrategy) { disconnect(d->abstractGroupingStrategy, 0, this, 0); - d->abstractGroupingStrategy->destroy(); + delete d->abstractGroupingStrategy; d->abstractGroupingStrategy = 0; }