ui/winui/commandbar.cpp

branch
newapi
changeset 206
7ebc5a747c6f
parent 205
b1ac0dd1d38b
child 207
93b9f502cb88
equal deleted inserted replaced
205:b1ac0dd1d38b 206:7ebc5a747c6f
29 #include "pch.h" 29 #include "pch.h"
30 30
31 #include "commandbar.h" 31 #include "commandbar.h"
32 32
33 #include "util.h" 33 #include "util.h"
34 #include "../common/object.h"
35 #include "../common/context.h"
36
37 #include "button.h"
34 38
35 using namespace winrt; 39 using namespace winrt;
36 using namespace Microsoft::UI::Xaml; 40 using namespace Microsoft::UI::Xaml;
37 using namespace Microsoft::UI::Xaml::Controls; 41 using namespace Microsoft::UI::Xaml::Controls;
38 using namespace Microsoft::UI::Xaml::XamlTypeInfo; 42 using namespace Microsoft::UI::Xaml::XamlTypeInfo;
39 using namespace Microsoft::UI::Xaml::Markup; 43 using namespace Microsoft::UI::Xaml::Markup;
40 using namespace Windows::UI::Xaml::Interop; 44 using namespace Windows::UI::Xaml::Interop;
41 45
42 static void create_item(CommandBar cb, UiToolbarItemI* i); 46 static void create_item(UiObject* obj, CommandBar cb, UiToolbarItemI* i);
43 static void create_cmditem(CommandBar cb, UiToolbarItem* item); 47 static void create_cmditem(UiObject* obj, CommandBar cb, UiToolbarItem* item);
44 static void create_toggleitem(CommandBar cb, UiToolbarToggleItem* item); 48 static void create_toggleitem(UiObject* obj, CommandBar cb, UiToolbarToggleItem* item);
45 49
46 CommandBar ui_create_toolbar() { 50 CommandBar ui_create_toolbar(UiObject *obj) {
51
52 CommandBar cb = CommandBar();
53 cb.DefaultLabelPosition(CommandBarDefaultLabelPosition::Right);
54
55 // add pre-configured items
47 CxList* defaults = uic_get_toolbar_defaults(); 56 CxList* defaults = uic_get_toolbar_defaults();
48 CommandBar cb = CommandBar();
49 CxIterator i = cxListIterator(defaults); 57 CxIterator i = cxListIterator(defaults);
50 cx_foreach(char*, def, i) { 58 cx_foreach(char*, def, i) {
51 UiToolbarItemI* item = uic_toolbar_get_item(def); 59 UiToolbarItemI* item = uic_toolbar_get_item(def);
52 if (!item) { 60 if (!item) {
53 exit(-1); // TODO: maybe a error dialog? 61 exit(-1); // TODO: maybe an error dialog?
54 } 62 }
55 63 create_item(obj, cb, item);
56 create_item(cb, item);
57 } 64 }
58
59 return cb; 65 return cb;
60 } 66 }
61 67
62 static void create_item(CommandBar cb, UiToolbarItemI* i) { 68 static void create_item(UiObject* obj, CommandBar cb, UiToolbarItemI* i) {
63 switch (i->type) { 69 switch (i->type) {
64 case UI_TOOLBAR_ITEM: { 70 case UI_TOOLBAR_ITEM: {
65 create_cmditem(cb, (UiToolbarItem*)i); 71 create_cmditem(obj, cb, (UiToolbarItem*)i);
66 break; 72 break;
67 } 73 }
68 case UI_TOOLBAR_TOGGLEITEM: { 74 case UI_TOOLBAR_TOGGLEITEM: {
69 create_toggleitem(cb, (UiToolbarToggleItem*)i); 75 create_toggleitem(obj, cb, (UiToolbarToggleItem*)i);
70 break; 76 break;
71 } 77 }
72 } 78 }
73 } 79 }
74 80
75 static void create_cmditem(CommandBar cb, UiToolbarItem* item) { 81 static void create_cmditem(UiObject* obj, CommandBar cb, UiToolbarItem* item) {
76 AppBarButton button = AppBarButton(); 82 AppBarButton button = AppBarButton();
77 if (item->args.label) { 83 if (item->args.label) {
78 wchar_t* wlabel = str2wstr(item->args.label, nullptr); 84 wchar_t* wlabel = str2wstr(item->args.label, nullptr);
79 button.Content(box_value(wlabel)); 85 button.Content(box_value(wlabel));
80 free(wlabel); 86 free(wlabel);
81 } 87 }
82 88
89 // register callback
90 if (item->args.onclick) {
91 ui_callback cbfunc = item->args.onclick;
92 void* cbdata = item->args.onclickdata;
93 button.Click([cbfunc, cbdata, obj](Windows::Foundation::IInspectable const& sender, RoutedEventArgs) {
94 UiEvent evt;
95 evt.obj = obj;
96 evt.window = obj->window;
97 evt.document = obj->ctx->document;
98 evt.eventdata = nullptr;
99 evt.intval = 0;
100 cbfunc(&evt, cbdata);
101 });
102 }
103
83 cb.PrimaryCommands().Append(button); 104 cb.PrimaryCommands().Append(button);
84 } 105 }
85 106
86 static void create_toggleitem(CommandBar cb, UiToolbarToggleItem* item) {
87 107
108
109 static void create_toggleitem(UiObject *obj, CommandBar cb, UiToolbarToggleItem* item) {
110 AppBarToggleButton button = AppBarToggleButton();
111 if (item->args.label) {
112 wchar_t* wlabel = str2wstr(item->args.label, nullptr);
113 button.Content(box_value(wlabel));
114 free(wlabel);
115 }
116
117 UiVar* var = uic_widget_var(obj->ctx, obj->ctx, nullptr, item->args.varname, UI_VAR_INTEGER);
118 if (var) {
119 UIElement elm = button;
120 UiWidget* widget = new UiWidget(elm);
121 ui_context_add_widget_destructor(obj->ctx, widget);
122
123 UiInteger* value = (UiInteger*)var->value;
124 int64_t i = value->value;
125 value->get = ui_toggle_button_get;
126 value->set = ui_toggle_button_set;
127 value->obj = widget;
128 ui_toggle_button_set(value, i); // init togglebutton state
129
130 // listener for notifying observers
131 togglebutton_register_checked_observers(button, obj, var);
132 togglebutton_register_unchecked_observers(button, obj, var);
133 }
134
135 UiToggleArgs args = {};
136 args.onchange = item->args.onchange;
137 args.onchangedata = item->args.onchangedata;
138 togglebutton_register_callback(button, obj, args);
139
140
141 cb.PrimaryCommands().Append(button);
88 } 142 }
143
144

mercurial