summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Merry <alex.merry@cs.ox.ac.uk>2012-12-17 17:24:26 +0000
committerAlex Merry <alex.merry@cs.ox.ac.uk>2012-12-17 17:24:26 +0000
commit410fdf146246e014f1598e1880b5326e75159c43 (patch)
tree704c4d0b1359ac6db660a325c8ee7ab0ef35a93d
parentf75835e188c1bf8010fb7cc18c7526934ff19eba (diff)
Update props window when a window's document changes
A window's document can change when opening a document from a window that is has no backing file and no changes. The properties window was not getting updated propertly when this happened (it still referred to the old document). Now it is updated properly.
-rw-r--r--tikzit/src/gtk/Application.m34
-rw-r--r--tikzit/src/gtk/Window.h4
-rw-r--r--tikzit/src/gtk/Window.m20
3 files changed, 51 insertions, 7 deletions
diff --git a/tikzit/src/gtk/Application.m b/tikzit/src/gtk/Application.m
index 1459355..a7f1824 100644
--- a/tikzit/src/gtk/Application.m
+++ b/tikzit/src/gtk/Application.m
@@ -52,6 +52,11 @@ Application* app = nil;
- (void) windowClosed:(NSNotification*)notification;
- (void) windowGainedFocus:(NSNotification*)notification;
- (void) selectedToolChanged:(NSNotification*)notification;
+- (void) windowDocumentChanged:(NSNotification*)n;
+@end
+
+@interface Application (Private)
+- (void) setActiveWindow:(Window*)window;
@end
@implementation Application
@@ -227,7 +232,9 @@ Application* app = nil;
selector:@selector(windowGainedFocus:)
name:@"WindowGainedFocus"
object:window];
- // FIXME: focus?
+ if ([window hasFocus]) {
+ [self setActiveWindow:window];
+ }
}
- (void) newWindow {
@@ -339,11 +346,12 @@ Application* app = nil;
gtk_main_quit();
}
}
+
- (void) windowGainedFocus:(NSNotification*)notification {
Window *window = [notification object];
- TikzDocument *doc = [window document];
- [propertiesWindow setDocument:doc];
+ [self setActiveWindow:window];
}
+
- (void) selectedToolChanged:(NSNotification*)n {
id<Tool> tool = [[n userInfo] objectForKey:@"tool"];
if (tool != nil)
@@ -351,6 +359,26 @@ Application* app = nil;
else
NSLog(@"nil tool!");
}
+
+- (void) windowDocumentChanged:(NSNotification*)n {
+ [propertiesWindow setDocument:[[n userInfo] objectForKey:@"document"]];
+}
+@end
+
+@implementation Application (Private)
+- (void) setActiveWindow:(Window*)window {
+ [[NSNotificationCenter defaultCenter] removeObserver:self
+ name:@"DocumentChanged"
+ object:nil];
+
+ [propertiesWindow setDocument:[window document]];
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self
+ selector:@selector(windowDocumentChanged:)
+ name:@"DocumentChanged"
+ object:window];
+}
@end
// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker
diff --git a/tikzit/src/gtk/Window.h b/tikzit/src/gtk/Window.h
index 570cdf4..bac64a0 100644
--- a/tikzit/src/gtk/Window.h
+++ b/tikzit/src/gtk/Window.h
@@ -58,7 +58,9 @@
/**
* The document displayed by the window
*/
-@property (retain) TikzDocument *document;
+@property (retain) TikzDocument *document;
+
+@property (readonly) BOOL hasFocus;
/**
* Create a window with an empty document
diff --git a/tikzit/src/gtk/Window.m b/tikzit/src/gtk/Window.m
index c5e7654..d5dcf03 100644
--- a/tikzit/src/gtk/Window.m
+++ b/tikzit/src/gtk/Window.m
@@ -148,9 +148,8 @@ static void update_paste_action (GtkClipboard *clipboard, GdkEvent *event, GtkAc
[[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:[document pickSupport]];
[[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:document];
- [newDoc retain];
- [document release];
- document = newDoc;
+ TikzDocument *oldDoc = document;
+ document = [newDoc retain];
[graphPanel setDocument:document];
[self _updateTikz];
@@ -174,6 +173,21 @@ static void update_paste_action (GtkClipboard *clipboard, GdkEvent *event, GtkAc
if ([document path] != nil) {
[[RecentManager defaultManager] addRecentFile:[document path]];
}
+
+ NSDictionary *userInfo;
+ userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
+ document, @"document",
+ oldDoc, @"oldDocument",
+ nil];
+ [[NSNotificationCenter defaultCenter]
+ postNotificationName:@"DocumentChanged"
+ object:self
+ userInfo:userInfo];
+ [oldDoc release];
+}
+
+- (BOOL) hasFocus {
+ return gtk_window_has_toplevel_focus (GTK_WINDOW (window));
}
- (void) present {