Palitra(branch): UI and code refactoring. Fix a lot of issues (#154)

- Fixed the ID of the buttons, made the window always on top;
- Removed the visible rectangle when clicking on the palette;
- Fixed the position of the picker and palette buttons.

Reviewed-on: KolibriOS/kolibrios#154
Reviewed-by: Max Logaev <maxlogaev@proton.me>
Co-authored-by: leency <lipatov.kiril@gmail.com>
Co-committed-by: leency <lipatov.kiril@gmail.com>
This commit is contained in:
Leency authored and Max Logaev committed 2025-03-17 10:54:19 +01:00
1 parent f1e958af41
commit 72196f42de
3 files changed
+96 -133

No files matched your search

+29 -19
View File
@@ -1,12 +1,12 @@
draw_palitra:
; Функция 13 - нарисовать прямоугольник
;mcall SF_DRAW_RECT, 110 shl 16+148, 9 shl 16+148, [sc.work]
;mcall SF_DRAW_RECT, PALITRA_XW, PALITRA_YW, [sc.work]
cmp [renmode],2
cmp [renmode],MODE_PIPET
je cyrcle_draw
;cmp [renmode],1
;je picker_draw
cmp [renmode],0
cmp [renmode],MODE_PALITRA
je sheme_draw
ret
@@ -39,6 +39,15 @@ draw_palitra:
;mov ebx,109*65536+150
;mov ecx, 10*65536+150
;mcall
PIPET_CELLW = 13
PIPET_AREA_W = PIPET_CELLW*PIPET_CELL_COUNT_X
PIPET_AREA_H = PIPET_CELLW*PIPET_CELL_COUNT_Y
PIPET_CELL_COUNT_X = 15
PIPET_CELL_COUNT_Y = 13
PIPET_SELECTED_X = PIPET_AREA_W/2+PALITRA_X
PIPET_SELECTED_Y = PIPET_AREA_H/2+DRAWY+2
call mouse_local ; получаем координаты мыши относительно окна
mov ecx, [mouse_x] ; заносим в регистр
mov edx, [mouse_y] ; заносим в регистр
@@ -52,38 +61,39 @@ draw_palitra:
call desktop_get
call mouse_global
mov ebx,112*65536+11
mov ebx,PALITRA_X*65536+PIPET_CELLW
mov esi,0 ; counter=8
circle_loop:
mov ecx, 10*65536+11
mov ecx, (DRAWY+1)*65536+PIPET_CELLW
mov edi,0
circle_loop2:
call circle_pixel_read
mcall SF_DRAW_RECT
add ecx,11 shl 16
add ecx,PIPET_CELLW shl 16
inc edi
cmp edi,13
cmp edi,PIPET_CELL_COUNT_Y
jne circle_loop2
add ebx,11 shl 16
add ebx,PIPET_CELLW shl 16
inc esi
cmp esi,13
cmp esi,PIPET_CELL_COUNT_X
jne circle_loop
mcall SF_DRAW_RECT, 177*65536+13, 76*65536+13, 0
mcall SF_DRAW_RECT, <PIPET_SELECTED_X-10, PIPET_CELLW+4>, <PIPET_SELECTED_Y-10, PIPET_CELLW+4>, 0xFF0000
mov ecx, [mouse_x]
mov edx, [mouse_y]
inc ecx
inc ecx
inc edx
mov ebx, edx
imul ebx, [desctop_w]
add ebx, ecx
mcall SF_GET_PIXEL
mov edx,eax
mcall SF_DRAW_RECT, 178*65536+11, 77*65536+11
mcall SF_DRAW_RECT, <PIPET_SELECTED_X-8, PIPET_CELLW>, <PIPET_SELECTED_Y-8, PIPET_CELLW>
ret
end_cyrcle_draw:
mcall SF_DRAW_RECT, 111*65536+145, 9*65536+145, 0x666666
mcall SF_DRAW_RECT, <PALITRA_X-1, PIPET_AREA_W+2>, <DRAWY, PIPET_AREA_H+2>, [sc.work_graph]
ret
circle_pixel_read:
@@ -124,20 +134,20 @@ draw_palitra:
sheme_draw:
mov eax,SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник
mov edx,0x222222 ; цвет
mov ecx, palitra_yw ; Начальные координаты по y [к-та y]*65536 + [размер]
mov ecx, PALITRA_YW ; Начальные координаты по y [к-та y]*65536 + [размер]
mov esi,2 ; Счетчик линий подложек
re_draw:
mov ebx,palitra_xw ; Начальные координаты по x [к-та x]*65536 + [размер]
mov ebx,PALITRA_XW ; Начальные координаты по x [к-та x]*65536 + [размер]
mov edi,2 ; Счетчик количества подложек
for_fon_loop:
int 0x40 ; Прерывание
add ebx,(palitra_w+2) shl 16 ; Смещаем положение линии по х
add ebx,(PALITRA_W+2) shl 16 ; Смещаем положение линии по х
dec edi ; Уменьшаем счетчик кнопок
cmp edi,0 ; Сравниваем с нулем
jnz for_fon_loop ; Если не ноль то в начало цикла
dec esi ; Уменьшаем его
cmp esi,0 ; Сравниваем с нулем
mov ecx,(palitra_w+DRAWY+3) shl 16+palitra_w ; Начальные координаты по y [к-та y]*65536 + [размер]
mov ecx,(PALITRA_W+DRAWY+3) shl 16+PALITRA_W ; Начальные координаты по y [к-та y]*65536 + [размер]
jnz re_draw ; Если не ноль то в начало цикла
;.................................................................................................
@@ -146,12 +156,12 @@ draw_palitra:
mov eax,SF_DRAW_RECT ; Функция 13 - нарисовать прямоугольник
mov edx,0x0FFFFFFF ; цвет
mov esi,4 ; Счетчик количества абзацев (#4,8)
mov ebx,(palitra_x-CELLW-3) shl 16+CELLW ; Начальные координаты по x [к-та x]*65536 + [размер]
mov ebx,(PALITRA_X-CELLW-3) shl 16+CELLW ; Начальные координаты по x [к-та x]*65536 + [размер]
for_abz:
;;push esi ; Сохраняем значение счетчика линий в стек
cmp esi,2
jne x2_line
mov ebx,(palitra_x-CELLW-3) shl 16+CELLW
mov ebx,(PALITRA_X-CELLW-3) shl 16+CELLW
x2_line:
add ebx,3 shl 16 ; Смещаем положение линии по x
mov edi,8 ; Счетчик количества кнопок в строке
@@ -161,7 +171,7 @@ draw_palitra:
mov ecx, (1-CELLW/3) shl 16+CELLW ; Начальные координаты по y [к-та y]*65536 + [размер]
cmp esi,2
jg y2_line ; Если больше 4 то игнорим
mov ecx,(palitra_w+4-(CELLW/3)) shl 16+CELLW
mov ecx,(PALITRA_W+4-(CELLW/3)) shl 16+CELLW
y2_line:
add ebx,(CELLW+1) shl 16 ; Смещаем положение линии по x
for_loop:
+58 -101
View File
@@ -64,44 +64,46 @@
;****************************************************************************************************|
; ЗАГОЛОВОК ИСПОЛНЯЕМОГО ФАЙЛА ПРИЛОЖЕНИЯ ДЛЯ КОЛИБРИ ОС |
;----------------------------------------------------------------------------------------------------/
use32
org 0
db 'MENUET01'
dd 1,START,I_END,I_MEM,stacktop,params,sys_path
use32
org 0
db 'MENUET01'
dd 1,START,I_END,I_MEM,stacktop,params,sys_path
include '../../../macros.inc'
include '../../../proc32.inc'
include '../../../KOSfuncs.inc'
include '../../../dll.inc'
include '../../../macros.inc'
include '../../../proc32.inc'
include '../../../KOSfuncs.inc'
include '../../../dll.inc'
include 'draw_sliders.inc'
include 'draw_utils.inc'
include 'draw_palitra.inc'
include 'draw_sliders.inc'
include 'draw_utils.inc'
include 'draw_palitra.inc'
MODE_PALITRA = 0
MODE_PIPET = 1
WIN_W = 374 ; ширина окна
WIN_H = 251 ; высота окна
WIN_X = 250 ; координата х окна
WIN_Y = 190 ; координата у окна
WIN_W = 374 ; ширина окна
WIN_H = 251 ; высота окна
WIN_X = 250 ; координата х окна
WIN_Y = 190 ; координата у окна
Left_Border=4
SliderPanel_W = 110
DRAWY = 9
Left_Border=4
SliderPanel_W = 110
DRAWY = 9
CELLW = 11; 11 ; not used yet, but has to be :)
CELLW = 11; 11 ; not used yet, but has to be :)
ICONX = WIN_W - 39
ICONS = 18 ; icon size
SLIDEW = 25
ICONX = WIN_W - 39
ICONS = 18 ; icon size
SLIDEW = 25
palitra_x = Left_Border+SliderPanel_W+12
palitra_w = CELLW*(8)+8+1
palitra_xw = palitra_x shl 16 + palitra_w
palitra_yw = DRAWY shl 16 + palitra_w
PALITRA_X = Left_Border+SliderPanel_W+12
PALITRA_W = CELLW*(8)+8+1
PALITRA_XW = PALITRA_X shl 16 + PALITRA_W
PALITRA_YW = DRAWY shl 16 + PALITRA_W
START:
mcall SF_SYS_MISC,SSF_HEAP_INIT ; инициализация кучи
mcall SF_SYSTEM, SSF_WINDOW_BEHAVIOR, SSSF_SET_WB, -1, 1 ;always on top
mcall SF_SYS_MISC,SSF_HEAP_INIT ; инициализация кучи
mcall SF_SYS_MISC, SSF_MEM_OPEN, i18_name
mov [icons18], eax
mcall SF_SYS_MISC, SSF_MEM_OPEN, i18bg_name
@@ -138,7 +140,7 @@ key: ;
;end_key
mouse:
cmp [renmode],2
cmp [renmode],MODE_PIPET
jne left
call cyrcle_draw
jmp center
@@ -171,7 +173,7 @@ button:
cmp ah, 12 ; если нажата кнопка NEXT
jne next_bg ; выходим
inc [pnext] ; увеличиваем при нажатии номер палитры
mov [renmode],0 ; включаем цветовые схемы
mov [renmode],MODE_PALITRA ; включаем цветовые схемы
mov eax,[pnext] ; заносим значение в еах
cmp al,6 ; сравниваем с заявленным количеством палитр
jne next_redraw ; если не больше максимума то на вызов отрисовки
@@ -181,19 +183,19 @@ button:
call draw_palitra ; РИСУЕМ ПАЛИТРУ
jmp still ; Уходим на ожидание другого события
next_bg:
cmp ah, 14 ; Кнопка BACKGROUND
cmp ah, 14 ; Кнопка GRADIENT
jne next_bg2 ; если не нажата то выходим
call set_background ; иначе устанавливаем фон
jmp still ; и на ожидание события
next_bg2:
cmp ah, 16 ; Кнопка BACKGROUND
cmp ah, 16 ; Кнопка NOISY
jne circle_bg ; если не нажата то выходим
call set_background2 ; иначе устанавливаем фон
jmp still ; и на ожидание события
circle_bg:
cmp ah, 15 ; Кнопка Круговая палитра
jne next_end ; если не нажата то выходим
mov [renmode],2 ; включаем отрисовку круговой палитры
mov [renmode],MODE_PIPET ; включаем отрисовку круговой палитры
call draw_palitra ; РИСУЕМ ПАЛИТРУ
jmp still ; и на ожидание события
next_end:
@@ -252,15 +254,10 @@ button:
; ГЛАВНЫЙ МОДУЛЬ ОТРИСОВКИ ОКНА И ЭЛЕМЕНТОВ ПРИЛОЖЕНИЯ |
;----------------------------------------------------------------------------------------------------/
draw_main:
; функция 12: означает, что будет рисоваться окно
mcall SF_REDRAW,SSF_BEGIN_DRAW
; Функция 48 - стили отображения окон
mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
; Функция 48 - стили отображения окон
mcall SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
mov ecx,eax ; Запоминаем высоту скина
mov ecx,eax ; Запоминаем высоту скина
mov edi,[runmode]
cmp edi,2
@@ -288,10 +285,10 @@ draw_main:
call draw_palitra ; РИСУЕМ ПАЛИТРУ
call draw_result ; РИСУЕМ РЕЗУЛЬТАТ
mcall SF_DEFINE_BUTTON, <palitra_x,palitra_w*2+1 > , <DRAWY,palitra_w*2+2>, 7+BT_HIDE ; palitra
mcall SF_DEFINE_BUTTON, <PALITRA_X,PALITRA_W*2+1 > , <DRAWY,PALITRA_W*2+2>, 7+BT_HIDE+BT_NOFRAME ; palitra
inc edx
mcall , <10,22>, <56,128> ; Рисуем невидимую кнопку под слайдером red
mcall , <10,22>, <54,136> ; Рисуем невидимую кнопку под слайдером red
add ebx,25*65536 ; Добавляем
inc edx ; ID = 9
int 0x40 ; Рисуем невидимую кнопку под слайдером green
@@ -303,103 +300,64 @@ draw_main:
int 0x40 ; Рисуем невидимую кнопку под слайдером alpha
; Функция 8 - определить/удалить кнопку (СМЕНА ЦВЕТА)
mcall , <13,19>, <20,18>, 0x0D+BT_HIDE
mcall , <10,22>, <16,20>, 13+BT_HIDE
call draw_bottom_panel
call draw_left_panel
call draw_right_panel
; функция 12: означает, что будет рисоваться окно
mcall SF_REDRAW,SSF_END_DRAW
ret
;#___________________________________________________________________________________________________
;****************************************************************************************************|
; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ |
;----------------------------------------------------------------------------------------------------/
;#_______________________________________________________
;*******************************************************|
; БЛОК ВСПОМОГАТЕЛЬНЫХ ПРОЦЕДУР И ФУНКЦИЙ ПРИЛОЖЕНИЯ | --------------------------------------------------------/
;------------------------------------------------------------------------------------------------+
draw_left_panel: ; Отрисовка боковой панели SL97: На самом деле правой.
draw_right_panel:
;.................................................................................................
; button_next_colorsheme
mcall SF_DEFINE_BUTTON, <ICONX,ICONS+3>, <DRAWY,ICONS+3>, 12+BT_HIDE
; palitra button ; ID = 14
mcall , ,(DRAWY+150) shl 16 + ICONS+3, 14+BT_HIDE
mcall , ,(DRAWY+141) shl 16 + ICONS+3, 14+BT_HIDE
; pipet button ; ID = 15
mcall , , (DRAWY+150) shl 16 + ICONS+3, 15+BT_HIDE
mcall , , (DRAWY+174) shl 16 + ICONS+3, 15+BT_HIDE
mov ebx,[icons18bg]
add ebx,ICONS*ICONS*4*53
mcall SF_PUT_IMAGE_EXT, ebx, <ICONS,ICONS>, <ICONX+2,DRAWY+2>, 32, 0, 0
add ebx,ICONS*ICONS*4*(39-53)
mov edx,(ICONX+2)*65536+WIN_H-90
mov edx,(ICONX+2)*65536+DRAWY+174+2
mcall
mov ebx,[icons18]
add ebx,ICONS*ICONS*4*(53-1)
sub edx,40
mov edx,(ICONX+2)*65536+DRAWY+141+2
mcall
stdcall DrawDeepRectangle, ICONX-1, DRAWY-1, ICONS+5, ICONS+5, [sc.work_graph], [sc.work_graph]
stdcall DrawDeepRectangle, ICONX, DRAWY, ICONS+3, ICONS+3, [sc.work_light], [sc.work_dark]
stdcall DrawDeepRectangle, ICONX-1, DRAWY+109, ICONS+5, ICONS+5, [sc.work_graph], [sc.work_graph]
stdcall DrawDeepRectangle, ICONX, DRAWY+110, ICONS+3, ICONS+3, [sc.work_dark], [sc.work_light]
stdcall DrawDeepRectangle, ICONX+1, DRAWY+111, ICONS+1, ICONS+1, 0xFFFfff, 0xFFFfff
stdcall DrawDeepRectangle, ICONX-1, DRAWY+140, ICONS+5, ICONS+5, [sc.work_graph], [sc.work_graph]
stdcall DrawDeepRectangle, ICONX, DRAWY+141, ICONS+3, ICONS+3, [sc.work_dark], [sc.work_light]
stdcall DrawDeepRectangle, ICONX+1, DRAWY+142, ICONS+1, ICONS+1, 0xFFFfff, 0xFFFfff
stdcall DrawDeepRectangle, ICONX-1, DRAWY+149, ICONS+5, ICONS+5, [sc.work_graph], [sc.work_graph]
stdcall DrawDeepRectangle, ICONX, DRAWY+150, ICONS+3, ICONS+3, [sc.work_light], [sc.work_dark]
stdcall DrawDeepRectangle, ICONX-1, DRAWY+173, ICONS+5, ICONS+5, [sc.work_graph], [sc.work_graph]
stdcall DrawDeepRectangle, ICONX, DRAWY+174, ICONS+3, ICONS+3, [sc.work_light], [sc.work_dark]
;stdcall DrawRectangle3D, ICONX, DRAWY, 22, 22, [sc.work_light], [sc.work_dark] ;Leency: draw rectangle around the button, buggy now
;mov eax,13 ; draw rect
;mov ebx,266 shl 16+16 ; [x] + [size]
;mov ecx,9 shl 16+16 ; [y] + [size]
;mov edx,0x666666 ; RGB
;push esi ; backup esi
;mov esi,8 ; counter=8
;draw_lpanel: ; loop label
; int 0x40 ; call draw black rect
; add ecx,19 shl 16 ; move rect
; dec esi ; decrement counter
; cmp esi,0 ; if counter!=zero
; jne draw_lpanel ; then goto label
; mov esi,8 ; else counter=8
; mov ebx,267 shl 16+14 ; [x] + [size]
; mov ecx,10 shl 16+14 ; [y] + [size]
; mov edx,0xF3F3F3 ; RGB
;draw_lpanel2: ; 2 loop label
; int 0x40 ; call draw white rect
; add ecx,19 shl 16 ; move rect
; dec esi ; decrement counter
; cmp esi,0 ; if counter!=0
; jne draw_lpanel2 ; then goto label2
;pop esi ; restore esi
; draw_left_arrow for button_next_colorsheme
;mov eax,4 ; Write string
;mov ebx,272 shl 16+13 ; [x] + [y]
;mov ecx,0x0 ; RGB
;mov edx,larrow ; string pointer
;mov esi,1 ; count symbol
;int 0x40 ; call
;mov eax,38 ; draw line
;mov ebx,270 shl 16+272 ; [start x] + [end x]
;mov ecx,16 shl 16+16 ; [start y] + [end y]
;mov edx,0x0 ; RGB
;int 0x40 ; call
ret ; return
ret
;.................................................................................................
;------------------------------------------------------------------------------------------------+
draw_bottom_panel: ; Отрисовка нижней панели
;.................................................................................................
mcall SF_DEFINE_BUTTON, <129,90>, <WIN_H-27,16>, 16, [sc.work_button]
mcall SF_DEFINE_BUTTON, <129,90>, <WIN_H-27,18>, 14, [sc.work_button]
add ebx, 100 shl 16
add edx, 2
@@ -408,7 +366,7 @@ draw_main:
; Write string
mov ecx,[sc.work_text] ; RGB
add ecx, 0x90000000
mcall SF_DRAW_TEXT, <35, WIN_H-26>, ,bground
mcall SF_DRAW_TEXT, <35, WIN_H-25>, ,bground
mov ecx, [sc.work_button_text]
add ecx, 0x90000000
@@ -892,8 +850,7 @@ endp
;****************************************************************************************************|
; БЛОК ПЕРЕМЕННЫХ И КОНСТАНТ |
;----------------------------------------------------------------------------------------------------/
circle:
title db 'Palitra v0.77',0 ; хранит имя программы
title db 'Palitra v0.8',0 ; хранит имя программы
hidden db 'Hidden',0
; hex db '#',0 ; для вывода решётки как текста
cname db 'RGBAx' ; хранит разряды цветов (red,green,blue) x-метка конца
@@ -937,7 +894,7 @@ I_END:
cblue rb 1 ; храним синий спектр
calpha rb 1 ; храним прозрачность
pnext rd 1 ; счетчик переключения палитры
renmode rd 1 ; режим отрисовки (1-цветовая схема,2-пипетка,3-круговая)
renmode rd 1 ; режим отрисовки (0-цветовая схема,1-пипетка)
params rb 20 ; приём параметров
params_c rb 9 ; приёмник для цвета
bgimg_buf rd 1 ; buffer for a generated image
+9 -13
View File
@@ -2,26 +2,22 @@ DOS-866
Описание параметров для запуска программы Palitra
$ запуск без параметров
------------------------------------------------------------------------------+
Программа даёт возможность выбора цветов из палитры и уставновки их при желании
как фон рабочего стола.
..............................................................................+
$ запуск с параметром N
------------------------------------------------------------------------------+
равносильно запуску без параметров за исключением того, что цвета по умолчанию
будут соответствовать переданным в параметрах. Возможны варианты запуска:
Цвета по умолчанию будут соответствовать переданным в параметрах.
Возможны варианты запуска:
/sys/media/palitra N 00FF00FF 00FF0000
/sys/media/palitra N 00F724A3 00736698
..............................................................................+
$ запуск с параметром H
$ запуск с параметром H
------------------------------------------------------------------------------+
Программа запускается в hidden mode без отрисовки окна приложения и загружает
два цвета из /settings/wallpaper.dat. После чего, полученные цвета будут
использованы для заливки фона рабочего стола градиентом из указанных цветов.
Программа запускается в hidden mode без отрисовки окна приложения.
После чего, цвета переданные в параметре будут использованы для заливки фона
рабочего стола градиентом из указанных цветов.
/sys/media/palitra H 00FF00FF 00FF0000
/sys/media/palitra H 00F724A3 00736698
..............................................................................+