19928/jj_vision/interface/controls/spin_control.e
Jocelyn Fiat 6dde6425c2 init
2024-06-17 09:09:33 +02:00

213 lines
6.1 KiB
Plaintext

note
description: "[
A {CONTROL} that adds an `increment_button' and a `decrement_button'
which the user can press to increase or decrease the `value'.
Feature `increment' and `decrement' must be redefined to change
`value', but call the Precursors to make the buttons repeat.
]"
date: "23 Aug 04"
author: "Jimmy J. Johnson"
copyright: "Copyright 2012, Jimmy J. Johnson"
license: "Eiffel Forum License v2 (see forum.txt)"
URL: "$URL: file:///F:/eiffel_repositories/jj_vision/trunk/interface/controls/spin_control.e $"
date: "$Date: 2012-03-16 14:05:07 -0400 (Fri, 16 Mar 2012) $"
revision: "$Revision: 7 $"
deferred class
SPIN_CONTROL
inherit
COMPARABLE_CONTROL
redefine
initialize,
create_interface_objects,
set_actions,
build
-- enable_sensitive,
-- disable_sensitive,
-- is_sensitive
end
feature {NONE} -- Initialization
initialize
-- Set up the control
do
extend (increment_button)
extend (decrement_button)
show_buttons
Precursor {COMPARABLE_CONTROL}
end
create_interface_objects
-- Create objects to be used by `Current' in `initialize'
-- Implemented by descendants to create attached objects
-- in order to adhere to void-safety due to the implementation bridge pattern.
do
Precursor {COMPARABLE_CONTROL}
create timeout
create increment_button
create decrement_button
timeout.set_interval (500) -- one-half a second?
increment_button.set_text ("+")
decrement_button.set_text ("-")
increment_button.set_minimum_width (10)
decrement_button.set_minimum_width (10)
increment_button.set_minimum_height (1)
decrement_button.set_minimum_height (1)
end
set_actions
-- Add actions to the buttons.
do
Precursor {COMPARABLE_CONTROL}
-- To make the spin function work `increment' and `decrement' actions are
-- added, not to the buttons, but to a timer which will be started and killed
-- when the appropriate button is pressed and released.
-- `Force_extend' was used to bypass the signature for the agents.
increment_button.pointer_button_press_actions.force_extend (agent start_timeout (agent increment))
increment_button.pointer_button_release_actions.force_extend (agent kill_timeout)
decrement_button.pointer_button_press_actions.force_extend (agent start_timeout (agent decrement))
decrement_button.pointer_button_release_actions.force_extend (agent kill_timeout)
end
feature -- Status report
is_buttons_hidden: BOOLEAN
-- Are the `increment_button' and the `decrement_button'
-- hidden from view?
-- is_sensitive: BOOLEAN is
-- -- Can the control react to input?
-- do
-- Result := Precursor {COMPARABLE_CONTROL} and then
-- increment_button.is_sensitive and
-- decrement_button.is_sensitive
-- end
feature -- Status setting
hide_buttons
-- Make the `increment_button' and the `decrement_button'
-- not appear in the control.
do
increment_button.hide
decrement_button.hide
end
show_buttons
-- Make the `increment_button' and the `decrement_button'
-- appear in the control.
do
increment_button.show
decrement_button.show
end
-- enable_sensitive is
-- -- Make the `display' sensitive to user input.
-- do
-- -- Redefined to take care of the added buttons
-- Precursor {COMPARABLE_CONTROL}
-- increment_button.enable_sensitive
-- decrement_button.enable_sensitive
-- end
--
-- disable_sensitive is
-- -- Make the `display' unresponsive to user input.
-- do
-- -- Redefined to take care of the added buttons
-- Precursor {COMPARABLE_CONTROL}
-- increment_button.disable_sensitive
-- decrement_button.disable_sensitive
-- end
feature -- Basic operations
increment
-- Intended to be redefined to increase the magnitude of `value'.
-- Default function only sets the `timeout' to a shorter repeat interval.
do
timeout.set_interval (100)
end
decrement
-- Intended to be redefined to decrease the magnitude of `value'.
-- Default function only sets the `timeout' to a shorter repeat interval.
do
timeout.set_interval (100)
end
feature {NONE} -- Implementation
build
-- Position the widgets
local
x, y: INTEGER
h: INTEGER
do
Precursor {COMPARABLE_CONTROL}
-- set the size of the buttons
h := display.height // 2
x := display.x_position + display.width
y := display.y_position + (display.y_position // 2)
if label_position = Label_right then
x := x + label.x_position + label.width
end
set_item_position (increment_button, x, display.y_position)
set_item_height (increment_button, h.max (increment_button.minimum_height))
set_item_width (increment_button, h.max (increment_button.minimum_width))
set_item_height (decrement_button, h.max (decrement_button.minimum_height))
set_item_width (decrement_button, h.max (decrement_button.minimum_width))
y := increment_button.y_position + increment_button.height
set_item_position (decrement_button, x, y)
set_minimum_width (minimum_width + increment_button.width)
end
feature {NONE} -- Implementation
start_timeout (a_procedure: PROCEDURE)
-- Calls `a_procedure' once and then sets up `timeout' to
-- execute `a_procedure' repeatedly.
require
procedure_exists: a_procedure /= Void
do
a_procedure.call ([])
timeout.set_interval (1000)
timeout.actions.extend (a_procedure)
end
kill_timeout
-- Remove actions from the `timeout' so it does not
-- continue to repeat even when the button is released.
do
timeout.actions.wipe_out
timeout.reset_count
end
increment_button: EV_BUTTON
-- Press to increase the `value'
decrement_button: EV_BUTTON
-- Press to decrease the `value'
timeout: EV_TIMEOUT
-- Used when a button is held down.
invariant
-- ensure sure buttons are created
increment_button_exists: increment_button /= Void
decrement_button_exists: decrement_button /= Void
timeout_exists: timeout /= Void
-- ensure buttons are part of current
increment_button_in_current: has (increment_button)
decrement_button_in_current: has (decrement_button)
is_sensitive_definition: is_sensitive implies increment_button.is_sensitive and
decrement_button.is_sensitive
end