note description: "[ Widget representing an area on the game board (such as a land mass or port.) ]" author: "Jimmy J. Johnson" deferred class LOCATION_WIDGET inherit VITP_WIDGET rename target as location redefine create_interface_objects, -- initialize, extend_widgets, build_widgets, set_widget_order, add_actions, -- defining_figure, paint, on_button_pressed, -- on_pointer_leave, target_imp end feature {NONE} -- Initialization create_interface_objects -- Initialize attributes do create land land_color := Default_land_color Precursor {VITP_WIDGET} end extend_widgets -- Put widgets into Current. This cannot be done -- in `create_interface_object', because cannot call -- `extend' feature until all objects [in descendants] -- are also created. do Precursor {VITP_WIDGET} extend (land) end build_widgets -- Now that widgets were created in `create_interface_objects' -- and added to Current in `extend_widgets', build up the -- widgets by adding internal structure to each widget. do Precursor {VITP_WIDGET} build_land end set_widget_order -- Ensure the widgets are ordered properly -- (i.e. whose on top?) do Precursor {VITP_WIDGET} bring_to_front (land) bring_to_front (text_group) end add_actions -- Make Current react to events do Precursor {VITP_WIDGET} pointer_button_press_actions.extend (agent on_button_pressed) pointer_button_release_actions.extend (agent on_button_released) pointer_leave_actions.extend (agent on_pointer_leave) end build_land -- Create any land masses in Current do end feature -- Access -- defining_figure: EV_MODEL -- -- The figure to be used to determine if other figures -- -- overlap this one or for capturing mouse events -- do -- Result := land -- end feature -- Basic operations paint -- Set the colors for the land and other areas local bc, c: EV_COLOR do Precursor {VITP_WIDGET} bc := adjusted_color (Land_boundary_color) c := adjusted_color (land_color) from land.start until land.exhausted loop check attached {EV_MODEL_POLYGON} land.item as p then p.set_foreground_color (bc) p.set_background_color (c) end land.forth end end feature {NONE} -- Implementation (actions) on_button_pressed (ax: INTEGER; ay: INTEGER; a_button: INTEGER; x_tilt: DOUBLE; y_tilt: DOUBLE; pressure: DOUBLE; a_screen_x: INTEGER; a_screen_y: INTEGER) -- React to a button press by brightening the location. -- -- Notify `board_world' that Current was clicked -- -- This allows the `board_world' to handle the click *and* to know the -- -- widget on which the click occurred. local -- u_list: LINKED_SET [VITP_MOVEABLE] g: EV_MODEL_GROUP do io.put_string ("LOCATION_WIDGET.on_button_press -- " + location.name + "%N") g := group is_highlighting := True -- is_highlighting.set_item (true) -- focused_widgets.extend (Current) set_dimming_level ({DIMABLE}.Bright) paint -- -- Also, brighten all units that are at this location -- check attached board_world as bw then -- u_list := location.units -- from u_list.start -- until u_list.after -- loop -- check attached {ATTACK_UNIT_WIDGET} bw.attack_widgets.item (u_list.item) as w then -- focused_widgets.extend (w) -- w.set_dimming_level ({DIMABLE}.Bright) -- w.paint -- end -- u_list.forth -- end -- end end on_button_released (ax: INTEGER; ay: INTEGER; a_button: INTEGER; x_tilt: DOUBLE; y_tilt: DOUBLE; pressure: DOUBLE; a_screen_x: INTEGER; a_screen_y: INTEGER) -- React to a button release event do if is_highlighting then is_highlighting := false restore_dimming_level paint end end on_pointer_leave -- React to the pointer leaving the area [in case the -- button was pressed and dragged off Current]. do if is_highlighting then is_highlighting := false restore_dimming_level paint end -- Precursor {VITP_NAMED_WIDGET} end feature {NONE} -- Implementation is_highlighting: BOOLEAN -- Is the location set brighter than normal? land: EV_MODEL_WORLD -- To draw the land area(s) in Current land_color: EV_COLOR -- The color with which to draw the land target_imp: detachable LOCATION -- Anchor for the `target' represented by Current end