colstrom-fidgit 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +31 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +20 -0
- data/README.md +154 -0
- data/Rakefile +38 -0
- data/config/default_schema.yml +216 -0
- data/examples/_all_examples.rb +9 -0
- data/examples/align_example.rb +56 -0
- data/examples/button_and_toggle_button_example.rb +38 -0
- data/examples/color_picker_example.rb +17 -0
- data/examples/color_well_example.rb +25 -0
- data/examples/combo_box_example.rb +24 -0
- data/examples/file_dialog_example.rb +42 -0
- data/examples/grid_packer_example.rb +29 -0
- data/examples/helpers/example_window.rb +17 -0
- data/examples/label_example.rb +23 -0
- data/examples/list_example.rb +23 -0
- data/examples/media/images/head_icon.png +0 -0
- data/examples/menu_pane_example.rb +27 -0
- data/examples/message_dialog_example.rb +65 -0
- data/examples/radio_button_example.rb +37 -0
- data/examples/readme_example.rb +32 -0
- data/examples/scroll_window_example.rb +49 -0
- data/examples/slider_example.rb +34 -0
- data/examples/splash_example.rb +42 -0
- data/examples/text_area_example.rb +33 -0
- data/fidgit.gemspec +35 -0
- data/lib/fidgit.rb +51 -0
- data/lib/fidgit/chingu_ext/window.rb +6 -0
- data/lib/fidgit/cursor.rb +38 -0
- data/lib/fidgit/elements/button.rb +113 -0
- data/lib/fidgit/elements/color_picker.rb +63 -0
- data/lib/fidgit/elements/color_well.rb +39 -0
- data/lib/fidgit/elements/combo_box.rb +115 -0
- data/lib/fidgit/elements/composite.rb +17 -0
- data/lib/fidgit/elements/container.rb +210 -0
- data/lib/fidgit/elements/element.rb +298 -0
- data/lib/fidgit/elements/file_browser.rb +152 -0
- data/lib/fidgit/elements/grid.rb +227 -0
- data/lib/fidgit/elements/group.rb +64 -0
- data/lib/fidgit/elements/horizontal.rb +12 -0
- data/lib/fidgit/elements/image_frame.rb +65 -0
- data/lib/fidgit/elements/label.rb +85 -0
- data/lib/fidgit/elements/list.rb +47 -0
- data/lib/fidgit/elements/main_packer.rb +25 -0
- data/lib/fidgit/elements/menu_pane.rb +163 -0
- data/lib/fidgit/elements/packer.rb +42 -0
- data/lib/fidgit/elements/radio_button.rb +86 -0
- data/lib/fidgit/elements/scroll_area.rb +68 -0
- data/lib/fidgit/elements/scroll_bar.rb +128 -0
- data/lib/fidgit/elements/scroll_window.rb +83 -0
- data/lib/fidgit/elements/slider.rb +125 -0
- data/lib/fidgit/elements/text_area.rb +494 -0
- data/lib/fidgit/elements/text_line.rb +92 -0
- data/lib/fidgit/elements/toggle_button.rb +67 -0
- data/lib/fidgit/elements/tool_tip.rb +35 -0
- data/lib/fidgit/elements/vertical.rb +12 -0
- data/lib/fidgit/event.rb +159 -0
- data/lib/fidgit/gosu_ext/color.rb +136 -0
- data/lib/fidgit/gosu_ext/gosu_module.rb +25 -0
- data/lib/fidgit/history.rb +91 -0
- data/lib/fidgit/redirector.rb +83 -0
- data/lib/fidgit/schema.rb +123 -0
- data/lib/fidgit/selection.rb +106 -0
- data/lib/fidgit/standard_ext/hash.rb +21 -0
- data/lib/fidgit/states/dialog_state.rb +52 -0
- data/lib/fidgit/states/file_dialog.rb +24 -0
- data/lib/fidgit/states/gui_state.rb +331 -0
- data/lib/fidgit/states/message_dialog.rb +61 -0
- data/lib/fidgit/version.rb +5 -0
- data/lib/fidgit/window.rb +19 -0
- data/media/images/arrow.png +0 -0
- data/media/images/combo_arrow.png +0 -0
- data/media/images/file_directory.png +0 -0
- data/media/images/file_file.png +0 -0
- data/media/images/pixel.png +0 -0
- data/spec/fidgit/elements/helpers/helper.rb +3 -0
- data/spec/fidgit/elements/helpers/tex_play_helper.rb +9 -0
- data/spec/fidgit/elements/image_frame_spec.rb +69 -0
- data/spec/fidgit/elements/label_spec.rb +37 -0
- data/spec/fidgit/event_spec.rb +210 -0
- data/spec/fidgit/gosu_ext/color_spec.rb +130 -0
- data/spec/fidgit/gosu_ext/helpers/helper.rb +3 -0
- data/spec/fidgit/helpers/helper.rb +4 -0
- data/spec/fidgit/history_spec.rb +153 -0
- data/spec/fidgit/redirector_spec.rb +78 -0
- data/spec/fidgit/schema_spec.rb +67 -0
- data/spec/fidgit/schema_test.yml +32 -0
- metadata +320 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative "../lib/fidgit"
|
2
|
+
|
3
|
+
# Normally, you'd load this from the gem using:
|
4
|
+
# require 'fidgit'
|
5
|
+
|
6
|
+
class MyGame < Chingu::Window
|
7
|
+
def initialize
|
8
|
+
super(640, 480, false)
|
9
|
+
|
10
|
+
# To use the Fidgit features, a Fidgit::GuiState must be active.
|
11
|
+
push_game_state MyGuiState
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class MyGuiState < Fidgit::GuiState
|
16
|
+
def initialize
|
17
|
+
super
|
18
|
+
|
19
|
+
# Create a vertically packed section, centred on the window.
|
20
|
+
vertical align: :center do
|
21
|
+
# Create a label with a dark green background.
|
22
|
+
my_label = label "Hello world!", background_color: Gosu::Color.rgb(0, 100, 0)
|
23
|
+
|
24
|
+
# Create a button that, when clicked, changes the label text.
|
25
|
+
button("Goodbye", align_h: :center, tip: "Press me and be done with it!") do
|
26
|
+
my_label.text = "Goodbye cruel world!"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
MyGame.new.show
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative 'helpers/example_window'
|
2
|
+
|
3
|
+
# Example for Button and ToggleButton
|
4
|
+
class ExampleState < Fidgit::GuiState
|
5
|
+
HEIGHT = 225
|
6
|
+
WIDTH = 140
|
7
|
+
def initialize
|
8
|
+
super
|
9
|
+
|
10
|
+
vertical do
|
11
|
+
horizontal do
|
12
|
+
[
|
13
|
+
[20, "All cheer the ascendancy of number "], # Should have both scrollers
|
14
|
+
[20, "#"], # Only has v-scroller.
|
15
|
+
[4, "#"], # No scrollers.
|
16
|
+
[4, "All cheer the ascendancy of number "], # Only has h-scroller
|
17
|
+
].each do |num_labels, text|
|
18
|
+
vertical do
|
19
|
+
scroll_window(width: WIDTH, height: HEIGHT, background_color: Gosu::Color.rgb(0, 100, 0)) do
|
20
|
+
vertical do
|
21
|
+
(1..num_labels).each do |i|
|
22
|
+
label "#{text}#{i}!"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
horizontal padding: 0 do
|
31
|
+
vertical do
|
32
|
+
scroll_window(width: 300, height: 150) do
|
33
|
+
text_area(text: "Hello world! " * 19, width: 284)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
vertical do
|
38
|
+
scroll_window(width: 300, height: 150) do
|
39
|
+
%w[One Two Three Four Five Six].each do |name|
|
40
|
+
toggle_button(name)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
ExampleWindow.new.show
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative 'helpers/example_window'
|
2
|
+
|
3
|
+
class ExampleState < Fidgit::GuiState
|
4
|
+
def initialize
|
5
|
+
super
|
6
|
+
|
7
|
+
vertical do
|
8
|
+
horizontal do
|
9
|
+
# Discrete values (0..100)
|
10
|
+
slider = slider(width: 100, range: 0..5, value: 3, tip: "Discrete value is") do |sender, value|
|
11
|
+
@discrete_label.text = "Discrete slider is at #{value}"
|
12
|
+
end
|
13
|
+
|
14
|
+
@discrete_label = label "Discrete slider is at #{slider.value}"
|
15
|
+
end
|
16
|
+
|
17
|
+
horizontal do
|
18
|
+
# Continuous values (0.0..1.0)
|
19
|
+
|
20
|
+
slider = slider(width: 100, range: 0.0..100.0, value: 77.2, tip: "Continuous value is") do |sender, value|
|
21
|
+
@continuous_label.text = "Continuous slider is at #{"%.03f" % value}%"
|
22
|
+
end
|
23
|
+
|
24
|
+
@continuous_label = label "Continuous slider is at #{"%.03f" % slider.value}%"
|
25
|
+
end
|
26
|
+
|
27
|
+
horizontal do
|
28
|
+
slider(width: 100, range: 0.0..100.0, value: 77.2, tip: "Disabled slider value is", enabled: false)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
ExampleWindow.new.show
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'helpers/example_window'
|
2
|
+
|
3
|
+
# By using a splash screen of some sort, one can switch to another resolution for the main game.
|
4
|
+
class ExampleState < Fidgit::GuiState
|
5
|
+
def initialize
|
6
|
+
super
|
7
|
+
vertical do
|
8
|
+
horizontal do
|
9
|
+
text = label "Width:"
|
10
|
+
|
11
|
+
@width_combo = combo_box(value: [640, 480]) do
|
12
|
+
[[640, 480], [800, 600], [Gosu::screen_width, Gosu::screen_height]].each do |width, height|
|
13
|
+
item "#{width}x#{height}", [width, height]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
@full_screen_button = toggle_button "Fullscreen?"
|
19
|
+
|
20
|
+
button "Load game", icon: Gosu::Image["head_icon.png"] do
|
21
|
+
$window.close
|
22
|
+
window = Chingu::Window.new(*@width_combo.value, @full_screen_button.value)
|
23
|
+
window.push_game_state ExampleAfterState
|
24
|
+
window.show
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class ExampleAfterState < Fidgit::GuiState
|
31
|
+
def initialize
|
32
|
+
super
|
33
|
+
|
34
|
+
on_input(:esc, :exit)
|
35
|
+
|
36
|
+
vertical do
|
37
|
+
label "Game loaded!", icon: Gosu::Image["head_icon.png"], border_color: Gosu::Color.rgb(255, 255, 255)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
ExampleWindow.new.show
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'helpers/example_window'
|
2
|
+
|
3
|
+
class ExampleState < Fidgit::GuiState
|
4
|
+
def initialize
|
5
|
+
super
|
6
|
+
|
7
|
+
Gosu.register_entity(:entity, Gosu::Image["head_icon.png"])
|
8
|
+
|
9
|
+
string = "<c=3333ff>Hello, my name</c> is <c=ff0000>Brian</c> the&entity;&entity;snail!"
|
10
|
+
horizontal do
|
11
|
+
vertical do
|
12
|
+
label 'disabled'
|
13
|
+
text_area(text: "Can't even select this text", width: 200, enabled: false)
|
14
|
+
end
|
15
|
+
|
16
|
+
vertical do
|
17
|
+
label 'mirrors to right'
|
18
|
+
text_area(width: 200, text: string) do |_, text|
|
19
|
+
@mirror.text = text
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
vertical do
|
24
|
+
my_label = label 'not editable'
|
25
|
+
font = Gosu::Font.new($window, "", my_label.font.height)
|
26
|
+
font["a"] = Gosu::Image["head_icon.png"]
|
27
|
+
@mirror = text_area(text: string, width: 200, editable: false, font: font)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
ExampleWindow.new.show
|
data/fidgit.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
|
3
|
+
require 'fidgit/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'colstrom-fidgit'
|
7
|
+
s.version = Fidgit::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ['Bil Bas (Spooner)']
|
10
|
+
s.email = ['bil.bagpuss@gmail.com']
|
11
|
+
s.homepage = 'http://github.com/Spooner/fidgit/'
|
12
|
+
s.summary = "colstrom's fork of Spooner/fidgit"
|
13
|
+
s.description = 'Fidgit is a GUI library built on Gosu/Chingu'
|
14
|
+
|
15
|
+
s.rubyforge_project = 'fidgit'
|
16
|
+
s.has_rdoc = true
|
17
|
+
s.required_ruby_version = '>= 1.9.2'
|
18
|
+
|
19
|
+
s.files = `git ls-files`.split("\n")
|
20
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
22
|
+
s.require_paths = ['lib']
|
23
|
+
s.license = 'MIT'
|
24
|
+
|
25
|
+
s.add_runtime_dependency('gosu', '~> 0.7', '>= 0.7.41')
|
26
|
+
s.add_runtime_dependency('chingu', '~> 0.9rc9')
|
27
|
+
s.add_runtime_dependency('clipboard', '~> 0.9', '>= 0.9.9')
|
28
|
+
s.add_runtime_dependency('ffi', '~> 1.0', '>= 1.0.11')
|
29
|
+
|
30
|
+
s.add_development_dependency('rspec', '~> 2.8', '>= 2.8.0')
|
31
|
+
s.add_development_dependency('texplay', '~> 0.4', '>= 0.4.3')
|
32
|
+
s.add_development_dependency('rake', '~> 10.3', '>= 10.3.2')
|
33
|
+
s.add_development_dependency('yard', '~> 0.8.7', '>= 0.8.7.4')
|
34
|
+
s.add_development_dependency('RedCloth', '~> 4.2', '>= 4.2.9')
|
35
|
+
end
|
data/lib/fidgit.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'chingu'
|
3
|
+
require 'clipboard'
|
4
|
+
|
5
|
+
require_relative "fidgit/cursor"
|
6
|
+
require_relative "fidgit/event"
|
7
|
+
require_relative "fidgit/history"
|
8
|
+
require_relative "fidgit/redirector"
|
9
|
+
require_relative "fidgit/schema"
|
10
|
+
require_relative "fidgit/selection"
|
11
|
+
require_relative "fidgit/version"
|
12
|
+
require_relative "fidgit/window"
|
13
|
+
|
14
|
+
require_relative "fidgit/chingu_ext/window"
|
15
|
+
require_relative "fidgit/gosu_ext/color"
|
16
|
+
require_relative "fidgit/gosu_ext/gosu_module"
|
17
|
+
require_relative "fidgit/standard_ext/hash"
|
18
|
+
|
19
|
+
require_relative "fidgit/elements/element"
|
20
|
+
require_relative "fidgit/elements/container"
|
21
|
+
require_relative "fidgit/elements/packer"
|
22
|
+
require_relative "fidgit/elements/composite"
|
23
|
+
require_relative "fidgit/elements/grid"
|
24
|
+
require_relative "fidgit/elements/group"
|
25
|
+
require_relative "fidgit/elements/label"
|
26
|
+
require_relative "fidgit/elements/button"
|
27
|
+
require_relative "fidgit/elements/radio_button"
|
28
|
+
|
29
|
+
require_relative "fidgit/elements/color_picker"
|
30
|
+
require_relative "fidgit/elements/color_well"
|
31
|
+
require_relative "fidgit/elements/combo_box"
|
32
|
+
require_relative "fidgit/elements/file_browser"
|
33
|
+
require_relative "fidgit/elements/horizontal"
|
34
|
+
require_relative "fidgit/elements/image_frame"
|
35
|
+
require_relative "fidgit/elements/list"
|
36
|
+
require_relative "fidgit/elements/main_packer"
|
37
|
+
require_relative "fidgit/elements/menu_pane"
|
38
|
+
require_relative "fidgit/elements/scroll_area"
|
39
|
+
require_relative "fidgit/elements/scroll_bar"
|
40
|
+
require_relative "fidgit/elements/scroll_window"
|
41
|
+
require_relative "fidgit/elements/slider"
|
42
|
+
require_relative "fidgit/elements/text_area"
|
43
|
+
require_relative "fidgit/elements/text_line"
|
44
|
+
require_relative "fidgit/elements/toggle_button"
|
45
|
+
require_relative "fidgit/elements/tool_tip"
|
46
|
+
require_relative "fidgit/elements/vertical"
|
47
|
+
|
48
|
+
require_relative "fidgit/states/gui_state"
|
49
|
+
require_relative "fidgit/states/dialog_state"
|
50
|
+
require_relative "fidgit/states/file_dialog"
|
51
|
+
require_relative "fidgit/states/message_dialog"
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class Cursor < Chingu::GameObject
|
5
|
+
ARROW = 'arrow.png'
|
6
|
+
HAND = 'hand.png'
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
options = {
|
10
|
+
image: Gosu::Image[ARROW],
|
11
|
+
rotation_center: :top_left,
|
12
|
+
zorder: Float::INFINITY
|
13
|
+
}.merge!(options)
|
14
|
+
|
15
|
+
super(options)
|
16
|
+
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
# Is the mouse pointer position inside the game window pane?
|
21
|
+
def inside_window?
|
22
|
+
x >= 0 and y >= 0 and x < $window.width and y < $window.height
|
23
|
+
end
|
24
|
+
|
25
|
+
def update
|
26
|
+
self.x, self.y = $window.mouse_x, $window.mouse_y
|
27
|
+
|
28
|
+
super
|
29
|
+
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def draw
|
34
|
+
# Prevent system and game mouse from being shown at the same time.
|
35
|
+
super if inside_window? and $window.current_game_state.is_a? GuiState and not $window.needs_cursor?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class Button < Label
|
5
|
+
# @param (see Label#initialize)
|
6
|
+
# @option (see Label#initialize)
|
7
|
+
# @option options [Symbol] :shortcut (nil) Adds a shortcut key for this element, that activates it. :auto takes the first letter of the text.
|
8
|
+
def initialize(text, options = {}, &block)
|
9
|
+
options = {
|
10
|
+
color: default(:color),
|
11
|
+
background_color: default(:background_color),
|
12
|
+
border_color: default(:border_color),
|
13
|
+
shortcut_color: default(:shortcut_color),
|
14
|
+
shortcut: nil,
|
15
|
+
}.merge! options
|
16
|
+
|
17
|
+
@shortcut_color = options[:shortcut_color].dup
|
18
|
+
|
19
|
+
@shortcut = if options[:shortcut] == :auto
|
20
|
+
raise ArgumentError.new("Can't use :auto for :shortcut without text") if text.empty?
|
21
|
+
text[0].downcase.to_sym
|
22
|
+
else
|
23
|
+
options[:shortcut]
|
24
|
+
end
|
25
|
+
|
26
|
+
raise ArgumentError.new(":shortcut must be a symbol") unless @shortcut.nil? or @shortcut.is_a? Symbol
|
27
|
+
|
28
|
+
super(text, options)
|
29
|
+
|
30
|
+
self.text = text # Force shortcut to be written out properly.
|
31
|
+
|
32
|
+
update_colors
|
33
|
+
end
|
34
|
+
|
35
|
+
def text=(value)
|
36
|
+
if @shortcut
|
37
|
+
super value.sub(/#{Regexp.escape @shortcut}/i) {|char| "<c=#{@shortcut_color.to_hex}>#{char}</c>" }
|
38
|
+
else
|
39
|
+
super value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def parent=(value)
|
44
|
+
if @shortcut
|
45
|
+
state = $window.game_state_manager.inside_state || $window.current_game_state
|
46
|
+
if parent
|
47
|
+
raise ArgumentError.new("Repeat of shortcut #{@shortcut.inspect}") if state.input.has_key? @shortcut
|
48
|
+
state.on_input(@shortcut) { activate unless state.focus }
|
49
|
+
else
|
50
|
+
state.input.delete @shortcut
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
super(value)
|
55
|
+
end
|
56
|
+
|
57
|
+
def clicked_left_mouse_button(sender, x, y)
|
58
|
+
# TODO: Play click sound?
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
def enabled=(value)
|
63
|
+
super(value)
|
64
|
+
update_colors
|
65
|
+
|
66
|
+
value
|
67
|
+
end
|
68
|
+
|
69
|
+
def enter(sender)
|
70
|
+
@mouse_over = true
|
71
|
+
update_colors
|
72
|
+
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def leave(sender)
|
77
|
+
@mouse_over = false
|
78
|
+
update_colors
|
79
|
+
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
|
83
|
+
protected
|
84
|
+
def update_colors
|
85
|
+
[:color, :background_color].each do |attribute|
|
86
|
+
send :"#{attribute.to_s}=", enabled? ? default(attribute) : default(:disabled, attribute)
|
87
|
+
end
|
88
|
+
|
89
|
+
self.background_color = if @mouse_over and enabled?
|
90
|
+
default(:hover, :background_color)
|
91
|
+
else
|
92
|
+
default(:background_color)
|
93
|
+
end
|
94
|
+
|
95
|
+
@icon.enabled = enabled? if @icon
|
96
|
+
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
protected
|
101
|
+
# A block added to any button subscribes to LMB click.
|
102
|
+
def post_init_block(&block)
|
103
|
+
subscribe :clicked_left_mouse_button, &block
|
104
|
+
end
|
105
|
+
|
106
|
+
public
|
107
|
+
# Activate the button, as though it had been clicked on.
|
108
|
+
# Does not do anything if the button is disabled.
|
109
|
+
def activate
|
110
|
+
publish(:clicked_left_mouse_button, x + width / 2, y + height / 2) if enabled?
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class ColorPicker < Composite
|
5
|
+
CHANNELS = [:red, :green, :blue]
|
6
|
+
DEFAULT_CHANNEL_NAMES = CHANNELS.map {|c| c.to_s.capitalize }
|
7
|
+
|
8
|
+
INDICATOR_HEIGHT = 25
|
9
|
+
|
10
|
+
event :changed
|
11
|
+
|
12
|
+
def color; @color.dup; end
|
13
|
+
|
14
|
+
def color=(value)
|
15
|
+
@color = value.dup
|
16
|
+
CHANNELS.each do |channel|
|
17
|
+
@sliders[channel].value = @color.send channel
|
18
|
+
end
|
19
|
+
|
20
|
+
publish :changed, @color.dup
|
21
|
+
|
22
|
+
value
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param (see Composite#initialize)
|
26
|
+
# @option (see Composite#initialize)
|
27
|
+
def initialize(options = {}, &block)
|
28
|
+
options = {
|
29
|
+
padding: 0,
|
30
|
+
spacing: 0,
|
31
|
+
channel_names: DEFAULT_CHANNEL_NAMES,
|
32
|
+
color: default(:color),
|
33
|
+
indicator_height: default(:indicator_height),
|
34
|
+
}.merge! options
|
35
|
+
|
36
|
+
@color = options[:color].dup
|
37
|
+
@indicator_height = options[:indicator_height]
|
38
|
+
|
39
|
+
super(options)
|
40
|
+
|
41
|
+
slider_width = width
|
42
|
+
vertical do
|
43
|
+
@sliders = {}
|
44
|
+
CHANNELS.each_with_index do |channel, i|
|
45
|
+
@sliders[channel] = slider(value: @color.send(channel), range: 0..255, width: slider_width,
|
46
|
+
tip: options[:channel_names][i]) do |sender, value|
|
47
|
+
@color.send "#{channel}=", value
|
48
|
+
@indicator.background_color = @color
|
49
|
+
publish :changed, @color.dup
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
@indicator = label '', background_color: @color, width: slider_width, height: @indicator_height
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
# Use block as an event handler.
|
59
|
+
def post_init_block(&block)
|
60
|
+
subscribe :changed, &block
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|