views:

79

answers:

0

I'm trying to create a toolbar button whose state is linked to whether the QLPreviewPanel is visible. I've tried adding adding a binding for the visible property of [QLPreviewPanel sharedPreviewPanel] but I'm running into some really odd behaviour where by observeValueForKeyPath:ofObject:change:context: is called twice once with the value of YES and a second time with the value of NO each time [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront: nil] is invoked. Even more odd is that even though the second call has a value of NO the panel is visible. And the icing on the cake is that my code that displays the panel is only called once. Following the stack trace I can see that makeKeyAndOrderFront: is only called once from my code.

At the same time, when I call [[QLPreviewPanel sharedPreviewPanel] orderOut: nil] I don't receive any calls to observeValueForKeyPath:ofObject:change:context:. This seems really odd to me since the code that determines which of makeKeyAndOrderFront: and orderOut: to call specifically checks the isVisible method.

Below is the pertinent pieces of code around this problem.

- (void) awakeFromNib {
   [[QLPreviewPanel sharedPreviewPanel] addObserver: self
                                         forKeyPath: @"open"
                                            options: NSKeyValueObservingOptionNew
                                            context: nil];

}

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
   if (object == [QLPreviewPanel sharedPreviewPanel]) {
      BOOL visible = [[QLPreviewPanel sharedPreviewPanel] isVisible];
      if (visible) {
         [quickLookButton setState: NSOnState];
      } else {
         [quickLookButton setState: NSOffState];
      }
   }
}

- (IBAction) toggleQuickLook: (id) sender {
   if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) {
       [[QLPreviewPanel sharedPreviewPanel] orderOut:nil];
   } else {
       [[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
   }
}