| 29 #import "MainWindow.h" |
29 #import "MainWindow.h" |
| 30 #import "Container.h" |
30 #import "Container.h" |
| 31 #import "GridLayout.h" |
31 #import "GridLayout.h" |
| 32 #import "BoxContainer.h" |
32 #import "BoxContainer.h" |
| 33 #import "../common/object.h" |
33 #import "../common/object.h" |
| |
34 #import "../ui/properties.h" |
| 34 #import <objc/runtime.h> |
35 #import <objc/runtime.h> |
| 35 |
36 |
| 36 #import "EventData.h" |
37 #import "EventData.h" |
| 37 #import "menu.h" |
38 #import "menu.h" |
| 38 #import "Toolbar.h" |
39 #import "Toolbar.h" |
| 39 |
40 |
| 40 @implementation MainWindow |
41 @implementation MainWindow |
| 41 |
42 |
| 42 - (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)sidebar { |
43 - (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview{ |
| 43 NSRect frame = NSMakeRect(300, 200, 600, 500); |
44 NSRect frame = NSMakeRect(300, 200, 600, 500); |
| 44 |
45 |
| 45 self = [self initWithContentRect:frame |
46 self = [self initWithContentRect:frame |
| 46 styleMask:NSWindowStyleMaskTitled | |
47 styleMask:NSWindowStyleMaskTitled | |
| 47 NSWindowStyleMaskResizable | |
48 NSWindowStyleMaskResizable | |
| 56 [self setToolbar:toolbar]; |
57 [self setToolbar:toolbar]; |
| 57 } |
58 } |
| 58 |
59 |
| 59 int top = 4; |
60 int top = 4; |
| 60 NSView *content = self.contentView; |
61 NSView *content = self.contentView; |
| 61 if(sidebar) { |
62 |
| |
63 // A sidebar or splitview window need a NSSplitView |
| |
64 NSSplitView *splitview; |
| |
65 if(hasSidebar || hasSplitview) { |
| 62 self.styleMask |= NSWindowStyleMaskFullSizeContentView; |
66 self.styleMask |= NSWindowStyleMaskFullSizeContentView; |
| 63 self.titleVisibility = NSWindowTitleHidden; |
67 self.titleVisibility = NSWindowTitleHidden; |
| 64 self.titlebarAppearsTransparent = YES; |
68 self.titlebarAppearsTransparent = YES; |
| 65 |
69 |
| 66 NSSplitView *splitview = [[NSSplitView alloc]init]; |
70 splitview = [[NSSplitView alloc]init]; |
| 67 splitview.vertical = YES; |
71 splitview.vertical = YES; |
| 68 splitview.dividerStyle = NSSplitViewDividerStyleThin; |
72 splitview.dividerStyle = NSSplitViewDividerStyleThin; |
| 69 splitview.translatesAutoresizingMaskIntoConstraints = false; |
73 splitview.translatesAutoresizingMaskIntoConstraints = false; |
| 70 [self.contentView addSubview:splitview]; |
74 [self.contentView addSubview:splitview]; |
| 71 |
75 |
| 74 [splitview.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor], |
78 [splitview.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor], |
| 75 [splitview.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], |
79 [splitview.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], |
| 76 [splitview.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor] |
80 [splitview.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor] |
| 77 ]]; |
81 ]]; |
| 78 |
82 |
| 79 _sidebar = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
83 top = 34; |
| |
84 } |
| |
85 |
| |
86 if(hasSidebar) { |
| |
87 // add the sidebar |
| |
88 const char *sidebarMaterialProperty = ui_get_property("ui.cocoa.sidebar.usematerial"); |
| |
89 BOOL useMaterial = YES; |
| |
90 if(sidebarMaterialProperty && (sidebarMaterialProperty[0] == 'f' || sidebarMaterialProperty[0] == 'F')) { |
| |
91 useMaterial = NO; |
| |
92 } |
| |
93 |
| |
94 if(useMaterial) { |
| |
95 NSVisualEffectView *v = [[NSVisualEffectView alloc] initWithFrame:NSMakeRect(0,0,0,0)]; |
| |
96 v.material = NSVisualEffectMaterialSidebar; |
| |
97 v.blendingMode = NSVisualEffectBlendingModeBehindWindow; |
| |
98 v.state = NSVisualEffectStateActive; |
| |
99 _sidebar = v; |
| |
100 } else { |
| |
101 _sidebar = [[NSView alloc]initWithFrame:NSMakeRect(0,0,0,0)]; |
| |
102 } |
| |
103 _sidebar.translatesAutoresizingMaskIntoConstraints = NO; |
| 80 [splitview addArrangedSubview:_sidebar]; |
104 [splitview addArrangedSubview:_sidebar]; |
| 81 |
105 [_sidebar.widthAnchor constraintGreaterThanOrEqualToConstant:250].active = YES; |
| |
106 } |
| |
107 if(hasSplitview) { |
| |
108 // add the splitview window left/right panels |
| |
109 _leftPanel = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
| |
110 [splitview addArrangedSubview:_leftPanel]; |
| |
111 _rightPanel = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
| |
112 [splitview addArrangedSubview:_rightPanel]; |
| |
113 } else if(hasSidebar) { |
| |
114 // sidebar only window: add content view |
| 82 content = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
115 content = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
| 83 [splitview addArrangedSubview:content]; |
116 [splitview addArrangedSubview:content]; |
| 84 |
117 } |
| 85 top = 34; |
118 |
| 86 } |
119 // normal or sidebar-only windows get a container |
| 87 |
120 if(!hasSplitview) { |
| 88 // create a vertical stackview as default container |
121 // create a vertical stackview as default container |
| 89 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:0]; |
122 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:0]; |
| 90 //GridLayout *vbox = [[GridLayout alloc] init]; |
123 //GridLayout *vbox = [[GridLayout alloc] init]; |
| 91 vbox.translatesAutoresizingMaskIntoConstraints = false; |
124 vbox.translatesAutoresizingMaskIntoConstraints = false; |
| 92 [content addSubview:vbox]; |
125 [content addSubview:vbox]; |
| 93 [NSLayoutConstraint activateConstraints:@[ |
126 [NSLayoutConstraint activateConstraints:@[ |
| 94 [vbox.topAnchor constraintEqualToAnchor:content.topAnchor constant:top], |
127 [vbox.topAnchor constraintEqualToAnchor:content.topAnchor constant:top], |
| 95 [vbox.leadingAnchor constraintEqualToAnchor:content.leadingAnchor], |
128 [vbox.leadingAnchor constraintEqualToAnchor:content.leadingAnchor], |
| 96 [vbox.trailingAnchor constraintEqualToAnchor:content.trailingAnchor], |
129 [vbox.trailingAnchor constraintEqualToAnchor:content.trailingAnchor], |
| 97 [vbox.bottomAnchor constraintEqualToAnchor:content.bottomAnchor], |
130 [vbox.bottomAnchor constraintEqualToAnchor:content.bottomAnchor], |
| 98 ]]; |
131 ]]; |
| 99 uic_object_push_container(obj, ui_create_container(obj, vbox)); |
132 UiContainerX *container = ui_create_container(obj, vbox); |
| |
133 vbox.container = container; |
| |
134 uic_object_push_container(obj, container); |
| |
135 } |
| |
136 _topOffset = top; |
| 100 |
137 |
| 101 return self; |
138 return self; |
| 102 } |
139 } |
| |
140 |
| |
141 - (BOOL) getIsVisible { |
| |
142 return [self isVisible]; |
| |
143 } |
| |
144 |
| |
145 - (void) setVisible:(BOOL)visible { |
| |
146 if(visible) { |
| |
147 [self makeKeyAndOrderFront:nil]; |
| |
148 } else { |
| |
149 [self close]; |
| |
150 } |
| |
151 } |
| |
152 |
| 103 |
153 |
| 104 @end |
154 @end |
| 105 |
155 |
| 106 |
156 |
| 107 @implementation MainWindowController |
157 @implementation MainWindowController |
| 310 } |
360 } |
| 311 NSView *sidebar = window.sidebar; |
361 NSView *sidebar = window.sidebar; |
| 312 |
362 |
| 313 // create a vertical stackview as default container |
363 // create a vertical stackview as default container |
| 314 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:args->spacing]; |
364 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:args->spacing]; |
| |
365 vbox.container = ui_create_container(obj, vbox); |
| 315 //GridLayout *vbox = [[GridLayout alloc] init]; |
366 //GridLayout *vbox = [[GridLayout alloc] init]; |
| 316 vbox.translatesAutoresizingMaskIntoConstraints = false; |
367 vbox.translatesAutoresizingMaskIntoConstraints = false; |
| 317 [sidebar addSubview:vbox]; |
368 [sidebar addSubview:vbox]; |
| 318 [NSLayoutConstraint activateConstraints:@[ |
369 [NSLayoutConstraint activateConstraints:@[ |
| 319 [vbox.topAnchor constraintEqualToAnchor:sidebar.topAnchor constant:34], |
370 [vbox.topAnchor constraintEqualToAnchor:sidebar.topAnchor constant:34], |
| 320 [vbox.leadingAnchor constraintEqualToAnchor:sidebar.leadingAnchor], |
371 [vbox.leadingAnchor constraintEqualToAnchor:sidebar.leadingAnchor], |
| 321 [vbox.trailingAnchor constraintEqualToAnchor:sidebar.trailingAnchor], |
372 [vbox.trailingAnchor constraintEqualToAnchor:sidebar.trailingAnchor], |
| 322 [vbox.bottomAnchor constraintEqualToAnchor:sidebar.bottomAnchor] |
373 [vbox.bottomAnchor constraintEqualToAnchor:sidebar.bottomAnchor] |
| 323 ]]; |
374 ]]; |
| 324 uic_object_push_container(obj, ui_create_container(obj, vbox)); |
375 uic_object_push_container(obj, vbox.container); |
| 325 |
376 |
| 326 return NULL; |
377 return NULL; |
| 327 } |
378 } |
| |
379 |
| |
380 static UIWIDGET splitview_window_add_panel(UiObject *obj, NSView *panel, UiSidebarArgs *args) { |
| |
381 MainWindow *window = (__bridge MainWindow*)obj->wobj; |
| |
382 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:0]; |
| |
383 //GridLayout *vbox = [[GridLayout alloc] init]; |
| |
384 vbox.container = ui_create_container(obj, vbox); |
| |
385 vbox.translatesAutoresizingMaskIntoConstraints = false; |
| |
386 [panel addSubview:vbox]; |
| |
387 [NSLayoutConstraint activateConstraints:@[ |
| |
388 [vbox.topAnchor constraintEqualToAnchor:panel.topAnchor constant:window.topOffset], |
| |
389 [vbox.leadingAnchor constraintEqualToAnchor:panel.leadingAnchor], |
| |
390 [vbox.trailingAnchor constraintEqualToAnchor:panel.trailingAnchor], |
| |
391 [vbox.bottomAnchor constraintEqualToAnchor:panel.bottomAnchor], |
| |
392 ]]; |
| |
393 uic_object_push_container(obj, vbox.container); |
| |
394 return (__bridge void*)vbox; |
| |
395 } |
| |
396 |
| |
397 UIWIDGET ui_left_panel_create(UiObject *obj, UiSidebarArgs *args) { |
| |
398 MainWindow *window = (__bridge MainWindow*)obj->wobj; |
| |
399 if(window.leftPanel == nil) { |
| |
400 return NULL; |
| |
401 } |
| |
402 return splitview_window_add_panel(obj, window.leftPanel, args); |
| |
403 } |
| |
404 |
| |
405 UIWIDGET ui_right_panel_create(UiObject *obj, UiSidebarArgs *args) { |
| |
406 MainWindow *window = (__bridge MainWindow*)obj->wobj; |
| |
407 if(window.rightPanel == nil) { |
| |
408 return NULL; |
| |
409 } |
| |
410 return splitview_window_add_panel(obj, window.rightPanel, args); |
| |
411 } |
| |
412 |