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 |