Subversion Repositories Kolibri OS

Rev

Rev 6535 | Rev 6561 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     KolibriGUI demobox
  3.     -Picture Button
  4.     -StaticText
  5.     -File Open/Save Dialog
  6.     -Filebrowser
  7.     -Controlling minimal window size
  8.  
  9.     Free for all
  10.  
  11.     Initially written by Siemargl, 2016
  12.  
  13.  
  14.     ToDo
  15. */
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <assert.h>
  21. #include "kos32sys.h"
  22. #include "kolibri_gui.h"
  23. #include "kolibri_opendialog.h"
  24. #include "kolibri_libimg.h"
  25.  
  26. char temp_path[4096];
  27. char** sys_path = (char**)0x20; // hack - get path from KOS header. analog argv[0]
  28.  
  29. char*   load_file_inmem(char* fname, int32_t* read_sz); // see below
  30. void* read_folderdata(char* name);
  31. void control_minimal_window_size(int wmin, int hmin);
  32.  
  33. int main(int argc, char **argv)
  34. {
  35.     /* Load all libraries, initialize global tables like system color table and
  36.     operations table. kolibri_gui_init() will EXIT with mcall -1 if it fails
  37.     to do it's job. This is all you need to call and all libraries and GUI
  38.     elements can be used after a successful call to this function
  39.     */
  40.     kolibri_gui_init();
  41.     kolibri_proclib_init();  // opensave && color dialogs
  42.     kolibri_libimg_init();  // png handling
  43.  
  44.  
  45.     int gui_event = KOLIBRI_EVENT_REDRAW;
  46.     uint32_t pressed_button = 0;
  47. //    uint32_t mouse_button;
  48. //    pos_t   mouse_pos;
  49.     oskey_t keypress;
  50.  
  51.     // load image for buttons
  52.     const int icon_rgb_size = 16*16*3; // every icons 16x16 24bpp
  53.     char *image_data_rgb,
  54.          *image_data,
  55.          *filedata;
  56.     // make full path + argv
  57.     strcpy(temp_path, *sys_path);
  58.     char *pc = strrchr(temp_path, '/');  // this fails if has params with '/' within. use argv[0] instead
  59.     if (pc) pc[1] = 0;
  60.     strcat(temp_path, "reload_16x16_8b.png");
  61. //    debug_board_write_str(temp_path);
  62.  
  63.     int32_t read_bytes;
  64.     filedata = load_file_inmem(temp_path, &read_bytes);
  65.     image_data_rgb = malloc(icon_rgb_size * 3);  // we know size
  66.     // юяЁхфхы хь тшф шчюсЁрцхэш  ш яхЁхтюфшь хую тю тЁхьхээ√щ сєЇхЁ image_data
  67.     image_data = (*img_decode)(filedata, read_bytes, 0);
  68.     // яЁхюсЁрчєхь шчюсЁрцхэшх ъ ЇюЁьрЄє rgb
  69.     (*img_to_rgb2)(image_data, image_data_rgb);
  70.     // єфры хь тЁхьхээ√щ сєЇхЁ image_data
  71.     (*img_destroy)(image_data);
  72.     free(filedata);
  73.  
  74.     // creating GUI using library functions
  75.     kolibri_window *main_window = kolibri_new_window(50, 40, 430, 500, "PictureButton and File dialog demo");
  76.  
  77.     pict_button tbar[3];
  78.     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));
  79.     gui_add_pict_button(main_window, kolibri_pict_button(&tbar[1], X_Y(35, 16), X_Y(10, 16), image_data_rgb, image_data_rgb + icon_rgb_size, image_data_rgb + icon_rgb_size * 2, 24, NULL, 0));
  80.     gui_add_pict_button(main_window, kolibri_pict_button(&tbar[2], X_Y(60, 16), X_Y(10, 16), image_data_rgb, image_data_rgb + icon_rgb_size, image_data_rgb + icon_rgb_size * 2, 24, NULL, 0));
  81.  
  82.     statictext labels[3];  //  tips
  83.     gui_add_statictext(main_window, kolibri_statictext_def(&labels[0], X_Y(5, 28), "Open"));
  84.     gui_add_statictext(main_window, kolibri_statictext_def(&labels[1], X_Y(35, 28), "Save"));
  85.     gui_add_statictext(main_window, kolibri_statictext_def(&labels[2], X_Y(65, 28), "Select Dir & browse"));
  86.  
  87.     open_dialog *dlg_opensave = kolibri_new_open_dialog(OPEN, 10, 10, 420, 320);
  88.     (*OpenDialog_init)(dlg_opensave);
  89.  
  90.     pathview pview;
  91.     gui_add_pathview(main_window, kolibri_pathview(&pview, X_Y(10, 50), 330, 1, 0, dlg_opensave->openfile_path, temp_path, 0, 0)); // black font, no background, font 1
  92.  
  93.     filebrowser brows;
  94.     filedata = load_file_inmem("/rd/1/File managers/z_icons.png", &read_bytes);
  95.     image_data_rgb = malloc(icon_rgb_size * 20);  // we know size
  96.     // юяЁхфхы хь тшф шчюсЁрцхэш  ш яхЁхтюфшь хую тю тЁхьхээ√щ сєЇхЁ image_data
  97.     image_data = (*img_decode)(filedata, read_bytes, 0);
  98.     // яЁхюсЁрчєхь шчюсЁрцхэшх ъ ЇюЁьрЄє rgb
  99.     (*img_to_rgb2)(image_data, image_data_rgb);
  100.     // єфры хь тЁхьхээ√щ сєЇхЁ image_data
  101.     (*img_destroy)(image_data);
  102.     free(filedata);
  103.  
  104.     filedata = load_file_inmem("/rd/1/File managers/icons.ini", &read_bytes);
  105.     gui_add_filebrowser(main_window, kolibri_filebrowser(&brows, X_Y(10, 400), X_Y(80, 300), X_Y(6, 9), X_Y(16, 16), image_data_rgb, NULL, 24,
  106.                                          filedata, filedata + read_bytes,
  107.                                          0x00FF00, 0xbbddff, 0x000000, 0xFFFFFF, 0xFF0000));
  108.  
  109.     // try devices "/" - good
  110.     brows.folder_data = read_folderdata("/rd/1");
  111.     brows.select_panel_counter = 1;
  112.  
  113.     do  /* Start of main activity loop */
  114.     {
  115.         switch(gui_event)
  116.         {
  117.         case KOLIBRI_EVENT_REDRAW:
  118. //???? start red
  119. //brows.marked_file = 1;
  120.             control_minimal_window_size(430, 500);
  121.             brows.all_redraw = 1;
  122.             kolibri_handle_event_redraw(main_window);
  123.             brows.all_redraw = 0;
  124.             break;
  125.         case KOLIBRI_EVENT_NONE:
  126.                         break;
  127.         case KOLIBRI_EVENT_KEY:
  128.             keypress = get_key();
  129.             kolibri_handle_event_key(main_window);
  130.                         break;
  131.         case KOLIBRI_EVENT_BUTTON:
  132.             pressed_button = get_os_button();
  133.             switch (pressed_button)
  134.             {
  135.               case BTN_QUIT:
  136.                 return 0;
  137.                 break;
  138.             }
  139.             break;
  140.         case KOLIBRI_EVENT_MOUSE:
  141. //            mouse_pos = get_mouse_pos(POS_WINDOW); // window relative
  142. //            mouse_button = get_mouse_eventstate();
  143. //brows.all_redraw = 1;
  144.             kolibri_handle_event_mouse(main_window);
  145.  
  146.  
  147.             if (brows.mouse_keys_delta == 3)  // double clicked in browser
  148.             {
  149.                 debug_board_printf("mouse_keys_delta == 3, name %s\n", brows.selected_BDVK_adress->fname);
  150.                 brows.mouse_keys_delta = 0;
  151.             }
  152.  
  153.             if(tbar[0].click)  // open
  154.             {
  155.                 tbar[0].click = 0;
  156.                 dlg_opensave->mode = OPEN;
  157.                 (*OpenDialog_start)(dlg_opensave);
  158.                 //debug_board_printf("status == %d, buf = %s\n", dlg_opensave->status, dlg_opensave->openfile_path);
  159.                 if (dlg_opensave->status != 2 && dlg_opensave->status != 0) // fail or cancel
  160.                 {
  161.                     (*path_show_prepare)(&pview);
  162.                     (*path_show_draw)(&pview);
  163.                 }
  164.             }
  165.             if(tbar[1].click)  // save
  166.             {
  167.                 tbar[1].click = 0;
  168.                 dlg_opensave->mode = SAVE;
  169.                 (*OpenDialog_start)(dlg_opensave);
  170.                 if (dlg_opensave->status != 2 && dlg_opensave->status != 0) // fail or cancel
  171.                     (*path_show_prepare)(&pview);
  172.  
  173.                 // just calling line below draws incomplete
  174.                 // kolibri_handle_event_redraw(main_window);
  175.             }
  176.             if(tbar[2].click)  // select
  177.             {
  178.                 tbar[2].click = 0;
  179.                 dlg_opensave->mode = SELECT;
  180.                 (*OpenDialog_start)(dlg_opensave);
  181.                 if (dlg_opensave->status != 2 && dlg_opensave->status != 0) // fail or cancel
  182.                 {
  183.                     (*path_show_prepare)(&pview);
  184.                     free(brows.folder_data);
  185.                     brows.folder_data = read_folderdata(dlg_opensave->openfile_path);
  186.                 }
  187.                 // we may redraw here, or just wait next redraw event
  188.                 brows.all_redraw = 1;
  189.                 kolibri_handle_event_redraw(main_window);
  190.                 brows.all_redraw = 0;
  191.             }
  192.  
  193.             break;
  194.         }
  195.  
  196.         gui_event = get_os_event();
  197.     } while(1) ; /* End of main activity loop */
  198.  
  199.   return 0;
  200. }
  201.  
  202.  
  203. char*   load_file_inmem(char* fname, int32_t* read_sz)
  204. {
  205.     FILE *f = fopen(fname, "rb");
  206.     if (!f) {
  207.         debug_board_printf("Can't open file: %s", fname);
  208.         exit(1);
  209.     }
  210.     if (fseek(f, 0, SEEK_END)) {
  211.         debug_board_printf("Can't SEEK_END file: %s", fname);
  212.         exit(1);
  213.     }
  214.     int filesize = ftell(f);
  215.     rewind(f);
  216.     char* fdata = malloc(filesize);
  217.     if(!fdata) {
  218.         debug_board_printf("No memory for file %s", fname);
  219.         exit(1);
  220.     }
  221.     *read_sz = fread(fdata, 1, filesize, f);
  222.     if (ferror(f)) {
  223.         debug_board_printf("Error reading file %s", fname);
  224.         exit(1);
  225.     }
  226.     fclose(f);
  227.  
  228.     return fdata;
  229. }
  230.  
  231. void* read_folderdata(char* name)
  232. {
  233.     struct fs_dirinfo di;
  234.     struct fs_dirheader dhead;
  235.     assert(sizeof di == 25);
  236.     memset(&di, 0, sizeof di);
  237.     di.ppath = name;
  238.     di.retval = (uint32_t)&dhead;
  239.     int rc = sf_file(1, &di);  // read dir size
  240.     if(rc) {
  241.         debug_board_printf("Error reading dir size %s", name);
  242.         exit(1);
  243.     }
  244.     di.size = dhead.totl_blocks;
  245.  
  246.     char *retdir = malloc(sizeof dhead + dhead.totl_blocks * sizeof(struct fsBDFE));
  247.     if(!retdir) {
  248.         debug_board_printf("No memory for dir %s", name);
  249.         exit(1);
  250.     }
  251.     di.retval = (uint32_t)retdir;
  252.     rc = sf_file(1, &di);  // read dir size
  253.     if(rc) {
  254.         debug_board_printf("Error 2 reading dir size %s", name);
  255.         exit(1);
  256.     }
  257.  
  258.     debug_board_printf("Loaded dir [%s] etnries %d,\n first file [%s]\n", name, ((struct fs_dirheader*)(retdir))->curn_blocks, ((struct fsBDFE*)(retdir+32))->fname);
  259.  
  260.     return retdir;
  261. }
  262.  
  263.  
  264.  
  265. void control_minimal_window_size(int wmin, int hmin)
  266. {
  267.     char pinfo[1024];
  268.     get_proc_info(pinfo);
  269.  
  270.     int win_hight = *(int*)(pinfo + 46),
  271.         win_width = *(int*)(pinfo + 42);
  272.     char win_status = pinfo[70];
  273.  
  274.     if (win_status & 7) return;  // maximized, minimized or titlebar mode
  275.  
  276.     if (win_width < wmin)
  277.         __asm__ __volatile__("int $0x40" ::"a"(67), "b"(-1), "c"(-1), "d"(wmin), "S"(-1));  // SF_CHANGE_WINDOW x,y,w,h
  278.     if (win_hight < hmin)
  279.         __asm__ __volatile__("int $0x40" ::"a"(67), "b"(-1), "c"(-1), "d"(-1), "S"(hmin));  // x,y,w,h
  280.  
  281. }
  282.  
  283.  
  284.