acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
item.h
1// Injected in acme (camilo) from apex(thomas) by camilo on ThomasMonth19-2021 12:46 BRT
2// From user namespace to global at apex by camilo on day after ThomasBirthday2021 04:36 BRT
3// From aura by camilo on ThomasBirthday2021 21:12 BRT
4#pragma once
5
6
7#include "acme/constant/_constant.h"
8#include "acme/constant/element.h"
9#include "acme/user/user/_constant.h"
10
11
12class item;
13
14
15DECLARE_C_FLAG(e_item, enum_item);
16
17
18enum enum_item_flag : ::i64
19{
20
21 e_item_flag_none = 0,
22 e_item_flag_double_click_as_second_click = 1,
23 e_item_flag_eat_double_click = 2,
24 e_item_flag_drag = 4,
25
26};
27
28
29DECLARE_C_FLAG(e_item_flag, enum_item_flag);
30
31
32struct item_t
33{
34
35
36 e_element m_eelement;
37 ::collection::index m_iItem;
38 ::collection::index m_iSubItem;
39 ::collection::index m_iListItem;
40
41
42
43 constexpr item_t(const ::e_element & eelement = e_element_none, ::collection::index iItem = -1, ::collection::index iSubItem = -1, ::collection::index iListItem = -1) :
44 // constexpr item_t(const ::e_element & eelement = e_element_none, ::collection::index iItem = -1) :
45 m_eelement(eelement),
46 m_iItem(iItem)
47 //,m_iSubItem(iSubItem)
48 //,m_iListItem(iListItem)
49 {
50 }
51
52 inline item_t(const ::item_t & item) = default;
53
54 inline item_t(const ::item * pitem);
55
56 constexpr bool operator == (const ::item_t & item) const
57 {
58
59 return
60 m_eelement == item.m_eelement
61 && m_iItem == item.m_iItem
62 && m_iSubItem == item.m_iSubItem
63 && m_iListItem == item.m_iListItem;
64
65 }
66
67 constexpr bool is_item_set() const
68 {
69
70 return m_iItem >= 0 ||
71 (
72 m_eelement != e_element_none
73 && m_eelement != e_element_item
74 );
75
76 }
77
78
79 operator hash32() const { return { (const void *)this, sizeof(item_t) }; }
80
81 //constexpr ::collection::index menu_impact_index() const { return (::collection::index) m_iItem; }
82 //constexpr ::collection::index menu_impact_group() const { return (::collection::index) m_iSubItem; }
83 //constexpr ::collection::index menu_impact_command() const { return (::collection::index) m_iListItem; }
84
85 //constexpr ::collection::index item_index() const { return (::collection::index) m_iItem; }
86 //constexpr ::collection::index subitem_index() const { return (::collection::index) m_iSubItem; }
87 //constexpr ::collection::index list_item_index() const { return (::collection::index) m_iListItem; }
88
89};
90
91class CLASS_DECL_ACME item :
92 virtual public ::matter
93{
94public:
95
96
97 item_t m_item;
98 ::e_item m_eitem;
99 ::e_item_flag m_eitemflag;
100
101 // a user item is a "pointer"/address to a user interface matter
102
103 //::pointer<::draw2d::graphics> m_pgraphics;
104 //::pointer<::geometry2d::region> m_pregion;
105 //bool m_bAnyHoverChange;
106
107 //item(const ::e_element & eelement, ::collection::index iItem = -1, ::collection::index iSubItem = -1, ::collection::index iListItem = -1, const ::u64 uFlags = e_flag_none) :
108 // item(eelement, iItem, iSubItem, iListItem, uFlags) {}
109
110
111 item(::enum_item_flag eitemflag, const ::e_element & eelement, ::collection::index iItem = -1, ::collection::index iSubItem = -1, ::collection::index iListItem = -1, const ::atom & atom = ::atom::e_type_null) :
112 item(eelement, iItem, iSubItem, iListItem, atom, eitemflag)
113 {
114
115 }
116
117 //item(const ::e_item_flag & eitemflag, const ::e_element & eelement, ::collection::index iItem = -1, const ::atom & atom = ::atom::e_type_null) :
118 // item(eelement, iItem, atom, eitemflag) {}
119
120 item(const ::e_element & eelement, const ::atom & atom)
121 : item(eelement, atom.is_integer() ? atom.as_index() : -1, -1, -1, atom.is_integer() ? ::atom() : atom)
122 {
123
124 }
125
126
127 item(const ::e_element & eelement, enum_id eid)
128 : item(eelement, -1, -1, -1, (const ::atom &) eid)
129 {
130
131 }
132
133
134 item(const ::e_element & eelement = ::e_element_none, ::collection::index iItem = -1, ::collection::index iSubItem = -1, ::collection::index iListItem = -1, const ::atom & atom = ::atom::e_type_null, ::enum_item_flag eitemflag = ::e_item_flag_none) :
135 m_item(eelement, iItem, iSubItem, iListItem),
136 m_eitem(e_item_none),
137 m_eitemflag(eitemflag)
138 {
139
140 }
141
142
143 item(const ::item_t & item, ::enum_item_flag eitemflag = ::e_item_flag_none) :
144 m_item(item),
145 m_eitem(e_item_none),
146 m_eitemflag(eitemflag)
147 {
148
149 }
150
151
152 // item(::collection::index iItem) :
153 // m_item(e_element_none, iItem)
154 // {
155
156 // m_eitem = e_item_none;
157
158 // m_eitemflag = e_item_flag_none;
159
160 // }
161
162
163 item(const item & item) :
164 subparticle(item),
165 particle(item),
166 m_item(item.m_item),
167 m_eitem(item.m_eitem),
168 m_eitemflag(item.m_eitemflag),
169 //item_base(item),
170 //ITEM_DATA_ADDITIONS(item),
171 //item_data(item),
172 matter(item)
173 {
174
175 }
176
177
178 item(item && item) :
179 subparticle(::transfer(item)),
180 particle(::transfer(item)),
181 m_item(::transfer(item.m_item)),
182 m_eitem(::transfer(item.m_eitem)),
183 m_eitemflag(::transfer(item.m_eitemflag)),
184 //item_base(::transfer(item)),
185 //ITEM_DATA_ADDITIONS(::transfer(item)),
186 //item_data(::transfer(item)),
187 matter(::transfer(item))
188 {
189
190 }
191
192
193 void get_debug_title(char_pointer sz, character_count c) const override;
194
195 bool _is_set() const override;
196
197 bool is_item_set() const { return m_atomMatterId.is_set() || m_item.m_eelement != ::e_element_none; }
198
199 explicit operator bool() const { return is_item_set(); }
200
201 //operator enum_element() const { return m_item.m_eelement; }
202
203// template < prototype_integral INTEGRAL >
204// operator INTEGRAL() const { return (INTEGRAL)m_item.m_iItem; }
205
206 virtual i32_boolean is_hidden() const;
207
208 virtual ::string get_item_text(::user::item_base * puseritembase, ::collection::index iSubItem = 0);
209 virtual ::collection::index get_item_image(::user::item_base * puseritembase, ::collection::index iSubItem = 0);
210 virtual ::image::image_list * get_item_image_list(::user::item_base * puseritembase, ::collection::index iSubItem = 0);
211
212// operator const ::item_t &() const {return m_item;}
213// operator ::item_t &() {return m_item;}
214//
215// operator const ::item_t *() const {return &m_item;}
216// operator ::item_t *() {return &m_item;}
217
218 //item & operator = (const ::particle & particle) { id() = if ((PARTICLE *) this != (PARTICLE *)&particle) ::memory_copy((PARTICLE *) this, (PARTICLE *) &particle, sizeof(PARTICLE)); return *this; }
219
220
221 //bool operator == (const ::particle & particle) const { return ((PARTICLE *) this == (PARTICLE *)&particle) ? true : !memcmp((PARTICLE *) this, (PARTICLE *) &particle, sizeof(PARTICLE)); }
222 //bool operator != (const ::particle & particle) const { return !operator == (particle); }
223 //
224 //
225 //item & operator = (const item_base & itembase) { if ((void *) this != (void *) &itembase) ::memory_copy((PARTICLE *) this, (PARTICLE *) &itembase, sizeof(ITEM_BASE)); return *this; }
226
227 //bool operator == (const item_base & itembase) const { return ((PARTICLE *) this == (PARTICLE *)&itembase) ? true : !memcmp((PARTICLE *) this, (PARTICLE *) &itembase, sizeof(ITEM_BASE)); }
228 //bool operator != (const item_base & itembase) const { return !operator==(itembase); }
229 //
230 //
231
232 //item & operator = (const item_data & itemdata) { if ((PARTICLE *) this != (PARTICLE *) &itemdata) ::memory_copy((PARTICLE *) this, (PARTICLE *) &itemdata, sizeof(ITEM_DATA)); return *this; }
233
234 //bool operator == (const item_data & itemdata) const { return ((PARTICLE *) this == (PARTICLE *) &itemdata) ? true : !memcmp((PARTICLE *) this, (PARTICLE *) &itemdata, sizeof(ITEM_DATA)); }
235 //bool operator != (const item_data & itemdata) const { return !operator==(itemdata); }
236 //
237 //
238 //item & operator = (const ::PARTICLE & particle) { if ((PARTICLE *) this != (PARTICLE *) &particle) ::memory_copy((PARTICLE *) this, (PARTICLE *) &particle, sizeof(PARTICLE)); return *this; }
239
240 //
241 //bool operator == (const ::PARTICLE & particle) const { return ((PARTICLE *) this == (PARTICLE *) &particle) ? true : !memcmp((PARTICLE *) this, (PARTICLE *) &particle, sizeof(PARTICLE)); }
242 //bool operator != (const ::PARTICLE & particle) const { return !operator == (particle); }
243
244
245 //item & operator = (const ITEM_BASE_ADDITIONS & itembaseadditions) { if ((ITEM_BASE_ADDITIONS *)this != (ITEM_BASE_ADDITIONS *)&itembaseadditions) ::memory_copy((ITEM_BASE_ADDITIONS *)this, (ITEM_BASE_ADDITIONS *)&itembaseadditions, sizeof(ITEM_BASE_ADDITIONS)); return *this; }
246
247 //bool operator == (const ITEM_BASE_ADDITIONS & itembaseadditions) const { return ((ITEM_BASE_ADDITIONS *)this == (ITEM_BASE_ADDITIONS *)&itembaseadditions) ? true : !memcmp((ITEM_BASE_ADDITIONS *)this, (ITEM_BASE_ADDITIONS *)&itembaseadditions, sizeof(ITEM_BASE_ADDITIONS)); }
248 //bool operator != (const ITEM_BASE_ADDITIONS & itembaseadditions) const { return !operator==(itembaseadditions); }
249
250
251 //
252 //item & operator = (const ITEM_BASE & itembase) { if ((PARTICLE *) this != (PARTICLE *) &itembase) ::memory_copy((PARTICLE *) this,(PARTICLE *) &itembase, sizeof(ITEM_BASE)); return *this; }
253
254 //bool operator == (const ITEM_BASE & itembase) const { return ((PARTICLE *) this == (PARTICLE *) &itembase) ? true : !memcmp((PARTICLE *) this, (PARTICLE *) &itembase, sizeof(ITEM_BASE)); }
255 //bool operator != (const ITEM_BASE & itembase) const { return !operator==(itembase); }
256 //
257 //
258
259 //item & operator = (const ITEM_DATA & itemdata) { if ((PARTICLE *) this != (PARTICLE *) &itemdata) ::memory_copy((PARTICLE *) this, (PARTICLE *) &itemdata, sizeof(ITEM_DATA)); return *this; }
260
261 //bool operator == (const ITEM_DATA & itemdata) const { return ((PARTICLE *) this == (PARTICLE *) &itemdata) ? true : !memcmp((PARTICLE *) this, (PARTICLE *) &itemdata, sizeof(ITEM_DATA)); }
262 //bool operator != (const ITEM_DATA & itemdata) const { return !operator==(itemdata); }
263
264 //using ITEM::operator=;
265 //using ITEM::operator==;
266 //using ITEM::operator!=;
267
268
269 item & operator = (const item & item)
270 {
271
272 m_item = item.m_item;
273 m_eitem = item.m_eitem;
274 m_eitemflag = item.m_eitemflag;
275
276 //m_pgraphics = item.m_pgraphics;
277
278 // m_ppath = item.m_ppath;
279
280 return *this;
281
282 }
283
284
285 bool operator == (const item & item) const { return m_item == item.m_item; }
286 //bool operator != (const item & item) const { return !operator==(item); }
287
288
290
291 //bool operator == (const ::e_element & eelement) const { return m_item.m_eelement == eelement; }
292 //bool operator != (const ::e_element & eelement) const { return !operator==(eelement); }
293
294 item& operator = (const e_element& eelement);//{ return operator = ((enum_element)eelement); }
295
296 bool operator == (const e_element & eelement) const { return m_item.m_eelement == eelement; }
297// bool operator != (const e_element & eelement) const { return !operator==(eelement); }
298
299 item & operator = (::collection::index iItem);
300
301 bool operator == (::collection::index iItem) const { return m_item.m_iItem == iItem; }
302// bool operator != (::collection::index iItem) const { return m_iItem != iItem; }
303
304 std::strong_ordering operator <= (::collection::index iItem) const { return m_item.m_iItem <=> iItem; }
305// bool operator >= (::collection::index iItem) const { return m_iItem >= iItem; }
306//
307// bool operator < (::collection::index iItem) const { return m_iItem < iItem; }
308// bool operator > (::collection::index iItem) const { return m_iItem > iItem; }
309
310 ::collection::index operator + (::i32 iItemAdd) { return (::collection::index) (m_item.m_iItem + iItemAdd); }
311 ::collection::index operator - (::i32 iItemSub) { return (::collection::index) (m_item.m_iItem - iItemSub); }
312
313 ::collection::index operator + (::i64 iItemAdd) { return (::collection::index) (m_item.m_iItem + iItemAdd); }
314 ::collection::index operator - (::i64 iItemSub) { return (::collection::index) (m_item.m_iItem - iItemSub); }
315
316
317 bool in_element_range(const ::e_element & eelement, ::i32 iCount) const { return m_item.m_eelement >= eelement && m_item.m_eelement < eelement + iCount; }
318
319 //bool is_valid_item(::collection::count c) const { return m_item.m_iItem >= 0 && m_item.m_iItem < c; }
320
321
322
323
324
325};
326
327
328using item_pointer = ::pointer<::item>;
329
330
331//} // namespace item
332
333
334inline bool is_item_set(const ::item_t * pitem)
335{
336
337 return ::is_set((const void * )pitem) && pitem->is_item_set();
338
339}
340
341inline bool is_item_set(const ::item * pitem)
342{
343
344 return ::is_item_set(&pitem->m_item);
345
346}
347
348
349inline bool is_item_set_and_non_negative(const ::item* pitem)
350{
351
352 return ::is_item_set(pitem) && pitem->m_item.m_iItem >= 0;
353
354}
355
356
357inline bool is_element(const ::item * pitem, const ::e_element & eelement)
358{
359
360 return ::is_set((const void *)pitem) && pitem->is_item_set() && pitem->m_item.m_eelement == eelement;
361
362}
363
364
365inline bool is_item(const ::item * pitem, ::collection::index iItem)
366{
367
368 return ::is_set((const void *)pitem) && pitem->is_item_set()
369 && pitem->m_item.m_iItem == iItem;
370
371}
372
373
374
375inline bool is_subitem(const ::item * pitem, ::collection::index iSubItem)
376{
377
378 return ::is_set((const void *)pitem) && pitem->is_item_set()
379 && pitem->m_item.m_iSubItem == iSubItem;
380
381}
382
383
384//inline bool subitem_less_than(const ::item * pitem, ::collection::index iSubItem)
385//{
386//
387// return ::is_set((const void *)pitem) && pitem->is_item_set()
388// && pitem->m_item.m_iSubItem < iSubItem;
389//
390//}
391
392
393inline bool in_element_range(const ::item * pitem, const ::e_element & eelement, ::i32 iCount)
394{
395
396 return ::is_set((const void *)pitem) && pitem->is_item_set() &&
397 pitem->in_element_range(eelement, iCount);
398
399}
400
401
402inline ::pointer<::item>new_item_with_index(::collection::index iIndex)
403{
404
405 return allocateø ::item(::e_element_item, iIndex);
406
407}
408
409
410inline bool is_same_item(const ::item * pitem1, const ::item * pitem2)
411{
412
413 if (::is_item_set(pitem1))
414 {
415
416 if (::is_item_set(pitem2))
417 {
418
419 return *pitem1 == *pitem2;
420
421 }
422 else
423 {
424
425 return false;
426
427 }
428
429 }
430 else if (::is_item_set(pitem2))
431 {
432
433 return false;
434
435 }
436 else
437 {
438
439 return true;
440
441 }
442
443}
444
445
446inline enum_element item_element(const ::item * pitem)
447{
448
449 return ::is_set(pitem) ? pitem->m_item.m_eelement.m_eenum : e_element_none;
450
451}
452
453
454inline ::collection::index item_index(const ::item * pitem)
455{
456
457 return ::is_set(pitem) ? pitem->m_item.m_iItem : -1;
458
459}
460
461
462inline bool is_item_index(const ::item * pitem, ::collection::index iItem)
463{
464
465 return ::is_element(pitem, ::e_element_item) && ::is_item(pitem, iItem);
466
467}
468
469
470inline bool is_item_equivalent(const ::item_t * pitem1, const ::item_t * pitem2)
471{
472
473 if (pitem1 == pitem2)
474 {
475
476 return true;
477
478 }
479
480 if (!::is_item_set(pitem1))
481 {
482
483 if (!::is_item_set(pitem2))
484 {
485
486 return true;
487
488 }
489 else
490 {
491
492 return false;
493
494 }
495
496 }
497 else if (!::is_item_set(pitem2))
498 {
499
500 return false;
501
502 }
503
504 return *pitem1 == *pitem2;
505
506}
507
508
509inline item_t::item_t(const ::item * pitem) :
510 item_t(::is_set(pitem) ? pitem->m_item : ::item_t())
511{
512
513}
514
515
516
517using item_array = ::pointer_array < ::item >;
518
519
520inline bool is_item_equivalent(const ::item * pitem1, const ::item * pitem2)
521{
522
523 return is_item_equivalent(&pitem1->m_item, &pitem2->m_item);
524
525}
526
527
528template < typename ITEM >
529concept prototype_item = ::std::is_base_of_v < ::item, ITEM >;
530
531
532
533
534
535
Definition atom.h:237
Definition boolean.h:7
Definition item.h:93
Definition subparticle.h:78
Definition item.h:529
Definition hash32.h:14
Definition item.h:33