ui/win32/menu.c

changeset 1036
24677835f298
parent 1035
86d3a45dc928
child 1037
fbe4bb4eba8c
equal deleted inserted replaced
1035:86d3a45dc928 1036:24677835f298
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 }

mercurial