public void CreateSingletonWindow(IObservable <bool> isVisible, Func <IDialog <object>, Window> window) { Fusion.Application.MainThread.Schedule(() => { var childWindow = new MacDialog <object>(); var handle = WindowImplementation.Create(window(childWindow), Optional.None()); handle.ReleasedWhenClosed = false; var close = new Subject <bool>(); childWindow._parent = handle; childWindow._onClose = () => close.OnNext(false); isVisible.Merge(close).Subscribe(vis => Fusion.Application.MainThread.Schedule(() => { if (vis) { handle.MakeKeyAndOrderFront(handle); } else { handle.OrderOut(handle); } })); }); }
// Called from cocoa during init (iff opened with create window) public override void MakeWindowControllers() { Console.WriteLine("Getting window"); MacDialog <Unit> .ShowDocumentWindow(this, window => { Window = window; var content = Fusion.Application.CreateDocumentWindow(this); Console.WriteLine("Got window"); DocumentOpened.OnNext(content); Console.WriteLine("Will show!"); return(content); }); }
public static void ShowDocumentWindow(ObservableNSDocument document, Func <IDialog <object>, Window> window) { Fusion.Application.MainThread.Schedule(() => { var childWindow = new MacDialog <object>(); var handle = WindowImplementation.Create(window(childWindow), Optional.Some(document)); childWindow._parent = handle; childWindow._onClose = () => Fusion.Application.MainThread.Schedule(document.Close); document.AddWindowController(new DocumentWindowController(handle)); }); }
public async Task <TU> ShowDialog <TU>(Func <IDialog <TU>, Window> window) { return(await await Fusion.Application.MainThread.InvokeAsync(() => { var childWindow = new MacDialog <TU>(); var model = window(childWindow); var handle = WindowImplementation.Create(model, Optional.None()); childWindow._parent = handle; childWindow._onClose = () => Fusion.Application.MainThread.Schedule(() => { if (model.Style == WindowStyle.Sheet) { NSApplication.SharedApplication.EndSheet(handle); handle.OrderOut(handle); } else { handle.Close(); } }); if (model.Style == WindowStyle.Sheet) { NSApplication.SharedApplication.BeginSheet(handle, _parent.Value); } else { handle.MakeKeyAndOrderFront(handle); } return childWindow._result.FirstAsync(); })); }
public void Initialize(IList <string> args, bool isDocumentApp) { Console.CancelKeyPress += (sender, e) => Exit(0); NSApplication.Init(); _dispatcher = _dispatcher ?? new Dispatcher(Thread.CurrentThread); Fusion.Application.MainThread = _dispatcher; Fusion.Application.PerFrame = Observable.Interval( TimeSpan.FromSeconds(1.0 / 60.0), new SynchronizationContextScheduler(SynchronizationContext.Current)); var app = new AppDelegate(isDocumentApp); NSApplication.SharedApplication.Delegate = app; //TODO do we really need to retain this object? #pragma warning disable 0219 var documentController = new NSDocumentController(); #pragma warning restore 0219 NSApplication.CheckForIllegalCrossThreadCalls = false; AppDelegate.ThrowOnTerminate = false; Desktop = new MacDialog <object>(); EffectsImplementation.Initialize(_dispatcher); // Make so that the window popups with focus. NSApplication.SharedApplication.ActivateIgnoringOtherApps(true); MacEnvironment.Initialize(new MacEnvironmentImpl()); DraggingImplementation.Initialize(_dispatcher); MenuBuilder.Initialize(_dispatcher); LayeringImplementation.Initialize(_dispatcher); LabelImplementation.Initialize(_dispatcher); SliderImplementation.Initialize(_dispatcher); LineImplementation.Initialize(_dispatcher); CircleImplementation.Initialize(_dispatcher); RectangleImplementation.Initialize(_dispatcher); TextBoxImplementation.Initialize(_dispatcher); CursorsImplementation.Initialize(_dispatcher); ToolTipImplementation.Initialize(_dispatcher); ContextMenuImplementation.Initialize(_dispatcher); DropDownImplementation.Initialize(_dispatcher); ButtonImplementation.Initialize(_dispatcher); ColorPickerImplementation.Initialize(_dispatcher); ScrollingImplementation.Initialize(_dispatcher); LogViewImplementation.Initialize(_dispatcher); Transformation.Initialize(); ImageImplementation.Initialize(_dispatcher); OverlayImplementation.Initialize(_dispatcher); PointerImplementation.Initialize(_dispatcher); KeyboardImplementation.Initialize(_dispatcher); WebViewImplementation.Initialize(_dispatcher); LayoutTrackerImplementation.Initialize(); FileDialogs.Initialize(); // TODO: Fix this!!! Clipping.Initialize((control, clip) => control); // This notification occurs a _lot_, but is the most specific one I was able to find that would // allow us to be notified when the first responder changes consistently NSNotificationCenter.DefaultCenter.AddObserver(new NSString("NSApplicationDidUpdateNotification"), _ => { var keyWindow = NSApplication.SharedApplication.KeyWindow; _firstResponder.OnNext(keyWindow != null ? keyWindow.FirstResponder : null); }); app.Terminates.Subscribe(_ => { if (Terminating != null) { Terminating(); } }); EditMenu = /*CreateFirstResponderMenuItem(name: "Undo", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.Z), selectorName: "undo:") + CreateFirstResponderMenuItem(name: "Redo", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta | Fusion.ModifierKeys.Shift, Key.Z), selectorName: "redo:") + MenuItem.CreateSeparator() + */CreateFirstResponderMenuItem(name: "Cut", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.X), selectorName: "cut:") + CreateFirstResponderMenuItem(name: "Copy", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.C), selectorName: "copy:") + CreateFirstResponderMenuItem(name: "Paste", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.V), selectorName: "paste:") + CreateFirstResponderMenuItem(name: "Paste and Match Style", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta | Fusion.ModifierKeys.Shift, Key.V), selectorName: "pasteAsPlainText:") + CreateFirstResponderMenuItem(name: "Delete", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.Backspace), selectorName: "delete:") + CreateFirstResponderMenuItem(name: "Select All", hotkey: HotKey.Create(Fusion.ModifierKeys.Meta, Key.A), selectorName: "selectAll:"); }