You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.2 KiB
200 lines
5.2 KiB
From dd2cb16ab43d21ee25ba6ebfb36cd68ec9879c4f Mon Sep 17 00:00:00 2001
|
|
From: Dag Andersen <danders@get2net.dk>
|
|
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<<"("<<this<<")";
|
|
m_parent = parent;
|
|
@@ -53,7 +54,8 @@ Node::Node(const Node &node, Node *parent)
|
|
m_nodes(),
|
|
m_dependChildNodes(),
|
|
m_dependParentNodes(),
|
|
- m_estimate( 0 )
|
|
+ m_estimate( 0 ),
|
|
+ m_blockChanged(false)
|
|
{
|
|
//debugPlan<<"("<<this<<")";
|
|
m_parent = parent;
|
|
@@ -1225,7 +1227,15 @@ void Node::setRunningAccount(Account *acc)
|
|
changed();
|
|
}
|
|
|
|
+void Node::blockChanged(bool on)
|
|
+{
|
|
+ m_blockChanged = on;
|
|
+}
|
|
+
|
|
void Node::changed(Node *node, int property) {
|
|
+ if (m_blockChanged) {
|
|
+ return;
|
|
+ }
|
|
switch ( property) {
|
|
case Type:
|
|
case StartupCost:
|
|
diff --git a/plan/libs/kernel/kptnode.h b/plan/libs/kernel/kptnode.h
|
|
index cfcbd3e..4c98acc 100644
|
|
--- a/plan/libs/kernel/kptnode.h
|
|
+++ b/plan/libs/kernel/kptnode.h
|
|
@@ -528,6 +528,8 @@ public:
|
|
virtual void emitDocumentRemoved( Node *node, Document *doc, int idx );
|
|
virtual void emitDocumentChanged( Node *node, Document *doc, int idx );
|
|
|
|
+ void blockChanged(bool on = true);
|
|
+
|
|
public:
|
|
// These shouldn't be available to other than those who inherits
|
|
/// Calculate the critical path
|
|
@@ -673,7 +675,8 @@ protected:
|
|
ResourceRequestCollection m_requests;
|
|
|
|
private:
|
|
- void init();
|
|
+ void init();
|
|
+ bool m_blockChanged;
|
|
};
|
|
|
|
//////////////////////////////// Estimate ////////////////////////////////
|
|
diff --git a/plan/libs/kernel/kptproject.cpp b/plan/libs/kernel/kptproject.cpp
|
|
index 30cd450..d2fafb5 100644
|
|
--- a/plan/libs/kernel/kptproject.cpp
|
|
+++ b/plan/libs/kernel/kptproject.cpp
|
|
@@ -94,7 +94,16 @@ void Project::deref()
|
|
Project::~Project()
|
|
{
|
|
debugPlan;
|
|
- disconnect(); // NOTE: may be a problem if somebody uses the destroyd() signal
|
|
+ disconnect();
|
|
+ for(Node *n : nodeIdDict) {
|
|
+ n->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<ResourceGroupRequest*> 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
|
|
|