Advertisement
ssccsscc

Simple command block

Nov 13th, 2014
475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 92.77 KB | None | 0 0
  1. ------------------- Configuration -------------------
  2. local InterfaceAPIVersion = 2.5
  3. -----------------------------------------------------
  4. local mouseEvents = {
  5.   Down = 1,
  6.   Up = 2
  7. }
  8. local mouseButtons = {
  9.   Left = 1,
  10.   Middle = 2,
  11.   Right = 3
  12. }
  13. local keyEvents = {
  14.   textInput = 1,
  15.   keyPress = 2,
  16.   keyRelease = 3
  17. }
  18. local function DefineInterfaceComponents()
  19.   function interface_s.Components.Window:new(x, y, Width, Height, Movable, theme)
  20.     local obj= {}
  21.     obj.Type = "Window"
  22.  
  23.     obj.AllowResize = true
  24.     obj.AlwaysFocused = false
  25.     obj.IsMovable = Movable
  26.     obj.MinWidth = 16
  27.     obj.MinHeight = 16
  28.     obj.Theme = theme
  29.     obj.X = x
  30.     obj.Y = y
  31.     obj.Width = Width
  32.     obj.Height = Height
  33.  
  34.     obj.OnShow = nil
  35.     obj.OnHide = nil
  36.     obj.OnDraw = nil
  37.     obj.OnEndDraw = nil
  38.     obj.OnMove = nil
  39.     obj.OnClick = nil
  40.  
  41.     obj.Focused=false
  42.     obj.Items = {}
  43.     obj.MoveStartX = -1
  44.     obj.MoveStartY = -1
  45.     obj.IsMoving = false
  46.     obj.IsShowing = true
  47.     obj.IsResizing = false
  48.     obj.ResizeStartX = 1
  49.     obj.ResizeStartY = 1
  50.     obj.ResizeStartWidth = 1
  51.     obj.ResizeStartHeight = 1
  52.     obj.ResizeLastWidth =0
  53.     obj.ResizeLastHeight=0  
  54.     obj.SizeOfHeader = 8  
  55.     function obj:Draw(IsFocused,mx,my)
  56.       self.Focused=IsFocused or self.AlwaysFocused
  57.       if self.OnDraw ~= nil then
  58.         if self.OnDraw(IsFocused,mx,my) == true then
  59.           return
  60.         end
  61.       end
  62.       if self.Focused == true then
  63.         gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.BackColor))
  64.         gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.BorderColor))
  65.         if self.IsMovable then
  66.           gfx.fillRect(self.X, self.Y, self.Width,self.SizeOfHeader, gfx.getColors(self.Theme.HeaderColor))
  67.         end
  68.         if self.AllowResize==true then
  69.           gfx.fillRect(self.X+self.Width-6, self.Y+self.Height-6, 6,6, gfx.getColors(self.Theme.BorderColor))
  70.         end
  71.       else
  72.         gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBackColor))
  73.         gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBorderColor))
  74.         if self.AllowResize==true then
  75.           gfx.fillRect(self.X+self.Width-6, self.Y+self.Height-6, 6,6, gfx.getColors(self.Theme.UnfocusedBorderColor))
  76.         end
  77.         if self.IsMovable then
  78.           gfx.fillRect(self.X, self.Y, self.Width,self.SizeOfHeader, gfx.getColors(self.Theme.UnfocusedHeaderColor))
  79.         end
  80.       end
  81.       for i=#self.Items,0,-1 do
  82.         if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) then
  83.           self.Items[i]:Draw(self.Focused,self.X,self.Y,mx-self.X,my-self.Y)
  84.         end
  85.       end
  86.       if self.OnEndDraw ~= nil then
  87.         if self.OnEndDraw(IsFocused,mx,my) == true then
  88.           return
  89.         end
  90.       end
  91.     end
  92.     function obj:Show()
  93.       self.IsShowing = true
  94.       if self.OnShow ~= nil then
  95.          self.OnShow(self)
  96.       end
  97.     end
  98.     function obj:Hide()
  99.       self.IsShowing = false
  100.       if self.OnHide ~= nil then
  101.          self.OnHide(self)
  102.       end
  103.     end
  104.     function obj:Resize(ws,hs)
  105.       if ws < self.MinWidth then
  106.         ws=self.MinWidth
  107.       end
  108.       if hs < self.MinHeight then
  109.         hs=self.MinHeight
  110.       end
  111.       self.ResizeLastHeight = self.Height
  112.       self.ResizeLastWidth = self.Width
  113.       self.Height = hs
  114.       self.Width = ws
  115.       hs = self.Height-self.ResizeLastHeight
  116.       ws = self.Width-self.ResizeLastWidth
  117.       for i=0,#self.Items do
  118.         if self.Items[i]~=nil then
  119.           if self.Items[i].Anchor.Top==true and self.Items[i].Anchor.Bottom==true then
  120.             self.Items[i].Height = self.Items[i].Height + hs
  121.           end
  122.           if self.Items[i].Anchor.Top==false and self.Items[i].Anchor.Bottom==true then
  123.             self.Items[i].Y = self.Items[i].Y + hs
  124.           end
  125.           if self.Items[i].Anchor.Left==true and self.Items[i].Anchor.Right==true then
  126.             self.Items[i].Width = self.Items[i].Width + ws
  127.           end
  128.           if self.Items[i].Anchor.Left==false and self.Items[i].Anchor.Right==true then
  129.             self.Items[i].X = self.Items[i].X + ws
  130.           end
  131.         end
  132.       end
  133.     end
  134.     function obj:AddComponent(component)
  135.       self.Items[#self.Items+1] = component
  136.       component.Base = self
  137.     end
  138.     function obj:GetComponentIndex(obj2)
  139.       for i=0, #self.Items do
  140.         if self.Items[i] == obj2 then
  141.           return i
  142.         end
  143.       end
  144.       return -1
  145.     end
  146.     function obj:focusComponent(obj2)
  147.       local index = self:GetComponentIndex(obj2)
  148.       for i=index, 1,-1 do
  149.         self.Items[i] = self.Items[i-1]
  150.       end
  151.       self.Items[0] = obj2
  152.     end
  153.     function obj:KeyPress(key, scan, rep, shift, ctrl, alt, evnt)
  154.       for i=0,#self.Items do
  155.         if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) and (self.Items[i].KeyPress~=nil) then
  156.           if self.Items[i]:KeyPress(key, scan, rep, shift, ctrl, alt, evnt) then
  157.             return true
  158.           end
  159.         end
  160.       end
  161.     end
  162.     function obj:Click(x,y,e,b,w)
  163.       if self.OnClick~=nil then
  164.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  165.         if x==nil then
  166.           return
  167.         end
  168.       end
  169.       if (self.IsMovable) and (e==mouseEvents.Up) and (self.IsMoving) then
  170.         self.IsMoving = false
  171.       end
  172.       if self.IsResizing== false then
  173.         for i=0,#self.Items do
  174.           if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) then
  175.             if self.Items[i]:Click(x-self.X,y-self.Y,e,b,w) then
  176.               return true
  177.             end
  178.           end
  179.         end
  180.       end
  181.       if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  182.         if self.Focused then
  183.           if self.AllowResize==true and self.IsResizing==false and e==mouseEvents.Down and x>self.X+self.Width-8 and x<self.X+self.Width and y>self.Y+self.Height-self.SizeOfHeader and y<self.Y+self.Height then
  184.             self.IsResizing=true
  185.             self.ResizeStartX = x
  186.             self.ResizeStartY = y
  187.             self.ResizeStartWidth = self.Width
  188.             self.ResizeStartHeight = self.Height
  189.             return true
  190.           end
  191.           if (self.IsMovable) and (y>self.Y) and (y<self.Y+self.SizeOfHeader) and (e==mouseEvents.Down) then
  192.             self.MoveStartX = x - self.X
  193.             self.MoveStartY = y - self.Y
  194.             self.IsMoving = true
  195.           end
  196.           if self.IsResizing==false then
  197.             return true
  198.           end
  199.         else
  200.           if e==mouseEvents.Down then
  201.             return true
  202.           end
  203.         end
  204.       else
  205.         if IsResizing==false then
  206.           return false
  207.         end
  208.       end
  209.  
  210.       if self.IsResizing==true and e==mouseEvents.Up then
  211.         self.IsResizing = false
  212.         return true
  213.       end
  214.  
  215.     end
  216.     function obj:Move(x,y,dx,dy)
  217.       if (self.IsMovable) and (self.IsMoving) then
  218.         self.X = x-self.MoveStartX
  219.         self.Y = y-self.MoveStartY
  220.         if self.OnMove~=nil then
  221.           self.OnMove(self.X,self.Y)
  222.         end
  223.       else
  224.         if self.IsResizing==true then
  225.           self:Resize(self.ResizeStartWidth-self.ResizeStartX+x,self.ResizeStartHeight-self.ResizeStartY+y)
  226.           return true
  227.         end
  228.       end
  229.     end
  230.     setmetatable(obj, self)
  231.     self.__index = self;
  232.     return obj
  233.   end
  234.   function interface_s.Components.Button:new(x, y, Width, Height, text, theme)
  235.     local obj= {}
  236.     obj.Type = "Button"
  237.  
  238.     obj.X = x
  239.     obj.Y = y
  240.     obj.Width = Width
  241.     obj.Height = Height
  242.     obj.Theme = theme
  243.     obj.IsShowing = true
  244.     obj.Text = text
  245.     obj.Enabled = true
  246.     obj.HintText = ""
  247.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  248.  
  249.     obj.OnPressed = nil
  250.     obj.OnDraw = nil
  251.     obj.OnEndDraw = nil
  252.     obj.OnClick = nil
  253.    
  254.     obj.Base = nil
  255.     obj.Focused=false
  256.     obj.ClickHelper = interface_s.ComponentsHelpers.Click:new()
  257.     obj.HintHelper = nil
  258.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  259.       if not self.IsShowing then return end
  260.       self.Focused=IsFocused
  261.       if self.OnDraw ~= nil then
  262.         if self.OnDraw(IsFocused,self.X+baseX,self.Y+baseY,x,y) == true then
  263.           return
  264.         end
  265.       end
  266.       local tw, th = gfx.textSize(self.Text)
  267.       if IsFocused == true and self.Enabled then
  268.         if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  269.           if self.ClickHelper.IsFirstClick then
  270.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.PressedBackColor))
  271.             gfx.drawText(self.X+baseX+math.floor((self.Width-tw)/2), self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.PressedTextColor))
  272.           else
  273.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.MouseOverColor))
  274.             gfx.drawText(self.X+baseX+math.floor((self.Width-tw)/2), self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.TextColor))
  275.             if self.HintHelper~=nil then
  276.               self.HintHelper:MouseOver(x+baseX,y+baseY,self.HintText)
  277.             end
  278.           end
  279.         else
  280.           if self.HintHelper~=nil then
  281.             self.HintHelper:Reset()
  282.           end
  283.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.BackColor))
  284.           gfx.drawText(self.X+baseX+math.floor((self.Width-tw)/2), self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.TextColor))
  285.         end
  286.         gfx.drawRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.BorderColor))
  287.       else
  288.         if self.HintHelper~=nil then
  289.           self.HintHelper:Reset()
  290.         end
  291.         if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  292.           if self.ClickHelper.IsFirstClick then
  293.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.PressedBackColor))
  294.             gfx.drawText(self.X+baseX+math.floor((self.Width-tw)/2), self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.PressedTextColor))
  295.           else
  296.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedMouseOverColor))
  297.             gfx.drawText(self.X+baseX+math.floor((self.Width-tw)/2), self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.UnfocusedTextColor))
  298.           end
  299.         else
  300.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBackColor))
  301.           gfx.drawText(self.X+baseX+math.floor((self.Width-tw)/2), self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.UnfocusedTextColor))
  302.         end
  303.         gfx.drawRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBorderColor))
  304.       end
  305.       if self.OnEndDraw ~= nil then
  306.         if self.OnEndDraw(IsFocused,self.X+baseX,self.Y+baseY,x,y) == true then
  307.           return
  308.         end
  309.       end
  310.     end
  311.     function obj:Show()
  312.       self.IsShowing = true
  313.     end
  314.     function obj:Hide()
  315.       self.IsShowing = false
  316.     end
  317.     function obj:Click(x,y,e,b,w)
  318.       if self.OnClick~=nil then
  319.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  320.         if x==nil then
  321.           return
  322.         end
  323.       end
  324.       if self.Enabled then
  325.         self.ClickHelper.OnPress = self.OnPressed
  326.         self.ClickHelper:ProcessClick(self.Width,self.Height,self.X,self.Y,x,y,e,b)
  327.       end
  328.     end
  329.     function obj:AddHint(text)
  330.       self.HintText = text
  331.       self.HintHelper = interface_s.ComponentsHelpers.Hint:new()
  332.     end
  333.     setmetatable(obj, self)
  334.     self.__index = self;
  335.     return obj
  336.   end
  337.  
  338.   function interface_s.Components.Combobox:new(x, y,w,h,i, theme)
  339.     local obj= {}
  340.     obj.Type = "Combobox"
  341.  
  342.     obj.X = x
  343.     obj.Y = y
  344.  
  345.     obj.Theme = theme
  346.     obj.IsShowing = true
  347.     obj.Width = w
  348.     obj.Height = h
  349.     obj.Enabled = true
  350.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  351.     obj.Items = i
  352.     obj.IsItemsShown = false
  353.    
  354.     obj.SelectedIndex=1
  355.     obj.OnItemSelected = nil
  356.     obj.OnClick = nil
  357.  
  358.     obj.Base = nil
  359.     obj.Focused=false
  360.     obj.DropClickHelper = interface_s.ComponentsHelpers.Click:new()
  361.       obj.DropClickHelper.OnPress = function()
  362.           if obj.IsItemsShown==false then
  363.             obj.Base:focusComponent(obj)
  364.             obj.IsItemsShown = true
  365.           end
  366.         end
  367.     obj.ItemClickHelper = interface_s.ComponentsHelpers.Click:new()
  368.       obj.ItemClickHelper.OnFirstClick = function() return true end
  369.       obj.ItemClickHelper.OnPress = function(x,y)
  370.           local i = y-obj.Y-obj.Height
  371.           obj.SelectedIndex=math.ceil(i/14)
  372.           if obj.OnItemSelected~= nil then
  373.             obj.OnItemSelected(obj.SelectedIndex,obj.Items[obj.SelectedIndex])
  374.           end
  375.           obj.IsItemsShown = false
  376.           interface_s.RemoveOnClickAction(obj)
  377.           return true
  378.         end
  379.       obj.ItemClickHelper.OnMissClick = function(x,y)
  380.         obj.IsItemsShown = false
  381.         interface_s.RemoveOnClickAction(obj)
  382.         return true
  383.       end
  384.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  385.       if not self.IsShowing then return end
  386.       self.Focused = IsFocused
  387.       if IsFocused and self.Enabled then
  388.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  389.         if self.SelectedIndex>=0 then
  390.           gfx.drawText(self.X+baseX+5,self.Y+baseY+3, self.Items[self.SelectedIndex], gfx.getColors(self.Theme.TextColor))
  391.         end
  392.         if self.IsItemsShown==true then
  393.           gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.ButtonPressedBackColor))
  394.         else
  395.           if x>self.X+self.Width-self.Height and x<self.X+self.Width and y>self.Y and y<self.Y+self.Height then
  396.             gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.ButtonMouseOverBackColor))
  397.           else
  398.             gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.ButtonBackColor))
  399.           end
  400.         end
  401.         gfx.drawRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.BorderColor))
  402.         if self.IsItemsShown==true then
  403.           gfx.fillRect(self.X+baseX,self.Y+baseY+self. Height,self.Width,#self.Items*14,gfx.getColors(self.Theme.BackColor))
  404.           for i=0,#self.Items-1 do
  405.             if x>self.X and x<self.X+self.Width and y>self.Y+i*14+self.Height and y<self.Y+i*14+self.Height+15 then
  406.               gfx.fillRect(self.X+baseX,self.Y+baseY+i*14+self.Height,self.Width,14+1,gfx.getColors(self.Theme.ButtonMouseOverBackColor))
  407.             end
  408.             gfx.drawRect(self.X+baseX,self.Y+baseY+i*14+self.Height,self.Width,14+1,gfx.getColors(self.Theme.BorderColor))
  409.             gfx.drawText(self.X+baseX+5,self.Y+baseY+i*14+3+self.Height, self.Items[i+1],gfx.getColors(self.Theme.TextColor))
  410.           end
  411.         end
  412.       else
  413.         obj.IsItemsShown = false
  414.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBorderColor))
  415.         if self.SelectedIndex>=0 then
  416.           gfx.drawText(self.X+baseX+5,self.Y+baseY+3, self.Items[self.SelectedIndex],gfx.getColors(self.Theme.UnfocusedTextColor))
  417.         end
  418.         if x>self.X+self.Width-self.Height and x<self.X+self.Width and y>self.Y and y<self.Y+self.Height then
  419.           gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.UnfocusedButtonMouseOverBackColor))
  420.         else
  421.           gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height,gfx.getColors(self.Theme.UnfocusedButtonBackColor))
  422.         end
  423.         gfx.drawRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.UnfocusedBorderColor))
  424.       end
  425.     end
  426.     function obj:Show()
  427.       self.IsShowing = true
  428.     end
  429.     function obj:Hide()
  430.       self.IsShowing = false
  431.     end
  432.     function obj:Click(x,y,e,b,w)
  433.       if self.OnClick~=nil then
  434.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  435.         if x==nil then
  436.           return
  437.         end
  438.       end
  439.       if self.Enabled then
  440.         if self.IsItemsShown==true then
  441.           return self.ItemClickHelper:ProcessClick(self.Width,#self.Items*14,self.X,self.Y+self.Height,x,y,e,b)
  442.         end
  443.         return self.DropClickHelper:ProcessClick(self.Height,self.Height,self.X+self.Width-self.Height,self.Y,x,y,e,b)
  444.       end
  445.     end
  446.     setmetatable(obj, self)
  447.     self.__index = self;
  448.     return obj
  449.   end
  450.  
  451.   function interface_s.Components.Graph:new(x, y,w,h, theme)
  452.     local obj= {}
  453.     obj.Type = "Graph"
  454.  
  455.     obj.X = x
  456.     obj.Y = y
  457.     obj.Theme = theme
  458.     obj.IsShowing = true
  459.     obj.Width = w
  460.     obj.Height = h
  461.     obj.UpdateSpeed = 20
  462.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  463.  
  464.     obj.GetValue = nil
  465.     obj.OnClick = nil
  466.  
  467.     obj.Focused=false
  468.     obj.ZeroHeight = 0
  469.     obj.MaxValue = 0
  470.     obj.NewMaxValue = 0
  471.     obj.MinValue = 0
  472.     obj.NewMinValue = 0
  473.     obj.UpdateCounter = 0
  474.     obj.PointX = {}
  475.     obj.PointY = {}
  476.     obj.Base = nil
  477.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  478.       if not self.IsShowing then return end
  479.       if self.UpdateCounter>self.UpdateSpeed then
  480.         if self.GetValue ~= nil then
  481.           self:AddPoint(self.GetValue())
  482.         end
  483.         self.UpdateCounter=0
  484.       end
  485.       self.UpdateCounter=self.UpdateCounter+1
  486.       self.Focused = IsFocused
  487.       if IsFocused==true then
  488.         gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BackColor))
  489.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  490.         gfx.drawText(self.X+baseX,self.Y+baseY-10,"Max: "..self.MaxValue,gfx.getColors(self.Theme.TextColor))
  491.         gfx.drawText(self.X+baseX+100,self.Y+baseY-10,"Min: "..self.MinValue,gfx.getColors(self.Theme.TextColor))
  492.       else
  493.         gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBackColor))
  494.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBorderColor))
  495.         gfx.drawText(self.X+baseX,self.Y+baseY-10,"Max: "..self.MaxValue,gfx.getColors(self.Theme.UnfocusedTextColor))
  496.         gfx.drawText(self.X+baseX+100,self.Y+baseY-10,"Min: "..self.MinValue,gfx.getColors(self.Theme.UnfocusedTextColor))
  497.       end
  498.       self.NewMaxValue = 0
  499.       self.NewMinValue = 0
  500.       if self.PointX[#self.PointX] ~= nil then
  501.         local v = self.PointX[#self.PointX]-self.Width+1
  502.         if v>0 then
  503.           for i=v,#self.PointY do
  504.             self.PointY[i-v]=self.PointY[i]
  505.             self.PointX[i-v]=self.PointX[i]-v
  506.           end
  507.           for i=#self.PointY-v,#self.PointY do
  508.             self.PointY[i]=nil
  509.             self.PointX[i]=nil
  510.           end
  511.         end
  512.       end
  513.       for i=2, #self.PointX do
  514.         if self.PointX[i]<self.Width-1 then
  515.           if self.NewMaxValue < self.PointY[i] then
  516.             self.NewMaxValue = self.PointY[i]
  517.           else
  518.             if self.NewMinValue>self.PointY[i] then
  519.               self.NewMinValue = self.PointY[i]
  520.             end
  521.           end
  522.           if self.MaxValue < self.PointY[i] then
  523.             self.MaxValue = self.PointY[i]
  524.           else
  525.             if self.MinValue>self.PointY[i] then
  526.               self.MinValue = self.PointY[i]
  527.             end
  528.           end
  529.           local x1 = self.PointX[i]+self.X+baseX
  530.           local y1 = (self.Height-((self.PointY[i]+math.abs( self.MinValue ))/(self.MaxValue+math.abs( self.MinValue )))*(self.Height-3))+self.Y+baseY-2
  531.           local x2 = self.PointX[i-1]+self.X+baseX
  532.           local y2 = (self.Height-((self.PointY[i-1]+math.abs( self.MinValue ))/(self.MaxValue+math.abs( self.MinValue )))*(self.Height-3))+self.Y+baseY-2
  533.           if y1==y1 and y2==y2 then
  534.             if IsFocused==true then    
  535.               gfx.drawLine(x1,y1,x2,y2,gfx.getColors(self.Theme.GraphColor))
  536.             else
  537.               gfx.drawLine(x1,y1,x2,y2,gfx.getColors(self.Theme.UnfocusedGraphColor))
  538.             end
  539.           end
  540.         end
  541.       end
  542.       if self.PointY[1]~=nil then
  543.         if self.NewMaxValue < self.PointY[1] then
  544.           self.NewMaxValue = self.PointY[1]
  545.         else
  546.           if self.NewMinValue>self.PointY[1] then
  547.             self.NewMinValue = self.PointY[1]
  548.           end
  549.         end
  550.         if self.MaxValue < self.PointY[1] then
  551.           self.MaxValue = self.PointY[1]
  552.         else
  553.           if self.MinValue>self.PointY[1] then
  554.             self.MinValue = self.PointY[1]
  555.           end
  556.         end
  557.         self.ZeroHeight = (self.Height-((math.abs( self.MinValue ))/(self.MaxValue+math.abs( self.MinValue )))*(self.Height-3))+self.Y+baseY-2
  558.         if self.ZeroHeight == self.ZeroHeight then
  559.           if IsFocused== true then
  560.             gfx.drawLine(self.X+baseX,self.ZeroHeight,self.X+baseX+self.Width-1,self.ZeroHeight,gfx.getColors(self.Theme.ZeroLine))
  561.           else
  562.             gfx.drawLine(self.X+baseX,self.ZeroHeight,self.X+baseX+self.Width-1,self.ZeroHeight,gfx.getColors(self.Theme.UnfocusedZeroLine))
  563.           end
  564.         end
  565.       end
  566.       self.MaxValue = self.NewMaxValue
  567.       self.MinValue = self.NewMinValue
  568.     end
  569.     function obj:Show()
  570.       self.IsShowing = true
  571.     end
  572.     function obj:Hide()
  573.       self.IsShowing = false
  574.     end
  575.     function obj:AddPoint(v)
  576.       if v~= nil then
  577.       if #self.PointY==0 then
  578.         self.PointY[1]=v
  579.         self.PointX[1]=1
  580.       else
  581.         if #self.PointY+1 < self.Width-1 then
  582.         self.PointY[#self.PointY+1]=v
  583.         self.PointX[#self.PointX+1]=self.PointX[#self.PointX]+1
  584.         else
  585.           for i=2,#self.PointY do
  586.             self.PointY[i-1]=self.PointY[i]
  587.             self.PointX[i-1]=self.PointX[i]-1
  588.           end
  589.           self.PointY[#self.PointY]=v
  590.           self.PointX[#self.PointX]=self.PointX[#self.PointX]
  591.         end
  592.       end
  593.       end
  594.     end
  595.     function obj:ClearPoints()
  596.         self.PointY = {}
  597.         self.PointX = {}
  598.     end
  599.     function obj:Click(x,y,e,b,w)
  600.       if self.OnClick~=nil then
  601.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  602.         if x==nil then
  603.           return
  604.         end
  605.       end
  606.       if (x>self.X+self.Width-self.Height) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  607.         return true
  608.       end
  609.     end
  610.     setmetatable(obj, self)
  611.     self.__index = self;
  612.     return obj
  613.   end
  614.  
  615.   function interface_s.Components.Label:new(x, y, t, theme)
  616.     local obj= {}
  617.     obj.Type = "Label"
  618.  
  619.     obj.X = x
  620.     obj.Y = y
  621.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  622.     obj.Theme = theme
  623.     obj.HintText = ""
  624.     obj.IsShowing = true
  625.     obj.Text = t
  626.    
  627.     obj.OnClick = nil
  628.  
  629.     obj.Base = nil
  630.     obj.Focused=false
  631.     obj.HintHelper = nil
  632.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  633.       if not self.IsShowing then return end
  634.       self.Focused = IsFocused
  635.       if IsFocused==true then
  636.         gfx.drawText(self.X+baseX,self.Y+baseY,self.Text,gfx.getColors(self.Theme.TextColor))
  637.         local tw, th = gfx.textSize(self.Text)
  638.         if (x>self.X) and (x<self.X+tw) and (y>self.Y) and (y<self.Y+th) then
  639.           if self.HintHelper~=nil then
  640.             self.HintHelper:MouseOver(x+baseX,y+baseY,self.HintText)
  641.           end
  642.         else
  643.           if self.HintHelper~=nil then
  644.             self.HintHelper:Reset()
  645.           end
  646.         end
  647.       else
  648.         if self.HintHelper~=nil then
  649.           self.HintHelper:Reset()
  650.         end
  651.         gfx.drawText(self.X+baseX,self.Y+baseY,self.Text,gfx.getColors(self.Theme.UnfocusedTextColor))
  652.       end
  653.     end
  654.     function obj:Show()
  655.       self.IsShowing = true
  656.     end
  657.     function obj:Hide()
  658.       self.IsShowing = false
  659.     end
  660.     function obj:Click(x,y,e,b,w)
  661.       if self.OnClick~=nil then
  662.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  663.         if x==nil then
  664.           return
  665.         end
  666.       end
  667.     end
  668.     function obj:AddHint(text)
  669.       self.HintText = text
  670.       self.HintHelper = interface_s.ComponentsHelpers.Hint:new()
  671.     end
  672.     setmetatable(obj, self)
  673.     self.__index = self;
  674.     return obj
  675.   end
  676.  
  677.   function interface_s.Components.Textbox:new(x, y, w, h, theme)
  678.     local obj= {}
  679.     obj.Type = "Textbox"
  680.  
  681.     obj.X = x
  682.     obj.Y = y
  683.     obj.Theme = theme
  684.     obj.IsShowing = true
  685.     obj.Width = w
  686.     obj.Height = h
  687.     obj.Text = ""
  688.     obj.Enabled = true
  689.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  690.     obj.MaxTextLength = 10
  691.     obj.PointerIndex = 0
  692.  
  693.     obj.OnTextChanged = nil
  694.     obj.OnClick = nil
  695.  
  696.     obj.Focused=false
  697.     obj.Base = nil
  698.     obj.IsActive = false
  699.     obj.PointerBlinkStep =0
  700.     obj.ClickHelper = interface_s.ComponentsHelpers.Click:new()
  701.     obj.ClickHelper.OnPress = function()
  702.         obj.IsActive = true
  703.       end
  704.     obj.ClickHelper.OnMissClick = function()
  705.         obj.IsActive = false
  706.       end
  707.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  708.       if not self.IsShowing then return end
  709.       self.Focused = IsFocused
  710.       gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BackColor))
  711.       if self.IsActive==true and self.Enabled then
  712.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  713.         self.PointerBlinkStep = self.PointerBlinkStep + 1
  714.         if self.PointerBlinkStep > 60 then
  715.           self.PointerBlinkStep=0
  716.         end
  717.         if self.PointerBlinkStep > 30 then
  718.           local x = gfx.textSize(string.sub(self.Text, 0,self.PointerIndex) )
  719.           gfx.drawLine(x+self.X+baseX+1,self.Y+baseY+3, x+self.X+baseX+1, self.Y+baseY+self.Height-3,gfx.getColors(self.Theme.PointerColor))
  720.         end
  721.       else
  722.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBorderColor))
  723.       end
  724.       local x, y = gfx.textSize(string.sub(self.Text, 0,self.PointerIndex) )
  725.       if IsFocused==true and self.Enabled then
  726.         gfx.drawText(self.X+baseX+2,self.Y+baseY+(self.Height-y+3)/2,self.Text,gfx.getColors(self.Theme.TextColor))
  727.       else
  728.         gfx.drawText(self.X+baseX+2,self.Y+baseY+(self.Height-y+3)/2,self.Text,gfx.getColors(self.Theme.UnfocusedTextColor))
  729.       end
  730.     end
  731.     function obj:Show()
  732.       self.IsShowing = true
  733.     end
  734.     function obj:Hide()
  735.       self.IsShowing = false
  736.     end
  737.     function obj:Click(x,y,e,b,w)
  738.       if self.OnClick~=nil then
  739.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  740.         if x==nil then
  741.           return
  742.         end
  743.       end
  744.       if self.Enabled then
  745.         self.ClickHelper:ProcessClick(self.Width,self.Height,self.X,self.Y,x,y,e,b)
  746.       end
  747.     end
  748.     function obj:KeyPress(code, scan, r, ctrl, shift, alt, evnt)
  749.       if self.IsActive==true and self.Enabled then
  750.         if evnt==keyEvents.keyPress then
  751.           if code==8 and self.PointerIndex>0 then
  752.             self.PointerIndex=self.PointerIndex-1
  753.             self.Text=string.sub(self.Text,0,self.PointerIndex)..string.sub(self.Text,self.PointerIndex+2)
  754.             if self.OnTextChanged~=nil then
  755.               self.OnTextChanged(self.Text)
  756.             end
  757.           elseif code==127 and self.PointerIndex~=string.len(self.Text) then
  758.             self.PointerIndex=self.PointerIndex
  759.             self.Text=string.sub(self.Text,0,self.PointerIndex)..string.sub(self.Text,self.PointerIndex+2)
  760.             if self.OnTextChanged~=nil then
  761.               self.OnTextChanged(self.Text)
  762.             end
  763.           elseif code==1073741903 and string.len(self.Text)>=self.PointerIndex+1 then
  764.             self.PointerIndex=self.PointerIndex+1
  765.           elseif code==1073741904 and self.PointerIndex>0 then
  766.             self.PointerIndex=self.PointerIndex-1
  767.           end
  768.         elseif evnt==keyEvents.textInput then
  769.           if string.len(self.Text)<self.MaxTextLength then
  770.             self.PointerIndex=self.PointerIndex+1
  771.             self.Text=string.sub(self.Text,0,self.PointerIndex-1)..code..string.sub(self.Text,self.PointerIndex)
  772.             if self.OnTextChanged~=nil then
  773.               self.OnTextChanged(self.Text)
  774.             end
  775.           end
  776.         end
  777.         return true
  778.       end
  779.     end
  780.     setmetatable(obj, self)
  781.     self.__index = self;
  782.     return obj
  783.   end
  784.  
  785.   function interface_s.Components.Checkbox:new(x, y, s, t, theme)
  786.     local obj= {}
  787.     obj.Type = "Checkbox"
  788.  
  789.     obj.X = x
  790.     obj.Y = y
  791.     obj.Theme = theme
  792.     obj.IsShowing = true
  793.     obj.Size = s
  794.     obj.Text = t
  795.     obj.Enabled = true
  796.     obj.Checked = false
  797.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  798.  
  799.     obj.OnStateChanged = nil
  800.     obj.OnClick = nil
  801.  
  802.     obj.Focused=false
  803.     obj.Base = nil
  804.     obj.ClickHelper = interface_s.ComponentsHelpers.Click:new()
  805.     obj.ClickHelper.OnPress = function()
  806.         if obj.Checked==true then
  807.           obj.Checked = false
  808.         else
  809.           obj.Checked = true
  810.         end
  811.         if obj.OnStateChanged~=nil then
  812.           obj.OnStateChanged(obj.Checked)
  813.         end
  814.       end
  815.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  816.       if not self.IsShowing then return end
  817.       self.Focused = IsFocused
  818.       local x, y = gfx.textSize(self.Text)
  819.       if IsFocused==true and self.Enabled then
  820.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Size,self.Size,gfx.getColors(self.Theme.BorderColor))
  821.         if self.Checked==true then
  822.           gfx.fillRect(self.X+baseX+3,self.Y+baseY+3,self.Size-6,self.Size-6,gfx.getColors(self.Theme.CheckColor))
  823.         end
  824.         gfx.drawText(self.X+baseX+self.Size+4,self.Y+baseY+(self.Size-y)/2+1,self.Text,gfx.getColors(self.Theme.TextColor))
  825.       else
  826.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Size,self.Size,gfx.getColors(self.Theme.UnfocusedBorderColor))
  827.         if self.Checked==true then
  828.           gfx.fillRect(self.X+baseX+3,self.Y+baseY+3,self.Size-6,self.Size-6,gfx.getColors(self.Theme.UnfocusedCheckColor))
  829.         end
  830.         gfx.drawText(self.X+baseX+self.Size+4,self.Y+baseY+(self.Size-y)/2+1,self.Text,gfx.getColors(self.Theme.UnfocusedCheckColor))
  831.       end
  832.     end
  833.     function obj:Show()
  834.       self.IsShowing = true
  835.     end
  836.     function obj:Hide()
  837.       self.IsShowing = false
  838.     end
  839.     function obj:Click(x,y,e,b,w)
  840.       if self.OnClick~=nil then
  841.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  842.         if x==nil then
  843.           return
  844.         end
  845.       end
  846.       if self.Enabled then
  847.         return self.ClickHelper:ProcessClick(self.Size,self.Size,self.X,self.Y,x,y,e,b)
  848.       end
  849.     end
  850.     setmetatable(obj, self)
  851.     self.__index = self;
  852.     return obj
  853.   end
  854.  
  855.   function interface_s.Components.Selection:new(x, y, theme)
  856.     local obj= {}
  857.     obj.X = x
  858.     obj.Y = y
  859.     obj.Focused=false
  860.     obj.Theme = theme
  861.     obj.IsShowing = true
  862.     obj.IsPointSet = false
  863.     obj.FirstPointX = -1
  864.     obj.FirstPointY = -1
  865.     obj.IsFinished = false
  866.     obj.EndPointX = -1
  867.     obj.EndPointY = -1
  868.     obj.OnSelectionStart = nil
  869.     obj.OnSelected = nil
  870.     obj.OnSelectionAborted = nil
  871.     obj.V2EndWidth = -1
  872.     obj.V2EndHeight = -1
  873.     obj.V2StartX = -1
  874.     obj.V2StartY = -1
  875.     obj.OnClick = nil
  876.     obj.OnDraw = nil
  877.     function obj:Draw(IsFocused,x,y)
  878.       if self.OnDraw~=nil then
  879.         IsFocused,x,y = self.OnDraw(IsFocused,x,y)
  880.         if IsFocused == nil then return end
  881.       end
  882.       self.Focused = IsFocused
  883.       if IsFocused then
  884.         if (self.IsPointSet) and (self.IsFinished==false) then
  885.           local arg11 = -1
  886.           local arg12 = -1
  887.           local arg21 = -1
  888.           local arg22 = -1
  889.           if self.FirstPointX-x>=0 then
  890.             arg11 = x
  891.             arg12 = self.FirstPointX-x
  892.           else
  893.             arg11 = self.FirstPointX
  894.             arg12 = x-self.FirstPointX
  895.           end
  896.           if self.FirstPointY - y>=0 then
  897.             arg21 = y
  898.             arg22 = self.FirstPointY - y
  899.           else
  900.             arg21 = self.FirstPointY
  901.             arg22 = y-self.FirstPointY
  902.           end
  903.           if (self.IsFinished==false) and (self.IsPointSet==true)  then
  904.             self.V2EndWidth = arg12
  905.             self.V2EndHeight = arg22
  906.             self.V2StartX = arg11
  907.             self.V2StartY = arg21
  908.           end
  909.           gfx.fillRect(arg11, arg21, arg12,arg22, gfx.getColors(self.Theme.BackColor))
  910.         end
  911.       else
  912.         self.IsPointSet = false
  913.       end
  914.     end
  915.     function obj:Show()
  916.       self.IsShowing = true
  917.     end
  918.     function obj:Hide()
  919.       self.IsShowing = false
  920.     end
  921.     function obj:Click(x,y,e,b,w)
  922.       if self.OnClick~=nil then
  923.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  924.         if x==nil then
  925.           return
  926.         end
  927.       end
  928.       if (e==mouseEvents.Down) and (self.IsPointSet==false) and (b==mouseButtons.Left) then
  929.         self.IsPointSet = true
  930.         self.FirstPointX = x
  931.         self.FirstPointY = y
  932.         if self.OnSelectionStart ~= nil then
  933.           self.OnSelectionStart(self.FirstPointX,self.FirstPointY)
  934.         end
  935.         return true
  936.       else
  937.         if (e==mouseEvents.Up) and (self.IsPointSet==true) and (b==mouseButtons.Left) and (self.IsFinished == false) then
  938.           self.IsFinished = true
  939.           self.EndPointX = x
  940.           self.EndPointY = y
  941.           if self.OnSelected ~= nil then
  942.             self.OnSelected(self.FirstPointX,self.FirstPointY,self.EndPointX,self.EndPointY, self.V2StartX, self.V2StartY, self.V2EndWidth,self.V2EndHeight)
  943.           end
  944.           return true
  945.         end
  946.         if (self.IsPointSet==true) and (b~=mouseButtons.Left) and (self.IsFinished==false) then
  947.           self.IsPointSet=false
  948.           if self.OnSelectionAborted ~= nil then
  949.             self.OnSelectionAborted()
  950.           end
  951.         end
  952.       end
  953.     end
  954.     function obj:Move()
  955.     end
  956.     function obj:KeyPress(key, scan, rep, shift, ctrl, alt, evnt)
  957.     end
  958.     setmetatable(obj, self)
  959.     self.__index = self;
  960.     return obj
  961.   end
  962.  
  963.   function interface_s.Components.SelectionMover:new(x, y,w,h, theme)
  964.     local obj= {}
  965.     obj.X = x
  966.     obj.Y = y
  967.     obj.Focused=false
  968.     obj.Theme = theme
  969.     obj.IsShowing = true
  970.     obj.Width = w
  971.     obj.Height = h
  972.     obj.OnMovement = nil
  973.     obj.OnAbort = nil
  974.     obj.OnDone = nil
  975.     obj.MoveStartX = -1
  976.     obj.MoveStartY = -1
  977.     obj.NewPosX = -1
  978.     obj.NewPosY = -1
  979.     obj.IsMoving = false
  980.     obj.SumDX = 0
  981.     obj.SumDY = 0
  982.     obj.IsMoved = false
  983.     obj.OnDraw = nil
  984.     obj.OnClick = nil
  985.     obj.OnMove = nil
  986.     function obj:Draw(IsFocused,x,y)
  987.       if self.OnDraw~=nil then
  988.         self.OnDraw(IsFocused,x,y)
  989.       end
  990.       self.Focused = IsFocused
  991.       gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.BackColor))
  992.     end
  993.     function obj:Show()
  994.       self.IsShowing = true
  995.     end
  996.     function obj:Hide()
  997.       self.IsShowing = false
  998.     end
  999.     function obj:Click(x,y,e,b,w)
  1000.       if self.OnClick~=nil then
  1001.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  1002.         if x==nil then
  1003.           return
  1004.         end
  1005.       end
  1006.       if (e==3) and (self.IsMoving) then  --For old versions
  1007.         if self.OnMovement ~= nil then
  1008.           self.OnMovement(-self.MoveStartX + x,- self.MoveStartY + y)
  1009.         end
  1010.         if (-self.MoveStartX + x ~= 0) and (- self.MoveStartY + y ~= 0) then
  1011.           self.IsMoved = true
  1012.         end
  1013.         self.SumDX = self.SumDX - self.MoveStartX + x
  1014.         self.SumDY = self.SumDY - self.MoveStartY + y
  1015.         self.X = self.X - self.MoveStartX + x
  1016.         self.Y = self.Y - self.MoveStartY + y
  1017.         self.MoveStartX = x
  1018.         self.MoveStartY = y
  1019.       else
  1020.         if (e==mouseEvents.Up) and (self.IsMoving) then
  1021.           if self.IsMoved == false then
  1022.             if self.OnDone ~= nil then
  1023.               self.OnDone(self.SumDX,self.SumDY)
  1024.             end
  1025.           end
  1026.           self.IsMoving = false
  1027.         end
  1028.       end
  1029.       if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  1030.         if (e==mouseEvents.Down) and (b==mouseButtons.Right or b==4) then
  1031.           if self.OnAbort ~= nil then
  1032.             self.OnAbort(self.SumDX,self.SumDY)
  1033.           end
  1034.         end
  1035.         if (y>self.Y) and (y<self.Y+self.Height) and (e==mouseEvents.Down) then
  1036.           self.MoveStartX = x
  1037.           self.MoveStartY = y
  1038.           self.IsMoving = true
  1039.         end
  1040.         if (e==mouseEvents.Down) and (b==mouseButtons.Left) then
  1041.           self.IsMoved = false
  1042.         end
  1043.         return true
  1044.       end
  1045.     end
  1046.     function obj:Move(x,y,dx,dy)
  1047.       if self.OnMove~=nil then
  1048.         x,y,dx,dy = self.OnMove(x,y,dx,dy)
  1049.         if x==nil then
  1050.           return
  1051.         end
  1052.       end
  1053.       if self.IsMoving then
  1054.         if self.OnMovement ~= nil then
  1055.           self.OnMovement(-self.MoveStartX + x,- self.MoveStartY + y)
  1056.         end
  1057.         if (-self.MoveStartX + x ~= 0) and (- self.MoveStartY + y ~= 0) then
  1058.           self.IsMoved = true
  1059.         end
  1060.         self.SumDX = self.SumDX - self.MoveStartX + x
  1061.         self.SumDY = self.SumDY - self.MoveStartY + y
  1062.         self.X = self.X - self.MoveStartX + x
  1063.         self.Y = self.Y - self.MoveStartY + y
  1064.         self.MoveStartX = x
  1065.         self.MoveStartY = y
  1066.       end
  1067.     end
  1068.     function obj:KeyPress(key, scan, rep, shift, ctrl, alt, evnt)
  1069.     end
  1070.     setmetatable(obj, self)
  1071.     self.__index = self;
  1072.     return obj
  1073.   end
  1074.  
  1075.   function interface_s.Components.Listbox:new(x, y, w, h, theme)
  1076.     local obj= {}
  1077.     obj.Type = "Listbox"
  1078.     obj.X = x
  1079.     obj.Y = y
  1080.     obj.Focused=false
  1081.     obj.Theme = theme
  1082.     obj.IsShowing = true
  1083.     obj.Width = w
  1084.     obj.Height = h
  1085.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  1086.     obj.SelectedIndex = 1
  1087.     obj.Items = {}
  1088.     obj.ItemsColsCount = 1
  1089.     obj.ItemsColsPadding = {0}
  1090.  
  1091.     obj.OnItemSelected = nil
  1092.     obj.OnClick = nil
  1093.  
  1094.     obj.Base = nil
  1095.     obj.IsActive = false
  1096.     obj.ScrollStartItemIndex = 1
  1097.     obj.ItemClickHelper = interface_s.ComponentsHelpers.Click:new()
  1098.     obj.ItemClickHelper.OnPress = function(x,y)
  1099.         obj.SelectedIndex=math.floor((y-obj.Y)/11)+obj.ScrollStartItemIndex-1
  1100.         if obj.OnItemSelected~= nil then
  1101.           obj.OnItemSelected(obj.SelectedIndex,obj.Items[obj.SelectedIndex])
  1102.         end
  1103.         return true
  1104.     end
  1105.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  1106.       if not self.IsShowing then return end
  1107.       self.Focused = IsFocused
  1108.       gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BackColor))
  1109.       gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  1110.       local endindex = math.floor(self.Height/11)+self.ScrollStartItemIndex-1
  1111.       if table.getn(self.Items)<math.floor(self.Height/11) then
  1112.         endindex = table.getn(self.Items)
  1113.       end
  1114.       for i=self.ScrollStartItemIndex, endindex do
  1115.         if IsFocused then
  1116.           if self.SelectedIndex==i-1 then
  1117.             gfx.fillRect(self.X+baseX+2,self.Y+baseY+(i-self.ScrollStartItemIndex)*11+2,self.Width-4,10,gfx.getColors(self.Theme.SelectionColor))
  1118.             if self.ItemsColsCount==1 then
  1119.               gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.SelectionTextColor))
  1120.             else
  1121.               for j=1, self.ItemsColsCount do
  1122.                 gfx.drawText(self.X+baseX+3+self.ItemsColsPadding[j],self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i][j],gfx.getColors(self.Theme.SelectionTextColor))
  1123.               end
  1124.             end
  1125.           else
  1126.             if self.ItemsColsCount==1 then
  1127.               gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.TextColor))
  1128.             else
  1129.               for j=1, self.ItemsColsCount do
  1130.                 gfx.drawText(self.X+baseX+3+self.ItemsColsPadding[j],self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i][j],gfx.getColors(self.Theme.TextColor))
  1131.               end
  1132.             end
  1133.           end
  1134.           if x>self.X+3 and x<self.X+self.Width and y>self.Y+(i-self.ScrollStartItemIndex)*11 and y<self.Y+(i-self.ScrollStartItemIndex)*11+11 then
  1135.             gfx.fillRect(self.X+baseX+1,self.Y+baseY+(i-self.ScrollStartItemIndex)*11,self.Width-2,12,gfx.getColors(self.Theme.MouseOverColor))
  1136.           end
  1137.       else -- unfocused
  1138.         if self.SelectedIndex==i-1 then
  1139.           gfx.fillRect(self.X+baseX+2,self.Y+baseY+(i-self.ScrollStartItemIndex)*11+2,self.Width-4,10,gfx.getColors(self.Theme.UnfocusedSelectionColor))
  1140.           if self.ItemsColsCount==1 then
  1141.             gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.UnfocusedSelectionTextColor))
  1142.           else
  1143.             for j=1, self.ItemsColsCount do
  1144.               gfx.drawText(self.X+baseX+3+self.ItemsColsPadding[j],self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i][j],gfx.getColors(self.Theme.UnfocusedSelectionTextColor))
  1145.             end
  1146.           end
  1147.         else
  1148.           if self.ItemsColsCount==1 then
  1149.             gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.UnfocusedTextColor))
  1150.           else
  1151.             for j=1, self.ItemsColsCount do
  1152.               gfx.drawText(self.X+baseX+3+self.ItemsColsPadding[j],self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i][j],gfx.getColors(self.Theme.UnfocusedTextColor))
  1153.             end
  1154.           end
  1155.         end
  1156.         if x>self.X+3 and x<self.X+self.Width and y>self.Y+(i-self.ScrollStartItemIndex)*11 and y<self.Y+(i-self.ScrollStartItemIndex)*11+11 then
  1157.           gfx.fillRect(self.X+baseX+1,self.Y+baseY+(i-self.ScrollStartItemIndex)*11,self.Width-2,12,gfx.getColors(self.Theme.UnfocusedMouseOverColor))
  1158.         end
  1159.       end
  1160.     end
  1161.     end
  1162.     function obj:Show()
  1163.       self.IsShowing = true
  1164.     end
  1165.     function obj:Hide()
  1166.       self.IsShowing = false
  1167.     end
  1168.     function obj:Click(x,y,e,b,w)
  1169.       if self.OnClick~=nil then
  1170.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  1171.         if x==nil then
  1172.           return
  1173.         end
  1174.       end
  1175.       if w==1 and self.ScrollStartItemIndex<table.getn(self.Items)-math.floor( self.Height/11 )+1 then
  1176.         self.ScrollStartItemIndex=self.ScrollStartItemIndex+1
  1177.         return true
  1178.       elseif w==-1 and self.ScrollStartItemIndex>1 then
  1179.         self.ScrollStartItemIndex=self.ScrollStartItemIndex-1
  1180.         return true
  1181.       end
  1182.       return self.ItemClickHelper:ProcessClick(self.Width,(#self.Items-self.ScrollStartItemIndex+1)*11,self.X,self.Y,x,y,e,b)
  1183.     end
  1184.     setmetatable(obj, self)
  1185.     self.__index = self;
  1186.     return obj
  1187.   end
  1188.  
  1189.   function interface_s.ComponentsHelpers.Click:new(x, y)
  1190.     local obj= {}
  1191.     obj.IsFirstClick = false
  1192.     obj.OnPress = nil
  1193.     obj.OnFirstClick = nil
  1194.     obj.OnMissClick = nil
  1195.     function obj:ProcessClick(width,height,x,y,clickX,clickY,e,b)
  1196.       if (clickX>x) and (clickX<x+width) and (clickY>y) and (clickY<y+height) and (self.IsFirstClick==false) and (e==mouseEvents.Down) and (b==mouseButtons.Left) then
  1197.         self.IsFirstClick=true
  1198.         if self.OnFirstClick ~= nil then
  1199.           return self.OnFirstClick(clickX,clickY)
  1200.         else
  1201.           return true
  1202.         end
  1203.       else
  1204.         if (clickX>x) and (clickX<x+width) and (clickY>y) and (clickY<y+height) and (self.IsFirstClick==true) and (e==mouseEvents.Up) and (b==mouseButtons.Left) then
  1205.           self.IsFirstClick = false  
  1206.           if self.OnPress~= nil then
  1207.             return self.OnPress(clickX,clickY)
  1208.           else
  1209.             return true
  1210.           end
  1211.         else
  1212.           self.IsFirstClick = false
  1213.           if self.OnMissClick~= nil then
  1214.             return self.OnMissClick(clickX,clickY)
  1215.           end
  1216.         end
  1217.       end
  1218.     end
  1219.     setmetatable(obj, self)
  1220.     self.__index = self;
  1221.     return obj
  1222.   end
  1223.   function interface_s.ComponentsHelpers.Hint:new()
  1224.     local obj= {}
  1225.     obj.HintFrames = 0
  1226.     obj.Window = interface_s.Components.Window:new(0, 0, 0, 12,false, interface_s.DefaultTheme.Window)
  1227.     obj.Label = interface_s.Components.Label:new(5,2,"",interface_s.DefaultTheme.Label)
  1228.     obj.Window:AddComponent(obj.Label)
  1229.     obj.Window.AllowResize = false
  1230.     obj.Window.AlwaysFocused = true
  1231.     function obj:MouseOver(x,y,text)
  1232.       if text~="" then
  1233.         self.HintFrames = self.HintFrames + 1
  1234.         if self.HintFrames>40 then
  1235.           local w,h = gfx.textSize(text)
  1236.           self.Window.X = x
  1237.           self.Window.Y = y+12
  1238.           self.Window.Width = w+10
  1239.           self.Label.Text = text
  1240.           self.Window:Draw(true,x,y)
  1241.         end
  1242.       end
  1243.     end
  1244.     function obj:Reset()
  1245.       self.HintFrames = 0
  1246.     end
  1247.     setmetatable(obj, self)
  1248.     self.__index = self;
  1249.     return obj
  1250.   end
  1251. end
  1252. local function DefineAPI()
  1253.   interface_s.Components.Window = {}
  1254.   interface_s.Components.Button = {}
  1255.   interface_s.Components.Combobox = {}
  1256.   interface_s.Components.Graph = {}
  1257.   interface_s.Components.Label = {}
  1258.   interface_s.Components.Textbox = {}
  1259.   interface_s.Components.Checkbox = {}
  1260.   interface_s.Components.Listbox = {}
  1261.   interface_s.Components.Selection = {}
  1262.   interface_s.Components.SelectionMover = {}
  1263.   interface_s.ComponentsHelpers.Click = {}
  1264.   interface_s.ComponentsHelpers.Hint = {}
  1265.  
  1266.   interface_s.AddOnClickAction = function(func)
  1267.     for i=#interface_s.OnClick+1,2,-1 do
  1268.       interface_s.OnClick[i]=interface_s.OnClick[i-1]
  1269.     end
  1270.     if type(func) == "function" then
  1271.       interface_s.OnClick[1]={}
  1272.       interface_s.OnClick[1].Click = func
  1273.     else
  1274.       interface_s.OnClick[1] = func
  1275.     end
  1276.   end
  1277.  
  1278.   interface_s.RemoveOnClickAction = function(func)
  1279.     local index = interface_s.GetOnClickActionIndex(func)
  1280.     if index~=-1 then
  1281.       interface_s.OnClick[index] = 0
  1282.     end
  1283.   end
  1284.  
  1285.   interface_s.GetOnClickActionIndex=function(obj)
  1286.     if type(obj) == "function" then
  1287.       for i=1, #interface_s.OnClick do
  1288.         if interface_s.OnClick[i]~=0 then
  1289.           if interface_s.OnClick[i].Click == obj then
  1290.             return i
  1291.           end
  1292.         end
  1293.       end
  1294.     else
  1295.       for i=1, #interface_s.OnClick do
  1296.         if interface_s.OnClick[i] == obj then
  1297.           return i
  1298.         end
  1299.       end
  1300.     end
  1301.     return -1
  1302.   end
  1303.  
  1304.   interface_s.AddOnStepAction = function(func)
  1305.     for i=#interface_s.OnStep+1,2,-1 do
  1306.       interface_s.OnStep[i]=interface_s.OnStep[i-1]
  1307.     end
  1308.     interface_s.OnStep[1] = func
  1309.   end
  1310.  
  1311.   interface_s.RemoveOnStepAction = function(func)
  1312.     local index = interface_s.GetOnStepActionIndex(func)
  1313.     if index~=-1 then
  1314.       interface_s.OnStep[index]=0
  1315.     end
  1316.   end
  1317.  
  1318.   interface_s.GetOnStepActionIndex=function(obj)
  1319.     for i=1, #interface_s.OnStep do
  1320.       if interface_s.OnStep[i] == obj then
  1321.         return i
  1322.       end
  1323.     end
  1324.     return -1
  1325.   end
  1326.  
  1327.   interface_s.AddKeyPressAction = function(func)
  1328.     for i=#interface_s.OnKeyPress+1,2,-1 do
  1329.       interface_s.OnKeyPress[i]=interface_s.OnKeyPress[i-1]
  1330.     end
  1331.     if type(func) == "function" then
  1332.       interface_s.OnKeyPress[1]={}
  1333.       interface_s.OnKeyPress[1].KeyPress = func
  1334.     else
  1335.       interface_s.OnKeyPress[1] = func
  1336.     end
  1337.   end
  1338.  
  1339.   interface_s.RemoveKeyPressAction = function(func)
  1340.     local index = interface_s.GetOnKeyPressActionIndex(func)
  1341.     if index~=-1 then
  1342.       interface_s.OnKeyPress[index]=0
  1343.     end
  1344.   end
  1345.  
  1346.   interface_s.GetOnKeyPressActionIndex=function(obj)
  1347.     if type(obj) == "function" then
  1348.       for i=1, #interface_s.OnKeyPress do
  1349.         if interface_s.OnKeyPress[i].KeyPress == obj then
  1350.           return i
  1351.         end
  1352.       end
  1353.     else
  1354.       for i=1, #interface_s.OnKeyPress do
  1355.         if interface_s.OnKeyPress[i] == obj then
  1356.           return i
  1357.         end
  1358.       end
  1359.     end
  1360.     return -1
  1361.   end
  1362.   interface_s.AddLeftWindow=function(obj)
  1363.     for i=#interface_s.windows+1,2,-1 do
  1364.       interface_s.windows[i]=interface_s.windows[i-1]
  1365.     end
  1366.     interface_s.windows[1]=obj
  1367.   end
  1368.  
  1369.   interface_s.addComponent=function(obj)
  1370.     interface_s.AddLeftWindow(obj)
  1371.   end
  1372.  
  1373.   interface_s.GetComponentIndex=function(obj)
  1374.     for i=1, #interface_s.windows do
  1375.       if interface_s.windows[i] == obj then
  1376.         return i
  1377.       end
  1378.     end
  1379.     return -1
  1380.   end
  1381.  
  1382.   interface_s.RemoveComponent=function(obj)
  1383.     local index = interface_s.GetComponentIndex(obj)
  1384.     if index~=-1 then
  1385.       for i=index, #interface_s.windows-1 do
  1386.         interface_s.windows[i]=interface_s.windows[i+1]
  1387.       end
  1388.       interface_s.windows[#interface_s.windows] = nil
  1389.     end
  1390.   end
  1391.  
  1392.   interface_s.focusComponent = function(index)
  1393.     local temp= interface_s.windows[index]
  1394.     for i=index, 2,-1 do
  1395.       interface_s.windows[i] = interface_s.windows[i-1]
  1396.     end
  1397.     interface_s.windows[1] = temp
  1398.   end
  1399.  
  1400.   interface_s.deleteFromArray = function(ar,index)
  1401.     for i=index, #ar-1 do
  1402.       ar[i]=ar[i+1]
  1403.     end
  1404.     ar[#ar] = nil
  1405.   end
  1406.  
  1407.   interface_s.step = function()
  1408.     interface_s.zoomGfx.needInfoUpdate = true
  1409.     local tool = nil
  1410.     if interface_s.ToolsAPI.Tools[elements[tpt.selectedl]]~=nil then
  1411.       if interface_s.ToolsAPI.Tools[elements[tpt.selectedl]].OnStep~=nil then
  1412.         interface_s.ToolsAPI.Tools[elements[tpt.selectedl]].OnStep(tpt.mousex,tpt.mousey)
  1413.       end
  1414.     end
  1415.     if interface_s.ToolsAPI.Tools[elements[tpt.selectedr]]~=nil then
  1416.       if interface_s.ToolsAPI.Tools[elements[tpt.selectedr]].OnStep~=nil then
  1417.         interface_s.ToolsAPI.Tools[elements[tpt.selectedr]].OnStep(tpt.mousex,tpt.mousey)
  1418.       end
  1419.     end
  1420.     if interface_s.ToolsAPI.Tools[elements[tpt.selecteda]]~=nil then
  1421.       if interface_s.ToolsAPI.Tools[elements[tpt.selecteda]].OnStep~=nil then
  1422.         interface_s.ToolsAPI.Tools[elements[tpt.selecteda]].OnStep(tpt.mousex,tpt.mousey)
  1423.       end
  1424.     end
  1425.     local deletedFound = false
  1426.     for i=1,#interface_s.OnStep do
  1427.       if interface_s.OnStep[i]~=0 then
  1428.         interface_s.OnStep[i](tpt.mousex,tpt.mousey)
  1429.       else
  1430.         deletedFound = true
  1431.       end
  1432.     end
  1433.     if deletedFound then
  1434.       for i=1,#interface_s.OnStep do
  1435.         if interface_s.OnStep[i]==0 then
  1436.           interface_s.deleteFromArray(interface_s.OnStep,i)
  1437.           i=i-1
  1438.         end
  1439.       end
  1440.     end
  1441.     for i=#interface_s.windows, 1,-1 do
  1442.       if (interface_s.windows[i] ~= nil) and (interface_s.windows[i].IsShowing==true) then
  1443.         if i==1 then
  1444.           interface_s.windows[i]:Draw(true,tpt.mousex,tpt.mousey)
  1445.         else
  1446.           interface_s.windows[i]:Draw(false,tpt.mousex,tpt.mousey)
  1447.         end
  1448.       end
  1449.     end
  1450.   end
  1451.  
  1452.   interface_s.click = function(mousex, mousey, button, event,wheel)
  1453.     if mousex==0 and mousey==0 and button==0 and event==mouseEvents.Up then
  1454.       return false
  1455.     end
  1456.     if event==3 then
  1457.       interface_s.mousemove(mousex,mousey,-1,-1)
  1458.       return true
  1459.     end
  1460.     local deletedFound = false
  1461.     local f = false
  1462.     for i=1,#interface_s.OnClick do
  1463.       if interface_s.OnClick[i]~=0 then
  1464.         if interface_s.OnClick[i].Base~=nil then
  1465.           if interface_s.OnClick[i]:Click(mousex-interface_s.OnClick[i].Base.X , mousey-interface_s.OnClick[i].Base.Y , event, button,wheel) then
  1466.             f=true
  1467.           end
  1468.         else
  1469.           if interface_s.OnClick[i].Click(mousex, mousey, event, button,wheel) then
  1470.             f=true
  1471.           end
  1472.         end
  1473.       else
  1474.         deletedFound = true
  1475.       end
  1476.     end
  1477.     if deletedFound then
  1478.       for i=1,#interface_s.OnClick do
  1479.         if interface_s.OnClick[i]==0 then
  1480.           interface_s.deleteFromArray(interface_s.OnClick,i)
  1481.           i=i-1
  1482.         end
  1483.       end
  1484.     end
  1485.     for i=1,#interface_s.windows do
  1486.       if interface_s.windows[i] == nil then
  1487.         interface_s.RemoveComponent(interface_s.windows[i])
  1488.         break
  1489.       end
  1490.       if (interface_s.windows ~= nil) then
  1491.         if interface_s.windows[i]:Click(mousex , mousey , event, button,wheel) then
  1492.           if (interface_s.windows[i]~=nil) and (interface_s.windows[i].IsShowing~=nil) and (interface_s.windows[i].IsShowing==true) then
  1493.             interface_s.focusComponent(i)
  1494.             return false
  1495.           end
  1496.         end
  1497.       end
  1498.     end
  1499.     if f==false then
  1500.       local selected = nil
  1501.       if button==mouseButtons.Left then
  1502.         selected=elements[tpt.selectedl]
  1503.       end
  1504.       if button==mouseButtons.Right then
  1505.         selected=elements[tpt.selectedr]
  1506.       end
  1507.       if button==mouseButtons.Middle then
  1508.         selected=elements[tpt.selecteda]
  1509.       end
  1510.       if selected~=nil then
  1511.         if mousex<sim.XRES and mousey<sim.YRES then
  1512.           if interface_s.ToolsAPI.Tools[selected]~=nil  and not interface_s.TPTinterfaceInfo.placingZoom and not interface_s.TPTinterfaceInfo.stampMenu and not interface_s.TPTinterfaceInfo.copyOrPaste then
  1513.             if interface_s.ToolsAPI.Tools[selected].Buttons[button] then
  1514.               if interface_s.ToolsAPI.Tools[selected].Event[event] then
  1515.                 if interface_s.ToolsAPI.Tools[selected].OnClick~=nil then
  1516.                   interface_s.ToolsAPI.Tools[selected].OnClick(mousex, mousey, event, button,wheel)
  1517.                 end
  1518.               end
  1519.             end
  1520.             f = true
  1521.           end
  1522.         end
  1523.       end
  1524.     end
  1525.     if f==true then
  1526.       return false
  1527.     else
  1528.       if interface_s.TPTinterfaceInfo.placingZoom and event==mouseEvents.Up then
  1529.         interface_s.TPTinterfaceInfo.placingZoom = false
  1530.       else
  1531.         if (interface_s.TPTinterfaceInfo.stampMenu or interface_s.TPTinterfaceInfo.copyOrPaste) and event==mouseEvents.Up then
  1532.           interface_s.TPTinterfaceInfo.stampMenu = false
  1533.           interface_s.TPTinterfaceInfo.copyOrPaste = false
  1534.         end
  1535.       end
  1536.     end
  1537.   end
  1538.   interface_s.key = function(key, scan, rep, shift, ctrl, alt, evnt)
  1539.     local f = false
  1540.     if interface_s.windows[1] ~= nil then
  1541.       if interface_s.windows[1]:KeyPress(key, scan, rep, shift, ctrl, alt, evnt) then
  1542.         f = true
  1543.       end
  1544.     end
  1545.     local deletedFound = false
  1546.     for i=1,#interface_s.OnKeyPress do
  1547.       if interface_s.OnKeyPress[i]~=0 then
  1548.         if interface_s.OnKeyPress[i].Base~=nil then
  1549.           if interface_s.OnKeyPress[i]:KeyPress(key, scan, rep, shift, ctrl, alt, evnt) then
  1550.             f=true
  1551.           end
  1552.         else
  1553.           if interface_s.OnKeyPress[i].KeyPress(key, scan, rep, shift, ctrl, alt, evnt) then
  1554.             f=true
  1555.           end
  1556.         end
  1557.       else
  1558.         deletedFound = true
  1559.       end
  1560.     end
  1561.     if deletedFound then
  1562.       for i=1,#interface_s.OnKeyPress do
  1563.         if interface_s.OnKeyPress[i]==0 then
  1564.           interface_s.deleteFromArray(interface_s.OnKeyPress,i)
  1565.           i=i-1
  1566.         end
  1567.       end
  1568.     end
  1569.     if f==true then
  1570.       return false
  1571.     else
  1572.       if rep==false then
  1573.         if ((key == 99 and ctrl) or (key == 120 and ctrl) or (key == 118 and ctrl) or key == 108 or key == 115) and evnt==keyEvents.keyPress then
  1574.           interface_s.TPTinterfaceInfo.copyOrPaste = true
  1575.         end
  1576.         if key == 107 and evnt==keyEvents.keyPress then
  1577.           interface_s.TPTinterfaceInfo.stampMenu = true
  1578.           interface_s.TPTinterfaceInfo.copyOrPaste = false
  1579.         end
  1580.         if key == 27 and evnt==keyEvents.keyRelease then
  1581.           interface_s.TPTinterfaceInfo.stampMenu = false
  1582.         end
  1583.         if key == 122 and evnt==keyEvents.keyPress then
  1584.           interface_s.TPTinterfaceInfo.placingZoom = true
  1585.         end
  1586.         if key == 122 and evnt==keyEvents.keyRelease then
  1587.           interface_s.TPTinterfaceInfo.placingZoom = false
  1588.         end
  1589.       end
  1590.     end
  1591.   end
  1592.  
  1593.   interface_s.mousemove = function(x, y, dx, dy)
  1594.     for i=1,#interface_s.windows do
  1595.       if interface_s.windows[i] == nil then
  1596.         interface_s.RemoveComponent(interface_s.windows[i])
  1597.         break
  1598.       end
  1599.       if (interface_s.windows ~= nil) then
  1600.         if interface_s.windows[i]:Move(x , y , dx, dy) then
  1601.           if (interface_s.windows[i]~=nil) and (interface_s.windows[i].IsShowing~=nil) and (interface_s.windows[i].IsShowing==true) then
  1602.             interface_s.focusComponent(i)
  1603.             return false
  1604.           end
  1605.         end
  1606.       end
  1607.     end
  1608.   end
  1609.  
  1610.   interface_s.mouseUpToClick = function(x, y, b)
  1611.     return interface_s.click(x,y,b,mouseEvents.Up)
  1612.   end
  1613.   interface_s.mouseDownToClick = function(x, y, b)
  1614.     return interface_s.click(x,y,b,mouseEvents.Down)
  1615.   end
  1616.   interface_s.mouseWheelToClick = function(x, y, d)
  1617.     return interface_s.click(x,y,0,0,d)
  1618.   end
  1619.  
  1620.   interface_s.textInputToKey = function(text)
  1621.     return interface_s.key(text, nil, nil, nil, nil, nil, keyEvents.textInput)
  1622.   end
  1623.   interface_s.keyPressToKey = function(key, scan, rep, shift, ctrl, alt)
  1624.     return interface_s.key(key, scan, rep, shift, ctrl, alt, keyEvents.keyPress)
  1625.   end
  1626.   interface_s.keyReleaseToKey = function(key, scan, rep, shift, ctrl, alt)
  1627.     return interface_s.key(key, scan, rep, shift, ctrl, alt, keyEvents.keyRelease)
  1628.   end
  1629.  
  1630.   if tpt.version.major<=93 and tpt.version.jacob1s_mod==nil or tpt.version.jacob1s_mod~=nil and tpt.version.jacob1s_mod<42 then
  1631.     tpt.register_step(interface_s.step)
  1632.     tpt.register_mouseclick(interface_s.click)
  1633.     tpt.register_keypress(interface_s.key)
  1634.   else
  1635.     event.register(event.tick, interface_s.step)  
  1636.     event.register(event.mousedown, interface_s.mouseDownToClick)
  1637.     event.register(event.mouseup, interface_s.mouseUpToClick)
  1638.     event.register(event.mousemove, interface_s.mousemove)
  1639.     event.register(event.mousewheel, interface_s.mouseWheelToClick)
  1640.     event.register(event.keypress, interface_s.keyPressToKey)
  1641.     event.register(event.textinput, interface_s.textInputToKey)
  1642.     event.register(event.keyrelease, interface_s.keyReleaseToKey )  
  1643.   end
  1644. end
  1645. local function unregisterOldVerionEvents()
  1646.   pcall(tpt.unregister_step,interface_s.step)
  1647.   pcall(tpt.unregister_mouseclick,interface_s.click)
  1648.   pcall(tpt.unregister_keypress,interface_s.key)
  1649.   if event~=nil then
  1650.     pcall(event.unregister,event.mousedown,interface_s.mouseDownToClick)
  1651.     pcall(event.unregister,event.mouseup,interface_s.mouseUpToClick)
  1652.     pcall(event.unregister,event.mousemove,interface_s.mousemove)
  1653.     pcall(event.unregister,event.mousewheel,interface_s.mouseWheelToClick)
  1654.     pcall(event.unregister,event.keypress,interface_s.key)
  1655.     pcall(event.unregister,event.textinput,interface_s.key)
  1656.     pcall(event.unregister,event.keypress,interface_s.keyPressToKey)
  1657.     pcall(event.unregister,event.textinput,interface_s.textInputToKey)
  1658.     pcall(event.unregister,event.keyrelease,interface_s.keyReleaseToKey)
  1659.   end
  1660. end
  1661. local function InitIntefaceAPI()
  1662.   if interface_s == nil then
  1663.     interface_s = {
  1664.       Version = InterfaceAPIVersion,
  1665.       Components = {},
  1666.       ComponentsHelpers = {},
  1667.       windows = {},
  1668.       step = nil,
  1669.       click = nil,
  1670.       mouseUpToClick = nil,
  1671.       mouseDownToClick = nil,
  1672.       mouseWheelToClick = nil,
  1673.       mousemove = nil,
  1674.       key = nil,
  1675.       addLeft = nil,
  1676.       addComponent = nil,
  1677.       GetComponentIndex = nil,
  1678.       RemoveComponent = nil,
  1679.       focusComponent = nil,
  1680.       OnClick = {},
  1681.       OnKeyPress = {},
  1682.       OnStep = {},
  1683.       DefaultTheme = {},
  1684.       mouseEvents = mouseEvents,
  1685.       mouseButtons = mouseButtons,
  1686.       keyEvents = keyEvents,
  1687.       zoomGfx = {},
  1688.       ToolsAPI = { Tools = {} },
  1689.       TPTinterfaceInfo = { placingZoom = false, stampMenu = false, copyOrPaste = false}
  1690.     }
  1691.     DefineAPI()
  1692.     DefineInterfaceComponents()
  1693.   else
  1694.     if interface_s.Version<InterfaceAPIVersion then
  1695.       unregisterOldVerionEvents()
  1696.       interface_s = {
  1697.         Version = InterfaceAPIVersion,
  1698.         Components = {},
  1699.         ComponentsHelpers = {},
  1700.         windows = interface_s.windows,
  1701.         step = nil,
  1702.         click = nil,
  1703.         mouseUpToClick = nil,
  1704.         mouseDownToClick = nil,
  1705.         mouseWheelToClick = nil,
  1706.         mousemove = nil,
  1707.         key = nil,
  1708.         addLeft = nil,
  1709.         addComponent = nil,
  1710.         GetComponentIndex = nil,
  1711.         RemoveComponent = nil,
  1712.         focusComponent = nil,
  1713.         OnClick = interface_s.OnClick or {},
  1714.         OnKeyPress = interface_s.OnKeyPress or {},
  1715.         OnStep = interface_s.OnStep or {},
  1716.         DefaultTheme = interface_s.DefaultTheme or {},
  1717.         mouseEvents = mouseEvents,
  1718.         mouseButtons = mouseButtons,
  1719.         keyEvents = keyEvents,
  1720.         zoomGfx = {},
  1721.         ToolsAPI = interface_s.ToolsAPI or { Tools = {} },
  1722.         TPTinterfaceInfo = interface_s.TPTinterfaceInfo or { placingZoom = false, stampMenu = false, copyOrPaste = false}
  1723.       }
  1724.       DefineAPI()
  1725.       DefineInterfaceComponents()
  1726.     end
  1727.     interface_s.zoomGfx.needInfoUpdate = true
  1728.   end
  1729. end
  1730. InitIntefaceAPI()
  1731.  
  1732. --==========================Zoom gfx============================--
  1733. local function round(n)
  1734.   return math.floor(n+0.5)
  1735. end
  1736. interface_s.zoomGfx.isZoomActive = false
  1737. interface_s.zoomGfx.zoomPixelSize = -1
  1738. interface_s.zoomGfx.zoomWidthInRealPixels = -1
  1739. interface_s.zoomGfx.zoomRealPositionX = -1
  1740. interface_s.zoomGfx.zoomRealPositionY = -1
  1741. interface_s.zoomGfx.zoomWindowPositionX = -1
  1742. interface_s.zoomGfx.zoomWindowPositionY = -1
  1743. interface_s.zoomGfx.zoomWindowSize = -1
  1744. interface_s.zoomGfx.getZoomInfo = function()
  1745.   interface_s.zoomGfx.needInfoUpdate = false
  1746.   interface_s.zoomGfx.isZoomActive=false
  1747.   if sim.adjustCoords(sim.XRES-1,5)~=sim.XRES-1 then
  1748.     interface_s.zoomGfx.isZoomActive=true
  1749.     local x,y = sim.adjustCoords(sim.XRES-1,2)
  1750.     interface_s.zoomGfx.zoomRealPositionX = x
  1751.     interface_s.zoomGfx.zoomRealPositionY = y
  1752.     local i=sim.XRES-2
  1753.     while x==sim.adjustCoords(i,2) do
  1754.       i=i-1
  1755.     end
  1756.     interface_s.zoomGfx.zoomPixelSize = sim.XRES-i-1
  1757.     i=interface_s.zoomGfx.zoomPixelSize
  1758.     while sim.adjustCoords(sim.XRES-i,2)~=sim.XRES-i do
  1759.       i=i+interface_s.zoomGfx.zoomPixelSize
  1760.     end
  1761.     interface_s.zoomGfx.zoomWidthInRealPixels = (i-interface_s.zoomGfx.zoomPixelSize)/interface_s.zoomGfx.zoomPixelSize
  1762.     interface_s.zoomGfx.zoomRealPositionX=interface_s.zoomGfx.zoomRealPositionX-interface_s.zoomGfx.zoomWidthInRealPixels+1
  1763.     interface_s.zoomGfx.zoomWindowPositionX = sim.XRES-i+interface_s.zoomGfx.zoomPixelSize
  1764.     if tpt.version.jacob1s_mod~=nil then
  1765.       interface_s.zoomGfx.zoomWindowPositionY = 1
  1766.     else
  1767.       interface_s.zoomGfx.zoomWindowPositionY = 0
  1768.     end
  1769.     interface_s.zoomGfx.zoomWindowSize = interface_s.zoomGfx.zoomPixelSize*interface_s.zoomGfx.zoomWidthInRealPixels
  1770.   else
  1771.     if sim.adjustCoords(1,5)~=1 then
  1772.       interface_s.zoomGfx.isZoomActive=true
  1773.       local x,y = sim.adjustCoords(1,2)
  1774.       interface_s.zoomGfx.zoomRealPositionX = x
  1775.       interface_s.zoomGfx.zoomRealPositionY = y
  1776.       local i=2
  1777.       while x==sim.adjustCoords(i,2) do
  1778.         i=i+1
  1779.       end
  1780.       if tpt.version.jacob1s_mod~=nil then
  1781.         interface_s.zoomGfx.zoomPixelSize = i-1
  1782.       else
  1783.         interface_s.zoomGfx.zoomPixelSize = i
  1784.       end
  1785.       i=interface_s.zoomGfx.zoomPixelSize
  1786.       while sim.adjustCoords(i,2)~=i do
  1787.         i=i+interface_s.zoomGfx.zoomPixelSize
  1788.       end
  1789.       interface_s.zoomGfx.zoomWidthInRealPixels = (i-interface_s.zoomGfx.zoomPixelSize)/interface_s.zoomGfx.zoomPixelSize
  1790.       if tpt.version.jacob1s_mod~=nil then
  1791.         interface_s.zoomGfx.zoomWindowPositionX = 1
  1792.         interface_s.zoomGfx.zoomWindowPositionY = 1
  1793.       else
  1794.         interface_s.zoomGfx.zoomWindowPositionX = 0
  1795.         interface_s.zoomGfx.zoomWindowPositionY = 0
  1796.       end
  1797.       interface_s.zoomGfx.zoomWindowSize = interface_s.zoomGfx.zoomPixelSize*interface_s.zoomGfx.zoomWidthInRealPixels+1
  1798.     end
  1799.   end
  1800. end
  1801.  
  1802. interface_s.zoomGfx.CoordinatesToZoomWindow = function(x,y)
  1803.   if interface_s.zoomGfx.needInfoUpdate then
  1804.     interface_s.zoomGfx.getZoomInfo()
  1805.   end
  1806.   return interface_s.zoomGfx.zoomWindowPositionX+(x-interface_s.zoomGfx.zoomRealPositionX)*interface_s.zoomGfx.zoomPixelSize,interface_s.zoomGfx.zoomWindowPositionY+(y-interface_s.zoomGfx.zoomRealPositionY)*interface_s.zoomGfx.zoomPixelSize
  1807. end
  1808.  
  1809. interface_s.zoomGfx.drawPixelInZoomWindow = function(x,y,r,g,b,a)
  1810.   if interface_s.zoomGfx.needInfoUpdate then
  1811.     interface_s.zoomGfx.getZoomInfo()
  1812.   end
  1813.   if interface_s.zoomGfx.isZoomActive then
  1814.     x = round(x)
  1815.     y = round(y)
  1816.     if x>=interface_s.zoomGfx.zoomRealPositionX and x<interface_s.zoomGfx.zoomRealPositionX+interface_s.zoomGfx.zoomWidthInRealPixels and y>=interface_s.zoomGfx.zoomRealPositionY and y<interface_s.zoomGfx.zoomRealPositionY+interface_s.zoomGfx.zoomWidthInRealPixels then
  1817.       local posX,posY = interface_s.zoomGfx.CoordinatesToZoomWindow(x,y)
  1818.       graphics.fillRect(posX,posY,interface_s.zoomGfx.zoomPixelSize-1,interface_s.zoomGfx.zoomPixelSize-1,r,g,b,a)
  1819.     end
  1820.   end
  1821. end
  1822. --==========================Zoom gfx end========================--
  1823. --==========================Tools API Start========================--
  1824. local function deleteTool(i)
  1825.   sim.partKill(i)
  1826. end
  1827. interface_s.ToolsAPI.AddNewTool = function(name, menuSection, color, group, visibleName, desc)
  1828.   if group == nil then group = "tools" end
  1829.   if visibleName == nil then visibleName = name end
  1830.   local newElTool = elements.allocate(group, name)
  1831.   elements.property(newElTool, "Name", visibleName)
  1832.   elements.property(newElTool, "Color", color)
  1833.   elements.property(newElTool, "MenuSection", menuSection)
  1834.   elements.property(newElTool, "MenuVisible", 1)
  1835.   elements.property(newElTool, "Description", desc)
  1836.   elements.property(newElTool, "Update", deleteTool)
  1837.   elements.property(newElTool, "Properties", elem.PROP_NOCTYPEDRAW)
  1838.   local newTool = {}
  1839.   newTool.Buttons = {true, true, true} --Left, Middle, Right buttons
  1840.   newTool.Event = {true, false} --Only when mouse down
  1841.   newTool.Element = newElTool
  1842.   newTool.OnStep = nil
  1843.   newTool.OnClick = nil
  1844.   interface_s.ToolsAPI.Tools[newElTool] = newTool
  1845.   return newTool
  1846. end
  1847. --==========================Tools API End========================--
  1848. --=================================================================--
  1849. --                       THEME START                               --
  1850. --=================================================================--
  1851. interface_s.DefaultTheme = {
  1852.   Window = {},
  1853.   Button = {},
  1854.   Combobox = {},
  1855.   Graph = {},
  1856.   Label = {},
  1857.   Textbox = {},
  1858.   Checkbox = {},
  1859.   Listbox = {},
  1860.   Selection = {}
  1861. }
  1862.  
  1863. interface_s.DefaultTheme.Window.BackColor = gfx.getHexColor(0,0,0,255)
  1864. interface_s.DefaultTheme.Window.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1865. interface_s.DefaultTheme.Window.BorderColor = gfx.getHexColor(255,255,255,255)
  1866. interface_s.DefaultTheme.Window.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1867. interface_s.DefaultTheme.Window.HeaderColor = gfx.getHexColor(150,150,255,255)
  1868. interface_s.DefaultTheme.Window.UnfocusedHeaderColor = gfx.getHexColor(32,32,55,255)
  1869.  
  1870. interface_s.DefaultTheme.Button.BackColor = gfx.getHexColor(0,0,0,0)
  1871. interface_s.DefaultTheme.Button.UnfocusedBackColor = gfx.getHexColor(0,0,0,0)
  1872. interface_s.DefaultTheme.Button.PressedBackColor = gfx.getHexColor(240,240,240,255)
  1873. interface_s.DefaultTheme.Button.BorderColor = gfx.getHexColor(255,255,255,255)
  1874. interface_s.DefaultTheme.Button.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1875. interface_s.DefaultTheme.Button.MouseOverColor = gfx.getHexColor(255,255,255,128)
  1876. interface_s.DefaultTheme.Button.UnfocusedMouseOverColor = gfx.getHexColor(150,150,150,128)
  1877. interface_s.DefaultTheme.Button.TextColor = gfx.getHexColor(255,255,255,255)
  1878. interface_s.DefaultTheme.Button.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1879. interface_s.DefaultTheme.Button.PressedTextColor = gfx.getHexColor(0,0,0,255)
  1880.  
  1881. interface_s.DefaultTheme.Combobox.BackColor = gfx.getHexColor(0,0,0,255)
  1882. interface_s.DefaultTheme.Combobox.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1883. interface_s.DefaultTheme.Combobox.BorderColor = gfx.getHexColor(255,255,255,255)
  1884. interface_s.DefaultTheme.Combobox.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1885. interface_s.DefaultTheme.Combobox.TextColor = gfx.getHexColor(255,255,255,255)
  1886. interface_s.DefaultTheme.Combobox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1887. interface_s.DefaultTheme.Combobox.ButtonBackColor = gfx.getHexColor(0,0,0,255)
  1888. interface_s.DefaultTheme.Combobox.ButtonPressedBackColor = gfx.getHexColor(255,255,255,255)
  1889. interface_s.DefaultTheme.Combobox.ButtonMouseOverBackColor = gfx.getHexColor(150,150,150,128)
  1890. interface_s.DefaultTheme.Combobox.UnfocusedButtonBackColor = gfx.getHexColor(0,0,0,255)
  1891. interface_s.DefaultTheme.Combobox.UnfocusedButtonMouseOverBackColor = gfx.getHexColor(150,150,150,128)
  1892.  
  1893. interface_s.DefaultTheme.Graph.BackColor = gfx.getHexColor(0,0,0,255)
  1894. interface_s.DefaultTheme.Graph.BorderColor = gfx.getHexColor(255,255,255,255)
  1895. interface_s.DefaultTheme.Graph.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1896. interface_s.DefaultTheme.Graph.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1897. interface_s.DefaultTheme.Graph.TextColor = gfx.getHexColor(255,255,255,255)
  1898. interface_s.DefaultTheme.Graph.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1899. interface_s.DefaultTheme.Graph.GraphColor = gfx.getHexColor(255,100,100,255)
  1900. interface_s.DefaultTheme.Graph.UnfocusedGraphColor = gfx.getHexColor(100,30,30,255)
  1901. interface_s.DefaultTheme.Graph.ZeroLine = gfx.getHexColor(255,200,200,255)
  1902. interface_s.DefaultTheme.Graph.UnfocusedZeroLine = gfx.getHexColor(100,80,80,255)
  1903.  
  1904. interface_s.DefaultTheme.Label.TextColor = gfx.getHexColor(255,255,255,255)
  1905. interface_s.DefaultTheme.Label.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1906.  
  1907. interface_s.DefaultTheme.Textbox.BackColor = gfx.getHexColor(0,0,0,255)
  1908. interface_s.DefaultTheme.Textbox.BorderColor = gfx.getHexColor(255,200,200,255)
  1909. interface_s.DefaultTheme.Textbox.TextColor = gfx.getHexColor(255,255,255,255)
  1910. interface_s.DefaultTheme.Textbox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1911. interface_s.DefaultTheme.Textbox.PointerColor = gfx.getHexColor(255,255,255,255)
  1912. interface_s.DefaultTheme.Textbox.UnfocusedBorderColor = gfx.getHexColor(200,200,200,255)
  1913.  
  1914. interface_s.DefaultTheme.Checkbox.BorderColor = gfx.getHexColor(255,255,255,255)
  1915. interface_s.DefaultTheme.Checkbox.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1916. interface_s.DefaultTheme.Checkbox.CheckColor = gfx.getHexColor(255,255,255,255)
  1917. interface_s.DefaultTheme.Checkbox.UnfocusedCheckColor = gfx.getHexColor(150,150,150,255)
  1918. interface_s.DefaultTheme.Checkbox.TextColor = gfx.getHexColor(255,255,255,255)
  1919. interface_s.DefaultTheme.Checkbox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1920.  
  1921. interface_s.DefaultTheme.Listbox.BackColor = gfx.getHexColor(0,0,0,255)
  1922. interface_s.DefaultTheme.Listbox.BorderColor = gfx.getHexColor(255,255,255,255)
  1923. interface_s.DefaultTheme.Listbox.SelectionColor = gfx.getHexColor(255,255,255,255)
  1924. interface_s.DefaultTheme.Listbox.SelectionTextColor = gfx.getHexColor(0,0,0,255)
  1925. interface_s.DefaultTheme.Listbox.TextColor = gfx.getHexColor(255,255,255,255)
  1926. interface_s.DefaultTheme.Listbox.MouseOverColor = gfx.getHexColor(255,255,255,50)
  1927. interface_s.DefaultTheme.Listbox.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1928. interface_s.DefaultTheme.Listbox.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1929. interface_s.DefaultTheme.Listbox.UnfocusedSelectionColor = gfx.getHexColor(150,150,150,255)
  1930. interface_s.DefaultTheme.Listbox.UnfocusedSelectionTextColor = gfx.getHexColor(0,0,0,255)
  1931. interface_s.DefaultTheme.Listbox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1932. interface_s.DefaultTheme.Listbox.UnfocusedMouseOverColor = gfx.getHexColor(150,150,150,50)
  1933.  
  1934. interface_s.DefaultTheme.Selection.BackColor = gfx.getHexColor(140,140,200,70)
  1935. --=================================================================--
  1936. --                         THEME END                               --
  1937. --=================================================================--
  1938.  
  1939. local DefaultTheme = interface_s.DefaultTheme
  1940. local data = {
  1941.    ["Set type"] = {
  1942.       default = { life = 1, value = sim.FIELD_CTYPE, target = sim.FIELD_TMP },
  1943.       useCoord = { life = 2, value = sim.FIELD_CTYPE, x = sim.FIELD_TMP, y = sim.FIELD_TMP2 }
  1944.    },
  1945.    ["Set temp"] = {
  1946.       default = { life = 4, value = sim.FIELD_TMP, target = sim.FIELD_CTYPE },
  1947.       useCoord = { life = 3, value = sim.FIELD_CTYPE, x = sim.FIELD_TMP, y = sim.FIELD_TMP2 }
  1948.    },
  1949.    ["Set life"] = {
  1950.       default = { life = 5, value = sim.FIELD_TMP, target = sim.FIELD_CTYPE },
  1951.       useCoord = { life = 6, value = sim.FIELD_CTYPE, x = sim.FIELD_TMP, y = sim.FIELD_TMP2 }
  1952.    },
  1953.    ["Set tmp"] = {
  1954.       default = { life = 8, value = sim.FIELD_TMP, target = sim.FIELD_CTYPE },
  1955.       useCoord = { life = 7, value = sim.FIELD_CTYPE, x = sim.FIELD_TMP, y = sim.FIELD_TMP2 }
  1956.    },
  1957.    ["Set tmp2"] = {
  1958.       default = { life = 10, value = sim.FIELD_TMP, target = sim.FIELD_CTYPE },
  1959.       useCoord = { life = 9, value = sim.FIELD_CTYPE, x = sim.FIELD_TMP, y = sim.FIELD_TMP2 }
  1960.    },
  1961.    ["Set ctype"] = {
  1962.       default = { life = 11, value = sim.FIELD_CTYPE, target = sim.FIELD_TMP },
  1963.       useCoord = { life = 12, value = sim.FIELD_CTYPE, x = sim.FIELD_TMP, y = sim.FIELD_TMP2 }
  1964.    },
  1965.    ['Other'] = {
  1966.       ["Set pause"] = {
  1967.          default = { life = 13 }
  1968.       },
  1969.       ["Reset temp"] = {
  1970.          default = { life = 15 }
  1971.       },
  1972.       ["Reset pressure"] = {
  1973.          default = { life = 16 }
  1974.       },
  1975.       ["Set gravity"] = {
  1976.          default = { life = 14, value = sim.FIELD_TMP }
  1977.       },
  1978.       ["Reset spark"] = {
  1979.          default = { life = 17 }
  1980.       },
  1981.       ["Display mode"] = {
  1982.          default = { life = 18, value = sim.FIELD_TMP }
  1983.       },
  1984.    },
  1985.    ["Create part"] = {
  1986.       useCoord = { life = 19, value = sim.FIELD_CTYPE, x = sim.FIELD_TMP2, y = sim.FIELD_TMP }
  1987.    }
  1988. }
  1989.  
  1990. local actions = {
  1991.    [1] = function(ctype,tmp,tmp2) tpt.set_property("type",ctype,elements.property(tmp, "Name")) end,
  1992.    [2] = function(ctype,tmp,tmp2) tpt.set_property("type",ctype,tmp,tmp2) end,
  1993.  
  1994.    [3] = function(ctype,tmp,tmp2) tpt.set_property("temp",ctype,tmp,tmp2) end,
  1995.    [4] = function(ctype,tmp,tmp2) tpt.set_property("temp",tmp,elements.property(ctype, "Name")) end,
  1996.  
  1997.    [5] = function(ctype,tmp,tmp2) tpt.set_property("life",tmp,elements.property(ctype, "Name")) end,
  1998.    [6] = function(ctype,tmp,tmp2) tpt.set_property("life",ctype,tmp,tmp2) end,
  1999.  
  2000.    [7] = function(ctype,tmp,tmp2) tpt.set_property("tmp",ctype,tmp,tmp2) end,
  2001.    [8] = function(ctype,tmp,tmp2) tpt.set_property("tmp",tmp,elements.property(ctype, "Name")) end,
  2002.  
  2003.    [9] = function(ctype,tmp,tmp2) tpt.set_property("tmp2",ctype,tmp,tmp2) end,
  2004.    [10] = function(ctype,tmp,tmp2) tpt.set_property("tmp2",tmp,elements.property(ctype, "Name")) end,
  2005.  
  2006.    [11] = function(ctype,tmp,tmp2) tpt.set_property("tmp2",ctype,elements.property(tmp, "Name")) end,
  2007.    [12] = function(ctype,tmp,tmp2) tpt.set_property("tmp2",ctype,tmp,tmp2) end,
  2008.  
  2009.    [13] = function(ctype,tmp,tmp2) tpt.set_pause(1) end,
  2010.    [14] = function(ctype,tmp,tmp2) sim.gravityMode(tmp-1) end,
  2011.    [15] = function(ctype,tmp,tmp2) sim.resetTemp() end,
  2012.    [16] = function(ctype,tmp,tmp2) sim.resetPressure() end,
  2013.    [17] = function(ctype,tmp,tmp2) tpt.reset_spark() end,
  2014.    [18] = function(ctype,tmp,tmp2)
  2015.       tmp = tmp
  2016.       if tmp==10 and tpt.version.jacob1s_mod~=nil then
  2017.          tmp=9
  2018.       elseif tmp==9 and tpt.version.jacob1s_mod~=nil then
  2019.          tmp=10
  2020.       end
  2021.       tpt.display_mode(tmp)
  2022.    end,
  2023.  
  2024.    [19] = function(ctype,tmp,tmp2) tpt.create(tmp2, tmp, ctype) end,
  2025. }
  2026.  
  2027. local invalidInput = {
  2028.    BackColor = gfx.getHexColor(100,0,0,255),
  2029.    BorderColor = gfx.getHexColor(255,0,0,255),
  2030.    TextColor = gfx.getHexColor(255,255,255,255),
  2031.    UnfocusedTextColor = gfx.getHexColor(150,150,150,255),
  2032.    PointerColor = gfx.getHexColor(255,255,255,255),
  2033.    UnfocusedBorderColor = gfx.getHexColor(200,0,0,255)
  2034. }
  2035.  
  2036. local buttonLabels  = { "Create part", "Set type", "Set temp", "Set life", "Set tmp", "Set tmp2", "Set ctype", "Other" }
  2037.  
  2038. local function cmndUpdate(i,x,y,s,n)
  2039.    local parts = sim.partNeighbours(x,y,1,tpt.el["sprk"].id)
  2040.    if parts[0]~=nil then
  2041.       for j=0,#parts do
  2042.          local sprkLife = sim.partProperty(parts[j], sim.FIELD_LIFE)
  2043.          if sprkLife==3 then
  2044.             local life=sim.partProperty(i, sim.FIELD_LIFE)
  2045.             local ctype=sim.partProperty(i, sim.FIELD_CTYPE)
  2046.             local tmp=sim.partProperty(i, sim.FIELD_TMP)
  2047.             local tmp2=sim.partProperty(i, sim.FIELD_TMP2)
  2048.             actions[life](ctype,tmp,tmp2)
  2049.             break
  2050.          end
  2051.       end
  2052.    end
  2053. end
  2054.  
  2055. local CMND = elements.allocate("SSCCSSCC", "CMND")
  2056. elements.property(CMND, "Name", "CMND")
  2057. elements.property(CMND, "MenuVisible", 0)
  2058. elements.property(CMND, "Colour", 0xFF9900)
  2059. elements.property(CMND, "Update", cmndUpdate)
  2060.  
  2061. local function createInterface(clickX, clickY)
  2062.    local selected = ""
  2063.  
  2064.    local MainWindow = interface_s.Components.Window:new(40, 40, 250, 170,true, DefaultTheme.Window)
  2065.    MainWindow.AllowResize = false
  2066.    MainWindow.OnEndDraw = function(IsFocused,mx,my)
  2067.       graphics.drawLine(MainWindow.X+70, MainWindow.Y+MainWindow.SizeOfHeader, MainWindow.X+70, MainWindow.Y+MainWindow.Height-1)
  2068.       graphics.drawLine(MainWindow.X+70, MainWindow.Y+35, MainWindow.X+MainWindow.Width-1, MainWindow.Y+35)
  2069.    end
  2070.    MainWindow.OnDraw = function()
  2071.       graphics.drawLine(clickX, clickY, MainWindow.X, MainWindow.Y)
  2072.    end
  2073.    interface_s.addComponent(MainWindow)
  2074.  
  2075.    local interface = {
  2076.       label1 = interface_s.Components.Label:new(75, 60, "", DefaultTheme.Label),
  2077.       label2 = interface_s.Components.Label:new(75, 75, "", DefaultTheme.Label),
  2078.       label3 = interface_s.Components.Label:new(75, 90, "", DefaultTheme.Label),
  2079.       labelDesc = interface_s.Components.Label:new(75, 12, "", DefaultTheme.Label),
  2080.       textbox1 = interface_s.Components.Textbox:new(125, 57, 60, 14, DefaultTheme.Textbox),
  2081.       textbox2 = interface_s.Components.Textbox:new(125, 72, 60, 14, DefaultTheme.Textbox),
  2082.       textbox3 = interface_s.Components.Textbox:new(125, 87, 60, 14, DefaultTheme.Textbox),
  2083.       checkboxCoordinate = interface_s.Components.Checkbox:new(75, 40, 14, "", DefaultTheme.Checkbox),
  2084.       comboboxOther = interface_s.Components.Combobox:new(125, 40, 120, 14, {"Set pause", "Reset temp", "Reset pressure", "Set gravity", "Reset spark", "Display mode"}, DefaultTheme.Combobox),
  2085.       comboboxOtherOption = interface_s.Components.Combobox:new(125, 57, 120, 14, {""}, DefaultTheme.Combobox),
  2086.       buttonCancel = interface_s.Components.Button:new(3, 153, 65, 14, "Cancel", DefaultTheme.Button),
  2087.       buttonOk = interface_s.Components.Button:new(73, 153, 174, 14, "Ok", DefaultTheme.Button),
  2088.       textboxTabControl = interface_s.Components.Textbox:new(0, 0, 0, 0, DefaultTheme.Textbox)
  2089.    }
  2090.  
  2091.    local function setProps(props)
  2092.       for componentName,componentV in pairs(props) do
  2093.          for propName,propV in pairs(componentV) do
  2094.             interface[componentName][propName] = propV
  2095.          end
  2096.          if componentV.IsShowing~=false then
  2097.             interface[componentName].IsShowing = true
  2098.          end
  2099.       end
  2100.    end
  2101.  
  2102.    local function isIncorrect(textbox, valueType)
  2103.       if valueType=="number" then
  2104.          if tonumber(textbox.Text) ~= nil and textbox.Text~="" then
  2105.             return 0
  2106.          else
  2107.             textbox.Theme = invalidInput
  2108.             return 1
  2109.          end
  2110.       elseif valueType=="element" then
  2111.          if tpt.el[string.lower(textbox.Text)]~=nil and textbox.Text~="" then
  2112.             return 0
  2113.          else
  2114.             textbox.Theme = invalidInput
  2115.             return 1
  2116.          end
  2117.       end
  2118.    end
  2119.  
  2120.    local function okButton_action()
  2121.       local incorrectCount = isIncorrect(interface.textbox1, "element") + isIncorrect(interface.textbox2, "number")
  2122.       if incorrectCount~=0 then
  2123.          return
  2124.       end
  2125.       local i = sim.partCreate(-1, clickX, clickY, CMND)
  2126.       local temp = data[selected]
  2127.       sim.partProperty(i, sim.FIELD_LIFE, temp.default.life)
  2128.       sim.partProperty(i, temp.default.target, tpt.el[string.lower(interface.textbox1.Text)].id)
  2129.       sim.partProperty(i, temp.default.value, tonumber(interface.textbox2.Text))
  2130.       interface_s.RemoveComponent(MainWindow)
  2131.    end
  2132.    local function okButton_action_Type()
  2133.       local incorrectCount = isIncorrect(interface.textbox1, "element") + isIncorrect(interface.textbox2, "element")
  2134.       if incorrectCount~=0 then
  2135.          return
  2136.       end
  2137.       local i = sim.partCreate(-1, clickX, clickY, CMND)
  2138.       local temp = data[selected]
  2139.       sim.partProperty(i, sim.FIELD_LIFE, temp.default.life)
  2140.       sim.partProperty(i, temp.default.target, tpt.el[string.lower(interface.textbox1.Text)].id)
  2141.       sim.partProperty(i, temp.default.value, tpt.el[string.lower(interface.textbox2.Text)].id)
  2142.       interface_s.RemoveComponent(MainWindow)
  2143.    end
  2144.    local function okButton_action_XY()
  2145.       local incorrectCount = isIncorrect(interface.textbox1, "number") + isIncorrect(interface.textbox2, "number") + isIncorrect(interface.textbox3, "number")
  2146.       if incorrectCount~=0 then
  2147.          return
  2148.       end
  2149.       local i = sim.partCreate(-1, clickX, clickY, CMND)
  2150.       local temp = data[selected]
  2151.       sim.partProperty(i, sim.FIELD_LIFE, temp.useCoord.life)
  2152.       sim.partProperty(i, temp.useCoord.value, tonumber(interface.textbox3.Text))
  2153.       sim.partProperty(i, temp.useCoord.x, tonumber(interface.textbox1.Text))
  2154.       sim.partProperty(i, temp.useCoord.y, tonumber(interface.textbox2.Text))
  2155.       interface_s.RemoveComponent(MainWindow)
  2156.    end
  2157.    local function okButton_action_XY_Type()
  2158.       local incorrectCount = isIncorrect(interface.textbox1, "number") + isIncorrect(interface.textbox2, "number") + isIncorrect(interface.textbox3, "element")
  2159.       if incorrectCount~=0 then
  2160.          return
  2161.       end
  2162.       local i = sim.partCreate(-1, clickX, clickY, CMND)
  2163.       local temp = data[selected]
  2164.       sim.partProperty(i, sim.FIELD_LIFE, temp.useCoord.life)
  2165.       sim.partProperty(i, temp.useCoord.value, tpt.el[string.lower(interface.textbox3.Text)].id)
  2166.       sim.partProperty(i, temp.useCoord.x, tonumber(interface.textbox1.Text))
  2167.       sim.partProperty(i, temp.useCoord.y, tonumber(interface.textbox2.Text))
  2168.       interface_s.RemoveComponent(MainWindow)
  2169.    end
  2170.    local function okButton_action_Other()
  2171.       local i = sim.partCreate(-1, clickX, clickY, CMND)
  2172.       local temp = data[selected][interface.comboboxOther.Items[interface.comboboxOther.SelectedIndex]]
  2173.       sim.partProperty(i, sim.FIELD_LIFE, temp.default.life)
  2174.       if temp.default.value ~= nil then
  2175.          sim.partProperty(i, temp.default.value, interface.comboboxOtherOption.SelectedIndex-1)
  2176.       end
  2177.       interface_s.RemoveComponent(MainWindow)
  2178.    end
  2179.    
  2180.    local reset = {
  2181.       checkboxCoordinate = { IsShowing = false },
  2182.       labelDesc = { IsShowing = false },
  2183.       label1 = { IsShowing = false, X=75, Y=60 },
  2184.       label2 = { IsShowing = false, X=75, Y=75 },
  2185.       label3 = { IsShowing = false, X=75, Y=90 },
  2186.       textbox1 = { IsShowing = false, Text = "", PointerIndex=0, X=125, Y=57 },
  2187.       textbox2 = { IsShowing = false, Text = "", PointerIndex=0, X=125, Y=72 },
  2188.       textbox3 = { IsShowing = false, Text = "", PointerIndex=0, X=125, Y=87 },
  2189.       comboboxOther = {IsShowing = false},
  2190.       comboboxOtherOption = {IsShowing = false}
  2191.    }
  2192.    local function updateInterface()
  2193.       setProps(reset)
  2194.       if selected == "Set type" then
  2195.          setProps({
  2196.             labelDesc = { Text = "Replace element 1 to\nelement 2 or replace by coordinate" },
  2197.             checkboxCoordinate = { Text = "Replace by coordinate" }
  2198.          })
  2199.          if interface.checkboxCoordinate.Checked then
  2200.             setProps({
  2201.                label1 = { Text = "X:" },
  2202.                label2 = { Text = "Y:" },
  2203.                label3 = { Text = "Element:" },
  2204.                textbox1 = { MaxTextLength=3 },
  2205.                textbox2 = { MaxTextLength=3 },
  2206.                textbox3 = { MaxTextLength=4 },
  2207.                buttonOk = { OnPressed = okButton_action_XY_Type }
  2208.             })
  2209.          else
  2210.             setProps({
  2211.                label1 = { Text = "Element 1:" },
  2212.                label2 = { Text = "Element 2:" },
  2213.                textbox1 = { MaxTextLength=4 },
  2214.                textbox2 = { MaxTextLength=4 },
  2215.                buttonOk = { OnPressed = okButton_action_Type }
  2216.             })
  2217.          end
  2218.       elseif selected == "Set temp" then
  2219.          setProps({
  2220.             labelDesc = { Text = "Set temp of the element\nor set temp by coordinate" },
  2221.             checkboxCoordinate = { Text = "Set temp by coordinate" }
  2222.          })
  2223.          if interface.checkboxCoordinate.Checked then
  2224.             setProps({
  2225.                label1 = { Text = "X:" },
  2226.                label2 = { Text = "Y:" },
  2227.                label3 = { Text = "Temp:" },
  2228.                textbox1 = { MaxTextLength=3 },
  2229.                textbox2 = { MaxTextLength=3 },
  2230.                textbox3 = { MaxTextLength=7 },
  2231.                buttonOk = { OnPressed = okButton_action_XY }
  2232.             })
  2233.          else
  2234.             setProps({
  2235.                label1 = { Text = "Element:" },
  2236.                label2 = { Text = "Temp:" },
  2237.                textbox1 = { MaxTextLength=4 },
  2238.                textbox2 = { MaxTextLength=7 },
  2239.                buttonOk = { OnPressed = okButton_action }
  2240.             })
  2241.          end
  2242.       elseif selected == "Set life" then
  2243.          setProps({
  2244.             labelDesc = { Text = "Set life of the element\nor set life by coordinate" },
  2245.             checkboxCoordinate = { Text = "Set life by coordinate" }
  2246.          })
  2247.          if interface.checkboxCoordinate.Checked then
  2248.             setProps({
  2249.                label1 = { Text = "X:" },
  2250.                label2 = { Text = "Y:" },
  2251.                label3 = { Text = "Life:" },
  2252.                textbox1 = { MaxTextLength=3 },
  2253.                textbox2 = { MaxTextLength=3 },
  2254.                textbox3 = { MaxTextLength=8 },
  2255.                buttonOk = { OnPressed = okButton_action_XY }
  2256.             })
  2257.          else
  2258.             setProps({
  2259.                label1 = { Text = "Element:" },
  2260.                label2 = { Text = "Life:" },
  2261.                textbox1 = { MaxTextLength=4 },
  2262.                textbox2 = { MaxTextLength=8 },
  2263.                buttonOk = { OnPressed = okButton_action }
  2264.             })
  2265.          end
  2266.       elseif selected == "Set tmp" then
  2267.          setProps({
  2268.             labelDesc = { Text = "Set tmp of the element\nor set tmp by coordinate" },
  2269.             checkboxCoordinate = { Text = "Set tmp by coordinate" }
  2270.          })
  2271.          if interface.checkboxCoordinate.Checked then
  2272.             setProps({
  2273.                label1 = { Text = "X:" },
  2274.                label2 = { Text = "Y:" },
  2275.                label3 = { Text = "Tmp:" },
  2276.                textbox1 = { MaxTextLength=3 },
  2277.                textbox2 = { MaxTextLength=3 },
  2278.                textbox3 = { MaxTextLength=8 },
  2279.                buttonOk = { OnPressed = okButton_action_XY }
  2280.             })
  2281.          else
  2282.             setProps({
  2283.                label1 = { Text = "Element:" },
  2284.                label2 = { Text = "Tmp:" },
  2285.                textbox1 = { MaxTextLength=4 },
  2286.                textbox2 = { MaxTextLength=8 },
  2287.                buttonOk = { OnPressed = okButton_action }
  2288.             })
  2289.          end
  2290.       elseif selected == "Set tmp2" then
  2291.          setProps({
  2292.             labelDesc = { Text = "Set tmp2 of the element\nor set tmp2 by coordinate" },
  2293.             checkboxCoordinate = { Text = "Set tmp2 by coordinate" }
  2294.          })
  2295.          if interface.checkboxCoordinate.Checked then
  2296.             setProps({
  2297.                label1 = { Text = "X:" },
  2298.                label2 = { Text = "Y:" },
  2299.                label3 = { Text = "Tmp2:" },
  2300.                textbox1 = { MaxTextLength=3 },
  2301.                textbox2 = { MaxTextLength=3 },
  2302.                textbox3 = { MaxTextLength=8 },
  2303.                buttonOk = { OnPressed = okButton_action_XY }
  2304.             })
  2305.          else
  2306.             setProps({
  2307.                label1 = { Text = "Element:" },
  2308.                label2 = { Text = "Tmp2:" },
  2309.                textbox1 = { MaxTextLength=4 },
  2310.                textbox2 = { MaxTextLength=8 },
  2311.                buttonOk = { OnPressed = okButton_action }
  2312.             })
  2313.          end
  2314.       elseif selected == "Set ctype" then
  2315.          setProps({
  2316.             labelDesc = { Text = "Set ctype of the element\nor set ctype by coordinate" },
  2317.             checkboxCoordinate = { Text = "Set ctype by coordinate" }
  2318.          })
  2319.          if interface.checkboxCoordinate.Checked then
  2320.             setProps({
  2321.                label1 = { Text = "X:" },
  2322.                label2 = { Text = "Y:" },
  2323.                label3 = { Text = "Ctype:" },
  2324.                textbox1 = { MaxTextLength=3 },
  2325.                textbox2 = { MaxTextLength=3 },
  2326.                textbox3 = { MaxTextLength=4 },
  2327.                buttonOk = { OnPressed = okButton_action_XY_Type }
  2328.             })
  2329.          else
  2330.             setProps({
  2331.                label1 = { Text = "Element:" },
  2332.                label2 = { Text = "Ctype:" },
  2333.                textbox1 = { MaxTextLength=4 },
  2334.                textbox2 = { MaxTextLength=4 },
  2335.                buttonOk = { OnPressed = okButton_action_Type }
  2336.             })
  2337.          end
  2338.       elseif selected == "Create part" then
  2339.          setProps({
  2340.             labelDesc = { Text = "Create pixel at specified location" },
  2341.             label1 = { Text = "X:", X=75, Y=43 },
  2342.             label2 = { Text = "Y:", X=75, Y=58 },
  2343.             label3 = { Text = "Type:", X=75, Y=73 },
  2344.             textbox1 = { MaxTextLength=3, X=125, Y=40 },
  2345.             textbox2 = { MaxTextLength=3, X=125, Y=55 },
  2346.             textbox3 = { MaxTextLength=4, X=125, Y=70 },
  2347.             buttonOk = { OnPressed = okButton_action_XY_Type }
  2348.          })
  2349.       elseif selected == "Other" then
  2350.          setProps({
  2351.             labelDesc = { Text = "Other options" },
  2352.             label2 = { Text = "Options: ", X=75, Y=43},
  2353.             comboboxOther = {},
  2354.             buttonOk = { OnPressed = okButton_action_Other }
  2355.          })
  2356.          if interface.comboboxOther.Items[interface.comboboxOther.SelectedIndex] == "Display mode" then
  2357.             setProps({
  2358.                comboboxOtherOption = { Items = {"Velocity","Pressure","Persistent","Fire","Blob","Heat","Fancy","Nothing","Heat Gradient","Life Gradient","Alternative Velocity"}, SelectedIndex=1},
  2359.                label1 = { Text = "Display:" }
  2360.             })
  2361.          elseif interface.comboboxOther.Items[interface.comboboxOther.SelectedIndex] == "Set gravity" then
  2362.             setProps({
  2363.                comboboxOtherOption = { Items = {"Vertical","No gravity","Radial"}, SelectedIndex=1},
  2364.                label1 = { Text = "Gravity:" }
  2365.             })
  2366.          end
  2367.       end
  2368.    end
  2369.  
  2370.    local buttons = {}
  2371.  
  2372.    for k,v in pairs(interface) do
  2373.       MainWindow:AddComponent(v)
  2374.    end
  2375.  
  2376.    local function enableAllButtons()
  2377.       for i=1,#buttons do
  2378.          buttons[i].Enabled = true
  2379.       end
  2380.    end
  2381.  
  2382.    interface.comboboxOther.OnItemSelected = updateInterface
  2383.    interface.checkboxCoordinate.OnStateChanged = updateInterface
  2384.  
  2385.    interface.buttonCancel.OnPressed = function() interface_s.RemoveComponent(MainWindow) end
  2386.  
  2387.    interface.textbox1.OnTextChanged = function() interface.textbox1.Theme = DefaultTheme.Textbox end
  2388.    interface.textbox2.OnTextChanged = function() interface.textbox2.Theme = DefaultTheme.Textbox end
  2389.    interface.textbox3.OnTextChanged = function() interface.textbox3.Theme = DefaultTheme.Textbox end
  2390.  
  2391.    interface.textboxTabControl.KeyPress = function(_, key, scan, rep, shift, ctrl, alt, evnt)
  2392.       if key==9 and evnt == interface_s.keyEvents.keyPress then
  2393.          if interface.textbox1.IsActive then
  2394.             interface.textbox1.IsActive = false
  2395.             interface.textbox2.IsActive = true
  2396.          elseif interface.textbox2.IsActive then
  2397.             interface.textbox2.IsActive = false
  2398.             if interface.textbox3.IsShowing then
  2399.                interface.textbox3.IsActive = true
  2400.             else
  2401.                interface.textbox1.IsActive = true
  2402.             end
  2403.          elseif interface.textbox3.IsActive then
  2404.             interface.textbox3.IsActive = false
  2405.             interface.textbox1.IsActive = true
  2406.          end
  2407.       end
  2408.       return false
  2409.    end
  2410.  
  2411.    for i=1,#buttonLabels do
  2412.       local Button = interface_s.Components.Button:new(3, 2+(i-1)*16+MainWindow.SizeOfHeader, 70-5, 14, buttonLabels[i], DefaultTheme.Button)
  2413.       buttons[i] = Button
  2414.       Button.OnPressed = function()
  2415.          enableAllButtons()
  2416.          buttons[i].Enabled = false
  2417.          selected = buttonLabels[i]
  2418.          updateInterface()
  2419.       end
  2420.       MainWindow:AddComponent(Button)
  2421.    end
  2422.    buttons[1].OnPressed()
  2423. end
  2424.  
  2425. local setupTool = interface_s.ToolsAPI.AddNewTool("CMND2",11,0x00FFFF,"SSCCSSCC","CMDS","Simple command block setup tool")
  2426. setupTool.OnClick = function(x,y)
  2427.    x,y=sim.adjustCoords(x,y)
  2428.    if sim.partID(x,y)==nil then
  2429.       createInterface(x,y)
  2430.    end
  2431. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement