ui/cocoa/MainWindow.m

changeset 811
1391ba7e533f
parent 785
b943e3d618f0
child 826
e596cfc1ca46
equal deleted inserted replaced
810:7b5ba65b246f 811:1391ba7e533f
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

mercurial