# OBSAH SOUBORU:
# - logika GUI
# - hlavni cyklus prevodu
# - spolecne vlastnosti

from openpyxl import Workbook, load_workbook
from openpyxl.cell import Cell
from openpyxl.worksheet.worksheet import Worksheet
from openpyxl.worksheet.table import Table, TableStyleInfo
import math
import timeit
import re
import traceback

import colors
import legend_entries
import settings
from classes import CCell, CRow, CCol, CCellDO
from enums import EColor, EFontSize, EConvertedState, EHAlign, EVAlign, EFontFlags, EMergedCell, EBorderStyle, EBorder, \
    ELtxTableType
import dataGet
import toLatex
import utils
import table

from tkinter import Tk
from tkinter.filedialog import askopenfilename

import sys
from glfw import swap_buffers, init, poll_events, get_framebuffer_size, CONTEXT_VERSION_MINOR, window_hint, KEY_Q, \
    CONTEXT_VERSION_MAJOR, OPENGL_CORE_PROFILE, make_context_current, OPENGL_PROFILE, OPENGL_FORWARD_COMPAT, \
    create_window, window_should_close, terminate
from OpenGL.GL import GL_COLOR_BUFFER_BIT, GL_TRUE, glClearColor, glClear
import imgui
from imgui.integrations.glfw import GlfwRenderer

# tohle bohuzel musi byt globalni promenne. je to lepsi nez muset pokazde posilat a vracet 65654 parametru do imgui
gui_radios = {'convert_area': False, 'convert_table': True, 'convert_tables_all': False,
              'legend_top': False, 'legend_inside': True, 'data_only': False}
gui_lists = {'lists': 0, 'tables': 0, 'profiles': 1, 'doctype': 0}
gui_menus = {'basic_settings': False, 'cheat_sheet': False, 'faq_excel_theme': False, 'faq_list_index': False,
             'faq_install_tabularray': False, 'faq_custom_head': False, 'faq_ugly_colors': False,
             'faq_long_table': False, 'faq_bad_register_code': False, 'faq_hyphen': False}
gui_headers = {'row': False, 'rows': False, 'col': False, 'cols': False, 'cell': False, 'hline': False,
               'hlines': False, 'misc': False, 'params': False, 'colspec': False, 'rowspec': False}

bs_gui = Tk()
minx, miny, maxx, maxy = 0, 0, 0, 0
convert_range: str = ''
file_path = None
wb: Workbook = None
ws: Worksheet = None
output_str: str = ''
cur_tooltip: str = ''
new_profile_name: str = 'novy_profil'
cur_profile_name: str = ''
output_pos: int = math.floor(1000 * settings.gui.scale)
output_ht: int = math.floor(800 * settings.gui.scale)
force_thirds: bool = True
window_w, window_h = math.floor(1330), math.floor(750)
sheet_list = []
table_list = []
change_file: bool = False
change_theme: bool = False
profiles = []


def render_frame(impl, window, font, big_font, mono_font):
    global window_w, window_h

    poll_events()
    window_w, window_h = get_framebuffer_size(window)
    impl.process_inputs()
    imgui.new_frame()

    glClearColor(0.1, 0.1, 0.1, 1)
    glClear(GL_COLOR_BUFFER_BIT)

    if font is not None:
        imgui.push_font(font)

    frame_commands(big_font, mono_font)

    if font is not None:
        imgui.pop_font()

    imgui.render()
    impl.render(imgui.get_draw_data())
    swap_buffers(window)

    return wb, ws, file_path


def impl_glfw_init():
    window_name = "Excel2Tabularray"
    global window_w, window_h

    if not init():
        print("Could not initialize OpenGL context")
        sys.exit(1)

    window_hint(CONTEXT_VERSION_MAJOR, 3)
    window_hint(CONTEXT_VERSION_MINOR, 3)
    window_hint(OPENGL_PROFILE, OPENGL_CORE_PROFILE)
    window_hint(OPENGL_FORWARD_COMPAT, GL_TRUE)

    window_w = math.ceil(window_w * settings.gui.scale)
    window_h = math.ceil(window_h * settings.gui.scale)

    window = create_window(int(window_w), int(window_h), window_name, None, None)
    make_context_current(window)

    if not window:
        terminate()
        print("Could not initialize Window")
        sys.exit(1)

    return window


def frame_commands(big_font, mono_font):
    global wb, ws, window_h, window_w, output_ht, output_str, cur_tooltip, file_path, output_pos, gui_menus, \
        gui_radios, gui_lists, gui_headers, new_profile_name, convert_range, force_thirds, \
        sheet_list, table_list, change_file, profiles, cur_profile_name, change_theme

    if settings.gui.dark_mode:
        imgui.push_style_color(imgui.COLOR_WINDOW_BACKGROUND, 0.13, 0.13, 0.15, 1.00)
        imgui.push_style_color(imgui.COLOR_POPUP_BACKGROUND, 0.14, 0.15, 0.16, 1.00)
        imgui.push_style_color(imgui.COLOR_BORDER, 0.40, 0.43, 0.48, 0.22)
        imgui.push_style_color(imgui.COLOR_FRAME_BACKGROUND, 0.21, 0.22, 0.25, 0.57)
        imgui.push_style_color(imgui.COLOR_SCROLLBAR_BACKGROUND, 0.13, 0.13, 0.15, 1.00)
        imgui.push_style_color(imgui.COLOR_SEPARATOR, 0.41, 0.43, 0.48, 0.18)
    else:
        imgui.push_style_color(imgui.COLOR_TEXT, 0.11, 0.11, 0.12, 1.00)
        imgui.push_style_color(imgui.COLOR_WINDOW_BACKGROUND, 1.00, 1.00, 1.00, 0.96)
        imgui.push_style_color(imgui.COLOR_CHILD_BACKGROUND, 1.00, 1.00, 1.00, 0.32)
        imgui.push_style_color(imgui.COLOR_POPUP_BACKGROUND, 1.00, 1.00, 1.00, 0.94)
        imgui.push_style_color(imgui.COLOR_BORDER, 0.73, 0.73, 0.73, 0.50)
        imgui.push_style_color(imgui.COLOR_FRAME_BACKGROUND, 0.71, 0.80, 0.94, 0.32)
        imgui.push_style_color(imgui.COLOR_TITLE_BACKGROUND, 1.00, 1.00, 1.00, 1.00)
        imgui.push_style_color(imgui.COLOR_TITLE_BACKGROUND_ACTIVE, 0.77, 0.87, 1.00, 1.00)
        imgui.push_style_color(imgui.COLOR_TITLE_BACKGROUND_COLLAPSED, 0.00, 0.00, 0.00, 0.40)
        imgui.push_style_color(imgui.COLOR_MENUBAR_BACKGROUND, 1.00, 1.00, 1.00, 1.00)
        imgui.push_style_color(imgui.COLOR_BUTTON, 0.42, 0.69, 1.00, 0.53)
        imgui.push_style_color(imgui.COLOR_SEPARATOR, 0.69, 0.69, 0.69, 0.50)
        imgui.push_style_color(imgui.COLOR_SCROLLBAR_BACKGROUND, 1.00, 1.00, 1.00, 0.00)
        imgui.push_style_color(imgui.COLOR_SCROLLBAR_GRAB, 0.64, 0.64, 0.64, 0.39)
        imgui.push_style_color(imgui.COLOR_SCROLLBAR_GRAB_HOVERED, 0.41, 0.41, 0.41, 0.54)

    imgui.push_style_var(imgui.STYLE_SCROLLBAR_SIZE, 14 * settings.gui.scale)
    imgui.push_style_var(imgui.STYLE_WINDOW_PADDING, imgui.Vec2(14 * settings.gui.scale, 14 * settings.gui.scale))
    imgui.push_style_var(imgui.STYLE_FRAME_PADDING, imgui.Vec2(13 * settings.gui.scale, 2 * settings.gui.scale))
    imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 0)
    imgui.push_style_var(imgui.STYLE_WINDOW_ROUNDING, 0)
    imgui.push_style_var(imgui.STYLE_CHILD_ROUNDING, 3 * settings.gui.scale)
    imgui.push_style_var(imgui.STYLE_CHILD_BORDERSIZE, 1 * settings.gui.scale)
    imgui.push_style_var(imgui.STYLE_FRAME_ROUNDING, 3 * settings.gui.scale)
    imgui.push_style_var(imgui.STYLE_ITEM_SPACING, imgui.Vec2(20 * settings.gui.scale, 4 * settings.gui.scale))

    if settings.gui.dark_mode:
        glClearColor(0.1, 0.1, 0.1, 0.5)
    else:
        glClearColor(0.9, 0.9, 0.9, 0.9)

    glClear(GL_COLOR_BUFFER_BIT)

    io = imgui.get_io()

    if io.key_ctrl and io.keys_down[KEY_Q]:
        sys.exit(0)

    imgui.set_next_window_position(0, 0)

    # -------------------- ZACATEK HLAVNIHO OKNA -----------------------------
    imgui.set_next_window_size(window_w * 0.6, window_h)
    imgui.begin('excel2tabularray', False,
                imgui.WINDOW_NO_TITLE_BAR | imgui.WINDOW_HORIZONTAL_SCROLLING_BAR
                | imgui.WINDOW_NO_SAVED_SETTINGS | imgui.WINDOW_MENU_BAR | imgui.WINDOW_NO_MOVE
                | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_BRING_TO_FRONT_ON_FOCUS)

    # gui_menus = {'basic_settings': False, 'cheat_sheet': False, 'faq_excel_theme': False,
    #             'faq_intall_tabularray': False, 'faq_custom_head': False}

    if imgui.begin_main_menu_bar():
        if imgui.begin_menu('Další', True):
            imgui.push_item_width(100*settings.gui.scale)
            imgui.push_style_var(imgui.STYLE_FRAME_PADDING, imgui.Vec2(0, 0))
            imgui.text('Měřítko GUI')
            changed, settings.gui.scale_int = imgui.input_int('', settings.gui.scale_int, 25, 25)
            imgui.pop_style_var(1)
            imgui.pop_item_width()

            if changed:
                if 74 < settings.gui.scale_int < 251:
                    settings.gui.scale = settings.gui.scale_int / 100.0
                else:
                    if settings.gui.scale_int < 75:
                        settings.gui.scale_int = 75
                    if settings.gui.scale_int > 250:
                        settings.gui.scale_int = 250

                    settings.gui.scale = settings.gui.scale_int / 100.0

                settings.log_str += '[VZHLED] Změna měřítka písma se provede až při dalším spuštění programu.\n'
                settings.save('(posledni).ini')

            change_theme, _ = imgui.menu_item('Tmavý režim', None, settings.gui.dark_mode)

            if change_theme:
                a = 2

            imgui.spacing()
            imgui.separator()
            imgui.spacing()

            _, gui_menus['cheat_sheet'] = imgui.menu_item('Cheat sheet', None, False, True)

            if imgui.begin_menu('FAQ', True):
                _, gui_menus['faq_install_tabularray'] = imgui.menu_item('Potřebné packages.',
                                                                         None, False, True)
                _, gui_menus['faq_list_index'] = imgui.menu_item('Během převodu nastala výjimka',
                                                                 None, False, True)
                _, gui_menus['faq_ugly_colors'] = imgui.menu_item('Barvy jsou vysoce nepřesné.',
                                                                  None, False, True)
                _, gui_menus['faq_excel_theme'] = imgui.menu_item('Co je Excel motiv vhodný pro ninecolors?',
                                                                  None, False, True)
                _, gui_menus['faq_custom_head'] = imgui.menu_item('K čemu je vlastní hlavička?',
                                                                  None, False, True)
                _, gui_menus['faq_hyphen'] = imgui.menu_item('Výstup se nesprávně zobrazuje v dokumentu.',
                                                             None, False, True)
                imgui.end_menu()

            imgui.end_menu()

        imgui.text_disabled(cur_tooltip)
        imgui.end_main_menu_bar()

    if gui_menus['cheat_sheet']:
        imgui.set_next_window_size(640 * settings.gui.scale, 600 * settings.gui.scale, imgui.ONCE)
        imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 1 * settings.gui.scale)
        if settings.gui.dark_mode:
            imgui.push_style_color(imgui.COLOR_BORDER, 1, 1, 1, 0.7)
            imgui.push_style_color(imgui.COLOR_TEXT, 1, 1, 1, 0.9)
            imgui.push_style_color(imgui.COLOR_HEADER, 0.21, 0.22, 0.25, 0)
        else:
            imgui.push_style_color(imgui.COLOR_BORDER, 0, 0, 0, 0.7)
            imgui.push_style_color(imgui.COLOR_TEXT, 0.11, 0.11, 0.12, 0.9)
            imgui.push_style_color(imgui.COLOR_HEADER, 0.71, 0.80, 0.94, 0.5)

        _, gui_menus['cheat_sheet'] = imgui.begin('Cheat sheet', True)
        imgui.text_wrapped('Pořadí jednotlivých parametrů nemusíte dodržovat, stejně tak '
                           'tyto parametry určitě nemusíte psát všechny. Naopak, je nutno dodžet všechny závorky, '
                           'lomítka, čárky, \'=\' a zpravidla i to vlevo od \'=\'')

        imgui.text_wrapped('Pozn: Jdou-li některé formáty, řekněme, proti sobě (např. nastavím barvu textu všech '
                           'sudých sloupců a jinou barvu lichých řádků), pak VŽDY zvítězí ten formát, který máte '
                           'definovaný později.')

        imgui.text('Dokumentace tabularray:')
        imgui.push_style_color(imgui.COLOR_SCROLLBAR_BACKGROUND, 0, 0, 0, 0)
        imgui.push_style_color(imgui.COLOR_SCROLLBAR_GRAB, 0, 0, 0, 0)
        imgui.input_text_multiline('##tabularray', r'https://mirrors.nic.cz/tex-archive/macros/latex/contrib/tabularray'
                                   r'/tabularray.pdf', 128, -1, 21 * settings.gui.scale, imgui.INPUT_TEXT_AUTO_SELECT_ALL)
        imgui.spacing()
        imgui.text('Dokumentace ninecolors:')
        imgui.input_text_multiline('##ninecolors', r'https://mirrors.nic.cz/tex-archive/macros/latex/contrib/ninecolor'
                                   r's/ninecolors.pdf', 128, -1, 21 * settings.gui.scale, imgui.INPUT_TEXT_AUTO_SELECT_ALL)

        imgui.spacing()
        imgui.spacing()

        gui_headers['colspec'], _ = imgui.collapsing_header('Zarovnání a šířky všech sloupců')
        if gui_headers['colspec']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_colspec', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('colspec = {typ_sloupce typ_sloupce ... typ_sloupce},')
            imgui.end_child()

            imgui.spacing()
            imgui.text('nebo (vč. svislých okrajů)')
            imgui.spacing()

            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_colspec1', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('colspec = {typ_sloupce | typ_sloupce | ... | typ_sloupce},')
            imgui.end_child()

            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklady + vysvětlení:')
            imgui.input_text_multiline('##csht_colspec_ex', r'colspec = {l r X[5, c] X[2, c] X[3, c] Q[f, r, 3cm]},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Pro tabulku, která má celkem 6 sloupců (je nutno vždy uvést zarovnání všech sloupců) '
                               'nastaví text prvního sloupce jako zarovnaný vlevo a text druhého jako zarovnaný vpravo.'
                               'Třetí, čtrvtý a pátý sloupec budou mít šířku v poměru 5:2:3 a text zarovnaný na střed.'
                               'Poslední sloupec bude mít text zarovnaný nahoru a na střed a pevnou šířku 3 cm. Tabulka'
                               'zabere celou šířku strany.')

            imgui.spacing()
            imgui.spacing()

            imgui.input_text_multiline('##csht_colspec_ex1', r'colspec = { X[2, f] X[3] X[5.5, r] },',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Pro tabulku, která má celkem 3 sloupce nastaví jejich šířky tak, aby byly v poměru '
                               '2:3:5.5 a zabraly celou šířku strany. Text prvního sloupce bude zarovnán nahoru a text'
                               ' posledního sloupce bude zarovnán vpravo.')

            imgui.spacing()
            imgui.spacing()

            imgui.input_text_multiline('##csht_colspec_ex2', r'colspec = { l | r | l | r},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Pro tabulku, která má celkem 4 sloupce nastaví střídavě zarovnání textu vlevo a vpravo.'
                               'Sloupce budou odděleny SVISLÝM okrajem (okraje budou jen uvnitř tabulky).')

            imgui.spacing()
            imgui.spacing()

        gui_headers['rowspec'], _ = imgui.collapsing_header('Zarovnání a výšky všech řádků')
        if gui_headers['rowspec']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_rowspec', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('rowspec = {typ_sloupce typ_sloupce ... typ_sloupce}')
            imgui.end_child()

            imgui.spacing()
            imgui.text('nebo (vč. horizontálních okrajů)')
            imgui.spacing()

            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_rowspec1', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('rowspec = {typ_sloupce | typ_sloupce | ... | typ_sloupce},')
            imgui.end_child()

            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklady + vysvětlení:')
            imgui.input_text_multiline('##csht_rowspec_ex', r'rowspec = {Q[h, 2em] m f{1cm}},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Pro tabulku, která má celkem 3 řádky (je nutno vždy uvést zarovnání všech řádků) '
                               'nastaví text prvního řádku jako zarovnaný nahoru, text druhého zarovnaný na střed a '
                               'text třetího jako zarovnaný dolů.První řádek má pevnou výšku 2em a třetí řádek '
                               'pevnou výšku 1cm.')

            imgui.spacing()
            imgui.spacing()

            imgui.input_text_multiline('##csht_rowspec_ex1', r'rowspec = {| f | m | f{1cm}|},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Pro tabulku, která má celkem 3 řádky '
                               'nastaví text prvního řádku jako zarovnaný dolů, text druhého zarovnaný na střed a '
                               'text třetího jako zarovnaný dolů. Třetí řádek má pevnou výšku 1cm. Mezi řádky '
                               'i kolem tabulky jsou horizontální okraje.')

            imgui.spacing()
            imgui.spacing()

        gui_headers['row'], _ = imgui.collapsing_header('Formát jednoho nebo více řádků')
        if gui_headers['row']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_row', -60 * settings.gui.scale, 64 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('row{indexy} = {halign, valign, ht={výška}, bg=barva_pozadí,\n'
                               'fg=barva_textu font=\\font_cmds, cmd={\\latex_cmd}},')
            imgui.end_child()
            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklad + vysvětlení:')
            imgui.input_text_multiline('##csht_row_ex', 'row{4} = {c, m, bg=azure3, fg=white,\n'
                                                        r'font=\sfffamily\bfseries\large, cmd={\underline}},',
                                       128, -1, 36 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('U textu čtvertého řádku tabulky nastaví velké, tučné, bezpatkové písmo, '
                               'text buňky podtrhne, zarovná na střed horizontálně i vertikálně a '
                               'změní barvu textu i pozadí. ')

            imgui.spacing()
            imgui.spacing()

        gui_headers['rows'], _ = imgui.collapsing_header('Formát všech řádků')
        if gui_headers['rows']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_rows', -60 * settings.gui.scale, 64 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('rows = {halign, valign, ht={výška}, bg=barva_pozadí,\n'
                               'fg=barva_textu font=\\font_cmds, cmd={\\latex_cmd}},')
            imgui.end_child()
            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklad + vysvětlení:')
            imgui.input_text_multiline('##csht_rows_ex', 'rows = {ht={15pt}, l, m},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Text všech buňek zarovná horizontálně vlevo a vertikálně na střed, '
                               'výšku všech řádků nastaví na 15 pt.')

            imgui.spacing()
            imgui.spacing()

        gui_headers['col'], _ = imgui.collapsing_header('Formát jednoho nebo více sloupců')
        if gui_headers['col']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_col', -60 * settings.gui.scale, 64 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('column{index} = {halign, valign, wd={šířka}, bg=barva_pozadí,\n'
                               'fg=barva_textu font=\\font_cmds, cmd={\\latex_cmd}},')
            imgui.end_child()
            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklad + vysvětlení:')
            imgui.input_text_multiline('##csht_col_ex', r'column{odd} = {r, bg=gray8, font=\itshape},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Sloupce tabulky budou alternovat mezi bílou a světle šedou barvou pozadí (šedě budou'
                               'liché sloupce). Ty, které jsou šedě budou mít zároveň i písmo kurzívou '
                               'zarovnané vpravo')

            imgui.spacing()
            imgui.spacing()

        gui_headers['cols'], _ = imgui.collapsing_header('Formát všech sloupců')
        if gui_headers['cols']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_cols', -60 * settings.gui.scale, 64 * settings.gui.scale, True)
            imgui.text_wrapped('columns = {halign, valign, wd={šířka}, bg=barva_pozadí,'
                               'fg=barva_textu font=\\font_cmds, cmd={\\latex_cmd}},')
            imgui.end_child()

            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklad + vysvětlení:')
            imgui.input_text_multiline('##csht_cols_ex', r'columns = {c, wd={2cm}},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Nastaví pevnou šířku všech sloupců 2cm. Text všech buňek bude zarovnán na střed.')

            imgui.spacing()
            imgui.spacing()

        gui_headers['cell'], _ = imgui.collapsing_header('Formát konkrétních buňek')
        if gui_headers['cell']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)

            imgui.begin_child('##csht_cell', -60 * settings.gui.scale, 72 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('cell{řádek}{sloupec} = {r=počet_řádků, c=počet_sloupců}'
                               '{halign, valign, wd={šířka}, bg=barva_pozadí, '
                               'fg=barva_textu font=\\font_cmds, cmd={\\latex_cmd}},')
            imgui.end_child()

            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklady + vysvětlení:')
            imgui.input_text_multiline('##csht_cell_ex', r'cell{2}{6} = {r=3, c=2}{bg=red8, m, c},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('V šestém sloupci druhého řádku vytvoří sloučenou buňku o velikost 2 sloupců a 3 řádků.'
                               'Tato sloučená buňka bude mít červené pozadí a text zarovnaný na střed vertikálně i'
                               'horizontálně.')
            imgui.spacing()
            imgui.spacing()

            imgui.input_text_multiline('##csht_cell_ex1', r'cell{Z}{Z} = {font\bfseries, r},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Poslední buňku tabulky udělá tučně a text zarovná vpravo. Všimněte si, že svorku'
                               '\'{r=počet_řádků, c=počet_sloupců}\' lze vynechat, pokud nechceme buňky slučovat.')

            imgui.spacing()
            imgui.spacing()

        gui_headers['hline'], _ = imgui.collapsing_header('Jeden nebo více okrajů')
        if gui_headers['hline']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_hline', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('hline{pořadí} = {indexy_sloupců}{typ_okraje, barva, tloušťka}')
            imgui.end_child()
            imgui.set_cursor_pos_x(70 * settings.gui.scale,)
            imgui.begin_child('##csht_vline', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('vline{pořadí} = {indexy_řádků}{typ_okraje, barva, tloušťka}')
            imgui.end_child()

            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklady + vysvětlení:')
            imgui.input_text_multiline('##csht_hline_ex', r'hline{1-2} = {0.7pt},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Nastaví první (tj. vnejší horní) a druhý (tj. spodní prvního řádku) horizontální okraj '
                               'po celé délce tabulky. Okraj bude mít tloušťku 0.7pt a bude plný.')

            imgui.spacing()
            imgui.spacing()

            imgui.input_text_multiline('##csht_vline_ex', r'vline{odd} = {1-3}{azure3, dotted},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Nastaví svislé okraje s lichým pořadím (tj. levé) buněk prvního až '
                               'třetího řádku. Tyto okraje budou tečkované a tmavě modré.')

            imgui.spacing()
            imgui.spacing()

        gui_headers['hlines'], _ = imgui.collapsing_header('Okraje v rámci celé tabulky')
        if gui_headers['hlines']:
            imgui.set_cursor_pos_x(70 * settings.gui.scale)
            imgui.begin_child('##csht_hlines', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('hlines = {indexy_sloupců}{typ_okraje, barva, tloušťka}')
            imgui.end_child()
            imgui.set_cursor_pos_x(70 * settings.gui.scale,)
            imgui.begin_child('##csht_vlines', -60 * settings.gui.scale, 42 * settings.gui.scale, True,
                              imgui.WINDOW_NO_SCROLLBAR | imgui.WINDOW_NO_SCROLL_WITH_MOUSE)
            imgui.text_wrapped('vlines = {indexy_řádků}{typ_okraje, barva, tloušťka}')
            imgui.end_child()

            imgui.spacing()
            imgui.spacing()

            imgui.text('Příklady + vysvětlení:')
            imgui.input_text_multiline('##csht_hlines_ex', r'hlines = {0.7pt},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Všechny buňky budou mít horinzontální okraje (tj. dolní i horní). '
                               'Okraje budou mít tloušťku 0.7pt a budou plné.')

            imgui.spacing()
            imgui.spacing()

            imgui.input_text_multiline('##csht_vlines_ex', r'vlines = {1-3}{azure3, dotted},',
                                       128, -1, 21 * settings.gui.scale,
                                       imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_AUTO_SELECT_ALL)
            imgui.text_wrapped('Nastaví svislé okraje všech buněk prvního až '
                               'třetího řádku (tj. pravé a levé). Tyto okraje budou tečkované a tmavě modré.')

            imgui.spacing()
            imgui.spacing()

        gui_headers['params'], _ = imgui.collapsing_header('Popis parametrů')
        if gui_headers['params']:
            cheat_sheet_table('csht_tbl')

        imgui.pop_style_color(2)
        imgui.end()
        imgui.pop_style_color(3)
        imgui.pop_style_var(1)

    imgui.push_style_var(imgui.STYLE_ALPHA, 0.95)
    if gui_menus['faq_install_tabularray']:
        imgui.set_next_window_size(500 * settings.gui.scale, 300 * settings.gui.scale, imgui.ONCE)
        imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 1 * settings.gui.scale)
        imgui.push_style_color(imgui.COLOR_BORDER, 1, 1, 1, 0.3)
        imgui.push_item_width(-1)
        _, gui_menus['faq_install_tabularray'] = imgui.begin('Instalace', True)
        imgui.text_wrapped('K použití tabulek z tohoto programu ve vašem LaTeX dokumentu jsou nutné package '
                           '\'tabularray\' a \'ninecolors\'. \n\n Ke stažení je naleznete zde: \n')

        imgui.input_text('##tabularraylink', 'https://ctan.org/pkg/tabularray', 32, imgui.INPUT_TEXT_AUTO_SELECT_ALL)
        imgui.input_text('##ninecolorslink', 'https://ctan.org/pkg/ninecolors', 32, imgui.INPUT_TEXT_AUTO_SELECT_ALL)

        imgui.spacing()
        imgui.text_wrapped('Instalaci lze provést například tak, že soubory tabularray.sty a ninecolors.sty nahrajete '
                           'do kořenové složky vašeho dokumentu. Poté stačí do preamble LaTeX dokumentu přidat')

        imgui.input_text('##usepkgtabularray', '\\usepackage{tabularray}', 32, imgui.INPUT_TEXT_AUTO_SELECT_ALL)

        imgui.spacing()
        imgui.text_wrapped('Pro některé funkce převodníku jsou potřebné package \'ulem\' a \'rotating\', '
                           'jejichž instalace je analogická. Používáte-li Overleaf, pak stačí pouze')

        imgui.input_text('##usepkgulem', '\\usepackage{ulem, rotating}', 32, imgui.INPUT_TEXT_AUTO_SELECT_ALL)

        imgui.spacing()
        imgui.text_wrapped('Na nutnost použití těchto dvou vás převodník upozorní v Logu.')
        imgui.end()
        imgui.pop_item_width()
        imgui.pop_style_color(1)
        imgui.pop_style_var(1)

    if gui_menus['faq_list_index']:
        imgui.set_next_window_size(500 * settings.gui.scale, 200 * settings.gui.scale, imgui.ONCE)
        imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 1 * settings.gui.scale)
        imgui.push_style_color(imgui.COLOR_BORDER, 1, 1, 1, 0.7)

        _, gui_menus['faq_list_index'] = imgui.begin('Během převodu nastala výjimka', True)
        imgui.text_wrapped('Výjimky jsou nejčastěji způsobeny špatně zadaným vstupem. Pokud jste si jisti '
                           'správností vstupu, pak existují tyto možnosti jak problém zkusit řešit:')

        imgui.bullet()
        imgui.text_wrapped('Ujistěte se, že ve vstupní oblasti nejsou prázné buňky. Pokud je potřebujete mít prádné, '
                           'vložte do nich mezeru, nebo jakýkoli bílý znak.')

        imgui.bullet()
        imgui.text_wrapped('Pokud Váš vstup obsahuje podmíněné formátování, je možné že se některé z pravidel '
                           'podmíněného formátování doslova rozbilo. Pokud to lze, vytvořte pravidla v celém listu '
                           'znovu. V opačném případě zkuste vypnout \'Podmíněné formátování\' v části \'Převádět\'.')

        imgui.bullet()
        imgui.text_wrapped('Zkuste použít typ převodu \'Jen data\'. V tomto případě ale přijdete o možnost '
                           'automaticky převést formátování buněk.')
        imgui.end()

        imgui.pop_style_color(1)
        imgui.pop_style_var(1)

    if gui_menus['faq_ugly_colors']:
        imgui.set_next_window_size(500 * settings.gui.scale, 200 * settings.gui.scale, imgui.ONCE)
        imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 1 * settings.gui.scale)
        imgui.push_style_color(imgui.COLOR_BORDER, 1, 1, 1, 0.7)

        _, gui_menus['faq_ugly_colors'] = imgui.begin('Nepřesné barvy', True)
        imgui.text_wrapped('Jelikož package tabularray používá k obarvení všeho package ninecolors, je počet barev '
                           'velmi omezen. V Excel dokumentu máte de facto k dispozici barev 16 milionů, zde pouze '
                           '117 (9×13). Během převodu se tedy musí najít nejbližší barva kterou dokážeme zobrazit. '
                           'Velice často je blíže úplně jiný odstín, nebo o stupeň tmavší barva.\n\n'
                           'Tento problém má v současné době 3 možná řešení.\n'
                           '\t- O jednom se dovíte v FAQ > Co je excel motiv vhodný pro ninecolors?\n'
                           '\t- Druhé řešení je ruční úprava výstupu.\n'
                           '\t- A třetí řešení je vytvořit si (ručně) hlavičku tabulky, a převádět pouze data '
                           '(Vstup > Chci převádět > Jen data). O tomto více v FAQ > K čemu je vlastní hlavička?')
        imgui.end()

        imgui.pop_style_color(1)
        imgui.pop_style_var(1)

    if gui_menus['faq_custom_head']:
        imgui.set_next_window_size(500 * settings.gui.scale, 300 * settings.gui.scale, imgui.ONCE)
        imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 1 * settings.gui.scale)
        imgui.push_style_color(imgui.COLOR_BORDER, 1, 1, 1, 0.7)

        _, gui_menus['faq_custom_head'] = imgui.begin('Vlastní hlavička', True)
        imgui.text_wrapped('Vlastní hlavička slouží pro případ, že se vám nechce ve vstupním souboru zadávat styl '
                           'buněk, nebo vás styl buněk uvnitř vstupního souboru nezajímá. Chcete z něj jen data a dát '
                           'jim takový formát, který máte v ostatních tabulkách svých dokumentů.\n\n'
                           'Převodník pak vámi napsaný formát automaticky vloží do hlavičky výstupu, '
                           'čímž dá vaší tabulce požadovaný vzhled.\n\n'
                           'Předpokládá se, že formát celé tabulky zadáte vy a to podle vašich potřeb. Můžete zrecyk'
                           'lovat část předchozího výstupu, napsat si svoji hlavičku, nebo upravit předchozí výstup. '
                           'Také se předpokládá, že formát hlavičky zadáte bez chyb, pokud váháte, určitě se '
                           'podívejte do Cheat sheet.\n\nVše, co do vlastní hlavičky zadáte, se po převodu automaticky '
                           'uloží do profilu \'(poslední)\'. Totéž platí v případě, kdy ukládáte nový profil.')
        imgui.end()

        imgui.pop_style_color(1)
        imgui.pop_style_var(1)

    if gui_menus['faq_excel_theme']:
        imgui.set_next_window_size(500 * settings.gui.scale, 425 * settings.gui.scale, imgui.ONCE)
        imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 1 * settings.gui.scale)
        imgui.push_style_color(imgui.COLOR_BORDER, 1, 1, 1, 0.7)

        _, gui_menus['faq_excel_theme'] = imgui.begin('Excel motiv vhodný pro ninecolors', True)
        imgui.text_wrapped('Excel motiv vhodný pro ninecolors obsahuje právě ty barvy, které ninecolors umí zobrazit '
                           'bez šílených nepřesností. Účelem je minimalizovat rozdíl v barvách, které máte ve '
                           'vstupním souboru oproti barvám které je možno v LaTeX tabulce zobrazit.\n\n'
                           'Jelikož do Excel motivu lze uložit jen 6 odstínů barev o 6 '
                           'světlostech a ninecolors má 13 barev o 9 světlostech, motivů lze vytvořit opravdu mnoho. '
                           'Předpřipravil jsem 4, které si lze stáhnout na odkazu níže, samozřejmě je možné si '
                           'vytvořit vlastní motiv')
        imgui.spacing()
        imgui.spacing()

        imgui.push_item_width(-1)
        imgui.input_text('##usepkgtabularray', r'https://vutbr-my.sharepoint.com/:u:/g/personal/217208_vutbr_cz/'
                                               r'Edxbz3gxvnNJsHs0EN2FOXABHiAaGSkQlpGmALKbf5OkpQ?e=KnODSS', 
                                               128, imgui.INPUT_TEXT_AUTO_SELECT_ALL)

        
        imgui.pop_item_width()
        imgui.spacing()
        imgui.separator()
        imgui.spacing()
        imgui.text_wrapped('Instalace staženého motivu:\nStažený archiv rozbalte do složky\n')

        imgui.push_item_width(-1)
        imgui.input_text('##themepath', r'%appdata%\Microsoft\Templates\DocumentThemes',
                         64, imgui.INPUT_TEXT_AUTO_SELECT_ALL)
        imgui.pop_item_width()

        imgui.text_wrapped('V Excelu na kartě \'Rozložení stránky\''
                           'by se vám po stisknutí tlačítka \'Motivy\' měly nahoře objevit 4 vlastní motivy.'
                           '\nBarvy změníte tak, že si vyberete jeden z nich.')
        
        imgui.spacing()
        imgui.separator()
        imgui.spacing()
        imgui.text_wrapped('Tvorba vlastního motivu:\nV Excelu na kartě Rozložení'
                           ' stránky klikněte na \'Barvy\', kde úplně dole máte možnost \'Přizpůsobit barvy\'. S pomocí'
                           ' výstřižku první strany dokumentace ninecolors si zmeňte barvy označené jako \'Zvýraznění\''
                           ' tak, aby obsahovaly barvy které plánujete ve finální tabulce mít. Doporučuji volit '
                           'světlost 5 v ninecolors. Jiné barvy než \'Zvýraznění\' lze také měnit, ale můžete '
                           'tím něco rozbít.')

        imgui.end()

        imgui.pop_style_color(1)
        imgui.pop_style_var(1)

    if gui_menus['faq_hyphen']:
        imgui.set_next_window_size(500 * settings.gui.scale, 210 * settings.gui.scale, imgui.ONCE)
        imgui.push_style_var(imgui.STYLE_WINDOW_BORDERSIZE, 1 * settings.gui.scale)
        imgui.push_style_color(imgui.COLOR_BORDER, 1, 1, 1, 0.7)

        _, gui_menus['faq_hyphen'] = imgui.begin('Výstup se nesprávně zobrazuje', True)
        imgui.text_wrapped('Může se stát, že po převedení vypadá výstupní řetězec správně, ale tabulka '
                           'zobrazená v dokumentu neodpovídá vstupu. \n'
                           'Zkontrolujte, zda problematické části výstupu nejsou zapsány s '
                           'využitím spojovníků (pomlček, \'-\' ) a pokud ano, přidejte do preambule')
        imgui.spacing()
        imgui.spacing()

        imgui.push_item_width(-1)
        imgui.input_text('##hyphnefix', '\\AtBeginDocument{\\shorthandoff{-}}', 64, imgui.INPUT_TEXT_AUTO_SELECT_ALL)

        imgui.pop_item_width()
        imgui.spacing()
        imgui.spacing()
        imgui.text_wrapped('Tato oprava musí být zadána za \\usepackage{babel}, ideálně na konci celé preambule. '
                           'Více informací lze nalézt na webu')

        imgui.push_item_width(-1)
        imgui.input_text('##hyphenfix', r'https://tex.stackexchange.com/a/112002',
                         64, imgui.INPUT_TEXT_AUTO_SELECT_ALL)
        imgui.pop_item_width()

        imgui.end()

        imgui.pop_style_color(1)
        imgui.pop_style_var(1)

    imgui.pop_style_var(1)

    if not gui_radios['data_only']:
        conv_h = window_h - 5 * settings.gui.scale * imgui.STYLE_FRAME_PADDING
        second_w = output_pos * 0.3
        first_w = output_pos * 0.3
        last_w = output_pos * 0.3
        settings.conv.data_only = False
    else:
        if not force_thirds:
            second_w = output_pos * 0.45
            first_w = output_pos * 0.225
            last_w = output_pos * 0.225
        else:
            second_w = output_pos * 0.3
            first_w = output_pos * 0.3
            last_w = output_pos * 0.3

        conv_h = (0.21 * window_h) - imgui.STYLE_FRAME_PADDING * settings.gui.scale
        settings.conv.data_only = True

    # ------- PRVNI SLOUPEC -----------------------------------------------------------
    # ------- PRVNI SLOUPEC -----------------------------------------------------------
    imgui.begin_group()
    imgui.begin_child('##PROFILY', first_w,
                      0.27 * window_h - 3 * settings.gui.scale * imgui.STYLE_FRAME_PADDING, True)
    imgui.push_item_width(-1)

    if big_font is not None:
        imgui.push_font(big_font)
        imgui.text('Profil nastavení')
        imgui.pop_font()
    else:
        imgui.text('Profil nastavení')

    imgui.spacing()
    imgui.spacing()

    if not profiles:
        profiles = ['(výchozí)'] + settings.get_profile_list()

    changed_profile, gui_lists['profiles'] = imgui.combo('##selected_profile', gui_lists['profiles'], profiles, 6)
    if imgui.is_item_hovered():
        cur_tooltip = 'V profilu nastavení jsou uložena všechna nastavení z částí Převádět, LaTeX a Legenda.'

    if changed_profile:
        if gui_lists['profiles'] > 0:
            cur_profile_name = profiles[gui_lists['profiles']]
            settings.inputs.should_load_input = False
            settings.load(cur_profile_name + '.ini')
        else:
            settings.reset()

    imgui.spacing()
    imgui.spacing()

    imgui.text_wrapped('Uložit aktuální nastavení jako')
    changed, new_profile_name = imgui.input_text('##novy_profil', new_profile_name, 64)

    # od windows nepovolene znaky, nebo napsal priponu souboru
    if changed and re.search(r'(\w|\d)*[/\\:*?"<>|.]+', new_profile_name) is not None:
        new_profile_name = 'neplatny_nazev'

    # ostatni nesmyslne vstupy
    elif changed and re.search(r'\w|\d', new_profile_name) is None:
        new_profile_name = 'neplatny_nazev'

    if imgui.is_item_hovered():
        cur_tooltip = 'Uloží aktuální nastavení z částí Převádět, LaTeX a legenda do nového profilu nastavení.'

    imgui.spacing()
    imgui.spacing()

    if imgui.button('Uložit', -1, 25*settings.gui.scale):
        if new_profile_name != 'neplatny_nazev':
            settings.save(new_profile_name + '.ini')
            profiles = ['(výchozí)'] + settings.get_profile_list()

    if imgui.is_item_hovered():
        cur_tooltip = 'Uloží aktuální nastavení z částí Převádět, LaTeX a legenda do nového profilu nastavení.'

    imgui.pop_item_width()
    imgui.end_child()

    imgui.spacing()
    imgui.spacing()
    imgui.spacing()
    imgui.spacing()

    imgui.begin_child('##PRVNISLOUPEC', first_w,
                      0.73 * window_h - 4 * settings.gui.scale * imgui.STYLE_FRAME_PADDING, True)

    if big_font is not None:
        imgui.push_font(big_font)
        imgui.text('Vstup')
        imgui.pop_font()
    else:
        imgui.text('Vstup')

    # pyImgui nema dialog na otevreni souboru, takze na to musim pouzit tkinter. pouzije se jen tento dialog, snad
    # tim uplne neznicim performance nebo tak neco
    imgui.label_text('##vstupy', 'Vstupní soubor')
    if imgui.button("Vybrat soubor..."):
        bs_gui.withdraw()
        file_path = askopenfilename()

        if '.xls' not in str(file_path):
            settings.log_str += '[VSTUP] Neplatný typ souboru.\n'
            file_path = None

        else:
            change_file = True
            gui_lists['lists'] = 0
            table_list.clear()
            sheet_list.clear()

    if imgui.is_item_hovered():
        cur_tooltip = 'Otevře dialog pro výběr souboru s daty k převedení.'

    # SUPER DULEZITA VEC: bacha at neotviras soubor kazdy frame. jinak se priprav na 5 fps.
    if file_path is not None and (wb is None or change_file):
        wb = load_workbook(file_path, data_only=True)
        change_file = False
        if not wb or wb is None:
            settings.log_str += '[VSTUP] Tento soubor nelze otevřít.\n'
            file_path = None

    # ---- SIRKA VSECH PRVKU --------------------------------------------------------------
    imgui.push_item_width(-1)
    # ---- SIRKA VSECH PRVKU --------------------------------------------------------------

    imgui.spacing()
    if not sheet_list:
        sheet_list = get_sheet_list()

    imgui.label_text('##listy_excel', 'Nalezené listy')
    _, gui_lists['lists'] = imgui.listbox('##listy', gui_lists['lists'], sheet_list, 5)
    if imgui.is_item_hovered():
        cur_tooltip = 'Seznam listů ve zvoleném souboru'

    if file_path is not None and wb is not None:
        if len(wb.sheetnames) > 0:
            try:
                ws = wb.worksheets[gui_lists['lists']]
            except KeyError:
                ws = None

    # ------------------ TYP PREVADENE OBLASTI
    imgui.spacing()
    imgui.label_text('##excel_conv_type', 'Chci převést:')
    if imgui.radio_button('Oblast buněk', gui_radios['convert_area']) \
            or settings.inputs.last_conv_type == 'convert_area':
        gui_radios['convert_area'] = True
        gui_radios['convert_table'] = False
        gui_radios['convert_tables_all'] = False
        gui_radios['data_only'] = False
        settings.inputs.last_conv_type = 'convert_area'

    if imgui.is_item_hovered():
        cur_tooltip = 'Převede obdelníkou oblast buňek. Start = levý horní roh, Konec = pravý dolní roh.'

    if imgui.radio_button('Některou z tabulek', gui_radios['convert_table']) \
            or settings.inputs.last_conv_type == 'convert_table':
        gui_radios['convert_area'] = False
        gui_radios['convert_table'] = True
        gui_radios['convert_tables_all'] = False
        gui_radios['data_only'] = False
        settings.inputs.last_conv_type = 'convert_table'

    if imgui.is_item_hovered():
        cur_tooltip = 'Převede oblast buněk odpovídající celému rozsahu této tabulky.'

    # TODO: Nekdy v budoucnu pridat
    # if imgui.radio_button('Všechny tabulky', gui_radios['convert_tables_all']) \
    #        or settings.inputs.last_conv_type == 'convert_tables_all':
    #    gui_radios['convert_area'] = False
    #    gui_radios['convert_table'] = False
    #    gui_radios['convert_tables_all'] = True
    #    gui_radios['data_only'] = False
    #    settings.inputs.last_conv_type = 'convert_tables_all'

    # if imgui.is_item_hovered():
    #    cur_tooltip = 'Převede všechny tabulky v seznamu dostupných tabulek. Dostanete N výstupů v jednom str.'

    if imgui.radio_button('Jen data', gui_radios['data_only']) \
            or settings.inputs.last_conv_type == 'data_only':
        gui_radios['convert_area'] = False
        gui_radios['convert_table'] = False
        gui_radios['convert_tables_all'] = False
        gui_radios['data_only'] = True
        settings.inputs.last_conv_type = 'data_only'

    if imgui.is_item_hovered():
        cur_tooltip = 'Převede pouze data ve vybraném listu. A to bez jakéhokoli formátu s výjimkou sloučených buněk.'

    imgui.spacing()

    # ------------------ NALEZENE TABULKY NEBO OBLAST K PREVODU
    table_list = get_table_list()

    if gui_radios['convert_table'] or gui_radios['convert_tables_all']:
        imgui.label_text('##pouzitelne_lbl', 'Použitelné tabulky')
        clicked, gui_lists['tables'] = \
            imgui.listbox('##pouzitelne', gui_lists['tables'], table_list, 5)

        if imgui.is_item_hovered():
            cur_tooltip = 'Jako vstup se použije vámi vybraná tabulka. ' \
                          'V závorce vidíte oblast buněk  která jí odpovídá.'

        if table_list and not gui_radios['convert_area']:
            data_range_mtc = re.search('\([A-z]\d+:[A-z]\d+\)', table_list[gui_lists['tables']])
            if data_range_mtc is not None:
                convert_range = data_range_mtc.group()

    else:
        imgui.label_text('##range_lbl', 'Oblast k převodu:')

        if gui_radios['data_only']:
            _, settings.conv.convert_all = imgui.checkbox('Převést vše', settings.conv.convert_all)
            checkbox_ht = imgui.get_item_rect_size()[1]
            corr = 8 * settings.gui.scale

            if imgui.is_item_hovered():
                cur_tooltip = 'Při tomto nastavení se jako Start použije první buňka obsahující nějaká data ' \
                              'a jako konec poslední buňka obsahující data. Nespojistost oblasti buněk není překážkou.'

        imgui.columns(2, '##range_cols', False)
        imgui.push_item_width(-1)
        imgui.text('Start')
        changed, settings.inputs.start_cell = imgui.input_text('##Start', settings.inputs.start_cell, 8,
                                                        imgui.INPUT_TEXT_AUTO_SELECT_ALL)
        imgui.pop_item_width()
        if imgui.is_item_hovered():
            cur_tooltip = 'Levý horní roh převáděné oblasti. Příklad vstupu: A9'

        imgui.next_column()

        imgui.text('Konec')
        imgui.push_item_width(-1)
        changed, settings.inputs.end_cell = imgui.input_text('##Konec', settings.inputs.end_cell, 8,
                                                      imgui.INPUT_TEXT_AUTO_SELECT_ALL)
        if imgui.is_item_hovered():
            cur_tooltip = 'Pravý dolní roh převáděné oblasti. Příklad vstupu: G17'

        if settings.inputs.start_cell != '' and settings.inputs.end_cell != '':
            convert_range = f'{settings.inputs.start_cell}:{settings.inputs.end_cell}'

        imgui.pop_item_width()
        imgui.columns(1)

    imgui.spacing()
    imgui.spacing()
    imgui.spacing()
    imgui.spacing()

    # ------------------ TLACITKO START
    if imgui.button('Převést', -1, 50 * settings.gui.scale):
        global minx, miny, maxx, maxy

        if isinstance(convert_range, str) and convert_range != '':
            a = settings
            (minx, miny), (maxx, maxy) = utils.range_to_index(convert_range.upper())

            # korekce vstupu
            if ws:
                minx, miny, maxx, maxy = utils.validate_input_range(ws, minx, miny, maxx, maxy)

                if None not in [minx, miny, maxx, maxy]:
                    try:
                        if settings.conv.data_only:
                            output_str = convert_data_only()
                        else:
                            output_str = convert()

                        settings.save('(posledni).ini')
                    except (IndexError, KeyError, RuntimeError, ValueError, AttributeError) as e:
                        settings.log_str += traceback.format_exc()
                else:
                    maxx = ws.max_column
                    maxy = ws.max_row
                    miny = ws.min_row
                    minx = ws.min_column

                    new_range = f'{utils.num_to_col(minx)}{miny}:{utils.num_to_col(maxx)}{maxy}'
                    settings.log_str += f'[VSTUP] Neplatná oblast k převodu. ' \
                                        f'Změněno na \'{new_range}\'.\n'
                    try:
                        if settings.conv.data_only:
                            output_str = convert_data_only()
                        else:
                            output_str = convert()

                        settings.save('(posledni).ini')
                    except (IndexError, KeyError, RuntimeError, ValueError, AttributeError) as e:
                        settings.log_str += traceback.format_exc()

            else:
                settings.log_str += '[VSTUP] Nemáte vybraný soubor. Nelze pokračovat.\n'

        elif not settings.conv.data_only and not settings.conv.convert_all:
            settings.log_str += '[VSTUP] Nezadali jste oblast s daty. Nelze pokračovat.\n'
        elif ws and settings.conv.data_only and settings.conv.convert_all:
            minx, miny, maxx, maxy = ws.min_column, ws.min_row, ws.max_column, ws.max_row
            try:
                output_str = convert_data_only()
                settings.save('(posledni).ini')
            except (IndexError, KeyError, RuntimeError, ValueError) as e:
                settings.log_str += traceback.format_exc()
        else:
            settings.log_str += '[VSTUP] Nemáte vybraný soubor nebo oblast k převodu. Nelze pokračovat.\n'

    if imgui.is_item_hovered():
        cur_tooltip = 'Spustí převod dle zadaných parametrů.'

    imgui.pop_item_width()
    imgui.end_child()
    imgui.end_group()
    imgui.same_line()

    # ------- DRUHY SLOUPEC -----------------------------------------------------------
    # ------- DRUHY SLOUPEC -----------------------------------------------------------
    imgui.begin_group()
    if not gui_radios['data_only']:
        imgui.begin_child('##DRUHYSLOUPEC', second_w, conv_h, True)
        # second_col_h = imgui.get_window_height()
        if big_font is not None:
            imgui.push_font(big_font)
            imgui.text('Převádět')
            imgui.pop_font()
            imgui.spacing()
        else:
            imgui.text('Převádět')
            imgui.spacing()

        # ------------------ TABULKY
        imgui.text('Formátované tabulky')
        clicked, settings.conv.tables.enable = imgui.checkbox('Povoleno', settings.conv.tables.enable)
        if imgui.is_item_hovered():
            cur_tooltip = 'Není-li zapnuto, jsou všechny vlastnosti buněk formátovaných jako tabulka ignorovány.'

        checkbox_ht = imgui.get_item_rect_size()[1]
        corr = 8 * settings.gui.scale

        imgui.begin_child('##conv_table', 0, checkbox_ht * 6, False)
        if not clicked and not settings.conv.tables.enable:
            imgui.push_style_var(imgui.STYLE_ALPHA, 0.5)
            _, _ = imgui.checkbox('Okraje', settings.conv.tables.borders)
            if imgui.is_item_hovered():
                cur_tooltip = 'Uvažuje okraje od buněk formátovaných jako tabulka. ' \
                              'Při vypnutí zbylé okraje zůstanou zachovány.'

            _, _ = imgui.checkbox('Formát záhlaví', settings.conv.tables.head)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát záhlaví (existuje-li) nehledě na nastavení v Excelu'

            _, _ = imgui.checkbox('Formát řádku souhrnů', settings.conv.tables.total)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát řádku souhrnů (existuje-li) nehledě na nastavení v Excelu'

            _, _ = imgui.checkbox('Vnutit pruhované řádky', settings.conv.tables.stripe_h)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát pruhovaných řádků (existuje-li) nehledě na nastavení v Excelu'

            _, _ = imgui.checkbox('Vnutit pruhované sloupce', settings.conv.tables.stripe_v)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát pruhovaných sloupců (existuje-li) nehledě na nastavení v Excelu'

            imgui.pop_style_var(1)
        else:
            _, settings.conv.tables.borders = imgui.checkbox('Okraje', settings.conv.tables.borders)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede okraje od buněk formátovaných jako tabulka. ' \
                              'Při vypnutí zbylé okraje zůstanou zachovány.'

            _, settings.conv.tables.head = imgui.checkbox('Formát záhlaví', settings.conv.tables.head)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát záhlaví (existuje-li) nehledě na nastavení v Excelu'

            _, settings.conv.tables.total = imgui.checkbox('Formát řádku souhrnů', settings.conv.tables.total)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát řádku souhrnů (existuje-li) nehledě na nastavení v Excelu'

            _, settings.conv.tables.stripe_h = imgui.checkbox('Vnutit pruhované řádky', settings.conv.tables.stripe_h)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát pruhovaných řádků (existuje-li) nehledě na nastavení v Excelu'

            _, settings.conv.tables.stripe_v = imgui.checkbox('Vnutit pruhované sloupce', settings.conv.tables.stripe_v)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede formát pruhovaných sloupců (existuje-li) nehledě na nastavení v Excelu'

        imgui.end_child()

        if not clicked and not settings.conv.tables.enable:
            settings.conv.tables.disable()

        imgui.separator()

        # ------------------ PODMINENE FORMATOVANI
        imgui.text('Podmíněné formátování')
        clicked, settings.conv.condi.enable = imgui.checkbox('Povoleno ', settings.conv.condi.enable)
        if imgui.is_item_hovered():
            cur_tooltip = 'Není-li zapnuto, jsou všechny vlastnosti podmíněně formátovaných buněk ignorovány.'

        imgui.begin_child('##conv_condi', 0, checkbox_ht * 3 - corr, False)
        if not clicked and not settings.conv.condi.enable:
            imgui.push_style_var(imgui.STYLE_ALPHA, 0.5)
            _, _ = imgui.checkbox('Okraje ', settings.conv.condi.borders)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede okraje podmíněně formátovancýh buněk. Ostatní okraje zůstanou zachovány.'

            _, _ = imgui.checkbox('Barevné škály', settings.conv.condi.colorscale)
            if imgui.is_item_hovered():
                cur_tooltip = 'Pokusí se převést barevné škály. Počet barev je výrazně limitován.'
            imgui.pop_style_var(1)
        else:
            _, settings.conv.condi.borders = imgui.checkbox('Okraje ', settings.conv.condi.borders)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede okraje podmíněně formátovancýh buněk. Ostatní okraje zůstanou zachovány.'

            _, settings.conv.condi.colorscale = imgui.checkbox('Barevné škály', settings.conv.condi.colorscale)
            if imgui.is_item_hovered():
                cur_tooltip = 'Pokusí se převést barevné škály. Počet barev je výrazně limitován.'

        imgui.end_child()

        if not clicked and not settings.conv.condi.enable:
            settings.conv.condi.disable()

        imgui.separator()

        # ------------------ BARVY
        imgui.text('Barvy')
        clicked, settings.conv.color.enable = imgui.checkbox('Povoleno   ', settings.conv.color.enable)
        if imgui.is_item_hovered():
            cur_tooltip = 'Není-li povoleno, jsou ignorovány všechny barvy (textu, pozadí). ' \
                          'Žádné barvy nezůstanou zachovány.'

        imgui.begin_child('##conv_colors', 0, checkbox_ht * 4 - corr, False)
        if not clicked and not settings.conv.color.enable:
            imgui.push_style_var(imgui.STYLE_ALPHA, 0.5)
            _, _ = imgui.checkbox('Barvy textu', settings.conv.color.fg)
            if imgui.is_item_hovered():
                cur_tooltip = 'Týká se barvy textu nehledě na to, jakým způsobem byl obarven.'

            _, _ = imgui.checkbox('Barvy pozadí', settings.conv.color.bg)
            if imgui.is_item_hovered():
                cur_tooltip = 'Týká se barvy pozadí nehledě na to, jakým způsobem bylo obarveno.'

            _, _ = imgui.checkbox('Barvy okrajů', settings.conv.color.border)
            if imgui.is_item_hovered():
                cur_tooltip = 'Týká se barvy okrajů nehledě na to, jakým způsobem byly obarveny.'

            imgui.pop_style_var(1)
        else:
            _, settings.conv.color.fg = imgui.checkbox('Barvy textu', settings.conv.color.fg)
            if imgui.is_item_hovered():
                cur_tooltip = 'Týká se barvy textu nehledě na to, jakým způsobem byl obarven.'

            _, settings.conv.color.bg = imgui.checkbox('Barvy pozadí', settings.conv.color.bg)
            if imgui.is_item_hovered():
                cur_tooltip = 'Týká se barvy pozadí nehledě na to, jakým způsobem bylo obarveno.'

            _, settings.conv.color.border = imgui.checkbox('Barvy okrajů', settings.conv.color.border)
            if imgui.is_item_hovered():
                cur_tooltip = 'Týká se barvy okrajů nehledě na to, jakým způsobem byly obarveny.'

        imgui.end_child()

        if not clicked and not settings.conv.color.enable:
            settings.conv.color.disable()

        imgui.separator()

        # ------------------ FORMAT TEXTU
        imgui.text('Formátování textu')
        clicked, settings.conv.text.enable = imgui.checkbox('Povoleno  ', settings.conv.text.enable)
        if imgui.is_item_hovered():
            cur_tooltip = 'Není-li povoleno, formáty textu (tučný, kurzíva, natočení, velikost) jsou ignorovány.'

        imgui.begin_child('##conv_text', 0, checkbox_ht * 3 - corr, False)
        if not clicked and not settings.conv.text.enable:
            imgui.push_style_var(imgui.STYLE_ALPHA, 0.5)
            _, _ = imgui.checkbox('Styly textu', settings.conv.text.flags)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede tučný text, kurzívu, podtržený text. ' \
                              'Funguje správně jen pokud je text buňky celý formátován stejně. '

            _, _ = imgui.checkbox('Velikosti textu', settings.conv.text.textsize)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede velikost písma z výšky v pt na např. \\Large. ' \
                              'Výstupní velikost závisí na zvolené základní velikosti písma.'
            imgui.pop_style_var(1)
        else:
            _, settings.conv.text.flags = imgui.checkbox('Styly textu', settings.conv.text.flags)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede tučný text, kurzívu, podtržený text. ' \
                              'Funguje správně jen pokud je text buňky celý formátován stejně. '

            _, settings.conv.text.textsize = imgui.checkbox('Velikosti textu', settings.conv.text.textsize)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede velikost písma z výšky v pt na např. \\Large. ' \
                              'Výstupní velikost závisí na zvolené základní velikosti písma.'
        imgui.end_child()

        if not clicked and not settings.conv.text.enable:
            settings.conv.text.disable()

        imgui.separator()

        # ------------------ OKRAJE
        imgui.text('Okraje buněk')
        clicked, settings.conv.border.enable = imgui.checkbox('Povoleno    ', settings.conv.border.enable)
        if imgui.is_item_hovered():
            cur_tooltip = 'Není-li povoleno, jsou všechny okraje ignorovány.'

        imgui.begin_child('##conv_borders', 0, checkbox_ht * 2 - corr, False)
        if not clicked and not settings.conv.border.enable:
            imgui.push_style_var(imgui.STYLE_ALPHA, 0.5)
            _, _ = imgui.checkbox('Styly okrajů', settings.conv.border.style)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede styl okrajů (plný, čárkovaný, tučný, ...). Týká se všech okrajů.'
            imgui.pop_style_var(1)
        else:
            _, settings.conv.border.style = imgui.checkbox('Styly okrajů', settings.conv.border.style)
            if imgui.is_item_hovered():
                cur_tooltip = 'Převede styl okrajů (plný, čárkovaný, tučný, ...). Týká se všech okrajů.'
        imgui.end_child()

        if not clicked and not settings.conv.border.enable:
            settings.conv.border.disable()

        imgui.separator()
        imgui.spacing()

        # ------------------ SIRKY A VYSKY BUNEK
        _, settings.conv.width = imgui.checkbox('Relativní šířky slopců', settings.conv.width)
        if imgui.is_item_hovered():
            cur_tooltip = 'Je-li zapnuto, šířka sloupců bude vztažena relativně k šířce strany. ' \
                          'V opačném případě šířka sloupců nebude převedena.'
        _, settings.conv.height = imgui.checkbox('Přibližná výška řádků', settings.conv.height)
        if imgui.is_item_hovered():
            cur_tooltip = 'Pokusí se získat informaci o výšce řádků v pt. Vcelku nepřesné.'

        _, settings.conv.halign = imgui.checkbox('Horizontální zarovnání', settings.conv.halign)
        if imgui.is_item_hovered():
            cur_tooltip = 'Převede informaci o horizontálním zarovnání textu buněk (vpravo, vlevo, na střed)'

        _, settings.conv.valign = imgui.checkbox('Vertikální zarovnání', settings.conv.valign)
        if imgui.is_item_hovered():
            cur_tooltip = 'Převede informaci o vertikálním zarovnání textu buněk (nahoru, dolů, na střed)'

        imgui.end_child()

    if gui_radios['data_only']:
        imgui.begin_child('##CUSTOMHLAVICKA', second_w, window_h - 5 * settings.gui.scale * imgui.STYLE_FRAME_PADDING, True)
        if big_font is not None:
            imgui.push_font(big_font)
            imgui.text('Vlastní hlavička')
            imgui.pop_font()
        else:
            imgui.text('Vlastní hlavička')

        imgui.spacing()
        imgui.spacing()
        changed, settings.conv.custom_head = imgui.input_text_multiline('', settings.conv.custom_head,
                                                                        15000, -1, -55 * settings.gui.scale ,
                                                                        imgui.INPUT_TEXT_ALLOW_TAB_INPUT
                                                                        | imgui.INPUT_TEXT_CTRL_ENTER_FOR_NEW_LINE)

        imgui.spacing()
        imgui.spacing()
        imgui.spacing()
        imgui.spacing()

        if imgui.button('Změnit velikost sloupce', -1, 25 * settings.gui.scale ):
            force_thirds = not force_thirds

        if imgui.is_item_hovered():
            cur_tooltip = 'Zvětší prostřední sloupec tohoto GUI, nebo ho naopak vrátí na normální šířku.'

        imgui.end_child()

    imgui.end_group()
    imgui.same_line()

    # ------- TRETI SLOUPEC -----------------------------------------------------------
    # ------- TRETI SLOUPEC -----------------------------------------------------------
    imgui.begin_group()
    last_wd = last_w
    if last_w < imgui.get_content_region_available_width():
        last_wd = imgui.get_content_region_available_width()

    imgui.begin_child('##TRETISLOUPEC',
                      last_wd, window_h * 0.75 - 3 * settings.gui.scale * imgui.STYLE_FRAME_PADDING, True)
    if big_font is not None:
        imgui.push_font(big_font)
        imgui.text('LaTeX')
        imgui.spacing()
        imgui.pop_font()
    else:
        imgui.text('LaTeX')

    imgui.push_item_width(-1)

    imgui.text('Maximální šířka výstupu')
    _, settings.ltx.max_char_width = imgui.slider_int('##ltx_char_w', settings.ltx.max_char_width,
                                                      40, 200, '%i znaků')
    if imgui.is_item_hovered():
        cur_tooltip = 'Udává maximální šířku výstupního řetězce ve znacích. Řádky s větší šírkou budou zalomeny. ' \
                      'Týká se těla tabulky a příkazů \'cell\', ostatní části výstupu nelze zalomit.'

    imgui.spacing()
    _, settings.ltx.align = imgui.checkbox('Zarovnat podle &', settings.ltx.align)
    if imgui.is_item_hovered():
        cur_tooltip = 'Zarovná obsah těla tabulky podle \'&\'.'

    _, settings.ltx.use_setcell = imgui.checkbox('Používat \\SetCell', settings.ltx.use_setcell)
    if imgui.is_item_hovered():
        cur_tooltip = 'Místo varianty \'cell{i}{j} = {fmt}\' v hlavičče použije ' \
                      '\'\\SetCell{fmt} text_buňky\' v těle tabulky. Může zlepšit přehlednost. '

    _, settings.ltx.excel_frac_as_ltx_frac = imgui.checkbox('Excel zlomky jako $\\frac$',
                                                            settings.ltx.excel_frac_as_ltx_frac)

    _, settings.ltx.use_sci_nums = imgui.checkbox('Vědecká notace čísel', settings.ltx.use_sci_nums)

    if imgui.is_item_hovered():
        cur_tooltip = 'Máte-li některá data v Excelu formátovány jako "matematický", pak je při zapnutí ' \
                      'tohoto nastavení vytvořeno \'2.3E-06\', a při vypnutí vytvořeno \'$2.3\\cdot 10^{-6}$\'.'

    clicked, settings.ltx.escape = imgui.checkbox('Escape speciálních LaTeX symbolů', settings.ltx.escape)
    if imgui.is_item_hovered():
        cur_tooltip = 'Přídá \\ před speciální LaTeX symboly, tedy před \'} { $ ^ _ % #\''

    imgui.begin_child('##ltx_escape_settings', 0, 2 * checkbox_ht - 2 * corr, False)
    if not clicked and not settings.ltx.escape:
        imgui.push_style_var(imgui.STYLE_ALPHA, 0.5)
        imgui.set_cursor_pos_x(imgui.get_cursor_pos_x() + 20)
        _, settings.ltx.dont_escape_math = imgui.checkbox('Neprovádět u matematiky', False)
        if imgui.is_item_hovered():
            cur_tooltip = 'Vynechá escape \'} { ^ _\', je-li vstupní text mezi \'$$\''

        imgui.pop_style_var(1)
    else:
        imgui.set_cursor_pos_x(imgui.get_cursor_pos_x() + 20)
        _, settings.ltx.dont_escape_math = imgui.checkbox('Neprovádět u matematiky', settings.ltx.dont_escape_math)
        if imgui.is_item_hovered():
            cur_tooltip = 'Vynechá escape \'} { ^ _\', je-li vstupní text mezi \'$$\''

    imgui.end_child()
    imgui.spacing()

    if not clicked and not settings.ltx.escape:
        settings.ltx.dont_escape_s = False

    table_types = ['Normální', 'Sidewaystable', 'Dlouhá', 'Rotatebox']
    imgui.separator()
    imgui.text('Typ výstupní tabulky')
    _, dummy = imgui.combo('##ltx_table_type', settings.ltx.table_type, table_types, 4)
    settings.ltx.table_type = ELtxTableType(dummy)

    if imgui.is_item_hovered():
        cur_tooltip = 'Očekávaný typ výstupní tabulky. ' \
                      'Dlouhá je přes více stran, ' \
                      'Sidewaystable je otočená ale zabírá celou stranu, ' \
                      'Rotatebox je otočená ale zabírá minimum místa (v Pozici u ní nepoužívat h !!!)'

    if settings.ltx.table_type == ELtxTableType.LONG:
        imgui.spacing()
        imgui.push_item_width(-1)
        imgui.push_style_var(imgui.STYLE_FRAME_PADDING, imgui.Vec2(2, 2))

        imgui.text('Počet stálých řádků hlavičky')
        if imgui.is_item_hovered():
            cur_tooltip = 'Počet řádků (shora), který bude zobrazen na každé straně dlouhé tabulky'

        imgui.push_style_var(imgui.STYLE_FRAME_PADDING, imgui.Vec2(0, 0))
        changed, settings.ltx.longt.head_row_count = \
            imgui.input_int('##long_head', settings.ltx.longt.head_row_count, 1)
        if imgui.is_item_hovered():
            cur_tooltip = 'Počet řádků (shora), který bude zobrazen na každé straně dlouhé tabulky'
        imgui.pop_style_var(1)

        if changed and (settings.ltx.longt.head_row_count < 0 or settings.ltx.longt.head_row_count > 20):
            settings.ltx.longt.head_row_count = 0
        imgui.spacing()

        imgui.text('Počet stálých řádků paty')
        if imgui.is_item_hovered():
            cur_tooltip = 'Počet řádků (zdola), který bude zobrazen na každé straně dlouhé tabulky'

        imgui.push_style_var(imgui.STYLE_FRAME_PADDING, imgui.Vec2(0, 0))
        changed, settings.ltx.longt.total_row_count = \
            imgui.input_int('##long_total', settings.ltx.longt.total_row_count, 1)
        if imgui.is_item_hovered():
            cur_tooltip = 'Počet řádků (zdola), který bude zobrazen na každé straně dlouhé tabulky'

        if changed and (settings.ltx.longt.total_row_count < 0 or settings.ltx.longt.total_row_count > 20):
            settings.ltx.longt.total_row_count = 0
        imgui.spacing()

        imgui.pop_style_var(2)

        imgui.text('"Pokračování" dole')
        changed, dummy = imgui.input_text('##ltx_contfoot', settings.ltx.longt.contfoot_text, 128)
        if imgui.is_item_hovered():
            cur_tooltip = 'Řetězec který bude zobrazen v místě rozdělení tabulky na další stranu.'

        if changed:
            settings.ltx.longt.contfoot_text = dummy

        imgui.text('"Pokračování" v titulku')
        changed, dummy = imgui.input_text('##ltx_conthead', settings.ltx.longt.conthead_text, 128)
        if imgui.is_item_hovered():
            cur_tooltip = 'Řetězec který bude zobrazen v titulku rozdělených částí'

        if changed:
            settings.ltx.longt.conthead_text = dummy

        # imgui.pop_style_var(1)

        if changed and (settings.ltx.longt.total_row_count < 0 or settings.ltx.longt.total_row_count > 20):
            settings.ltx.longt.total_row_count = 0
        imgui.pop_item_width()

    elif settings.ltx.table_type == ELtxTableType.ROTATED_BOX:
        imgui.text('Otočit tabulku')
        rotate_types = ['Po směru hod. ručiček (-90)', 'Proti směru hod. ruč. (+90)']
        _, dummy = imgui.combo('##ltx_rotate_combo', int(settings.ltx.rotate_ccw), rotate_types, 2)
        settings.ltx.rotate_ccw = dummy != 0
        if imgui.is_item_hovered():
            cur_tooltip = 'Otočí tabulku o 90 stupňu zvoleným směrem. POZOR: nefunguje zcela správně pro ' \
                          'oboustranné dokumenty'

    imgui.separator()

    imgui.text('Titulek tabulky')
    changed, dummy = imgui.input_text('##ltx_caption', settings.ltx.caption, 512)
    if imgui.is_item_hovered():
        cur_tooltip = 'Dá tabulce zadaný titulek. Doporučeno nastavit na jednoslovný nesmysl, např. \'dakjdghak\', ' \
                      'a v dokumentu ručně upravit.'

    if changed:
        settings.ltx.caption = dummy

    if settings.ltx.table_type != ELtxTableType.LONG:
        imgui.text('Pozice tabulky na straně')
        changed, dummy = imgui.input_text('##ltx_hbt', settings.ltx.table_hbt, 16)
        if imgui.is_item_hovered():
            cur_tooltip = 'Text, který bude vložen místo \'X\' v \'\\begin{table}[X]\'. Texto text řídí možnou ' \
                          'pozici tabulky v rámci strany LaTeX dokumentu, doporučeno je \'ht\' nebo \'hbt\'.'

    if changed:
        settings.ltx.table_hbt = dummy

    imgui.text('Třída LaTeX dokumentu')
    document_classes = ['article', 'memoir', 'report', 'book', 'letter', 'beamer']
    changed, gui_lists['doctype'] = imgui.combo('##doctype', gui_lists['doctype'], document_classes, 6)
    if changed:
        settings.ltx.document_class = document_classes[gui_lists['doctype']]

    if imgui.is_item_hovered():
        cur_tooltip = 'Třída vašeho LaTeX dokumentu. Od této volby se odvíjí dostupné velikosti písma. ' \
                      'Pokud nevíte, zvolte article.'

    imgui.spacing()
    imgui.text('Základní velikost písma')
    font_sizes = ['9pt', '10pt', '11pt', '12pt', '14pt', '17pt', '20pt', '25pt', '30pt', '36pt', '48pt', '60pt']
    _, settings.ltx.default_text_size_index = imgui.combo('##basic_fontsize',
                                                          settings.ltx.default_text_size_index, font_sizes, 6)

    if imgui.is_item_hovered():
        cur_tooltip = 'Výchozí výška písma ve vašem LaTeX dokumentu. Pokud nevíte, zvolte 11pt.'
    settings.ltx.default_text_size = font_sizes[settings.ltx.default_text_size_index][:-2]

    imgui.text('Desetinný oddělovač')
    changed, settings.ltx.dec_separator = imgui.input_text('##ltx_dec_separator', settings.ltx.dec_separator, 2)
    if imgui.is_item_hovered():
        cur_tooltip = 'Nastaví desetinný oddělovač (destinná čárka/tečka). ' \
                      'POZOR: Funguje jen pokud nemáte formát buněk v Excelu nastaven jako Obecný.'

    imgui.text('Oddělovač tisíců')
    changed, settings.ltx.thousand_separator = imgui.input_text('##ltx_thou_sep', settings.ltx.thousand_separator, 2)
    if imgui.is_item_hovered():
        cur_tooltip = 'Je-li v Excel formátu buňky nastaveno oddělování tisíců, pak se tento znak použije ' \
                      'jako oddělovač. Zpravidla se používá nezlomitelná mezera \'~\' nebo \'_\' či \',\'.'

    imgui.pop_item_width()
    imgui.end_child()
    imgui.spacing()
    imgui.spacing()
    imgui.spacing()
    imgui.spacing()

    imgui.begin_child('##LEGENDA', last_wd, window_h * 0.25 - 4 * settings.gui.scale * imgui.STYLE_FRAME_PADDING, True)
    if big_font is not None:
        imgui.push_font(big_font)
        imgui.text('Legenda')
        imgui.spacing()
        imgui.pop_font()
    else:
        imgui.text('Legenda')

    imgui.push_item_width(-1)

    imgui.label_text('##legend_type', 'Typ legendy:')
    if imgui.radio_button('Průběžná', gui_radios['legend_inside']):
        gui_radios['legend_inside'] = True
        gui_radios['legend_top'] = False
        settings.legend.on_top = False

    if imgui.is_item_hovered():
        cur_tooltip = 'Části legendy se zobrazí u prvků ke kterým se vztahují.'

    if imgui.radio_button('Na začátku', gui_radios['legend_top']):
        gui_radios['legend_inside'] = False
        gui_radios['legend_top'] = True
        settings.legend.on_top = True

    if imgui.is_item_hovered():
        cur_tooltip = 'Legenda bude jako jeden celek před samotným kódem tabulky.'

    imgui.spacing()
    imgui.separator()
    imgui.spacing()

    changed, settings.legend.enabled = imgui.checkbox('Povoleno', settings.legend.enabled)
    if imgui.is_item_hovered():
        cur_tooltip = 'Zapne legendu. Může se hodit jako reference při ručních úpravách výstupu'

    imgui.begin_child('##ltx_escape_settings', 0, 5.3 * checkbox_ht - corr, False)
    if not changed and not settings.legend.enabled:
        imgui.push_style_var(imgui.STYLE_ALPHA, 0.5)
        _, _ = imgui.checkbox('Syntaxe', settings.legend.syntax)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahrne syntax všech prvků. Příklad: \'row{pořadí} = {halign, bg, fg, ht, cmds}\''

        _, _ = imgui.checkbox('Slovní popis', settings.legend.expl)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahhne co daný příkaz znamená. Příklad: \'row ... nastaví zadané parametry u ' \
                          'všech buněk daného řádku\''

        _, _ = imgui.checkbox('Zkratky parametrů', settings.legend.params)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahrne zkratky parametrů v syntaxi. Příklad: \'bg ... barva pozadí\''

        _, _ = imgui.checkbox('Možné hodnoty parametrů', settings.legend.expl)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahrne možné hodnoty parametrů v syntaxi. ' \
                          'Příklad: \'ht ... {2cm}, {15.4pt}, apod.\''

        imgui.pop_style_var(1)
    else:
        _, settings.legend.syntax = imgui.checkbox('Syntaxe', settings.legend.syntax)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahrne syntax všech prvků. Příklad: \'row{pořadí} = {halign, bg, fg, ht, cmds}\''

        _, settings.legend.expl = imgui.checkbox('Slovní popis', settings.legend.expl)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahhne co daný příkaz znamená. Příklad: \'row ... nastaví zadané parametry u ' \
                          'všech buněk daného řádku\''

        _, settings.legend.abbrs = imgui.checkbox('Zkratky parametrů', settings.legend.abbrs)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahrne zkratky parametrů v syntaxi. Příklad: \'bg ... barva pozadí\''

        _, settings.legend.params = imgui.checkbox('Možné hodnoty parametrů', settings.legend.params)
        if imgui.is_item_hovered():
            cur_tooltip = 'Do legendy zahrne možné hodnoty parametrů v syntaxi. ' \
                          'Příklad: \'ht ... {2cm}, {15.4pt}, apod.\''

    if not settings.legend.enabled:
        settings.legend.disable()

    imgui.end_child()

    imgui.spacing()
    imgui.end_child()
    imgui.end_group()
    output_pos = imgui.get_window_width() + imgui.STYLE_FRAME_PADDING
    output_ht = imgui.get_window_height()
    imgui.end()

    imgui.set_next_window_position(output_pos, 2 * settings.gui.scale * imgui.STYLE_FRAME_PADDING -
                                   2 * settings.gui.scale)
    imgui.set_next_window_size(window_w * 0.4 - imgui.STYLE_FRAME_PADDING,
                               output_ht * 0.7 - 2 * settings.gui.scale * imgui.STYLE_FRAME_PADDING)

    imgui.begin('Výstup', False, imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_MOVE
                | imgui.WINDOW_NO_BRING_TO_FRONT_ON_FOCUS)

    if mono_font:
        imgui.push_font(mono_font)

    output_str_len = 500 if not isinstance(output_str, str) else len(output_str) + 500
    imgui.input_text_multiline('##vystup', output_str, output_str_len, -1, -70 * settings.gui.scale,
                               imgui.INPUT_TEXT_READ_ONLY | imgui.INPUT_TEXT_ALLOW_TAB_INPUT)

    if mono_font:
        imgui.pop_font()

    imgui.spacing()
    imgui.spacing()
    imgui.spacing()
    imgui.spacing()

    if imgui.button('Zkopírovat', -1, 50 * settings.gui.scale):
        bs_gui.withdraw()
        bs_gui.clipboard_clear()
        bs_gui.clipboard_append(output_str)

    imgui.end()

    imgui.set_next_window_position(output_pos,
                                   output_ht * 0.7 + imgui.STYLE_FRAME_PADDING)
    imgui.set_next_window_size(window_w * 0.4 - imgui.STYLE_FRAME_PADDING,
                               output_ht * 0.3 - imgui.STYLE_FRAME_PADDING)
    imgui.begin('Log', False, imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_BRING_TO_FRONT_ON_FOCUS)

    if mono_font:
        imgui.push_font(mono_font)

    imgui.text_wrapped(settings.log_str)

    if mono_font:
        imgui.pop_font()

    imgui.end()

    # imgui.show_demo_window()

    if settings.gui.dark_mode:
        imgui.pop_style_color(6)
    else:
        imgui.pop_style_color(15)

    if change_theme:
        settings.gui.dark_mode = not settings.gui.dark_mode
        change_theme = False

    imgui.pop_style_var(9)


def cheat_sheet_table(imgui_lbl: str):
    """Pomocna funkce pro tisk cheat sheet v GUI (je to jen procedura). Ucelem je kod pro cheat sheet presunout do pryc, nic vic."""
    imgui.columns(3, f'##{imgui_lbl}', True)
    imgui.set_column_width(0, 100 * settings.gui.scale)
    imgui.set_column_width(1, 150 * settings.gui.scale)
    imgui.separator()
    imgui.text('Parametr')
    imgui.next_column()
    imgui.text('Hodnoty')
    imgui.next_column()
    imgui.text('Poznámka')
    imgui.separator()
    imgui.next_column()

    imgui.text('barvy')
    imgui.next_column()
    imgui.text('gray')
    imgui.text('red')
    imgui.text('brown')
    imgui.text('yellow')
    imgui.text('olive')
    imgui.text('green')
    imgui.text('teal')
    imgui.text('cyan')
    imgui.text('azure')
    imgui.text('blue')
    imgui.text('violet')
    imgui.text('magenta')
    imgui.next_column()
    imgui.text_wrapped('všechny barvy mají kromě názvu za sebou také číslici od 1 do 9. to určuje jejich '
                       'světlost, větší číslo == světlejší barva. například red8.')

    imgui.next_column()
    imgui.separator()

    imgui.text('\\font_cmds')
    imgui.next_column()
    imgui.text_wrapped(r'\bfseries')
    imgui.text_wrapped(r'\itshape')
    imgui.text_wrapped(r'\slshape')
    imgui.text_wrapped(r'\scshape')
    imgui.text_wrapped(r'\Large, \small, ...')
    imgui.text_wrapped(r'\sffamily')
    imgui.text_wrapped(r'\ttfamily')
    imgui.next_column()
    imgui.text_wrapped('tučný')
    imgui.text_wrapped('kurzíva')
    imgui.text_wrapped('slanted')
    imgui.text_wrapped('kapitálky')
    imgui.text_wrapped('velikost textu')
    imgui.text_wrapped('bezpatkové písmo')
    imgui.text_wrapped('neproporcionální písmo')
    imgui.separator()
    imgui.next_column()

    imgui.text('halign')
    imgui.next_column()
    imgui.text('r')
    imgui.text('c')
    imgui.text('l')
    imgui.next_column()
    imgui.text('vpravo')
    imgui.text('na střed')
    imgui.text('vlevo')
    imgui.separator()
    imgui.next_column()

    imgui.text('indexy')
    imgui.next_column()
    imgui.text_wrapped(r'1')
    imgui.text_wrapped(r'2-5')
    imgui.text_wrapped(r'1,3,4')
    imgui.text_wrapped(r'1,3-6')
    imgui.text_wrapped(r'1,3, even')
    imgui.text_wrapped(r'2,4, odd')
    imgui.text_wrapped(r'Z, Y, X')
    imgui.text_wrapped(r'1, Z')
    imgui.next_column()
    imgui.text_wrapped('jen index')
    imgui.text_wrapped('rozsah')
    imgui.text_wrapped('více indexů')
    imgui.text_wrapped('index a rozsah')
    imgui.text_wrapped('dané indexy a všechny SUDÉ')
    imgui.text_wrapped('dané indexy a všechny LICHÉ')
    imgui.text_wrapped('poslední, předposlední, třetí od konce')
    imgui.text_wrapped('první a poslední')
    imgui.separator()
    imgui.next_column()

    imgui.text('\\latex_cmd')
    imgui.next_column()
    imgui.text_wrapped(r'\underline')
    imgui.text_wrapped(r'\cokoli')
    imgui.next_column()
    imgui.text_wrapped('podtžený text')
    imgui.text_wrapped('jakýkoli LaTeX příkaz s jedním parametrem. '
                       'text buňky se pošle jako vstup tomuto příkazu.')
    imgui.separator()
    imgui.next_column()

    imgui.text_wrapped('šířka, tloušťka, výška')
    imgui.next_column()
    imgui.text_wrapped('{17pt}, {3cm}, {2.5em}...')
    imgui.next_column()
    imgui.next_column()
    imgui.separator()

    imgui.text('typ_sloupce')
    imgui.next_column()
    imgui.text_wrapped('l, c, r, h, f, m, t, b')
    imgui.text('\nX[halign, rw]')
    imgui.text_wrapped('\nQ[halign, šířka, barva_pozadí]')
    imgui.next_column()
    imgui.text_wrapped('viz valign a halign.')
    imgui.text_wrapped('sloupec s relativní šířkou \'rw\' (jen číslo). \'rw\' udává poměr, ve kterých se má šířka '
                       'všech X sloupců rozdělit. ve výchozím nastavení se snaží vyplnit celou šířku strany.')
    imgui.text_wrapped('obecný typ sloupce/řádku (dle kontextu). prvním parametrem zadáte zarovnání '
                       '(pro sloupce jdou oba typy zarovnání, pro řádky pouze z valign). druhým parametrem určíte '
                       'absolutní šířku sloupce. lze zadat i barvu pozadí tohoto řádku/sloupce. více v dokumentaci, '
                       'kapitoly 1.6 až 1.9')
    imgui.separator()
    imgui.next_column()

    imgui.text('typ_okraje')
    imgui.next_column()
    imgui.text('dotted')
    imgui.text('dashed')
    imgui.text('solid')
    imgui.next_column()
    imgui.text_wrapped('tečkovaný')
    imgui.text_wrapped('čárkovaný')
    imgui.text_wrapped('plný')
    imgui.separator()
    imgui.next_column()

    imgui.text('valign')
    imgui.next_column()
    imgui.text('h')
    imgui.text('f')
    imgui.text('m')
    imgui.text('t')
    imgui.text('b')
    imgui.next_column()
    imgui.text_wrapped('nahoru')
    imgui.text_wrapped('na střed')
    imgui.text_wrapped('dolů')
    imgui.text_wrapped('pro víceřádkové buňky. baseline top')
    imgui.text_wrapped('pro víceřádkové buňky. baseline bottom.')
    imgui.separator()
    imgui.next_column()

    imgui.columns(1)


def get_table_list():
    """Funkce ziska seznam oblasti formatovanych jaok tabulka v danem listu Excel souboru"""
    if file_path is None:
        return []

    if wb is None:
        return []

    if ws is None:
        return []

    table_list = []

    for tbl in ws.tables.values():
        table_list.append(f'{tbl.displayName} ({tbl.ref})')

    return table_list


def get_sheet_list():
    """Funkce ziska seznam listu v danem Excel souboru"""
    if file_path is None:
        return []

    if wb is None:
        return []

    sheet_list = []
    if wb.sheetnames:
        for sh in wb.sheetnames:
            sheet_list.append(sh)

    return sheet_list


def main():
    settings.load('(posledni).ini')

    path_to_font = 'C:\\Windows\\Fonts\\Verdana.ttf'
    path_to_font_bold = 'C:\\Windows\\Fonts\\Verdanab.ttf'
    path_to_font_mono = 'C:\\Windows\\Fonts\\consola.ttf'

    imgui.create_context()
    window = impl_glfw_init()

    impl = GlfwRenderer(window)
    io = imgui.get_io()

    # vypne tvoreni imgui.ini (uklada pozice oken apod.), nepotrebujeme, kazdy by ho stejne mazal
    io.ini_file_name = ''.encode()  

    # nacte 3 pisma, ty se pak musi neustale predavat 
    glyph_ranges = io.fonts.get_glyph_ranges_latin()
    font = io.fonts.add_font_from_file_ttf(path_to_font, 14 * settings.gui.scale, glyph_ranges)
    impl.refresh_font_texture()

    big_font = io.fonts.add_font_from_file_ttf(path_to_font_bold, 22 * settings.gui.scale, glyph_ranges)
    impl.refresh_font_texture()

    mono_font = io.fonts.add_font_from_file_ttf(path_to_font_mono, 12 * settings.gui.scale, glyph_ranges)
    impl.refresh_font_texture()

    # render loop
    while not window_should_close(window):
        render_frame(impl, window, font, big_font, mono_font)

    impl.shutdown()
    terminate()


def convert_data_only():
    """Tato funkce se použije k převodu dat, je-li v nastavení převodu vybrána možnost Jen data. Funkce pouze vytáhne
        data v buňkách a sloučené buňky. Hlavní rozdíl oproti convert() je v tom, jak se data ukládají.
        
        Returns:
        output_str (str): kompletni vystupni retezec (cela tabulka pro zkopirovani)"""

    global minx, miny, maxx, maxy, output_str, convert_range, wb, ws

    if not wb:
        return ''

    if not ws:
        return ''

    starttime = timeit.default_timer()
    all_cells = []
    cur_col = 1
    cur_row = 1
    row_offset = 0
    row_offset_set = False

    for col in ws.iter_cols(max_row=maxy, max_col=maxx, min_row=miny, min_col=minx):
        cur_row = 1
        for cell in col:
            if not cell.value:
                continue

            if not row_offset_set:
                if cur_row == miny:
                    row_offset = 0
                else:
                    row_offset = miny + cur_col - 2

                row_offset_set = True
                break
        else:
            cur_col += 1
            continue

        break

    col_offset = minx + cur_col - 2

    # ziskani dat
    for row in ws.iter_rows(max_row=maxy, max_col=maxx, min_row=miny, min_col=minx):
        cur_cell_row = []
        cur_col = 1

        for cell in row:
            merged_cell = utils.is_merged(cell, ws)
            was_merged_empty = False

            if cell.value is None:
                if merged_cell is not None:
                    was_merged_empty = True
                else:
                    cur_cell_row.append(CCellDO(''))
                    cur_col += 1
                    continue

            # sloucena s hodnotou
            if merged_cell is not None and not was_merged_empty:
                num_cols = merged_cell.size['columns']
                num_rows = merged_cell.size['rows']
                merged_start = ws.cell(merged_cell.min_row, merged_cell.min_col)

                my_cell = dataGet.get_cell_properties_dataonly(merged_start, cur_row, cur_col, EMergedCell.MERGED,
                                                               (num_cols, num_rows))
                my_cell.is_merged = EMergedCell.MERGED

            # nesloucena
            elif not was_merged_empty:
                my_cell = dataGet.get_cell_properties_dataonly(cell, cur_row, cur_col)

            # sloucena bez hodnoty
            elif merged_cell is not None:
                num_cols = merged_cell.size['columns']
                num_rows = merged_cell.size['rows']
                merged_start = ws.cell(merged_cell.min_row, merged_cell.min_col)

                if cell.coordinate != merged_start.coordinate:
                    my_cell = dataGet.get_cell_properties_dataonly(cell, cur_row, cur_col, EMergedCell.MERGED_EMPTY,
                                                                   (num_cols, num_rows))
                    my_cell.is_merged = EMergedCell.MERGED_EMPTY
                else:
                    my_cell = dataGet.get_cell_properties_dataonly(cell, cur_row, cur_col, EMergedCell.MERGED,
                                                                   (num_cols, num_rows))
                    my_cell.is_merged = EMergedCell.MERGED

            else:
                my_cell = CCellDO('')

            cur_cell_row.append(my_cell)
            cur_col += 1

        all_cells.append(cur_cell_row)
        cur_row += 1

    # tvorba vystupu
    output_str = toLatex.make_ltx_begin()

    head_str = toLatex.export_head_dataonly(all_cells, settings.conv.custom_head)
    body_str = toLatex.export_body_data_only(all_cells)

    if settings.legend.on_top:
        # zkratky parametru v legende
        if settings.legend.abbrs:
            output_str += 2 * '\t\t%\n' + legend_entries.make_abbrs()

        # mozne hodnoty parametru v legende
        if settings.legend.params:
            output_str += 2 * '\t\t%\n' + legend_entries.make_params()

        if settings.legend._cell:
            output_str += legend_entries.make_legend_entry('cell')
        elif settings.legend._setcell:
            output_str += legend_entries.make_legend_entry('setcell')

    else:
        # zkratky parametru v legende
        if settings.legend.abbrs:
            output_str += 2 * f'{settings.TABS}%\n' + legend_entries.make_abbrs()

        # mozne hodnoty parametru v legende
        if settings.legend.params:
            output_str += 2 * f'{settings.TABS}%\n' + legend_entries.make_params()

    output_str += head_str
    output_str += f'{settings.TABS[:-1]}}}\n'
    output_str += body_str

    output_str += toLatex.make_ltx_end()

    if settings.warn.rotated_text:
        settings.log_str += f'[LATEX] Možná budete potřebovat do LaTeX dokumentu přidat  ' \
                            f'\'\\usepackage{{rotating}}\'\n'
        settings.warn.rotated_text = False

    settings.log_str += f'Čas k převodu:\t {timeit.default_timer() - starttime:.4g} sekund \n'

    return output_str


def convert():
    """Hlavni cast celeho algoritmu prevodu. Zde se data ziskavaji, (modul dataGet), ziskavaji se spolecne vlastnosti, 
    a pak se tvori vystupni retezce (modul toLatex). 
    
    Returns:
        output_str (str): kompletni vystupni retzec (cela tabulka pro zkopirovani)"""
    global minx, miny, maxx, maxy, output_str, convert_range, wb, ws

    if not wb:
        return ''

    if not ws:
        return ''

    starttime = timeit.default_timer()
    all_rows = []
    all_cols = []
    what_was_shared_rows = {}

    # u okraju muze nastat situace, ze neprevadime celou tabulku ale jen jeji cast. v tom pripade muze existovat radek
    # nad prevadenym, ve kterem jsou ulozeny informace o okrajich radku ktery prevadime. analogicky pro sloupce.
    prev_row_exists = miny > 1
    prev_col_exists = minx > 1
    zeroth_row = CRow()
    zeroth_row.index = 0
    zeroth_col = CCol()
    zeroth_col.index = 0

    table_ranges_in_sheet = []
    table_styles_in_sheet = []

    # zakladni informace o formatovanych tabulkach (dxf a kde ty tabulky v listu jsou)
    for tbl in ws.tables.values():
        table_styles_in_sheet.append(table.get_table_style_from_theme(wb, ws, tbl.tableStyleInfo.name))
        table_ranges_in_sheet.append(utils.range_to_index(tbl.ref))

    # zjisteni col a row offset - tj. kde v sesitu zacinaji data. uzivatel mohl zadat jakykoli blabol.
    # funguje to tak, ze iteruju podle sloupcu tak dlouho dokud nenarazim na bunku s hodnotou. jakmile ji najdu,
    # muzu urcit row_offset (iteruju po sloupcich, tj. vnitrni for jsou radky, a sloupce jsou to vnejsi).
    # jakmile urcim row_offset, cely cyklus zrusim pomoci for ... else a spocitam col_offset

    first_row = True
    cur_col = 1
    cur_row = 1
    row_offset = 0
    row_offset_set = False

    # urceni oblasti kde zacinaji data
    for col in ws.iter_cols(max_row=maxy, max_col=maxx, min_row=miny, min_col=minx):
        cur_row = 1
        for cell in col:
            merged_cell = utils.is_merged(cell, ws)

            if not cell.value and merged_cell is None:
                cur_row += 1
                continue

            elif not cell.value and merged_cell is not None:
                merged_start = ws.cell(merged_cell.min_row, merged_cell.min_col)
                if cell.coordinate != merged_start.coordinate:
                    cur_row += 1
                    continue

            if not row_offset_set:
                if cur_row == miny:
                    row_offset = 0
                else:
                    row_offset = miny + cur_col - 2

                row_offset_set = True
                break
        else:
            cur_col += 1
            continue

        break

    col_offset = minx + cur_col - 2
    cur_row = 1

    # ziskani vlastnosti bunek
    for row in ws.iter_rows(max_row=maxy, max_col=maxx, min_row=miny, min_col=minx):
        my_row = CRow()
        cur_col = 1
        what_is_shared_row = {'shared_fgcolor': True, 'shared_bgcolor': True, 'shared_font_size': True,
                              'shared_font_flags': True, 'shared_text_halign': True, 'shared_text_valign': True,
                              'whole_borders': True}

        for cell in row:
            my_col = CCol()
            merged_cell = utils.is_merged(cell, ws)
            was_merged_empty = False

            if cell.value is None:
                # kdyz jsem te sloucene (ale prazdne) bunce nic nenastavil, tak pak nefungovaly spolecne vlastnosti
                # takze s nima budu zachazet jako se stejne formatovanymi bunkami bez textu
                if merged_cell is not None:
                    was_merged_empty = True

            merged_cell = utils.is_merged(cell, ws)

            # sloucena a obsahuje hodnotu
            if merged_cell is not None and not was_merged_empty:
                num_cols = merged_cell.size['columns']
                num_rows = merged_cell.size['rows']

                my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                      table_ranges_in_sheet, is_merged=EMergedCell.MERGED)
                my_cell.is_merged = EMergedCell.MERGED
                my_cell.merged_size = (num_cols, num_rows)

            # nesloucena
            elif not was_merged_empty:
                my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                      table_ranges_in_sheet, is_merged=EMergedCell.NOT_MERGED)

            # sloucena bez hodnoty
            elif merged_cell is not None:
                # neni pocatecni bunkou? nejaky vtipalek si ji mohl nechat prazdnou
                merged_start = ws.cell(merged_cell.min_row, merged_cell.min_col)
                if cell.coordinate == merged_start.coordinate:
                    my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                          table_ranges_in_sheet, is_merged=EMergedCell.MERGED)
                    my_cell.is_merged = EMergedCell.MERGED
                else:
                    my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                          table_ranges_in_sheet, is_merged=EMergedCell.MERGED_EMPTY)
                    my_cell.is_merged = EMergedCell.MERGED_EMPTY
            else:
                raise RuntimeError('Neznámá chyba')

            if not first_row:
                all_cols[cur_col - 1].members.append(my_cell)
            elif first_row:
                my_col.members = [my_cell]
                my_col.index = cur_col
                all_cols.append(my_col)

            my_row.members.append(my_cell)
            cur_col += 1

        if len(my_row.members) < 1:
            continue

        all_rows.append(my_row)

        # spolecne vlastnosti jednoho radku (musi je mit spolecne vsechny bunky)
        cell_to_compare = my_row.members[0]

        for my_cell in my_row.members:
            if what_is_shared_row['shared_fgcolor'] and my_cell.dxf.fgcolor != cell_to_compare.dxf.fgcolor:
                what_is_shared_row['shared_fgcolor'] = False

            if what_is_shared_row['shared_bgcolor'] and my_cell.dxf.bgcolor != cell_to_compare.dxf.bgcolor:
                what_is_shared_row['shared_bgcolor'] = False

            if what_is_shared_row['shared_font_flags'] and (my_cell.dxf.font_flags != cell_to_compare.dxf.font_flags
                                                            or my_cell.dxf.font_size != cell_to_compare.dxf.font_size):
                what_is_shared_row['shared_font_flags'] = False

            if what_is_shared_row['shared_text_valign'] and my_cell.dxf.text_valign != cell_to_compare.dxf.text_valign:
                what_is_shared_row['shared_text_valign'] = False

            if what_is_shared_row['shared_text_halign'] and my_cell.dxf.text_halign != cell_to_compare.dxf.text_halign:
                what_is_shared_row['shared_text_halign'] = False

            if what_is_shared_row['whole_borders'] and (my_cell.dxf.borders & EBorder.BOTTOM):
                if my_cell.dxf.border_styles[0] != cell_to_compare.dxf.border_styles[0] \
                         or my_cell.dxf.border_colors[0] != cell_to_compare.dxf.border_colors[0]:
                    what_is_shared_row['whole_borders'] = False
            else:
                what_is_shared_row['whole_borders'] = False

        # danemu radku nastavim to co ma prvni bunka, u tech atribut, ktere jsou spolecne.
        if what_is_shared_row['shared_fgcolor']:
            my_row.shared_fgcolor = cell_to_compare.dxf.fgcolor

        if what_is_shared_row['shared_bgcolor']:
            my_row.shared_bgcolor = cell_to_compare.dxf.bgcolor

        if what_is_shared_row['shared_font_flags']:
            my_row.shared_font_flags = cell_to_compare.dxf.font_flags
            my_row.shared_font_size = cell_to_compare.dxf.font_size

        if what_is_shared_row['shared_text_valign']:
            my_row.shared_text_valign = cell_to_compare.dxf.text_valign

        if what_is_shared_row['shared_text_halign']:
            my_row.shared_text_halign = cell_to_compare.dxf.text_halign

        if what_is_shared_row['whole_borders']:
            my_row.whole_borders = cell_to_compare.dxf.border_styles[0]
            my_row.whole_borders_clr = cell_to_compare.dxf.border_colors[0]

        my_row.index = cur_row
        if settings.conv.height:
            row_ht = ws.row_dimensions[cur_row + row_offset].height
            # korekce excel jednotek na milimetry
            my_row.vsize = row_ht if row_ht is not None else 15

        what_was_shared_rows[my_row.index] = what_is_shared_row

        all_rows[cur_row - 1] = my_row
        cur_row += 1
        first_row = False

    # "nulty" radek (1 nad prevadenou oblasti, kvuli okrajum)
    if prev_row_exists:
        cur_row = 0
        for row in ws.iter_rows(min_row=miny - 1, max_row=miny - 1, min_col=minx, max_col=maxx):
            cur_col = 1
            whole_border = True

            for cell in row:
                merged_cell = utils.is_merged(cell, ws)

                # sloucena
                if merged_cell is not None:
                    num_cols = merged_cell.size['columns']
                    num_rows = merged_cell.size['rows']

                    my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                          table_ranges_in_sheet,
                                                          is_merged=EMergedCell.MERGED_EMPTY, border_only=True)
                    my_cell.is_merged = EMergedCell.MERGED_EMPTY
                    my_cell.merged_size = (num_cols, num_rows)

                # nesloucena
                else:
                    my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                          table_ranges_in_sheet,
                                                          is_merged=EMergedCell.NOT_MERGED, border_only=True)

                zeroth_row.members.append(my_cell)
                cur_col += 1

            # spolecne vlastnosti
            cell_to_compare = zeroth_row.members[0]
            for my_cell in zeroth_row.members:
                if whole_border or not (my_cell.dxf.borders & EBorder.BOTTOM):
                    if (my_cell.dxf.border_styles[0] != cell_to_compare.dxf.border_styles[0]
                            or my_cell.dxf.border_colors[0] != cell_to_compare.dxf.border_colors[0]):
                        whole_border = False

            if whole_border:
                zeroth_row.whole_borders = cell_to_compare.dxf.border_styles[0]
                zeroth_row.whole_borders_clr = cell_to_compare.dxf.border_colors[0]

            cur_row += 1

    # spolecne vlastnosti jednoho sloupce (musi je mit spolecne vsechny bunky)
    cur_col = 1
    for my_col in all_cols:
        what_is_shared_col = {'shared_fgcolor': True, 'shared_bgcolor': True, 'shared_font_size': True,
                              'shared_font_flags': True, 'shared_text_halign': True, 'shared_text_valign': True,
                              'whole_borders': True}

        if my_col.members:
            cell_to_compare = my_col.members[0]
        else:
            continue

        for my_cell in my_col.members:
            if what_is_shared_col['shared_fgcolor'] and my_cell.dxf.fgcolor != cell_to_compare.dxf.fgcolor:
                what_is_shared_col['shared_fgcolor'] = False

            if what_is_shared_col['shared_bgcolor'] and my_cell.dxf.bgcolor != cell_to_compare.dxf.bgcolor:
                what_is_shared_col['shared_bgcolor'] = False

            if what_is_shared_col['shared_font_flags'] and (my_cell.dxf.font_flags != cell_to_compare.dxf.font_flags
                                                            or my_cell.dxf.font_size != cell_to_compare.dxf.font_size):
                what_is_shared_col['shared_font_flags'] = False

            if what_is_shared_col['shared_text_valign'] and my_cell.dxf.text_valign != cell_to_compare.dxf.text_valign:
                what_is_shared_col['shared_text_valign'] = False

            if what_is_shared_col['shared_text_halign'] and my_cell.dxf.text_halign != cell_to_compare.dxf.text_halign:
                what_is_shared_col['shared_text_halign'] = False

            if what_is_shared_col['whole_borders'] and (my_cell.dxf.borders & EBorder.RIGHT):
                if my_cell.dxf.border_styles[1] != cell_to_compare.dxf.border_styles[1] \
                         or my_cell.dxf.border_colors[1] != cell_to_compare.dxf.border_colors[1]:
                    what_is_shared_col['whole_borders'] = False
            else:
                what_is_shared_col['whole_borders'] = False

        # danemu radku nastavim to co ma prvni bunka, u tech atribut, ktere jsou spolecne.
        # (setattr zlobil, tak na nej seru. getattr totez)
        if what_is_shared_col['shared_fgcolor']:
            my_col.shared_fgcolor = cell_to_compare.dxf.fgcolor

        if what_is_shared_col['shared_bgcolor']:
            my_col.shared_bgcolor = cell_to_compare.dxf.bgcolor

        if what_is_shared_col['shared_font_flags']:
            my_col.shared_font_size = cell_to_compare.dxf.font_size
            my_col.shared_font_flags = cell_to_compare.dxf.font_flags

        if what_is_shared_col['shared_text_valign']:
            my_col.shared_text_valign = cell_to_compare.dxf.text_valign

        if what_is_shared_col['shared_text_halign']:
            my_col.shared_text_halign = cell_to_compare.dxf.text_halign

        if what_is_shared_col['whole_borders']:
            my_col.whole_borders = cell_to_compare.dxf.border_styles[1]
            my_col.whole_borders_clr = cell_to_compare.dxf.border_colors[1]

        my_col.index = cur_col
        my_col.hsize = ws.column_dimensions[utils.num_to_col(cur_col + col_offset)].width
        if my_col.hsize is None:
            my_col.hsize = 13

        # a z bunek to co maji spolecne smazu
        for my_cell in my_col.members:
            if what_is_shared_col['shared_fgcolor']:
                my_cell.dxf.fgcolor = EColor.NOT_SET

            if what_is_shared_col['shared_bgcolor']:
                my_cell.dxf.bgcolor = EColor.NOT_SET

            if what_is_shared_col['shared_font_flags']:
                my_cell.dxf.font_flags = EFontFlags.NONE
                my_cell.dxf.font_size = EFontSize.NORMAL

            if what_is_shared_col['shared_text_halign']:
                my_cell.dxf.text_halign = EHAlign.NONE

            if what_is_shared_col['shared_text_valign']:
                my_cell.dxf.valign = EVAlign.NONE

            if what_is_shared_col['whole_borders']:
                my_cell.dxf.borders ^= EBorder.RIGHT
                my_cell.dxf.border_styles[1] = EBorderStyle.NONE
                my_cell.dxf.border_colors[1] = EColor.NOT_SET

            my_cell.is_converted |= EConvertedState.CONV_COL

        cur_col += 1

    # nakonec z bunek smazu to co maji spolecne v 1 radku (neco spolecneho mohlo zustat nesmazano)
    for my_row in all_rows:
        what_is_shared_row = what_was_shared_rows[my_row.index]

        for my_cell in my_row.members:
            if what_is_shared_row['shared_fgcolor']:
                my_cell.dxf.fgcolor = EColor.NOT_SET

            if what_is_shared_row['shared_bgcolor']:
                my_cell.dxf.bgcolor = EColor.NOT_SET

            if what_is_shared_row['shared_font_flags']:
                my_cell.dxf.font_flags = EFontFlags.NONE
                my_cell.dxf.font_size = EFontSize.NORMAL

            if what_is_shared_row['shared_text_halign']:
                my_cell.dxf.text_halign = EHAlign.NONE

            if what_is_shared_row['shared_text_valign']:
                my_cell.dxf.text_valign = EVAlign.NONE

            if what_is_shared_row['whole_borders']:
                my_cell.dxf.borders ^= EBorder.BOTTOM
                my_cell.dxf.border_styles[0] = EBorderStyle.NONE
                my_cell.dxf.border_colors[0] = EColor.NOT_SET

            my_cell.is_converted |= EConvertedState.CONV_ROW

    # "nulty" sloupec
    if prev_col_exists:
        cur_col = 0
        for col in ws.iter_cols(max_row=maxy, max_col=minx - 1, min_row=miny, min_col=minx - 1):
            cur_row = 1
            whole_border = True
            for cell in col:
                merged_cell = utils.is_merged(cell, ws)

                # sloucena
                if merged_cell is not None:
                    num_cols = merged_cell.size['columns']
                    num_rows = merged_cell.size['rows']

                    my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                          table_ranges_in_sheet,
                                                          is_merged=EMergedCell.MERGED_EMPTY, border_only=True)
                    my_cell.is_merged = EMergedCell.MERGED_EMPTY
                    my_cell.merged_size = (num_cols, num_rows)

                # nesloucena
                else:
                    my_cell = dataGet.get_cell_properties(wb, ws, cell, cur_row, cur_col, table_styles_in_sheet,
                                                          table_ranges_in_sheet,
                                                          is_merged=EMergedCell.NOT_MERGED, border_only=True)

                zeroth_col.members.append(my_cell)

                # spolecne vlastnosti
                cell_to_compare = zeroth_col.members[0]
                for my_cell in zeroth_col.members:
                    if whole_border or not (my_cell.dxf.borders & EBorder.RIGHT):
                        if (my_cell.dxf.border_styles[1] != cell_to_compare.dxf.border_styles[1]
                                or my_cell.dxf.border_colors[1] != cell_to_compare.dxf.border_colors[1]):
                            whole_border = False

                if whole_border:
                    zeroth_col.whole_borders = cell_to_compare.dxf.border_styles[1]
                    zeroth_col.whole_borders_clr = cell_to_compare.dxf.border_colors[1]

                cur_row += 1

    if settings.warn.wrong_color > 1:
        settings.log_str += f'[BARVA] V tabulce se vyskytují nepřesné barvy. ' \
                            f'Zvažte použití Excel motivu vhodného pro ninecolors. \n'
        settings.warn.wrong_color = False

    if settings.warn.uuline:
        settings.log_str += f'[LATEX] Možná budete potřebovat do LaTeX dokumentu přidat ' \
                            f'\'\\usepackage{{ulem}}\'\n'
        settings.warn.uuline = False

    # tvorba a tisk koncoveho vystupu
    output_str = toLatex.make_ltx_begin()

    rowspec = toLatex.make_rowspec(all_rows)
    colspec = toLatex.make_colspec(all_cols)

    if rowspec:
        if not settings.legend.on_top and settings.legend._rowspec:
            output_str += legend_entries.make_legend_entry('rowspec')

        output_str += f'{settings.TABS}rowspec = {{{rowspec}}},\n'
    if colspec:
        if not settings.legend.on_top and settings.legend._colspec:
            output_str += legend_entries.make_legend_entry('colspec')

        output_str += f'{settings.TABS}colspec = {{{colspec}}},\n'

    ltx_all_rows_dict = toLatex.make_rows_in_head(all_rows, EConvertedState.CONV_ROW, colspec, rowspec)
    ltx_all_cols_dict = toLatex.make_cols_in_head(all_cols, EConvertedState.CONV_COL, colspec, rowspec)

    ltx_all_hlines_dict = toLatex.make_hlines_in_head([zeroth_row] + all_rows)
    ltx_all_vlines_dict = toLatex.make_hlines_in_head([zeroth_col] + all_cols)

    output_str += toLatex.export_head(all_rows, ltx_all_rows_dict, ltx_all_cols_dict,
                                      ltx_all_hlines_dict, ltx_all_vlines_dict, colspec, rowspec)

    if settings.ltx.table_type == ELtxTableType.LONG:
        output_str += toLatex.longtblr_head()

    # zkratky parametru v legende
    if settings.legend.abbrs:
        output_str += 2 * f'{settings.TABS}%\n' + legend_entries.make_abbrs()

    # mozne hodnoty parametru v legende
    if settings.legend.params:
        output_str += 2 * f'{settings.TABS}%\n' + legend_entries.make_params()

    output_str += f'{settings.TABS[:-1]}}}\n'

    output_str += toLatex.export_body(all_rows, colspec, rowspec)

    output_str += toLatex.make_ltx_end()

    if settings.warn.rotated_text:
        settings.log_str += f'[LATEX] Možná budete potřebovat do LaTeX dokumentu přidat  ' \
                            f'\'\\usepackage{{rotating}}\'\n'
        settings.warn.rotated_text = False

    settings.log_str += f'Čas k převodu:\t {timeit.default_timer() - starttime:.5g} sekund \n'
    a = output_str
    return output_str


if __name__ == "__main__":
    main()
