From 0a8c0efdd99f2c3336fa6e19cd7f20860d2fca0a Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 6 Oct 2024 18:30:44 +0200 Subject: [PATCH] HASPmota add cpicker and msgbox --- docs/HASPmota.md | 46 +++++++++++++++++++++++ docs/_media/lvgl/HASPmota_23_msgbox.png | Bin 0 -> 8744 bytes docs/_media/lvgl/HASPmota_24_cpicker.png | Bin 0 -> 12658 bytes 3 files changed, 46 insertions(+) create mode 100644 docs/_media/lvgl/HASPmota_23_msgbox.png create mode 100644 docs/_media/lvgl/HASPmota_24_cpicker.png diff --git a/docs/HASPmota.md b/docs/HASPmota.md index 42734a12e7..8bb2c71439 100644 --- a/docs/HASPmota.md +++ b/docs/HASPmota.md @@ -30,6 +30,8 @@ This feature is heavily inspired from @fvanroie's [openHASP project](https://git [![HASPmota fonts](_media/lvgl/HASPmota_20_fonts.png){width="160"}](#embedded-fonts) [![HASPmota icons](_media/lvgl/HASPmota_21_icons.png){width="160"}](#embedded-symbols) [![HASPmota seg7](_media/lvgl/HASPmota_22_seg7.png){width="160"}](#embedded-special-fonts) +[![HASPmota msgbox](_media/lvgl/HASPmota_23_msgbox.png){width="160"}](#embedded-special-fonts) +[![HASPmota cpicker](_media/lvgl/HASPmota_24_cpicker.png){width="160"}](#embedded-special-fonts) The `jsonl` file used to display the widgets can be found [here](_media/lvgl/haspmota_demo.jsonl) @@ -232,8 +234,10 @@ HASPmota Class|Embedded LVGL class `textarea`|`lv.textarea` `led`|`lv.led` `chart`|`lv.chart` +`cpicker`|`lv.colorwheel` (ported from LVGL8 to LVGL9) `spangroup`|`lv.spangroup` `span`|`lv.span` +`msgbox`|`lv.msgbox` `qrcode`|`lv.qrcode` You can also import custom widget as long as they inherit from `lv.obj` and the class name matches the module name. @@ -825,6 +829,25 @@ Attribute name|LVGL equivalent|Details `zoom_x`
`zoom_y`|`zoom`|Zoom into the chart in X or Y direction.
`256` for no zoom, `512` double zoom. `update_mode`|`update_mode`|Set update mode of the chart object, default is `SHIFT`.
`0`: (`SHIFT`) Shift old data to the left and add the new one the right
`1`: (`CIRCULAR`) Add the new data in a circular way +### `cpicker` + +The `cpicker` (color picker) object allows to select a color, encoded as `#RRGGBB` where RR/GG/BB are Hex values for Red/Green/Blue. Color Picker has 3 modes: "hue", "saturation", "value"; use long press to change mode. + +![HASPmota cpicker](_media/lvgl/HASPmota_23_cpicker.png) + +Example of `pages.jsonl`: +```json +{"id":10,"obj":"cpicker","x":20,"y":60,"w":120,"h":120,"color":"#FFFF00","mode":"hue","scale_width":20} +``` + +Attribute name|LVGL equivalent|Details +:---|:---|:--- +`color`|`color_rgb`|Set or read the current color as `#RRGGBB` string, where Red/Green/Blue are encoded as 2-digit hex. Example: `#FFFF00` is yellow. +`mode`|`mode`|Set or read the current mode
`hue` displays a hue ring
`saturation` displays a saturation ring from 0 to white
`value` displays a brightness ring from pure color to black +`mode_fixed`|`mode_fixed`|(bool) Set or read the `mode_fixed` attribute. If `true`, there is no mode change on long-press. +`scale_width`|`arc_width`|(int) Set or read the width of the ring +`pad_inner`||This attribute is ignored but present for OpenHASP compatibility. Since LVGL 8, there is no inner circle showing the color. There color is shown on the knob instead + ### `spangroup` (styled text) !!!note "Available (since Tasmota v13.4). This object is not part of OPENhasp." @@ -869,6 +892,29 @@ Attribute name|LVGL equivalent|Details `text_letter_space`|`set_text_letter_space`|Set the letter space in pixels `text_line_space`|`set_text_line_space`|Set the line space in pixels. +### `msgbox` + +The `msgbox` (message box) object allows to display a pop-up with a text content and one or multiple buttons. The pop-up can be made "modal" (not impemented yet). + +![HASPmota msgbox](_media/lvgl/HASPmota_24_msgbox.png) + +Example of `pages.jsonl`: +```json +{"id":10,"obj":"msgbox","x":0,"y":0,"w%":80,"h":100,"text":"A message box with two buttons.","border_color":"#FF4400","bg_color":"#4f4f4f","bg_opa":200,"buttons_bg_color":"#FF4400","buttons_border_width":3,"buttons_border_color":"#FFFFFF","text_color":"#FFFFFF","options":["Apply","Close"]} +``` + +Attribute name|LVGL equivalent|Details +:---|:---|:--- +`text`|`content`|Set the contect of the Message box. If you write a new value, it will add to the existing content (LVGL limitation) +`options`|(array of string, not empty) Labels for buttons +`footer_`
`header_`
`title_`
`content`
`buttons_`||Prefix to set or read style attributes on sub-objects of the message box.
Styles for `buttons_` cannot be read, and set the same style for all buttons. +`border_color`||Set the color of the border of the pop-up. +`text_color`||Set the text color of the content +`bg_opa`||Set the opacity of the pop-up, `255` (fully opaque) by default. +`buttons_bg_color`||Set the background color of all buttons. +`buttons_border_width`||Set the border width of all buttons. +`buttons_border_color`||Set the border color of all buttons. + ### `qrcode` Example: diff --git a/docs/_media/lvgl/HASPmota_23_msgbox.png b/docs/_media/lvgl/HASPmota_23_msgbox.png new file mode 100644 index 0000000000000000000000000000000000000000..ad633acf125cef648b4bab6bbd572c1e23907d02 GIT binary patch literal 8744 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ⅆNc)qfP03|dBuCZ;-?gBpL8y zZdE8+luQ903kURia{fy|T*dXmvhwOO0~lKVi4{fws{5)YtV@;L>)riXHd7CtegQdT zGp()BA;5xC(rF0*&U1<%l@2%jrB~2h1XbzWv~LC!b7K=gl&Ti9x)}>Gle*G+=ACNX z9JA%R`>XPD7B?WmIGFhj>Z!CwJCfimPJc$4E$d|(mgHZ03>B}iSzf3xMf$JJ(rZ0? z%h5E^c~*mUzZ$~IqujHh5m>-TvGY;MxjB)sQndz+HW~m zA!-Lr)6;HMLXa}u-_MinCmj4he0M3-U5D0KlVcCMq=8Z@ZRNK@;NorGtLFIOg?YHI z6rxa}nXMKrDP%%-d6o4>~&Yt+$^v8^gO}#ivzmy8X!s0%_l&8_Pwad7}z1=sMmUeuK1)+l4 zkxM)&h=~m?piRm~@6p0aN9U3I%9qddDHMQn3AOtfEi?!wsCtkioEF1jRyQ-OFmFjd zlHyjt;CPL|pgA=Hwq+My^0^2tfup7>LaX;2(

ljc*PYE(mD3Sa2FWe6;jED%O7_ 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 K-|)&J?0*3nPJuZ9 literal 0 HcmV?d00001