# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1671761928 0 # Node ID 5ae86b3959277422b8712cf3971614a557865abd # Parent 387a6242fa77780c8cf9d8ebc0eac3c19f640783 C++: Implement the Tree widget. diff -r 387a6242fa77 -r 5ae86b395927 dw.hpp --- a/dw.hpp Thu Dec 22 23:51:04 2022 +0000 +++ b/dw.hpp Fri Dec 23 02:18:48 2022 +0000 @@ -1018,8 +1018,8 @@ std::function _ConnectItemEnter; std::function _ConnectColumnClick; #else - int (*_ConnectItemEnter)(HTREEITEM, char *, void *); - int (*_ConnectColumnClick)(char *, int, int, void *); + int (*_ConnectItemEnter)(char *); + int (*_ConnectColumnClick)(int); #endif static int _OnItemEnter(HWND window, char *text, void *data) { if(reinterpret_cast(data)->_ConnectItemEnter) @@ -1135,6 +1135,67 @@ void SetItem(int column, int row, void *data) { dw_filesystem_set_item(hwnd, allocpointer, column, row, data); } }; +class Tree : virtual public Focusable, virtual public ObjectView +{ +private: + bool TreeExpandConnected; +#ifdef DW_CPP11 + std::function _ConnectTreeExpand; +#else + int (*_ConnectTreeExpand)(HTREEITEM); +#endif + static int _OnTreeExpand(HWND window, HTREEITEM item, void *data) { + if(reinterpret_cast(data)->_ConnectTreeExpand) + return reinterpret_cast(data)->_ConnectTreeExpand(item); + return reinterpret_cast(data)->OnTreeExpand(item); + } + void SetupTree() { + if(IsOverridden(Tree::OnTreeExpand, this)) { + dw_signal_connect(hwnd, DW_SIGNAL_TREE_EXPAND, DW_SIGNAL_FUNC(_OnTreeExpand), this); + TreeExpandConnected = true; + } + } +protected: + // Our signal handler functions to be overriden... + // If they are not overridden and an event is generated, remove the unused handler + virtual int OnTreeExpand(HTREEITEM item) { + dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_TREE_EXPAND); + TreeExpandConnected = false; + return FALSE; + } +public: + // Constructors + Tree(unsigned long id) { SetHWND(dw_tree_new(id)); SetupObjectView(); SetupTree(); } + Tree() { SetHWND(dw_tree_new(0)); SetupObjectView(); SetupTree(); } + + // User functions + void Clear() { dw_tree_clear(hwnd); } + HTREEITEM GetParent(HTREEITEM item) { return dw_tree_get_parent(hwnd, item); } + char *GetTitle(HTREEITEM item) { return dw_tree_get_title(hwnd, item); } + HTREEITEM Insert(const char *title, HICN icon, HTREEITEM parent, void *itemdata) { return dw_tree_insert(hwnd, title, icon, parent, itemdata); } + HTREEITEM Insert(const char *title, HTREEITEM item, HICN icon, HTREEITEM parent, void *itemdata) { return dw_tree_insert_after(hwnd, item, title, icon, parent, itemdata); } + void Change(HTREEITEM item, const char *title, HICN icon) { dw_tree_item_change(hwnd, item, title, icon); } + void Collapse(HTREEITEM item) { dw_tree_item_collapse(hwnd, item); } + void Delete(HTREEITEM item) { dw_tree_item_delete(hwnd, item); } + void Expand(HTREEITEM item) { dw_tree_item_expand(hwnd, item); } + void *GetData(HTREEITEM item) { dw_tree_item_get_data(hwnd, item); } + void Select(HTREEITEM item) { dw_tree_item_select(hwnd, item); } + void SetData(HTREEITEM item, void *itemdata) { dw_tree_item_set_data(hwnd, item, itemdata); } +#ifdef DW_CPP11 + void ConnectTreeExpand(std::function userfunc) +#else + void ConnectTreeExpand(int (*userfunc)(HTREEITEM)) +#endif + { + _ConnectTreeExpand = userfunc; + if(!TreeExpandConnected) { + dw_signal_connect(hwnd, DW_SIGNAL_TREE_EXPAND, DW_SIGNAL_FUNC(_OnTreeExpand), this); + TreeExpandConnected = true; + } + } +}; + + class App { protected: