From dd2cb16ab43d21ee25ba6ebfb36cd68ec9879c4f Mon Sep 17 00:00:00 2001 From: Dag Andersen Date: Mon, 12 Dec 2016 10:07:38 +0100 Subject: Plan: Fix crash on close Due to accessing project node during delete BUG: 373527 FIXED-IN: 3.0.0 --- plan/libs/kernel/kptnode.cpp | 14 ++++++++++++-- plan/libs/kernel/kptnode.h | 5 ++++- plan/libs/kernel/kptproject.cpp | 11 ++++++++++- plan/libs/kernel/kptresource.cpp | 20 ++++++++++++++++---- plan/libs/kernel/kptresource.h | 7 ++++++- 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/plan/libs/kernel/kptnode.cpp b/plan/libs/kernel/kptnode.cpp index d8b0e6b..e55f9ca 100644 --- a/plan/libs/kernel/kptnode.cpp +++ b/plan/libs/kernel/kptnode.cpp @@ -40,7 +40,8 @@ namespace KPlato Node::Node(Node *parent) : QObject( 0 ), // We don't use qobjects parent m_nodes(), m_dependChildNodes(), m_dependParentNodes(), - m_estimate( 0 ) + m_estimate( 0 ), + m_blockChanged(false) { //debugPlan<<"("<blockChanged(); + } + for (Resource *r : resourceIdDict) { + r->blockChanged(); + } + for (ResourceGroup *g : resourceGroupIdDict) { + g->blockChanged(); + } delete m_standardWorktime; while ( !m_resourceGroups.isEmpty() ) delete m_resourceGroups.takeFirst(); diff --git a/plan/libs/kernel/kptresource.cpp b/plan/libs/kernel/kptresource.cpp index 8a3d55e..b32d4e7 100644 --- a/plan/libs/kernel/kptresource.cpp +++ b/plan/libs/kernel/kptresource.cpp @@ -44,7 +44,8 @@ namespace KPlato { ResourceGroup::ResourceGroup() - : QObject( 0 ) + : QObject( 0 ), + m_blockChanged(false) { m_project = 0; m_type = Type_Work; @@ -80,8 +81,13 @@ void ResourceGroup::copy( const ResourceGroup *group ) m_name = group->m_name; } +void ResourceGroup::blockChanged(bool on) +{ + m_blockChanged = on; +} + void ResourceGroup::changed() { - if ( m_project ) { + if (m_project && !m_blockChanged) { m_project->changed( this ); } } @@ -319,7 +325,8 @@ Resource::Resource() m_project(0), m_parent( 0 ), m_autoAllocate( false ), - m_currentSchedule( 0 ) + m_currentSchedule( 0 ), + m_blockChanged(false) { m_type = Type_Work; m_units = 100; // % @@ -409,9 +416,14 @@ void Resource::copy(Resource *resource) { //m_externalNames = resource->m_externalNames; } +void Resource::blockChanged(bool on) +{ + m_blockChanged = on; +} + void Resource::changed() { - if ( m_project ) { + if (m_project && !m_blockChanged) { m_project->changed( this ); } } diff --git a/plan/libs/kernel/kptresource.h b/plan/libs/kernel/kptresource.h index 10f6b92..fba020a 100644 --- a/plan/libs/kernel/kptresource.h +++ b/plan/libs/kernel/kptresource.h @@ -177,6 +177,8 @@ public: DateTime startTime( long id ) const; DateTime endTime( long id ) const; + void blockChanged(bool on = true); + #ifndef NDEBUG void printDebug( const QString& ident ); @@ -199,7 +201,7 @@ private: Type m_type; QList m_requests; - + bool m_blockChanged; }; /** @@ -492,6 +494,8 @@ public: /// Set the @p account void setAccount( Account *account ); + void blockChanged(bool on = true); + // for xml loading code class WorkInfoCache @@ -564,6 +568,7 @@ private: // return this if resource has no calendar and is a material resource Calendar m_materialCalendar; + bool m_blockChanged; #ifndef NDEBUG public: -- cgit v0.11.2