summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/layout/roland_d70.lay
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/layout/roland_d70.lay')
-rw-r--r--src/mame/layout/roland_d70.lay133
1 files changed, 78 insertions, 55 deletions
diff --git a/src/mame/layout/roland_d70.lay b/src/mame/layout/roland_d70.lay
index 7ec0d5404d8..bb9d7ae2ac3 100644
--- a/src/mame/layout/roland_d70.lay
+++ b/src/mame/layout/roland_d70.lay
@@ -249,7 +249,7 @@ copyright-holders:Felipe Sanches, m1macrophage
<element ref="slider-wider-well" id="SLIDER4"><bounds x="200" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="217" y="357" width="10" height="82"/></element>
<element ref="slider-knob" id="SLIDER-KNOB4">
- <animate inputtag="SLIDER4" inputmask="0x7f"/>
+ <animate inputtag="SLIDER4" inputmask="0xffff"/>
<bounds state="100" x="203" y="352" width="37" height="24"/>
<bounds state="0" x="203" y="417" width="37" height="24"/>
</element>
@@ -257,7 +257,7 @@ copyright-holders:Felipe Sanches, m1macrophage
<element ref="slider-wider-well" id="SLIDER5"><bounds x="269" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="286" y="357" width="10" height="82"/></element>
<element ref="slider-knob" id="SLIDER-KNOB5">
- <animate inputtag="SLIDER5" inputmask="0x7f"/>
+ <animate inputtag="SLIDER5" inputmask="0xffff"/>
<bounds state="100" x="272" y="352" width="37" height="24"/>
<bounds state="0" x="272" y="417" width="37" height="24"/>
</element>
@@ -265,7 +265,7 @@ copyright-holders:Felipe Sanches, m1macrophage
<element ref="slider-wider-well" id="SLIDER6"><bounds x="337" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="354" y="357" width="10" height="82"/></element>
<element ref="slider-knob" id="SLIDER-KNOB6">
- <animate inputtag="SLIDER6" inputmask="0x7f"/>
+ <animate inputtag="SLIDER6" inputmask="0xffff"/>
<bounds state="100" x="340" y="352" width="37" height="24"/>
<bounds state="0" x="340" y="417" width="37" height="24"/>
</element>
@@ -273,7 +273,7 @@ copyright-holders:Felipe Sanches, m1macrophage
<element ref="slider-wider-well" id="SLIDER7"><bounds x="405" y="349" width="43" height="97"/></element>
<element ref="slider-well"><bounds x="422" y="357" width="10" height="82"/></element>
<element ref="slider-knob" id="SLIDER-KNOB7">
- <animate inputtag="SLIDER7" inputmask="0x7f"/>
+ <animate inputtag="SLIDER7" inputmask="0xffff"/>
<bounds state="100" x="408" y="352" width="37" height="24"/>
<bounds state="0" x="408" y="417" width="37" height="24"/>
</element>
@@ -557,48 +557,59 @@ copyright-holders:Felipe Sanches, m1macrophage
add_vertical_slider(view, "SLIDER" .. i, "SLIDER-KNOB" .. i, "SLIDER" .. i)
end
end)
+
-----------------------------------------------------------------------
- -- Slider library starts.
+ -- Slider and knob library starts.
-- Can be copied as-is to other layouts.
-----------------------------------------------------------------------
- local sliders = {} -- Stores slider information.
+ local widgets = {} -- Stores slider and knob information.
local pointers = {} -- Tracks pointer state.
-- The knob's Y position must be animated using <animate inputtag="{port_name}">.
-- The click area's vertical size must exactly span the range of the
-- knob's movement.
function add_vertical_slider(view, clickarea_id, knob_id, port_name)
- local slider = {}
+ table.insert(widgets, {
+ clickarea = get_layout_item(view, clickarea_id),
+ slider_knob = get_layout_item(view, knob_id),
+ field = get_port_field(port_name),
+ is_knob = false })
+ end
- slider.clickarea = view.items[clickarea_id]
- if slider.clickarea == nil then
- emu.print_error("Slider element: '" .. clickarea_id .. "' not found.")
- return
- end
+ -- A sweep between the attached field's min and max values requires
+ -- moving the pointer by `scale * clickarea.height` pixes.
+ function add_simplecounter_knob(view, clickarea_id, port_name, scale)
+ table.insert(widgets, {
+ clickarea = get_layout_item(view, clickarea_id),
+ field = get_port_field(port_name),
+ is_knob = true,
+ scale = scale })
+ end
- slider.knob = view.items[knob_id]
- if slider.knob == nil then
- emu.print_error("Slider knob element: '" .. knob_id .. "' not found.")
- return
+ function get_layout_item(view, item_id)
+ local item = view.items[item_id]
+ if item == nil then
+ emu.print_error("Layout element: '" .. item_id .. "' not found.")
end
+ return item
+ end
+ function get_port_field(port_name)
local port = file.device:ioport(port_name)
if port == nil then
emu.print_error("Port: '" .. port_name .. "' not found.")
- return
+ return nil
end
-
- slider.field = nil
+ local field = nil
for k, val in pairs(port.fields) do
- slider.field = val
+ field = val
break
end
- if slider.field == nil then
+ if field == nil then
emu.print_error("Port: '" .. port_name .."' does not seem to be an IPT_ADJUSTER.")
- return
+ return nil
end
-
- table.insert(sliders, slider)
+ return field
end
local function pointer_updated(type, id, dev, x, y, btn, dn, up, cnt)
@@ -608,56 +619,67 @@ copyright-holders:Felipe Sanches, m1macrophage
return
end
- -- If a button was just pressed, find the affected slider, if any.
+ -- If a button was just pressed, find the affected widget, if any.
if dn & 1 ~= 0 then
- for i = 1, #sliders do
- if sliders[i].knob.bounds:includes(x, y) then
+ for i = 1, #widgets do
+ local found, relative
+ if widgets[i].slider_knob and widgets[i].slider_knob.bounds:includes(x, y) then
+ found = true
+ relative = true
+ elseif widgets[i].clickarea.bounds:includes(x, y) then
+ found = true
+ relative = false
+ end
+ if found then
pointers[id] = {
- selected_slider = i,
- relative = true,
+ selected_widget = i,
+ relative = relative,
start_y = y,
- start_value = sliders[i].field.user_value }
- break
- elseif sliders[i].clickarea.bounds:includes(x, y) then
- pointers[id] = {
- selected_slider = i,
- relative = false }
+ start_value = widgets[i].field.user_value }
break
end
end
end
- -- If there is no slider selected by the current pointer, we are done.
+ -- If there is no widget selected by the current pointer, we are done.
if pointers[id] == nil then
return
end
- -- A slider is selected. Update state and, indirectly, slider knob position,
- -- based on the pointer's Y position. It is assumed the attached IO field is
- -- an IPT_ADJUSTER with a range of 0-100 (the default).
+ -- A widget is selected. Update its state based on the pointer's Y
+ -- position. It is assumed the attached IO field is an IPT_ADJUSTER.
local pointer = pointers[id]
- local slider = sliders[pointer.selected_slider]
+ local widget = widgets[pointer.selected_widget]
- local knob_half_height = slider.knob.bounds.height / 2
- local min_y = slider.clickarea.bounds.y0 + knob_half_height
- local max_y = slider.clickarea.bounds.y1 - knob_half_height
+ local min_value = widget.field.minvalue
+ local max_value = widget.field.maxvalue
+ local value_range = max_value - min_value
- local new_value = 0
- if pointer.relative then
- -- User clicked on the knob. The new value will depend on how much the
- -- knob was dragged.
- new_value = pointer.start_value - 100 * (y - pointer.start_y) / (max_y - min_y)
+ local new_value
+ if widget.is_knob then
+ local step_y = value_range / (widget.scale * widget.clickarea.bounds.height)
+ new_value = pointer.start_value + (pointer.start_y - y) * step_y
else
- -- User clicked elsewhere on the slider. The new value will depend on
- -- the absolute position of the click.
- new_value = 100 - 100 * (y - min_y) / (max_y - min_y)
+ local knob_half_height = widget.slider_knob.bounds.height / 2
+ local min_y = widget.clickarea.bounds.y0 + knob_half_height
+ local max_y = widget.clickarea.bounds.y1 - knob_half_height
+
+ if pointer.relative then
+ -- User clicked on the knob. The new value will depend on how
+ -- much the knob was dragged.
+ new_value = pointer.start_value - value_range * (y - pointer.start_y) / (max_y - min_y)
+ else
+ -- User clicked elsewhere on the slider. The new value will depend on
+ -- the absolute position of the click.
+ new_value = max_value - value_range * (y - min_y) / (max_y - min_y)
+ end
end
new_value = math.floor(new_value + 0.5)
- if new_value < 0 then new_value = 0 end
- if new_value > 100 then new_value = 100 end
- slider.field.user_value = new_value
+ if new_value < min_value then new_value = min_value end
+ if new_value > max_value then new_value = max_value end
+ widget.field.user_value = new_value
end
local function pointer_left(type, id, dev, x, y, up, cnt)
@@ -679,8 +701,9 @@ copyright-holders:Felipe Sanches, m1macrophage
view:set_forget_pointers_callback(forget_pointers)
end
-----------------------------------------------------------------------
- -- Slider library ends.
+ -- Slider and knob library ends.
-----------------------------------------------------------------------
+
]]></script>
</mamelayout>