| 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 } |