| 37 #import "menu.h" |
37 #import "menu.h" |
| 38 #import "Toolbar.h" |
38 #import "Toolbar.h" |
| 39 |
39 |
| 40 @implementation MainWindow |
40 @implementation MainWindow |
| 41 |
41 |
| 42 - (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)sidebar { |
42 - (MainWindow*)init:(UiObject*)obj withSidebar:(BOOL)hasSidebar withSplitview:(BOOL)hasSplitview{ |
| 43 NSRect frame = NSMakeRect(300, 200, 600, 500); |
43 NSRect frame = NSMakeRect(300, 200, 600, 500); |
| 44 |
44 |
| 45 self = [self initWithContentRect:frame |
45 self = [self initWithContentRect:frame |
| 46 styleMask:NSWindowStyleMaskTitled | |
46 styleMask:NSWindowStyleMaskTitled | |
| 47 NSWindowStyleMaskResizable | |
47 NSWindowStyleMaskResizable | |
| 56 [self setToolbar:toolbar]; |
56 [self setToolbar:toolbar]; |
| 57 } |
57 } |
| 58 |
58 |
| 59 int top = 4; |
59 int top = 4; |
| 60 NSView *content = self.contentView; |
60 NSView *content = self.contentView; |
| 61 if(sidebar) { |
61 |
| |
62 // A sidebar or splitview window need a NSSplitView |
| |
63 NSSplitView *splitview; |
| |
64 if(hasSidebar || hasSplitview) { |
| 62 self.styleMask |= NSWindowStyleMaskFullSizeContentView; |
65 self.styleMask |= NSWindowStyleMaskFullSizeContentView; |
| 63 self.titleVisibility = NSWindowTitleHidden; |
66 self.titleVisibility = NSWindowTitleHidden; |
| 64 self.titlebarAppearsTransparent = YES; |
67 self.titlebarAppearsTransparent = YES; |
| 65 |
68 |
| 66 NSSplitView *splitview = [[NSSplitView alloc]init]; |
69 splitview = [[NSSplitView alloc]init]; |
| 67 splitview.vertical = YES; |
70 splitview.vertical = YES; |
| 68 splitview.dividerStyle = NSSplitViewDividerStyleThin; |
71 splitview.dividerStyle = NSSplitViewDividerStyleThin; |
| 69 splitview.translatesAutoresizingMaskIntoConstraints = false; |
72 splitview.translatesAutoresizingMaskIntoConstraints = false; |
| 70 [self.contentView addSubview:splitview]; |
73 [self.contentView addSubview:splitview]; |
| 71 |
74 |
| 74 [splitview.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor], |
77 [splitview.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor], |
| 75 [splitview.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], |
78 [splitview.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor], |
| 76 [splitview.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor] |
79 [splitview.bottomAnchor constraintEqualToAnchor:self.contentView.bottomAnchor] |
| 77 ]]; |
80 ]]; |
| 78 |
81 |
| 79 _sidebar = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
82 top = 34; |
| |
83 } |
| |
84 |
| |
85 if(hasSidebar) { |
| |
86 // add the sidebar |
| |
87 _sidebar = [[NSView alloc]initWithFrame:NSMakeRect(0,0,0,0)]; |
| |
88 _sidebar.translatesAutoresizingMaskIntoConstraints = NO; |
| 80 [splitview addArrangedSubview:_sidebar]; |
89 [splitview addArrangedSubview:_sidebar]; |
| 81 |
90 [_sidebar.widthAnchor constraintGreaterThanOrEqualToConstant:250].active = YES; |
| |
91 } |
| |
92 if(hasSplitview) { |
| |
93 // add the splitview window left/right panels |
| |
94 _leftPanel = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
| |
95 [splitview addArrangedSubview:_leftPanel]; |
| |
96 _rightPanel = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
| |
97 [splitview addArrangedSubview:_rightPanel]; |
| |
98 } else if(hasSidebar) { |
| |
99 // sidebar only window: add content view |
| 82 content = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
100 content = [[NSView alloc]initWithFrame:NSMakeRect(0,0,100,100)]; |
| 83 [splitview addArrangedSubview:content]; |
101 [splitview addArrangedSubview:content]; |
| 84 |
102 } |
| 85 top = 34; |
103 |
| 86 } |
104 // normal or sidebar-only windows get a container |
| 87 |
105 if(!hasSplitview) { |
| 88 // create a vertical stackview as default container |
106 // create a vertical stackview as default container |
| 89 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:0]; |
107 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:0]; |
| 90 //GridLayout *vbox = [[GridLayout alloc] init]; |
108 //GridLayout *vbox = [[GridLayout alloc] init]; |
| 91 vbox.translatesAutoresizingMaskIntoConstraints = false; |
109 vbox.translatesAutoresizingMaskIntoConstraints = false; |
| 92 [content addSubview:vbox]; |
110 [content addSubview:vbox]; |
| 93 [NSLayoutConstraint activateConstraints:@[ |
111 [NSLayoutConstraint activateConstraints:@[ |
| 94 [vbox.topAnchor constraintEqualToAnchor:content.topAnchor constant:top], |
112 [vbox.topAnchor constraintEqualToAnchor:content.topAnchor constant:top], |
| 95 [vbox.leadingAnchor constraintEqualToAnchor:content.leadingAnchor], |
113 [vbox.leadingAnchor constraintEqualToAnchor:content.leadingAnchor], |
| 96 [vbox.trailingAnchor constraintEqualToAnchor:content.trailingAnchor], |
114 [vbox.trailingAnchor constraintEqualToAnchor:content.trailingAnchor], |
| 97 [vbox.bottomAnchor constraintEqualToAnchor:content.bottomAnchor], |
115 [vbox.bottomAnchor constraintEqualToAnchor:content.bottomAnchor], |
| 98 ]]; |
116 ]]; |
| 99 uic_object_push_container(obj, ui_create_container(obj, vbox)); |
117 uic_object_push_container(obj, ui_create_container(obj, vbox)); |
| |
118 } |
| |
119 _topOffset = top; |
| 100 |
120 |
| 101 return self; |
121 return self; |
| 102 } |
122 } |
| 103 |
123 |
| 104 @end |
124 @end |
| 323 ]]; |
343 ]]; |
| 324 uic_object_push_container(obj, ui_create_container(obj, vbox)); |
344 uic_object_push_container(obj, ui_create_container(obj, vbox)); |
| 325 |
345 |
| 326 return NULL; |
346 return NULL; |
| 327 } |
347 } |
| |
348 |
| |
349 static UIWIDGET splitview_window_add_panel(UiObject *obj, NSView *panel, UiSidebarArgs *args) { |
| |
350 MainWindow *window = (__bridge MainWindow*)obj->wobj; |
| |
351 BoxContainer *vbox = [[BoxContainer alloc] init:NSUserInterfaceLayoutOrientationVertical spacing:0]; |
| |
352 //GridLayout *vbox = [[GridLayout alloc] init]; |
| |
353 vbox.translatesAutoresizingMaskIntoConstraints = false; |
| |
354 [panel addSubview:vbox]; |
| |
355 [NSLayoutConstraint activateConstraints:@[ |
| |
356 [vbox.topAnchor constraintEqualToAnchor:panel.topAnchor constant:window.topOffset], |
| |
357 [vbox.leadingAnchor constraintEqualToAnchor:panel.leadingAnchor], |
| |
358 [vbox.trailingAnchor constraintEqualToAnchor:panel.trailingAnchor], |
| |
359 [vbox.bottomAnchor constraintEqualToAnchor:panel.bottomAnchor], |
| |
360 ]]; |
| |
361 uic_object_push_container(obj, ui_create_container(obj, vbox)); |
| |
362 return (__bridge void*)vbox; |
| |
363 } |
| |
364 |
| |
365 UIWIDGET ui_left_panel_create(UiObject *obj, UiSidebarArgs *args) { |
| |
366 MainWindow *window = (__bridge MainWindow*)obj->wobj; |
| |
367 if(window.leftPanel == nil) { |
| |
368 return NULL; |
| |
369 } |
| |
370 return splitview_window_add_panel(obj, window.leftPanel, args); |
| |
371 } |
| |
372 |
| |
373 UIWIDGET ui_right_panel_create(UiObject *obj, UiSidebarArgs *args) { |
| |
374 MainWindow *window = (__bridge MainWindow*)obj->wobj; |
| |
375 if(window.rightPanel == nil) { |
| |
376 return NULL; |
| |
377 } |
| |
378 return splitview_window_add_panel(obj, window.rightPanel, args); |
| |
379 } |
| |
380 |