The Scripting Terminal told me to report this, so I’m reporting it:
*** .\Duplex/MessageStream.lua:117: Internal Error. Please report: unknown evt_type '11'
*** stack traceback:
*** [C]: in function 'error'
*** .\Duplex/MessageStream.lua:117: in function 'add_listener'
*** .\Duplex/UIToggleButton.lua:261: in function 'add_listeners'
*** .\Duplex/UIToggleButton.lua:51: in function <.><br>
*** [C]: in function 'UIToggleButton'<br>
***.\Duplex/Applications/Transport.lua:281: in function '__build_app'<br>
***.\Duplex/Applications/Transport.lua:146: in function 'start_app'<br>
***.\Duplex/Browser.lua:1317: in function 'start'<br>
***.\Duplex/Browser.lua:468: in function 'start_current_configuration'<br>
***.\Duplex/Browser.lua:419: in function 'set_configuration'<br>
*** main.lua:34: in function 'create_browser'<br>
*** main.lua:66: in function 'apply_autostart_configurations'<br>
*** main.lua:173: in function <168><br>
<br>```
<br>
<br>
I was trying to add a new listener (DEVICE_EVENT_BUTTON_RELEASED) to the Duplex UIToggleButton. Then I thought maybe I was being punished for hacking core files, so I created a new UIToggleButtonWithRelease and require'd it into my Application, but I get the same error.<br>
<br>
Full modified UIToggleButtonWithRelease.lua file below in case it helps. I added a do_release method at line 79, and add_listener at 261 and a remove_listener at 281.<br>
<br>
Any ideas? I'd really like the do_release event. Thanks!<br>
<br>
[luabox]<br>
--[[----------------------------------------------------------------------------<br>
-- Duplex.UIToggleButtonWithRelease<br>
----------------------------------------------------------------------------]]--<br>
<br>
--[[<br>
<br>
Inheritance: UIComponent > UIToggleButtonWithRelease<br>
Requires: Globals, Display, MessageStream, CanvasPoint<br>
<br>
About<br>
<br>
UIToggleButtonWithRelease is a simple rectangular on/off toggle button <br>
You can use it with a button, but also dial and fader input is supported: <br>
just turn the control to it's maximum or minimum to toggle between values <br>
<br>
- display as normal/dimmed version<br>
- minimum unit size: 1x1<br>
<br>
Events<br>
<br>
on_change() - invoked whenever the button change it's active state<br>
on_hold() - (optional) invoked when the button is held for a while<br>
<br>
<br>
--]]<br>
<br>
<br>
--==============================================================================<br>
<br>
class 'UIToggleButtonWithRelease' (UIComponent)<br>
<br>
function UIToggleButtonWithRelease:__init(display)<br>
TRACE('UIToggleButtonWithRelease:__init')<br>
<br>
UIComponent.__init(self,display)<br>
<br>
-- initial state is nil (to force drawing)<br>
self.active = nil<br>
<br>
-- paint inverted<br>
self.inverted = false<br>
<br>
self._cached_active = nil<br>
<br>
self.palette = {<br>
foreground = table.rcopy(display.palette.color_1),<br>
foreground_dimmed = table.rcopy(display.palette.color_1_dimmed),<br>
background = table.rcopy(display.palette.background)<br>
}<br>
<br>
self.add_listeners(self)<br>
<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
-- user input via button<br>
<br>
function UIToggleButtonWithRelease:do_press()<br>
TRACE("UIToggleButtonWithRelease:do_press")<br>
<br>
if (self.on_change ~= nil) then<br>
<br>
local msg = self:get_msg()<br>
if not (self.group_name == msg.group_name) then<br>
return <br>
end<br>
if not self:test(msg.column,msg.row) then<br>
return <br>
end<br>
<br>
self.toggle(self)<br>
<br>
end<br>
<br>
end<br>
<br>
-- ... and release<br>
<br>
function UIToggleButtonWithRelease:do_release()<br>
TRACE("UIToggleButtonWithRelease:do_release")<br>
<br>
if (self.on_change ~= nil) then<br>
<br>
local msg = self:get_msg()<br>
if not (self.group_name == msg.group_name) then<br>
return <br>
end<br>
if not self:test(msg.column,msg.row) then<br>
return <br>
end<br>
<br>
end<br>
<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
-- user input via slider, encoder<br>
<br>
function UIToggleButtonWithRelease:do_change()<br>
TRACE("UIToggleButtonWithRelease:do_change()")<br>
<br>
if (self.on_change ~= nil) then<br>
local msg = self:get_msg()<br>
if not (self.group_name == msg.group_name) then<br>
return <br>
end<br>
if not self:test(msg.column,msg.row) then<br>
return <br>
end<br>
-- toggle when moved away from min/max values<br>
if self.active and msg.value < msg.max then<br>
self.toggle(self)<br>
elseif not self.active and msg.value > msg.min then<br>
self.toggle(self)<br>
end<br>
end<br>
<br>
end<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
-- user input via (held) button<br>
-- on_hold() is the optional handler method<br>
<br>
function UIToggleButtonWithRelease:do_hold()<br>
TRACE("UIToggleButtonWithRelease:do_hold()")<br>
<br>
if (self.on_hold ~= nil) then<br>
local msg = self:get_msg()<br>
if not (self.group_name == msg.group_name) then<br>
return <br>
end<br>
if not self:test(msg.column,msg.row) then<br>
return <br>
end<br>
self:on_hold()<br>
end<br>
<br>
end<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
-- toggle button state<br>
<br>
function UIToggleButtonWithRelease:toggle()<br>
TRACE("UIToggleButtonWithRelease:toggle")<br>
<br>
self.active = not self.active<br>
self._cached_active = self.active<br>
<br>
self:__invoke_handler()<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
-- set button state<br>
<br>
function UIToggleButtonWithRelease:set(value,skip_event_handler)<br>
--TRACE("UIToggleButtonWithRelease:set", value)<br>
<br>
if (self._cached_active ~= value) then<br>
<br>
self._cached_active = value<br>
self.active = value<br>
if(skip_event_handler)then<br>
self:invalidate()<br>
else<br>
self:__invoke_handler()<br>
end<br>
end<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
function UIToggleButtonWithRelease:set_dimmed(bool)<br>
if(self.dimmed == bool)then<br>
return<br>
end<br>
self.dimmed = bool<br>
self:invalidate()<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
-- trigger the external handler method<br>
-- (this can revert changes)<br>
<br>
function UIToggleButtonWithRelease:__invoke_handler()<br>
<br>
if (self.on_change == nil) then return end<br>
<br>
local rslt = self:on_change()<br>
if (rslt==false) then -- revert<br>
self.active = self._cached_active<br>
else<br>
self:invalidate()<br>
end<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
function UIToggleButtonWithRelease:draw()<br>
TRACE("UIToggleButtonWithRelease:draw")<br>
<br>
local foreground,foreground_dimmed,background<br>
<br>
if(self.inverted)then<br>
foreground = self.palette.background<br>
foreground_dimmed = self.palette.background<br>
background = self.palette.foreground<br>
else<br>
foreground = self.palette.foreground<br>
foreground_dimmed = self.palette.foreground_dimmed<br>
background = self.palette.background<br>
end<br>
<br>
local point = CanvasPoint()<br>
<br>
if self.active then<br>
if self.dimmed then<br>
point:apply(foreground_dimmed)<br>
else<br>
point:apply(foreground)<br>
end<br>
point.val = true<br>
else<br>
point:apply(background)<br>
point.val = false<br>
end<br>
self.canvas:fill(point)<br>
<br>
UIComponent.draw(self)<br>
<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
function UIToggleButtonWithRelease:add_listeners()<br>
<br>
self.__display.device.message_stream:add_listener(<br>
self, DEVICE_EVENT_BUTTON_PRESSED,<br>
function() self:do_press() end )<br>
<br>
self.__display.device.message_stream:add_listener(<br>
self,DEVICE_EVENT_VALUE_CHANGED,<br>
function() self:do_change() end )<br>
<br>
self.__display.device.message_stream:add_listener(<br>
self,DEVICE_EVENT_BUTTON_HELD,<br>
function() self:do_hold() end )<br>
<br>
self.__display.device.message_stream:add_listener(<br>
self,DEVICE_EVENT_BUTTON_RELEASED,<br>
function() self:do_release() end )<br>
<br>
end<br>
<br>
<br>
--------------------------------------------------------------------------------<br>
<br>
function UIToggleButtonWithRelease:remove_listeners()<br>
<br>
self.__display.device.message_stream:remove_listener(<br>
self,DEVICE_EVENT_BUTTON_PRESSED)<br>
<br>
self.__display.device.message_stream:remove_listener(<br>
self,DEVICE_EVENT_VALUE_CHANGED)<br>
<br>
self.__display.device.message_stream:remove_listener(<br>
self,DEVICE_EVENT_BUTTON_HELD)<br>
<br>
self.__display.device.message_stream:remove_listener(<br>
self,DEVICE_EVENT_BUTTON_RELEASED)<br>
<br>
end<br>
<br>
[/luabox]</168></.>