Subversion Repositories Kolibri OS

Rev

Rev 6615 | 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 {
6690 siemargl 7
    TL_KEY_NO_EDIT  = 1,    // элемент нельзя редактировать на клавиатуре (изменять уровни стрелками, удалять DEL)
6589 siemargl 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
 
6690 siemargl 58
// capt_cy may be 0 = no caption
59
// if icon_size is 16x16, and data_img id NULL, no icons - useful in list mode
6601 siemargl 60
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,
61
                                             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)
62
{
63
    treelist *tl = (treelist *)calloc(1, sizeof(treelist));
64
    tl->left= x_w >> 16;
65
    tl->width = x_w & 0xFFFF;
66
    tl->top = y_h >> 16;
67
    tl->height = y_h & 0xFFFF;
68
    tl->info_size = info_size;
69
    tl->info_max_count = info_max_count;
70
    tl->style = style;
71
    tl->img_cx = icon_size_xy >> 16;
72
    tl->img_cy = icon_size_xy & 0xFFFF;
73
    tl->col_bkg = back;
74
    tl->col_zag = title;
75
    tl->col_txt = txt;
76
    tl->info_capt_len = info_capt_len;
77
    tl->info_capt_offs = info_capt_offs;
78
    tl->el_focus = el_focus;
6690 siemargl 79
    tl->capt_cy = capt_cy;
6612 siemargl 80
    tl->p_scroll = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0);
6601 siemargl 81
    return tl;
82
}
6589 siemargl 83
 
6601 siemargl 84
static inline void gui_add_treelist(kolibri_window *wnd, treelist* tl)
85
{
86
    kolibri_window_add_element(wnd, KOLIBRI_TREELIST, tl);
87
}
88
 
89
 
90
///реакция на мышь
91
extern void (*tl_mouse)(treelist *) __attribute__((__stdcall__));
92
 
93
///вывод списка на экран
6612 siemargl 94
extern void (*tl_draw)(treelist *) __attribute__((__stdcall__));
95
__attribute__((__stdcall__)) static inline void treelist_draw(treelist *tl)
96
{
97
    tl->p_scroll->all_redraw = 1;
98
    (*tl_draw)(tl);
99
}
100
 
6601 siemargl 101
 
102
///перемещаем узел вверх
103
extern void (*tl_node_move_up)(treelist *) __attribute__((__stdcall__));
104
 
105
///перемещаем узел вниз
106
extern void (*tl_node_move_down)(treelist *) __attribute__((__stdcall__));
107
 
108
///выделение памяти для структур списка и основной информации (конструктор)
6615 siemargl 109
extern void (*tl_data_init)(treelist *) __attribute__((__stdcall__));
6601 siemargl 110
 
111
 
112
///очистка памяти элемента (деструктор)
6615 siemargl 113
extern void (*tl_data_clear)(treelist *) __attribute__((__stdcall__));
6601 siemargl 114
static inline void treelist_data_clear(treelist *tl)
115
{
6615 siemargl 116
    (*tl_data_clear)(tl);
6612 siemargl 117
    free(tl->p_scroll);
6601 siemargl 118
}
119
 
120
///очистка списка (информации)
6615 siemargl 121
extern void (*tl_info_clear)(treelist *) __attribute__((__stdcall__));
6601 siemargl 122
 
123
extern void (*tl_key_asm)(treelist *) __attribute__((__stdcall__));
124
///реакция на клавиатуру
6612 siemargl 125
__attribute__((__stdcall__)) static inline void treelist_key(treelist *tl, oskey_t code)
6601 siemargl 126
{
127
    __asm__ __volatile__ (
6612 siemargl 128
             "push %2\n\t"
129
             "call *%1 \n\t"::"a"(code.val), "m"(tl_key_asm), "m"(tl):);  // indirect call with asterisk *
6601 siemargl 130
 
6612 siemargl 131
//    (*tl_key_asm)(tl);
6601 siemargl 132
}
133
 
134
///отмена действия
6615 siemargl 135
extern void (*tl_info_undo)(treelist *) __attribute__((__stdcall__));
6601 siemargl 136
 
137
///повтор действия
6615 siemargl 138
extern void (*tl_info_redo)(treelist *) __attribute__((__stdcall__));
6601 siemargl 139
 
6615 siemargl 140
extern void (*tl_node_add)(treelist *, uint32_t n_opt, void *n_info) __attribute__((__stdcall__));
6601 siemargl 141
///добавить узел
142
///input:
143
/// tlist - указатель на структуру листа
144
/// n_opt - опции добавления
145
/// n_info - указатель на добавляемые данные
146
static inline void treelist_node_add(treelist *tl, void *n_info, uint16_t type, uint8_t clos, uint8_t lev)
147
{
148
    uint32_t    n_opt = (type << 16) | (clos << 8) | lev;
6615 siemargl 149
    (*tl_node_add)(tl, n_opt, n_info);
6601 siemargl 150
}
151
 
152
///записать в текущий узел
153
///input:
154
/// tlist - указатель на структуру листа
155
/// n_info - указатель на данные
6615 siemargl 156
extern void (*tl_node_set_data)(treelist *, void *n_info) __attribute__((__stdcall__));
6601 siemargl 157
 
158
///взять указатель на данные узла под курсором
6615 siemargl 159
extern void* (*tl_node_get_data)(treelist *) __attribute__((__stdcall__));
6601 siemargl 160
 
161
///удалить узел под курсором
6615 siemargl 162
extern void (*tl_node_delete)(treelist *) __attribute__((__stdcall__));
6601 siemargl 163
 
164
///поставить курсор на первый узел
6615 siemargl 165
extern void (*tl_cur_beg)(treelist *) __attribute__((__stdcall__));
6601 siemargl 166
 
167
///перенести курсор на 1 позицию ниже
6615 siemargl 168
extern void (*tl_cur_next)(treelist *) __attribute__((__stdcall__));
6601 siemargl 169
 
170
///перенести курсор на 1 позицию выше
6615 siemargl 171
extern void (*tl_cur_perv)(treelist *) __attribute__((__stdcall__));
6601 siemargl 172
 
173
///открыть/закрыть узел (работает с узлами которые имеют дочерние узлы)
6615 siemargl 174
extern void (*tl_node_close_open)(treelist *) __attribute__((__stdcall__));
6601 siemargl 175
 
176
///увеличить уровень
6615 siemargl 177
extern void (*tl_node_lev_inc)(treelist *) __attribute__((__stdcall__));
6601 siemargl 178
 
179
///уменьшить уровень
6615 siemargl 180
extern void (*tl_node_lev_dec)(treelist *) __attribute__((__stdcall__));
6601 siemargl 181
 
182
///взять указатель на структуру узла в указанной позиции
183
///input:
184
/// tlist - pointer to 'TreeList' struct
185
/// node_ind - node index
186
///output - pointer to node info or NULL
6615 siemargl 187
extern treelist_node* (*tl_node_poi_get_info)(treelist *, int node_ind) __attribute__((__stdcall__));
6601 siemargl 188
 
189
///взять указатель на следущую структуру узла
190
///input:
191
/// tlist - pointer to 'TreeList' struct
192
/// node_p - node param struct
193
///output - pointer to next node struct or NULL
6615 siemargl 194
extern treelist_node* (*tl_node_poi_get_next_info)(treelist *, treelist_node*) __attribute__((__stdcall__));
6601 siemargl 195
 
196
///;взять указатель на данные узла
197
///input:
198
/// tlist - pointer to 'TreeList' struct
199
/// node_p - node param struct
200
///output - pointer
6615 siemargl 201
extern void* (*_tl_node_poi_get_data)(treelist *, treelist_node*) __attribute__((__stdcall__));
6601 siemargl 202
 
203
/// tlist - pointer to 'TreeList' struct
204
/// opt - options: 0 - first element, 1 - add next element
205
/// h_mem - pointer to memory
206
/// mem_size - memory size
207
///output - error code
6615 siemargl 208
extern int (*tl_save_mem)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
6601 siemargl 209
 
210
/**input:
211
; tlist - pointer to 'TreeList' struct
212
; opt   - options: element index + (2*(add mode)+(init mode)) shl 16, tl_load_mode_add        equ 0x20000 ;опция считывания в режиме добавления информации
213
; h_mem - pointer to memory
214
; mem_size - memory size
215
;   размер памяти, пока не используется (назначался для контроля)
216
;   для его использования нужно доработать функцию
217
;output:
218
; eax - error code
219
;memory header format:
220
;  +0 - (4) 'tree'
221
;  +4 - (2) info size
222
;  +6 - (4) count nodes
223
; +10 - (4) tlist style
224
; +14 - (4) cursor pos
225
; +18 - (2) info capt offs
226
; +20 - (2) info capt len
227
; +22 - (4) scroll pos
228
;memory data format:
229
; +26 - (info size + 8) * count nodes */
6615 siemargl 230
extern int (*_tl_load_mem)(treelist *, int opt, void *h_mem, int mem_size) __attribute__((__stdcall__));
6601 siemargl 231
 
232
/// ;берет размер памяти занятой функцией tl_save_mem при сохранении элементов
233
/// tlist - pointer to 'TreeList' struct
234
/// h_mem - pointer to saved memory
6615 siemargl 235
extern int (*tl_get_mem_size)(treelist *, void *h_mem) __attribute__((__stdcall__));
6601 siemargl 236
 
6589 siemargl 237
#endif //KOLIBRI_TREELIST_H