From 6458381a1115a4088d6a3a794f3e2ec40ea07987 Mon Sep 17 00:00:00 2001 From: randomguy3 Date: Fri, 6 Jan 2012 18:50:09 +0000 Subject: 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 --- src/common/Preambles.h | 3 ++ src/common/Preambles.m | 33 ++++++++++++ src/linux/PreambleEditor.h | 3 +- src/linux/PreambleEditor.m | 124 +++++++++++++++++++++++++++++++++++++++------ 4 files changed, 147 insertions(+), 16 deletions(-) (limited to 'src') 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 -- cgit v1.2.3