summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrandomguy3 <randomguy3@7c02a99a-9b00-45e3-bf44-6f3dd7fddb64>2012-01-06 18:50:09 +0000
committerrandomguy3 <randomguy3@7c02a99a-9b00-45e3-bf44-6f3dd7fddb64>2012-01-06 18:50:09 +0000
commit6458381a1115a4088d6a3a794f3e2ec40ea07987 (patch)
tree734b8715308bfd871d1717ac338c436c5de33ac9 /src
parent042a081c40bdd8ab0e5a1cd3d2a7a81182660253 (diff)
GTK: allow preambles to be added, removed and renamed
git-svn-id: https://tikzit.svn.sourceforge.net/svnroot/tikzit/trunk@355 7c02a99a-9b00-45e3-bf44-6f3dd7fddb64
Diffstat (limited to 'src')
-rw-r--r--src/common/Preambles.h3
-rw-r--r--src/common/Preambles.m33
-rw-r--r--src/linux/PreambleEditor.h3
-rw-r--r--src/linux/PreambleEditor.m124
4 files changed, 147 insertions, 16 deletions
diff --git a/src/common/Preambles.h b/src/common/Preambles.h
index 6cef9c1..d507ad9 100644
--- a/src/common/Preambles.h
+++ b/src/common/Preambles.h
@@ -44,6 +44,9 @@
- (NSString*)preambleForName:(NSString*)name;
- (BOOL)setPreamble:(NSString*)content forName:(NSString*)name;
+- (NSString*)addPreamble;
+- (NSString*)addPreambleWithNameBase:(NSString*)name;
+
- (BOOL)renamePreambleFrom:(NSString*)old to:(NSString*)new;
- (BOOL)removePreamble:(NSString*)name;
diff --git a/src/common/Preambles.m b/src/common/Preambles.m
index 68f41a3..4f74dd0 100644
--- a/src/common/Preambles.m
+++ b/src/common/Preambles.m
@@ -173,6 +173,26 @@ static NSString *POSTAMBLE =
return @"default";
}
+- (NSString*)addPreamble {
+ return [self addPreambleWithNameBase:@"new preamble"];
+}
+
+- (NSString*)addPreambleWithNameBase:(NSString*)base {
+ if ([preambleDict objectForKey:base] == nil) {
+ [self setPreamble:[self defaultPreamble] forName:base];
+ return base;
+ }
+ int i = 0;
+ NSString *tryName = nil;
+ do {
+ ++i;
+ tryName = [NSString stringWithFormat:@"%@ %d", base, i];
+ } while ([preambleDict objectForKey:tryName] != nil);
+
+ [self setPreamble:[self defaultPreamble] forName:tryName];
+ return tryName;
+}
+
- (BOOL)renamePreambleFrom:(NSString*)old to:(NSString*)new {
if ([old isEqualToString:@"default"])
return NO;
@@ -180,18 +200,31 @@ static NSString *POSTAMBLE =
return NO;
if ([old isEqualToString:new])
return YES;
+ BOOL isSelected = NO;
+ if ([old isEqualToString:selectedPreambleName]) {
+ [self setSelectedPreambleName:nil];
+ isSelected = YES;
+ }
NSString *preamble = [preambleDict objectForKey:old];
[preamble retain];
[preambleDict removeObjectForKey:old];
[preambleDict setObject:preamble forKey:new];
[preamble release];
+ if (isSelected) {
+ [self setSelectedPreambleName:new];
+ }
return YES;
}
- (BOOL)removePreamble:(NSString*)name {
if ([name isEqualToString:@"default"])
return NO;
+ // "name" may be held only by being the selected preamble...
+ [name retain];
+ if ([name isEqualToString:selectedPreambleName])
+ [self setSelectedPreambleName:nil];
[preambleDict removeObjectForKey:name];
+ [name release];
return YES;
}
diff --git a/src/linux/PreambleEditor.h b/src/linux/PreambleEditor.h
index 3151e9f..6849d74 100644
--- a/src/linux/PreambleEditor.h
+++ b/src/linux/PreambleEditor.h
@@ -30,7 +30,8 @@
GtkListStore *preambleListStore;
GtkTreeView *preambleSelector;
GtkTextView *preambleView;
- BOOL loading;
+ BOOL blockSignals;
+ BOOL adding;
}
- (id) initWithPreambles:(Preambles*)p;
diff --git a/src/linux/PreambleEditor.m b/src/linux/PreambleEditor.m
index 31adcb0..eb05781 100644
--- a/src/linux/PreambleEditor.m
+++ b/src/linux/PreambleEditor.m
@@ -48,6 +48,11 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
- (void) revert;
- (void) update;
- (void) fillListStore;
+- (BOOL) isDefaultPreambleSelected;
+- (NSString*) selectedPreambleName;
+- (void) addPreamble;
+- (void) deletePreamble;
+- (void) renamePreambleAtPath:(gchar*)path to:(gchar*)newValue;
@end
// }}}
@@ -70,7 +75,8 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
window = NULL;
preambleView = NULL;
preambleSelector = NULL;
- loading = NO;
+ blockSignals = NO;
+ adding = NO;
}
return self;
@@ -128,9 +134,10 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
}
@end
-// }}}
+// }}}
// {{{ Private
+
@implementation PreambleEditor (Private)
- (GtkWidget*) createPreambleList {
preambleListStore = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN);
@@ -203,7 +210,7 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
GtkWidget *listWidget = [self createPreambleList];
GtkBox *listBox = GTK_BOX (gtk_vbox_new (FALSE, 0));
gtk_box_pack_start (listBox, listWidget, TRUE, TRUE, 0);
- /*
+
GtkContainer *listButtonBox = GTK_CONTAINER (gtk_hbox_new (FALSE, 0));
gtk_box_pack_start (listBox, GTK_WIDGET (listButtonBox), FALSE, TRUE, 0);
GtkWidget *addButton = gtk_button_new_from_stock (GTK_STOCK_ADD);
@@ -218,7 +225,7 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
G_CALLBACK (remove_button_clicked_cb),
self);
gtk_container_add (listButtonBox, removeButton);
- */
+
gtk_paned_pack1 (paned, GTK_WIDGET (listBox), FALSE, TRUE);
preambleView = GTK_TEXT_VIEW (gtk_text_view_new ());
@@ -266,7 +273,7 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
}
- (void) save {
- if ([preambles selectedPreambleIsDefault])
+ if ([self isDefaultPreambleSelected])
return;
GtkTextIter start,end;
GtkTextBuffer *preambleBuffer = gtk_text_view_get_buffer (preambleView);
@@ -280,11 +287,11 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
- (void) revert {
GtkTextBuffer *preambleBuffer = gtk_text_view_get_buffer (preambleView);
gtk_text_buffer_set_text (preambleBuffer, [[preambles currentPreamble] UTF8String], -1);
- gtk_text_view_set_editable (preambleView, ![preambles selectedPreambleIsDefault]);
+ gtk_text_view_set_editable (preambleView, ![self isDefaultPreambleSelected]);
}
- (void) update {
- if (!loading) {
+ if (!blockSignals) {
[self save];
}
GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector);
@@ -301,7 +308,7 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
}
- (void) fillListStore {
- loading = YES;
+ blockSignals = YES;
GtkTreeIter row;
gtk_list_store_clear (preambleListStore);
@@ -312,7 +319,7 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
IS_CUSTOM_COLUMN, FALSE,
-1);
GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector);
- if ([preambles selectedPreambleIsDefault]) {
+ if ([self isDefaultPreambleSelected]) {
gtk_tree_selection_select_iter (sel, &row);
}
@@ -324,16 +331,102 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
NAME_COLUMN, [preambleName UTF8String],
IS_CUSTOM_COLUMN, TRUE,
-1);
- if ([preambleName isEqualToString:[preambles selectedPreambleName]]) {
+ if ([preambleName isEqualToString:[self selectedPreambleName]]) {
gtk_tree_selection_select_iter (sel, &row);
}
}
- loading = NO;
+ blockSignals = NO;
+}
+
+- (BOOL) isDefaultPreambleSelected {
+ return [preambles selectedPreambleIsDefault];
+}
+
+- (NSString*) selectedPreambleName {
+ return [preambles selectedPreambleName];
+}
+
+- (void) addPreamble {
+ NSString *newName = [preambles addPreamble];
+
+ GtkTreeIter row;
+ gtk_list_store_append (preambleListStore, &row);
+ gtk_list_store_set (preambleListStore, &row,
+ NAME_COLUMN, [newName UTF8String],
+ IS_CUSTOM_COLUMN, TRUE,
+ -1);
+
+ GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector);
+ gtk_tree_selection_select_iter (sel, &row);
+}
+
+- (void) deletePreamble {
+ if ([self isDefaultPreambleSelected])
+ return;
+
+ NSString *name = [self selectedPreambleName];
+
+ GtkTreeIter row;
+ GtkTreeModel *model = GTK_TREE_MODEL (preambleListStore);
+
+ gtk_tree_model_get_iter_first (model, &row);
+ // ignore first; it is the default one
+ gboolean found = FALSE;
+ while (!found && gtk_tree_model_iter_next (model, &row)) {
+ gchar *candidate;
+ gtk_tree_model_get (model, &row, NAME_COLUMN, &candidate, -1);
+ if (g_strcmp0 (candidate, [name UTF8String]) == 0) {
+ found = TRUE;
+ }
+ g_free (candidate);
+ }
+
+ if (!found)
+ return;
+
+ if (![preambles removePreamble:name])
+ return;
+
+ blockSignals = YES;
+
+ gboolean had_next = gtk_list_store_remove (preambleListStore, &row);
+ if (!had_next) {
+ // select the last item
+ gint length = gtk_tree_model_iter_n_children (model, NULL);
+ gtk_tree_model_iter_nth_child (model, &row, NULL, length - 1);
+ }
+
+ GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector);
+ gtk_tree_selection_select_iter (sel, &row);
+
+ [self revert];
+
+ blockSignals = NO;
+}
+
+- (void) renamePreambleAtPath:(gchar*)path to:(gchar*)newValue {
+ NSString *newName = [NSString stringWithUTF8String:newValue];
+
+ GtkTreeIter row;
+ GtkTreeModel *model = GTK_TREE_MODEL (preambleListStore);
+
+ if (!gtk_tree_model_get_iter_from_string (model, &row, path))
+ return;
+
+ gchar *oldValue;
+ gtk_tree_model_get (model, &row, NAME_COLUMN, &oldValue, -1);
+
+ NSString* oldName = [NSString stringWithUTF8String:oldValue];
+ if ([preambles renamePreambleFrom:oldName to:newName]) {
+ gtk_list_store_set (preambleListStore, &row,
+ NAME_COLUMN, newValue,
+ -1);
+ }
}
@end
-// }}}
+// }}}
// {{{ GTK+ callbacks
static gboolean window_delete_event_cb (GtkWidget *widget,
@@ -353,13 +446,13 @@ static void close_button_clicked_cb (GtkButton *widget, PreambleEditor *editor)
static void add_button_clicked_cb (GtkButton *widget, PreambleEditor *editor) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSLog(@"Add");
+ [editor addPreamble];
[pool drain];
}
static void remove_button_clicked_cb (GtkButton *widget, PreambleEditor *editor) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSLog(@"Remove");
+ [editor deletePreamble];
[pool drain];
}
@@ -380,6 +473,7 @@ static void preamble_name_edited_cb (GtkCellRendererText *renderer,
gchar *new_text,
PreambleEditor *editor) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ [editor renamePreambleAtPath:path to:new_text];
[pool drain];
}
@@ -392,4 +486,4 @@ static void preamble_selection_changed_cb (GtkTreeSelection *treeselection,
// }}}
-// vim:ft=objc:ts=4:noet:sts=4:sw=4
+// vim:ft=objc:ts=4:noet:sts=4:sw=4:foldmethod=marker