files
Table/api.md
Mikhail Frolov b3981d174a Table: All editor code files have been added from the flash drive.
The start date of development is September 12, 2024.
2025-03-30 22:56:32 +05:00

20 KiB
Raw Blame History

Экспорты модулей

Обязательные экспорты

    ### Инициализация модуля
    Для распознования библиотеки как модуля, она должна экспортировать функцияю "table_api_init", в которую будет передаваться таблица импорта функция программы и параметры из файла конфигураци.
    
    ```C
    uint32_t table_api_init(IMPORT_DATA* list_functions, char* cmdline);
    ```
    
    ### Завершение работы модуля
    При завершении работы программы, она должна вызвать у каждого модуля функцию "table_api_exit" для сохранения результата работы этого модуля. Программа завершит исполнение только когда все модули вернут управление 

из этой функции.

    ```C
    void table_api_exit(uint32_t pdata);
    ```
    
    ### Передача таблицы экспорта
    
    
    ```C
    void* table_api_export(uint32_t pdata);
    ```

Экспорты для модулей форматов файлов

    table_DOM* table_api_file_open(char* path, uint32_t pdata);

    uint32_t table_api_file_save(table_DOM* src, char* path, uint32_t pdata);

Экспорты для модулей расширенных формул

    void* table_api_formulas_list(uint32_t pdata);

Экспорты для модулей интерфейса

Импорты для модулей

Функции работы с табличным документом

    table_DOM* create_table_dom();
    
    void destruct_table_dom(table_DOM* ptr);
    
    ### Работа с страницами документа
    
            uint32_t add_page_table_dom(table_DOM* ptr, char* name, uint32_t length);
            // return index page or -1 for error
    
            uint32_t del_page_table_dom(table_DOM* ptr, uint32_t index_page);

            uint32_t get_count_page_table_dom(table_DOM* ptr);
            // return max index. min index=1, index++
    
            uint32_t get_name_page_table_dom(table_DOM* ptr, uint32_t index_page);
            // return index page or -1 for error

            uint32_t rename_page_table_dom(table_DOM* ptr, uint32_t index_page, char* name, uint32_t length);
    
            table_area_dom* get_area_table_dom(table_DOM* ptr, uint32_t index_page);
    

    ### Работа с табличной частью страницы
    
            table_area_dom* create_table_area(table_DOM* ptr);
    
            void destruct_table_area(table_area_dom* ptr);
    
            uint32_t set_cell(table_area_dom* ptr, uint32_t row, uint32_t col, char* str, uint32_t length);
    
            char* get_cell(table_area_dom* ptr, uint32_t row, uint32_t col);
    
            void* get_result_cell(table_area_dom* ptr, uint32_t row, uint32_t col);
    
    
    
    ### Работа с оформлением табличной части
    
    Оформление ячеек(или групп ячеек) хранится отдельно от содержимого ячейки. 
    
    
    Для установки границ ячейки нужно установить необходимые биты в структуре. Каждый из 4 битов соответствует линии пикселей,
    младший это самая нижняя или самая правая линия, старший бит это самая верхняя или самая левая линия. 
    
    Значение по умолчанию можно установить и получить по индексу ноль.
    
    В зависимости от применения используемые поля могут отличаться. При применении к строке(0,2:23-1) не используется поле width.
    При применении к столбцу не используется поле height.
    
    Граница применяется к группе ячеек
    
            typedef struct {
                    uint16_t width;
                    uint16_t height;
                    rgba bg_color;
                    rgba text_color;
                    uint16_t border_type; //bits 0-3 left, 4-7 right, 8-11 top, 12-15 bottom
                                          // bits description:
                                          // 0000 - default full line 
                                          // 0001 - штриховка, частая
                                          // 0010 - штрифовка, средняя
                                          // 0011 - штриховка, редкая
                                          // 0100 - углы
                    uint8_t border_l_r; // bits 0-3 - border left, bits 4-7 - border right 
                    uint8_t border_t_b; // bits 0-3 - border top, bits 4-7 - border bottom 
            }table_appearance;
    
            uint32_t add_appearance_table(table_appearance* buff);
            // return index, -1 - error
            
            uint32_t del_appearance_table(uint32_t index);
            // return status
            
            uint32_t update_appearance_table(table_appearance* buff, uint32_t index);
            // return status
            
            uint32_t get_appearance_table(table_appearance* buff);
            // return status
            
            uint32_t set_appearance_cell_area_dom(table_area_dom* ptr, uint32_t row, uint32_t col, table_appearance* appearance);
            // return status
    
            uint32_t get_appearance_cell_area_dom(table_area_dom* ptr, uint32_t row, uint32_t col);
            // return index, -1 - error
            
    
    ### Работа с встраиваемыми объектами 

Функции работы с построителем графика

Функции работы с печатью табличного документа

    ### Выбор принтера
    
    ### Выбор параметров принтера
    
    ### Печать документа

Функции работы с интерфейсом

    Так как программа имеет возможность использования модулей, модули интерфейса просто необходимы. Как пример использования модулей интерфейса - программа учёта.
    Хоть учёт можно вести в табличном редакторе и без дополнительных модулей, возможность автоматизации некоторых действий и более удобный интерфейс для этого 
    упростит множество операций, таких как добавления нового элемента справочника товаров или нового документа расходов и приходов.
    
    ### Работа с параметрами окна(заголовок, размер, цвет элементов, ...)
    
    ```C
    typedef struct {
            uint16_t min_height;
            uint16_t min_width;
            uint16_t max_height;
            uint16_t max_width;
            char* caption; // UTF-8
            //SC* colors;
            
            // work area
            uint16_t wa_pos_x;
            uint16_t wa_pos_y;
            uint16_t wa_width;
            uint16_t wa_height;
            // 
            button_panel* tool_bar;
            menu_panel* menu;
            tab_panel* tabs;
            
    }interface_data;
    ```
    
    ### Работа с рабочей областью
    
            Относительно рабочей области можно создать некоторое кол-во объектов, помогающих в организации интерфейса.
            
            
            typedef struct {
                    
            }work_area_params;
            
            work_area_params* __stdcall get_work_area_params();
            
            
            #### Встроенные кнопки
            
            Кнопки: в них можно задать текст и иконку к тексту(или за место него) Что текст что иконка всегда выравниавются по центру.
            ```C
            typedef struct {
                    uint16_t pos_x;
                    uint16_t pos_y;
                    uint16_t width;
                    uint16_t height;
                    rgba color;
                    pgba* icon; // 18x18 pixel
                    char* text;
                    uint32_t callback_data;
                    void* button_click; //void __stdcall button_click(uint32_t callback_data,uint8_t mouse_key);
            }work_button;
            
            uint32_t __stdcall create_button(work_button* new_button);
            // return handle or zero for error
            void __stdcall delete_button(uint32_t handle);
            
            ```
            TODO

            #### Table
            
    ### Работа с панелью функций (верхнаяя панель с иконками)
    
            Работа с панелью функций сводится к получению события нажатия на кнопку.
            
            select_button указывает на выделенную как вкладку кнопку, если установлен флаг selected. 
            
            Флаг selected устанавливается автоматически(xor пердыдущего состояния, если select_button не изменился)
            
            У кнопки можно настроить флаги отображения, например использовать режим вкладки или просто кнопка,
            рисовать рамку окна или нет, 

            ```C
            typedef struct {
                    uint32_t flags; // 0bBX X : 0=not tab mode 1=tab mode
                                    //      B : 0=draw button border 1=not draw border
                                    // 
                    pgba* icon; // 18x18 pixel
                    uint32_t callback_data;
                    void* button_click; //void __stdcall button_click(uint32_t callback_data,uint8_t mouse_key);
            }button_item;
    
            typedef struct {
                    uint8_t flags; // 0bSV  S : 1=selected 0 - not selected
                                   //       V : 1=visible 0 - unvisible 
                    uint8_t count_left;
                    uint8_t count_right;
                    uint8_t select_button; //index 
                    button_item [] buttons;
            }button_panel;
    
    
            void __stdcall update_button_panel(button_panel* ptr);
    
            button_panel* __stdcall get_button_panel();
            ```
    
    ### Работа с меню выбора функции(небольшой список слева с кнопочками, для выбора содержимого рабочей области)
    
            Работа с этим меню схожа с работой над остальными панелями. Модуль должен предоставить программе структуру содержащую описание кнопок интерфейса.
            
            Так как я ленивый и считаю что интерфейс должен быть попроще, то никакой прокрутки нету, так что много кнопок размещать не надо.
            
            Из предыдущего тезиса также вытекает отсутствие возможности создания кастомного такого поля. Ну нельзя будет добавить в панель строку поиска 
            или там иерархическую структуру, это же не особо то и нужно.
            
            Если имеются кнопки в режиме вкладки, то фокус устанавливается на первую попавшуюся или же на выбранную при обновлениии структуры.
            При нажатии на кнопку без режима вкладки выбранный элемент не переключается 
            
            Если нажата кнопка в режиме вкладки, то фокус меняется на неё. Отключить фокус невозможно, разве что только использовать обычные кнопки.
            
            ```C
            typedef struct {
                    uint16_t flags; // 0bBX X : 0=not tab mode 1=tab mode
                                    //      B : 0=draw button border 1=not draw border
                                    // 
                    uint16_t height; // 0=default
                    pgba* icon; // 18x18 pixel
                    char* text;
                    uint32_t callback_data;
                    void* item_click; //void __stdcall item_click(uint32_t callback_data,uint8_t mouse_key);
            }menu_item;
    
            typedef struct {
                    uint8_t flags; // 0bV  V : 1=visible 0 - unvisible 
                    uint8_t count_item;
                    uint8_t selected_button; //index 
                    menu_item [] buttons; 
            }menu_panel;        
    
            void __stdcall update_menu_panel(menu_panel* ptr);
    
            menu_panel* __stdcall get_menu_panel();
            ```
            
    ### Работа с панелью вкладок
            
            Работа с панелью вкладок простая и не затейливая: Пользователь нажимает на вкладку - код получает вызов callback функции.
            Поле selected_tab заполнается автоматически.
            
            Вызовв функции update_tab_panel приводит к перерисовке области вкладок (и удалению или добавлению нужных системных кнопок).
            При этом, если selected_tab выходит за границы(больше или равно count_tab), то selected_tab = 0.
            
            
            typedef struct {
                    rgba* icon; //18x18 or 12x12
                    char* text;
                    uint32_t callback_data;
                    void* tab_click; //void __stdcall tab_click(uint32_t callback_data,uint8_t mouse_key);
            }tab_item;
    
            typedef struct {
                    uint16_t flags; // 0bV  V : 1=visible 0 - unvisible 
                    uint8_t count_tab;
                    uint8_t selected_tab; //index 
                    tab_item [] buttons;
            }tab_panel; 
    
            void __stdcall update_tab_panel(tab_panel* ptr);
    
            tab_panel* __stdcall get_tab_panel();
    
    
    


    ### Вид интерфеййса 
+-----------------------------------------------------------------------------+
|  Table 1.2                                                          | _ | x |
|-----------------------------------------------------------------------------+
||[  ]\ [  ]  [  ]  [  ]             Панель функций                      [  ] |
||[__] \[__]  [__]  [__]                                                 [__] |
||---------------------------------------------------------------------------+|
||                                                                           ||
||                                                                           ||
||                                                                           ||
||                           Рабочая область                                 ||
||                                                                           ||
||                                                                           ||
||                                                                           ||
||                                                                           ||
||                                                                           ||
||                                                                           ||
||                                                                           ||
||                                                                           ||
||                                                                           ||
||___________________________________________________________________________||
||____________/+/                                                             | <- Панель вкладок
+-----------------------------------------------------------------------------+


+-----------------------------------------------------------------------------+
|  Table 1.2                                                          | _ | x |
|-----------------------------------------------------------------------------+
||[  ]\ [  ]  [  ]  [  ]             Панель функций                      [  ] |
||[__] \[__]  [__]  [__]                                                 [__] |
||---------------------------------------------------------------------------+|
||                |                                                          ||
||                |                                                          ||
||                |                                                          ||
||                |          Рабочая область                                 ||
||                |                                                          ||
||                |                                                          ||
||                |                                                          ||
||     меню       |                                                          ||
||    выбора      |                                                          ||
||                |                                                          ||
||                |                                                          ||
||                |                                                          ||
||                |                                                          ||
||________________|__________________________________________________________||
+-----------------------------------------------------------------------------+