comparison dw.hpp @ 2892:387a6242fa77

C++: Add the Container and Filesystem classes, plus the base for Tree.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 22 Dec 2022 23:51:04 +0000
parents 185c1e9674a1
children 5ae86b395927
comparison
equal deleted inserted replaced
2891:185c1e9674a1 2892:387a6242fa77
937 void SetEditable(int state) { dw_mle_set_editable(hwnd, state); } 937 void SetEditable(int state) { dw_mle_set_editable(hwnd, state); }
938 void SetVisible(int line) { dw_mle_set_visible(hwnd, line); } 938 void SetVisible(int line) { dw_mle_set_visible(hwnd, line); }
939 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); } 939 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); }
940 }; 940 };
941 941
942 class ObjectView : virtual public Widget
943 {
944 private:
945 bool ItemSelectConnected, ItemContextConnected;
946 #ifdef DW_CPP11
947 std::function<int(HTREEITEM, char *, void *)> _ConnectItemSelect;
948 std::function<int(char *, int, int, void *)> _ConnectItemContext;
949 #else
950 int (*_ConnectItemSelect)(HTREEITEM, char *, void *);
951 int (*_ConnectItemContext)(char *, int, int, void *);
952 #endif
953 static int _OnItemSelect(HWND window, HTREEITEM item, char *text, void *itemdata, void *data) {
954 if(reinterpret_cast<ObjectView *>(data)->_ConnectItemSelect)
955 return reinterpret_cast<ObjectView *>(data)->_ConnectItemSelect(item, text, itemdata);
956 return reinterpret_cast<ObjectView *>(data)->OnItemSelect(item, text, itemdata);
957 }
958 static int _OnItemContext(HWND window, char *text, int x, int y, void *itemdata, void *data) {
959 if(reinterpret_cast<ObjectView *>(data)->_ConnectItemContext)
960 return reinterpret_cast<ObjectView *>(data)->_ConnectItemContext(text, x, y, itemdata);
961 return reinterpret_cast<ObjectView *>(data)->OnItemContext(text, x, y, itemdata);
962 }
963 protected:
964 void SetupObjectView() {
965 if(IsOverridden(ObjectView::OnItemSelect, this)) {
966 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
967 ItemSelectConnected = true;
968 }
969 if(IsOverridden(ObjectView::OnItemContext, this)) {
970 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this);
971 ItemContextConnected = true;
972 }
973 }
974 // Our signal handler functions to be overriden...
975 // If they are not overridden and an event is generated, remove the unused handler
976 virtual int OnItemSelect(HTREEITEM item, char *text, void *itemdata) {
977 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_ITEM_SELECT);
978 ItemSelectConnected = false;
979 return FALSE;
980 }
981 virtual int OnItemContext(char *text, int x, int y, void *itemdata) {
982 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_ITEM_CONTEXT);
983 ItemContextConnected = false;
984 return FALSE;
985 }
986 public:
987 #ifdef DW_CPP11
988 void ConnectItemSelect(std::function<int(HTREEITEM, char *, void *)> userfunc)
989 #else
990 void ConnectItemSelect(int (*userfunc)(HTREEITEM, char *, void *))
991 #endif
992 {
993 _ConnectItemSelect = userfunc;
994 if(!ItemSelectConnected) {
995 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
996 ItemSelectConnected = true;
997 }
998 }
999 #ifdef DW_CPP11
1000 void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc)
1001 #else
1002 void ConnectItemContext(int (*userfunc)(char *, int, int, void *))
1003 #endif
1004 {
1005 _ConnectItemContext = userfunc;
1006 if(!ItemContextConnected) {
1007 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this);
1008 ItemContextConnected = true;
1009 }
1010 }
1011 };
1012
1013 class Containers : virtual public Focusable, virtual public ObjectView
1014 {
1015 private:
1016 bool ItemEnterConnected, ColumnClickConnected;
1017 #ifdef DW_CPP11
1018 std::function<int(char *)> _ConnectItemEnter;
1019 std::function<int(int)> _ConnectColumnClick;
1020 #else
1021 int (*_ConnectItemEnter)(HTREEITEM, char *, void *);
1022 int (*_ConnectColumnClick)(char *, int, int, void *);
1023 #endif
1024 static int _OnItemEnter(HWND window, char *text, void *data) {
1025 if(reinterpret_cast<Containers *>(data)->_ConnectItemEnter)
1026 return reinterpret_cast<Containers *>(data)->_ConnectItemEnter(text);
1027 return reinterpret_cast<Containers *>(data)->OnItemEnter(text);
1028 }
1029 static int _OnColumnClick(HWND window, int column, void *data) {
1030 if(reinterpret_cast<Containers *>(data)->_ConnectColumnClick)
1031 return reinterpret_cast<Containers *>(data)->_ConnectColumnClick(column);
1032 return reinterpret_cast<Containers *>(data)->OnColumnClick(column);
1033 }
1034 protected:
1035 void *allocpointer;
1036 int allocrowcount;
1037 void SetupContainer() {
1038 if(IsOverridden(Container::OnItemEnter, this)) {
1039 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this);
1040 ItemEnterConnected = true;
1041 }
1042 if(IsOverridden(Container::OnColumnClick, this)) {
1043 dw_signal_connect(hwnd, DW_SIGNAL_COLUMN_CLICK, DW_SIGNAL_FUNC(_OnColumnClick), this);
1044 ColumnClickConnected = true;
1045 }
1046 }
1047 // Our signal handler functions to be overriden...
1048 // If they are not overridden and an event is generated, remove the unused handler
1049 virtual int OnItemEnter(char *text) {
1050 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_ITEM_ENTER);
1051 ItemEnterConnected = false;
1052 return FALSE;
1053 }
1054 virtual int OnColumnClick(int column) {
1055 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_COLUMN_CLICK);
1056 ColumnClickConnected = false;
1057 return FALSE;
1058 }
1059 public:
1060 // User functions
1061 void Alloc(int rowcount) { allocpointer = dw_container_alloc(hwnd, rowcount); allocrowcount = rowcount; }
1062 void ChangeRowTitle(int row, char *title) { dw_container_change_row_title(hwnd, row, title); }
1063 void Clear(int redraw) { dw_container_clear(hwnd, redraw); }
1064 void Clear() { dw_container_clear(hwnd, TRUE); }
1065 void Cursor(const char *text) { dw_container_cursor(hwnd, text); }
1066 void Cursor(void *data) { dw_container_cursor_by_data(hwnd, data); }
1067 void Delete(int rowcount) { dw_container_delete(hwnd, rowcount); }
1068 void DeleteRow(char *title) { dw_container_delete_row(hwnd, title); }
1069 void DeleteRow(void *data) { dw_container_delete_row_by_data(hwnd, data); }
1070 void Insert() { dw_container_insert(hwnd, allocpointer, allocrowcount); }
1071 void Optimize() { dw_container_optimize(hwnd); }
1072 char *QueryNext(unsigned long flags) { return dw_container_query_next(hwnd, flags); }
1073 char *QueryStart(unsigned long flags) { return dw_container_query_start(hwnd, flags); }
1074 void Scroll(int direction, long rows) { dw_container_scroll(hwnd, direction, rows); }
1075 void SetColumnWidth(int column, int width) { dw_container_set_column_width(hwnd, column, width); }
1076 void SetRowData(int row, void *data) { dw_container_set_row_data(allocpointer, row, data); }
1077 void SetRowTitle(int row, const char *title) { dw_container_set_row_title(allocpointer, row, title); }
1078 void SetStripe(unsigned long oddcolor, unsigned long evencolor) { dw_container_set_stripe(hwnd, oddcolor, evencolor); }
1079 #ifdef DW_CPP11
1080 void ConnectItemEnter(std::function<int(char *)> userfunc)
1081 #else
1082 void ConnectItemEnter(int (*userfunc)(char *))
1083 #endif
1084 {
1085 _ConnectItemEnter = userfunc;
1086 if(!ItemEnterConnected) {
1087 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this);
1088 ItemEnterConnected = true;
1089 }
1090 }
1091 #ifdef DW_CPP11
1092 void ConnecColumnClick(std::function<int(int)> userfunc)
1093 #else
1094 void ConnectColumnClick(int (*userfunc)(int))
1095 #endif
1096 {
1097 _ConnectColumnClick = userfunc;
1098 if(!ColumnClickConnected) {
1099 dw_signal_connect(hwnd, DW_SIGNAL_COLUMN_CLICK, DW_SIGNAL_FUNC(_OnColumnClick), this);
1100 ColumnClickConnected = true;
1101 }
1102 }
1103 };
1104
1105 class Container : public Containers
1106 {
1107 public:
1108 // Constructors
1109 Container(unsigned long id, int multi) { SetHWND(dw_container_new(id, multi)); SetupObjectView(); SetupContainer(); }
1110 Container(int multi) { SetHWND(dw_container_new(0, multi)); SetupObjectView(); SetupContainer(); }
1111 Container() { SetHWND(dw_container_new(0, FALSE)); SetupObjectView(); SetupContainer(); }
1112
1113 // User functions
1114 int Setup(unsigned long *flags, char **titles, int count, int separator) { return dw_container_setup(hwnd, flags, titles, count, separator); }
1115 void ChangeItem(int column, int row, void *data) { dw_container_change_item(hwnd, column, row, data); }
1116 int GetColumnType(int column) { return dw_container_get_column_type(hwnd, column); }
1117 void SetItem(int column, int row, void *data) { dw_container_set_item(hwnd, allocpointer, column, row, data); }
1118 };
1119
1120 class Filesystem : public Containers
1121 {
1122 public:
1123 // Constructors
1124 Filesystem(unsigned long id, int multi) { SetHWND(dw_container_new(id, multi)); SetupObjectView(); SetupContainer(); }
1125 Filesystem(int multi) { SetHWND(dw_container_new(0, multi)); SetupObjectView(); SetupContainer(); }
1126 Filesystem() { SetHWND(dw_container_new(0, FALSE)); SetupObjectView(); SetupContainer(); }
1127
1128 // User functions
1129 int Setup(unsigned long *flags, char **titles, int count) { return dw_filesystem_setup(hwnd, flags, titles, count); }
1130 void ChangeFile(int row, const char *filename, HICN icon) { dw_filesystem_change_file(hwnd, row, filename, icon); }
1131 void ChangeItem(int column, int row, void *data) { dw_filesystem_change_item(hwnd, column, row, data); }
1132 int GetColumnType(int column) { return dw_filesystem_get_column_type(hwnd, column); }
1133 void SetColumnTitle(const char *title) { dw_filesystem_set_column_title(hwnd, title); }
1134 void SetFile(int row, const char *filename, HICN icon) { dw_filesystem_set_file(hwnd, allocpointer, row, filename, icon); }
1135 void SetItem(int column, int row, void *data) { dw_filesystem_set_item(hwnd, allocpointer, column, row, data); }
1136 };
1137
942 class App 1138 class App
943 { 1139 {
944 protected: 1140 protected:
945 App() { } 1141 App() { }
946 static App *_app; 1142 static App *_app;