Subversion Repositories Kolibri OS

Rev

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