diff options
Diffstat (limited to 'src/mame/layout/roland_d70.lay')
| -rw-r--r-- | src/mame/layout/roland_d70.lay | 133 |
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> |
