Rev 6601 | Rev 6615 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6589 | siemargl | 1 | #ifndef KOLIBRI_TREELIST_H |
2 | #define KOLIBRI_TREELIST_H |
||
3 | |||
4 | |||
6601 | siemargl | 5 | /// константы стиля |
6589 | siemargl | 6 | enum tl_style { |
7 | TL_KEY_NO_EDIT = 1, // элемент нельзя редактировать на клавиатуре (изменять уровни, удалять) |
||
8 | TL_DRAW_PAR_LINE = 2, // рисовать линии к родительскому узлу |
||
9 | TL_LISTBOX_MODE = 4 //стиль не отображает уровни (как в ListBox все одного уровня) |
||
10 | }; |
||
11 | |||
6601 | siemargl | 12 | /// константы для функций |
13 | enum tl_err { |
||
14 | TL_ERR_LOAD_CAPTION = 1, //в памяти нет заголовка 'tree' |
||
15 | TL_ERR_SAVE_MEMOTY_SIZE = 2, //не хватает памяти для сохранения элемента |
||
16 | TL_ERR_LOAD_INFO_SIZE = 4, //не совпадает размер информационной структуры при открытии |
||
17 | }; |
||
18 | |||
6589 | siemargl | 19 | typedef struct __attribute__ ((__packed__)) { |
6601 | siemargl | 20 | uint16_t type; //тип элемента, или индекс иконки для узла |
21 | uint8_t lev; //уровень элемента |
||
22 | uint8_t clo; //флаг закрытия, или открытия (имеет смысл для родительского узла) |
||
23 | uint32_t prev; //индекс предыдущего элемента |
||
24 | uint32_t next; //индекс последующего элемента |
||
25 | uint32_t tcreat; //врем. создания |
||
26 | uint32_t tdel; //врем. удаления |
||
27 | } treelist_node; |
||
28 | |||
29 | |||
30 | typedef struct __attribute__ ((__packed__)) { |
||
6589 | siemargl | 31 | uint32_t left; |
32 | uint32_t top; |
||
33 | uint32_t width; |
||
34 | uint32_t height; |
||
35 | void *data_info; // указатель на основные даные |
||
36 | uint16_t info_size; // размер данных выделяемых для каждого узла (пользовательськие данные + текст для подписи) |
||
37 | uint32_t info_max_count; // максимальное количество узлов, которые можно добавить в элемент |
||
38 | uint32_t style; // стили элемента |
||
6601 | siemargl | 39 | treelist_node *data_nodes; // указатель на структуры узлов |
6589 | siemargl | 40 | void *data_img; // указатель на изображения с иконками узлов |
41 | uint16_t img_cx; // ширина иконок |
||
42 | uint16_t img_cy; // высота иконок |
||
43 | void *data_img_sys;//указатель на системные изображения (стрелки, плюсики) |
||
44 | uint32_t ch_tim; // количество изменений в файле |
||
45 | uint32_t tim_undo; // количество отмененных действий |
||
46 | uint32_t cur_pos; // позиция курсора |
||
47 | color_t col_bkg; // цвет фона |
||
6601 | siemargl | 48 | color_t col_zag; // цвет заголовка |
49 | color_t col_txt; // цвет текста |
||
6589 | siemargl | 50 | uint16_t capt_cy; // высота подписи |
51 | uint16_t info_capt_offs;//сдвиг для начала текста (подписи узла) |
||
52 | uint16_t info_capt_len;//длина текста подписи узла (если = 0 то до конца структуры) |
||
53 | void *el_focus; // указатель на структуру элемента в фокусе |
||
6601 | siemargl | 54 | scrollbar *p_scroll; // указатель на структуру скроллинга |
6589 | siemargl | 55 | void *on_press; // +84 указатель на функцию, которая вызывается при нажатии Enter |
56 | } treelist; |
||
57 | |||
6601 | siemargl | 58 | static inline treelist* kolibri_new_treelist( uint32_t x_w, uint32_t y_h, uint16_t capt_cy, uint32_t icon_size_xy, uint16_t info_size, uint32_t info_max_count, |
59 | uint16_t info_capt_len, uint16_t info_capt_offs, enum tl_style style, void *el_focus, color_t back, color_t title, color_t txt) |
||
60 | { |
||
61 | treelist *tl = (treelist *)calloc(1, sizeof(treelist)); |
||
62 | tl->left= x_w >> 16; |
||
63 | tl->width = x_w & 0xFFFF; |
||
64 | tl->top = y_h >> 16; |
||
65 | tl->height = y_h & 0xFFFF; |
||
66 | tl->info_size = info_size; |
||
67 | tl->info_max_count = info_max_count; |
||
68 | tl->style = style; |
||
69 | tl->img_cx = icon_size_xy >> 16; |
||
70 | tl->img_cy = icon_size_xy & 0xFFFF; |
||
71 | tl->col_bkg = back; |
||
72 | tl->col_zag = title; |
||
73 | tl->col_txt = txt; |
||
74 | tl->info_capt_len = info_capt_len; |
||
75 | tl->info_capt_offs = info_capt_offs; |
||
76 | tl->el_focus = el_focus; |
||
6612 | siemargl | 77 | tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0); |
6601 | siemargl | 78 | return tl; |
79 | } |
||
6589 | siemargl | 80 | |
6601 | siemargl | 81 | static inline void gui_add_treelist(kolibri_window *wnd, treelist* tl) |
82 | { |
||
83 | kolibri_window_add_element(wnd, KOLIBRI_TREELIST, tl); |
||
84 | } |
||
85 | |||
86 | |||
87 | ///реакция на мышь |
||
88 | extern void (*tl_mouse)(treelist *) __attribute__((__stdcall__)); |
||
89 | |||
90 | ///вывод списка на экран |
||
6612 | siemargl | 91 | extern void (*tl_draw)(treelist *) __attribute__((__stdcall__)); |
92 | __attribute__((__stdcall__)) static inline void treelist_draw(treelist *tl) |
||
93 | { |
||
94 | tl->p_scroll->all_redraw = 1; |
||
95 | (*tl_draw)(tl); |
||
96 | } |
||
97 | |||
6601 | siemargl | 98 | |
99 | ///перемещаем узел вверх |
||
100 | extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__)); |
||
101 | |||
102 | ///перемещаем узел вниз |
||
103 | extern void (*tl_node_move_down)(treelist *) __attribute__((__stdcall__)); |
||
104 | |||
105 | extern void (*tl_data_init_asm)(treelist *) __attribute__((__stdcall__)); |
||
106 | ///выделение памяти для структур списка и основной информации (конструктор) |
||
107 | static inline void treelist_data_init(treelist *tl) |
||
108 | { |
||
109 | __asm__ __volatile__ ( |
||
110 | "push %%edi \n\t":::); |
||
111 | |||
112 | (*tl_data_init_asm)(tl); |
||
113 | |||
114 | __asm__ __volatile__ ( |
||
115 | "pop %%edi \n\t":::); |
||
116 | } |
||
117 | |||
118 | extern void (*tl_data_clear_asm)(treelist *) __attribute__((__stdcall__)); |
||
119 | ///очистка памяти элемента (деструктор) |
||
120 | static inline void treelist_data_clear(treelist *tl) |
||
121 | { |
||
122 | __asm__ __volatile__ ( |
||
123 | "push %%edi \n\t":::); |
||
124 | |||
125 | (*tl_data_clear_asm)(tl); |
||
126 | |||
127 | __asm__ __volatile__ ( |
||
128 | "pop %%edi \n\t":::); |
||
6612 | siemargl | 129 | free(tl->p_scroll); |
6601 | siemargl | 130 | } |
131 | |||
132 | extern void (*tl_info_clear_asm)(treelist *) __attribute__((__stdcall__)); |
||
133 | ///очистка списка (информации) |
||
134 | static inline void treelist_info_clear(treelist *tl) |
||
135 | { |
||
136 | __asm__ __volatile__ ( |
||
137 | "push %%edi \n\t":::); |
||
138 | |||
139 | (*tl_info_clear_asm)(tl); |
||
140 | |||
141 | __asm__ __volatile__ ( |
||
142 | "pop %%edi \n\t":::); |
||
143 | } |
||
144 | |||
145 | extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__)); |
||
146 | ///реакция на клавиатуру |
||
6612 | siemargl | 147 | __attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code) |
6601 | siemargl | 148 | { |
149 | __asm__ __volatile__ ( |
||
6612 | siemargl | 150 | "push %2\n\t" |
151 | "call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):); // indirect call with asterisk * |
||
6601 | siemargl | 152 | |
6612 | siemargl | 153 | // (*tl_key_asm)(tl); |
6601 | siemargl | 154 | } |
155 | |||
156 | extern void (*tl_info_undo_asm)(treelist *) __attribute__((__stdcall__)); |
||
157 | ///отмена действия |
||
158 | static inline void treelist_undo(treelist *tl) |
||
159 | { |
||
160 | __asm__ __volatile__ ( |
||
161 | "push %%edi \n\t":::); |
||
162 | |||
163 | (*tl_info_undo_asm)(tl); |
||
164 | |||
165 | __asm__ __volatile__ ( |
||
166 | "pop %%edi \n\t":::); |
||
167 | } |
||
168 | |||
169 | extern void (*tl_info_redo_asm)(treelist *) __attribute__((__stdcall__)); |
||
170 | ///повтор действия |
||
171 | static inline void treelist_redo(treelist *tl) |
||
172 | { |
||
173 | __asm__ __volatile__ ( |
||
174 | "push %%edi \n\t":::); |
||
175 | |||
176 | (*tl_info_redo_asm)(tl); |
||
177 | |||
178 | __asm__ __volatile__ ( |
||
179 | "pop %%edi \n\t":::); |
||
180 | } |
||
181 | |||
182 | extern void (*tl_node_add_asm)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__)); |
||
183 | ///добавить узел |
||
184 | ///input: |
||
185 | /// tlist - указатель на структуру листа |
||
186 | /// n_opt - опции добавления |
||
187 | /// n_info - указатель на добавляемые данные |
||
188 | static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev) |
||
189 | { |
||
190 | __asm__ __volatile__ ( |
||
191 | "push %%ebx \n\t" |
||
192 | "push %%edi \n\t":::); |
||
193 | |||
194 | uint32_t n_opt = (type << 16) | (clos << 8) | lev; |
||
195 | (*tl_node_add_asm)(tl, n_opt, n_info); |
||
196 | |||
197 | __asm__ __volatile__ ( |
||
198 | "pop %%edi \n\t" |
||
199 | "pop %%ebx \n\t":::); |
||
200 | } |
||
201 | |||
202 | extern void (*tl_node_set_data_asm)(treelist *, void *n_info) __attribute__((__stdcall__)); |
||
203 | ///записать в текущий узел |
||
204 | ///input: |
||
205 | /// tlist - указатель на структуру листа |
||
206 | /// n_info - указатель на данные |
||
207 | static inline void treelist_node_setdata(treelist *tl, void *n_info) |
||
208 | { |
||
209 | __asm__ __volatile__ ( |
||
210 | "push %%esi \n\t" |
||
211 | "push %%edi \n\t":::); |
||
212 | |||
213 | (*tl_node_set_data_asm)(tl, n_info); |
||
214 | |||
215 | __asm__ __volatile__ ( |
||
216 | "pop %%edi \n\t" |
||
217 | "pop %%esi \n\t":::); |
||
218 | } |
||
219 | |||
220 | extern void* (*tl_node_get_data_asm)(treelist *) __attribute__((__stdcall__)); |
||
221 | ///взять указатель на данные узла под курсором |
||
222 | static inline void* treelist_getdata(treelist *tl) |
||
223 | { |
||
224 | __asm__ __volatile__ ( |
||
225 | "push %%edi \n\t":::); |
||
226 | |||
227 | void *res = |
||
228 | (*tl_node_get_data_asm)(tl); |
||
229 | |||
230 | __asm__ __volatile__ ( |
||
231 | "pop %%edi \n\t":::); |
||
232 | return res; |
||
233 | } |
||
234 | |||
235 | extern void (*tl_node_delete_asm)(treelist *) __attribute__((__stdcall__)); |
||
236 | ///удалить узел под курсором |
||
237 | static inline void treelist_node_delete(treelist *tl) |
||
238 | { |
||
239 | __asm__ __volatile__ ( |
||
240 | "push %%edi \n\t":::); |
||
241 | |||
242 | (*tl_node_delete_asm)(tl); |
||
243 | |||
244 | __asm__ __volatile__ ( |
||
245 | "pop %%edi \n\t":::); |
||
246 | } |
||
247 | |||
248 | extern void (*tl_cur_beg_asm)(treelist *) __attribute__((__stdcall__)); |
||
249 | ///поставить курсор на первый узел |
||
250 | static inline void treelist_cursor_begin(treelist *tl) |
||
251 | { |
||
252 | __asm__ __volatile__ ( |
||
253 | "push %%edi \n\t":::); |
||
254 | |||
255 | (*tl_cur_beg_asm)(tl); |
||
256 | |||
257 | __asm__ __volatile__ ( |
||
258 | "pop %%edi \n\t":::); |
||
259 | } |
||
260 | |||
261 | extern void (*tl_cur_next_asm)(treelist *) __attribute__((__stdcall__)); |
||
262 | ///перенести курсор на 1 позицию ниже |
||
263 | static inline void treelist_cursor_next(treelist *tl) |
||
264 | { |
||
265 | __asm__ __volatile__ ( |
||
266 | "push %%ebx \n\t" |
||
267 | "push %%esi \n\t" |
||
268 | "push %%edi \n\t":::); |
||
269 | |||
270 | (*tl_cur_next_asm)(tl); |
||
271 | |||
272 | __asm__ __volatile__ ( |
||
273 | "pop %%edi \n\t" |
||
274 | "pop %%esi \n\t" |
||
275 | "pop %%ebx \n\t":::); |
||
276 | } |
||
277 | |||
278 | extern void (*tl_cur_perv_asm)(treelist *) __attribute__((__stdcall__)); |
||
279 | ///перенести курсор на 1 позицию выше |
||
280 | static inline void treelist_cursor_prev(treelist *tl) |
||
281 | { |
||
282 | __asm__ __volatile__ ( |
||
283 | "push %%ebx \n\t" |
||
284 | "push %%esi \n\t" |
||
285 | "push %%edi \n\t":::); |
||
286 | |||
287 | (*tl_cur_perv_asm)(tl); |
||
288 | |||
289 | __asm__ __volatile__ ( |
||
290 | "pop %%edi \n\t" |
||
291 | "pop %%esi \n\t" |
||
292 | "pop %%ebx \n\t":::); |
||
293 | } |
||
294 | |||
295 | extern void (*tl_node_close_open_asm)(treelist *) __attribute__((__stdcall__)); |
||
296 | ///открыть/закрыть узел (работает с узлами которые имеют дочерние узлы) |
||
297 | static inline void treelist_close_open(treelist *tl) |
||
298 | { |
||
299 | __asm__ __volatile__ ( |
||
300 | "push %%edi \n\t":::); |
||
301 | |||
302 | (*tl_node_close_open_asm)(tl); |
||
303 | |||
304 | __asm__ __volatile__ ( |
||
305 | "pop %%edi \n\t":::); |
||
306 | } |
||
307 | |||
308 | extern void (*tl_node_lev_inc_asm)(treelist *) __attribute__((__stdcall__)); |
||
309 | ///увеличить уровень |
||
310 | static inline void treelist_level_inc(treelist *tl) |
||
311 | { |
||
312 | __asm__ __volatile__ ( |
||
313 | "push %%edi \n\t":::); |
||
314 | |||
315 | (*tl_node_lev_inc_asm)(tl); |
||
316 | |||
317 | __asm__ __volatile__ ( |
||
318 | "pop %%edi \n\t":::); |
||
319 | } |
||
320 | |||
321 | extern void (*tl_node_lev_dec_asm)(treelist *) __attribute__((__stdcall__)); |
||
322 | ///уменьшить уровень |
||
323 | static inline void treelist_level_dec(treelist *tl) |
||
324 | { |
||
325 | __asm__ __volatile__ ( |
||
326 | "push %%edi \n\t":::); |
||
327 | |||
328 | (*tl_node_lev_dec_asm)(tl); |
||
329 | |||
330 | __asm__ __volatile__ ( |
||
331 | "pop %%edi \n\t":::); |
||
332 | } |
||
333 | |||
334 | extern treelist_node* (*tl_node_poi_get_info_asm)(treelist *, int node_ind) __attribute__((__stdcall__)); |
||
335 | ///взять указатель на структуру узла в указанной позиции |
||
336 | ///input: |
||
337 | /// tlist - pointer to 'TreeList' struct |
||
338 | /// node_ind - node index |
||
339 | ///output - pointer to node info or NULL |
||
340 | static inline treelist_node* treelist_getnode(treelist *tl, int node_ind) |
||
341 | { |
||
342 | __asm__ __volatile__ ( |
||
343 | "push %%ebx \n\t" |
||
344 | "push %%edi \n\t":::); |
||
345 | |||
346 | treelist_node *ret = |
||
347 | (*tl_node_poi_get_info_asm)(tl, node_ind); |
||
348 | |||
349 | __asm__ __volatile__ ( |
||
350 | "pop %%edi \n\t" |
||
351 | "pop %%ebx \n\t":::); |
||
352 | return ret; |
||
353 | } |
||
354 | |||
355 | extern treelist_node* (*tl_node_poi_get_next_info_asm)(treelist *, treelist_node*) __attribute__((__stdcall__)); |
||
356 | ///взять указатель на следущую структуру узла |
||
357 | ///input: |
||
358 | /// tlist - pointer to 'TreeList' struct |
||
359 | /// node_p - node param struct |
||
360 | ///output - pointer to next node struct or NULL |
||
361 | static inline treelist_node* treelist_getnode_next(treelist *tl, treelist_node* node) |
||
362 | { |
||
363 | __asm__ __volatile__ ( |
||
364 | "push %%ebx \n\t" |
||
365 | "push %%edi \n\t":::); |
||
366 | |||
367 | treelist_node *ret = |
||
368 | (*tl_node_poi_get_next_info_asm)(tl, node); |
||
369 | |||
370 | __asm__ __volatile__ ( |
||
371 | "pop %%edi \n\t" |
||
372 | "pop %%ebx \n\t":::); |
||
373 | return ret; |
||
374 | } |
||
375 | |||
376 | extern void* (*_tl_node_poi_get_data_asm)(treelist *, treelist_node*) __attribute__((__stdcall__)); |
||
377 | ///;взять указатель на данные узла |
||
378 | ///input: |
||
379 | /// tlist - pointer to 'TreeList' struct |
||
380 | /// node_p - node param struct |
||
381 | ///output - pointer |
||
382 | static inline void* treelist_getnode_data(treelist *tl, treelist_node *node) |
||
383 | { |
||
384 | __asm__ __volatile__ ( |
||
385 | "push %%edi \n\t":::); |
||
386 | |||
387 | void *ret = |
||
388 | (*_tl_node_poi_get_data_asm)(tl, node); |
||
389 | |||
390 | __asm__ __volatile__ ( |
||
391 | "pop %%edi \n\t":::); |
||
392 | return ret; |
||
393 | } |
||
394 | |||
395 | extern int (*tl_save_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__)); |
||
396 | /// tlist - pointer to 'TreeList' struct |
||
397 | /// opt - options: 0 - first element, 1 - add next element |
||
398 | /// h_mem - pointer to memory |
||
399 | /// mem_size - memory size |
||
400 | ///output - error code |
||
401 | static inline int treelist_save2mem(treelist *tl, int opt, void *h_mem, int mem_size) |
||
402 | { |
||
403 | __asm__ __volatile__ ( |
||
404 | "push %%ebx \n\t" |
||
405 | "push %%esi \n\t" |
||
406 | "push %%edi \n\t":::); |
||
407 | |||
408 | int ret = |
||
409 | (*tl_save_mem_asm)(tl, opt, h_mem, mem_size); |
||
410 | |||
411 | __asm__ __volatile__ ( |
||
412 | "pop %%edi \n\t" |
||
413 | "pop %%esi \n\t" |
||
414 | "pop %%ebx \n\t":::); |
||
415 | return ret; |
||
416 | } |
||
417 | |||
418 | extern int (*_tl_load_mem_asm)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__)); |
||
419 | /**input: |
||
420 | ; tlist - pointer to 'TreeList' struct |
||
421 | ; opt - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add equ 0x20000 ;опция считывания в режиме добавления информации |
||
422 | ; h_mem - pointer to memory |
||
423 | ; mem_size - memory size |
||
424 | ; размер памяти, пока не используется (назначался для контроля) |
||
425 | ; для его использования нужно доработать функцию |
||
426 | ;output: |
||
427 | ; eax - error code |
||
428 | ;memory header format: |
||
429 | ; +0 - (4) 'tree' |
||
430 | ; +4 - (2) info size |
||
431 | ; +6 - (4) count nodes |
||
432 | ; +10 - (4) tlist style |
||
433 | ; +14 - (4) cursor pos |
||
434 | ; +18 - (2) info capt offs |
||
435 | ; +20 - (2) info capt len |
||
436 | ; +22 - (4) scroll pos |
||
437 | ;memory data format: |
||
438 | ; +26 - (info size + 8) * count nodes */ |
||
439 | static inline int treelist_load4mem(treelist *tl, int opt, void *h_mem, int mem_size) |
||
440 | { |
||
441 | __asm__ __volatile__ ( |
||
442 | "push %%ebx \n\t" |
||
443 | "push %%esi \n\t" |
||
444 | "push %%edi \n\t":::); |
||
445 | |||
446 | int ret = |
||
447 | (*_tl_load_mem_asm)(tl, opt, h_mem, mem_size); |
||
448 | |||
449 | __asm__ __volatile__ ( |
||
450 | "pop %%edi \n\t" |
||
451 | "pop %%esi \n\t" |
||
452 | "pop %%ebx \n\t":::); |
||
453 | return ret; |
||
454 | } |
||
455 | |||
456 | extern int (*tl_get_mem_size_asm)(treelist *, void *h_mem) __attribute__((__stdcall__)); |
||
457 | /// ;берет размер памяти занятой функцией tl_save_mem при сохранении элементов |
||
458 | /// tlist - pointer to 'TreeList' struct |
||
459 | /// h_mem - pointer to saved memory |
||
460 | static inline int treelist_get_memsize(treelist *tl, void *h_mem) |
||
461 | { |
||
462 | __asm__ __volatile__ ( |
||
463 | "push %%ebx \n\t" |
||
464 | "push %%edi \n\t":::); |
||
465 | |||
466 | int ret = |
||
467 | (*tl_get_mem_size_asm)(tl, h_mem); |
||
468 | |||
469 | __asm__ __volatile__ ( |
||
470 | "pop %%edi \n\t" |
||
471 | "pop %%ebx \n\t":::); |
||
472 | return ret; |
||
473 | } |
||
474 | |||
6589 | siemargl | 475 | #endif //KOLIBRI_TREELIST_H><>><> |