ui/cocoa/MainWindow.m

changeset 112
c3f2f16fa4b8
parent 110
c00e968d018b
child 113
dde28a806552
equal deleted inserted replaced
111:81c4f73236a4 112:c3f2f16fa4b8
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

mercurial