Документация по кишкам box_lib.obj

Everything you can't fit into other forums
  • editbox (функциональное представление и интерфейс взаимодействия с пользователем)

    Функция edit_box
    Примечания:
    • (она же edit_box.draw),
    • основная экспортируемая функция, как и все прочие экспортируемые функции box_lib.obj принимает 1 параметр - это указатель на структуру связанную с UI примитивом реализованным в box_lib.obj (в частности с editbox`ом).
    Что делает:
    • прежде всего эта функция рассчитывает размеры символа (т.е. обрабатывает старший байт (он же байт размера шрифта) комплексного поля EDIT_BOX.text_color) и заносит результат (ширину и высоту шрифта) в поля EDIT_BOX.char_width и EDIT_BOX.height соответственно.
    • с этого момента все габариты UI примитива становятся известными и можно слой за слоем рисовать содержимое примитива:
      1. рисуется рамка посредством вызова

        Code: Select all

        call edit_box.draw_border
      2. последующие шаги отмечены меткой

        Code: Select all

        edit_box.draw_bg_cursor_text:
        так чтоб их можно было осуществить из других функций минуя предварительный расчет размеров шрифта и рисование рамки
        • 2.1. рассчитывается позиция диапазона текста, который будет отображен в клиентской области, посредством вызова

          Code: Select all

          call edit_box.check_offset
          2.2. происходит заливка клиентской области, посредством вызова

          Code: Select all

          call edit_box.draw_bg
          2.3. происходит заливка выделенной области, посредством вызова

          Code: Select all

          call edit_box.draw_shift
          2.4. последующие шаги отмечены меткой

          Code: Select all

          edit_box.draw_cursor_text:
          так чтоб их можно было осуществить из других функций минуя предварительный расчет размеров шрифта, рисование рамки и фона, рассчет позиции диапазона отображаемого текста
          • 2.4.1. происходит рисование самого текста, посредством вызова

            Code: Select all

            call edit_box.draw_text
            2.4.2. происходит рисование каретки, посредством вызова

            Code: Select all

            call edit_box.draw_cursor
        любой из подпунктов пункта 2 может производится по условию, например, если только текущий UI примитив в фокусе

        Code: Select all

                test    word ed_flags,ed_focus ; test    [edi+EDIT_BOX.flags],ED_FOCUS
                jz      @F     
                один или несколько слоев рисования
        @@:
    Last edited by ProMiNick on Mon May 11, 2020 2:21 am, edited 2 times in total.
  • editbox (функциональное представление и интерфейс взаимодействия с пользователем)

    Функция edit_box.draw_border
    Примечания:
    • вспомогательная функция, как и все прочие вспомогательные функции ожидает в регистре (почемуто для этих целей выбран edi) - указатель на структуру связанную с UI примитивом реализованным в box_lib.obj (в частности с editbox`ом).
    Что делает:
    • рисует однопиксельную рамку по границе UI примитива с учетом того что в EDIT_BOX.height на 1 меньше чем высота этого примитива.
      цвет всей рамки однородный и выбирается в зависимости от того в фокусе ли UI примитив или нет.
      для состояния в фокусе цвет рамки берется из EDIT_BOX.focus_border_color, иначе из EDIT_BOX.blur_border_color
    Функция edit_box.check_offset
    Примечания:
    • вспомогательная функция, ...то же, что и для предыдущей
    Что делает:
    • проверяет помещается ли позиция каретки EDIT_BOX.pos в отображаемый диапазон, на начальную позицию которого ссылается EDIT_BOX.offset.
      Если помещается устанавливает в EDIT_BOX.flags флаг ED_OFFSET_FL,
      если не помещается обрабатываются 4 случая:
      1. EDIT_BOX.pos = 0, тогда EDIT_BOX.offset тоже приравнивается к 0
      2. 0 < EDIT_BOX.pos < EDIT_BOX.offset, тогда EDIT_BOX.offset будет уменьшен на 8
        для расчетов случаев 3 и 4 используется еще одна вспомогательная функция edit_box.get_n, рассчитывающая число отображаемых символов
      3. EDIT_BOX.pos = EDIT_BOX.size, тогда EDIT_BOX.offset будет равен EDIT_BOX.size-результат от edit_box.get_n
        (т.е. если каретка находится после последнего символа текста, то отображаемый диапазон будет сдвинут так, что последним отображаемым символом будет последний символ текста
      4. (EDIT_BOX.offset+результат от edit_box.get_n) < EDIT_BOX.pos < EDIT_BOX.size, тогда EDIT_BOX.offset будет увеличен на 8
      после установки нового EDIT_BOX.offset во всех этих 4 случаях - флаг ED_OFFSET_FL сбрасывается
    Функция edit_box.get_n
    Примечания:
    • вспомогательная функция, ...то же, что и для предыдущей
    Что делает:
    • элементарно рассчитывает число отображаемых символов: как уменьшенное на 4 (2 из них рамка, еще 2 - под крайние положения каретки) значение ширины UI примитива EDIT_BOX.width разделеное на ширину шрифта EDIT_BOX.char_width
    Функция edit_box.draw_bg
    Примечания:
    • вспомогательная функция, ...то же, что и для предыдущей
    Что делает:
    • заливает клиентскую область UI примитива (все его пространство за исключением 1 пиксельной рамки нарисованной ранее).
      цвет заливки однородный и выбирается в зависимости от того отключен ли UI примитив или нет.
      для отключенного состояния цвет рамки $CACACA, иначе берется из EDIT_BOX.color
    Функция edit_box.draw_shift
    Примечания:
    • вспомогательная функция, ...то же, что и для предыдущей
    Что делает:
    • если установлен флаг наличия выделенной области ED_SHIFT_BAC то заливает выделенную область UI примитива.
      (От себя: в больших ОС в роли такого флага обычно выступает неравенство позиций каретки EDIT_BOX.pos и выделения EDIT_BOX.shift)
      процедура заливки представляет собой вызов

      Code: Select all

      call edit_box_key.sh_cl_
      с прробросом в него в регистрах цвета заливки EDIT_BOX.shift_color и позиции выделения EDIT_BOX.shift. (О самой edit_box_key.sh_cl_ много много позже)
    Функция edit_box.draw_text
    Примечания:
    • вспомогательная функция, ...то же, что и для предыдущей
    Что делает:
    • будет рисовать текст начиная с позиции отображаемой области EDIT_BOX.offset в количестве символов (EDIT_BOX.size-EDIT_BOX.offset), но не превышающим число отображаемых символов (возвращаемое вызовом edit_box.get_n).
      Рисовать, конечно, будет только если количество рисуемых символов больше 0.
      Цвет для отрисовки (включая размер шрифта закодированный в цвет) берется из EDIT_BOX.text_color
      Что примечательно текст будет рисоваться с отступом от габаритных размеров слева на 2 пикселя (1 из которых рамка, 2й - отступ для каретки, если она будет перед первым отображаемым символом) и сверху на 3 пикселя (1 из которых опять рамка и 2 других пикселя походу просто отступ цвета клиентской области для эстетичности).
      В самую последнюю очередь перед отрисовкой проверяется флаг ED_PASS.
      Если он сброшен рисуется текст как планировалось, иначе вместо текста рисуются парольные символы ("*") в том же количестве
    Группа функций по работе с кареткой edit_box.clear_cursor и edit_box.draw_cursor
    Примечания:
    • вспомогательная функция, ...то же, что и для предыдущей
    Что делает edit_box.clear_cursor:
    • рисует каретку по координатам EDIT_BOX.cl_curs_x и EDIT_BOX.cl_curs_y ранее рассчитанным функцией edit_box.draw_cursor вот только рисует он ее цветом получаемым в регистре (скорее всего цветом фона EDIT_BOX.color)
    Что делает edit_box.draw_cursor:
    • рассчитывает координаты EDIT_BOX.cl_curs_x и EDIT_BOX.cl_curs_y и рисует каретку по этим координатам цветом текста EDIT_BOX.text_color
      EDIT_BOX.cl_curs_x рассчитывается как (EDIT_BOX.pos-EDIT_BOX.offset)*EDIT_BOX.char_width+EDIT_BOX.left+1
      EDIT_BOX.cl_curs_y рассчитывается как EDIT_BOX.top+2
    Общее действие:
    • нижняя координата каретки рассчитывается как EDIT_BOX.cl_curs_y+EDIT_BOX.height-3
      собственно само рисование линии
    Last edited by ProMiNick on Mon May 11, 2020 4:06 am, edited 5 times in total.
  • editbox (функциональное представление и интерфейс взаимодействия с пользователем)

    Функция edit_box_key
    Примечание:
    • экспортируемая функция, как и все прочие экспортируемые функции box_lib.obj принимает 1 параметр - это указатель на структуру связанную с UI примитивом реализованным в box_lib.obj (в частности с editbox`ом).
    Что делает:
    • Прежде чем клавиши будут обрабатываться проверяются: находится ли UI примитив в фокусе (установлен флаг ED_FOCUS), того что UI примитив не отключен (т.е. сброшен флаг ED_DISABLED) и отсутствие удерживаемой левой клавиши мыши (сброшен флаг ED_MOUSE_ON, т.к. обработка событий при нажатой кнопке мыши происходит под другой функцией edit_box_mouse)
      Затем после успешных проверок предыдущего этапа проверяется состояние контрольных клавиш, при нажатых LWin($200) или RWin($400) - всяческая дальнейшая обработка клавишь не производится, в противном случае выставляются флаги ED_SHIFT_ON, ED_CTRL_ON и ED_ALT_ON - согласно состояния нажатия одноименных клавиш (не зависимо правой или левой)





    (сохранил, прервался - НЕ КОММЕНТИРОВАТЬ ПОКА, я еще продолжу и буду редактировать этот пост)
  • Посмотри в С-обертках бокслиба, там есть комментарии

    http://websvn.kolibrios.org/listing.php ... 69386d5564
  • Who is online

    Users browsing this forum: Google [Bot] and 13 guests