forked from KolibriOS/kolibrios
143 lines
4.8 KiB
C
143 lines
4.8 KiB
C
#ifndef KOLIBRI_GUI_ELEMENTS_H
|
|
#define KOLIBRI_GUI_ELEMENTS_H
|
|
|
|
/* GUI Elements being used */
|
|
#include "kolibri_editbox.h"
|
|
#include "kolibri_checkbox.h"
|
|
#include "kolibri_button.h"
|
|
#include "kolibri_progressbar.h"
|
|
#include "kolibri_frame.h"
|
|
|
|
/* enum KOLIBRI_GUI_ELEMENT_TYPE contains all available GUI items from box_lib */
|
|
/* More elements can be added from other libraries as required */
|
|
enum KOLIBRI_GUI_ELEMENT_TYPE {
|
|
KOLIBRI_EDIT_BOX,
|
|
KOLIBRI_CHECK_BOX,
|
|
KOLIBRI_RADIO_BUTTON,
|
|
KOLIBRI_SCROLL_BAR,
|
|
KOLIBRI_DYNAMIC_BUTTON,
|
|
KOLIBRI_MENU_BAR,
|
|
KOLIBRI_FILE_BROWSER,
|
|
KOLIBRI_TREE_LIST,
|
|
KOLIBRI_PATH_SHOW,
|
|
KOLIBRI_TEXT_EDITOR,
|
|
KOLIBRI_FRAME,
|
|
KOLIBRI_PROGRESS_BAR,
|
|
|
|
KOLIBRI_BUTTON,
|
|
|
|
/* Add elements above this element in order to let KOLIBRI_NUM_GUI_ELEMENTS */
|
|
/* stay at correct value */
|
|
|
|
KOLIBRI_NUM_GUI_ELEMENTS
|
|
};
|
|
|
|
/* Linked list which connects together all the elements drawn inside a GUI window */
|
|
struct kolibri_window_element {
|
|
enum KOLIBRI_GUI_ELEMENT_TYPE type;
|
|
void *element;
|
|
struct kolibri_window_element *next, *prev;
|
|
};
|
|
|
|
|
|
typedef void (*cb_elem_boxlib)(void *) __attribute__((__stdcall__));
|
|
|
|
/* Generic structure for supporting functions on various elements of Kolibri's GUI */
|
|
struct kolibri_element_operations {
|
|
cb_elem_boxlib redraw_fn;
|
|
cb_elem_boxlib mouse_fn;
|
|
cb_elem_boxlib key_fn;
|
|
};
|
|
|
|
/* Structure for a GUI Window on Kolibri. It also contains all the elements drawn in window */
|
|
struct kolibri_window {
|
|
unsigned int topleftx, toplefty;
|
|
unsigned int sizex, sizey;
|
|
char *window_title;
|
|
|
|
/* Refer to sysfuncs, value to be stored in EDX (Function 0) */
|
|
unsigned int XY;
|
|
|
|
struct kolibri_window_element *elements;
|
|
};
|
|
|
|
/*---------------------End of Structure and enum definitions---------------*/
|
|
/*---------------------Define various functions for initializing GUI-------*/
|
|
|
|
/* Master table containing operations for various GUI elements in one place */
|
|
struct kolibri_element_operations kolibri_gui_op_table[KOLIBRI_NUM_GUI_ELEMENTS];
|
|
|
|
void kolibri_init_gui_op_table(void)
|
|
{
|
|
/* Setting up functions for edit box GUI elements*/
|
|
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].redraw_fn = (cb_elem_boxlib)edit_box_draw;
|
|
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].mouse_fn = (cb_elem_boxlib)edit_box_mouse;
|
|
kolibri_gui_op_table[KOLIBRI_EDIT_BOX].key_fn = (cb_elem_boxlib)editbox_key;
|
|
|
|
/* Setting up functions for check box GUI elements*/
|
|
kolibri_gui_op_table[KOLIBRI_CHECK_BOX].redraw_fn = (cb_elem_boxlib)check_box_draw2;
|
|
kolibri_gui_op_table[KOLIBRI_CHECK_BOX].mouse_fn = (cb_elem_boxlib)check_box_mouse2;
|
|
kolibri_gui_op_table[KOLIBRI_CHECK_BOX].key_fn = NULL;
|
|
|
|
/* Setting up functions for Kolibri Buttons ( SysFunc 8 )*/
|
|
kolibri_gui_op_table[KOLIBRI_BUTTON].redraw_fn = (cb_elem_boxlib)draw_button;
|
|
kolibri_gui_op_table[KOLIBRI_BUTTON].mouse_fn = NULL;
|
|
kolibri_gui_op_table[KOLIBRI_BUTTON].key_fn = NULL;
|
|
|
|
/* Setting up functions for progress bar GUI elements*/
|
|
kolibri_gui_op_table[KOLIBRI_PROGRESS_BAR].redraw_fn = (cb_elem_boxlib)progressbar_draw;
|
|
kolibri_gui_op_table[KOLIBRI_PROGRESS_BAR].mouse_fn = NULL;
|
|
kolibri_gui_op_table[KOLIBRI_PROGRESS_BAR].key_fn = NULL;
|
|
|
|
/* Setting up functions for frame GUI elements*/
|
|
kolibri_gui_op_table[KOLIBRI_FRAME].redraw_fn = (cb_elem_boxlib)frame_draw;
|
|
kolibri_gui_op_table[KOLIBRI_FRAME].mouse_fn = NULL;
|
|
kolibri_gui_op_table[KOLIBRI_FRAME].key_fn = NULL;
|
|
|
|
}
|
|
|
|
/* Create a new main GUI window for KolibriOS */
|
|
/* tl stands for TOP LEFT. x and y are coordinates. */
|
|
|
|
struct kolibri_window * kolibri_new_window(int tlx, int tly, int sizex, int sizey, char *title)
|
|
{
|
|
struct kolibri_window *new_win = (struct kolibri_window *)malloc(sizeof(struct kolibri_window));
|
|
|
|
new_win->topleftx = tlx;
|
|
new_win->toplefty = tly;
|
|
new_win->sizex = sizex;
|
|
new_win->sizey = sizey;
|
|
new_win->window_title = title;
|
|
new_win->XY = 0x00000034; /* All windows are skinned windows with caption for now */
|
|
new_win->elements = NULL;
|
|
|
|
return new_win;
|
|
}
|
|
|
|
/* Add an element to an existing window */
|
|
void kolibri_window_add_element(struct kolibri_window *some_window, enum KOLIBRI_GUI_ELEMENT_TYPE element_type, void *some_gui_element)
|
|
{
|
|
struct kolibri_window_element *new_element = (struct kolibri_window_element *)malloc(sizeof(struct kolibri_window_element));
|
|
|
|
new_element -> type = element_type;
|
|
new_element -> element = some_gui_element;
|
|
|
|
if(!(some_window->elements)) /* No elements in window yet */
|
|
{
|
|
some_window->elements = new_element;
|
|
some_window->elements -> prev = some_window->elements;
|
|
some_window->elements -> next = some_window->elements;
|
|
}
|
|
else
|
|
{
|
|
struct kolibri_window_element *last_element = some_window -> elements -> prev;
|
|
|
|
last_element -> next = new_element;
|
|
new_element -> next = some_window -> elements; /* start of linked list */
|
|
some_window -> elements -> prev = new_element;
|
|
new_element -> prev = last_element;
|
|
}
|
|
}
|
|
|
|
#endif /* KOLIBRI_GUI_ELEMENTS_H */
|