From 9ff258a631d9118828768a4a0bcec4a7fb2004a3 Mon Sep 17 00:00:00 2001 From: Alex Merry Date: Fri, 7 Dec 2012 00:28:18 +0000 Subject: Only discard selection when switching to another tool Before, the selection was discarded even when another window grabbed the tool. --- tikzit/src/gtk/GraphEditorPanel.m | 3 + tikzit/src/gtk/SelectTool.m | 116 +++++++++++++++++++------------------- 2 files changed, 61 insertions(+), 58 deletions(-) diff --git a/tikzit/src/gtk/GraphEditorPanel.m b/tikzit/src/gtk/GraphEditorPanel.m index 6d98fa5..922322e 100644 --- a/tikzit/src/gtk/GraphEditorPanel.m +++ b/tikzit/src/gtk/GraphEditorPanel.m @@ -78,6 +78,9 @@ if (t == tool) return; + [[[renderer document] pickSupport] deselectAllNodes]; + [[[renderer document] pickSupport] deselectAllEdges]; + BOOL hadOldTool = ([tool activeRenderer] == renderer); id oldTool = tool; diff --git a/tikzit/src/gtk/SelectTool.m b/tikzit/src/gtk/SelectTool.m index 2501935..6e9bf9f 100644 --- a/tikzit/src/gtk/SelectTool.m +++ b/tikzit/src/gtk/SelectTool.m @@ -79,8 +79,6 @@ static const InputMask unionSelectMask = ShiftMask; if (r == renderer) return; - [self deselectAll]; - [r retain]; [renderer release]; renderer = r; @@ -110,8 +108,7 @@ static const InputMask unionSelectMask = ShiftMask; if (leaderNode != nil) { BOOL alreadySelected = [[self doc] isNodeSelected:leaderNode]; if (!unionSelect && !alreadySelected) { - [self deselectAllEdges]; - [self deselectAllNodes]; + [self deselectAll]; } if (unionSelect && alreadySelected) { state = ToggleSelectState; @@ -142,64 +139,13 @@ static const InputMask unionSelectMask = ShiftMask; [self deselectAll]; } [selectionBoxContents removeAllObjects]; + [renderer clearHighlightedNodes]; state = SelectBoxState; } } } } -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - if (state == SelectBoxState) { - BOOL shouldDeselect = !(mask & unionSelectMask); - if (shouldDeselect) { - [self deselectAllEdges]; - } - [[[self doc] pickSupport] selectAllNodes:selectionBoxContents - replacingSelection:shouldDeselect]; - [self clearSelectionBox]; - } else if (state == ToggleSelectState) { - [[[self doc] pickSupport] deselectNode:leaderNode]; - leaderNode = nil; - } else if (state == MoveSelectedNodesState) { - if (NSEqualPoints (oldLeaderPos, [leaderNode point])) { - [[self doc] cancelShiftNodes]; - } else { - [[self doc] endShiftNodes]; - } - leaderNode = nil; - } else if (state == DragEdgeControlPoint1 || state == DragEdgeControlPoint2) { - // FIXME: check if there was any real change - [[self doc] endModifyEdge]; - } -} - -- (void) mouseDoubleClickAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - if (state != QuietState) { - return; - } - // convert bend mode on edge under mouse cursor - Edge *edge = [renderer anyEdgeAt:pos withFuzz:edgeFuzz]; - if (edge != nil) { - [[self doc] startModifyEdge:edge]; - if ([edge bendMode]==EdgeBendModeBasic) { - [edge convertBendToAngles]; - [edge setBendMode:EdgeBendModeInOut]; - } else { - [edge setBendMode:EdgeBendModeBasic]; - } - [[self doc] endModifyEdge]; - - [self deselectAllEdges]; - [[[self doc] pickSupport] selectEdge:edge]; - } -} - - (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)buttons andMask:(InputMask)mask { if (!(buttons & LeftButton)) return; @@ -222,12 +168,12 @@ static const InputMask unionSelectMask = ShiftMask; if (NSPointInRect(nodePos, selectionBox)) { if (![selectionBoxContents member:node]) { [selectionBoxContents addObject:node]; - [renderer invalidateNode:node]; + [renderer setNode:node highlighted:YES]; } } else { if ([selectionBoxContents member:node]) { [selectionBoxContents removeObject:node]; - [renderer invalidateNode:node]; + [renderer setNode:node highlighted:NO]; } } } @@ -258,6 +204,58 @@ static const InputMask unionSelectMask = ShiftMask; } } +- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { + if (button != LeftButton) + return; + + if (state == SelectBoxState) { + BOOL shouldDeselect = !(mask & unionSelectMask); + if (shouldDeselect) { + [self deselectAllEdges]; + } + [[[self doc] pickSupport] selectAllNodes:selectionBoxContents + replacingSelection:shouldDeselect]; + [self clearSelectionBox]; + } else if (state == ToggleSelectState) { + [[[self doc] pickSupport] deselectNode:leaderNode]; + leaderNode = nil; + } else if (state == MoveSelectedNodesState) { + if (NSEqualPoints (oldLeaderPos, [leaderNode point])) { + [[self doc] cancelShiftNodes]; + } else { + [[self doc] endShiftNodes]; + } + leaderNode = nil; + } else if (state == DragEdgeControlPoint1 || state == DragEdgeControlPoint2) { + // FIXME: check if there was any real change + [[self doc] endModifyEdge]; + } +} + +- (void) mouseDoubleClickAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { + if (button != LeftButton) + return; + + if (state != QuietState) { + return; + } + // convert bend mode on edge under mouse cursor + Edge *edge = [renderer anyEdgeAt:pos withFuzz:edgeFuzz]; + if (edge != nil) { + [[self doc] startModifyEdge:edge]; + if ([edge bendMode]==EdgeBendModeBasic) { + [edge convertBendToAngles]; + [edge setBendMode:EdgeBendModeInOut]; + } else { + [edge setBendMode:EdgeBendModeBasic]; + } + [[self doc] endModifyEdge]; + + [self deselectAllEdges]; + [[[self doc] pickSupport] selectEdge:edge]; + } +} + - (void) renderWithContext:(id)context onSurface:(id)surface { if (!NSIsEmptyRect (selectionBox)) { [context saveState]; @@ -351,6 +349,8 @@ static const InputMask unionSelectMask = ShiftMask; selectionBox = emptyRect; [renderer invalidateRect:NSInsetRect (oldRect, -2, -2)]; + [selectionBoxContents removeAllObjects]; + [renderer clearHighlightedNodes]; } - (BOOL) selectionBoxContainsNode:(Node*)node { -- cgit v1.2.3