ui/cocoa/MainWindow.m

changeset 570
a2df724b4cb9
parent 569
5c06bb9ea458
child 571
f6e92de49959
equal deleted inserted replaced
569:5c06bb9ea458 570:a2df724b4cb9
31 #import "GridLayout.h" 31 #import "GridLayout.h"
32 #import "../common/object.h" 32 #import "../common/object.h"
33 #import <objc/runtime.h> 33 #import <objc/runtime.h>
34 34
35 #import "EventData.h" 35 #import "EventData.h"
36 #import "menu.h"
36 37
37 @implementation MainWindow 38 @implementation MainWindow
38 39
39 - (MainWindow*)init:(UiObject*)obj { 40 - (MainWindow*)init:(UiObject*)obj {
40 self.uiobj = obj;
41 NSRect frame = NSMakeRect(300, 200, 600, 500); 41 NSRect frame = NSMakeRect(300, 200, 600, 500);
42 42
43 self = [self initWithContentRect:frame 43 self = [self initWithContentRect:frame
44 styleMask:NSWindowStyleMaskTitled | 44 styleMask:NSWindowStyleMaskTitled |
45 NSWindowStyleMaskResizable | 45 NSWindowStyleMaskResizable |
63 uic_object_push_container(obj, ui_create_container(obj, vbox)); 63 uic_object_push_container(obj, ui_create_container(obj, vbox));
64 64
65 return self; 65 return self;
66 } 66 }
67 67
68 @end
69
70
71
72 @implementation MainWindowController
73
74 - (MainWindowController*)initWithWindow:(UiObject*)obj window:(NSWindow*)window {
75 self = [super initWithWindow:window];
76 _uiobj = obj;
77
78 // bind all stateful menu items (checkbox, radiobuttons, lists)
79 self.checkItemStates = [[NSMutableDictionary alloc] init];
80 NSArray *menuBindItems = ui_get_binding_items(); // returns all items that require binding
81 for(MenuItem *item in menuBindItems) {
82 if(item.checkItem) {
83 // simple check item (ui_menu_toggleitem_create)
84 UiVar *var = uic_widget_var(obj->ctx, obj->ctx, NULL, item.checkItem->varname, UI_VAR_INTEGER);
85 // create the state object for this item/window
86 MenuCheckItem *state = [[MenuCheckItem alloc] init];
87 state.mainWindow = self;
88 state.var = var;
89 if(var) {
90 // bind toggle item
91 UiInteger *i = var->value;
92 state.state = (int)i->value;
93 i->obj = (__bridge void*)state;
94 i->get = ui_menu_check_item_get;
95 i->set = ui_menu_check_item_set;
96 } else {
97 state.state = 0;
98 }
99 [_checkItemStates setObject:state forKey:item.itemId];
100 } else if(item.radioItem) {
101 // bind radio item
102
103 }
104 }
105
106 return self;
107 }
108
109 - (void) windowDidLoad {
110 [self.window setNextResponder:self];
111 }
112
68 - (void)menuItemAction:(id)sender { 113 - (void)menuItemAction:(id)sender {
69 EventData *event = objc_getAssociatedObject(sender, "eventdata"); 114 EventData *event = objc_getAssociatedObject(sender, "eventdata");
70 if(event) { 115 if(event) {
71 event.obj = self.uiobj; // temporary set the event object 116 event.obj = self.uiobj; // temporary set the event object
72 [event handleEvent:sender]; 117 [event handleEvent:sender];
73 } 118 }
74 } 119 }
75 120
121 - (void)menuCheckItemAction:(id)sender {
122 NSMenuItem *menuItem = sender;
123 MenuItem *item = objc_getAssociatedObject(sender, "menuitem");
124 if(!item || !item.checkItem) {
125 return;
126 }
127 UiMenuCheckItem *it = item.checkItem;
128
129 MenuCheckItem *state = [_checkItemStates objectForKey:item.itemId];
130 state.state = state.state == NSControlStateValueOff ? NSControlStateValueOn : NSControlStateValueOff;
131 menuItem.state = state.state;
132
133 if(it->callback) {
134 UiEvent event;
135 event.obj = _uiobj;
136 event.window = event.obj->window;
137 event.document = event.obj->ctx->document;
138 event.eventdata = state.var ? state.var->value : NULL;
139 event.intval = state.state;
140 it->callback(&event, it->userdata);
141 }
142 }
143
144 - (BOOL) validateMenuItem:(NSMenuItem *) menuItem {
145 MenuItem *item = objc_getAssociatedObject(menuItem, "menuitem");
146 if(item) {
147 MenuCheckItem *state = [_checkItemStates objectForKey:item.itemId];
148 if(state) {
149 menuItem.state = state.state;
150 } else {
151 menuItem.state = NSControlStateValueOff;
152 }
153 }
154
155 return YES;
156 }
157
76 @end 158 @end
159
160 @implementation MenuCheckItem
161
162 @end
163
164 int64_t ui_menu_check_item_get(UiInteger *i) {
165 MenuCheckItem *state = (__bridge MenuCheckItem*)i->obj;
166 i->value = state.state;
167 return i->value;
168 }
169
170 void ui_menu_check_item_set(UiInteger *i, int64_t value) {
171 MenuCheckItem *state = (__bridge MenuCheckItem*)i->obj;
172 i->value = value;
173 state.state = (int)value;
174 }

mercurial