| 64 createMenuItem[child->type](hMenu, i++, child, obj); |
64 createMenuItem[child->type](hMenu, i++, child, obj); |
| 65 child = child->next; |
65 child = child->next; |
| 66 } |
66 } |
| 67 } |
67 } |
| 68 |
68 |
| 69 static void menu_item_clicked(UiObject *obj, UiMenuItem *item) { |
69 static void menu_item_clicked(UiObject *obj, uint64_t id, UiMenuItem *item) { |
| 70 UiEvent event; |
70 UiEvent event; |
| 71 event.obj = obj; |
71 event.obj = obj; |
| 72 event.window = obj->window; |
72 event.window = obj->window; |
| 73 event.document = obj->ctx->document; |
73 event.document = obj->ctx->document; |
| 74 event.eventdata = NULL; |
74 event.eventdata = NULL; |
| 90 cmd.callback = (ui_command_func)menu_item_clicked; |
90 cmd.callback = (ui_command_func)menu_item_clicked; |
| 91 cmd.userdata = i; |
91 cmd.userdata = i; |
| 92 cxMapPut(obj->ctx->command_map, id, &cmd); |
92 cxMapPut(obj->ctx->command_map, id, &cmd); |
| 93 } |
93 } |
| 94 |
94 |
| |
95 static void menu_stateitem_update(UiStateMenuItem *item) { |
| |
96 MENUITEMINFO mi = { 0 }; |
| |
97 mi.cbSize = sizeof(mi); |
| |
98 mi.fMask = MIIM_STATE; |
| |
99 mi.fState = item->state ? MFS_CHECKED : MFS_UNCHECKED; |
| |
100 SetMenuItemInfo(item->menu, item->id, FALSE, &mi); |
| |
101 } |
| |
102 |
| |
103 static void menu_checkitem_clicked(UiObject *obj, uint64_t id, UiStateMenuItem *item) { |
| |
104 item->state = !item->state; |
| |
105 menu_stateitem_update(item); |
| |
106 |
| |
107 UiEvent event; |
| |
108 event.obj = obj; |
| |
109 event.window = obj->window; |
| |
110 event.document = obj->ctx->document; |
| |
111 event.eventdata = NULL; |
| |
112 event.eventdatatype = 0; |
| |
113 event.intval = 0; |
| |
114 event.set = 0; |
| |
115 if (item->onchange) { |
| |
116 item->onchange(&event, item->userdata); |
| |
117 } |
| |
118 |
| |
119 if (item->var) { |
| |
120 UiInteger *i = item->var->value; |
| |
121 ui_notify_evt(i->observers, &event); |
| |
122 } |
| |
123 } |
| |
124 |
| 95 void ui_add_menu_checkitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { |
125 void ui_add_menu_checkitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { |
| |
126 uint64_t id = ++obj->ctx->command_id_counter; |
| 96 |
127 |
| |
128 UiMenuCheckItem *i = (UiMenuCheckItem*)item; |
| |
129 AppendMenu(parent, MF_STRING, id, i->label); |
| |
130 |
| |
131 // create an UiStateMenuItem with the same lifetime as the UiObject |
| |
132 UiStateMenuItem *sitem = ui_malloc(obj->ctx, sizeof(UiStateMenuItem)); |
| |
133 memset(sitem, 0, sizeof(UiStateMenuItem)); |
| |
134 sitem->obj = obj; |
| |
135 sitem->menu = parent; |
| |
136 sitem->id = id; |
| |
137 sitem->onchange = i->callback; |
| |
138 sitem->userdata = i->userdata; |
| |
139 sitem->var = uic_widget_var(obj->ctx, obj->ctx, NULL, i->varname, UI_VAR_INTEGER); |
| |
140 // bind to var |
| |
141 if (sitem->var) { |
| |
142 UiInteger *v = sitem->var->value; |
| |
143 sitem->state = v->value != 0; |
| |
144 v->obj = sitem; |
| |
145 v->get = ui_checkitem_get; |
| |
146 v->set = ui_checkitem_set; |
| |
147 } |
| |
148 |
| |
149 // register command id |
| |
150 UiCommand cmd; |
| |
151 cmd.callback = (ui_command_func)menu_checkitem_clicked; |
| |
152 cmd.userdata = sitem; |
| |
153 cxMapPut(obj->ctx->command_map, id, &cmd); |
| |
154 |
| |
155 menu_stateitem_update(sitem); |
| |
156 } |
| |
157 |
| |
158 int64_t ui_checkitem_get(UiInteger *i) { |
| |
159 return i->value; |
| |
160 } |
| |
161 |
| |
162 void ui_checkitem_set(UiInteger *i, int64_t value) { |
| |
163 i->value = value; |
| |
164 menu_stateitem_update(i->obj); |
| 97 } |
165 } |
| 98 |
166 |
| 99 void ui_add_menu_radioitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { |
167 void ui_add_menu_radioitem(HMENU parent, int pos, UiMenuItemI *item, UiObject *obj) { |
| 100 |
168 |
| 101 } |
169 } |