fidgit 0.0.2alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/COPYING.txt +674 -0
- data/Gemfile +4 -0
- data/README.textile +138 -0
- data/Rakefile +38 -0
- data/config/default_schema.yml +180 -0
- data/examples/_all_examples.rb +9 -0
- data/examples/align_example.rb +56 -0
- data/examples/button_and_toggle_button_example.rb +27 -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 +17 -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 +30 -0
- data/examples/splash_example.rb +42 -0
- data/examples/text_area_example.rb +28 -0
- data/fidgit.gemspec +28 -0
- data/lib/fidgit.rb +4 -0
- data/lib/fidgit/chingu_ext/window.rb +6 -0
- data/lib/fidgit/clipboard.rb +23 -0
- data/lib/fidgit/cursor.rb +38 -0
- data/lib/fidgit/elements/button.rb +68 -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 +85 -0
- data/lib/fidgit/elements/composite.rb +17 -0
- data/lib/fidgit/elements/container.rb +187 -0
- data/lib/fidgit/elements/element.rb +252 -0
- data/lib/fidgit/elements/file_browser.rb +152 -0
- data/lib/fidgit/elements/grid_packer.rb +219 -0
- data/lib/fidgit/elements/group.rb +66 -0
- data/lib/fidgit/elements/horizontal_packer.rb +12 -0
- data/lib/fidgit/elements/label.rb +77 -0
- data/lib/fidgit/elements/list.rb +47 -0
- data/lib/fidgit/elements/menu_pane.rb +149 -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 +75 -0
- data/lib/fidgit/elements/scroll_bar.rb +114 -0
- data/lib/fidgit/elements/scroll_window.rb +92 -0
- data/lib/fidgit/elements/slider.rb +119 -0
- data/lib/fidgit/elements/text_area.rb +351 -0
- data/lib/fidgit/elements/toggle_button.rb +67 -0
- data/lib/fidgit/elements/tool_tip.rb +35 -0
- data/lib/fidgit/elements/vertical_packer.rb +12 -0
- data/lib/fidgit/event.rb +99 -0
- data/lib/fidgit/gosu_ext/color.rb +123 -0
- data/lib/fidgit/history.rb +85 -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 +42 -0
- data/lib/fidgit/states/file_dialog.rb +24 -0
- data/lib/fidgit/states/gui_state.rb +301 -0
- data/lib/fidgit/states/message_dialog.rb +61 -0
- data/lib/fidgit/thumbnail.rb +29 -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/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/label_spec.rb +49 -0
- data/spec/fidgit/event_spec.rb +149 -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/helpers/tex_play_helper.rb +9 -0
- data/spec/fidgit/history_spec.rb +144 -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
- data/spec/fidgit/thumbnail_spec.rb +50 -0
- metadata +177 -0
@@ -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
|
+
pack :vertical do
|
8
|
+
pack :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 < GuiState
|
31
|
+
def initialize
|
32
|
+
super
|
33
|
+
|
34
|
+
on_input(:esc, :exit)
|
35
|
+
|
36
|
+
pack :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,28 @@
|
|
1
|
+
require_relative 'helpers/example_window'
|
2
|
+
|
3
|
+
class ExampleState < Fidgit::GuiState
|
4
|
+
def initialize
|
5
|
+
super
|
6
|
+
|
7
|
+
pack :horizontal do
|
8
|
+
pack :vertical do
|
9
|
+
label 'editable'
|
10
|
+
text_area(width: 200)
|
11
|
+
end
|
12
|
+
|
13
|
+
pack :vertical do
|
14
|
+
label 'mirrors to right'
|
15
|
+
text_area(width: 200, text: "Hello, my name in brian the snail!") do |sender, text|
|
16
|
+
@mirror.text = text
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
pack :vertical do
|
21
|
+
label 'not editable'
|
22
|
+
@mirror = text_area(width: 200, enabled: false)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
ExampleWindow.new.show
|
data/fidgit.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "fidgit/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "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 = %q{Fidgit is a GUI library built on Gosu/Chingu}
|
13
|
+
s.description = %q{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
|
+
|
24
|
+
s.add_dependency('gosu')
|
25
|
+
s.add_dependency('chingu')
|
26
|
+
s.add_development_dependency('rspec')
|
27
|
+
s.add_development_dependency('texplay')
|
28
|
+
end
|
data/lib/fidgit.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class Clipboard
|
5
|
+
# Items held in the clipboard.
|
6
|
+
attr_reader :items
|
7
|
+
|
8
|
+
def empty?; @items.empty?; end
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@items = []
|
12
|
+
end
|
13
|
+
|
14
|
+
# Copy items into the clipboard.
|
15
|
+
#
|
16
|
+
# @param [Array] items Items to copy
|
17
|
+
def copy(items)
|
18
|
+
@items = items.to_a.dup
|
19
|
+
|
20
|
+
nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -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,68 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class Button < Label
|
5
|
+
# @param (see Label#initialize)
|
6
|
+
# @option (see Label#initialize)
|
7
|
+
def initialize(text, options = {}, &block)
|
8
|
+
options = {
|
9
|
+
color: default(:color),
|
10
|
+
background_color: default(:background_color),
|
11
|
+
border_color: default(:border_color),
|
12
|
+
}.merge! options
|
13
|
+
|
14
|
+
super(text, options)
|
15
|
+
|
16
|
+
update_colors
|
17
|
+
end
|
18
|
+
|
19
|
+
def clicked_left_mouse_button(sender, x, y)
|
20
|
+
# TODO: Play click sound?
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def enabled=(value)
|
25
|
+
super(value)
|
26
|
+
update_colors
|
27
|
+
|
28
|
+
value
|
29
|
+
end
|
30
|
+
|
31
|
+
def enter(sender)
|
32
|
+
@mouse_over = true
|
33
|
+
update_colors
|
34
|
+
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def leave(sender)
|
39
|
+
@mouse_over = false
|
40
|
+
update_colors
|
41
|
+
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
def update_colors
|
47
|
+
@background_color = if @mouse_over and enabled?
|
48
|
+
default(:hover, :background_color)
|
49
|
+
else
|
50
|
+
default(:background_color)
|
51
|
+
end
|
52
|
+
|
53
|
+
@color = if enabled?
|
54
|
+
default(:color)
|
55
|
+
else
|
56
|
+
default(:disabled, :color)
|
57
|
+
end
|
58
|
+
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
# A block added to any button subscribes to LMB click.
|
64
|
+
def post_init_block(&block)
|
65
|
+
subscribe :clicked_left_mouse_button, &block
|
66
|
+
end
|
67
|
+
end
|
68
|
+
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
|
+
pack :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
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class ColorWell < RadioButton
|
5
|
+
alias_method :color, :value
|
6
|
+
|
7
|
+
# @param (see RadioButton#initialize)
|
8
|
+
# @option (see RadioButton#initialize)
|
9
|
+
def initialize(options = {}, &block)
|
10
|
+
options = {
|
11
|
+
width: default(:width),
|
12
|
+
height: default(:height),
|
13
|
+
color: default(:color),
|
14
|
+
outline_color: default(:outline_color),
|
15
|
+
checked_border_color: default(:checked, :border_color),
|
16
|
+
}.merge! options
|
17
|
+
|
18
|
+
@outline_color = options[:outline_color].dup
|
19
|
+
|
20
|
+
super('', (options[:color] || options[:value]).dup, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
def draw_background
|
25
|
+
super
|
26
|
+
|
27
|
+
draw_frame x + 2, y + 2, width - 4, height - 4, 1, z, @outline_color
|
28
|
+
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
def draw_foreground
|
34
|
+
draw_rect x + 3, y + 3, width - 6, height - 6, z, value
|
35
|
+
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class ComboBox < Button
|
5
|
+
event :changed
|
6
|
+
|
7
|
+
def index; @menu.index(@value) end
|
8
|
+
def value; @value; end
|
9
|
+
|
10
|
+
def value=(value)
|
11
|
+
if @value != value
|
12
|
+
@value = value
|
13
|
+
@text = @menu.find(@value).text
|
14
|
+
publish :changed, @value
|
15
|
+
end
|
16
|
+
|
17
|
+
value
|
18
|
+
end
|
19
|
+
|
20
|
+
def index=(index)
|
21
|
+
if index.between?(0, @menu.size - 1)
|
22
|
+
self.value = @menu[index].value
|
23
|
+
end
|
24
|
+
|
25
|
+
index
|
26
|
+
end
|
27
|
+
|
28
|
+
# @param (see Button#initialize)
|
29
|
+
# @option (see Button#initialize)
|
30
|
+
# @option options [] :value
|
31
|
+
def initialize(options = {}, &block)
|
32
|
+
options = {
|
33
|
+
background_color: default(:background_color),
|
34
|
+
border_color: default(:border_color),
|
35
|
+
}.merge! options
|
36
|
+
|
37
|
+
@value = options[:value]
|
38
|
+
|
39
|
+
@hover_index = 0
|
40
|
+
|
41
|
+
@menu = MenuPane.new(show: false) do
|
42
|
+
subscribe :selected do |widget, value|
|
43
|
+
self.value = value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
super('', options)
|
48
|
+
|
49
|
+
rect.height = [height, font_size + padding_top + padding_bottom].max
|
50
|
+
rect.width = [width, font_size * 4 + padding_left + padding_right].max
|
51
|
+
end
|
52
|
+
|
53
|
+
def item(text, value, options = {}, &block)
|
54
|
+
item = @menu.item(text, value, options, &block)
|
55
|
+
|
56
|
+
# Force text to be updated if the item added has the same value.
|
57
|
+
if item.value == @value
|
58
|
+
@text = item.text
|
59
|
+
end
|
60
|
+
|
61
|
+
item
|
62
|
+
end
|
63
|
+
|
64
|
+
def clicked_left_mouse_button(sender, x, y)
|
65
|
+
@menu.x = self.x
|
66
|
+
@menu.y = self.y + height + border_thickness
|
67
|
+
$window.game_state_manager.current_game_state.show_menu @menu
|
68
|
+
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
protected
|
73
|
+
# Any combo-box passed a block will allow you access to its methods.
|
74
|
+
def post_init_block(&block)
|
75
|
+
case block.arity
|
76
|
+
when 1
|
77
|
+
yield self
|
78
|
+
when 0
|
79
|
+
instance_methods_eval &block
|
80
|
+
else
|
81
|
+
raise "block arity must be 0 or 1"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
# A composite element, made up of other elements (but manages them internally).
|
5
|
+
class Composite < Packer
|
6
|
+
DEBUG_BORDER_COLOR = Gosu::Color.rgba(0, 255, 0, 100) # Color to draw an outline in when debugging layout.
|
7
|
+
|
8
|
+
# @param (see Element#initialize)
|
9
|
+
#
|
10
|
+
# @option (see Element#initialize)
|
11
|
+
def initialize(options = {})
|
12
|
+
options[:border_color] = DEBUG_BORDER_COLOR if Fidgit.debug_mode?
|
13
|
+
|
14
|
+
super(options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|