From 04fe94210f4e17514631791760cbf3007a4d409a Mon Sep 17 00:00:00 2001 From: Alex Merry Date: Thu, 14 Jun 2012 17:14:30 +0100 Subject: Re-render bend incident edges when node style changes The node shape affects where edges terminate. This affects the shape of bent edges. --- tikzit/src/common/Edge.m | 33 +++++++++++++++++++++++++-------- tikzit/src/gtk/GraphRenderer.m | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/tikzit/src/common/Edge.m b/tikzit/src/common/Edge.m index ab1aea6..0da38db 100644 --- a/tikzit/src/common/Edge.m +++ b/tikzit/src/common/Edge.m @@ -308,6 +308,9 @@ - (Node*)source {return source;} - (void)setSource:(Node *)s { if (source != s) { + [source removeObserver:self + forKeyPath:@"style"]; + [source release]; source = [s retain]; @@ -315,6 +318,11 @@ bendMode = EdgeBendModeInOut; weight = 1.0f; } + + [source addObserver:self + forKeyPath:@"style" + options:NSKeyValueObservingOptionNew + context:NULL]; dirty = YES; } @@ -323,6 +331,9 @@ - (Node*)target {return target;} - (void)setTarget:(Node *)t { if (target != t) { + [target removeObserver:self + forKeyPath:@"style"]; + [target release]; target = [t retain]; @@ -330,46 +341,52 @@ bendMode = EdgeBendModeInOut; weight = 1.0f; } + + [target addObserver:self + forKeyPath:@"style" + options:NSKeyValueObservingOptionNew + context:NULL]; dirty = YES; } } +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context + +{ + dirty = YES; +} + // edgeNode and hasEdgeNode use a bit of key-value observing to help the mac GUI keep up - (Node*)edgeNode {return edgeNode;} - (void)setEdgeNode:(Node *)n { -#if defined (__APPLE__) [self willChangeValueForKey:@"edgeNode"]; [self willChangeValueForKey:@"hasEdgeNode"]; -#endif if (edgeNode != n) { hasEdgeNode = (n != nil); [edgeNode release]; edgeNode = [n retain]; // don't set dirty bit, because control points don't need update } -#if defined (__APPLE__) [self didChangeValueForKey:@"edgeNode"]; [self didChangeValueForKey:@"hasEdgeNode"]; -#endif } - (BOOL)hasEdgeNode { return hasEdgeNode; } - (void)setHasEdgeNode:(BOOL)b { -#if defined (__APPLE__) [self willChangeValueForKey:@"edgeNode"]; [self willChangeValueForKey:@"hasEdgeNode"]; -#endif hasEdgeNode = b; if (hasEdgeNode && edgeNode == nil) { edgeNode = [[Node alloc] init]; } -#if defined (__APPLE__) [self didChangeValueForKey:@"edgeNode"]; [self didChangeValueForKey:@"hasEdgeNode"]; -#endif } @synthesize data; diff --git a/tikzit/src/gtk/GraphRenderer.m b/tikzit/src/gtk/GraphRenderer.m index 9b91728..3fc14d6 100644 --- a/tikzit/src/gtk/GraphRenderer.m +++ b/tikzit/src/gtk/GraphRenderer.m @@ -531,6 +531,19 @@ void graph_renderer_expose_event(GtkWidget *widget, GdkEventExpose *event); [self invalidateGraph]; } +- (void) invalidateBentIncidentEdgesForNode:(Node*)nd { + for (Edge *e in [[self graph] inEdgesForNode:nd]) { + if (![e isStraight]) { + [self invalidateEdge:e]; + } + } + for (Edge *e in [[self graph] outEdgesForNode:nd]) { + if (![e isStraight]) { + [self invalidateEdge:e]; + } + } +} + - (void) graphChanged:(NSNotification*)notification { GraphChange *change = [[notification userInfo] objectForKey:@"change"]; switch ([change changeType]) { @@ -543,6 +556,14 @@ void graph_renderer_expose_event(GtkWidget *widget, GdkEventExpose *event); if (!NSEqualPoints ([[change oldNode] point], [[change nwNode] point])) { // if the node has moved, it may be affecting edges [surface invalidate]; + } else if ([[change oldNode] style] != [[change nwNode] style]) { + NSLog(@"Style change"); + // change in style means that edges may touch at a different point, + // but this only matters for bent edges + [self invalidateBentIncidentEdgesForNode:[change nodeRef]]; + // invalide both old and new (old node may be larger) + [self invalidateNode:[change oldNode]]; + [self invalidateNode:[change nwNode]]; } else { // invalide both old and new (old node may be larger) [self invalidateNode:[change oldNode]]; @@ -562,12 +583,19 @@ void graph_renderer_expose_event(GtkWidget *widget, GdkEventExpose *event); while ((node = [enumerator nextObject]) != nil) { NSPoint oldPos = [[[change oldNodeTable] objectForKey:node] point]; NSPoint newPos = [[[change nwNodeTable] objectForKey:node] point]; - if (NSEqualPoints (oldPos, newPos)) { + NodeStyle *oldStyle = [[[change oldNodeTable] objectForKey:node] style]; + NodeStyle *newStyle = [[[change nwNodeTable] objectForKey:node] style]; + if (!NSEqualPoints (oldPos, newPos)) { + [surface invalidate]; + break; + } else if (oldStyle != newStyle) { + NSLog(@"Style change (2)"); + [self invalidateBentIncidentEdgesForNode:node]; [self invalidateNode:[[change oldNodeTable] objectForKey:node]]; [self invalidateNode:[[change nwNodeTable] objectForKey:node]]; } else { - [surface invalidate]; - break; + [self invalidateNode:[[change oldNodeTable] objectForKey:node]]; + [self invalidateNode:[[change nwNodeTable] objectForKey:node]]; } } } -- cgit v1.2.3