1 | // ============================================================ // |
---|
2 | // // |
---|
3 | // File : ad_colorset.cxx // |
---|
4 | // Purpose : item-colors and colorsets // |
---|
5 | // // |
---|
6 | // Coded by Ralf Westram (coder@reallysoft.de) in July 2015 // |
---|
7 | // http://www.arb-home.de/ // |
---|
8 | // // |
---|
9 | // ============================================================ // |
---|
10 | |
---|
11 | #include "ad_colorset.h" |
---|
12 | #include "arbdbt.h" |
---|
13 | |
---|
14 | #include <arb_strbuf.h> |
---|
15 | |
---|
16 | int GBT_get_color_group(GBDATA *gb_item) { |
---|
17 | /*! return color group of item (special, gene, ...) |
---|
18 | * @param gb_item the item |
---|
19 | * @return color group if defined (0 if none) |
---|
20 | */ |
---|
21 | GBDATA *gb_cgroup = GB_entry(gb_item, GB_COLORGROUP_ENTRY); |
---|
22 | if (gb_cgroup) { |
---|
23 | int color_group = GB_read_int(gb_cgroup); |
---|
24 | if (color_group<1 || color_group>GB_COLOR_GROUPS) { |
---|
25 | color_group = 0; |
---|
26 | } |
---|
27 | return color_group; |
---|
28 | } |
---|
29 | return 0; |
---|
30 | } |
---|
31 | GB_ERROR GBT_set_color_group(GBDATA *gb_item, int color_group) { |
---|
32 | /*! set color group of item |
---|
33 | * @param gb_item the item |
---|
34 | * @param color_group the color group [1 .. GB_COLOR_GROUPS] or zero to delete it. |
---|
35 | * @return error if sth went wrong |
---|
36 | * |
---|
37 | * Please note that this function may be bypassed by user; e.g. via 'write to fields of listed'. |
---|
38 | */ |
---|
39 | |
---|
40 | if (color_group) { |
---|
41 | if (color_group<1 || color_group>GB_COLOR_GROUPS) { |
---|
42 | return GBS_global_string("invalid color_group %i", color_group); |
---|
43 | } |
---|
44 | return GBT_write_int(gb_item, GB_COLORGROUP_ENTRY, color_group); |
---|
45 | } |
---|
46 | |
---|
47 | // do not store 0 |
---|
48 | GBDATA *gb_cgroup = GB_entry(gb_item, GB_COLORGROUP_ENTRY); |
---|
49 | return gb_cgroup ? GB_delete(gb_cgroup) : NULp; |
---|
50 | } |
---|
51 | |
---|
52 | GBDATA *GBT_colorset_root(GBDATA *gb_main, const char *itemsname) { |
---|
53 | /*! return root container for colorsets |
---|
54 | * @param gb_main database |
---|
55 | * @param itemsname name of items ( == ItemSelector::items_name) |
---|
56 | */ |
---|
57 | GBDATA *gb_colorsets = GB_search(gb_main, "colorsets", GB_CREATE_CONTAINER); |
---|
58 | GBDATA *gb_item_root = gb_colorsets ? GB_search(gb_colorsets, itemsname, GB_CREATE_CONTAINER) : NULp; |
---|
59 | return gb_item_root; |
---|
60 | } |
---|
61 | |
---|
62 | void GBT_get_colorset_names(ConstStrArray& colorsetNames, GBDATA *gb_colorset_root) { |
---|
63 | /*! retrieve names of existing colorsets from DB |
---|
64 | * @param colorsetNames result-param: will be filled with colorset names |
---|
65 | * @param gb_colorset_root result of GBT_colorset_root() |
---|
66 | */ |
---|
67 | for (GBDATA *gb_colorset = GB_entry(gb_colorset_root, "colorset"); |
---|
68 | gb_colorset; |
---|
69 | gb_colorset = GB_nextEntry(gb_colorset)) |
---|
70 | { |
---|
71 | const char *name = GBT_get_name(gb_colorset); |
---|
72 | if (name) colorsetNames.put(name); |
---|
73 | } |
---|
74 | } |
---|
75 | |
---|
76 | GBDATA *GBT_find_colorset(GBDATA *gb_colorset_root, const char *name) { |
---|
77 | /*! lookup (existing) colorset |
---|
78 | * @param gb_colorset_root result of GBT_colorset_root() |
---|
79 | * @param name colorset name |
---|
80 | * @return colorset DB entry (or NULp, in which case an error MAY be exported) |
---|
81 | */ |
---|
82 | return GBT_find_item_rel_item_data(gb_colorset_root, "name", name); |
---|
83 | } |
---|
84 | |
---|
85 | GBDATA *GBT_find_or_create_colorset(GBDATA *gb_colorset_root, const char *name) { |
---|
86 | /*! create a new colorset |
---|
87 | * @param gb_colorset_root result of GBT_colorset_root() |
---|
88 | * @param name colorset name |
---|
89 | * @return colorset DB entry (or NULp, in which case an error IS exported) |
---|
90 | */ |
---|
91 | return GBT_find_or_create_item_rel_item_data(gb_colorset_root, "colorset", "name", name, false); |
---|
92 | } |
---|
93 | |
---|
94 | GB_ERROR GBT_load_colorset(GBDATA *gb_colorset, ConstStrArray& colorsetDefs) { |
---|
95 | /*! load a colorset |
---|
96 | * @param gb_colorset result of GBT_find_colorset() |
---|
97 | * @param colorsetDefs result-param: will be filled with colorset-entries ("itemname=color") |
---|
98 | * @return error if sth went wrong |
---|
99 | */ |
---|
100 | |
---|
101 | GB_ERROR error = NULp; |
---|
102 | char *colorset = GBT_read_string(gb_colorset, "color_set"); |
---|
103 | if (!colorset) { |
---|
104 | error = GB_have_error() ? GB_await_error() : "Missing 'color_set' entry"; |
---|
105 | error = GBS_global_string("Failed to read colorset (Reason: %s)", error); |
---|
106 | } |
---|
107 | else { |
---|
108 | GBT_splitNdestroy_string(colorsetDefs, colorset, ';'); |
---|
109 | } |
---|
110 | return error; |
---|
111 | } |
---|
112 | |
---|
113 | GB_ERROR GBT_save_colorset(GBDATA *gb_colorset, CharPtrArray& colorsetDefs) { |
---|
114 | /*! saves a colorset |
---|
115 | * @param gb_colorset result of GBT_find_colorset() or GBT_create_colorset() |
---|
116 | * @param colorsetDefs contains colorset-entries ("itemname=color") |
---|
117 | * @return error if sth went wrong |
---|
118 | */ |
---|
119 | GBS_strstruct buffer(colorsetDefs.size()*(8+1+2+1)); |
---|
120 | for (size_t d = 0; d<colorsetDefs.size(); ++d) { |
---|
121 | buffer.cat(colorsetDefs[d]); |
---|
122 | buffer.put(';'); |
---|
123 | } |
---|
124 | buffer.cut_tail(1); // remove trailing ';' |
---|
125 | |
---|
126 | return GBT_write_string(gb_colorset, "color_set", buffer.get_data()); |
---|
127 | } |
---|
128 | |
---|
129 | |
---|