From bd9f83461c2a278aeae9d9e8b716228cfe872f05 Mon Sep 17 00:00:00 2001 From: Erik Corry Date: Wed, 13 Dec 2023 16:58:17 +0100 Subject: [PATCH 1/2] Make x, y, w, h all configurable with style sheets. (#80) * Make x, y, w, h all configurable with style sheets. --- src/element.toit | 12 ++++++++++-- src/style.toit | 8 ++++++++ tests/horizontal-slider-visualized.toit | 4 ++-- tests/slider-rotated-visualized.toit | 4 +--- tests/slider-visualized.toit | 4 ++-- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/element.toit b/src/element.toit index bcc0276..8413929 100644 --- a/src/element.toit +++ b/src/element.toit @@ -179,6 +179,12 @@ abstract class Element implements Window: invalidate border_ = value invalidate + else if key == "x": + x = value + else if key == "y": + y = value + else: + print "Unknown style key: '$key'" abstract type -> string @@ -289,9 +295,9 @@ class Div extends Element: invalidate set-attribute_ key/string value -> none: - if key == "width": + if key == "w": w = value - else if key == "height": + else if key == "h": h = value else: super key value @@ -334,6 +340,8 @@ class Label extends Element implements ColoredElement: orientation = value else if key == "alignment": alignment = value + else if key == "label": + label = value else: super key value diff --git a/src/style.toit b/src/style.toit index bb0d914..45768ff 100644 --- a/src/style.toit +++ b/src/style.toit @@ -624,6 +624,10 @@ class Style: constructor.empty: return EMPTY-STYLE_ constructor + --x/int?=null + --y/int?=null + --w/int?=null + --h/int?=null --color/int?=null --font/Font?=null --background=null @@ -632,6 +636,10 @@ class Style: --id-map/Map?=null --type-map/Map?=null .map_={:}: + if x != null: map_["x"] = x + if y != null: map_["y"] = y + if w != null: map_["w"] = w + if h != null: map_["h"] = h if color != null: map_["color"] = color if font != null: map_["font"] = font if border != null: map_["border"] = border diff --git a/tests/horizontal-slider-visualized.toit b/tests/horizontal-slider-visualized.toit index 497bbd7..5dc24e1 100644 --- a/tests/horizontal-slider-visualized.toit +++ b/tests/horizontal-slider-visualized.toit @@ -55,8 +55,8 @@ main args: "slider": Style { "background-hi": heat, "background-lo": cold, - "width": 120, - "height": 20, + "w": 120, + "h": 20, "horizontal": true, }, "label": Style --font=sans10 --color=0xffffff, diff --git a/tests/slider-rotated-visualized.toit b/tests/slider-rotated-visualized.toit index b951a99..c70d36a 100644 --- a/tests/slider-rotated-visualized.toit +++ b/tests/slider-rotated-visualized.toit @@ -52,11 +52,9 @@ main args: style := Style --type-map={ - "slider": Style { + "slider": Style --w=20 --h=100 { "background-hi": heat, "background-lo": cold, - "width": 20, - "height": 100, }, "label": Style --font=sans10 --color=0xffffff, } diff --git a/tests/slider-visualized.toit b/tests/slider-visualized.toit index 7b8ca37..61a42e7 100644 --- a/tests/slider-visualized.toit +++ b/tests/slider-visualized.toit @@ -55,8 +55,8 @@ main args: "slider": Style { "background-hi": heat, "background-lo": cold, - "width": 20, - "height": 100, + "w": 20, + "h": 100, }, "label": Style --font=sans10 --color=0xffffff, } From 8cce8d927dd87179a193a917359ae5e3ce3e290b Mon Sep 17 00:00:00 2001 From: Erik Corry Date: Wed, 13 Dec 2023 17:09:05 +0100 Subject: [PATCH 2/2] Add icon support to the Label element. (#81) * Add icon support to the Label element. --- src/element.toit | 35 +++++++---- src/four-gray.toit | 1 - src/gray-scale.toit | 1 - src/one-byte.toit | 1 - src/pixel-display.toit | 3 +- src/several-color.toit | 1 - src/three-color.toit | 1 - src/true-color.toit | 1 - src/two-color.toit | 1 - tests/gold/icons-visualized.toit.png | Bin 0 -> 28221 bytes tests/icons-visualized.toit | 86 +++++++++++++++++++++++++++ tests/package.lock | 6 ++ tests/package.yaml | 3 + 13 files changed, 120 insertions(+), 20 deletions(-) create mode 100644 tests/gold/icons-visualized.toit.png create mode 100644 tests/icons-visualized.toit diff --git a/src/element.toit b/src/element.toit index 8413929..f695998 100644 --- a/src/element.toit +++ b/src/element.toit @@ -11,6 +11,7 @@ import .one-byte as one-byte import .style show * import .pixel-display import font show Font +import icons show Icon import math /** @@ -106,20 +107,23 @@ abstract class Element implements Window: children = null x= value/int -> none: - invalidate - x_ = value - invalidate + if x_ != value: + invalidate + x_ = value + invalidate y= value/int -> none: - invalidate - y_ = value - invalidate + if y_ != value: + invalidate + y_ = value + invalidate move-to x/int y/int: - invalidate - x_ = x - y_ = y - invalidate + if x_ != x or y_ != y: + invalidate + x_ = x + y_ = y + invalidate border= value/Border?: if value != border_: @@ -342,6 +346,8 @@ class Label extends Element implements ColoredElement: alignment = value else if key == "label": label = value + else if key == "icon": + icon = value else: super key value @@ -360,6 +366,9 @@ class Label extends Element implements ColoredElement: left_ = null // Trigger recalculation. invalidate + icon= value/Icon -> none: + font = value.font_ + label = value.stringify /** Constructs a Label. @@ -385,6 +394,7 @@ class Label extends Element implements ColoredElement: --color/int=0 --label/string="" --font/Font?=null + --icon/Icon?=null --orientation/int=ORIENTATION-0 --alignment/int=ALIGN-LEFT: color_ = color @@ -398,6 +408,9 @@ class Label extends Element implements ColoredElement: --style = style --classes = classes --id = id + if icon: + if font: throw "INVALID_ARGUMENT" + this.icon = icon /** Calls the block with the left, top, width, and height. @@ -577,7 +590,7 @@ class ClippingDiv_ extends Div: Invalidates the whole window including the decoration. */ invalidate --x=x_ --y=y_ --w=w_ --h=h_ -> none: - if change-tracker: + if change-tracker and x and y and w and h: extent --x=x --y=y --w=w --h=h: | outer-x outer-y outer-w outer-h | change-tracker.child-invalidated outer-x outer-y outer-w outer-h diff --git a/src/four-gray.toit b/src/four-gray.toit index 9313287..549b073 100644 --- a/src/four-gray.toit +++ b/src/four-gray.toit @@ -9,7 +9,6 @@ For use with e-paper displays with four tones of gray. import bitmap show * import font show Font -import icons show Icon import .pixel-display import .two-bit-texture diff --git a/src/gray-scale.toit b/src/gray-scale.toit index 441cebd..e8557ab 100644 --- a/src/gray-scale.toit +++ b/src/gray-scale.toit @@ -8,7 +8,6 @@ Constants useful for $PixelDisplay.gray-scale. import bitmap show * import font show Font -import icons show Icon import .pixel-display import .one-byte diff --git a/src/one-byte.toit b/src/one-byte.toit index dce5c8b..fed6717 100644 --- a/src/one-byte.toit +++ b/src/one-byte.toit @@ -8,7 +8,6 @@ import bitmap show * import font show Font -import icons show Icon import .gray-scale as gray-scale_ import .pixel-display diff --git a/src/pixel-display.toit b/src/pixel-display.toit index d679d0f..aae92b7 100644 --- a/src/pixel-display.toit +++ b/src/pixel-display.toit @@ -10,7 +10,6 @@ See https://docs.toit.io/language/sdk/display import bitmap show * import bitmap show ORIENTATION-0 ORIENTATION-90 ORIENTATION-180 ORIENTATION-270 import font show Font -import icons show Icon import .bar-code import .element @@ -769,7 +768,7 @@ abstract class Canvas: /** Helper for the $subcanvas method. See that method for details. - The block, $create-block takes the arguments y and height, and it is + The block, $create-canvas takes the arguments y and height, and it is expected to return a Canvas that is a view into the current canvas, but only for the lines between y and y + height. It can return null if that is not possible. diff --git a/src/several-color.toit b/src/several-color.toit index 5b76ff9..66bbec5 100644 --- a/src/several-color.toit +++ b/src/several-color.toit @@ -4,7 +4,6 @@ import bitmap show * import font show Font -import icons show Icon import .one-byte import .two-color as two-color import .pixel-display diff --git a/src/three-color.toit b/src/three-color.toit index 1044ef8..d267e25 100644 --- a/src/three-color.toit +++ b/src/three-color.toit @@ -8,7 +8,6 @@ For use with e-paper black, white, and red displays. */ import font show Font -import icons show Icon import .pixel-display import .two-bit-texture diff --git a/src/true-color.toit b/src/true-color.toit index 37762ff..429f0bc 100644 --- a/src/true-color.toit +++ b/src/true-color.toit @@ -9,7 +9,6 @@ Functions and constants useful for the RGB $PixelDisplay.true-color display. import binary show BIG-ENDIAN import bitmap show * import font show Font -import icons show Icon import .gray-scale as gray-scale_ import .pixel-display diff --git a/src/two-color.toit b/src/two-color.toit index 8b38d9b..dbd87db 100644 --- a/src/two-color.toit +++ b/src/two-color.toit @@ -10,7 +10,6 @@ For use with e-paper displays and the SSD1306 128x64 display import bitmap show * import font show Font -import icons show Icon import .pixel-display diff --git a/tests/gold/icons-visualized.toit.png b/tests/gold/icons-visualized.toit.png new file mode 100644 index 0000000000000000000000000000000000000000..be7cf6c4f978fbd1f9b5476aa53f148e40181228 GIT binary patch literal 28221 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 jzLfR&KZpMh$e74baACvXgOs27r8T7|s*ejF8T