You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.4 KiB
136 lines
4.4 KiB
8 years ago
|
-- see copyright notice in wxLdb.lua
|
||
|
|
||
|
local print = print
|
||
|
local wx = require( "wx" )
|
||
|
_G.print = print -- override wx print function with original one
|
||
|
|
||
|
local setmetatable = setmetatable
|
||
|
local table = table
|
||
|
local debug = debug
|
||
|
local xpcall = xpcall
|
||
|
local pairs = pairs
|
||
|
local ipairs = ipairs
|
||
|
local assert = assert
|
||
|
local tostring = tostring
|
||
|
|
||
|
local ui =
|
||
|
{
|
||
|
id = require( "ui.id" ),
|
||
|
}
|
||
|
|
||
|
module( "ui.threads" )
|
||
|
|
||
|
local meta = { __index = {} }
|
||
|
|
||
|
local ID_CLIENT_BREAK_ON_CONNECT = ui.id.new()
|
||
|
|
||
|
function new( ... )
|
||
|
local res = {}
|
||
|
setmetatable( res, meta )
|
||
|
res:init( ... )
|
||
|
return res
|
||
|
end
|
||
|
|
||
|
function meta.__index:init( parentWidget, frame )
|
||
|
self.events = { onThreadClicked = {}, onBreakOnConnectionChanged = {} }
|
||
|
self.popups = {}
|
||
|
setmetatable( self.popups, { __mode = "v" } )
|
||
|
self.frame = frame
|
||
|
self.tree = wx.wxTreeCtrl( parentWidget, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTR_HIDE_ROOT + wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS )
|
||
|
|
||
|
local imageList = wx.wxImageList(16, 16)
|
||
|
imageList:Add(wx.wxArtProvider.GetBitmap(wx.wxART_GO_FORWARD, wx.wxART_TOOLBAR, wx.wxSize(16, 16)))
|
||
|
imageList:Add(wx.wxArtProvider.GetBitmap(wx.wxART_EXECUTABLE_FILE, wx.wxART_TOOLBAR, wx.wxSize(16, 16)))
|
||
|
self.tree:AssignImageList( imageList )
|
||
|
|
||
|
self.root = self.tree:AddRoot( "clients" )
|
||
|
|
||
|
self.tree:Connect( wx.wxEVT_COMMAND_TREE_SEL_CHANGED, function( event )
|
||
|
if self.disableInputs then return end
|
||
|
local item = event:GetItem()
|
||
|
local data = assert( self.nodeData[item:GetValue()] )
|
||
|
--print( "thread selected: "..data.clientId..", "..data.threadId )
|
||
|
self:runEvents_( "onThreadClicked", data.clientId, data.threadId )
|
||
|
end )
|
||
|
|
||
|
self.tree:Connect( wx.wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, function( event )
|
||
|
local item = event:GetItem()
|
||
|
local data = assert( self.nodeData[item:GetValue()] )
|
||
|
if data.threadId == "current" then -- right click on a client
|
||
|
menu = wx.wxMenu()
|
||
|
self.popups[menu] = data
|
||
|
menu:Append( ID_CLIENT_BREAK_ON_CONNECT, "Break on connection", "Specify if the client should break execution each time it connects to the server", wx.wxITEM_CHECK )
|
||
|
menu:Check( ID_CLIENT_BREAK_ON_CONNECT, data.breakOnConnection )
|
||
|
self.tree:PopupMenu( menu )
|
||
|
end
|
||
|
end )
|
||
|
|
||
|
self.frame:Connect( ID_CLIENT_BREAK_ON_CONNECT, wx.wxEVT_COMMAND_MENU_SELECTED, function( event )
|
||
|
local data = assert( self.popups[event:GetEventObject():DynamicCast( "wxMenu" )] )
|
||
|
data.breakOnConnection = event:IsChecked()
|
||
|
self:runEvents_( "onBreakOnConnectionChanged", data.clientId, data.breakOnConnection )
|
||
|
end )
|
||
|
end
|
||
|
|
||
|
function meta.__index:getRoot()
|
||
|
return self.tree
|
||
|
end
|
||
|
|
||
|
function meta.__index:registerEvent( eventName, callback )
|
||
|
assert( self.events[eventName] ~= nil, "Unknown event name "..eventName )
|
||
|
table.insert( self.events[eventName], callback )
|
||
|
end
|
||
|
|
||
|
function meta.__index:runEvents_( eventName, ... )
|
||
|
for _, callback in pairs( self.events[eventName] ) do
|
||
|
callback( ... )
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function meta.__index:setData( data )
|
||
|
self.disableInputs = true
|
||
|
if self.data ~= nil then
|
||
|
self.tree:DeleteChildren( self.root )
|
||
|
self.data = nil
|
||
|
end
|
||
|
|
||
|
if data ~= nil then
|
||
|
self.data = {}
|
||
|
self.nodeData = {}
|
||
|
for _, client in pairs( data ) do
|
||
|
local cdata = {}
|
||
|
cdata.node = self.tree:AppendItem( self.root, client.name.." ["..client.ip.."]", 1 )
|
||
|
if client.active then
|
||
|
self.tree:SetItemBold( cdata.node, true )
|
||
|
self.tree:SelectItem( cdata.node, true )
|
||
|
end
|
||
|
--print( "client:", cdata.node, cdata.node:GetValue() )
|
||
|
self.nodeData[cdata.node:GetValue()] = { clientId = client.clientId, threadId = "current", breakOnConnection = client.breakOnConnection }
|
||
|
cdata.coroutines = {}
|
||
|
for _, co in ipairs( client.coroutines ) do
|
||
|
local codata = {}
|
||
|
local label = ""
|
||
|
--if co.current then
|
||
|
-- label = "-> "
|
||
|
--end
|
||
|
label = label..co.id
|
||
|
local imageIdx = -1
|
||
|
if co.current then
|
||
|
imageIdx = 0
|
||
|
end
|
||
|
codata.node = self.tree:AppendItem( cdata.node, label, imageIdx )
|
||
|
self.nodeData[codata.node:GetValue()] = { clientId = client.clientId, threadId = co.id }
|
||
|
--print( "\tthread:", codata.node, codata.node:GetValue() )
|
||
|
if co.active then
|
||
|
self.tree:SetItemBold( codata.node, true )
|
||
|
self.tree:SelectItem( codata.node, true )
|
||
|
end
|
||
|
table.insert( cdata.coroutines, codata )
|
||
|
end
|
||
|
self.tree:Expand( cdata.node )
|
||
|
table.insert( self.data, cdata )
|
||
|
end
|
||
|
end
|
||
|
self.disableInputs = false
|
||
|
end
|