123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- module Zori
- # The root widget is the single toplevel widget that holds all
- # other sub-widgets.
- class Root
- include Widget
- # There are two cursors, a mouse cursor and a keyboard/joystick one.
-
- # Non-mouse cursor graph
- attr_reader :cursor_graph
- # Non-mouse cursor image
- attr_reader :cursor_image
- # Mouse cursor graph
- attr_reader :mouse_graph
- # Mouse cursor image
- attr_reader :mouse_image
-
- # Non-mouse cursor currently "focusing" this widget.
- attr_reader :cursor_widget
-
- # Default font for the UI.
- attr_reader :font
-
- # Loads the common data for the Root widget.
- def load_common_data
- @font = Font.load(:font_gui, '/font/unifont.ttf', 16)
-
- @mouse_image = Bitmap.load(:mouse_cursor,
- '/image/gin/fountain-pen_32.png')
- @mouse_image.average_to_alpha(255,255,255)
- @mouse_graph = Graph.make_image(200, 200, @mouse_image.id)
- @mouse_graph.z = 9999
- @mouse_graph.image_flags = Eruta::FLIP_HORIZONTAL | Eruta::FLIP_VERTICAL
-
- @cursor_image = Bitmap.load(:cursor, '/image/gin/curled-leaf_32.png')
- @cursor_image.average_to_alpha(255,255,255)
- @cursor_graph = Graph.make_image(100,100, @cursor_image.id)
- @cursor_graph.z = 10000
- @cursor_graph.image_flags = Eruta::FLIP_HORIZONTAL
- # @cursor_graph.speed = [ rand(10) - 5, rand(10) - 5]
-
- Eruta.show_mouse_cursor = false
- end
-
- def initialize(params={}, &block)
- load_common_data
- @pages = {}
- @active = nil
- @cursor_widget = nil
- end
- # Creates a select mark graph for any widget
- def create_select_mark
- select_mark = Graph.make_image(100, 100, @cursor_image.id)
- select_mark.z = 9998
- select_mark.image_flags = Eruta::FLIP_HORIZONTAL
- return select_mark
- end
-
- # Unregisters a page
- def register(page)
- @pages ||= {}
- @pages[page.name.to_sym] = page
- end
-
- # Registers a page
- def unregister(page)
- @pages ||= {}
- @pages[page.name.to_sym] = nil
- end
- # Returns the page for the given name.
- def for_name(name)
- @pages ||= {}
- return @pages[name.to_sym]
- end
- # Looks up a registered page
- def [](name)
- return for_name(name)
- end
-
- # Returns the currently active page or nil for none.
- def active
- @active
- end
-
- # Returns the currently active page id or nil for none.
- def active_id
- return nil unless @active
- return @active.name
- end
-
- # Activates the named page, and passes the data if any.
- # Returns true on success or false if no such page is registered.
- def go(name, data = {})
- page = self.for_name(name)
- return false unless page
- @active.on_leave(name) if @active
- @active = page
- @active.on_enter(data)
- return true
- end
-
- # Sends the event to the active page
- def on_event(*args)
- # move the mouse cursor around in all cases
- if args[0] == :mouse_axes
- x = args[2]
- y = args[3]
- @mouse_graph.position = [x, y] if @mouse_graph
- end
- return nil unless @active
- return @active.on_event(*args)
- end
- # Moves the keyboard cursor to a given position
- def move_cursor(x, y)
- @cursor_graph.position = x, y
- end
- # Sets the given widget as the one widget that is marked by the keyboard
- # cursor.
- def mark_widget(widget)
- return false unless widget.mark
- @cursor_widget.unmark if @cursor_widget
- @cursor_widget = widget
- move_cursor(widget.x + widget.w, widget.y)
- return true
- end
- # Sets the given widget as the one that is hovered by the mouse cursor.
- def hover_widget(widget)
- return false unless widget.hover
- @mouse_widget.unmark if @mouse_widget
- @mouse_widget = widget
- widget.mark
- move_cursor(widget.x + widget.w, widget.y)
- return true
- end
- end
- end
|