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,87 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Kumiki
|
|
4
|
+
class WebViewWidget < Widget
|
|
5
|
+
def initialize(url: nil, html: nil)
|
|
6
|
+
super()
|
|
7
|
+
@initial_url = url
|
|
8
|
+
@initial_html = html
|
|
9
|
+
@webview = nil
|
|
10
|
+
@last_bounds = nil
|
|
11
|
+
@ipc_handler = nil
|
|
12
|
+
@nav_handler = nil
|
|
13
|
+
set_width_policy(EXPANDING)
|
|
14
|
+
set_height_policy(EXPANDING)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def load_url(url)
|
|
18
|
+
@webview ? @webview.load_url(url) : (@initial_url = url; @initial_html = nil)
|
|
19
|
+
self
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def load_html(html)
|
|
23
|
+
@webview ? @webview.load_html(html) : (@initial_html = html; @initial_url = nil)
|
|
24
|
+
self
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def evaluate_script(js) = (@webview&.evaluate_script(js); self)
|
|
28
|
+
def reload = (@webview&.reload; self)
|
|
29
|
+
def zoom(factor) = (@webview&.zoom(factor.to_f); self)
|
|
30
|
+
|
|
31
|
+
def on_ipc_message(&block)
|
|
32
|
+
@ipc_handler = block
|
|
33
|
+
@webview&.on_ipc_message(&block)
|
|
34
|
+
self
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def on_navigation(&block)
|
|
38
|
+
@nav_handler = block
|
|
39
|
+
@webview&.on_navigation(&block)
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Native WebView handles its own OS-level events; kumiki doesn't dispatch into it
|
|
44
|
+
def dispatch(_pos) = [nil, nil]
|
|
45
|
+
|
|
46
|
+
# Called by Tabs when this widget's tab becomes hidden/shown
|
|
47
|
+
def on_tab_hide = @webview&.set_visible(false)
|
|
48
|
+
def on_tab_show = (@last_bounds = nil; @webview&.set_visible(true))
|
|
49
|
+
|
|
50
|
+
def redraw(_painter, _completely)
|
|
51
|
+
_ensure_created
|
|
52
|
+
_sync_bounds
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def measure(_painter) = Size.new(400.0, 300.0)
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def _ensure_created
|
|
60
|
+
return if @webview
|
|
61
|
+
frame = App.current&.instance_variable_get(:@frame)
|
|
62
|
+
window = frame&.window
|
|
63
|
+
return unless window
|
|
64
|
+
|
|
65
|
+
opts = {}
|
|
66
|
+
opts[:url] = @initial_url if @initial_url
|
|
67
|
+
opts[:html] = @initial_html if @initial_html && !@initial_url
|
|
68
|
+
@webview = Ranma::WebView.new(window, **opts)
|
|
69
|
+
@webview.on_ipc_message(&@ipc_handler) if @ipc_handler
|
|
70
|
+
@webview.on_navigation(&@nav_handler) if @nav_handler
|
|
71
|
+
@webview.set_visible(true)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def _sync_bounds
|
|
75
|
+
return unless @webview
|
|
76
|
+
bounds = [get_x.to_i, get_y.to_i, get_width.to_i, get_height.to_i]
|
|
77
|
+
if bounds != @last_bounds
|
|
78
|
+
@last_bounds = bounds
|
|
79
|
+
@webview.set_bounds(*bounds)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def WebView(url: nil, html: nil)
|
|
85
|
+
WebViewWidget.new(url: url, html: html)
|
|
86
|
+
end
|
|
87
|
+
end
|
data/lib/kumiki.rb
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Kumiki (組木) - Reactive GUI framework for Ruby
|
|
4
|
+
#
|
|
5
|
+
# A declarative, component-based UI framework powered by SDL3 + Skia.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# require "kumiki"
|
|
9
|
+
# include Kumiki
|
|
10
|
+
#
|
|
11
|
+
# class MyApp < Component
|
|
12
|
+
# def initialize
|
|
13
|
+
# super
|
|
14
|
+
# @count = state(0)
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# def view
|
|
18
|
+
# column(padding: 16.0) {
|
|
19
|
+
# text "Count: #{@count}", font_size: 32.0
|
|
20
|
+
# button("Click me") { @count += 1 }
|
|
21
|
+
# }
|
|
22
|
+
# end
|
|
23
|
+
# end
|
|
24
|
+
#
|
|
25
|
+
# Kumiki.run("My App", 400, 300) { MyApp.new }
|
|
26
|
+
|
|
27
|
+
require_relative "kumiki/version"
|
|
28
|
+
|
|
29
|
+
module Kumiki
|
|
30
|
+
# Theme accessor with lazy initialization (default: Tokyo Night)
|
|
31
|
+
def self.theme
|
|
32
|
+
@theme ||= Theme.new
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.theme=(t)
|
|
36
|
+
@theme = t
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Background clear color propagation (internal use)
|
|
40
|
+
def self._bg_clear_color
|
|
41
|
+
@_bg_clear_color || 0
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self._bg_clear_color=(v)
|
|
45
|
+
@_bg_clear_color = v
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# When `include Kumiki` is used, also include the DSL
|
|
49
|
+
def self.included(base)
|
|
50
|
+
base.include(Kumiki::DSL)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Convenience: run an app
|
|
54
|
+
def self.run(title, width, height, &block)
|
|
55
|
+
widget = block.call
|
|
56
|
+
frame = RanmaFrame.new(title, width, height)
|
|
57
|
+
app = App.new(frame, widget)
|
|
58
|
+
app.run
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Core
|
|
63
|
+
require_relative "kumiki/render_node"
|
|
64
|
+
require_relative "kumiki/core"
|
|
65
|
+
require_relative "kumiki/column"
|
|
66
|
+
require_relative "kumiki/row"
|
|
67
|
+
require_relative "kumiki/box"
|
|
68
|
+
require_relative "kumiki/spacer"
|
|
69
|
+
require_relative "kumiki/theme"
|
|
70
|
+
require_relative "kumiki/themes/tokyo_night"
|
|
71
|
+
require_relative "kumiki/themes/material"
|
|
72
|
+
|
|
73
|
+
# Widgets
|
|
74
|
+
require_relative "kumiki/widgets/text"
|
|
75
|
+
require_relative "kumiki/widgets/button"
|
|
76
|
+
require_relative "kumiki/widgets/divider"
|
|
77
|
+
require_relative "kumiki/widgets/container"
|
|
78
|
+
require_relative "kumiki/widgets/input"
|
|
79
|
+
require_relative "kumiki/widgets/multiline_input"
|
|
80
|
+
require_relative "kumiki/widgets/multiline_text"
|
|
81
|
+
require_relative "kumiki/widgets/checkbox"
|
|
82
|
+
require_relative "kumiki/widgets/radio_buttons"
|
|
83
|
+
require_relative "kumiki/widgets/switch"
|
|
84
|
+
require_relative "kumiki/widgets/slider"
|
|
85
|
+
require_relative "kumiki/widgets/progress_bar"
|
|
86
|
+
require_relative "kumiki/widgets/tabs"
|
|
87
|
+
require_relative "kumiki/widgets/data_table"
|
|
88
|
+
require_relative "kumiki/widgets/tree"
|
|
89
|
+
require_relative "kumiki/widgets/calendar"
|
|
90
|
+
require_relative "kumiki/widgets/modal"
|
|
91
|
+
require_relative "kumiki/widgets/image"
|
|
92
|
+
require_relative "kumiki/widgets/net_image"
|
|
93
|
+
require_relative "kumiki/widgets/webview"
|
|
94
|
+
|
|
95
|
+
# Markdown
|
|
96
|
+
require_relative "kumiki/markdown/ast"
|
|
97
|
+
require_relative "kumiki/markdown/theme"
|
|
98
|
+
require_relative "kumiki/markdown/parser"
|
|
99
|
+
require_relative "kumiki/markdown/mermaid/models"
|
|
100
|
+
require_relative "kumiki/markdown/mermaid/parser"
|
|
101
|
+
require_relative "kumiki/markdown/mermaid/layout"
|
|
102
|
+
require_relative "kumiki/markdown/mermaid/renderer"
|
|
103
|
+
require_relative "kumiki/markdown/renderer"
|
|
104
|
+
require_relative "kumiki/widgets/markdown"
|
|
105
|
+
|
|
106
|
+
# Charts
|
|
107
|
+
require_relative "kumiki/chart/chart_helpers"
|
|
108
|
+
require_relative "kumiki/chart/scales"
|
|
109
|
+
require_relative "kumiki/chart/base_chart"
|
|
110
|
+
require_relative "kumiki/chart/bar_chart"
|
|
111
|
+
require_relative "kumiki/chart/line_chart"
|
|
112
|
+
require_relative "kumiki/chart/pie_chart"
|
|
113
|
+
require_relative "kumiki/chart/scatter_chart"
|
|
114
|
+
require_relative "kumiki/chart/area_chart"
|
|
115
|
+
require_relative "kumiki/chart/stacked_bar_chart"
|
|
116
|
+
require_relative "kumiki/chart/gauge_chart"
|
|
117
|
+
require_relative "kumiki/chart/heatmap_chart"
|
|
118
|
+
|
|
119
|
+
# Animation
|
|
120
|
+
require_relative "kumiki/animation/easing"
|
|
121
|
+
require_relative "kumiki/animation/value_tween"
|
|
122
|
+
require_relative "kumiki/animation/animated_state"
|
|
123
|
+
|
|
124
|
+
# RanmaFrame (ranma GPU) — default frame backend
|
|
125
|
+
require_relative "kumiki/frame_ranma"
|
|
126
|
+
require_relative "kumiki/app"
|
|
127
|
+
|
|
128
|
+
# DSL
|
|
129
|
+
require_relative "kumiki/style"
|
|
130
|
+
require_relative "kumiki/dsl"
|
metadata
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: kumiki
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Yasushi Itoh
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: ranma
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0'
|
|
26
|
+
description: Kumiki is a declarative, reactive GUI framework for Ruby with a DSL-based
|
|
27
|
+
component system, powered by ranma (tao + Vello) for native GPU rendering.
|
|
28
|
+
executables: []
|
|
29
|
+
extensions: []
|
|
30
|
+
extra_rdoc_files: []
|
|
31
|
+
files:
|
|
32
|
+
- LICENSE
|
|
33
|
+
- README.md
|
|
34
|
+
- lib/kumiki.rb
|
|
35
|
+
- lib/kumiki/animation/animated_state.rb
|
|
36
|
+
- lib/kumiki/animation/easing.rb
|
|
37
|
+
- lib/kumiki/animation/value_tween.rb
|
|
38
|
+
- lib/kumiki/app.rb
|
|
39
|
+
- lib/kumiki/box.rb
|
|
40
|
+
- lib/kumiki/chart/area_chart.rb
|
|
41
|
+
- lib/kumiki/chart/bar_chart.rb
|
|
42
|
+
- lib/kumiki/chart/base_chart.rb
|
|
43
|
+
- lib/kumiki/chart/chart_helpers.rb
|
|
44
|
+
- lib/kumiki/chart/gauge_chart.rb
|
|
45
|
+
- lib/kumiki/chart/heatmap_chart.rb
|
|
46
|
+
- lib/kumiki/chart/line_chart.rb
|
|
47
|
+
- lib/kumiki/chart/pie_chart.rb
|
|
48
|
+
- lib/kumiki/chart/scales.rb
|
|
49
|
+
- lib/kumiki/chart/scatter_chart.rb
|
|
50
|
+
- lib/kumiki/chart/stacked_bar_chart.rb
|
|
51
|
+
- lib/kumiki/column.rb
|
|
52
|
+
- lib/kumiki/core.rb
|
|
53
|
+
- lib/kumiki/dsl.rb
|
|
54
|
+
- lib/kumiki/frame_ranma.rb
|
|
55
|
+
- lib/kumiki/markdown/ast.rb
|
|
56
|
+
- lib/kumiki/markdown/mermaid/layout.rb
|
|
57
|
+
- lib/kumiki/markdown/mermaid/models.rb
|
|
58
|
+
- lib/kumiki/markdown/mermaid/parser.rb
|
|
59
|
+
- lib/kumiki/markdown/mermaid/renderer.rb
|
|
60
|
+
- lib/kumiki/markdown/parser.rb
|
|
61
|
+
- lib/kumiki/markdown/renderer.rb
|
|
62
|
+
- lib/kumiki/markdown/theme.rb
|
|
63
|
+
- lib/kumiki/render_node.rb
|
|
64
|
+
- lib/kumiki/row.rb
|
|
65
|
+
- lib/kumiki/spacer.rb
|
|
66
|
+
- lib/kumiki/style.rb
|
|
67
|
+
- lib/kumiki/theme.rb
|
|
68
|
+
- lib/kumiki/themes/material.rb
|
|
69
|
+
- lib/kumiki/themes/tokyo_night.rb
|
|
70
|
+
- lib/kumiki/version.rb
|
|
71
|
+
- lib/kumiki/widgets/button.rb
|
|
72
|
+
- lib/kumiki/widgets/calendar.rb
|
|
73
|
+
- lib/kumiki/widgets/checkbox.rb
|
|
74
|
+
- lib/kumiki/widgets/container.rb
|
|
75
|
+
- lib/kumiki/widgets/data_table.rb
|
|
76
|
+
- lib/kumiki/widgets/divider.rb
|
|
77
|
+
- lib/kumiki/widgets/image.rb
|
|
78
|
+
- lib/kumiki/widgets/input.rb
|
|
79
|
+
- lib/kumiki/widgets/markdown.rb
|
|
80
|
+
- lib/kumiki/widgets/modal.rb
|
|
81
|
+
- lib/kumiki/widgets/multiline_input.rb
|
|
82
|
+
- lib/kumiki/widgets/multiline_text.rb
|
|
83
|
+
- lib/kumiki/widgets/net_image.rb
|
|
84
|
+
- lib/kumiki/widgets/progress_bar.rb
|
|
85
|
+
- lib/kumiki/widgets/radio_buttons.rb
|
|
86
|
+
- lib/kumiki/widgets/slider.rb
|
|
87
|
+
- lib/kumiki/widgets/switch.rb
|
|
88
|
+
- lib/kumiki/widgets/tabs.rb
|
|
89
|
+
- lib/kumiki/widgets/text.rb
|
|
90
|
+
- lib/kumiki/widgets/tree.rb
|
|
91
|
+
- lib/kumiki/widgets/webview.rb
|
|
92
|
+
homepage: https://github.com/i2y/kumiki
|
|
93
|
+
licenses:
|
|
94
|
+
- MIT
|
|
95
|
+
metadata: {}
|
|
96
|
+
rdoc_options: []
|
|
97
|
+
require_paths:
|
|
98
|
+
- lib
|
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: 3.1.0
|
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - ">="
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
version: '0'
|
|
109
|
+
requirements: []
|
|
110
|
+
rubygems_version: 4.0.3
|
|
111
|
+
specification_version: 4
|
|
112
|
+
summary: A reactive GUI framework for Ruby (ranma + Vello)
|
|
113
|
+
test_files: []
|