note description: "[ Builds a raised border for placement on an {ATTACK_UNIT_WIDGET} ]" author: "Jimmy J. Johnson" class BORDER inherit EV_MODEL_WORLD redefine create_interface_objects end create make create {BORDER} list_make feature {NONE} -- Initialization create_interface_objects -- Initialize attributes do Precursor {EV_MODEL_WORLD} create color create borders.make_filled (create {LINKED_LIST [EV_MODEL_POLYGON]}.make, 1, 4) end -- make (a_size: REAL_64) make (a_width, a_height, a_edge_size: REAL_64) -- Create Current setting the `width' and `height' -- If `a_width' and `a_height' is the size of the widget on -- which to place the border, then the border steps will be -- placed over the edge of the widget, not surrounding the -- widget. (This seems preferred, so that the size of the -- bordered widget is not bigger than planned.) require width_big_enough: a_width >= 30 -- arbitrary height_big_enough: a_height >= 30 edge_size_big_enough: a_edge_size >= 10 local i: INTEGER do default_create create borders.make_filled (create {LINKED_LIST [EV_MODEL_POLYGON]}.make, 1, 4) from i := Left until i > Bottom loop borders [i] := create {LINKED_LIST [EV_MODEL_POLYGON]}.make i := i + 1 end -- size := a_size width := a_width height := a_height edge_size := a_edge_size build_edges end feature -- Access color: EV_COLOR -- The color from which to `paint' Current. width: REAL_64 -- The width from which to build Current. height: REAL_64 -- The height from which to build Current. -- size: REAL_64 -- The width [and length] from which to build Current. feature -- Element change set_color (a_color: EV_COLOR) -- Change the `color'. do color := a_color paint end feature -- Basic operations paint -- Set the colors for the boarder polygons based on the -- color of the background color of the `tile' local i: INTEGER do -- Color each edge in order: Left, Top, Right, Bottom from i := Left until i > Bottom loop paint_edge (i) i := i + 1 end end feature {NONE} -- Implementation paint_edge (a_index: INTEGER) -- Paint the `a_index'th edge require index_big_enough: a_index >= 1 index_small_enough: a_index <= 4 local fad: COLOR_FADER polys: LINKED_LIST [EV_MODEL_POLYGON] p: EV_MODEL_POLYGON c: EV_COLOR i: INTEGER do polys := borders [a_index] create fad.make_with_color_and_count (color, polys.count) from polys.start until polys.exhausted loop p := polys.item i := polys.count - polys.index + 1 if a_index <= 2 then c := fad.i_th_lighter (i) else c := fad.i_th_darker (i) end p.set_background_color (c) p.set_foreground_color (c) polys.forth end end build_edges -- Create the polygons that simulate a raised boarder local -- Short variable names to make equations shorter p, p2, p3, p4: EV_COORDINATE poly: EV_MODEL_POLYGON w, h: REAL_64 ss: REAL_64 c: INTEGER i: INTEGER do -- Each boarder is one-tenth the width of the `box'. We then determine -- the number of times 2 will go into this width and use that as the -- number of color steps to make on each boarder. -- The right and bottom boarders should fade-to-black; the top and left -- boarders should fade-to-white then fade-to-grey. -- This should give the appearance of a light source up and left. ss := step_size w := width h := height c := step_count from i := 1 until i > c loop -- right create p.make_precise (w - i * ss, i * ss) create p2.make_precise ((w - (i - 1) * ss), (i - 1) * ss) create p3.make_precise (w - (i - 1) * ss, h - (i - 1) * ss) create p4.make_precise (w - i * ss, h - i * ss) create poly poly.extend_point (p) poly.extend_point (p2) poly.extend_point (p3) poly.extend_point (p4) borders [Right].extend (poly) extend (poly) -- left create p.make_precise (i * ss, i * ss) create p2.make_precise (i * ss, h - i * ss) create p3.make_precise ((i - 1) * ss, h - (i - 1) * ss) create p4.make_precise ((i - 1) * ss, (i - 1) * ss) create poly poly.extend_point (p) poly.extend_point (p2) poly.extend_point (p3) poly.extend_point (p4) borders [Left].extend (poly) extend (poly) -- bottom create p.make_precise (i * ss, h - i * ss) create p2.make_precise ((w - i * ss), h - i * ss) create p3.make_precise (w - (i - 1) * ss, h - (i - 1) * ss) create p4.make_precise ((i - 1) * ss, h - (i - 1) * ss) create poly poly.extend_point (p) poly.extend_point (p2) poly.extend_point (p3) poly.extend_point (p4) borders [Bottom].extend (poly) extend (poly) -- top create p.make_precise ((i - 1) * ss, (i - 1) * ss) create p2.make_precise (w - (i - 1) * ss, (i - 1) * ss) create p3.make_precise (w - i * ss, i * ss) create p4.make_precise (i * ss, i * ss) create poly poly.extend_point (p) poly.extend_point (p2) poly.extend_point (p3) poly.extend_point (p4) borders [Top].extend (poly) extend (poly) i := i + 1 end end borders: ARRAY [LINKED_LIST [EV_MODEL_POLYGON]] -- Contains the four edges edge_size: REAL_64 -- The size of each edge calculated from the smaller of -- the `width' or `height' -- do ---- Result := size / 10 -- Result := width.min (height) / 10 -- end step_count: INTEGER -- The number of incremental colors into which each edge is broken do Result := (edge_size / step_size).rounded end step_size: REAL_64 = 2.0 -- The logical width of each polygon in the edges Left: INTEGER = 1 Top: INTEGER = 2 Right: INTEGER = 3 Bottom: INTEGER = 4 end