comparison dw.hpp @ 2914:8af64b6d75a9

C++: Start rewriting dwtest in C++ as dwtestoo. Only the lambda version currently, so will break on old compilers. Only the main window and first page is implemented so far but... the first page works on MacOS at least. Fill in some missing pieces I ran into while porting dwtest to C++.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 28 Dec 2022 01:00:12 +0000
parents 6981feb6210b
children fe43f8667d3d
comparison
equal deleted inserted replaced
2913:6981feb6210b 2914:8af64b6d75a9
72 void GetPreferredSize(int *width, int *height) { dw_window_get_preferred_size(hwnd, width, height); } 72 void GetPreferredSize(int *width, int *height) { dw_window_get_preferred_size(hwnd, width, height); }
73 int SetColor(unsigned long fore, unsigned long back) { return dw_window_set_color(hwnd, fore, back); } 73 int SetColor(unsigned long fore, unsigned long back) { return dw_window_set_color(hwnd, fore, back); }
74 void SetData(const char *dataname, void *data) { dw_window_set_data(hwnd, dataname, data); } 74 void SetData(const char *dataname, void *data) { dw_window_set_data(hwnd, dataname, data); }
75 void *GetData(const char *dataname) { return dw_window_get_data(hwnd, dataname); } 75 void *GetData(const char *dataname) { return dw_window_get_data(hwnd, dataname); }
76 void SetPointer(int cursortype) { dw_window_set_pointer(hwnd, cursortype); } 76 void SetPointer(int cursortype) { dw_window_set_pointer(hwnd, cursortype); }
77 void SetStyle(unsigned long style, unsigned long mask) { dw_window_set_style(hwnd, style, mask); } 77 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); }
78 void SetStyle(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); }
78 void SetTooltip(char *bubbletext) { dw_window_set_tooltip(hwnd, bubbletext); } 79 void SetTooltip(char *bubbletext) { dw_window_set_tooltip(hwnd, bubbletext); }
79 int Unpack() { return dw_box_unpack(hwnd); } 80 int Unpack() { return dw_box_unpack(hwnd); }
80 }; 81 };
81 82
82 // Box class is a packable object 83 // Box class is a packable object
84 { 85 {
85 public: 86 public:
86 // User functions 87 // User functions
87 void PackStart(Widget *item, int width, int height, int hsize, int vsize, int pad) { 88 void PackStart(Widget *item, int width, int height, int hsize, int vsize, int pad) {
88 dw_box_pack_start(hwnd, item ? item->GetHWND() : DW_NOHWND, width, height, hsize, vsize, pad); } 89 dw_box_pack_start(hwnd, item ? item->GetHWND() : DW_NOHWND, width, height, hsize, vsize, pad); }
90 void PackStart(Widget *item, int hsize, int vsize, int pad) {
91 dw_box_pack_start(hwnd, item ? item->GetHWND() : DW_NOHWND, DW_SIZE_AUTO, DW_SIZE_AUTO, hsize, vsize, pad); }
89 void PackEnd(Widget *item, int width, int height, int hsize, int vsize, int pad) { 92 void PackEnd(Widget *item, int width, int height, int hsize, int vsize, int pad) {
90 dw_box_pack_end(hwnd, item ? item->GetHWND() : DW_NOHWND, width, height, hsize, vsize, pad); } 93 dw_box_pack_end(hwnd, item ? item->GetHWND() : DW_NOHWND, width, height, hsize, vsize, pad); }
94 void PackEnd(Widget *item, int hsize, int vsize, int pad) {
95 dw_box_pack_end(hwnd, item ? item->GetHWND() : DW_NOHWND, DW_SIZE_AUTO, DW_SIZE_AUTO, hsize, vsize, pad); }
91 void PackAtIndex(Widget *item, int index, int width, int height, int hsize, int vsize, int pad) { 96 void PackAtIndex(Widget *item, int index, int width, int height, int hsize, int vsize, int pad) {
92 dw_box_pack_at_index(hwnd, item ? item->GetHWND() : DW_NOHWND, index, width, height, hsize, vsize, pad); } 97 dw_box_pack_at_index(hwnd, item ? item->GetHWND() : DW_NOHWND, index, width, height, hsize, vsize, pad); }
98 void PackAtIndex(Widget *item, int index, int hsize, int vsize, int pad) {
99 dw_box_pack_at_index(hwnd, item ? item->GetHWND() : DW_NOHWND, index, DW_SIZE_AUTO, DW_SIZE_AUTO, hsize, vsize, pad); }
93 Widget *UnpackAtIndex(int index) { HWND widget = dw_box_unpack_at_index(hwnd, index); 100 Widget *UnpackAtIndex(int index) { HWND widget = dw_box_unpack_at_index(hwnd, index);
94 void *classptr = widget ? dw_window_get_data(widget, "_dw_classptr") : DW_NULL; 101 void *classptr = widget ? dw_window_get_data(widget, "_dw_classptr") : DW_NULL;
95 return reinterpret_cast<Widget *>(classptr); 102 return reinterpret_cast<Widget *>(classptr);
96 } 103 }
97 }; 104 };
178 HMENUI menu; 185 HMENUI menu;
179 public: 186 public:
180 // User functions 187 // User functions
181 HMENUI GetHMENUI() { return menu; } 188 HMENUI GetHMENUI() { return menu; }
182 MenuItem *AppendItem(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu); 189 MenuItem *AppendItem(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu);
190 MenuItem *AppendItem(const char *title, unsigned long flags, int check, Menus *submenu);
191 MenuItem *AppendItem(const char *title, unsigned long flags, int check);
183 MenuItem *AppendItem(const char *title, Menus *submenu); 192 MenuItem *AppendItem(const char *title, Menus *submenu);
184 MenuItem *AppendItem(const char *title); 193 MenuItem *AppendItem(const char *title);
185 }; 194 };
186 195
187 class Menu : public Menus 196 class Menu : public Menus
208 public: 217 public:
209 // Constructors 218 // Constructors
210 MenuItem(Menus *menu, const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) { 219 MenuItem(Menus *menu, const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) {
211 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : DW_NOMENU)); Setup(); 220 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : DW_NOMENU)); Setup();
212 } 221 }
222 MenuItem(Menus *menu, const char *title, unsigned long flags, int check, Menus *submenu) {
223 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, flags, TRUE, check, submenu ? submenu->GetHMENUI() : DW_NOMENU)); Setup();
224 }
225 MenuItem(Menus *menu, const char *title, unsigned long flags, int check) {
226 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, flags, TRUE, check, DW_NOMENU)); Setup();
227 }
213 MenuItem(Menus *menu, const char *title, Menus *submenu) { 228 MenuItem(Menus *menu, const char *title, Menus *submenu) {
214 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, submenu ? submenu->GetHMENUI() : DW_NOMENU)); Setup(); 229 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, submenu ? submenu->GetHMENUI() : DW_NOMENU)); Setup();
215 } 230 }
216 MenuItem(Menus *menu, const char *title) { 231 MenuItem(Menus *menu, const char *title) {
217 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, DW_NOMENU)); Setup(); 232 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, DW_NOMENU)); Setup();
218 } 233 }
219 234
220 // User functions 235 // User functions
221 void SetState(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); } 236 void SetState(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); }
222 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); }
223 }; 237 };
224 238
225 MenuItem *Menus::AppendItem(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) { 239 MenuItem *Menus::AppendItem(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) {
226 return new MenuItem(this, title, id, flags, end, check, submenu); 240 return new MenuItem(this, title, id, flags, end, check, submenu);
241 }
242
243 MenuItem *Menus::AppendItem(const char *title, unsigned long flags, int check, Menus *submenu) {
244 return new MenuItem(this, title, flags, check, submenu);
245 }
246
247 MenuItem *Menus::AppendItem(const char *title, unsigned long flags, int check) {
248 return new MenuItem(this, title, flags, check);
227 } 249 }
228 250
229 MenuItem *Menus::AppendItem(const char *title, Menus *submenu) { 251 MenuItem *Menus::AppendItem(const char *title, Menus *submenu) {
230 return new MenuItem(this, title, submenu); 252 return new MenuItem(this, title, submenu);
231 } 253 }
885 class TextEntry : virtual public Focusable, virtual public TextWidget 907 class TextEntry : virtual public Focusable, virtual public TextWidget
886 { 908 {
887 public: 909 public:
888 // User functions 910 // User functions
889 void ClickDefault(Focusable *next) { if(next) dw_window_click_default(hwnd, next->GetHWND()); } 911 void ClickDefault(Focusable *next) { if(next) dw_window_click_default(hwnd, next->GetHWND()); }
912 void SetLimit(int limit) { dw_entryfield_set_limit(hwnd, limit);}
890 }; 913 };
891 914
892 class Entryfield : public TextEntry 915 class Entryfield : public TextEntry
893 { 916 {
894 public: 917 public:
1098 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); } 1121 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); }
1099 }; 1122 };
1100 1123
1101 class Notebook : public Widget 1124 class Notebook : public Widget
1102 { 1125 {
1126 private:
1127 bool SwitchPageConnected;
1128 #ifdef DW_LAMBDA
1129 std::function<int(unsigned long)> _ConnectSwitchPage;
1130 #else
1131 int (*_ConnectSwitchPage)(unsigned long);
1132 #endif
1133 static int _OnSwitchPage(HWND window, unsigned long pageid, void *data) {
1134 if(reinterpret_cast<Notebook *>(data)->_ConnectSwitchPage)
1135 return reinterpret_cast<Notebook *>(data)->_ConnectSwitchPage(pageid);
1136 return reinterpret_cast<Notebook *>(data)->OnSwitchPage(pageid);
1137 }
1138 protected:
1139 void Setup() {
1140 _ConnectSwitchPage = 0;
1141 if(IsOverridden(Notebook::OnSwitchPage, this)) {
1142 dw_signal_connect(hwnd, DW_SIGNAL_SWITCH_PAGE, DW_SIGNAL_FUNC(_OnSwitchPage), this);
1143 SwitchPageConnected = true;
1144 } else {
1145 SwitchPageConnected = false;
1146 }
1147 }
1148 // Our signal handler functions to be overriden...
1149 // If they are not overridden and an event is generated, remove the unused handler
1150 virtual int OnSwitchPage(unsigned long pageid) {
1151 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_SWITCH_PAGE);
1152 SwitchPageConnected = false;
1153 return FALSE;
1154 }
1103 public: 1155 public:
1104 // Constructors 1156 // Constructors
1105 Notebook(unsigned long id, int top) { SetHWND(dw_notebook_new(id, top)); } 1157 Notebook(unsigned long id, int top) { SetHWND(dw_notebook_new(id, top)); }
1106 Notebook(unsigned long id) { SetHWND(dw_notebook_new(id, TRUE)); } 1158 Notebook(unsigned long id) { SetHWND(dw_notebook_new(id, TRUE)); }
1107 Notebook() { SetHWND(dw_notebook_new(0, TRUE)); } 1159 Notebook() { SetHWND(dw_notebook_new(0, TRUE)); }
1108 1160
1109 // User functions 1161 // User functions
1110 void Pack(unsigned long pageid, HWND page) { dw_notebook_pack(hwnd, pageid, page); } 1162 void Pack(unsigned long pageid, Widget *page) { dw_notebook_pack(hwnd, pageid, page ? page->GetHWND() : DW_NOHWND); }
1111 void PageDestroy(unsigned long pageid) { dw_notebook_page_destroy(hwnd, pageid); } 1163 void PageDestroy(unsigned long pageid) { dw_notebook_page_destroy(hwnd, pageid); }
1112 unsigned long PageGet() { return dw_notebook_page_get(hwnd); } 1164 unsigned long PageGet() { return dw_notebook_page_get(hwnd); }
1113 unsigned long PageNew(unsigned long flags, int front) { return dw_notebook_page_new(hwnd, flags, front); } 1165 unsigned long PageNew(unsigned long flags, int front) { return dw_notebook_page_new(hwnd, flags, front); }
1114 void PageSet(unsigned long pageid) { dw_notebook_page_set(hwnd, pageid); } 1166 void PageSet(unsigned long pageid) { dw_notebook_page_set(hwnd, pageid); }
1115 void PageSetStatusText(unsigned long pageid, const char *text) { dw_notebook_page_set_status_text(hwnd, pageid, text); } 1167 void PageSetStatusText(unsigned long pageid, const char *text) { dw_notebook_page_set_status_text(hwnd, pageid, text); }
1116 void PageSetText(unsigned long pageid, const char *text) { dw_notebook_page_set_text(hwnd, pageid, text); } 1168 void PageSetText(unsigned long pageid, const char *text) { dw_notebook_page_set_text(hwnd, pageid, text); }
1169 #ifdef DW_LAMBDA
1170 void ConnectSwitchPage(std::function<int(unsigned long)> userfunc)
1171 #else
1172 void ConnectSwitchPage(int (*userfunc)(unsigned long))
1173 #endif
1174 {
1175 _ConnectSwitchPage = userfunc;
1176 if(!SwitchPageConnected) {
1177 dw_signal_connect(hwnd, DW_SIGNAL_SWITCH_PAGE, DW_SIGNAL_FUNC(_OnSwitchPage), this);
1178 SwitchPageConnected = true;
1179 }
1180 }
1117 }; 1181 };
1118 1182
1119 class ObjectView : virtual public Widget 1183 class ObjectView : virtual public Widget
1120 { 1184 {
1121 private: 1185 private:
1176 _ConnectItemSelect = userfunc; 1240 _ConnectItemSelect = userfunc;
1177 if(!ItemSelectConnected) { 1241 if(!ItemSelectConnected) {
1178 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); 1242 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
1179 ItemSelectConnected = true; 1243 ItemSelectConnected = true;
1180 } 1244 }
1181 } 1245 }
1182 #ifdef DW_LAMBDA 1246 #ifdef DW_LAMBDA
1183 void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc) 1247 void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc)
1184 #else 1248 #else
1185 void ConnectItemContext(int (*userfunc)(char *, int, int, void *)) 1249 void ConnectItemContext(int (*userfunc)(char *, int, int, void *))
1186 #endif 1250 #endif
1560 va_start(args, format); 1624 va_start(args, format);
1561 dw_vdebug(format, args); 1625 dw_vdebug(format, args);
1562 va_end(args); 1626 va_end(args);
1563 } 1627 }
1564 void Beep(int freq, int dur) { dw_beep(freq, dur); } 1628 void Beep(int freq, int dur) { dw_beep(freq, dur); }
1629 char *GetDir() { return dw_app_dir(); }
1565 void GetEnvironment(DWEnv *env) { dw_environment_query(env); } 1630 void GetEnvironment(DWEnv *env) { dw_environment_query(env); }
1631 int GetScreenWidth() { return dw_screen_width(); }
1632 int GetScreenHeight() { return dw_screen_height(); }
1633 unsigned long GetColorDepth() { return dw_color_depth_get(); }
1566 char *GetClipboard() { return dw_clipboard_get_text(); } 1634 char *GetClipboard() { return dw_clipboard_get_text(); }
1567 void SetClipboard(const char *text) { if(text) dw_clipboard_set_text(text, (int)strlen(text)); } 1635 void SetClipboard(const char *text) { if(text) dw_clipboard_set_text(text, (int)strlen(text)); }
1568 void SetClipboard(const char *text, int len) { if(text) dw_clipboard_set_text(text, len); } 1636 void SetClipboard(const char *text, int len) { if(text) dw_clipboard_set_text(text, len); }
1569 void SetDefaultFont(const char *fontname) { dw_font_set_default(fontname); } 1637 void SetDefaultFont(const char *fontname) { dw_font_set_default(fontname); }
1570 unsigned long ColorChoose(unsigned long initial) { return dw_color_choose(initial); } 1638 unsigned long ColorChoose(unsigned long initial) { return dw_color_choose(initial); }
1571 char *FileBrowse(const char *title, const char *defpath, const char *ext, int flags) { return dw_file_browse(title, defpath, ext, flags); } 1639 char *FileBrowse(const char *title, const char *defpath, const char *ext, int flags) { return dw_file_browse(title, defpath, ext, flags); }
1572 char *FontChoose(const char *currfont) { return dw_font_choose(currfont); } 1640 char *FontChoose(const char *currfont) { return dw_font_choose(currfont); }
1573 void Free(void *buff) { dw_free(buff); } 1641 void Free(void *buff) { dw_free(buff); }
1574 int GetFeature(DWFEATURE feature) { return dw_feature_get(feature); } 1642 int GetFeature(DWFEATURE feature) { return dw_feature_get(feature); }
1575 int SetFeature(DWFEATURE feature, int state) { return dw_feature_set(feature, state); } 1643 int SetFeature(DWFEATURE feature, int state) { return dw_feature_set(feature, state); }
1644 HICN LoadIcon(unsigned long id) { return dw_icon_load(0, id); }
1645 HICN LoadIcon(const char *filename) { return dw_icon_load_from_file(filename); }
1646 HICN LoadIcon(const char *data, int len) { return dw_icon_load_from_data(data, len); }
1647 void FreeIcon(HICN icon) { dw_icon_free(icon); }
1576 }; 1648 };
1577 1649
1578 // Static singleton reference declared outside of the class 1650 // Static singleton reference declared outside of the class
1579 App* App::_app = DW_NULL; 1651 App* App::_app = DW_NULL;
1580 1652