kumiki 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +256 -0
- data/lib/kumiki/animation/animated_state.rb +83 -0
- data/lib/kumiki/animation/easing.rb +62 -0
- data/lib/kumiki/animation/value_tween.rb +69 -0
- data/lib/kumiki/app.rb +381 -0
- data/lib/kumiki/box.rb +40 -0
- data/lib/kumiki/chart/area_chart.rb +308 -0
- data/lib/kumiki/chart/bar_chart.rb +291 -0
- data/lib/kumiki/chart/base_chart.rb +213 -0
- data/lib/kumiki/chart/chart_helpers.rb +74 -0
- data/lib/kumiki/chart/gauge_chart.rb +174 -0
- data/lib/kumiki/chart/heatmap_chart.rb +223 -0
- data/lib/kumiki/chart/line_chart.rb +292 -0
- data/lib/kumiki/chart/pie_chart.rb +222 -0
- data/lib/kumiki/chart/scales.rb +79 -0
- data/lib/kumiki/chart/scatter_chart.rb +306 -0
- data/lib/kumiki/chart/stacked_bar_chart.rb +279 -0
- data/lib/kumiki/column.rb +351 -0
- data/lib/kumiki/core.rb +2511 -0
- data/lib/kumiki/dsl.rb +408 -0
- data/lib/kumiki/frame_ranma.rb +570 -0
- data/lib/kumiki/markdown/ast.rb +127 -0
- data/lib/kumiki/markdown/mermaid/layout.rb +389 -0
- data/lib/kumiki/markdown/mermaid/models.rb +235 -0
- data/lib/kumiki/markdown/mermaid/parser.rb +522 -0
- data/lib/kumiki/markdown/mermaid/renderer.rb +339 -0
- data/lib/kumiki/markdown/parser.rb +808 -0
- data/lib/kumiki/markdown/renderer.rb +642 -0
- data/lib/kumiki/markdown/theme.rb +168 -0
- data/lib/kumiki/render_node.rb +262 -0
- data/lib/kumiki/row.rb +288 -0
- data/lib/kumiki/spacer.rb +20 -0
- data/lib/kumiki/style.rb +799 -0
- data/lib/kumiki/theme.rb +567 -0
- data/lib/kumiki/themes/material.rb +40 -0
- data/lib/kumiki/themes/tokyo_night.rb +11 -0
- data/lib/kumiki/version.rb +5 -0
- data/lib/kumiki/widgets/button.rb +105 -0
- data/lib/kumiki/widgets/calendar.rb +1028 -0
- data/lib/kumiki/widgets/checkbox.rb +119 -0
- data/lib/kumiki/widgets/container.rb +111 -0
- data/lib/kumiki/widgets/data_table.rb +670 -0
- data/lib/kumiki/widgets/divider.rb +31 -0
- data/lib/kumiki/widgets/image.rb +105 -0
- data/lib/kumiki/widgets/input.rb +485 -0
- data/lib/kumiki/widgets/markdown.rb +58 -0
- data/lib/kumiki/widgets/modal.rb +165 -0
- data/lib/kumiki/widgets/multiline_input.rb +970 -0
- data/lib/kumiki/widgets/multiline_text.rb +180 -0
- data/lib/kumiki/widgets/net_image.rb +100 -0
- data/lib/kumiki/widgets/progress_bar.rb +72 -0
- data/lib/kumiki/widgets/radio_buttons.rb +93 -0
- data/lib/kumiki/widgets/slider.rb +135 -0
- data/lib/kumiki/widgets/switch.rb +84 -0
- data/lib/kumiki/widgets/tabs.rb +175 -0
- data/lib/kumiki/widgets/text.rb +120 -0
- data/lib/kumiki/widgets/tree.rb +434 -0
- data/lib/kumiki/widgets/webview.rb +87 -0
- data/lib/kumiki.rb +130 -0
- metadata +113 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
module Kumiki
|
|
2
|
+
# Checkbox widget - toggleable checkbox with label
|
|
3
|
+
|
|
4
|
+
class Checkbox < Widget
|
|
5
|
+
def initialize(label)
|
|
6
|
+
super()
|
|
7
|
+
@label = label
|
|
8
|
+
@checked = false
|
|
9
|
+
@on_toggle_handler = nil
|
|
10
|
+
@has_toggle_handler = false
|
|
11
|
+
@font_size_val = 14.0
|
|
12
|
+
@check_color = 0
|
|
13
|
+
@text_color_val = 0
|
|
14
|
+
@box_color = 0
|
|
15
|
+
@hover_color = 0
|
|
16
|
+
@custom_check = false
|
|
17
|
+
@custom_text = false
|
|
18
|
+
@hovered = false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def checked(v)
|
|
22
|
+
@checked = v
|
|
23
|
+
mark_dirty
|
|
24
|
+
self
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def is_checked
|
|
28
|
+
@checked
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def on_toggle(&block)
|
|
32
|
+
@on_toggle_handler = block
|
|
33
|
+
@has_toggle_handler = true
|
|
34
|
+
self
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def font_size(s)
|
|
38
|
+
@font_size_val = s
|
|
39
|
+
self
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def check_color(c)
|
|
43
|
+
@check_color = c
|
|
44
|
+
@custom_check = true
|
|
45
|
+
self
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def text_color(c)
|
|
49
|
+
@text_color_val = c
|
|
50
|
+
@custom_text = true
|
|
51
|
+
self
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def mouse_up(ev)
|
|
55
|
+
if @checked
|
|
56
|
+
@checked = false
|
|
57
|
+
else
|
|
58
|
+
@checked = true
|
|
59
|
+
end
|
|
60
|
+
mark_dirty
|
|
61
|
+
update
|
|
62
|
+
if @has_toggle_handler
|
|
63
|
+
@on_toggle_handler.call(@checked)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def mouse_over
|
|
68
|
+
@hovered = true
|
|
69
|
+
mark_dirty
|
|
70
|
+
update
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def mouse_out
|
|
74
|
+
@hovered = false
|
|
75
|
+
mark_dirty
|
|
76
|
+
update
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def measure(painter)
|
|
80
|
+
tw = painter.measure_text_width(@label, Kumiki.theme.font_family, @font_size_val)
|
|
81
|
+
th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
|
|
82
|
+
box_size = th
|
|
83
|
+
gap = 8.0
|
|
84
|
+
Size.new(box_size + gap + tw, th)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def redraw(painter, completely)
|
|
88
|
+
th = painter.measure_text_height(Kumiki.theme.font_family, @font_size_val)
|
|
89
|
+
ascent = painter.get_text_ascent(Kumiki.theme.font_family, @font_size_val)
|
|
90
|
+
box_size = th
|
|
91
|
+
gap = 8.0
|
|
92
|
+
|
|
93
|
+
# Resolve colors from theme
|
|
94
|
+
chk_c = @custom_check ? @check_color : Kumiki.theme.accent
|
|
95
|
+
txt_c = @custom_text ? @text_color_val : Kumiki.theme.text_primary
|
|
96
|
+
box_c = Kumiki.theme.border
|
|
97
|
+
hov_c = Kumiki.theme.bg_secondary
|
|
98
|
+
|
|
99
|
+
# Checkbox box border
|
|
100
|
+
border_c = @hovered ? hov_c : box_c
|
|
101
|
+
painter.stroke_rect(0.0, 0.0, box_size, box_size, border_c, 1.5)
|
|
102
|
+
|
|
103
|
+
# Checkmark fill (when checked)
|
|
104
|
+
if @checked
|
|
105
|
+
inset = 3.0
|
|
106
|
+
painter.fill_rect(inset, inset, box_size - inset * 2.0, box_size - inset * 2.0, chk_c)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Label text
|
|
110
|
+
painter.draw_text(@label, box_size + gap, ascent, Kumiki.theme.font_family, @font_size_val, txt_c)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Top-level helper
|
|
115
|
+
def Checkbox(label)
|
|
116
|
+
Checkbox.new(label)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
module Kumiki
|
|
2
|
+
# Container widget - background + border + padding wrapper
|
|
3
|
+
|
|
4
|
+
class Container < Layout
|
|
5
|
+
def initialize(child)
|
|
6
|
+
super()
|
|
7
|
+
add(child) if child
|
|
8
|
+
@bg_color = 0
|
|
9
|
+
@border_color_val = 0
|
|
10
|
+
@custom_bg = false
|
|
11
|
+
@custom_border = false
|
|
12
|
+
@radius = 4.0
|
|
13
|
+
@border_width = 1.0
|
|
14
|
+
@pad_top = 12.0
|
|
15
|
+
@pad_right = 12.0
|
|
16
|
+
@pad_bottom = 12.0
|
|
17
|
+
@pad_left = 12.0
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def bg_color(c)
|
|
21
|
+
@bg_color = c
|
|
22
|
+
@custom_bg = true
|
|
23
|
+
self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def border_color(c)
|
|
27
|
+
@border_color_val = c
|
|
28
|
+
@custom_border = true
|
|
29
|
+
self
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def border_radius(r)
|
|
33
|
+
@radius = r
|
|
34
|
+
self
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def padding(t, r, b, l)
|
|
38
|
+
@pad_top = t
|
|
39
|
+
@pad_right = r
|
|
40
|
+
@pad_bottom = b
|
|
41
|
+
@pad_left = l
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def measure(painter)
|
|
46
|
+
if @children.length > 0
|
|
47
|
+
c = @children[0]
|
|
48
|
+
inner_w = @width - @pad_left - @pad_right
|
|
49
|
+
if inner_w < 0.0
|
|
50
|
+
inner_w = 0.0
|
|
51
|
+
end
|
|
52
|
+
# Set child width before measuring for word-wrap support
|
|
53
|
+
if c.get_width_policy != FIXED
|
|
54
|
+
c.resize_wh(inner_w, c.get_height)
|
|
55
|
+
end
|
|
56
|
+
cs = c.measure(painter)
|
|
57
|
+
Size.new(cs.width + @pad_left + @pad_right, cs.height + @pad_top + @pad_bottom)
|
|
58
|
+
else
|
|
59
|
+
Size.new(@pad_left + @pad_right, @pad_top + @pad_bottom)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def relocate_children(painter)
|
|
64
|
+
if @children.length > 0
|
|
65
|
+
c = @children[0]
|
|
66
|
+
c.move_xy(@x + @pad_left, @y + @pad_top)
|
|
67
|
+
inner_w = @width - @pad_left - @pad_right
|
|
68
|
+
inner_h = @height - @pad_top - @pad_bottom
|
|
69
|
+
if inner_w < 0.0
|
|
70
|
+
inner_w = 0.0
|
|
71
|
+
end
|
|
72
|
+
if inner_h < 0.0
|
|
73
|
+
inner_h = 0.0
|
|
74
|
+
end
|
|
75
|
+
c.resize_wh(inner_w, inner_h)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def redraw(painter, completely)
|
|
80
|
+
bg_c = 0
|
|
81
|
+
if @custom_bg
|
|
82
|
+
bg_c = @bg_color
|
|
83
|
+
else
|
|
84
|
+
bg_c = Kumiki.theme.bg_primary
|
|
85
|
+
end
|
|
86
|
+
if completely || is_dirty || is_subtree_dirty
|
|
87
|
+
brd_c = 0
|
|
88
|
+
if @custom_border
|
|
89
|
+
brd_c = @border_color_val
|
|
90
|
+
else
|
|
91
|
+
brd_c = Kumiki.theme.border
|
|
92
|
+
end
|
|
93
|
+
painter.fill_round_rect(0.0, 0.0, @width, @height, @radius, bg_c)
|
|
94
|
+
painter.stroke_round_rect(0.0, 0.0, @width, @height, @radius, brd_c, @border_width)
|
|
95
|
+
end
|
|
96
|
+
# Set bg_clear_color so redraw_children uses Container's background for child clearing
|
|
97
|
+
@bg_clear_color = bg_c
|
|
98
|
+
# Propagate to child layouts via global (save/restore for nesting)
|
|
99
|
+
saved_bg = Kumiki._bg_clear_color
|
|
100
|
+
Kumiki._bg_clear_color = bg_c
|
|
101
|
+
super(painter, completely)
|
|
102
|
+
Kumiki._bg_clear_color = saved_bg
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Top-level helper
|
|
107
|
+
def Container(child)
|
|
108
|
+
Container.new(child)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|