More explicit approach to grouping strategy destruction vs. group uncollapse.

Avoids ungrouping while GroupManager is destroyed and unnecessary
work in connected visualizations, and in practice a crash in Task
Manager from the ungroup model transaction hitting a half-destroyed
applet.

BUG:334772
wilder-5.14
Eike Hein 12 years ago
parent 2a50ef4658
commit c663371e29
  1. 28
      libtaskmanager/abstractgroupingstrategy.cpp
  2. 21
      libtaskmanager/abstractgroupingstrategy.h
  3. 6
      libtaskmanager/groupmanager.cpp

@ -34,13 +34,15 @@ class AbstractGroupingStrategy::Private
{ {
public: public:
Private() Private()
: type(GroupManager::NoGrouping) { : type(GroupManager::NoGrouping)
, destroyGroupsOnDestruction(true) {
} }
GroupManager *groupManager; GroupManager *groupManager;
QStringList usedNames; QStringList usedNames;
QList<TaskGroup*> createdGroups; QList<TaskGroup*> createdGroups;
GroupManager::TaskGroupingStrategy type; GroupManager::TaskGroupingStrategy type;
bool destroyGroupsOnDestruction : 1;
}; };
AbstractGroupingStrategy::AbstractGroupingStrategy(GroupManager *groupManager) AbstractGroupingStrategy::AbstractGroupingStrategy(GroupManager *groupManager)
@ -52,17 +54,26 @@ AbstractGroupingStrategy::AbstractGroupingStrategy(GroupManager *groupManager)
AbstractGroupingStrategy::~AbstractGroupingStrategy() AbstractGroupingStrategy::~AbstractGroupingStrategy()
{ {
destroy(); if (d->destroyGroupsOnDestruction) {
qDeleteAll(d->createdGroups); destroyGroups();
qDeleteAll(d->createdGroups);
}
delete d; delete d;
} }
void AbstractGroupingStrategy::destroy() bool AbstractGroupingStrategy::destroyGroupsOnDestruction() const
{ {
if (!d->groupManager) { return d->destroyGroupsOnDestruction;
return; }
}
void AbstractGroupingStrategy::setDestroyGroupsOnDestruction(bool destroy)
{
d->destroyGroupsOnDestruction = destroy;
}
void AbstractGroupingStrategy::destroyGroups()
{
// cleanup all created groups // cleanup all created groups
foreach (TaskGroup * group, d->createdGroups) { foreach (TaskGroup * group, d->createdGroups) {
disconnect(group, 0, this, 0); disconnect(group, 0, this, 0);
@ -84,9 +95,6 @@ void AbstractGroupingStrategy::destroy()
foreach (TaskGroup * group, d->createdGroups) { foreach (TaskGroup * group, d->createdGroups) {
emit groupRemoved(group); emit groupRemoved(group);
} }
d->groupManager = 0;
deleteLater();
} }
GroupManager::TaskGroupingStrategy AbstractGroupingStrategy::type() const GroupManager::TaskGroupingStrategy AbstractGroupingStrategy::type() const

@ -47,7 +47,23 @@ public:
AbstractGroupingStrategy(GroupManager *groupManager); AbstractGroupingStrategy(GroupManager *groupManager);
virtual ~AbstractGroupingStrategy(); 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 */ /** Handles a new item */
virtual void handleItem(AbstractGroupableItem *) = 0; virtual void handleItem(AbstractGroupableItem *) = 0;
@ -106,6 +122,9 @@ Q_SIGNALS:
void groupRemoved(TaskGroup*); void groupRemoved(TaskGroup*);
protected Q_SLOTS: 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 */ /** Adds all group members to the parentgroup of group and removes the group */
virtual void closeGroup(TaskGroup *group); virtual void closeGroup(TaskGroup *group);

@ -172,8 +172,12 @@ GroupManager::GroupManager(QObject *parent)
GroupManager::~GroupManager() GroupManager::~GroupManager()
{ {
TaskManager::self()->setTrackGeometry(false, d->configToken); TaskManager::self()->setTrackGeometry(false, d->configToken);
delete d->abstractSortingStrategy; delete d->abstractSortingStrategy;
d->abstractGroupingStrategy->setDestroyGroupsOnDestruction(false);
delete d->abstractGroupingStrategy; delete d->abstractGroupingStrategy;
delete d; delete d;
} }
@ -1256,7 +1260,7 @@ void GroupManager::setGroupingStrategy(TaskGroupingStrategy strategy)
if (d->abstractGroupingStrategy) { if (d->abstractGroupingStrategy) {
disconnect(d->abstractGroupingStrategy, 0, this, 0); disconnect(d->abstractGroupingStrategy, 0, this, 0);
d->abstractGroupingStrategy->destroy(); delete d->abstractGroupingStrategy;
d->abstractGroupingStrategy = 0; d->abstractGroupingStrategy = 0;
} }

Loading…
Cancel
Save