summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Merry <dev@randomguy3.me.uk>2012-06-29 15:12:49 +0100
committerAlex Merry <dev@randomguy3.me.uk>2012-06-29 15:12:49 +0100
commit7b4db7aa75f8e60702fe7828e4be9b06ef7c5fc9 (patch)
tree6b136cdd1b8161fe6eb53d0f9269ffccc57aeb6a
parent626622b7e570015f5f49e327dfe24660fb221411 (diff)
Be helpful about which panes are visible
If only one property/style pane is visible, auto-switch between them depending on the tool.
-rw-r--r--tikzit/src/gtk/GraphInputHandler.h12
-rw-r--r--tikzit/src/gtk/GraphInputHandler.m66
-rw-r--r--tikzit/src/gtk/MainWindow.h4
-rw-r--r--tikzit/src/gtk/MainWindow.m16
-rw-r--r--tikzit/src/gtk/Menu.m3
-rw-r--r--tikzit/src/gtk/PropertyPane.h4
-rw-r--r--tikzit/src/gtk/PropertyPane.m41
-rw-r--r--tikzit/src/gtk/StylesPane.h3
-rw-r--r--tikzit/src/gtk/StylesPane.m19
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 <gdk/gdkkeysyms.h>
+#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
// }}}