2021-02-06 00:27:15 +01:00
# ifndef KOLIBRI_FILEBROWSE_H
# define KOLIBRI_FILEBROWSE_H
2016-10-02 20:47:05 +02:00
struct __attribute__ ( ( __packed__ ) ) fs_dirinfo {
uint32_t subfn ; // 1 read dir
uint32_t start ;
uint32_t flags ;
uint32_t size ;
uint32_t retval ;
union {
struct __attribute__ ( ( __packed__ ) ) {
uint8_t zero ; // 0
char * ppath ;
} ;
char path [ 5 ] ; // up to 4096
} ;
} ;
static inline
uint32_t sf_file ( int subfn , struct fs_dirinfo * dinfo )
// retval 0 if ok
{
uint32_t retval ;
dinfo - > subfn = subfn ;
__asm__ __volatile__ (
" int $0x40 "
: " =a " ( retval )
: " a " ( 70 ) , " b " ( dinfo )
: ) ;
return retval ;
} ;
struct fs_dirheader {
uint32_t version ; // 1
uint32_t curn_blocks ; // number of read dir items (BDFE)
uint32_t totl_blocks ; // directory full size
char other [ 20 ] ; // reserved 0
} ;
enum filetype
{
fs_readonly = 1 ,
fs_hidden = 2 ,
fs_system = 4 ,
fs_volumelabel = 8 ,
fs_folder = 0x10 ,
fs_nonarchived = 0x20
} ;
struct __attribute__ ( ( __packed__ ) ) fs_filetime {
uint8_t sec ;
uint8_t mm ;
uint8_t hour ;
uint8_t zero ;
} ;
struct __attribute__ ( ( __packed__ ) ) fs_filedate {
uint8_t day ;
uint8_t month ;
uint16_t year ;
} ;
/// directory entry cp866
struct fsBDFE {
uint32_t filetype ;
uint32_t encoding ; // 0 - cp866, 1 - utf16le
struct fs_filetime tm_created ;
struct fs_filedate dt_created ;
struct fs_filetime tm_accessed ;
struct fs_filedate dt_accessed ;
struct fs_filetime tm_modified ;
struct fs_filedate dt_modified ;
uint64_t size ;
char fname [ 264 ] ;
} ; // must be sized 304
/// directory entry UTF16LE
struct fsBDFE_16 {
uint32_t filetype ;
uint32_t encoding ; // 0 - cp866, 1 - utf16le
struct fs_filetime tm_created ;
struct fs_filedate dt_created ;
struct fs_filetime tm_accessed ;
struct fs_filedate dt_accessed ;
struct fs_filetime tm_modified ;
struct fs_filedate dt_modified ;
uint64_t size ;
wchar_t fname [ 260 ] ;
} ; // must be sized 560
2021-02-06 00:27:15 +01:00
typedef struct __attribute__ ( ( __packed__ ) ) {
uint32_t type ; // unused
uint32_t x_w ; // 10, 400
2016-09-27 11:47:30 +02:00
uint32_t y_h ; // 45, 550
2021-02-06 00:27:15 +01:00
uint32_t icon_size_xy ; // x_y (16, 16)
2016-10-02 20:47:05 +02:00
uint16_t line_size_x ; // not used
2021-02-06 00:27:15 +01:00
uint16_t line_size_y ; // 18 or 17 - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2016-10-02 20:47:05 +02:00
uint16_t type_size_x ; // not used
uint16_t size_size_x ; // not used
uint16_t date_size_x ; // not used
uint16_t attributes_size_x ; // not used
uint32_t icon_assoc_area ; // not used
void * icon_raw_area ; // z_icons.png
2016-09-27 11:47:30 +02:00
uint32_t icon_resolution_raw ; // ...
2016-10-02 20:47:05 +02:00
void * icon_palette_raw ; // ...
uint32_t directory_path_area ; // not used
uint32_t file_name_area ; // not used
2016-10-04 03:22:22 +02:00
uint32_t select_flag ; // widget have focus, set auto on mouseclick, but need to reset before mouse()
2021-02-06 00:27:15 +01:00
color_t background_color ; // self explained, 0xffffff
color_t select_color ; // self explained, 0xbbddff
2016-10-13 01:28:04 +02:00
color_t select_text_color ; // self explained - have a bug - never really used
2016-10-02 20:47:05 +02:00
color_t text_color ; // self explained
color_t reduct_text_color ; // 0xff0000 - spec color for cutted filenames
color_t marked_text_color ; // not used
2021-02-06 00:27:15 +01:00
uint32_t max_panel_line ; // moved to scrollbar->cur_area, - <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> , <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
uint32_t select_panel_counter ; // !=0 if want to draw multiselection ???
uint32_t folder_block ; // auto formed, <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (<28> <> <EFBFBD> <EFBFBD> ) ????? format BDVK == bdfe,, // moved to scrollbar->max_area
uint32_t start_draw_line ; // internal - top showed file n. moved to scrollbar->position and back
uint16_t start_draw_cursor_line ; //internal
2016-10-02 20:47:05 +02:00
void * folder_data ; // 32 byte - dir_header, +4 = number, +32 - bdvk[], size of rec(bdvk cp866) = 304byte
uint32_t temp_counter ; //internal
uint32_t file_name_length ; //internal
uint32_t marked_file ; // have a mark 0/1 ?
uint32_t extension_size ; //internal
uint32_t extension_start ; //internal
void * type_table ; // type buffer
char * ini_file_start ; // icons.ini contens - file<>icon association
2016-09-27 11:47:30 +02:00
char * ini_file_end ; // start + filesize
2016-10-02 20:47:05 +02:00
uint32_t draw_scroll_bar ; // 1 = need redraw sb after key(), user - resetted
2016-09-27 11:47:30 +02:00
uint32_t font_size_xy ; // x_y (6, 9)
2016-10-02 20:47:05 +02:00
uint32_t mouse_keys ; // saved internal
uint32_t mouse_keys_old ; // saved internal
uint32_t mouse_pos ; // saved internal
uint32_t mouse_keys_delta ; // saved internal
2016-09-27 11:47:30 +02:00
uint32_t mouse_key_delay ; // 50
2016-10-02 20:47:05 +02:00
uint32_t mouse_keys_tick ; // internal timer
uint16_t start_draw_cursor_line_2 ; // internal cursor line
uint32_t all_redraw ; // 0 - skip draw contens, 1 - force draw, 2 - no draw selection (but draw icons), used when scroll
struct fsBDFE * selected_BDVK_adress ; // pointer to selected
2016-09-27 11:47:30 +02:00
uint16_t key_action ; // fill before key(), 1..12, wiki
uint16_t key_action_num ; // fill before key() fn2 >> 8
2016-10-02 20:47:05 +02:00
char * name_temp_area ; // temporary string format buffer
uint32_t max_name_temp_size ; // sizeof ^
uint32_t display_name_max_length ; // autocounted
uint32_t draw_panel_selection_flag ; // flag internal showing selected item
uint32_t mouse_pos_old ; // saved internal
uint32_t marked_counter ; // number of marked files
char * keymap_pointer ; // keyboard layout map
2021-02-06 00:27:15 +01:00
} filebrowser ;
2016-10-02 20:47:05 +02:00
static inline filebrowser * kolibri_filebrowser ( filebrowser * fb , uint32_t x_w , uint32_t y_h , uint32_t font_size_xy , uint32_t icon_size_xy , void * icon_raw_area , void * icon_palette_raw , uint32_t icon_res ,
char * ini_file_start , char * ini_file_end ,
color_t font_select , color_t bk_select , color_t font_color , color_t bgcolor , color_t reduct_color )
2016-09-27 11:47:30 +02:00
{
2016-10-02 20:47:05 +02:00
static char name_temp_area [ 256 ] ;
static char keymap_area [ 128 ] ;
static char type_table [ 128 ] = " <DIR> 1023b 00.00.00 00:00 temp1.asm " ;
memset ( fb , 0 , sizeof ( filebrowser ) ) ;
2021-02-06 00:27:15 +01:00
fb - > x_w = x_w ;
2016-10-02 20:47:05 +02:00
fb - > y_h = y_h ;
fb - > font_size_xy = font_size_xy ;
fb - > icon_size_xy = icon_size_xy ;
fb - > icon_raw_area = icon_raw_area ;
fb - > icon_palette_raw = icon_palette_raw ;
fb - > icon_resolution_raw = icon_res ;
2021-02-06 00:27:15 +01:00
fb - > line_size_y = ( icon_size_xy & 0xFFFF ) + 2 ;
2016-10-02 20:47:05 +02:00
// constants
fb - > type_table = type_table ;
fb - > mouse_key_delay = 50 ;
fb - > name_temp_area = name_temp_area ;
// fb->max_name_temp_size = sizeof name_temp_area - 1;
fb - > keymap_pointer = keymap_area ;
// careful - font sizes may be encoded in colors as SysFn4
2021-02-06 00:27:15 +01:00
fb - > background_color = bgcolor ; // self explained, 0xffffff
fb - > select_color = bk_select ; // self explained, 0xbbddff
2016-10-02 20:47:05 +02:00
fb - > select_text_color = font_select ; // self explained
fb - > text_color = font_color ; // self explained
fb - > reduct_text_color = reduct_color ; // 0xff0000 - spec color for cutted filenames
fb - > ini_file_start = ini_file_start ;
fb - > ini_file_end = ini_file_end ;
/*
void * folder_data ; // 32 byte - dir_header, +4 = number, +32 - bdvk[], size of rec(bdvk cp866) = 304byte
*/
return fb ;
2021-02-06 00:27:15 +01:00
}
2016-10-02 20:47:05 +02:00
static inline filebrowser * kolibri_new_filebrowser ( uint32_t x_w , uint32_t y_h , uint32_t font_size_xy , uint32_t icon_size_xy , void * icon_raw_area , void * icon_palette_raw , uint32_t icon_bpp ,
char * ini_file_start , char * ini_file_end ,
color_t font_select , color_t bk_select , color_t font_color , color_t bgcolor , color_t reduct_color )
2021-02-06 00:27:15 +01:00
{
filebrowser * new_fb = ( filebrowser * ) malloc ( sizeof ( filebrowser ) ) ;
2016-10-02 20:47:05 +02:00
return kolibri_filebrowser ( new_fb , x_w , y_h , font_size_xy , icon_size_xy , icon_raw_area , icon_palette_raw , icon_bpp , ini_file_start , ini_file_end ,
2021-02-06 00:27:15 +01:00
font_select , bk_select , font_color , bgcolor , reduct_color ) ;
2016-09-27 11:47:30 +02:00
}
2016-10-02 20:47:05 +02:00
/* loading files leads to link functions even if no using filebrowser
inline filebrowser * kolibri_filebrowser_def ( filebrowser * fb , uint32_t x_w , uint32_t y_h )
2016-09-27 11:47:30 +02:00
{
2016-10-02 20:47:05 +02:00
// load default icons and icon association
char icons_ini [ ] = " /rd/1/File managers/icons.ini " ;
char icons16img [ ] = " /rd/1/File managers/z_icons.png " ;
2016-09-27 11:47:30 +02:00
2016-10-02 20:47:05 +02:00
return kolibri_filebrowser ( fb , x_w , y_h , X_Y ( 9 , 16 ) , X_Y ( 16 , 16 ) , icon_raw_area , icon_palette_raw , icon_res ,
ini_file_start , ini_file_end ,
2021-02-06 00:27:15 +01:00
0x000000 , 0xbbddff , kolibri_color_table . color_work_text , kolibri_color_table . color_work_area , 0xff0000 ) ;
2016-10-02 20:47:05 +02:00
}
*/
2016-10-13 01:28:04 +02:00
2021-02-06 00:27:15 +01:00
static inline void gui_add_filebrowser ( kolibri_window * wnd , filebrowser * f )
2016-09-27 11:47:30 +02:00
{
2021-02-06 00:27:15 +01:00
kolibri_window_add_element ( wnd , KOLIBRI_FILEBROWSE , f ) ;
2016-09-27 11:47:30 +02:00
}
2016-10-20 19:13:23 +02:00
2021-02-06 00:27:15 +01:00
extern void ( * filebrowse_draw ) ( filebrowser * ) __attribute__ ( ( __stdcall__ ) ) ;
extern void ( * filebrowse_key ) ( filebrowser * ) __attribute__ ( ( __stdcall__ ) ) ;
extern void ( * filebrowse_mouse ) ( filebrowser * ) __attribute__ ( ( __stdcall__ ) ) ;
2016-10-20 19:13:23 +02:00
__attribute__ ( ( __stdcall__ ) ) static inline void filebrowser_key ( filebrowser * fb , oskey_t keypress )
/// wrapper for key, translate keypress (ASCII mode) to action for browser
{
// if (!fb->select_flag) return; // same reaction as other controls
int extended_key = 0 , act = 0 ;
if ( keypress . state ) return ;
if ( keypress . code = = 0xE0 ) { extended_key = 1 ; return ; }
act = 0 ;
switch ( keypress . ctrl_key ) // ascii scancode
{
case 80 : // arrow down
act = 1 ; break ;
case 72 : // arrow up
act = 2 ; break ;
case 81 : // PageDown
act = 3 ; break ;
case 73 : // PageUp
act = 4 ; break ;
case 71 : // Home
act = 5 ; break ;
case 79 : // End
act = 6 ; break ;
case 28 : // Enter
act = 7 ; break ;
case 82 : // Insert
act = 8 ; break ;
case 78 : // NumPad+ select all
act = 9 ; break ;
case 74 : // NumPad- deselct
act = 10 ; break ;
case 55 : // NumPad* invert selection
act = 11 ; break ;
default :
act = 12 ; // search by letter
}
fb - > key_action = act ;
fb - > key_action_num = keypress . ctrl_key ;
// debug_board_printf("key pressed [%X] %d, action %d, ext_flag = %d\n", keypress.val, brows.key_action_num, act, extended_key);
if ( extended_key ) extended_key = 0 ;
( * filebrowse_key ) ( fb ) ;
}
2021-02-06 00:27:15 +01:00
# endif /* KOLIBRI_FILEBROWSE_H */