require "ISUI/ISCollapsableWindow" WatchWindow = ISCollapsableWindow:derive("WatchWindow"); function WatchWindow:onRightMouseDownObject(x, y) if instanceof(self.parent.obj, "KahluaTableImpl") then if #self.items == 0 then return end local context = getDebuggerContextMenu() context:hideAndChildren(); context:setVisible(true); context:clear(); context.forceVisible = true; context.parent = nil; context:setX(x); context:setY(y); context:bringToTop(); context.visibleCheck = true; context.instanceMap = {} context.subOptionNums = 0; context.subInstance = {} context.player = 0; context:setX(getMouseX()) context:setY(getMouseY()) y = math.floor((y / self.itemheight)); y = y + 1; if y > #self.items then y = #self.items; end if y < 1 then y = 1; end -- RJ: If you select the same item it unselect it --if self.selected == y then --if self.selected == y then --self.selected = -1; --return; --end self.selected = y; local sel = self.items[self.selected]; if hasDataBreakpoint(sel.item.obj, sel.item.key) then context:addOption("Remove break on change", {obj = sel.item.obj, item = sel.item}, WatchWindow.onDataWrite); else context:addOption("Break on change", {obj = sel.item.obj, item = sel.item}, WatchWindow.onDataWrite); end if hasDataReadBreakpoint(sel.item.obj, sel.item.key) then context:addOption("Remove break on read", {obj = sel.item.obj, item = sel.item}, WatchWindow.onDataRead); else context:addOption("Break on read", {obj = sel.item.obj, item = sel.item}, WatchWindow.onDataRead); end end end function WatchWindow.onDataWrite(data) toggleBreakOnChange(data.obj, data.item.key); end function WatchWindow.onDataRead(data) toggleBreakOnRead(data.obj, data.item.key); end function WatchWindow:onMouseDoubleClickOpenObject(item) if instanceof (item, "KahluaTableImpl") then if item.obj ~= nil then item = item.obj; end end if item == nil then return; end local bReuse = true; -- hold lshift to not reuse. bReuse = false; if instanceof (item, "KahluaTableImpl") then local src = ObjectViewer:new(getCore():getScreenWidth() / 2, 0, 600, 300, item); src:initialise(); src:addToUIManager(); elseif instanceof (item, "Class") then elseif instanceof (item, "Field") then item = getClassFieldVal(self.obj, item); self:onMouseDoubleClickOpenObject(item); elseif instanceof (item, "Array") then item = getClassFieldVal(self.obj, item); self:onMouseDoubleClickOpenObject(item); elseif instanceof (item, "Texture") then local src = TextureWindow:new(getCore():getScreenWidth() / 2, 0, item:getWidth(), item:getHeight(), item); src:initialise(); src:addToUIManager(); elseif instanceof (item, "LuaClosure") then local f = getFilenameOfClosure(item); if f ~= nil then local src = nil; if SourceWindow.map[f] ~= nil then src =SourceWindow.map[f]; src:setVisible(true); src:removeFromUIManager(); src:addToUIManager(); else src = SourceWindow:new(getCore():getScreenWidth() / 2, 0, 600, 600, f); SourceWindow.map[f] = src; src:initialise(); src:addToUIManager(); end local p = (getFirstLineOfClosure(item)-1) * 20; p = p - (src:getWidth() / 2); src.sourceView:setScrollHeight(src.sourceView.count * 20); src.sourceView:setYScroll(-p); src.sourceView.selected = getFirstLineOfClosure(item)-1; end else local src = ObjectViewer:new(getCore():getScreenWidth() / 2, 0, 600, 300, item); src:initialise(); src:addToUIManager(); end end function WatchWindow:storePos() self.sc = self.objectView:getYScroll(); end function WatchWindow:restorePos() self.objectView:setYScroll(self.sc); end function WatchWindow:initialise() ISCollapsableWindow.initialise(self); self.title = "Watch Window"; end function WatchWindow:onSourceMouseWheel(del) self:setYScroll(self:getYScroll() - (del*18*6)); return true; end function WatchWindow:fill() self.objectView:clear(); self.objectView:setYScroll(0); local bSort = true; if instanceof(self.obj, "KahluaTableImpl") then for k, v in ipairs(self.obj) do local s = KahluaUtil.rawTostring2(v.item.key); local s2 = KahluaUtil.rawTostring2(v.item.val); if s ~= nil and s2 ~= nil then s = tabToX(s, 40); self.objectView:addItem(s..s2, {obj = v.obj, key = v.item.key, item = v.item.val}); end end end if bSort then self.objectView:sort(); end end function WatchWindow:createChildren() --print("instance"); ISCollapsableWindow.createChildren(self); local th = self:titleBarHeight() local rh = self:resizeWidgetHeight() self.objectView = ISScrollingListBox:new(0, th, self.width, self.height-th-rh); self.objectView:initialise(); self.objectView.doDrawItem = WatchWindow.doDrawItem; self.objectView.onMouseWheel = WatchWindow.onSourceMouseWheel; self.objectView.anchorRight = true; self.objectView.onRightMouseDown = WatchWindow.onRightMouseDownObject; self.objectView.anchorBottom = true; self.objectView.itemheight = 22; self.objectView:setOnMouseDoubleClick(self, WatchWindow.onMouseDoubleClickOpenObject); self:addChild(self.objectView); self:fill(); --[[ -- Do corner x + y widget local resizeWidget = ISResizeWidget:new(self.width-10, self.height-10, 10, 10, self); resizeWidget:initialise(); self:addChild(resizeWidget); self.resizeWidget = resizeWidget; -- Do bottom y widget resizeWidget = ISResizeWidget:new(0, self.height-10, self.width-10, 10, self, true); resizeWidget.anchorRight = true; resizeWidget:initialise(); self:addChild(resizeWidget); self.resizeWidget2 = resizeWidget; --]] end function WatchWindow:doDrawItem(y, item, alt) if self.selected == item.index then self:drawRect(0, (y+3), self:getWidth(), self.itemheight-1, 0.2, 0.6, 0.7, 0.8); end if item.item.key ~= nil and hasDataBreakpoint(item.item.obj, item.item.key) then self:drawRect(0, (y+3), self:getWidth(), self.itemheight-1, 0.3, 0.8, 0.6, 0.4); end if item.item.key ~= nil and hasDataReadBreakpoint(item.item.obj, item.item.key) then self:drawRect(0, (y+3), self:getWidth(), self.itemheight-1, 0.3, 0.6, 0.8, 0.4); end -- self:drawRectBorder(0, (y), self:getWidth(), self.itemheight, 0.5, self.borderColor.r, self.borderColor.g, self.borderColor.b); self:drawText(item.text, 15, (y)+6, 1, 1, 1, 1, UIFont.Code); y = y + self.itemheight; return y; end function WatchWindow:addWatch(obj) end function WatchWindow:new (x, y, width, height) local o = {} --o.data = {} o = ISCollapsableWindow:new(x, y, width, height); setmetatable(o, self) self.__index = self o.backgroundColor = {r=0, g=0, b=0, a=1.0}; o.height = getCore():getScreenHeight()/3; o.width = (getCore():getScreenWidth()-700)/2; o.x = 0; o.y = getCore():getScreenHeight() - (getCore():getScreenHeight()/3); o.obj = LuaList:new(); o.objlist = o.obj; o.obj = o.obj.items; WatchWindowInstance = o; return o end