Page 1 of 1

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

Posted: Sun May 10, 2020 4:30 pm
by ProMiNick
editbox (структурное представление и константы)

во первых структура которой представлен примитив пользовательского интерфейса (далее UI примитив)
(структура данного UI примитива представлена на состояние в ревизии 7906, в последствии она может измениться/расширится)

Code: Select all

struct EDIT_BOX          
  width              dd ?
  left               dd ?
  top                dd ?
  color              dd ?
  shift_color        dd ?
  focus_border_color dd ?
  blur_border_color  dd ?
  text_color         dd ?
  max                dd ?
  text               dd ?
  mouse_variable     dd ?
  flags              dd ?
  size               dd ?
  pos                dd ?
  offset             dd ?
  cl_curs_x          dw ?
  cl_curs_y          dw ?
  shift              dw ?
  shift_old          dw ?
  height             dd ?
  char_width         dd ?
ends                     
left, top, width и height - это координаты и длины по горизонтали и вертикали UI примитива в пикселях (притом значение height на единицу меньше чем реальная высота, также оно на 4 пикселя больше высоты шрифта)
color, shift_color, focus_border_color, blur_border_color, text_color - это цвета UI примитива
  • - color - цвет для заливки фона клиентской области (когда UI примитив в состоянии отличном от ED_DISABLED, о состояниях ниже)
  • - shift_color - цвет для заливки фона части клиентской области (фона выделения). Выделение представляет собой область ограниченную символами в позиции каретки (pos) с одной стороны и позиции выделения (shift) с другой.
    (СКОРРЕКТИРУЙТЕ МЕНЯ ЕСЛИ Я НЕ ПРАВ: возможно выделение ограничено shift и shift_old, а я сделал поспешный вывод).
  • - focus_border_color, blur_border_color - соответственно цвета 1 пиксельной границы для UI примитива когда он в фокусе(т.е. установлен ED_FOCUS) или наоборот не в фокусе (сброшен ED_FOCUS)
  • - text_color - комплексное поле, 3 младших байта которого представляют цвет шрифта UI примитива, в то время как в старшем байте закодирован размер этого шрифта.
    Если в байте размера установлен бит $10 - то используется большой шрифт (соотношением 8х16), иначе малый шрифт (соотношением 6х9).
    Биты 1,2,4 в байте размера - представляют собой множитель от 1 до 8 (множитель на 1 больше, чем число закодированное этими битами)
max - максимальная длина текста в символах, которую воспринимает данный UI примитив (должно быть +2 резервных символа)
text - указатель на строку текста обрабатываемую UI примитивом
mouse_variable - какая то фигня непонятной природы выполняющая роль идентификатора UI примитива (то ли для идентификации его в списке других сходных примитивов родительского окна, то ли для идентификации его относительно того, в каком именно потоке того же самого приложения он запущен)
flags - флаги текущего сотстояния UI примитива:
  • - ED_PASS - используется для ввода пароля (т.е. каждый введенный символ скрывается сразу после того как он был отображен при вводе)

    Code: Select all

    ED_PASS = $0001
  • - ED_FOCUS - находится в фокусе

    Code: Select all

    ED_FOCUS = $0002
  • - ED_SHIFT - флаг соответствует состоянию клавиши SHIFT (если установлен - клавиша нажата, иначе - не нажата)

    Code: Select all

    ED_SHIFT = $0004
  • - ED_SHIFT_ON (он же ED_SHIFT_HOLDING) - флаг информирует удерживается ли клавиша SHIFT (если установлен - клавиша удерживалась, иначе - нет)

    Code: Select all

    ED_SHIFT_ON = $0008
  • - ED_SHIFT_BAC - флаг информирует есть ли выделение (непонятно флаг информирует о любом выделении или только о выделении с помощью клавиши SHIFT)

    Code: Select all

    ED_SHIFT_BAC = $0010
  • - ED_LEFT_FL - флаг неизвестной природы, если он установлен то что-то слева, иначе - это что-то справа

    Code: Select all

    ED_LEFT_FL = $0020
  • - ED_OFFSET_FL - флаг информирует о том, включает ли отображаемый диапазон символов текста позицию каретки (если сброшен - каретка за пределами отображаемой области)

    Code: Select all

    ED_OFFSET_FL = $0040
  • - ED_INSERT - флаг неизвестной природы, требуется дальнейшее изучение исходников

    Code: Select all

    ED_INSERT = $0080
  • - ED_MOUSE_ON (он же ED_LMB_HOLDING) - флаг информирует удерживается ли левая клавиша мыши (если установлен - клавиша удерживалась, иначе - нет)

    Code: Select all

    ED_MOUSE_ON = $0100
  • - ED_CTRL_ON (он же ED_CTRL_HOLDING) - флаг информирует удерживается ли клавиша CTRL (если установлен - клавиша удерживалась, иначе - нет)

    Code: Select all

    ED_CTRL_ON = $0200
  • - ED_ALT_ON (он же ED_ALT_HOLDING) - флаг информирует удерживается ли клавиша ALT (если установлен - клавиша удерживалась, иначе - нет)

    Code: Select all

    ED_ALT_ON = $0400
  • - ED_DISABLED - отключена обработка взаимодействия с пользователем, вся кроме отображения самого UI примитива (если флаг сброшен - наоборот взаимодействует с пользователем)

    Code: Select all

    ED_DISABLED= $0800
  • - ED_ALWAYS_FOCUS - флаг информирует о том, что UI примитив не теряет фокус, т.е. при потере фокуса его внутренние состояния (позиция каретки, позиция диапазона отображения, позиция выделения) не сбрасываются в состояния по умолчанию

    Code: Select all

    ED_ALWAYS_FOCUS= $4000
  • - ED_FIGURE_ONLY - для ввода допускаются только цифры (допущение при копировании и вставке также должны допускаться только цифры)

    Code: Select all

    ED_FIGURE_ONLY= $8000
size - текущая длина текста в символах
pos - текущая позиция каретки в символах относительно начала текста
offset - текущая позиция диапазона отображения (позиция крайнего левого отображаемого символа) в символах относительно начала текста. Необходима для случаев когда длина текста больше, чем длина текста который может быть отображен
cl_curs_x - х координата в пикселях вдоль которой проходит линия каретки
cl_curs_y - верхняя координата в пикселях линии каретки
shift - текущая позиция выделения в символах относительно начала текста
shift_old - какая то ахинея для внутренних нужд (выделение издавна это диапазон символов между позицией каретки и позицией выделения, но тут зачем то еще это незнамо-что.
char_width - ширина шрифта в пикселях

чтобы у тех, кто будет читать и разбираться во внутренностях исходников box_lib в голове не образовалось каши (а вернее с точностью до наоборот) доблестные разработчики box_lib обозначили поля вышеописанной структуры через приставку "ed_", а флаги тоже обозначили в малом регистре - так чтобы они выглядели как близнецы братья и сам черт сломал ногу.

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

Posted: Sun May 10, 2020 7:37 pm
by ProMiNick
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     
              один или несколько слоев рисования
      @@:

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

Posted: Mon May 11, 2020 12:27 am
by ProMiNick
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
    собственно само рисование линии

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

Posted: Mon May 11, 2020 4:00 am
by ProMiNick
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 - согласно состояния нажатия одноименных клавиш (не зависимо правой или левой)





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

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

Posted: Wed May 20, 2020 4:21 pm
by Siemargl
Посмотри в С-обертках бокслиба, там есть комментарии

http://websvn.kolibrios.org/listing.php ... 69386d5564