Advertisement
ssccsscc

TPT Ruler (Full)

Feb 2nd, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 66.57 KB | None | 0 0
  1. ------------------- Configuration -------------------
  2. local rquiredAPIVersion = 2.42
  3.  
  4. local RulerColor = graphics.getHexColor(255,255,45,200)
  5. -----------------------------------------------------
  6. local mouseEvents = {
  7.   Down = 1,
  8.   Up = 2
  9. }
  10. ------------------- Configuration -------------------
  11. local InterfaceAPIVersion = 2.42
  12. -----------------------------------------------------
  13. local mouseEvents = {
  14.   Down = 1,
  15.   Up = 2
  16. }
  17. local function DefineInterfaceComponents()
  18.   function interface_s.Components.Window:new(x, y, Width, Height, Movable, theme)
  19.     local obj= {}
  20.     obj.Type = "Window"
  21.  
  22.     obj.AllowResize = true
  23.     obj.AlwaysFocused = false
  24.     obj.IsMovable = Movable
  25.     obj.MinWidth = 16
  26.     obj.MinHeight = 16
  27.     obj.Theme = theme
  28.     obj.X = x
  29.     obj.Y = y
  30.     obj.Width = Width
  31.     obj.Height = Height
  32.  
  33.     obj.OnShow = nil
  34.     obj.OnHide = nil
  35.     obj.OnDraw = nil
  36.     obj.OnEndDraw = nil
  37.     obj.OnMove = nil
  38.     obj.OnClick = nil
  39.  
  40.     obj.Focused=false
  41.     obj.Items = {}
  42.     obj.MoveStartX = -1
  43.     obj.MoveStartY = -1
  44.     obj.IsMoving = false
  45.     obj.IsShowing = true
  46.     obj.IsResizing = false
  47.     obj.ResizeStartX = 1
  48.     obj.ResizeStartY = 1
  49.     obj.ResizeStartWidth = 1
  50.     obj.ResizeStartHeight = 1
  51.     obj.ResizeLastWidth =0
  52.     obj.ResizeLastHeight=0  
  53.     obj.SizeOfHeader = 8  
  54.     function obj:Draw(IsFocused,mx,my)
  55.       self.Focused=IsFocused or self.AlwaysFocused
  56.       if self.OnDraw ~= nil then
  57.         if self.OnDraw(IsFocused,mx,my) == true then
  58.           return
  59.         end
  60.       end
  61.       if self.Focused == true then
  62.         gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.BackColor))
  63.         gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.BorderColor))
  64.         if self.IsMovable then
  65.           gfx.fillRect(self.X, self.Y, self.Width,self.SizeOfHeader, gfx.getColors(self.Theme.HeaderColor))
  66.         end
  67.         if self.AllowResize==true then
  68.           gfx.fillRect(self.X+self.Width-6, self.Y+self.Height-6, 6,6, gfx.getColors(self.Theme.BorderColor))
  69.         end
  70.       else
  71.         gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBackColor))
  72.         gfx.drawRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBorderColor))
  73.         if self.AllowResize==true then
  74.           gfx.fillRect(self.X+self.Width-6, self.Y+self.Height-6, 6,6, gfx.getColors(self.Theme.UnfocusedBorderColor))
  75.         end
  76.         if self.IsMovable then
  77.           gfx.fillRect(self.X, self.Y, self.Width,self.SizeOfHeader, gfx.getColors(self.Theme.UnfocusedHeaderColor))
  78.         end
  79.       end
  80.       for i=#self.Items,0,-1 do
  81.         if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) then
  82.           self.Items[i]:Draw(self.Focused,self.X,self.Y,mx-self.X,my-self.Y)
  83.         end
  84.       end
  85.       if self.OnEndDraw ~= nil then
  86.         if self.OnEndDraw(IsFocused,mx,my) == true then
  87.           return
  88.         end
  89.       end
  90.     end
  91.     function obj:Show()
  92.       self.IsShowing = true
  93.       if self.OnShow ~= nil then
  94.          self.OnShow(self)
  95.       end
  96.     end
  97.     function obj:Hide()
  98.       self.IsShowing = false
  99.       if self.OnHide ~= nil then
  100.          self.OnHide(self)
  101.       end
  102.     end
  103.     function obj:Resize(ws,hs)
  104.       if ws < self.MinWidth then
  105.         ws=self.MinWidth
  106.       end
  107.       if hs < self.MinHeight then
  108.         hs=self.MinHeight
  109.       end
  110.       self.ResizeLastHeight = self.Height
  111.       self.ResizeLastWidth = self.Width
  112.       self.Height = hs
  113.       self.Width = ws
  114.       hs = self.Height-self.ResizeLastHeight
  115.       ws = self.Width-self.ResizeLastWidth
  116.       for i=0,#self.Items do
  117.         if self.Items[i]~=nil then
  118.           if self.Items[i].Anchor.Top==true and self.Items[i].Anchor.Bottom==true then
  119.             self.Items[i].Height = self.Items[i].Height + hs
  120.           end
  121.           if self.Items[i].Anchor.Top==false and self.Items[i].Anchor.Bottom==true then
  122.             self.Items[i].Y = self.Items[i].Y + hs
  123.           end
  124.           if self.Items[i].Anchor.Left==true and self.Items[i].Anchor.Right==true then
  125.             self.Items[i].Width = self.Items[i].Width + ws
  126.           end
  127.           if self.Items[i].Anchor.Left==false and self.Items[i].Anchor.Right==true then
  128.             self.Items[i].X = self.Items[i].X + ws
  129.           end
  130.         end
  131.       end
  132.     end
  133.     function obj:AddComponent(component)
  134.       self.Items[#self.Items+1] = component
  135.       component.Base = self
  136.     end
  137.     function obj:GetComponentIndex(obj2)
  138.       for i=0, #self.Items do
  139.         if self.Items[i] == obj2 then
  140.           return i
  141.         end
  142.       end
  143.       return -1
  144.     end
  145.     function obj:focusComponent(obj2)
  146.       local index = self:GetComponentIndex(obj2)
  147.       for i=index, 1,-1 do
  148.         self.Items[i] = self.Items[i-1]
  149.       end
  150.       self.Items[0] = obj2
  151.     end
  152.     function obj:KeyPress(key, scan, r, ctrl, shift, alt)
  153.       for i=0,#self.Items do
  154.         if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) and (self.Items[i].KeyPress~=nil) then
  155.           if self.Items[i]:KeyPress(key, scan, r, ctrl, shift, alt) then
  156.             return true
  157.           end
  158.         end
  159.       end
  160.     end
  161.     function obj:Click(x,y,e,b,w)
  162.       if self.OnClick~=nil then
  163.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  164.         if x==nil then
  165.           return
  166.         end
  167.       end
  168.       if (self.IsMovable) and (e==mouseEvents.Up) and (self.IsMoving) then
  169.         self.IsMoving = false
  170.       end
  171.       if self.IsResizing== false then
  172.         for i=0,#self.Items do
  173.           if (self.Items[i]~=nil) and (self.Items[i].IsShowing==true) then
  174.             if self.Items[i]:Click(x-self.X,y-self.Y,e,b,w) then
  175.               return true
  176.             end
  177.           end
  178.         end
  179.       end
  180.       if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  181.         if self.Focused then
  182.           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
  183.             self.IsResizing=true
  184.             self.ResizeStartX = x
  185.             self.ResizeStartY = y
  186.             self.ResizeStartWidth = self.Width
  187.             self.ResizeStartHeight = self.Height
  188.             return true
  189.           end
  190.           if (self.IsMovable) and (y>self.Y) and (y<self.Y+self.SizeOfHeader) and (e==mouseEvents.Down) then
  191.             self.MoveStartX = x - self.X
  192.             self.MoveStartY = y - self.Y
  193.             self.IsMoving = true
  194.           end
  195.           if self.IsResizing==false then
  196.             return true
  197.           end
  198.         else
  199.           if e==mouseEvents.Down then
  200.             return true
  201.           end
  202.         end
  203.       else
  204.         if IsResizing==false then
  205.           return false
  206.         end
  207.       end
  208.  
  209.       if self.IsResizing==true and e==mouseEvents.Up then
  210.         self.IsResizing = false
  211.         return true
  212.       end
  213.  
  214.     end
  215.     function obj:Move(x,y,dx,dy)
  216.       if (self.IsMovable) and (self.IsMoving) then
  217.         self.X = x-self.MoveStartX
  218.         self.Y = y-self.MoveStartY
  219.         if self.OnMove~=nil then
  220.           self.OnMove(self.X,self.Y)
  221.         end
  222.       else
  223.         if self.IsResizing==true then
  224.           self:Resize(self.ResizeStartWidth-self.ResizeStartX+x,self.ResizeStartHeight-self.ResizeStartY+y)
  225.           return true
  226.         end
  227.       end
  228.     end
  229.     setmetatable(obj, self)
  230.     self.__index = self;
  231.     return obj
  232.   end
  233.   function interface_s.Components.Button:new(x, y, Width, Height, text, theme)
  234.     local obj= {}
  235.     obj.Type = "Button"
  236.  
  237.     obj.X = x
  238.     obj.Y = y
  239.     obj.Width = Width
  240.     obj.Height = Height
  241.     obj.Theme = theme
  242.     obj.IsShowing = true
  243.     obj.Text = text
  244.     obj.Enabled = true
  245.     obj.HintText = ""
  246.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  247.  
  248.     obj.OnPressed = nil
  249.     obj.OnDraw = nil
  250.     obj.OnEndDraw = nil
  251.     obj.OnClick = nil
  252.    
  253.     obj.Base = nil
  254.     obj.Focused=false
  255.     obj.ClickHelper = interface_s.ComponentsHelpers.Click:new()
  256.     obj.HintHelper = nil
  257.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  258.       if not self.IsShowing then return end
  259.       self.Focused=IsFocused
  260.       if self.OnDraw ~= nil then
  261.         if self.OnDraw(IsFocused,self.X+baseX,self.Y+baseY,x,y) == true then
  262.           return
  263.         end
  264.       end
  265.       local tw, th = gfx.textSize(self.Text)
  266.       if IsFocused == true and self.Enabled then
  267.         if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  268.           if self.ClickHelper.IsFirstClick then
  269.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.PressedBackColor))
  270.             gfx.drawText(self.X+baseX+(self.Width-tw)/2, self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.PressedTextColor))
  271.           else
  272.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.MouseOverColor))
  273.             gfx.drawText(self.X+baseX+(self.Width-tw)/2, self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.TextColor))
  274.             if self.HintHelper~=nil then
  275.               self.HintHelper:MouseOver(x+baseX,y+baseY,self.HintText)
  276.             end
  277.           end
  278.         else
  279.           if self.HintHelper~=nil then
  280.             self.HintHelper:Reset()
  281.           end
  282.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.BackColor))
  283.           gfx.drawText(self.X+baseX+(self.Width-tw)/2, self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.TextColor))
  284.         end
  285.         gfx.drawRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.BorderColor))
  286.       else
  287.         if self.HintHelper~=nil then
  288.           self.HintHelper:Reset()
  289.         end
  290.         if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  291.           if self.ClickHelper.IsFirstClick then
  292.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.PressedBackColor))
  293.             gfx.drawText(self.X+baseX+(self.Width-tw)/2, self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.PressedTextColor))
  294.           else
  295.             gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedMouseOverColor))
  296.             gfx.drawText(self.X+baseX+(self.Width-tw)/2, self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.UnfocusedTextColor))
  297.           end
  298.         else
  299.           gfx.fillRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBackColor))
  300.           gfx.drawText(self.X+baseX+(self.Width-tw)/2, self.Y+baseY + (self.Height-th)/2+1, self.Text, gfx.getColors(self.Theme.UnfocusedTextColor))
  301.         end
  302.         gfx.drawRect(self.X+baseX, self.Y+baseY, self.Width,self.Height, gfx.getColors(self.Theme.UnfocusedBorderColor))
  303.       end
  304.       if self.OnEndDraw ~= nil then
  305.         if self.OnEndDraw(IsFocused,self.X+baseX,self.Y+baseY,x,y) == true then
  306.           return
  307.         end
  308.       end
  309.     end
  310.     function obj:Show()
  311.       self.IsShowing = true
  312.     end
  313.     function obj:Hide()
  314.       self.IsShowing = false
  315.     end
  316.     function obj:Click(x,y,e,b,w)
  317.       if self.OnClick~=nil then
  318.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  319.         if x==nil then
  320.           return
  321.         end
  322.       end
  323.       if self.Enabled then
  324.         self.ClickHelper.OnPress = self.OnPressed
  325.         self.ClickHelper:ProcessClick(self.Width,self.Height,self.X,self.Y,x,y,e,b)
  326.       end
  327.     end
  328.     function obj:AddHint(text)
  329.       self.HintText = text
  330.       self.HintHelper = interface_s.ComponentsHelpers.Hint:new()
  331.     end
  332.     setmetatable(obj, self)
  333.     self.__index = self;
  334.     return obj
  335.   end
  336.  
  337.   function interface_s.Components.Combobox:new(x, y,w,h,i, theme)
  338.     local obj= {}
  339.     obj.Type = "Combobox"
  340.  
  341.     obj.X = x
  342.     obj.Y = y
  343.  
  344.     obj.Theme = theme
  345.     obj.IsShowing = true
  346.     obj.Width = w
  347.     obj.Height = h
  348.     obj.Enabled = true
  349.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  350.     obj.Items = i
  351.     obj.IsItemsShown = false
  352.    
  353.     obj.SelectedIndex=0
  354.     obj.OnItemSelected = nil
  355.     obj.OnClick = nil
  356.  
  357.     obj.Base = nil
  358.     obj.Focused=false
  359.     obj.DropClickHelper = interface_s.ComponentsHelpers.Click:new()
  360.       obj.DropClickHelper.OnPress = function()
  361.           if obj.IsItemsShown==false then
  362.             obj.Base:focusComponent(obj)
  363.             obj.IsItemsShown = true
  364.           end
  365.         end
  366.     obj.ItemClickHelper = interface_s.ComponentsHelpers.Click:new()
  367.       obj.ItemClickHelper.OnFirstClick = function() return true end
  368.       obj.ItemClickHelper.OnPress = function(x,y)
  369.           local i = y-obj.Y-obj.Height
  370.           obj.SelectedIndex=math.floor(i/14)
  371.           if obj.OnItemSelected~= nil then
  372.             obj.OnItemSelected(obj.SelectedIndex,obj.Items[obj.SelectedIndex+1])
  373.           end
  374.           obj.IsItemsShown = false
  375.           interface_s.RemoveOnClickAction(obj)
  376.           return true
  377.         end
  378.       obj.ItemClickHelper.OnMissClick = function(x,y)
  379.         obj.IsItemsShown = false
  380.         interface_s.RemoveOnClickAction(obj)
  381.         return true
  382.       end
  383.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  384.       if not self.IsShowing then return end
  385.       self.Focused = IsFocused
  386.       if IsFocused and self.Enabled then
  387.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  388.         if self.SelectedIndex>=0 then
  389.           gfx.drawText(self.X+baseX+5,self.Y+baseY+3, self.Items[self.SelectedIndex+1], gfx.getColors(self.Theme.TextColor))
  390.         end
  391.         if self.IsItemsShown==true then
  392.           gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.ButtonPressedBackColor))
  393.         else
  394.           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
  395.             gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.ButtonMouseOverBackColor))
  396.           else
  397.             gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.ButtonBackColor))
  398.           end
  399.         end
  400.         gfx.drawRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.BorderColor))
  401.         if self.IsItemsShown==true then
  402.           gfx.fillRect(self.X+baseX,self.Y+baseY+self. Height,self.Width,#self.Items*14,gfx.getColors(self.Theme.BackColor))
  403.           for i=0,#self.Items-1 do
  404.             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
  405.               gfx.fillRect(self.X+baseX,self.Y+baseY+i*14+self.Height,self.Width,14+1,gfx.getColors(self.Theme.ButtonMouseOverBackColor))
  406.             end
  407.             gfx.drawRect(self.X+baseX,self.Y+baseY+i*14+self.Height,self.Width,14+1,gfx.getColors(self.Theme.BorderColor))
  408.             gfx.drawText(self.X+baseX+5,self.Y+baseY+i*14+3+self.Height, self.Items[i+1],gfx.getColors(self.Theme.TextColor))
  409.           end
  410.         end
  411.       else
  412.         obj.IsItemsShown = false
  413.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBorderColor))
  414.         if self.SelectedIndex>=0 then
  415.           gfx.drawText(self.X+baseX+5,self.Y+baseY+3, self.Items[self.SelectedIndex+1],gfx.getColors(self.Theme.UnfocusedTextColor))
  416.         end
  417.         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
  418.           gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.UnfocusedButtonMouseOverBackColor))
  419.         else
  420.           gfx.fillRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height,gfx.getColors(self.Theme.UnfocusedButtonBackColor))
  421.         end
  422.         gfx.drawRect(self.X+self.Width-self.Height+baseX, self.Y+baseY, self.Height,self.Height, gfx.getColors(self.Theme.UnfocusedBorderColor))
  423.       end
  424.     end
  425.     function obj:Show()
  426.       self.IsShowing = true
  427.     end
  428.     function obj:Hide()
  429.       self.IsShowing = false
  430.     end
  431.     function obj:Click(x,y,e,b,w)
  432.       if self.OnClick~=nil then
  433.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  434.         if x==nil then
  435.           return
  436.         end
  437.       end
  438.       if self.Enabled then
  439.         if self.IsItemsShown==true then
  440.           return self.ItemClickHelper:ProcessClick(self.Width,#self.Items*14,self.X,self.Y+self.Height,x,y,e,b)
  441.         end
  442.         return self.DropClickHelper:ProcessClick(self.Height,self.Height,self.X+self.Width-self.Height,self.Y,x,y,e,b)
  443.       end
  444.     end
  445.     setmetatable(obj, self)
  446.     self.__index = self;
  447.     return obj
  448.   end
  449.  
  450.   function interface_s.Components.Graph:new(x, y,w,h, theme)
  451.     local obj= {}
  452.     obj.Type = "Graph"
  453.  
  454.     obj.X = x
  455.     obj.Y = y
  456.     obj.Theme = theme
  457.     obj.IsShowing = true
  458.     obj.Width = w
  459.     obj.Height = h
  460.     obj.UpdateSpeed = 20
  461.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  462.  
  463.     obj.GetValue = nil
  464.     obj.OnClick = nil
  465.  
  466.     obj.Focused=false
  467.     obj.ZeroHeight = 0
  468.     obj.MaxValue = 0
  469.     obj.NewMaxValue = 0
  470.     obj.MinValue = 0
  471.     obj.NewMinValue = 0
  472.     obj.UpdateCounter = 0
  473.     obj.PointX = {}
  474.     obj.PointY = {}
  475.     obj.Base = nil
  476.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  477.       if not self.IsShowing then return end
  478.       if self.UpdateCounter>self.UpdateSpeed then
  479.         if self.GetValue ~= nil then
  480.           self:AddPoint(self.GetValue())
  481.         end
  482.         self.UpdateCounter=0
  483.       end
  484.       self.UpdateCounter=self.UpdateCounter+1
  485.       self.Focused = IsFocused
  486.       if IsFocused==true then
  487.         gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BackColor))
  488.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  489.         gfx.drawText(self.X+baseX,self.Y+baseY-10,"Max: "..self.MaxValue,gfx.getColors(self.Theme.TextColor))
  490.         gfx.drawText(self.X+baseX+100,self.Y+baseY-10,"Min: "..self.MinValue,gfx.getColors(self.Theme.TextColor))
  491.       else
  492.         gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBackColor))
  493.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBorderColor))
  494.         gfx.drawText(self.X+baseX,self.Y+baseY-10,"Max: "..self.MaxValue,gfx.getColors(self.Theme.UnfocusedTextColor))
  495.         gfx.drawText(self.X+baseX+100,self.Y+baseY-10,"Min: "..self.MinValue,gfx.getColors(self.Theme.UnfocusedTextColor))
  496.       end
  497.       self.NewMaxValue = 0
  498.       self.NewMinValue = 0
  499.       if self.PointX[#self.PointX] ~= nil then
  500.         local v = self.PointX[#self.PointX]-self.Width+1
  501.         if v>0 then
  502.           for i=v,#self.PointY do
  503.             self.PointY[i-v]=self.PointY[i]
  504.             self.PointX[i-v]=self.PointX[i]-v
  505.           end
  506.           for i=#self.PointY-v,#self.PointY do
  507.             self.PointY[i]=nil
  508.             self.PointX[i]=nil
  509.           end
  510.         end
  511.       end
  512.       for i=2, #self.PointX do
  513.         if self.PointX[i]<self.Width-1 then
  514.           if self.NewMaxValue < self.PointY[i] then
  515.             self.NewMaxValue = self.PointY[i]
  516.           else
  517.             if self.NewMinValue>self.PointY[i] then
  518.               self.NewMinValue = self.PointY[i]
  519.             end
  520.           end
  521.           if self.MaxValue < self.PointY[i] then
  522.             self.MaxValue = self.PointY[i]
  523.           else
  524.             if self.MinValue>self.PointY[i] then
  525.               self.MinValue = self.PointY[i]
  526.             end
  527.           end
  528.           local x1 = self.PointX[i]+self.X+baseX
  529.           local y1 = (self.Height-((self.PointY[i]+math.abs( self.MinValue ))/(self.MaxValue+math.abs( self.MinValue )))*(self.Height-3))+self.Y+baseY-2
  530.           local x2 = self.PointX[i-1]+self.X+baseX
  531.           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
  532.           if y1==y1 and y2==y2 then
  533.             if IsFocused==true then    
  534.               gfx.drawLine(x1,y1,x2,y2,gfx.getColors(self.Theme.GraphColor))
  535.             else
  536.               gfx.drawLine(x1,y1,x2,y2,gfx.getColors(self.Theme.UnfocusedGraphColor))
  537.             end
  538.           end
  539.         end
  540.       end
  541.       if self.PointY[1]~=nil then
  542.         if self.NewMaxValue < self.PointY[1] then
  543.           self.NewMaxValue = self.PointY[1]
  544.         else
  545.           if self.NewMinValue>self.PointY[1] then
  546.             self.NewMinValue = self.PointY[1]
  547.           end
  548.         end
  549.         if self.MaxValue < self.PointY[1] then
  550.           self.MaxValue = self.PointY[1]
  551.         else
  552.           if self.MinValue>self.PointY[1] then
  553.             self.MinValue = self.PointY[1]
  554.           end
  555.         end
  556.         self.ZeroHeight = (self.Height-((math.abs( self.MinValue ))/(self.MaxValue+math.abs( self.MinValue )))*(self.Height-3))+self.Y+baseY-2
  557.         if self.ZeroHeight == self.ZeroHeight then
  558.           if IsFocused== true then
  559.             gfx.drawLine(self.X+baseX,self.ZeroHeight,self.X+baseX+self.Width-1,self.ZeroHeight,gfx.getColors(self.Theme.ZeroLine))
  560.           else
  561.             gfx.drawLine(self.X+baseX,self.ZeroHeight,self.X+baseX+self.Width-1,self.ZeroHeight,gfx.getColors(self.Theme.UnfocusedZeroLine))
  562.           end
  563.         end
  564.       end
  565.       self.MaxValue = self.NewMaxValue
  566.       self.MinValue = self.NewMinValue
  567.     end
  568.     function obj:Show()
  569.       self.IsShowing = true
  570.     end
  571.     function obj:Hide()
  572.       self.IsShowing = false
  573.     end
  574.     function obj:AddPoint(v)
  575.       if v~= nil then
  576.       if #self.PointY==0 then
  577.         self.PointY[1]=v
  578.         self.PointX[1]=1
  579.       else
  580.         if #self.PointY+1 < self.Width-1 then
  581.         self.PointY[#self.PointY+1]=v
  582.         self.PointX[#self.PointX+1]=self.PointX[#self.PointX]+1
  583.         else
  584.           for i=2,#self.PointY do
  585.             self.PointY[i-1]=self.PointY[i]
  586.             self.PointX[i-1]=self.PointX[i]-1
  587.           end
  588.           self.PointY[#self.PointY]=v
  589.           self.PointX[#self.PointX]=self.PointX[#self.PointX]
  590.         end
  591.       end
  592.       end
  593.     end
  594.     function obj:ClearPoints()
  595.         self.PointY = {}
  596.         self.PointX = {}
  597.     end
  598.     function obj:Click(x,y,e,b,w)
  599.       if self.OnClick~=nil then
  600.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  601.         if x==nil then
  602.           return
  603.         end
  604.       end
  605.       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
  606.         return true
  607.       end
  608.     end
  609.     setmetatable(obj, self)
  610.     self.__index = self;
  611.     return obj
  612.   end
  613.  
  614.   function interface_s.Components.Label:new(x, y, t, theme)
  615.     local obj= {}
  616.     obj.Type = "Label"
  617.  
  618.     obj.X = x
  619.     obj.Y = y
  620.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  621.     obj.Theme = theme
  622.     obj.HintText = ""
  623.     obj.IsShowing = true
  624.     obj.Text = t
  625.    
  626.     obj.OnClick = nil
  627.  
  628.     obj.Base = nil
  629.     obj.Focused=false
  630.     obj.HintHelper = nil
  631.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  632.       if not self.IsShowing then return end
  633.       self.Focused = IsFocused
  634.       if IsFocused==true then
  635.         gfx.drawText(self.X+baseX,self.Y+baseY,self.Text,gfx.getColors(self.Theme.TextColor))
  636.         local tw, th = gfx.textSize(self.Text)
  637.         if (x>self.X) and (x<self.X+tw) and (y>self.Y) and (y<self.Y+th) then
  638.           if self.HintHelper~=nil then
  639.             self.HintHelper:MouseOver(x+baseX,y+baseY,self.HintText)
  640.           end
  641.         else
  642.           if self.HintHelper~=nil then
  643.             self.HintHelper:Reset()
  644.           end
  645.         end
  646.       else
  647.         if self.HintHelper~=nil then
  648.           self.HintHelper:Reset()
  649.         end
  650.         gfx.drawText(self.X+baseX,self.Y+baseY,self.Text,gfx.getColors(self.Theme.UnfocusedTextColor))
  651.       end
  652.     end
  653.     function obj:Show()
  654.       self.IsShowing = true
  655.     end
  656.     function obj:Hide()
  657.       self.IsShowing = false
  658.     end
  659.     function obj:Click(x,y,e,b,w)
  660.       if self.OnClick~=nil then
  661.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  662.         if x==nil then
  663.           return
  664.         end
  665.       end
  666.     end
  667.     function obj:AddHint(text)
  668.       self.HintText = text
  669.       self.HintHelper = interface_s.ComponentsHelpers.Hint:new()
  670.     end
  671.     setmetatable(obj, self)
  672.     self.__index = self;
  673.     return obj
  674.   end
  675.  
  676.   function interface_s.Components.Textbox:new(x, y, w, h, theme)
  677.     local obj= {}
  678.     obj.Type = "Textbox"
  679.  
  680.     obj.X = x
  681.     obj.Y = y
  682.     obj.Theme = theme
  683.     obj.IsShowing = true
  684.     obj.Width = w
  685.     obj.Height = h
  686.     obj.Text = ""
  687.     obj.Enabled = true
  688.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  689.     obj.MaxTextLength = 10
  690.     obj.PointerIndex = 0
  691.  
  692.     obj.OnTextChanged = nil
  693.     obj.OnClick = nil
  694.  
  695.     obj.Focused=false
  696.     obj.Base = nil
  697.     obj.IsActive = false
  698.     obj.PointerBlinkStep =0
  699.     obj.ClickHelper = interface_s.ComponentsHelpers.Click:new()
  700.     obj.ClickHelper.OnPress = function()
  701.         obj.IsActive = true
  702.       end
  703.     obj.ClickHelper.OnMissClick = function()
  704.         obj.IsActive = false
  705.       end
  706.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  707.       if not self.IsShowing then return end
  708.       self.Focused = IsFocused
  709.       gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BackColor))
  710.       if self.IsActive==true and self.Enabled then
  711.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  712.         self.PointerBlinkStep = self.PointerBlinkStep + 1
  713.         if self.PointerBlinkStep > 30 then
  714.           self.PointerBlinkStep=0
  715.         end
  716.         if self.PointerBlinkStep > 15 then
  717.           local x = gfx.textSize(string.sub(self.Text, 0,self.PointerIndex) )
  718.           gfx.drawLine(x+self.X+baseX+1,self.Y+baseY+4, x+self.X+baseX+1, self.Y+baseY+self.Height-4,gfx.getColors(self.Theme.PointerColor))
  719.         end
  720.       else
  721.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.UnfocusedBorderColor))
  722.       end
  723.       local x, y = gfx.textSize(string.sub(self.Text, 0,self.PointerIndex) )
  724.       if IsFocused==true and self.Enabled then
  725.         gfx.drawText(self.X+baseX+2,self.Y+baseY+(self.Height-y+3)/2,self.Text,gfx.getColors(self.Theme.TextColor))
  726.       else
  727.         gfx.drawText(self.X+baseX+2,self.Y+baseY+(self.Height-y+3)/2,self.Text,gfx.getColors(self.Theme.UnfocusedTextColor))
  728.       end
  729.     end
  730.     function obj:Show()
  731.       self.IsShowing = true
  732.     end
  733.     function obj:Hide()
  734.       self.IsShowing = false
  735.     end
  736.     function obj:Click(x,y,e,b,w)
  737.       if self.OnClick~=nil then
  738.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  739.         if x==nil then
  740.           return
  741.         end
  742.       end
  743.       if self.Enabled then
  744.         self.ClickHelper:ProcessClick(self.Width,self.Height,self.X,self.Y,x,y,e,b)
  745.       end
  746.     end
  747.     function obj:KeyPress(code, scan, r, ctrl, shift, alt)
  748.       if self.IsActive==true and self.Enabled then
  749.         if scan~=nil then
  750.           if code==8 and self.PointerIndex>0 then
  751.             self.PointerIndex=self.PointerIndex-1
  752.             self.Text=string.sub(self.Text,0,self.PointerIndex)..string.sub(self.Text,self.PointerIndex+2)
  753.             if self.OnTextChanged~=nil then
  754.               self.OnTextChanged(self.Text)
  755.             end
  756.           elseif code==127 and self.PointerIndex~=string.len(self.Text) then
  757.             self.PointerIndex=self.PointerIndex
  758.             self.Text=string.sub(self.Text,0,self.PointerIndex)..string.sub(self.Text,self.PointerIndex+2)
  759.             if self.OnTextChanged~=nil then
  760.               self.OnTextChanged(self.Text)
  761.             end
  762.           elseif code==1073741903 and string.len(self.Text)>=self.PointerIndex+1 then
  763.             self.PointerIndex=self.PointerIndex+1
  764.           elseif code==1073741904 and self.PointerIndex>0 then
  765.             self.PointerIndex=self.PointerIndex-1
  766.           end
  767.         else
  768.           if string.len(self.Text)<=self.MaxTextLength then
  769.             self.PointerIndex=self.PointerIndex+1
  770.             self.Text=string.sub(self.Text,0,self.PointerIndex-1)..code..string.sub(self.Text,self.PointerIndex)
  771.             if self.OnTextChanged~=nil then
  772.               self.OnTextChanged(self.Text)
  773.             end
  774.           end
  775.         end
  776.         return true
  777.       end
  778.     end
  779.     setmetatable(obj, self)
  780.     self.__index = self;
  781.     return obj
  782.   end
  783.  
  784.   function interface_s.Components.Checkbox:new(x, y, s, t, theme)
  785.     local obj= {}
  786.     obj.Type = "Checkbox"
  787.  
  788.     obj.X = x
  789.     obj.Y = y
  790.     obj.Theme = theme
  791.     obj.IsShowing = true
  792.     obj.Size = s
  793.     obj.Text = t
  794.     obj.Enabled = true
  795.     obj.Checked = false
  796.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  797.  
  798.     obj.OnStateChanged = nil
  799.     obj.OnClick = nil
  800.  
  801.     obj.Focused=false
  802.     obj.Base = nil
  803.     obj.ClickHelper = interface_s.ComponentsHelpers.Click:new()
  804.     obj.ClickHelper.OnPress = function()
  805.         if obj.Checked==true then
  806.           obj.Checked = false
  807.         else
  808.           obj.Checked = true
  809.         end
  810.         if obj.OnStateChanged~=nil then
  811.           obj.OnStateChanged(obj.Checked)
  812.         end
  813.       end
  814.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  815.       if not self.IsShowing then return end
  816.       self.Focused = IsFocused
  817.       local x, y = gfx.textSize(self.Text)
  818.       if IsFocused==true and self.Enabled then
  819.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Size,self.Size,gfx.getColors(self.Theme.BorderColor))
  820.         if self.Checked==true then
  821.           gfx.fillRect(self.X+baseX+3,self.Y+baseY+3,self.Size-6,self.Size-6,gfx.getColors(self.Theme.CheckColor))
  822.         end
  823.         gfx.drawText(self.X+baseX+self.Size+4,self.Y+baseY+(self.Size-y)/2+1,self.Text,gfx.getColors(self.Theme.TextColor))
  824.       else
  825.         gfx.drawRect(self.X+baseX,self.Y+baseY,self.Size,self.Size,gfx.getColors(self.Theme.UnfocusedBorderColor))
  826.         if self.Checked==true then
  827.           gfx.fillRect(self.X+baseX+3,self.Y+baseY+3,self.Size-6,self.Size-6,gfx.getColors(self.Theme.UnfocusedCheckColor))
  828.         end
  829.         gfx.drawText(self.X+baseX+self.Size+4,self.Y+baseY+(self.Size-y)/2+1,self.Text,gfx.getColors(self.Theme.UnfocusedCheckColor))
  830.       end
  831.     end
  832.     function obj:Show()
  833.       self.IsShowing = true
  834.     end
  835.     function obj:Hide()
  836.       self.IsShowing = false
  837.     end
  838.     function obj:Click(x,y,e,b,w)
  839.       if self.OnClick~=nil then
  840.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  841.         if x==nil then
  842.           return
  843.         end
  844.       end
  845.       if self.Enabled then
  846.         return self.ClickHelper:ProcessClick(self.Size,self.Size,self.X,self.Y,x,y,e,b)
  847.       end
  848.     end
  849.     setmetatable(obj, self)
  850.     self.__index = self;
  851.     return obj
  852.   end
  853.  
  854.   function interface_s.Components.Selection:new(x, y, theme)
  855.     local obj= {}
  856.     obj.X = x
  857.     obj.Y = y
  858.     obj.Focused=false
  859.     obj.Theme = theme
  860.     obj.IsShowing = true
  861.     obj.IsPointSet = false
  862.     obj.FirstPointX = -1
  863.     obj.FirstPointY = -1
  864.     obj.IsFinished = false
  865.     obj.EndPointX = -1
  866.     obj.EndPointY = -1
  867.     obj.OnSelectionStart = nil
  868.     obj.OnSelected = nil
  869.     obj.OnSelectionAborted = nil
  870.     obj.V2EndWidth = -1
  871.     obj.V2EndHeight = -1
  872.     obj.V2StartX = -1
  873.     obj.V2StartY = -1
  874.     obj.OnClick = nil
  875.     obj.OnDraw = nil
  876.     function obj:Draw(IsFocused,x,y)
  877.       if self.OnDraw~=nil then
  878.         IsFocused,x,y = self.OnDraw(IsFocused,x,y)
  879.         if IsFocused == nil then return end
  880.       end
  881.       self.Focused = IsFocused
  882.       if IsFocused then
  883.         if (self.IsPointSet) and (self.IsFinished==false) then
  884.           local arg11 = -1
  885.           local arg12 = -1
  886.           local arg21 = -1
  887.           local arg22 = -1
  888.           if self.FirstPointX-x>=0 then
  889.             arg11 = x
  890.             arg12 = self.FirstPointX-x
  891.           else
  892.             arg11 = self.FirstPointX
  893.             arg12 = x-self.FirstPointX
  894.           end
  895.           if self.FirstPointY - y>=0 then
  896.             arg21 = y
  897.             arg22 = self.FirstPointY - y
  898.           else
  899.             arg21 = self.FirstPointY
  900.             arg22 = y-self.FirstPointY
  901.           end
  902.           if (self.IsFinished==false) and (self.IsPointSet==true)  then
  903.             self.V2EndWidth = arg12
  904.             self.V2EndHeight = arg22
  905.             self.V2StartX = arg11
  906.             self.V2StartY = arg21
  907.           end
  908.           gfx.fillRect(arg11, arg21, arg12,arg22, gfx.getColors(self.Theme.BackColor))
  909.         end
  910.       else
  911.         self.IsPointSet = false
  912.       end
  913.     end
  914.     function obj:Show()
  915.       self.IsShowing = true
  916.     end
  917.     function obj:Hide()
  918.       self.IsShowing = false
  919.     end
  920.     function obj:Click(x,y,e,b,w)
  921.       if self.OnClick~=nil then
  922.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  923.         if x==nil then
  924.           return
  925.         end
  926.       end
  927.       if (e==mouseEvents.Down) and (self.IsPointSet==false) and (b==1) then
  928.         self.IsPointSet = true
  929.         self.FirstPointX = x
  930.         self.FirstPointY = y
  931.         if self.OnSelectionStart ~= nil then
  932.           self.OnSelectionStart(self.FirstPointX,self.FirstPointY)
  933.         end
  934.         return true
  935.       else
  936.         if (e==mouseEvents.Up) and (self.IsPointSet==true) and (b==1) and (self.IsFinished == false) then
  937.           self.IsFinished = true
  938.           self.EndPointX = x
  939.           self.EndPointY = y
  940.           if self.OnSelected ~= nil then
  941.             self.OnSelected(self.FirstPointX,self.FirstPointY,self.EndPointX,self.EndPointY, self.V2StartX, self.V2StartY, self.V2EndWidth,self.V2EndHeight)
  942.           end
  943.           return true
  944.         end
  945.         if (self.IsPointSet==true) and (b~=1) and (self.IsFinished==false) then
  946.           self.IsPointSet=false
  947.           if self.OnSelectionAborted ~= nil then
  948.             self.OnSelectionAborted()
  949.           end
  950.         end
  951.       end
  952.     end
  953.     function obj:Move()
  954.     end
  955.     function obj:KeyPress(key, scan, r, ctrl, shift, alt)
  956.     end
  957.     setmetatable(obj, self)
  958.     self.__index = self;
  959.     return obj
  960.   end
  961.  
  962.   function interface_s.Components.SelectionMover:new(x, y,w,h, theme)
  963.     local obj= {}
  964.     obj.X = x
  965.     obj.Y = y
  966.     obj.Focused=false
  967.     obj.Theme = theme
  968.     obj.IsShowing = true
  969.     obj.Width = w
  970.     obj.Height = h
  971.     obj.OnMovement = nil
  972.     obj.OnAbort = nil
  973.     obj.OnDone = nil
  974.     obj.MoveStartX = -1
  975.     obj.MoveStartY = -1
  976.     obj.NewPosX = -1
  977.     obj.NewPosY = -1
  978.     obj.IsMoving = false
  979.     obj.SumDX = 0
  980.     obj.SumDY = 0
  981.     obj.IsMoved = false
  982.     obj.OnDraw = nil
  983.     obj.OnClick = nil
  984.     obj.OnMove = nil
  985.     function obj:Draw(IsFocused,x,y)
  986.       if self.OnDraw~=nil then
  987.         self.OnDraw(IsFocused,x,y)
  988.       end
  989.       self.Focused = IsFocused
  990.       gfx.fillRect(self.X, self.Y, self.Width,self.Height, gfx.getColors(self.Theme.BackColor))
  991.     end
  992.     function obj:Show()
  993.       self.IsShowing = true
  994.     end
  995.     function obj:Hide()
  996.       self.IsShowing = false
  997.     end
  998.     function obj:Click(x,y,e,b,w)
  999.       if self.OnClick~=nil then
  1000.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  1001.         if x==nil then
  1002.           return
  1003.         end
  1004.       end
  1005.       if (e==3) and (self.IsMoving) then  --For old versions
  1006.         if self.OnMovement ~= nil then
  1007.           self.OnMovement(-self.MoveStartX + x,- self.MoveStartY + y)
  1008.         end
  1009.         if (-self.MoveStartX + x ~= 0) and (- self.MoveStartY + y ~= 0) then
  1010.           self.IsMoved = true
  1011.         end
  1012.         self.SumDX = self.SumDX - self.MoveStartX + x
  1013.         self.SumDY = self.SumDY - self.MoveStartY + y
  1014.         self.X = self.X - self.MoveStartX + x
  1015.         self.Y = self.Y - self.MoveStartY + y
  1016.         self.MoveStartX = x
  1017.         self.MoveStartY = y
  1018.       else
  1019.         if (e==mouseEvents.Up) and (self.IsMoving) then
  1020.           if self.IsMoved == false then
  1021.             if self.OnDone ~= nil then
  1022.               self.OnDone(self.SumDX,self.SumDY)
  1023.             end
  1024.           end
  1025.           self.IsMoving = false
  1026.         end
  1027.       end
  1028.       if (x>self.X) and (x<self.X+self.Width) and (y>self.Y) and (y<self.Y+self.Height) then
  1029.         if (e==1) and (b==4) then
  1030.           if self.OnAbort ~= nil then
  1031.             self.OnAbort(self.SumDX,self.SumDY)
  1032.           end
  1033.         end
  1034.         if (y>self.Y) and (y<self.Y+self.Height) and (e==1) then
  1035.           self.MoveStartX = x
  1036.           self.MoveStartY = y
  1037.           self.IsMoving = true
  1038.         end
  1039.         if (e==1) and (b==1) then
  1040.           self.IsMoved = false
  1041.         end
  1042.         return true
  1043.       end
  1044.     end
  1045.     function obj:Move(x,y,dx,dy)
  1046.       if self.OnMove~=nil then
  1047.         x,y,dx,dy = self.OnMove(x,y,dx,dy)
  1048.         if x==nil then
  1049.           return
  1050.         end
  1051.       end
  1052.       if self.IsMoving then
  1053.         if self.OnMovement ~= nil then
  1054.           self.OnMovement(-self.MoveStartX + x,- self.MoveStartY + y)
  1055.         end
  1056.         if (-self.MoveStartX + x ~= 0) and (- self.MoveStartY + y ~= 0) then
  1057.           self.IsMoved = true
  1058.         end
  1059.         self.SumDX = self.SumDX - self.MoveStartX + x
  1060.         self.SumDY = self.SumDY - self.MoveStartY + y
  1061.         self.X = self.X - self.MoveStartX + x
  1062.         self.Y = self.Y - self.MoveStartY + y
  1063.         self.MoveStartX = x
  1064.         self.MoveStartY = y
  1065.       end
  1066.     end
  1067.     function obj:KeyPress(key, scan, r, ctrl, shift, alt)
  1068.     end
  1069.     setmetatable(obj, self)
  1070.     self.__index = self;
  1071.     return obj
  1072.   end
  1073.  
  1074.   function interface_s.Components.Listbox:new(x, y, w, h, theme)
  1075.     local obj= {}
  1076.     obj.Type = "Listbox"
  1077.     obj.X = x
  1078.     obj.Y = y
  1079.     obj.Focused=false
  1080.     obj.Theme = theme
  1081.     obj.IsShowing = true
  1082.     obj.Width = w
  1083.     obj.Height = h
  1084.     obj.Anchor = {Top = false,Bottom=false,Left=false,Right=false}
  1085.     obj.SelectedIndex = 1
  1086.     obj.Items = {}
  1087.     obj.ItemsColsCount = 1
  1088.     obj.ItemsColsPadding = {0}
  1089.  
  1090.     obj.OnItemSelected = nil
  1091.     obj.OnClick = nil
  1092.  
  1093.     obj.Base = nil
  1094.     obj.IsActive = false
  1095.     obj.ScrollStartItemIndex = 1
  1096.     obj.ItemClickHelper = interface_s.ComponentsHelpers.Click:new()
  1097.     obj.ItemClickHelper.OnPress = function(x,y)
  1098.         obj.SelectedIndex=math.floor((y-obj.Y)/11)+obj.ScrollStartItemIndex-1
  1099.         if obj.OnItemSelected~= nil then
  1100.           obj.OnItemSelected(obj.SelectedIndex,obj.Items[obj.SelectedIndex])
  1101.         end
  1102.         return true
  1103.     end
  1104.     function obj:Draw(IsFocused, baseX, baseY,x,y)
  1105.       if not self.IsShowing then return end
  1106.       self.Focused = IsFocused
  1107.       gfx.fillRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BackColor))
  1108.       gfx.drawRect(self.X+baseX,self.Y+baseY,self.Width,self.Height,gfx.getColors(self.Theme.BorderColor))
  1109.       local endindex = math.floor(self.Height/11)+self.ScrollStartItemIndex-1
  1110.       if table.getn(self.Items)<math.floor(self.Height/11) then
  1111.         endindex = table.getn(self.Items)
  1112.       end
  1113.       for i=self.ScrollStartItemIndex, endindex do
  1114.         if IsFocused then
  1115.           if self.SelectedIndex==i-1 then
  1116.             gfx.fillRect(self.X+baseX+2,self.Y+baseY+(i-self.ScrollStartItemIndex)*11+2,self.Width-4,10,gfx.getColors(self.Theme.SelectionColor))
  1117.             if self.ItemsColsCount==1 then
  1118.               gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.SelectionTextColor))
  1119.             else
  1120.               for j=1, self.ItemsColsCount do
  1121.                 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))
  1122.               end
  1123.             end
  1124.           else
  1125.             if self.ItemsColsCount==1 then
  1126.               gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.TextColor))
  1127.             else
  1128.               for j=1, self.ItemsColsCount do
  1129.                 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))
  1130.               end
  1131.             end
  1132.           end
  1133.           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
  1134.             gfx.fillRect(self.X+baseX+1,self.Y+baseY+(i-self.ScrollStartItemIndex)*11,self.Width-2,12,gfx.getColors(self.Theme.MouseOverColor))
  1135.           end
  1136.       else -- unfocused
  1137.         if self.SelectedIndex==i-1 then
  1138.           gfx.fillRect(self.X+baseX+2,self.Y+baseY+(i-self.ScrollStartItemIndex)*11+2,self.Width-4,10,gfx.getColors(self.Theme.UnfocusedSelectionColor))
  1139.           if self.ItemsColsCount==1 then
  1140.             gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.UnfocusedSelectionTextColor))
  1141.           else
  1142.             for j=1, self.ItemsColsCount do
  1143.               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))
  1144.             end
  1145.           end
  1146.         else
  1147.           if self.ItemsColsCount==1 then
  1148.             gfx.drawText(self.X+baseX+3,self.Y+baseY+3+(i-self.ScrollStartItemIndex)*11,self.Items[i],gfx.getColors(self.Theme.UnfocusedTextColor))
  1149.           else
  1150.             for j=1, self.ItemsColsCount do
  1151.               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))
  1152.             end
  1153.           end
  1154.         end
  1155.         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
  1156.           gfx.fillRect(self.X+baseX+1,self.Y+baseY+(i-self.ScrollStartItemIndex)*11,self.Width-2,12,gfx.getColors(self.Theme.UnfocusedMouseOverColor))
  1157.         end
  1158.       end
  1159.     end
  1160.     end
  1161.     function obj:Show()
  1162.       self.IsShowing = true
  1163.     end
  1164.     function obj:Hide()
  1165.       self.IsShowing = false
  1166.     end
  1167.     function obj:Click(x,y,e,b,w)
  1168.       if self.OnClick~=nil then
  1169.         x,y,e,b,w = self.OnClick(x,y,e,b,w)
  1170.         if x==nil then
  1171.           return
  1172.         end
  1173.       end
  1174.       if w==1 and self.ScrollStartItemIndex<table.getn(self.Items)-math.floor( self.Height/11 )+1 then
  1175.         self.ScrollStartItemIndex=self.ScrollStartItemIndex+1
  1176.         return true
  1177.       elseif w==-1 and self.ScrollStartItemIndex>1 then
  1178.         self.ScrollStartItemIndex=self.ScrollStartItemIndex-1
  1179.         return true
  1180.       end
  1181.       return self.ItemClickHelper:ProcessClick(self.Width,(#self.Items-self.ScrollStartItemIndex+1)*11,self.X,self.Y,x,y,e,b)
  1182.     end
  1183.     setmetatable(obj, self)
  1184.     self.__index = self;
  1185.     return obj
  1186.   end
  1187.  
  1188.   function interface_s.ComponentsHelpers.Click:new(x, y)
  1189.     local obj= {}
  1190.     obj.IsFirstClick = false
  1191.     obj.OnPress = nil
  1192.     obj.OnFirstClick = nil
  1193.     obj.OnMissClick = nil
  1194.     function obj:ProcessClick(width,height,x,y,clickX,clickY,e,b)
  1195.       if (clickX>x) and (clickX<x+width) and (clickY>y) and (clickY<y+height) and (self.IsFirstClick==false) and (e==mouseEvents.Down) and (b==1) then
  1196.         self.IsFirstClick=true
  1197.         if self.OnFirstClick ~= nil then
  1198.           return self.OnFirstClick(clickX,clickY)
  1199.         else
  1200.           return true
  1201.         end
  1202.       else
  1203.         if (clickX>x) and (clickX<x+width) and (clickY>y) and (clickY<y+height) and (self.IsFirstClick==true) and (e==mouseEvents.Up) and (b==1) then
  1204.           self.IsFirstClick = false  
  1205.           if self.OnPress~= nil then
  1206.             return self.OnPress(clickX,clickY)
  1207.           else
  1208.             return true
  1209.           end
  1210.         else
  1211.           self.IsFirstClick = false
  1212.           if self.OnMissClick~= nil then
  1213.             return self.OnMissClick(clickX,clickY)
  1214.           end
  1215.         end
  1216.       end
  1217.     end
  1218.     setmetatable(obj, self)
  1219.     self.__index = self;
  1220.     return obj
  1221.   end
  1222.   function interface_s.ComponentsHelpers.Hint:new()
  1223.     local obj= {}
  1224.     obj.HintFrames = 0
  1225.     obj.Window = interface_s.Components.Window:new(0, 0, 0, 12,false, interface_s.DefaultTheme.Window)
  1226.     obj.Label = interface_s.Components.Label:new(5,2,"",interface_s.DefaultTheme.Label)
  1227.     obj.Window:AddComponent(obj.Label)
  1228.     obj.Window.AllowResize = false
  1229.     obj.Window.AlwaysFocused = true
  1230.     function obj:MouseOver(x,y,text)
  1231.       if text~="" then
  1232.         self.HintFrames = self.HintFrames + 1
  1233.         if self.HintFrames>40 then
  1234.           local w,h = gfx.textSize(text)
  1235.           self.Window.X = x
  1236.           self.Window.Y = y+12
  1237.           self.Window.Width = w+10
  1238.           self.Label.Text = text
  1239.           self.Window:Draw(true,x,y)
  1240.         end
  1241.       end
  1242.     end
  1243.     function obj:Reset()
  1244.       self.HintFrames = 0
  1245.     end
  1246.     setmetatable(obj, self)
  1247.     self.__index = self;
  1248.     return obj
  1249.   end
  1250. end
  1251. local function DefineAPI()
  1252.   interface_s.Components.Window = {}
  1253.   interface_s.Components.Button = {}
  1254.   interface_s.Components.Combobox = {}
  1255.   interface_s.Components.Graph = {}
  1256.   interface_s.Components.Label = {}
  1257.   interface_s.Components.Textbox = {}
  1258.   interface_s.Components.Checkbox = {}
  1259.   interface_s.Components.Listbox = {}
  1260.   interface_s.Components.Selection = {}
  1261.   interface_s.Components.SelectionMover = {}
  1262.   interface_s.ComponentsHelpers.Click = {}
  1263.   interface_s.ComponentsHelpers.Hint = {}
  1264.  
  1265.   interface_s.AddOnClickAction = function(func)
  1266.     for i=#interface_s.OnClick+1,2,-1 do
  1267.       interface_s.OnClick[i]=interface_s.OnClick[i-1]
  1268.     end
  1269.     if type(func) == "function" then
  1270.       interface_s.OnClick[1]={}
  1271.       interface_s.OnClick[1].Click = func
  1272.     else
  1273.       interface_s.OnClick[1] = func
  1274.     end
  1275.   end
  1276.  
  1277.   interface_s.RemoveOnClickAction = function(func)
  1278.     local index = interface_s.GetOnClickActionIndex(func)
  1279.     if index~=-1 then
  1280.       interface_s.OnClick[index] = 0
  1281.     end
  1282.   end
  1283.  
  1284.   interface_s.GetOnClickActionIndex=function(obj)
  1285.     if type(obj) == "function" then
  1286.       for i=1, #interface_s.OnClick do
  1287.         if interface_s.OnClick[i]~=0 then
  1288.           if interface_s.OnClick[i].Click == obj then
  1289.             return i
  1290.           end
  1291.         end
  1292.       end
  1293.     else
  1294.       for i=1, #interface_s.OnClick do
  1295.         if interface_s.OnClick[i] == obj then
  1296.           return i
  1297.         end
  1298.       end
  1299.     end
  1300.     return -1
  1301.   end
  1302.  
  1303.   interface_s.AddOnStepAction = function(func)
  1304.     for i=#interface_s.OnStep+1,2,-1 do
  1305.       interface_s.OnStep[i]=interface_s.OnStep[i-1]
  1306.     end
  1307.     interface_s.OnStep[1] = func
  1308.   end
  1309.  
  1310.   interface_s.RemoveOnStepAction = function(func)
  1311.     local index = interface_s.GetOnStepActionIndex(func)
  1312.     if index~=-1 then
  1313.       interface_s.OnStep[index]=0
  1314.     end
  1315.   end
  1316.  
  1317.   interface_s.GetOnStepActionIndex=function(obj)
  1318.     for i=1, #interface_s.OnStep do
  1319.       if interface_s.OnStep[i] == obj then
  1320.         return i
  1321.       end
  1322.     end
  1323.     return -1
  1324.   end
  1325.  
  1326.   interface_s.AddKeyPressAction = function(func)
  1327.     for i=#interface_s.OnKeyPress+1,2,-1 do
  1328.       interface_s.OnKeyPress[i]=interface_s.OnKeyPress[i-1]
  1329.     end
  1330.     if type(func) == "function" then
  1331.       interface_s.OnKeyPress[1]={}
  1332.       interface_s.OnKeyPress[1].KeyPress = func
  1333.     else
  1334.       interface_s.OnKeyPress[1] = func
  1335.     end
  1336.   end
  1337.  
  1338.   interface_s.RemoveKeyPressAction = function(func)
  1339.     local index = interface_s.GetOnKeyPressActionIndex(func)
  1340.     if index~=-1 then
  1341.       interface_s.OnKeyPress[index]=0
  1342.     end
  1343.   end
  1344.  
  1345.   interface_s.GetOnKeyPressActionIndex=function(obj)
  1346.     if type(obj) == "function" then
  1347.       for i=1, #interface_s.OnKeyPress do
  1348.         if interface_s.OnKeyPress[i].KeyPress == obj then
  1349.           return i
  1350.         end
  1351.       end
  1352.     else
  1353.       for i=1, #interface_s.OnKeyPress do
  1354.         if interface_s.OnKeyPress[i] == obj then
  1355.           return i
  1356.         end
  1357.       end
  1358.     end
  1359.     return -1
  1360.   end
  1361.   interface_s.AddLeftWindow=function(obj)
  1362.     for i=#interface_s.windows+1,2,-1 do
  1363.       interface_s.windows[i]=interface_s.windows[i-1]
  1364.     end
  1365.     interface_s.windows[1]=obj
  1366.   end
  1367.  
  1368.   interface_s.addComponent=function(obj)
  1369.     interface_s.AddLeftWindow(obj)
  1370.   end
  1371.  
  1372.   interface_s.GetComponentIndex=function(obj)
  1373.     for i=1, #interface_s.windows do
  1374.       if interface_s.windows[i] == obj then
  1375.         return i
  1376.       end
  1377.     end
  1378.     return -1
  1379.   end
  1380.  
  1381.   interface_s.RemoveComponent=function(obj)
  1382.     local index = interface_s.GetComponentIndex(obj)
  1383.     if index~=-1 then
  1384.       for i=index, #interface_s.windows-1 do
  1385.         interface_s.windows[i]=interface_s.windows[i+1]
  1386.       end
  1387.       interface_s.windows[#interface_s.windows] = nil
  1388.     end
  1389.   end
  1390.  
  1391.   interface_s.focusComponent = function(index)
  1392.     local temp= interface_s.windows[index]
  1393.     for i=index, 2,-1 do
  1394.       interface_s.windows[i] = interface_s.windows[i-1]
  1395.     end
  1396.     interface_s.windows[1] = temp
  1397.   end
  1398.  
  1399.   interface_s.deleteFromArray = function(ar,index)
  1400.     for i=index, #ar-1 do
  1401.       ar[i]=ar[i+1]
  1402.     end
  1403.     ar[#ar] = nil
  1404.   end
  1405.  
  1406.   interface_s.step = function()
  1407.     local deletedFound = false
  1408.     for i=1,#interface_s.OnStep do
  1409.       if interface_s.OnStep[i]~=0 then
  1410.         interface_s.OnStep[i](tpt.mousex,tpt.mousey)
  1411.       else
  1412.         deletedFound = true
  1413.       end
  1414.     end
  1415.     if deletedFound then
  1416.       for i=1,#interface_s.OnStep do
  1417.         if interface_s.OnStep[i]==0 then
  1418.           interface_s.deleteFromArray(interface_s.OnStep,i)
  1419.           i=i-1
  1420.         end
  1421.       end
  1422.     end
  1423.     for i=#interface_s.windows, 1,-1 do
  1424.       if (interface_s.windows[i] ~= nil) and (interface_s.windows[i].IsShowing==true) then
  1425.         if i==1 then
  1426.           interface_s.windows[i]:Draw(true,tpt.mousex,tpt.mousey)
  1427.         else
  1428.           interface_s.windows[i]:Draw(false,tpt.mousex,tpt.mousey)
  1429.         end
  1430.       end
  1431.     end
  1432.   end
  1433.  
  1434.   interface_s.click = function(mousex, mousey, button, event,wheel)
  1435.     if event==3 then
  1436.       interface_s.mousemove(mousex,mousey,-1,-1)
  1437.       return true
  1438.     end
  1439.     local deletedFound = false
  1440.     local f = false
  1441.     for i=1,#interface_s.OnClick do
  1442.       if interface_s.OnClick[i]~=0 then
  1443.         if interface_s.OnClick[i].Base~=nil then
  1444.           if interface_s.OnClick[i]:Click(mousex-interface_s.OnClick[i].Base.X , mousey-interface_s.OnClick[i].Base.Y , event, button,wheel) then
  1445.             f=true
  1446.           end
  1447.         else
  1448.           if interface_s.OnClick[i].Click(mousex, mousey, event, button,wheel) then
  1449.             f=true
  1450.           end
  1451.         end
  1452.       else
  1453.         deletedFound = true
  1454.       end
  1455.     end
  1456.     if deletedFound then
  1457.       for i=1,#interface_s.OnClick do
  1458.         if interface_s.OnClick[i]==0 then
  1459.           interface_s.deleteFromArray(interface_s.OnClick,i)
  1460.           i=i-1
  1461.         end
  1462.       end
  1463.     end
  1464.     for i=1,#interface_s.windows do
  1465.       if interface_s.windows[i] == nil then
  1466.         interface_s.RemoveComponent(interface_s.windows[i])
  1467.         break
  1468.       end
  1469.       if (interface_s.windows ~= nil) then
  1470.         if interface_s.windows[i]:Click(mousex , mousey , event, button,wheel) then
  1471.           if (interface_s.windows[i]~=nil) and (interface_s.windows[i].IsShowing~=nil) and (interface_s.windows[i].IsShowing==true) then
  1472.             interface_s.focusComponent(i)
  1473.             return false
  1474.           end
  1475.         end
  1476.       end
  1477.     end
  1478.     if f==true then
  1479.       return false
  1480.     end
  1481.   end
  1482.  
  1483.   interface_s.key = function(char, code, mod, evt)
  1484.     local f = false
  1485.     if interface_s.windows[1] ~= nil then
  1486.       if interface_s.windows[1]:KeyPress(char, code, mod, evt) then
  1487.         f = true
  1488.       end
  1489.     end
  1490.     local deletedFound = false
  1491.     for i=1,#interface_s.OnKeyPress do
  1492.       if interface_s.OnKeyPress[i]~=0 then
  1493.         if interface_s.OnKeyPress[i].Base~=nil then
  1494.           if interface_s.OnKeyPress[i]:KeyPress(char, code, mod, evt) then
  1495.             f=true
  1496.           end
  1497.         else
  1498.           if interface_s.OnKeyPress[i].KeyPress(char, code, mod, evt) then
  1499.             f=true
  1500.           end
  1501.         end
  1502.       else
  1503.         deletedFound = true
  1504.       end
  1505.     end
  1506.     if deletedFound then
  1507.       for i=1,#interface_s.OnKeyPress do
  1508.         if interface_s.OnKeyPress[i]==0 then
  1509.           interface_s.deleteFromArray(interface_s.OnKeyPress,i)
  1510.           i=i-1
  1511.         end
  1512.       end
  1513.     end
  1514.     if interface_s.BlockKeyboard == true or f==true then
  1515.       return false
  1516.     end
  1517.   end
  1518.  
  1519.   interface_s.mousemove = function(x, y, dx, dy)
  1520.     for i=1,#interface_s.windows do
  1521.       if interface_s.windows[i] == nil then
  1522.         interface_s.RemoveComponent(interface_s.windows[i])
  1523.         break
  1524.       end
  1525.       if (interface_s.windows ~= nil) then
  1526.         if interface_s.windows[i]:Move(x , y , dx, dy) then
  1527.           if (interface_s.windows[i]~=nil) and (interface_s.windows[i].IsShowing~=nil) and (interface_s.windows[i].IsShowing==true) then
  1528.             interface_s.focusComponent(i)
  1529.             return false
  1530.           end
  1531.         end
  1532.       end
  1533.     end
  1534.   end
  1535.  
  1536.   interface_s.mouseUpToClick = function(x, y, b)
  1537.     return interface_s.click(x,y,b,mouseEvents.Up)
  1538.   end
  1539.  
  1540.   interface_s.mouseDownToClick = function(x, y, b)
  1541.     return interface_s.click(x,y,b,mouseEvents.Down)
  1542.   end
  1543.  
  1544.   interface_s.mouseWheelToClick = function(x, y, d)
  1545.     return interface_s.click(x,y,0,0,d)
  1546.   end
  1547.  
  1548.   if tpt.version.major<=93 and tpt.version.jacob1s_mod==nil or tpt.version.jacob1s_mod~=nil and tpt.version.jacob1s_mod<42 then
  1549.     tpt.register_step(interface_s.step)
  1550.     tpt.register_mouseclick(interface_s.click)
  1551.     tpt.register_keypress(interface_s.key)
  1552.   else
  1553.     event.register(event.tick, interface_s.step)  
  1554.     event.register(event.mousedown, interface_s.mouseDownToClick)
  1555.     event.register(event.mouseup, interface_s.mouseUpToClick)
  1556.     event.register(event.mousemove, interface_s.mousemove)
  1557.     event.register(event.mousewheel, interface_s.mouseWheelToClick)
  1558.     event.register(event.keypress, interface_s.key)
  1559.     event.register(event.textinput, interface_s.key)
  1560.   end
  1561. end
  1562. local function unregisterOldVerionEvents()
  1563.   pcall(tpt.unregister_step,interface_s.step)
  1564.   pcall(tpt.unregister_mouseclick,interface_s.click)
  1565.   pcall(tpt.unregister_keypress,interface_s.key)
  1566.   if event~=nil then
  1567.     pcall(event.unregister,event.mousedown,interface_s.mouseDownToClick)
  1568.     pcall(event.unregister,event.mouseup,interface_s.mouseUpToClick)
  1569.     pcall(event.unregister,event.mousemove,interface_s.mousemove)
  1570.     pcall(event.unregister,event.mousewheel,interface_s.mouseWheelToClick)
  1571.     pcall(event.unregister,event.keypress,interface_s.key)
  1572.     pcall(event.unregister,event.textinput,interface_s.key)
  1573.   end
  1574. end
  1575. local function InitIntefaceAPI()
  1576.   if interface_s == nil then
  1577.     interface_s = {
  1578.       Version = InterfaceAPIVersion,
  1579.       Components = {},
  1580.       ComponentsHelpers = {},
  1581.       windows = {},
  1582.       step = nil,
  1583.       click = nil,
  1584.       mouseUpToClick = nil,
  1585.       mouseDownToClick = nil,
  1586.       mouseWheelToClick = nil,
  1587.       mousemove = nil,
  1588.       key = nil,
  1589.       addLeft = nil,
  1590.       addComponent = nil,
  1591.       GetComponentIndex = nil,
  1592.       RemoveComponent = nil,
  1593.       focusComponent = nil,
  1594.       BlockKeyboard = false,
  1595.       OnClick = {},
  1596.       OnKeyPress = {},
  1597.       OnStep = {},
  1598.       DefaultTheme = {}
  1599.     }
  1600.     DefineAPI()
  1601.     DefineInterfaceComponents()
  1602.   else
  1603.     if interface_s.Version<InterfaceAPIVersion then
  1604.       unregisterOldVerionEvents()
  1605.       interface_s = {
  1606.         Version = InterfaceAPIVersion,
  1607.         Components = {},
  1608.         ComponentsHelpers = {},
  1609.         windows = interface_s.windows,
  1610.         step = nil,
  1611.         click = nil,
  1612.         mouseUpToClick = nil,
  1613.         mouseDownToClick = nil,
  1614.         mouseWheelToClick = nil,
  1615.         mousemove = nil,
  1616.         key = nil,
  1617.         addLeft = nil,
  1618.         addComponent = nil,
  1619.         GetComponentIndex = nil,
  1620.         RemoveComponent = nil,
  1621.         focusComponent = nil,
  1622.         BlockKeyboard = interface_s.BlockKeyboard,
  1623.         OnClick = interface_s.OnClick or {},
  1624.         OnKeyPress = interface_s.OnKeyPress or {},
  1625.         OnStep = interface_s.OnStep or {},
  1626.         DefaultTheme = interface_s.DefaultTheme or {}
  1627.       }
  1628.       DefineAPI()
  1629.       DefineInterfaceComponents()
  1630.     end
  1631.   end
  1632. end
  1633. InitIntefaceAPI()
  1634. --=================================================================--
  1635. --                       THEME START                               --
  1636. --=================================================================--
  1637. interface_s.DefaultTheme = {
  1638.   Window = {},
  1639.   Button = {},
  1640.   Combobox = {},
  1641.   Graph = {},
  1642.   Label = {},
  1643.   Textbox = {},
  1644.   Checkbox = {},
  1645.   Listbox = {},
  1646.   Selection = {}
  1647. }
  1648.  
  1649. interface_s.DefaultTheme.Window.BackColor = gfx.getHexColor(0,0,0,255)
  1650. interface_s.DefaultTheme.Window.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1651. interface_s.DefaultTheme.Window.BorderColor = gfx.getHexColor(255,255,255,255)
  1652. interface_s.DefaultTheme.Window.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1653. interface_s.DefaultTheme.Window.HeaderColor = gfx.getHexColor(150,150,255,255)
  1654. interface_s.DefaultTheme.Window.UnfocusedHeaderColor = gfx.getHexColor(32,32,55,255)
  1655.  
  1656. interface_s.DefaultTheme.Button.BackColor = gfx.getHexColor(0,0,0,0)
  1657. interface_s.DefaultTheme.Button.UnfocusedBackColor = gfx.getHexColor(0,0,0,0)
  1658. interface_s.DefaultTheme.Button.PressedBackColor = gfx.getHexColor(240,240,240,255)
  1659. interface_s.DefaultTheme.Button.BorderColor = gfx.getHexColor(255,255,255,255)
  1660. interface_s.DefaultTheme.Button.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1661. interface_s.DefaultTheme.Button.MouseOverColor = gfx.getHexColor(255,255,255,128)
  1662. interface_s.DefaultTheme.Button.UnfocusedMouseOverColor = gfx.getHexColor(150,150,150,128)
  1663. interface_s.DefaultTheme.Button.TextColor = gfx.getHexColor(255,255,255,255)
  1664. interface_s.DefaultTheme.Button.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1665. interface_s.DefaultTheme.Button.PressedTextColor = gfx.getHexColor(0,0,0,255)
  1666.  
  1667. interface_s.DefaultTheme.Combobox.BackColor = gfx.getHexColor(0,0,0,255)
  1668. interface_s.DefaultTheme.Combobox.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1669. interface_s.DefaultTheme.Combobox.BorderColor = gfx.getHexColor(255,255,255,255)
  1670. interface_s.DefaultTheme.Combobox.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1671. interface_s.DefaultTheme.Combobox.TextColor = gfx.getHexColor(255,255,255,255)
  1672. interface_s.DefaultTheme.Combobox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1673. interface_s.DefaultTheme.Combobox.ButtonBackColor = gfx.getHexColor(0,0,0,255)
  1674. interface_s.DefaultTheme.Combobox.ButtonPressedBackColor = gfx.getHexColor(255,255,255,255)
  1675. interface_s.DefaultTheme.Combobox.ButtonMouseOverBackColor = gfx.getHexColor(150,150,150,128)
  1676. interface_s.DefaultTheme.Combobox.UnfocusedButtonBackColor = gfx.getHexColor(0,0,0,255)
  1677. interface_s.DefaultTheme.Combobox.UnfocusedButtonMouseOverBackColor = gfx.getHexColor(150,150,150,128)
  1678.  
  1679. interface_s.DefaultTheme.Graph.BackColor = gfx.getHexColor(0,0,0,255)
  1680. interface_s.DefaultTheme.Graph.BorderColor = gfx.getHexColor(255,255,255,255)
  1681. interface_s.DefaultTheme.Graph.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1682. interface_s.DefaultTheme.Graph.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1683. interface_s.DefaultTheme.Graph.TextColor = gfx.getHexColor(255,255,255,255)
  1684. interface_s.DefaultTheme.Graph.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1685. interface_s.DefaultTheme.Graph.GraphColor = gfx.getHexColor(255,100,100,255)
  1686. interface_s.DefaultTheme.Graph.UnfocusedGraphColor = gfx.getHexColor(100,30,30,255)
  1687. interface_s.DefaultTheme.Graph.ZeroLine = gfx.getHexColor(255,200,200,255)
  1688. interface_s.DefaultTheme.Graph.UnfocusedZeroLine = gfx.getHexColor(100,80,80,255)
  1689.  
  1690. interface_s.DefaultTheme.Label.TextColor = gfx.getHexColor(255,255,255,255)
  1691. interface_s.DefaultTheme.Label.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1692.  
  1693. interface_s.DefaultTheme.Textbox.BackColor = gfx.getHexColor(0,0,0,255)
  1694. interface_s.DefaultTheme.Textbox.BorderColor = gfx.getHexColor(255,200,200,255)
  1695. interface_s.DefaultTheme.Textbox.TextColor = gfx.getHexColor(255,255,255,255)
  1696. interface_s.DefaultTheme.Textbox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1697. interface_s.DefaultTheme.Textbox.PointerColor = gfx.getHexColor(255,255,255,255)
  1698. interface_s.DefaultTheme.Textbox.UnfocusedBorderColor = gfx.getHexColor(200,200,200,255)
  1699.  
  1700. interface_s.DefaultTheme.Checkbox.BorderColor = gfx.getHexColor(255,255,255,255)
  1701. interface_s.DefaultTheme.Checkbox.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1702. interface_s.DefaultTheme.Checkbox.CheckColor = gfx.getHexColor(255,255,255,255)
  1703. interface_s.DefaultTheme.Checkbox.UnfocusedCheckColor = gfx.getHexColor(150,150,150,255)
  1704. interface_s.DefaultTheme.Checkbox.TextColor = gfx.getHexColor(255,255,255,255)
  1705. interface_s.DefaultTheme.Checkbox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1706.  
  1707. interface_s.DefaultTheme.Listbox.BackColor = gfx.getHexColor(0,0,0,255)
  1708. interface_s.DefaultTheme.Listbox.BorderColor = gfx.getHexColor(255,255,255,255)
  1709. interface_s.DefaultTheme.Listbox.SelectionColor = gfx.getHexColor(255,255,255,255)
  1710. interface_s.DefaultTheme.Listbox.SelectionTextColor = gfx.getHexColor(0,0,0,255)
  1711. interface_s.DefaultTheme.Listbox.TextColor = gfx.getHexColor(255,255,255,255)
  1712. interface_s.DefaultTheme.Listbox.MouseOverColor = gfx.getHexColor(255,255,255,50)
  1713. interface_s.DefaultTheme.Listbox.UnfocusedBackColor = gfx.getHexColor(0,0,0,255)
  1714. interface_s.DefaultTheme.Listbox.UnfocusedBorderColor = gfx.getHexColor(150,150,150,255)
  1715. interface_s.DefaultTheme.Listbox.UnfocusedSelectionColor = gfx.getHexColor(150,150,150,255)
  1716. interface_s.DefaultTheme.Listbox.UnfocusedSelectionTextColor = gfx.getHexColor(0,0,0,255)
  1717. interface_s.DefaultTheme.Listbox.UnfocusedTextColor = gfx.getHexColor(150,150,150,255)
  1718. interface_s.DefaultTheme.Listbox.UnfocusedMouseOverColor = gfx.getHexColor(150,150,150,50)
  1719.  
  1720. interface_s.DefaultTheme.Selection.BackColor = gfx.getHexColor(140,140,200,70)
  1721. --=================================================================--
  1722. --                         THEME END                               --
  1723. --=================================================================--
  1724. local function round(n)
  1725.   return math.floor(n+0.5)
  1726. end
  1727. --==========================Zoom gfx============================--
  1728. local isZoomActive = false
  1729. local zoomPixelSize = -1
  1730. local zoomWidthInRealPixels = -1
  1731. local zoomRealPositionX = -1
  1732. local zoomRealPositionY = -1
  1733. local zoomWindowPositionX = -1
  1734. local zoomWindowPositionY = -1
  1735. local zoomWindowSize = -1
  1736. local function getZoomInfo()
  1737.   isZoomActive=false
  1738.   if sim.adjustCoords(sim.XRES-1,5)~=sim.XRES-1 then
  1739.     isZoomActive=true
  1740.     local x,y = sim.adjustCoords(sim.XRES-1,2)
  1741.     zoomRealPositionX = x
  1742.     zoomRealPositionY = y
  1743.     local i=sim.XRES-2
  1744.     while x==sim.adjustCoords(i,2) do
  1745.       i=i-1
  1746.     end
  1747.     zoomPixelSize = sim.XRES-i-1
  1748.     i=zoomPixelSize
  1749.     while sim.adjustCoords(sim.XRES-i,2)~=sim.XRES-i do
  1750.       i=i+zoomPixelSize
  1751.     end
  1752.     zoomWidthInRealPixels = (i-zoomPixelSize)/zoomPixelSize
  1753.     zoomRealPositionX=zoomRealPositionX-zoomWidthInRealPixels+1
  1754.     zoomWindowPositionX = sim.XRES-i+zoomPixelSize
  1755.     if tpt.version.jacob1s_mod~=nil then
  1756.       zoomWindowPositionY = 1
  1757.     else
  1758.       zoomWindowPositionY = 0
  1759.     end
  1760.     zoomWindowSize = zoomPixelSize*zoomWidthInRealPixels
  1761.   else
  1762.     if sim.adjustCoords(1,5)~=1 then
  1763.       isZoomActive=true
  1764.       local x,y = sim.adjustCoords(1,2)
  1765.       zoomRealPositionX = x
  1766.       zoomRealPositionY = y
  1767.       local i=2
  1768.       while x==sim.adjustCoords(i,2) do
  1769.         i=i+1
  1770.       end
  1771.       if tpt.version.jacob1s_mod~=nil then
  1772.         zoomPixelSize = i-1
  1773.       else
  1774.         zoomPixelSize = i
  1775.       end
  1776.       i=zoomPixelSize
  1777.       while sim.adjustCoords(i,2)~=i do
  1778.         i=i+zoomPixelSize
  1779.       end
  1780.       zoomWidthInRealPixels = (i-zoomPixelSize)/zoomPixelSize
  1781.       if tpt.version.jacob1s_mod~=nil then
  1782.         zoomWindowPositionX = 1
  1783.         zoomWindowPositionY = 1
  1784.       else
  1785.         zoomWindowPositionX = 0
  1786.         zoomWindowPositionY = 0
  1787.       end
  1788.       zoomWindowSize = zoomPixelSize*zoomWidthInRealPixels+1
  1789.     end
  1790.   end
  1791. end
  1792.  
  1793. local function CoordinatesToZoomWindow(x,y)
  1794.   return zoomWindowPositionX+(x-zoomRealPositionX)*zoomPixelSize,zoomWindowPositionY+(y-zoomRealPositionY)*zoomPixelSize
  1795. end
  1796.  
  1797. local function drawPixelInZoomWindow(x,y,r,g,b,a)
  1798.   if isZoomActive then
  1799.     x = round(x)
  1800.     y = round(y)
  1801.     if x>=zoomRealPositionX and x<zoomRealPositionX+zoomWidthInRealPixels and y>=zoomRealPositionY and y<zoomRealPositionY+zoomWidthInRealPixels then
  1802.       local posX,posY = CoordinatesToZoomWindow(x,y)
  1803.       graphics.fillRect(posX,posY,zoomPixelSize-1,zoomPixelSize-1,r,g,b,a)
  1804.     end
  1805.   end
  1806. end
  1807. --==========================Zoom gfx end========================--
  1808.  
  1809. local Ruler = elements.allocate("ssccsscc", "RULER")
  1810. elements.property(Ruler, "Name", "RULR")
  1811. elements.property(Ruler, "Color", RulerColor)
  1812. elements.property(Ruler, "MenuSection", 13)
  1813. elements.property(Ruler, "MenuVisible", 1)
  1814.  
  1815. local function draw(x1,y1,x2,y2,r,g,b,a)
  1816.   getZoomInfo()
  1817.   local dx = x2 - x1
  1818.   local dy = y2 - y1
  1819.   local step = math.abs(dy)
  1820.   if (math.abs(dx) >= step) then
  1821.     step = math.abs(dx)
  1822.   end
  1823.   dx = dx / step
  1824.   dy = dy / step
  1825.   local x = x1
  1826.   local y = y1
  1827.   local i = 1
  1828.   while (i <= step) do
  1829.     tpt.drawpixel(x, y, r, g, b, a)
  1830.     drawPixelInZoomWindow(x, y, r, g, b, a)
  1831.     x = x + dx
  1832.     y = y + dy
  1833.     i = i + 1;
  1834.   end
  1835. end
  1836.  
  1837. local function getPixelCount(x1,y1,x2,y2)
  1838.   local dx = x2 - x1
  1839.   local dy = y2 - y1
  1840.   if (math.abs(dx) >= math.abs(dy)) then
  1841.     return math.abs(dx)
  1842.   else
  1843.     return math.abs(dy)
  1844.   end
  1845. end
  1846.  
  1847. local isFirstPointSet = false
  1848. local startX,startY = 0,0
  1849.  
  1850. local function onStep(mx,my)
  1851.   if (elements[tpt.selectedl]==Ruler) or (elements[tpt.selectedr]==Ruler) or (elements[tpt.selecteda]==Ruler) then
  1852.     if isFirstPointSet then
  1853.       mx,my = sim.adjustCoords(mx, my)
  1854.       draw(startX,startY,mx,my,graphics.getColors(RulerColor))
  1855.     end
  1856.   end
  1857. end
  1858. interface_s.AddOnStepAction(onStep)
  1859.  
  1860. local function onClick(mousex, mousey, event, button,wheel)
  1861.   if event==mouseEvents.Down then
  1862.     if (elements[tpt.selectedl]==Ruler and button==1) or (elements[tpt.selectedr]==Ruler and button==4) or (elements[tpt.selecteda]==Ruler and button==2) then
  1863.       if mousex<sim.XRES and mousey<sim.YRES then
  1864.         if isFirstPointSet then
  1865.           mousex,mousey = sim.adjustCoords(mousex, mousey)
  1866.           tpt.log(getPixelCount(startX,startY,mousex,mousey)+1)
  1867.           isFirstPointSet = false
  1868.         else
  1869.           startX,startY = sim.adjustCoords(mousex, mousey)
  1870.           isFirstPointSet = true
  1871.         end
  1872.         return true
  1873.       end
  1874.     end
  1875.   end
  1876. end
  1877. interface_s.AddOnClickAction(onClick)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement