-- bitset : tiny bit operation library -- usage : -- -- OR operation -- local flag = (bits() + 0x100 + 0x40 + 0x80).get() -- -- AND operation -- local flag = (bits(0xffff) * 0x80).get() function bor(v1,v2) local base = 2^31 local result = 0 for i=0,31 do local flag = 0 if v1 >= base then v1 = v1 - base flag = base end if v2 >= base then v2 = v2 - base flag = base end if flag > 0 then result = result + base end base = base / 2 end return result end function band(v1,v2) local base = 2^31 local result = 0 for i=0,31 do local flag = base if v1 >= base then v1 = v1 - base else flag = 0 end if v2 >= base then v2 = v2 - base else flag = 0 end if flag > 0 then result = result + base end base = base / 2 end return result end function bxor(v1,v2) local base = 2^31 local result = 0 for i=0,31 do local flag = base if v1 >= base then v1 = v1 - base else flag = 0 end if v2 >= base then v2 = v2 - base flag = (flag > 0) and 0 or base end if flag > 0 then result = result + base end base = base / 2 end return result end Bitset = {} Bitset.__index = Bitset function Bitset:new() local t = { value = 0 } setmetatable(t,Bitset) return t end function Bitset:__add(v) if type(v) == "table" then v = v:get() end local newt = Bitset:new() newt.value = bor(self.value, v) return newt end function Bitset:__mul(v) if type(v) == "table" then v = v:get() end local newt = Bitset:new() newt.value = band(self.value, v) return newt end function Bitset:__pow(v) if type(v) == "table" then v = v:get() end local newt = Bitset:new() newt.value = bxor(self.value, v) return newt end function Bitset:set(v) if type(v)=="number" then self.value = v else self.value = v:get() end end function Bitset:get() return self.value end -- create new bitset with a number function bits(v) local t = Bitset:new() if v ~= nil then t:set(v) end return t end -- set a function to initialize base class function add_base_init_funcs(obj, base_name) if base_name == "wx.wxDialog" then obj.init_base = function(self, args, kwds) self:Create(wx.NULL, args, "title", wx.wxDefaultPosition, wx.wxDefaultSize, kwds.style) end end if base_name == "wx.wxFrame" then obj.init_base = function(self, args, kwds) self:Create(wx.NULL, args, "title", wx.wxDefaultPosition, wx.wxDefaultSize, kwds.style) end end end -- class function function class(class_name, base_name, funcs) -- get the constructor of the base class local base = loadstring("return "..base_name)() -- create constructor _G[class_name] = function(args, kwds) local obj = base() -- set a function to initialize base class add_base_init_funcs(obj, base_name) -- set specified member functions for k,v in pairs(funcs) do obj[k] = v end -- event binding table obj.event_binds = {} -- initialize obj:init__(args,kwds) return obj end end -- event bind routine function bind_event(obj, evt_id, func_, sender_) if evt_id == nil or func_ == nil then print("obj=",obj) error("bind_event: evt_id = ", evt_id, " func_ =", func_) return end if type(sender_) == "number" then obj:Connect(sender_, evt_id, function(e) func_(obj, e, sender_) end) else obj:Connect(sender_:GetId(), evt_id, function(e) func_(obj, e, sender_) end) end --[[ --if obj.event_binds == nil then obj.event_binds = {} end local binds = obj.event_binds -- connect a handler function, when no handlers are binded to the event id if binds[evt_id] == nil then binds[evt_id] = {} -- connect event obj:Connect(evt_id, function(e) -- call every handlers for this event local id = e:GetId() for i,v in ipairs(binds[evt_id]) do if id == v.sender:GetId() then v.func(obj,e) end end end) end -- add a handler function table.insert(binds[evt_id], { func=func_, sender=sender_ }) ]] end -- the same as wxPython's wxDLG_SZE function function DLG_SZE(dlg, w, h) if dlg ~= nil then return dlg:ConvertDialogToPixels(wx.wxSize(w,h)) end return wx.wxSize(w*2,h*2) end -- some aliases wx.EVT_TEXT_COPY = wx.wxEVT_COMMAND_TEXT_COPY wx.EVT_TEXT_CUT = wx.wxEVT_COMMAND_TEXT_CUT wx.EVT_TEXT_PASTE = wx.wxEVT_COMMAND_TEXT_PASTE --wxEVT_NULL -- dummy placeholder nobody sends this event wx.EVT_COMMAND_ENTER = wx.wxEVT_COMMAND_ENTER wx.EVT_COMMAND_KILL_FOCUS = wx.wxEVT_COMMAND_KILL_FOCUS wx.EVT_COMMAND_LEFT_CLICK = wx.wxEVT_COMMAND_LEFT_CLICK wx.EVT_COMMAND_LEFT_DCLICK = wx.wxEVT_COMMAND_LEFT_DCLICK wx.EVT_COMMAND_RIGHT_CLICK = wx.wxEVT_COMMAND_RIGHT_CLICK wx.EVT_COMMAND_RIGHT_DCLICK = wx.wxEVT_COMMAND_RIGHT_DCLICK wx.EVT_SCROLLBAR = wx.wxEVT_COMMAND_SCROLLBAR_UPDATED -- obsolete use wx.wxEVT_SCROLL... wx.EVT_COMMAND_SET_FOCUS = wx.wxEVT_COMMAND_SET_FOCUS wx.EVT_VLBOX = wx.wxEVT_COMMAND_VLBOX_SELECTED wx.EVT_MENU = wx.wxEVT_COMMAND_MENU_SELECTED --EVT_MENU EVT_MENU_RANGE wx.EVT_TOOL = wx.wxEVT_COMMAND_TOOL_CLICKED --EVT_TOOL_RANGE wx.EVT_TOOL_ENTER = wx.wxEVT_COMMAND_TOOL_ENTER wx.EVT_TOOL_RCLICKED = wx.wxEVT_COMMAND_TOOL_RCLICKED --EVT_TOOL_RCLICKED_RANGE wx.EVT_TEXT_ENTER = wx.wxEVT_COMMAND_TEXT_ENTER wx.EVT_TEXT = wx.wxEVT_COMMAND_TEXT_UPDATED wx.EVT_TEXT_URL = wx.wxEVT_COMMAND_TEXT_URL wx.EVT_TEXT_MAXLEN = wx.wxEVT_COMMAND_TEXT_MAXLEN wx.EVT_SPINCTRL = wx.wxEVT_COMMAND_SPINCTRL_UPDATED wx.EVT_SLIDER = wx.wxEVT_COMMAND_SLIDER_UPDATED wx.EVT_RADIOBUTTON = wx.wxEVT_COMMAND_RADIOBUTTON_SELECTED wx.EVT_RADIOBOX = wx.wxEVT_COMMAND_RADIOBOX_SELECTED wx.EVT_CHECKLISTBOX = wx.wxEVT_COMMAND_CHECKLISTBOX_TOGGLED wx.EVT_LISTBOX_DCLICK = wx.wxEVT_COMMAND_LISTBOX_DOUBLECLICKED wx.EVT_LISTBOX = wx.wxEVT_COMMAND_LISTBOX_SELECTED wx.EVT_COMBOBOX = wx.wxEVT_COMMAND_COMBOBOX_SELECTED wx.EVT_CHOICE = wx.wxEVT_COMMAND_CHOICE_SELECTED wx.EVT_CHECKBOX = wx.wxEVT_COMMAND_CHECKBOX_CLICKED wx.EVT_BUTTON = wx.wxEVT_COMMAND_BUTTON_CLICKED wx.EVT_TOGGLEBUTTON = wx.wxEVT_COMMAND_TOGGLEBUTTON_CLICKED