summaryrefslogtreecommitdiff
path: root/tikzit/src/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'tikzit/src/gtk')
-rw-r--r--tikzit/src/gtk/PropertiesPane.h2
-rw-r--r--tikzit/src/gtk/PropertiesPane.m127
-rw-r--r--tikzit/src/gtk/PropertyListEditor.m6
3 files changed, 130 insertions, 5 deletions
diff --git a/tikzit/src/gtk/PropertiesPane.h b/tikzit/src/gtk/PropertiesPane.h
index bde4424..c76efae 100644
--- a/tikzit/src/gtk/PropertiesPane.h
+++ b/tikzit/src/gtk/PropertiesPane.h
@@ -53,6 +53,8 @@
GtkToggleButton *edgeNodeToggle;
GtkWidget *edgeNodePropsWidget;
GtkEntry *edgeNodeLabelEntry;
+ GtkEntry *edgeSourceAnchorEntry;
+ GtkEntry *edgeTargetAnchorEntry;
}
@property (retain) TikzDocument *document;
diff --git a/tikzit/src/gtk/PropertiesPane.m b/tikzit/src/gtk/PropertiesPane.m
index c42dded..ba43298 100644
--- a/tikzit/src/gtk/PropertiesPane.m
+++ b/tikzit/src/gtk/PropertiesPane.m
@@ -33,6 +33,8 @@ static GtkWidget *createBoldLabel (const gchar *text);
static void node_label_changed_cb (GtkEditable *widget, PropertiesPane *pane);
static void edge_node_label_changed_cb (GtkEditable *widget, PropertiesPane *pane);
static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane);
+static void edge_source_anchor_changed_cb (GtkEditable *widget, PropertiesPane *pane);
+static void edge_target_anchor_changed_cb (GtkEditable *widget, PropertiesPane *pane);
// }}}
@interface PropertiesPane (Notifications)
@@ -42,6 +44,8 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane)
- (void) nodeLabelEdited:(NSString*)newValue;
- (void) edgeNodeLabelEdited:(NSString*)newValue;
- (void) edgeNodeToggled:(BOOL)newValue;
+- (BOOL) edgeSourceAnchorEdited:(NSString*)newValue;
+- (BOOL) edgeTargetAnchorEdited:(NSString*)newValue;
@end
@interface PropertiesPane (Private)
@@ -186,6 +190,45 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane)
split,
FALSE, FALSE, 0);
+ GtkWidget *anchorTable = gtk_table_new (2, 2, FALSE);
+
+ label = gtk_label_new ("Source anchor:");
+ gtk_table_attach_defaults (GTK_TABLE (anchorTable), label,
+ 0, 1, 0, 1);
+ edgeSourceAnchorEntry = GTK_ENTRY (gtk_entry_new ());
+ g_object_ref_sink (edgeSourceAnchorEntry);
+ gtk_table_attach_defaults (GTK_TABLE (anchorTable),
+ GTK_WIDGET (edgeSourceAnchorEntry),
+ 1, 2, 0, 1);
+ g_signal_connect (G_OBJECT (edgeSourceAnchorEntry),
+ "changed",
+ G_CALLBACK (edge_source_anchor_changed_cb),
+ self);
+
+ label = gtk_label_new ("Target anchor:");
+ gtk_table_attach_defaults (GTK_TABLE (anchorTable), label,
+ 0, 1, 1, 2);
+ edgeTargetAnchorEntry = GTK_ENTRY (gtk_entry_new ());
+ g_object_ref_sink (edgeTargetAnchorEntry);
+ gtk_table_attach_defaults (GTK_TABLE (anchorTable),
+ GTK_WIDGET (edgeTargetAnchorEntry),
+ 1, 2, 1, 2);
+ g_signal_connect (G_OBJECT (edgeTargetAnchorEntry),
+ "changed",
+ G_CALLBACK (edge_target_anchor_changed_cb),
+ self);
+
+ gtk_widget_show_all (anchorTable);
+ gtk_box_pack_start (GTK_BOX (edgePropsWidget),
+ anchorTable,
+ FALSE, FALSE, 0);
+
+ split = gtk_hseparator_new ();
+ gtk_widget_show (split);
+ gtk_box_pack_start (GTK_BOX (edgePropsWidget),
+ split,
+ FALSE, FALSE, 0);
+
edgeNodeToggle = GTK_TOGGLE_BUTTON (gtk_check_button_new_with_label ("Child node"));
g_object_ref_sink (edgeNodeToggle);
gtk_widget_show (GTK_WIDGET (edgeNodeToggle));
@@ -229,6 +272,8 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane)
g_object_unref (edgeNodeToggle);
g_object_unref (edgeNodePropsWidget);
g_object_unref (edgeNodeLabelEntry);
+ g_object_unref (edgeSourceAnchorEntry);
+ g_object_unref (edgeTargetAnchorEntry);
g_object_unref (layout);
@@ -325,7 +370,7 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane)
return;
}
- if ([newValue isValidTikz]) {
+ if ([newValue isValidTikzPropertyNameOrValue]) {
Node *node = [sel anyObject];
[document startModifyNode:node];
[node setLabel:newValue];
@@ -351,7 +396,7 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane)
return;
}
- if ([newValue isValidTikz]) {
+ if ([newValue isValidTikzPropertyNameOrValue]) {
[document startModifyEdge:edge];
[[edge edgeNode] setLabel:newValue];
[document endModifyEdge];
@@ -377,6 +422,48 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane)
[document endModifyEdge];
}
+- (BOOL) edgeSourceAnchorEdited:(NSString*)newValue {
+ if (blockUpdates)
+ return YES;
+
+ NSSet *sel = [[document pickSupport] selectedEdges];
+ if ([sel count] != 1) {
+ NSLog(@"Expected single edge selected; got %lu", [sel count]);
+ return YES;
+ }
+
+ Edge *edge = [sel anyObject];
+ if ([newValue isValidAnchor]) {
+ [document startModifyEdge:edge];
+ [edge setSourceAnchor:newValue];
+ [document endModifyEdge];
+ return YES;
+ } else {
+ return NO;
+ }
+}
+
+- (BOOL) edgeTargetAnchorEdited:(NSString*)newValue {
+ if (blockUpdates)
+ return YES;
+
+ NSSet *sel = [[document pickSupport] selectedEdges];
+ if ([sel count] != 1) {
+ NSLog(@"Expected single edge selected; got %lu", [sel count]);
+ return YES;
+ }
+
+ Edge *edge = [sel anyObject];
+ if ([newValue isValidAnchor]) {
+ [document startModifyEdge:edge];
+ [edge setTargetAnchor:newValue];
+ [document endModifyEdge];
+ return YES;
+ } else {
+ return NO;
+ }
+}
+
@end
// }}}
// {{{ Private
@@ -419,6 +506,12 @@ static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane)
Edge *e = [edgeSel anyObject];
[edgePropDelegate setEdge:e];
[edgeProps setData:[e data]];
+ gtk_entry_set_text (edgeSourceAnchorEntry,
+ [[e sourceAnchor] UTF8String]);
+ gtk_entry_set_text (edgeTargetAnchorEntry,
+ [[e targetAnchor] UTF8String]);
+ widget_clear_error (GTK_WIDGET (edgeSourceAnchorEntry));
+ widget_clear_error (GTK_WIDGET (edgeTargetAnchorEntry));
widget_clear_error (GTK_WIDGET (edgeNodeLabelEntry));
if ([e hasEdgeNode]) {
gtk_toggle_button_set_active (edgeNodeToggle, TRUE);
@@ -635,6 +728,36 @@ static void edge_node_toggled_cb (GtkToggleButton *toggle, PropertiesPane *pane)
[pool drain];
}
+static void edge_source_anchor_changed_cb (GtkEditable *editable, PropertiesPane *pane) {
+ if (!gtk_widget_is_sensitive (GTK_WIDGET (editable))) {
+ // clearly wasn't the user editing
+ return;
+ }
+
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSString *newValue = gtk_editable_get_string (editable, 0, -1);
+ if (![pane edgeSourceAnchorEdited:newValue])
+ widget_set_error (GTK_WIDGET (editable));
+
+ [pool drain];
+}
+
+static void edge_target_anchor_changed_cb (GtkEditable *editable, PropertiesPane *pane) {
+ if (!gtk_widget_is_sensitive (GTK_WIDGET (editable))) {
+ // clearly wasn't the user editing
+ return;
+ }
+
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSString *newValue = gtk_editable_get_string (editable, 0, -1);
+ if (![pane edgeTargetAnchorEdited:newValue])
+ widget_set_error (GTK_WIDGET (editable));
+
+ [pool drain];
+}
+
// }}}
// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker
diff --git a/tikzit/src/gtk/PropertyListEditor.m b/tikzit/src/gtk/PropertyListEditor.m
index 428050e..9760618 100644
--- a/tikzit/src/gtk/PropertyListEditor.m
+++ b/tikzit/src/gtk/PropertyListEditor.m
@@ -245,7 +245,7 @@ static void selection_changed_cb (GtkTreeSelection *selection,
@implementation PropertyListEditor (Private)
- (void) updatePath:(gchar*)pathStr withValue:(NSString*)newText {
- if (![newText isValidTikz])
+ if (![newText isValidTikzPropertyNameOrValue])
return;
GtkTreeIter iter;
@@ -276,7 +276,7 @@ static void selection_changed_cb (GtkTreeSelection *selection,
}
- (void) updatePath:(gchar*)pathStr withName:(NSString*)newText {
- if (![newText isValidTikz])
+ if (![newText isValidTikzPropertyNameOrValue])
return;
GtkTreeIter iter;
@@ -478,7 +478,7 @@ static void text_changed_cb (GtkEditable *editable, PropertyListEditor *pane)
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *newValue = gtk_editable_get_string (editable, 0, -1);
- if (![newValue isValidTikz]) {
+ if (![newValue isValidTikzPropertyNameOrValue]) {
widget_set_error (GTK_WIDGET (editable));
} else {
widget_clear_error (GTK_WIDGET (editable));