From 7b4db7aa75f8e60702fe7828e4be9b06ef7c5fc9 Mon Sep 17 00:00:00 2001 From: Alex Merry Date: Fri, 29 Jun 2012 15:12:49 +0100 Subject: Be helpful about which panes are visible If only one property/style pane is visible, auto-switch between them depending on the tool. --- tikzit/src/gtk/GraphInputHandler.h | 12 +++---- tikzit/src/gtk/GraphInputHandler.m | 66 +++++++++++++++++++++++++++++++++++++- tikzit/src/gtk/MainWindow.h | 4 +++ tikzit/src/gtk/MainWindow.m | 16 ++++++++- tikzit/src/gtk/Menu.m | 3 +- tikzit/src/gtk/PropertyPane.h | 4 +++ tikzit/src/gtk/PropertyPane.m | 41 +++++++++++++++++++++++ tikzit/src/gtk/StylesPane.h | 3 ++ tikzit/src/gtk/StylesPane.m | 19 +++++++++++ 9 files changed, 159 insertions(+), 9 deletions(-) diff --git a/tikzit/src/gtk/GraphInputHandler.h b/tikzit/src/gtk/GraphInputHandler.h index 9955459..7277e82 100644 --- a/tikzit/src/gtk/GraphInputHandler.h +++ b/tikzit/src/gtk/GraphInputHandler.h @@ -20,6 +20,8 @@ #import "InputDelegate.h" #import "StyleManager.h" +@class MainWindow; + typedef enum { SelectMode, CreateNodeMode, @@ -41,6 +43,7 @@ typedef enum { } MouseState; @interface GraphInputHandler: NSObject { + MainWindow *window; GraphRenderer *renderer; InputMode mode; MouseState state; @@ -54,13 +57,10 @@ typedef enum { NSPoint oldOrigin; } -- (id) initWithGraphRenderer:(GraphRenderer*)r; - -- (float) edgeFuzz; -- (void) setEdgeFuzz:(float)fuzz; +@property (assign) float edgeFuzz; +@property (assign) InputMode mode; -- (InputMode) mode; -- (void) setMode:(InputMode)mode; +- (id) initWithGraphRenderer:(GraphRenderer*)r window:(MainWindow*)w; - (void) resetState; diff --git a/tikzit/src/gtk/GraphInputHandler.m b/tikzit/src/gtk/GraphInputHandler.m index caaadeb..aec0b7b 100644 --- a/tikzit/src/gtk/GraphInputHandler.m +++ b/tikzit/src/gtk/GraphInputHandler.m @@ -18,15 +18,25 @@ #import "GraphInputHandler.h" #import +#import "MainWindow.h" #import "Edge+Render.h" static const InputMask unionSelectMask = ShiftMask; +@interface GraphInputHandler (Notifications) +- (void) nodeSelectionChanged:(NSNotification*)n; +- (void) edgeSelectionChanged:(NSNotification*)n; +@end + @implementation GraphInputHandler - (id) initWithGraphRenderer:(GraphRenderer*)r { + return [self initWithGraphRenderer:r window:nil]; +} +- (id) initWithGraphRenderer:(GraphRenderer*)r window:(MainWindow*)w { self = [super init]; if (self) { + window = w; renderer = r; mode = SelectMode; state = QuietState; @@ -35,11 +45,26 @@ static const InputMask unionSelectMask = ShiftMask; modifyEdge = nil; selectionBoxContents = [[NSMutableSet alloc] initWithCapacity:10]; currentResizeHandle = NoHandle; + // FIXME: listen only to the doc's PickSupport + // (need to track document changes) + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(nodeSelectionChanged:) + name:@"NodeSelectionChanged" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(edgeSelectionChanged:) + name:@"EdgeSelectionChanged" object:nil]; } return self; } +- (void) dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [selectionBoxContents release]; + + [super dealloc]; +} + - (TikzDocument*) doc { return [renderer document]; } @@ -98,8 +123,23 @@ static const InputMask unionSelectMask = ShiftMask; } mode = m; [self deselectAll]; - if (m == BoundingBoxMode) { + if (mode == BoundingBoxMode) { [renderer setBoundingBoxHandlesShown:YES]; + [window favourGraphControls]; + } else if (mode == CreateNodeMode) { + [window favourNodeControls]; + } else if (mode == DrawEdgeMode) { + [window favourEdgeControls]; + } else if (mode == HandMode) { + [window favourGraphControls]; + } else if (mode == SelectMode) { + // FIXME: also change on selection change + if ([[[[self doc] pickSupport] selectedNodes] count]) + [window favourNodeControls]; + else if ([[[[self doc] pickSupport] selectedEdges] count]) + [window favourEdgeControls]; + else + [window favourGraphControls]; } } } @@ -445,4 +485,28 @@ static const InputMask unionSelectMask = ShiftMask; @end +@implementation GraphInputHandler (Notifications) +- (void) nodeSelectionChanged:(NSNotification*)n { + if (mode == SelectMode) { + if ([[[[self doc] pickSupport] selectedNodes] count]) + [window favourNodeControls]; + else if ([[[[self doc] pickSupport] selectedEdges] count]) + [window favourEdgeControls]; + else + [window favourGraphControls]; + } +} + +- (void) edgeSelectionChanged:(NSNotification*)n { + if (mode == SelectMode) { + if ([[[[self doc] pickSupport] selectedNodes] count]) + [window favourNodeControls]; + else if ([[[[self doc] pickSupport] selectedEdges] count]) + [window favourEdgeControls]; + else + [window favourGraphControls]; + } +} +@end + // vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/MainWindow.h b/tikzit/src/gtk/MainWindow.h index 27ce46d..8314296 100644 --- a/tikzit/src/gtk/MainWindow.h +++ b/tikzit/src/gtk/MainWindow.h @@ -216,6 +216,10 @@ - (void) zoomOut; - (void) zoomReset; +- (void) favourGraphControls; +- (void) favourNodeControls; +- (void) favourEdgeControls; + @end // vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/MainWindow.m b/tikzit/src/gtk/MainWindow.m index 9dd4941..9e406b7 100644 --- a/tikzit/src/gtk/MainWindow.m +++ b/tikzit/src/gtk/MainWindow.m @@ -495,6 +495,20 @@ static void update_paste_action (GtkClipboard *clipboard, GdkEvent *event, GtkAc [surface zoomReset]; } +- (void) favourGraphControls { + [propertyPane favourGraphProperties]; +} + +- (void) favourNodeControls { + [stylesPane favourNodeStyles]; + [propertyPane favourNodeProperties]; +} + +- (void) favourEdgeControls { + [stylesPane favourEdgeStyles]; + [propertyPane favourEdgeProperties]; +} + @end // }}} @@ -650,7 +664,7 @@ static void update_paste_action (GtkClipboard *clipboard, GdkEvent *event, GtkAc [surface setGrabsFocusOnClick:YES]; renderer = [[GraphRenderer alloc] initWithSurface:surface document:document]; - inputHandler = [[GraphInputHandler alloc] initWithGraphRenderer:renderer]; + inputHandler = [[GraphInputHandler alloc] initWithGraphRenderer:renderer window:self]; [surface setInputDelegate:inputHandler]; tikzBuffer = gtk_text_buffer_new (NULL); diff --git a/tikzit/src/gtk/Menu.m b/tikzit/src/gtk/Menu.m index 37ab87c..b99336d 100644 --- a/tikzit/src/gtk/Menu.m +++ b/tikzit/src/gtk/Menu.m @@ -294,7 +294,8 @@ static void zoom_reset_cb (GtkAction *action, MainWindow *window) { static void input_mode_change_cb (GtkRadioAction *action, GtkRadioAction *current, MainWindow *window) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window graphInputHandler] setMode:(InputMode)gtk_radio_action_get_current_value (action)]; + InputMode mode = (InputMode)gtk_radio_action_get_current_value (action); + [[window graphInputHandler] setMode:mode]; [pool drain]; } diff --git a/tikzit/src/gtk/PropertyPane.h b/tikzit/src/gtk/PropertyPane.h index 30f8e5a..b4a44f7 100644 --- a/tikzit/src/gtk/PropertyPane.h +++ b/tikzit/src/gtk/PropertyPane.h @@ -60,6 +60,10 @@ - (void) restoreUiStateFromConfig:(Configuration*)file group:(NSString*)group; - (void) saveUiStateToConfig:(Configuration*)file group:(NSString*)group; +- (void) favourGraphProperties; +- (void) favourNodeProperties; +- (void) favourEdgeProperties; + @end // vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/PropertyPane.m b/tikzit/src/gtk/PropertyPane.m index df29165..8a71a82 100644 --- a/tikzit/src/gtk/PropertyPane.m +++ b/tikzit/src/gtk/PropertyPane.m @@ -260,6 +260,47 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertyPane *pane); value:gtk_expander_get_expanded (edgePropsExpander)]; } +- (int) expandedPaneCount { + int eps = 0; + if (gtk_expander_get_expanded (graphPropsExpander)) + eps++; + if (gtk_expander_get_expanded (nodePropsExpander)) + eps++; + if (gtk_expander_get_expanded (edgePropsExpander)) + eps++; + return eps; +} + +- (void) favourGraphProperties { + if (!gtk_expander_get_expanded (graphPropsExpander)) { + if ([self expandedPaneCount] == 1) { + gtk_expander_set_expanded (nodePropsExpander, FALSE); + gtk_expander_set_expanded (edgePropsExpander, FALSE); + gtk_expander_set_expanded (graphPropsExpander, TRUE); + } + } +} + +- (void) favourNodeProperties { + if (!gtk_expander_get_expanded (nodePropsExpander)) { + if ([self expandedPaneCount] == 1) { + gtk_expander_set_expanded (graphPropsExpander, FALSE); + gtk_expander_set_expanded (edgePropsExpander, FALSE); + gtk_expander_set_expanded (nodePropsExpander, TRUE); + } + } +} + +- (void) favourEdgeProperties { + if (!gtk_expander_get_expanded (edgePropsExpander)) { + if ([self expandedPaneCount] == 1) { + gtk_expander_set_expanded (graphPropsExpander, FALSE); + gtk_expander_set_expanded (nodePropsExpander, FALSE); + gtk_expander_set_expanded (edgePropsExpander, TRUE); + } + } +} + @end // }}} // {{{ Notifications diff --git a/tikzit/src/gtk/StylesPane.h b/tikzit/src/gtk/StylesPane.h index c1a603d..660e9cf 100644 --- a/tikzit/src/gtk/StylesPane.h +++ b/tikzit/src/gtk/StylesPane.h @@ -43,6 +43,9 @@ - (void) restoreUiStateFromConfig:(Configuration*)file group:(NSString*)group; - (void) saveUiStateToConfig:(Configuration*)file group:(NSString*)group; +- (void) favourNodeStyles; +- (void) favourEdgeStyles; + @end // vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/StylesPane.m b/tikzit/src/gtk/StylesPane.m index 0f6adef..455878a 100644 --- a/tikzit/src/gtk/StylesPane.m +++ b/tikzit/src/gtk/StylesPane.m @@ -26,6 +26,7 @@ - (GtkExpander*) _addExpanderWithName:(const gchar*)name contents:(GtkWidget*)contents; @end +// {{{ API @implementation StylesPane @synthesize widget=stylesPane; @@ -107,6 +108,24 @@ value:gtk_expander_get_expanded (edgeStylesExpander)]; } +- (void) favourNodeStyles { + if (!gtk_expander_get_expanded (nodeStylesExpander)) { + if (gtk_expander_get_expanded (edgeStylesExpander)) { + gtk_expander_set_expanded (edgeStylesExpander, FALSE); + gtk_expander_set_expanded (nodeStylesExpander, TRUE); + } + } +} + +- (void) favourEdgeStyles { + if (!gtk_expander_get_expanded (edgeStylesExpander)) { + if (gtk_expander_get_expanded (nodeStylesExpander)) { + gtk_expander_set_expanded (nodeStylesExpander, FALSE); + gtk_expander_set_expanded (edgeStylesExpander, TRUE); + } + } +} + @end // }}} -- cgit v1.2.3