mirror of
https://github.com/cyberarm/cyberarm_engine.git
synced 2025-12-17 05:22:35 +00:00
Compare commits
21 Commits
v0.19.0
...
f2ea0d9942
| Author | SHA1 | Date | |
|---|---|---|---|
| f2ea0d9942 | |||
| 08d068f156 | |||
| a4d02038c3 | |||
| 37bdd6ef23 | |||
| 24bd769a32 | |||
| 2be5733bc1 | |||
| c8734ae98b | |||
| c35d587419 | |||
| 153871e7f3 | |||
| cf91d4a083 | |||
| 35ad687d4c | |||
| 54802e1254 | |||
| 6cf4cd73dd | |||
| 5e5f8ba7ea | |||
| 63a51d9d2f | |||
| 6af384536a | |||
| c1b25d2045 | |||
| a915a25699 | |||
| 0aa9b59316 | |||
| d2bf406d29 | |||
| f82c101728 |
@@ -27,8 +27,8 @@ Gem::Specification.new do |spec|
|
|||||||
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
||||||
spec.require_paths = %w[lib assets]
|
spec.require_paths = %w[lib assets]
|
||||||
|
|
||||||
spec.add_dependency "clipboard", "~> 1.3.5"
|
spec.add_dependency "clipboard", "~> 1.3"
|
||||||
spec.add_dependency "excon", "~> 0.78.0"
|
spec.add_dependency "excon", "~> 0.88"
|
||||||
spec.add_dependency "gosu", "~> 1.1"
|
spec.add_dependency "gosu", "~> 1.1"
|
||||||
spec.add_dependency "gosu_more_drawables", "~> 0.3"
|
spec.add_dependency "gosu_more_drawables", "~> 0.3"
|
||||||
# spec.add_dependency "ffi", :platforms => [:mswin, :mingw] # Required by Clipboard on Windows
|
# spec.add_dependency "ffi", :platforms => [:mswin, :mingw] # Required by Clipboard on Windows
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ module CyberarmEngine
|
|||||||
include Event
|
include Event
|
||||||
include Common
|
include Common
|
||||||
|
|
||||||
attr_accessor :x, :y, :z, :enabled, :tip
|
attr_accessor :x, :y, :z, :tip, :element_visible
|
||||||
attr_reader :parent, :options, :style, :event_handler, :background_canvas, :border_canvas
|
attr_reader :parent, :options, :style, :event_handler, :background_canvas, :border_canvas
|
||||||
|
|
||||||
def initialize(options = {}, block = nil)
|
def initialize(options = {}, block = nil)
|
||||||
@@ -13,9 +13,9 @@ module CyberarmEngine
|
|||||||
@options = options
|
@options = options
|
||||||
@block = block
|
@block = block
|
||||||
|
|
||||||
@focus = @options[:focus].nil? ? false : @options[:focus]
|
@focus = !@options.key?(:focus) ? false : @options[:focus]
|
||||||
@enabled = @options[:enabled].nil? ? true : @options[:enabled]
|
@enabled = !@options.key?(:enabled) ? true : @options[:enabled]
|
||||||
@visible = @options[:visible].nil? ? true : @options[:visible]
|
@visible = !@options.key?(:visible) ? true : @options[:visible]
|
||||||
@tip = @options[:tip] || ""
|
@tip = @options[:tip] || ""
|
||||||
|
|
||||||
@debug_color = @options[:debug_color].nil? ? Gosu::Color::RED : @options[:debug_color]
|
@debug_color = @options[:debug_color].nil? ? Gosu::Color::RED : @options[:debug_color]
|
||||||
@@ -24,6 +24,7 @@ module CyberarmEngine
|
|||||||
|
|
||||||
@root ||= nil
|
@root ||= nil
|
||||||
@gui_state ||= nil
|
@gui_state ||= nil
|
||||||
|
@element_visible = true
|
||||||
|
|
||||||
@x = @style.x
|
@x = @style.x
|
||||||
@y = @style.y
|
@y = @style.y
|
||||||
@@ -51,6 +52,9 @@ module CyberarmEngine
|
|||||||
def stylize
|
def stylize
|
||||||
set_static_position
|
set_static_position
|
||||||
|
|
||||||
|
set_color
|
||||||
|
set_font
|
||||||
|
|
||||||
set_padding
|
set_padding
|
||||||
set_margin
|
set_margin
|
||||||
|
|
||||||
@@ -70,6 +74,15 @@ module CyberarmEngine
|
|||||||
@y = @style.y if @style.y != 0
|
@y = @style.y if @style.y != 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_color
|
||||||
|
@style.color = safe_style_fetch(:color)
|
||||||
|
@text&.color = @style.color
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_font
|
||||||
|
@text&.swap_font(safe_style_fetch(:text_size), safe_style_fetch(:font))
|
||||||
|
end
|
||||||
|
|
||||||
def set_background
|
def set_background
|
||||||
@style.background = safe_style_fetch(:background)
|
@style.background = safe_style_fetch(:background)
|
||||||
|
|
||||||
@@ -138,14 +151,8 @@ module CyberarmEngine
|
|||||||
old_width = width
|
old_width = width
|
||||||
old_height = height
|
old_height = height
|
||||||
|
|
||||||
_style = @style.send(event)
|
|
||||||
@style_event = event
|
@style_event = event
|
||||||
|
|
||||||
if @text.is_a?(CyberarmEngine::Text)
|
|
||||||
@text.color = _style&.dig(:color) || @style.default[:color]
|
|
||||||
@text.swap_font(_style&.dig(:text_size) || @style.default[:text_size], _style&.dig(:font) || @style.default[:font])
|
|
||||||
end
|
|
||||||
|
|
||||||
return if self.is_a?(ToolTip)
|
return if self.is_a?(ToolTip)
|
||||||
|
|
||||||
if old_width != width || old_height != height
|
if old_width != width || old_height != height
|
||||||
@@ -238,6 +245,14 @@ module CyberarmEngine
|
|||||||
:handled
|
:handled
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def enabled=(boolean)
|
||||||
|
@enabled = boolean
|
||||||
|
|
||||||
|
recalculate
|
||||||
|
|
||||||
|
@enabled
|
||||||
|
end
|
||||||
|
|
||||||
def enabled?
|
def enabled?
|
||||||
@enabled
|
@enabled
|
||||||
end
|
end
|
||||||
@@ -246,6 +261,10 @@ module CyberarmEngine
|
|||||||
@visible
|
@visible
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def element_visible?
|
||||||
|
@element_visible
|
||||||
|
end
|
||||||
|
|
||||||
def toggle
|
def toggle
|
||||||
@visible = !@visible
|
@visible = !@visible
|
||||||
root.gui_state.request_recalculate
|
root.gui_state.request_recalculate
|
||||||
@@ -265,14 +284,13 @@ module CyberarmEngine
|
|||||||
|
|
||||||
def draw
|
def draw
|
||||||
return unless visible?
|
return unless visible?
|
||||||
|
return unless element_visible?
|
||||||
|
|
||||||
@style.background_canvas.draw
|
@style.background_canvas.draw
|
||||||
@style.background_nine_slice_canvas.draw
|
@style.background_nine_slice_canvas.draw
|
||||||
@style.border_canvas.draw
|
@style.border_canvas.draw
|
||||||
|
|
||||||
Gosu.clip_to(@x, @y, width, height) do
|
render
|
||||||
render
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def debug_draw
|
def debug_draw
|
||||||
@@ -370,19 +388,42 @@ module CyberarmEngine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def scroll_width
|
def scroll_width
|
||||||
@children.sum(&:width) + noncontent_width
|
@children.sum(&:outer_width)
|
||||||
end
|
end
|
||||||
|
|
||||||
def scroll_height
|
def scroll_height
|
||||||
@children.sum(&:height) + noncontent_height
|
if is_a?(CyberarmEngine::Element::Flow)
|
||||||
|
return 0 if @children.size.zero?
|
||||||
|
|
||||||
|
pairs_ = []
|
||||||
|
sorted_children_ = @children.sort_by(&:y)
|
||||||
|
a_ = []
|
||||||
|
y_position_ = sorted_children_.first.y
|
||||||
|
|
||||||
|
sorted_children_.each do |child|
|
||||||
|
unless child.y == y_position_
|
||||||
|
y_position_ = child.y
|
||||||
|
pairs_ << a_
|
||||||
|
a_ = []
|
||||||
|
end
|
||||||
|
|
||||||
|
a_ << child
|
||||||
|
end
|
||||||
|
|
||||||
|
pairs_ << a_ unless pairs_.last == a_
|
||||||
|
|
||||||
|
pairs_.sum { |pair| pair.map(&:outer_height).max } + @style.padding_bottom + @style.border_thickness_bottom
|
||||||
|
else
|
||||||
|
@children.sum(&:outer_height) + @style.padding_bottom + @style.border_thickness_bottom
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def max_scroll_width
|
def max_scroll_width
|
||||||
scroll_width - width
|
scroll_width - outer_width
|
||||||
end
|
end
|
||||||
|
|
||||||
def max_scroll_height
|
def max_scroll_height
|
||||||
scroll_height - height
|
scroll_height - outer_height
|
||||||
end
|
end
|
||||||
|
|
||||||
def dimensional_size(size, dimension)
|
def dimensional_size(size, dimension)
|
||||||
|
|||||||
@@ -86,9 +86,12 @@ module CyberarmEngine
|
|||||||
|
|
||||||
old_width = width
|
old_width = width
|
||||||
old_height = height
|
old_height = height
|
||||||
recalculate
|
|
||||||
|
|
||||||
root.gui_state.request_recalculate if old_width != width || old_height != height
|
if old_width != width || old_height != height
|
||||||
|
root.gui_state.request_recalculate
|
||||||
|
else
|
||||||
|
recalculate
|
||||||
|
end
|
||||||
|
|
||||||
publish(:changed, self.value)
|
publish(:changed, self.value)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ module CyberarmEngine
|
|||||||
root.gui_state.request_recalculate
|
root.gui_state.request_recalculate
|
||||||
end
|
end
|
||||||
|
|
||||||
def apend(&block)
|
def append(&block)
|
||||||
old_container = $__current_container__
|
old_container = $__current_container__
|
||||||
|
|
||||||
$__current_container__ = self
|
$__current_container__ = self
|
||||||
@@ -57,7 +57,12 @@ module CyberarmEngine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def render
|
def render
|
||||||
Gosu.clip_to(@x, @y, width, height) do
|
Gosu.clip_to(
|
||||||
|
@x + @style.border_thickness_left + @style.padding_left,
|
||||||
|
@y + @style.border_thickness_top + @style.padding_top,
|
||||||
|
content_width + 1,
|
||||||
|
content_height + 1
|
||||||
|
) do
|
||||||
@children.each(&:draw)
|
@children.each(&:draw)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -103,6 +108,8 @@ module CyberarmEngine
|
|||||||
|
|
||||||
stylize
|
stylize
|
||||||
|
|
||||||
|
# s = Gosu.milliseconds
|
||||||
|
|
||||||
layout
|
layout
|
||||||
|
|
||||||
if is_root?
|
if is_root?
|
||||||
@@ -117,6 +124,26 @@ module CyberarmEngine
|
|||||||
|
|
||||||
@width = _width || (@children.map { |c| c.x + c.outer_width }.max || 0).round
|
@width = _width || (@children.map { |c| c.x + c.outer_width }.max || 0).round
|
||||||
@height = _height || (@children.map { |c| c.y + c.outer_height }.max || 0).round
|
@height = _height || (@children.map { |c| c.y + c.outer_height }.max || 0).round
|
||||||
|
|
||||||
|
# min width/height
|
||||||
|
@width = @style.min_width if @style.min_width && @width < @style.min_width
|
||||||
|
@height = @style.min_height if @style.min_height && @height < @style.min_height
|
||||||
|
|
||||||
|
# max width/height
|
||||||
|
@width = @style.max_width if @style.max_width && @width > @style.max_width
|
||||||
|
@height = @style.max_height if @style.max_height && @height > @style.max_height
|
||||||
|
|
||||||
|
if @parent && @style.fill
|
||||||
|
fill_siblings = @parent.children.select { |c| c.style.fill }.count.to_f # include self since we're dividing
|
||||||
|
|
||||||
|
space_available_width = ((@parent.content_width - (@parent.children.reject { |c| c.style.fill }).map(&:outer_width).sum) / fill_siblings).round
|
||||||
|
space_available_height = ((@parent.content_height - (@parent.children.reject { |c| c.style.fill }).map(&:outer_height).sum) / fill_siblings).round
|
||||||
|
|
||||||
|
@width = space_available_width - noncontent_width if @parent.is_a?(Flow)
|
||||||
|
@height = space_available_height - noncontent_height if @parent.is_a?(Stack)
|
||||||
|
|
||||||
|
# pp ["siblings: #{fill_siblings}", "parent is #{@parent.inspect}", [@parent.content_width, space_available_width, @width, outer_width], [@parent.content_height, space_available_height, @height, outer_height]]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Move child to parent after positioning
|
# Move child to parent after positioning
|
||||||
@@ -129,8 +156,13 @@ module CyberarmEngine
|
|||||||
child.reposition # TODO: Implement top,bottom,left,center, and right positioning
|
child.reposition # TODO: Implement top,bottom,left,center, and right positioning
|
||||||
|
|
||||||
Stats.increment(:gui_recalculations_last_frame, 1)
|
Stats.increment(:gui_recalculations_last_frame, 1)
|
||||||
|
|
||||||
|
child.element_visible = child.x >= @x - child.width && child.x <= @x + width &&
|
||||||
|
child.y >= @y - child.height && child.y <= @y + height
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# puts "TOOK: #{Gosu.milliseconds - s}ms to recalculate #{self.class}:0x#{self.object_id.to_s(16)}"
|
||||||
|
|
||||||
update_background
|
update_background
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -139,12 +171,14 @@ module CyberarmEngine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def max_width
|
def max_width
|
||||||
_width = dimensional_size(@style.width, :width)
|
# _width = dimensional_size(@style.width, :width)
|
||||||
if _width
|
# if _width
|
||||||
outer_width
|
# outer_width
|
||||||
else
|
# else
|
||||||
window.width - (@parent ? @parent.style.margin_right + @style.margin_right : @style.margin_right)
|
# window.width - (@parent ? @parent.style.margin_right + @style.margin_right : @style.margin_right)
|
||||||
end
|
# end
|
||||||
|
|
||||||
|
outer_width
|
||||||
end
|
end
|
||||||
|
|
||||||
def fits_on_line?(element) # Flow
|
def fits_on_line?(element) # Flow
|
||||||
@@ -194,7 +228,8 @@ module CyberarmEngine
|
|||||||
if @scroll_position.y < 0
|
if @scroll_position.y < 0
|
||||||
@scroll_position.y += @scroll_speed
|
@scroll_position.y += @scroll_speed
|
||||||
@scroll_position.y = 0 if @scroll_position.y > 0
|
@scroll_position.y = 0 if @scroll_position.y > 0
|
||||||
recalculate
|
|
||||||
|
root.gui_state.request_recalculate_for(self)
|
||||||
|
|
||||||
return :handled
|
return :handled
|
||||||
end
|
end
|
||||||
@@ -208,7 +243,8 @@ module CyberarmEngine
|
|||||||
if @scroll_position.y.abs < max_scroll_height
|
if @scroll_position.y.abs < max_scroll_height
|
||||||
@scroll_position.y -= @scroll_speed
|
@scroll_position.y -= @scroll_speed
|
||||||
@scroll_position.y = -max_scroll_height if @scroll_position.y.abs > max_scroll_height
|
@scroll_position.y = -max_scroll_height if @scroll_position.y.abs > max_scroll_height
|
||||||
recalculate
|
|
||||||
|
root.gui_state.request_recalculate_for(self)
|
||||||
|
|
||||||
return :handled
|
return :handled
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -46,10 +46,18 @@ module CyberarmEngine
|
|||||||
:handled
|
:handled
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def clicked_left_mouse_button(_sender, _x, _y)
|
||||||
|
# @block&.call(self.value) if @enabled
|
||||||
|
|
||||||
|
:handled
|
||||||
|
end
|
||||||
|
|
||||||
def show_menu
|
def show_menu
|
||||||
@menu.clear
|
@menu.clear
|
||||||
|
|
||||||
@items.each do |item|
|
@items.each do |item|
|
||||||
|
next if item == self.value
|
||||||
|
|
||||||
btn = Button.new(
|
btn = Button.new(
|
||||||
item,
|
item,
|
||||||
{
|
{
|
||||||
@@ -61,7 +69,7 @@ module CyberarmEngine
|
|||||||
},
|
},
|
||||||
proc do
|
proc do
|
||||||
self.choose = item
|
self.choose = item
|
||||||
@block&.call(item)
|
@block&.call(self.value)
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,16 @@
|
|||||||
module CyberarmEngine
|
module CyberarmEngine
|
||||||
class Element
|
class Element
|
||||||
class Progress < Element
|
class Progress < Element
|
||||||
|
attr_reader :type
|
||||||
|
|
||||||
def initialize(options = {}, block = nil)
|
def initialize(options = {}, block = nil)
|
||||||
super(options, block)
|
super(options, block)
|
||||||
|
|
||||||
|
@animation_speed = options[:animation_speed] || 3_000
|
||||||
|
@marquee_width = options[:marquee_width] || 0.25
|
||||||
|
@marquee_offset = 0
|
||||||
|
@marquee_animation_time = Gosu.milliseconds
|
||||||
|
@type = options[:type] || :linear
|
||||||
@fraction_background = Background.new(background: @style.fraction_background)
|
@fraction_background = Background.new(background: @style.fraction_background)
|
||||||
self.value = options[:fraction] || 0.0
|
self.value = options[:fraction] || 0.0
|
||||||
end
|
end
|
||||||
@@ -24,15 +31,45 @@ module CyberarmEngine
|
|||||||
def update_background
|
def update_background
|
||||||
super
|
super
|
||||||
|
|
||||||
@fraction_background.x = @style.border_thickness_left + @style.padding_left + @x
|
@fraction_background.x = (@style.border_thickness_left + @style.padding_left + @x) + @marquee_offset
|
||||||
@fraction_background.y = @style.border_thickness_top + @style.padding_top + @y
|
@fraction_background.y = @style.border_thickness_top + @style.padding_top + @y
|
||||||
@fraction_background.z = @z
|
@fraction_background.z = @z
|
||||||
@fraction_background.width = @width * @fraction
|
@fraction_background.width = @width * (@type == :marquee ? @marquee_width : @fraction)
|
||||||
@fraction_background.height = @height
|
@fraction_background.height = @height
|
||||||
|
|
||||||
@fraction_background.background = @style.fraction_background
|
@fraction_background.background = @style.fraction_background
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
super
|
||||||
|
|
||||||
|
return unless @type == :marquee
|
||||||
|
|
||||||
|
marquee_width = @width * @marquee_width
|
||||||
|
range = @width + marquee_width
|
||||||
|
|
||||||
|
@marquee_offset = (@width * (Gosu.milliseconds - @marquee_animation_time) / @animation_speed) - marquee_width
|
||||||
|
@marquee_animation_time = Gosu.milliseconds if @marquee_offset > range
|
||||||
|
|
||||||
|
update_background
|
||||||
|
end
|
||||||
|
|
||||||
|
def type=(type)
|
||||||
|
@type = type
|
||||||
|
|
||||||
|
case type
|
||||||
|
when :linear
|
||||||
|
@marquee_offset = 0
|
||||||
|
when :marquee
|
||||||
|
@marquee_offset = 0
|
||||||
|
@marquee_animation_time = Gosu.milliseconds
|
||||||
|
else
|
||||||
|
raise ArgumentError, "Only types :linear and :marquee are supported"
|
||||||
|
end
|
||||||
|
|
||||||
|
update_background
|
||||||
|
end
|
||||||
|
|
||||||
def value
|
def value
|
||||||
@fraction
|
@fraction
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ module CyberarmEngine
|
|||||||
when :left
|
when :left
|
||||||
@text.x = @style.border_thickness_left + @style.padding_left + @x
|
@text.x = @style.border_thickness_left + @style.padding_left + @x
|
||||||
when :center
|
when :center
|
||||||
@text.x = if @text.width <= outer_width
|
@text.x = if @text.width <= width
|
||||||
@x + outer_width / 2 - @text.width / 2
|
@x + width / 2 - @text.width / 2
|
||||||
else # Act as left aligned
|
else # Act as left aligned
|
||||||
@style.border_thickness_left + @style.padding_left + @x
|
@style.border_thickness_left + @style.padding_left + @x
|
||||||
end
|
end
|
||||||
@@ -61,46 +61,64 @@ module CyberarmEngine
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle_text_wrapping(max_width)
|
def handle_text_wrapping(max_width)
|
||||||
max_width ||= @parent&.width
|
max_width ||= @parent&.content_width
|
||||||
max_width ||= @x - (window.width + noncontent_width)
|
max_width ||= @x - (window.width + noncontent_width)
|
||||||
wrap_behavior = style.text_wrap
|
wrap_behavior = style.text_wrap
|
||||||
copy = @raw_text.to_s.dup
|
copy = @raw_text.to_s.dup
|
||||||
|
|
||||||
if line_width(copy[0]) <= max_width && line_width(copy) > max_width && wrap_behavior != :none
|
# Only perform text wrapping: if it is enabled, is possible to wrap, and text is too long to fit on one line
|
||||||
breaks = []
|
if wrap_behavior != :none && line_width(copy[0]) <= max_width && line_width(copy) > max_width
|
||||||
|
breaks = [] # list of indexes to insert a line break
|
||||||
line_start = 0
|
line_start = 0
|
||||||
line_end = copy.length
|
line_end = copy.length
|
||||||
|
|
||||||
while line_start != copy.length
|
stalled = false
|
||||||
if line_width(copy[line_start...line_end]) > max_width
|
stalled_interations = 0
|
||||||
line_end = ((line_end - line_start) / 2.0)
|
max_stalled_iterations = 10
|
||||||
line_end = 1.0 if line_end <= 1
|
checked_copy_length = line_width(copy[line_start..line_end])
|
||||||
elsif line_end < copy.length && line_width(copy[line_start...line_end + 1]) < max_width
|
|
||||||
# To small, grow!
|
|
||||||
# TODO: find a more efficient way
|
|
||||||
line_end += 1
|
|
||||||
|
|
||||||
else # FOUND IT!
|
# find length of lines
|
||||||
entering_line_end = line_end.floor
|
while line_width(copy[line_start..line_end]) > max_width && stalled_interations < max_stalled_iterations
|
||||||
max_reach = line_end.floor - line_start < 63 ? line_end.floor - line_start : 63
|
search_start = line_start
|
||||||
reach = 0
|
search_end = line_end
|
||||||
|
|
||||||
if wrap_behavior == :word_wrap
|
# Perform a binary search to find length of line
|
||||||
max_reach.times do |i|
|
while search_start < search_end
|
||||||
reach = i
|
midpoint = ((search_start.to_f + search_end) / 2.0).floor
|
||||||
break if copy[line_end.floor - i].to_s.match(/[[:punct:]]| /)
|
|
||||||
|
if line_width(copy[line_start..midpoint]) > max_width
|
||||||
|
search_end = midpoint
|
||||||
|
else
|
||||||
|
search_start = midpoint + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if wrap_behavior == :word_wrap
|
||||||
|
word_search_end = search_end
|
||||||
|
failed = false
|
||||||
|
|
||||||
|
until(copy[word_search_end].to_s.match(/[[:punct:]]| /))
|
||||||
|
word_search_end -= 1
|
||||||
|
|
||||||
|
if word_search_end <= 1 || word_search_end < line_start
|
||||||
|
failed = true
|
||||||
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
# puts "Max width: #{max_width}/#{line_width(@raw_text)} Reach: {#{reach}/#{max_reach}} Line Start: #{line_start}/#{line_end.floor} (#{copy.length}|#{@raw_text.length}) [#{entering_line_end}] '#{copy}' {#{copy[line_start...line_end]}}"
|
|
||||||
line_end = line_end.floor - reach + 1 if reach != max_reach # Add +1 to walk in front of punctuation
|
|
||||||
end
|
end
|
||||||
|
|
||||||
breaks << line_end.floor
|
line_start = failed ? search_end : word_search_end + 1 # walk in front of punctuation
|
||||||
line_start = line_end.floor
|
else
|
||||||
line_end = copy.length
|
line_start = search_end
|
||||||
|
|
||||||
break if entering_line_end == copy.length || reach == max_reach
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
breaks << line_start
|
||||||
|
|
||||||
|
# Prevent locking up due to outer while loop text width < max_width check not being satisfied.
|
||||||
|
stalled = checked_copy_length == line_width(copy[line_start..line_end])
|
||||||
|
checked_copy_length = line_width(copy[line_start..line_end])
|
||||||
|
|
||||||
|
stalled_interations += 1 if stalled
|
||||||
|
stalled_interations = 0 unless stalled
|
||||||
end
|
end
|
||||||
|
|
||||||
breaks.each_with_index do |pos, index|
|
breaks.each_with_index do |pos, index|
|
||||||
@@ -124,9 +142,12 @@ module CyberarmEngine
|
|||||||
|
|
||||||
old_width = width
|
old_width = width
|
||||||
old_height = height
|
old_height = height
|
||||||
recalculate
|
|
||||||
|
|
||||||
root.gui_state.request_recalculate if old_width != width || old_height != height
|
if old_width != width || old_height != height
|
||||||
|
root.gui_state.request_recalculate
|
||||||
|
else
|
||||||
|
recalculate
|
||||||
|
end
|
||||||
|
|
||||||
publish(:changed, self.value)
|
publish(:changed, self.value)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ module CyberarmEngine
|
|||||||
@last_mouse_pos = nil
|
@last_mouse_pos = nil
|
||||||
@dragging_element = nil
|
@dragging_element = nil
|
||||||
@pending_recalculate_request = false
|
@pending_recalculate_request = false
|
||||||
|
@pending_element_recalculate_requests = []
|
||||||
|
|
||||||
@menu = nil
|
@menu = nil
|
||||||
@min_drag_distance = 0
|
@min_drag_distance = 0
|
||||||
@@ -56,6 +57,7 @@ module CyberarmEngine
|
|||||||
|
|
||||||
if @tip.value.length.positive?
|
if @tip.value.length.positive?
|
||||||
Gosu.flush
|
Gosu.flush
|
||||||
|
|
||||||
@tip.draw
|
@tip.draw
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -75,6 +77,9 @@ module CyberarmEngine
|
|||||||
@pending_recalculate_request = false
|
@pending_recalculate_request = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@pending_element_recalculate_requests.each(&:recalculate)
|
||||||
|
@pending_element_recalculate_requests.clear
|
||||||
|
|
||||||
if @pending_focus_request
|
if @pending_focus_request
|
||||||
@pending_focus_request = false
|
@pending_focus_request = false
|
||||||
|
|
||||||
@@ -231,6 +236,13 @@ module CyberarmEngine
|
|||||||
@pending_recalculate_request = true
|
@pending_recalculate_request = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def request_recalculate_for(element)
|
||||||
|
# element is already queued
|
||||||
|
return if @pending_element_recalculate_requests.detect { |e| e == element }
|
||||||
|
|
||||||
|
@pending_element_recalculate_requests << element
|
||||||
|
end
|
||||||
|
|
||||||
def request_focus(element)
|
def request_focus(element)
|
||||||
@pending_focus_request = true
|
@pending_focus_request = true
|
||||||
@pending_focus_element = element
|
@pending_focus_element = element
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
module CyberarmEngine
|
module CyberarmEngine
|
||||||
NAME = "InDev".freeze
|
NAME = "InDev".freeze
|
||||||
VERSION = "0.19.0".freeze
|
VERSION = "0.20.0".freeze
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user