From 799306dee1e3a1647779190defa2d4cb39ffa326 Mon Sep 17 00:00:00 2001 From: siemargl Date: Mon, 19 Sep 2016 11:17:21 +0000 Subject: [PATCH] dbutton, opensave demo git-svn-id: svn://kolibrios.org@6524 a494cfbc-eb01-0410-851d-a64ba20cac60 --- contrib/C_Layer/ASM/loadboxlib.asm | 6 + .../EXAMPLE/libguic_kolibri/dbutton_files.c | 152 ++++++++++++++++++ .../EXAMPLE/libguic_kolibri/scroll_progress.c | 5 +- contrib/C_Layer/INCLUDE/kolibri_colordialog.h | 3 +- contrib/C_Layer/INCLUDE/kolibri_d_button.h | 52 ++++++ .../C_Layer/INCLUDE/kolibri_gui_elements.h | 26 ++- contrib/C_Layer/INCLUDE/kolibri_opendialog.h | 49 +++--- contrib/C_Layer/INCLUDE/kolibri_pathshow.h | 51 ++++++ contrib/C_Layer/INCLUDE/kolibri_statictext.h | 13 ++ 9 files changed, 326 insertions(+), 31 deletions(-) create mode 100644 contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c create mode 100644 contrib/C_Layer/INCLUDE/kolibri_d_button.h create mode 100644 contrib/C_Layer/INCLUDE/kolibri_pathshow.h diff --git a/contrib/C_Layer/ASM/loadboxlib.asm b/contrib/C_Layer/ASM/loadboxlib.asm index fca0cbc867..76aacb18b6 100644 --- a/contrib/C_Layer/ASM/loadboxlib.asm +++ b/contrib/C_Layer/ASM/loadboxlib.asm @@ -144,3 +144,9 @@ public option_box_mouse as '_option_box_mouse' public menu_bar_draw as '_menu_bar_draw' public menu_bar_mouse as '_menu_bar_mouse' public menu_bar_activate as '_menu_bar_activate' + +public dynamic_button_draw as '_dynamic_button_draw' +public dynamic_button_mouse as '_dynamic_button_mouse' + +public path_show_prepare as '_path_show_prepare' +public path_show_draw as '_path_show_draw' diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c b/contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c new file mode 100644 index 0000000000..45744568f4 --- /dev/null +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/dbutton_files.c @@ -0,0 +1,152 @@ +/* + KolibriGUI demobox + -Picture Button + -StaticText + -File Open/Save Dialog + -Filebrowser (planned) + + Free for all + + Initially written by Siemargl, 2016 + + + ToDo +*/ + +#include +#include +#include +#include "kos32sys.h" +#include "kolibri_gui.h" +#include "kolibri_opendialog.h" +#include "kolibri_libimg.h" + +char temp_path[4096]; + +int main() +{ + /* Load all libraries, initialize global tables like system color table and + operations table. kolibri_gui_init() will EXIT with mcall -1 if it fails + to do it's job. This is all you need to call and all libraries and GUI + elements can be used after a successful call to this function + */ + kolibri_gui_init(); + kolibri_proclib_init(); // opensave && color dialogs + kolibri_libimg_init(); // png handling + + + int gui_event = KOLIBRI_EVENT_REDRAW; + uint32_t pressed_button = 0; +// uint32_t mouse_button; +// pos_t mouse_pos; + oskey_t keypress; + + // load image for buttons + const int icon_rgb_size = 16*16*3; // every icons 16x16 24bpp + char *image_data_rgb = malloc(icon_rgb_size * 3), + *image_data; + // make full path + argv + FILE *ficon = fopen("reload_16x16_8b.png", "rb"); + if (!ficon) + { + debug_board_write_str("no icons file reload_16x16_8b.png "); + return 1; + } + int ficon_size = fread(image_data_rgb, 1, icon_rgb_size * 3, ficon); + if (ferror(ficon)) + { + debug_board_write_str("error reading file reload_16x16_8b.png "); + return 1; + } + fclose(ficon); + + // определяем вид изображения и переводим его во временный буфер image_data + image_data = (*img_decode)(image_data_rgb, ficon_size, 0); + // преобразуем изображение к формату rgb + (*img_to_rgb2)(image_data, image_data_rgb); + // удаляем временный буфер image_data + (*img_destroy)(image_data); + + // creating GUI using library functions + kolibri_window *main_window = kolibri_new_window(50, 40, 400, 160, "PictureButton and File dialog demo"); + + pict_button tbar[3]; + gui_add_pict_button(main_window, kolibri_pict_button(&tbar[0], X_Y(10, 16), X_Y(10, 16), image_data_rgb, image_data_rgb + icon_rgb_size, image_data_rgb + icon_rgb_size * 2, 24, NULL, 0)); + gui_add_pict_button(main_window, kolibri_pict_button(&tbar[1], X_Y(20, 16), X_Y(10, 16), image_data_rgb, image_data_rgb + icon_rgb_size, image_data_rgb + icon_rgb_size * 2, 24, NULL, 0)); + gui_add_pict_button(main_window, kolibri_pict_button(&tbar[2], X_Y(30, 16), X_Y(10, 16), image_data_rgb, image_data_rgb + icon_rgb_size, image_data_rgb + icon_rgb_size * 2, 24, NULL, 0)); + + statictext labels[3]; // tips + gui_add_statictext(main_window, kolibri_statictext_def(&labels[0], X_Y(5, 28), "Open")); + gui_add_statictext(main_window, kolibri_statictext_def(&labels[1], X_Y(20, 28), "Save")); + gui_add_statictext(main_window, kolibri_statictext_def(&labels[2], X_Y(30, 28), "Select Dir")); + + open_dialog *dlg_opensave = kolibri_new_open_dialog(OPEN, 10, 10, 420, 320); + (*OpenDialog_init)(dlg_opensave); + + pathview pview; + gui_add_pathview(main_window, kolibri_pathview(&pview, X_Y(10, 40), 330, 0, 0, dlg_opensave->openfile_path, temp_path, 0, 0)); // black font, no background + + do /* Start of main activity loop */ + { + switch(gui_event) + { + case KOLIBRI_EVENT_REDRAW: + kolibri_handle_event_redraw(main_window); + break; + case KOLIBRI_EVENT_NONE: + break; + case KOLIBRI_EVENT_KEY: + keypress = get_key(); + kolibri_handle_event_key(main_window); + break; + case KOLIBRI_EVENT_BUTTON: + pressed_button = get_os_button(); + switch (pressed_button) + { + case BTN_QUIT: + return 0; + break; + } + break; + case KOLIBRI_EVENT_MOUSE: +// mouse_pos = get_mouse_pos(POS_WINDOW); // window relative +// mouse_button = get_mouse_eventstate(); + kolibri_handle_event_mouse(main_window); + + if(tbar[0].click) // open + { + tbar[0].click = 0; + dlg_opensave->mode = OPEN; + (*OpenDialog_start)(dlg_opensave); + if (dlg_opensave->status != 2 && dlg_opensave->status != 1) // fail or cancel + (*path_show_prepare)(&pview); + kolibri_handle_event_redraw(main_window); + } + if(tbar[1].click) // save + { + tbar[1].click = 0; + dlg_opensave->mode = SAVE; + (*OpenDialog_start)(dlg_opensave); + if (dlg_opensave->status != 2 && dlg_opensave->status != 1) // fail or cancel + (*path_show_prepare)(&pview); + kolibri_handle_event_redraw(main_window); + } + if(tbar[2].click) // select + { + tbar[2].click = 0; + dlg_opensave->mode = SELECT; + (*OpenDialog_start)(dlg_opensave); + if (dlg_opensave->status != 2 && dlg_opensave->status != 1) // fail or cancel + (*path_show_prepare)(&pview); + kolibri_handle_event_redraw(main_window); + } + + break; + } + + gui_event = get_os_event(); + } while(1) ; /* End of main activity loop */ + + return 0; +} + diff --git a/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c b/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c index 7fbb277736..a964e5b904 100644 --- a/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c +++ b/contrib/C_Layer/EXAMPLE/libguic_kolibri/scroll_progress.c @@ -107,7 +107,7 @@ int main() switch(gui_event) { case KOLIBRI_EVENT_REDRAW: - sbh->all_redraw = sbv->all_redraw = 1; // resetted + sbh->all_redraw = sbv->all_redraw = 1; // resetted by sbar kolibri_handle_event_redraw(main_window); valuechange = 0; break; @@ -162,7 +162,8 @@ int main() // mouse_pos = get_mouse_pos(POS_WINDOW); // window relative // mouse_button = get_mouse_eventstate(); // add logic to find widget under mouse - kolibri_handle_event_mouse(main_window); + kolibri_handle_event_mouse(main_window); + // we can optimize a lot, if sb->delta2 == 1 then call sb->mouse() and redraw only if sb->redraw with flag all_redraw = 0 (only runner). Then reset redraw. OMG ( if (sbh->position != value) // scrollbars was changed { value = sbh->position; diff --git a/contrib/C_Layer/INCLUDE/kolibri_colordialog.h b/contrib/C_Layer/INCLUDE/kolibri_colordialog.h index 4d8ee8e541..c8e8bddd18 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_colordialog.h +++ b/contrib/C_Layer/INCLUDE/kolibri_colordialog.h @@ -26,7 +26,7 @@ struct open_dialog* kolibri_new_color_dialog(unsigned int type, unsigned short t { color_dialog *new_colordialog = (color_dialog *)malloc(sizeof(color_dialog)); char *proc_info = (char *)calloc(1024, sizeof(char)); - + new_colordialog -> type = type; new_colordialog -> procinfo = proc_info; new_colordialog -> com_area_name = &cd_com_area_name; @@ -43,6 +43,7 @@ struct open_dialog* kolibri_new_color_dialog(unsigned int type, unsigned short t return new_colordialog; } +extern void kolibri_proclib_init() __attribute__((__stdcall__)); extern void (*ColorDialog_init)(color_dialog *) __attribute__((__stdcall__)); extern void (*ColorDialog_start)(color_dialog *) __attribute__((__stdcall__)); #endif /* KOLIBRI_COLORDIALOG_H */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_d_button.h b/contrib/C_Layer/INCLUDE/kolibri_d_button.h new file mode 100644 index 0000000000..27b7f18bda --- /dev/null +++ b/contrib/C_Layer/INCLUDE/kolibri_d_button.h @@ -0,0 +1,52 @@ +#ifndef KOLIBRI_DBUTTON_H +#define KOLIBRI_DBUTTON_H + +typedef struct { + uint32_t type; + uint32_t x_w; + uint32_t y_h; + uint32_t mouse_pos; + uint32_t mouse_keys; + uint32_t mouse_keys_old; + void* active_raw; //active bitmap + void* passive_raw; //passive bitmap + void* click_raw; //pressed bitmap + uint32_t resolution_raw; // bpp, as esi fn65 + void* palette_raw; // palette, as edi fn65 + uint32_t offset_raw; // width as ebp fn65 + uint32_t select; // internal state: 0 - passive, 2 - pressed, 1 - clicked + uint32_t click; // clicked - 1, zero it after tested +} pict_button; + + +inline pict_button* kolibri_pict_button(pict_button* b, uint32_t x_w, uint32_t y_h, void* active_pict, void* passive_pict, void* pressed_pict, uint32_t bpp, void* palette, int32_t offset_line) +{ + b->type = b->mouse_pos = b->mouse_keys = b->mouse_keys_old = b->select = b->click = 0; + b->x_w = x_w; + b->y_h = y_h; + b->active_raw = active_pict; + b->passive_raw = passive_pict; + b->click_raw = pressed_pict; + b->resolution_raw = bpp; + b->palette_raw = palette; + b->offset_raw = offset_line; + + return b; +} + +inline pict_button* kolibri_new_pict_button(uint32_t x_w, uint32_t y_h, void* active_pict, void* passive_pict, void* pressed_pict, uint32_t bpp, void* palette, int32_t offset_line) +{ + pict_button *new_d_but = (pict_button *)malloc(sizeof(pict_button)); + return kolibri_pict_button(new_d_but, x_w, y_h, active_pict, passive_pict, pressed_pict, bpp, palette, offset_line); +} + +inline void gui_add_pict_button(kolibri_window *wnd, pict_button* db) +{ + kolibri_window_add_element(wnd, KOLIBRI_D_BUTTON, db); +} + + +extern void (*dynamic_button_draw)(pict_button *) __attribute__((__stdcall__)); +extern void (*dynamic_button_mouse)(pict_button *) __attribute__((__stdcall__)); + +#endif /* KOLIBRI_DBUTTON_H */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h b/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h index a15baee51a..a818689934 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h +++ b/contrib/C_Layer/INCLUDE/kolibri_gui_elements.h @@ -21,8 +21,9 @@ enum KOLIBRI_GUI_ELEMENT_TYPE { KOLIBRI_PROGRESS_BAR, KOLIBRI_STATICTEXT, KOLIBRI_STATICNUM, - KOLIBRI_BUTTON, + KOLIBRI_D_BUTTON, + KOLIBRI_PATHSHOW, /* Add elements above this element in order to let KOLIBRI_NUM_GUI_ELEMENTS */ /* stay at correct value */ @@ -65,15 +66,18 @@ typedef struct{ void kolibri_window_add_element(kolibri_window *some_window, enum KOLIBRI_GUI_ELEMENT_TYPE element_type, void *some_gui_element); // forward declaration /* GUI Elements being used */ -#include "kolibri_editbox.h" -#include "kolibri_checkbox.h" #include "kolibri_button.h" -#include "kolibri_progressbar.h" +#include "kolibri_checkbox.h" +#include "kolibri_d_button.h" +#include "kolibri_editbox.h" #include "kolibri_frame.h" +#include "kolibri_menubar.h" +#include "kolibri_optionbox.h" +#include "kolibri_pathshow.h" +#include "kolibri_progressbar.h" #include "kolibri_scrollbar.h" #include "kolibri_statictext.h" -#include "kolibri_optionbox.h" -#include "kolibri_menubar.h" + @@ -135,7 +139,15 @@ kolibri_gui_op_table[KOLIBRI_MENU_BAR].redraw_fn = (cb_elem_boxlib)menu_bar_draw kolibri_gui_op_table[KOLIBRI_MENU_BAR].mouse_fn = (cb_elem_boxlib)menu_bar_mouse; kolibri_gui_op_table[KOLIBRI_MENU_BAR].key_fn = NULL; -debug_board_printf("KOLIBRI_MENU_BAR (%x,%x,%x)\n", menu_bar_draw,menu_bar_mouse,menu_bar_activate); +kolibri_gui_op_table[KOLIBRI_D_BUTTON].redraw_fn = (cb_elem_boxlib)dynamic_button_draw; +kolibri_gui_op_table[KOLIBRI_D_BUTTON].mouse_fn = (cb_elem_boxlib)dynamic_button_mouse; +kolibri_gui_op_table[KOLIBRI_D_BUTTON].key_fn = NULL; +debug_board_printf("KOLIBRI_D_BUTTON (%x,%x,%x)\n", dynamic_button_draw, dynamic_button_mouse, 0); + +kolibri_gui_op_table[KOLIBRI_PATHSHOW].redraw_fn = (cb_elem_boxlib)path_show_draw; +kolibri_gui_op_table[KOLIBRI_PATHSHOW].mouse_fn = NULL; +kolibri_gui_op_table[KOLIBRI_PATHSHOW].key_fn = NULL; +debug_board_printf("KOLIBRI_PATHSHOW (%x,%x,%x)\n", path_show_draw, 0, 0); } /* Create a new main GUI window for KolibriOS */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_opendialog.h b/contrib/C_Layer/INCLUDE/kolibri_opendialog.h index a21cf97b29..7d3a7f6301 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_opendialog.h +++ b/contrib/C_Layer/INCLUDE/kolibri_opendialog.h @@ -3,35 +3,41 @@ char sz_com_area_name[] = "FFFFFFFF_open_dialog"; char sz_dir_default_path[] = "/rd/1"; -char sz_start_path[] = "/rd/1/File managers/opendial"; +char sz_start_path[] = "/rd/1/File managers/opendial"; + +enum open_dialog_mode { + OPEN, + SAVE, + SELECT +}; +typedef struct { + unsigned int size; + unsigned char end; +}od_filter; + typedef struct { unsigned int mode; - unsigned int procinfo; - unsigned int com_area_name; + char* procinfo; + char* com_area_name; unsigned int com_area; - unsigned int opendir_path; - unsigned int dir_default_path; - unsigned int start_path; - unsigned int draw_window; + char* opendir_path; + char* dir_default_path; + char* start_path; + void (*draw_window)(); unsigned int status; - unsigned int openfile_path; - unsigned int filename_area; - unsigned int filter_area; + char* openfile_path; + char* filename_area; + od_filter* filter_area; unsigned short x_size; unsigned short x_start; unsigned short y_size; unsigned short y_start; }open_dialog; -typedef struct { - unsigned int size; - unsigned char end; -}od_filter; - void fake_on_redraw(void) {} -struct open_dialog* kolibri_new_open_dialog(unsigned int mode, unsigned short tlx, unsigned short tly, unsigned short x_size, unsigned short y_size) +open_dialog* kolibri_new_open_dialog(unsigned int mode, unsigned short tlx, unsigned short tly, unsigned short x_size, unsigned short y_size) { open_dialog *new_opendialog = (open_dialog *)malloc(sizeof(open_dialog)); od_filter *new_od_filter = (od_filter *)malloc(sizeof(od_filter)); @@ -39,17 +45,17 @@ struct open_dialog* kolibri_new_open_dialog(unsigned int mode, unsigned short tl char *openfile_path = (char *)calloc(4096, sizeof(char)); char *proc_info = (char *)calloc(1024, sizeof(char)); char *filename_area = (char *)calloc(256, sizeof(char)); - + new_od_filter -> size = 0; new_od_filter -> end = 0; - + new_opendialog -> mode = mode; new_opendialog -> procinfo = proc_info; - new_opendialog -> com_area_name = &sz_com_area_name; + new_opendialog -> com_area_name = sz_com_area_name; new_opendialog -> com_area = 0; new_opendialog -> opendir_path = plugin_path; - new_opendialog -> dir_default_path = &sz_dir_default_path; - new_opendialog -> start_path = &sz_start_path; + new_opendialog -> dir_default_path = sz_dir_default_path; + new_opendialog -> start_path = sz_start_path; new_opendialog -> draw_window = &fake_on_redraw; new_opendialog -> status = 0; new_opendialog -> openfile_path = openfile_path; @@ -62,6 +68,7 @@ struct open_dialog* kolibri_new_open_dialog(unsigned int mode, unsigned short tl return new_opendialog; } +extern void kolibri_proclib_init(); extern void (*OpenDialog_init)(open_dialog *) __attribute__((__stdcall__)); extern void (*OpenDialog_start)(open_dialog *) __attribute__((__stdcall__)); #endif /* KOLIBRI_OPENDIALOG_H */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_pathshow.h b/contrib/C_Layer/INCLUDE/kolibri_pathshow.h new file mode 100644 index 0000000000..c41e1102e4 --- /dev/null +++ b/contrib/C_Layer/INCLUDE/kolibri_pathshow.h @@ -0,0 +1,51 @@ +#ifndef KOLIBRI_PATHSHOW_H +#define KOLIBRI_PATHSHOW_H + +typedef struct { + uint32_t type; + uint32_t x_y; + uint16_t font_size_x; // 6 - for font 0, 8 - for font 1 + uint16_t area_size_x; + uint32_t font_number; // 0 - monospace, 1 - variable, as fn4 (2bit only 0-3) + uint32_t background_flag; // as fn4, if 0, bk_color unneeded + color_t font_color; // as fn4 + color_t background_color; // as fn4 + char* text_pointer; // 4096 ? + char* work_area_pointer; // 4096 ? + uint32_t temp_text_length; +} pathview; + + + +inline pathview* kolibri_pathview(pathview* p, uint32_t x_y, uint32_t width, uint32_t font_number, uint32_t is_bkgr, char* text, char* temp_buf, color_t font, color_t bkgr) +{ + p->type = p->temp_text_length = 0; + p->x_y = x_y; + p->font_size_x = font_number == 0 ? 6 : 8; // need correction for bigger fonts + p->area_size_x = width; + p->font_number = font_number; + p->background_flag = is_bkgr; + p->text_pointer = text; + p->work_area_pointer = temp_buf; + p->font_color = font; + p->background_color = bkgr; + + return p; +} + +inline pathview* kolibri_new_pathview(pathview* p, uint32_t x_y, uint32_t width, uint32_t font_number, uint32_t is_bkgr, char* text, char* temp_buf, color_t font, color_t bkgr) +{ + pathview *new_pv = (pathview *)malloc(sizeof(pathview)); + return kolibri_pathview(new_pv, x_y, width, font_number, is_bkgr, text, temp_buf, font, bkgr); +} + +inline void gui_add_pathview(kolibri_window *wnd, pathview* pv) +{ + kolibri_window_add_element(wnd, KOLIBRI_PATHSHOW, pv); +} + + +extern void (*path_show_prepare)(pathview *) __attribute__((__stdcall__)); +extern void (*path_show_draw)(pathview *) __attribute__((__stdcall__)); + +#endif /* KOLIBRI_PATHSHOW_H */ diff --git a/contrib/C_Layer/INCLUDE/kolibri_statictext.h b/contrib/C_Layer/INCLUDE/kolibri_statictext.h index 7ca97b38b0..b9cce87d44 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_statictext.h +++ b/contrib/C_Layer/INCLUDE/kolibri_statictext.h @@ -66,6 +66,13 @@ void statictext_draw(statictext *st) :); } +inline void gui_add_statictext(kolibri_window *wnd, statictext* st) +{ + kolibri_window_add_element(wnd, KOLIBRI_STATICTEXT, st); +} + + + staticnum* kolibri_staticnum(staticnum* st, uint32_t xy, int32_t width, int16_t number, encoding_t enc, int size, color_t font, color_t bg) { st->start_xy = xy; @@ -97,6 +104,12 @@ staticnum* kolibri_new_staticnum_def(uint32_t xy, int32_t width, int32_t number) return kolibri_new_staticnum(xy, width, number, cp866, 0, kolibri_color_table.color_work_text, 0); } +inline void gui_add_staticnum(kolibri_window *wnd, staticnum* sn) +{ + kolibri_window_add_element(wnd, KOLIBRI_STATICNUM, sn); +} + + __attribute__((__stdcall__)) void staticnum_draw(staticnum *st) {