Advertisement
artemx32

my personal text entry

Dec 30th, 2016
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.28 KB | None | 0 0
  1.  
  2. local function Inrange( v, min, max )
  3.  
  4.     return ( ( v >= min ) and ( v <= max ) )
  5.  
  6. end
  7.  
  8. local left_border_offset = 40
  9. local char_w = 7
  10. local char_h = 20
  11. local ForceErase = false
  12.  
  13. local F = vgui.Create('DFrame')
  14. F:SetSize(500, 500)
  15. F:Center()
  16. F:SetTitle('ENTITY FIRMWARE (VERTEX JSON SCRIPT)')
  17. F:SetSizable(true)
  18. F:MakePopup()
  19.  
  20. F.TextField = vgui.Create('Panel', F)
  21. F.TextField:Dock(FILL)
  22. F.TextField.TEXT = 'lol kek\nchaburek\nYA EBU SOBAAAAAAAAAAAAK'
  23. F.TextField.CaretPos = { 1, 1 }
  24. F.TextField.Scroll = { 0, 0 }
  25. F.TextField.DirectPos = 1
  26.  
  27. local function pasteSymbol(c)
  28.    
  29.     local A = string.Explode('\n', F.TextField.TEXT)
  30.     local B = { }
  31.    
  32.    
  33.     for i, kv in pairs(A) do
  34.        
  35.         local chars = string.Explode('', kv)
  36.        
  37.         table.insert(B, chars)
  38.        
  39.     end
  40.    
  41.     table.insert(B[F.TextField.CaretPos[2]], F.TextField.CaretPos[1], c)
  42.    
  43.     local tmp = ''
  44.    
  45.     for i, kv in pairs(B) do
  46.        
  47.         local strline = table.concat(kv, '')
  48.        
  49.         tmp = tmp .. strline .. ( i < #B and '\n' or '' )
  50.        
  51.     end
  52.    
  53.     F.TextField.TEXT = tmp
  54.     F.TextField.CaretPos[1] = (c == '    ') and F.TextField.CaretPos[1] + 4 or F.TextField.CaretPos[1] + 1
  55.    
  56. end
  57.  
  58. local function getTextTable()
  59.    
  60.     local A = string.Explode('\n', F.TextField.TEXT)
  61.     local B = { }
  62.    
  63.     for i, kv in pairs(A) do
  64.        
  65.         local chars = string.Explode('', kv)
  66.        
  67.         table.insert(B, chars)
  68.        
  69.     end
  70.    
  71.     return B
  72.    
  73. end
  74.  
  75. local function backToText(t)
  76.    
  77.     local tmp = ''
  78.    
  79.     for i, kv in pairs(t) do
  80.        
  81.         local strline = table.concat(kv, '')
  82.        
  83.         tmp = tmp .. strline .. ( i < #t and '\n' or '' )
  84.        
  85.     end
  86.    
  87.     F.TextField.TEXT = tmp
  88.    
  89. end
  90.  
  91. local function caretLeft()
  92.  
  93.     if F.TextField.CaretPos[1]-1 < 1 and F.TextField.CaretPos[2]-1 > 0 then
  94.        
  95.         local t = getTextTable()
  96.         local prevT = table.concat(t[F.TextField.CaretPos[2]-1], '')
  97.        
  98.         F.TextField.CaretPos[1] = string.len(prevT)+1
  99.         F.TextField.CaretPos[2] = F.TextField.CaretPos[2] - 1
  100.        
  101.     else
  102.        
  103.         F.TextField.CaretPos = {F.TextField.CaretPos[1]-1, F.TextField.CaretPos[2]}
  104.        
  105.     end
  106.  
  107. end
  108.  
  109. local function caretRight()
  110.    
  111.     local t = getTextTable()
  112.    
  113.     if F.TextField.CaretPos[2] < #t+1 then
  114.        
  115.         local prevT = table.concat(t[F.TextField.CaretPos[2]], '')
  116.        
  117.         if F.TextField.CaretPos[1] > string.len(prevT) and F.TextField.CaretPos[2] < #t then
  118.            
  119.             F.TextField.CaretPos[1] = 1
  120.             F.TextField.CaretPos[2] = F.TextField.CaretPos[2] + 1
  121.            
  122.         elseif F.TextField.CaretPos[1] < string.len(prevT)+1 then
  123.            
  124.             F.TextField.CaretPos = {F.TextField.CaretPos[1]+1, F.TextField.CaretPos[2]}
  125.            
  126.         end
  127.        
  128.     end
  129.    
  130. end
  131.  
  132. local function erasing()
  133.    
  134.     if input.IsKeyDown(KEY_BACKSPACE) then
  135.        
  136.         ForceErase = true
  137.         timer.Stop('ERASER')
  138.        
  139.     end
  140.    
  141. end
  142.  
  143. timer.Create('ERASER', 0.5, 0, erasing )
  144. timer.Stop('ERASER')
  145.  
  146.  
  147. local function deleteSymbol(caretX, caretY)
  148.    
  149.     -- берём текущую строку, и удаляем из неё символ
  150.    
  151.     local tt = getTextTable()
  152.    
  153.     local T = tt[caretY]
  154.     local T2 = tt[caretY-1]
  155.    
  156.     local BOOL = caretY > 1 and caretX-1 > -1 or caretX-1 > 0
  157.    
  158.     if BOOL then
  159.        
  160.         table.remove(T, caretX-1)
  161.        
  162.         tt[caretY] = T
  163.        
  164.         caretLeft()
  165.        
  166.         if caretX == 1 then
  167.            
  168.             table.Add(T2, T)
  169.             tt[caretY] = T2
  170.            
  171.             table.remove(tt, caretY)
  172.            
  173.         end
  174.        
  175.         backToText(tt)
  176.        
  177.     end
  178.    
  179. end
  180.  
  181. F.TextField.Keys = {
  182.     [1] = '0';
  183.     [2] = '1';
  184.     [3] = '2';
  185.     [4] = '3';
  186.     [5] = '4';
  187.     [6] = '5';
  188.     [7] = '6';
  189.     [8] = '7';
  190.     [9] = '8';
  191.     [10] = '9';
  192.     [11] = 'a';
  193.     [12] = 'b';
  194.     [13] = 'c';
  195.     [14] = 'd';
  196.     [15] = 'e';
  197.     [16] = 'f';
  198.     [17] = 'g';
  199.     [18] = 'h';
  200.     [19] = 'i';
  201.     [20] = 'j';
  202.     [21] = 'k';
  203.     [22] = 'l';
  204.     [23] = 'm';
  205.     [24] = 'n';
  206.     [25] = 'o';
  207.     [26] = 'p';
  208.     [27] = 'q';
  209.     [28] = 'r';
  210.     [29] = 's';
  211.     [30] = 't';
  212.     [31] = 'u';
  213.     [32] = 'v';
  214.     [33] = 'w';
  215.     [34] = 'x';
  216.     [35] = 'y';
  217.     [36] = 'z';
  218.  
  219.     [53] = '[';
  220.     [54] = ']';
  221.     [55] = ';';
  222.     [56] = "'";
  223.     [60] = '/';
  224.     [58] = ',';
  225.     [59] = '.';
  226.     [61] = '\\';
  227.     [62] = '-';
  228.     [63] = '=';
  229.     [64] = '\n';
  230.     [65] = ' ';
  231.     [67] = '    ';
  232. }
  233.  
  234. F.TextField.ShiftKeys = {
  235.    
  236.     [1] = ')';
  237.     [2] = '!';
  238.     [3] = '@';
  239.     [4] = '#';
  240.     [5] = '$';
  241.     [6] = '%';
  242.     [7] = '^';
  243.     [8] = '&';
  244.     [9] = '*';
  245.     [10] = '(';
  246.     [62] = '_';
  247.     [63] = '+';
  248.     [53] = '{';
  249.     [55] = ':';
  250.     [56] = '"';
  251.     [58] = '<';
  252.     [59] = '>';
  253.     [54] = '}';
  254.     [60] = '?';
  255.     [61] = '|';
  256.    
  257.    
  258. }
  259.  
  260. F.TextField.Paint = function(self, w, h)
  261.  
  262.     draw.RoundedBox(5, 0, 0, w, h, Color(25, 25, 25))
  263.  
  264.     draw.NoTexture()
  265.     surface.SetTextColor( 255, 255, 255, 255 )
  266.     surface.SetFont('DermaDefault')
  267.  
  268.     local s = string.Explode('\n', self.TEXT)
  269.  
  270.     local lnc = 0
  271.  
  272.     draw.NoTexture()
  273.     surface.SetDrawColor(70, 70, 70, 255)
  274.     surface.DrawRect(5, 0, left_border_offset-10, h)
  275.    
  276.     for id, line in pairs(s) do
  277.        
  278.         surface.SetTextPos(10, 20+id*char_h - char_h)
  279.         surface.DrawText(tostring(id))
  280.        
  281.         for ID, char in pairs(string.Explode('', line)) do
  282.            
  283.             lnc = lnc + 1
  284.            
  285.             surface.SetTextPos(left_border_offset+ID*char_w - char_w, 20+id*char_h - char_h)
  286.             surface.DrawText(char)
  287.            
  288.         end
  289.        
  290.     end
  291.  
  292.     draw.NoTexture()
  293.     surface.SetDrawColor( 255, 255, 255, 255+math.sin(CurTime()*5)*255 )
  294.     surface.DrawRect( self.CaretPos[1]*char_w + left_border_offset - char_w, self.CaretPos[2]*char_h, 2, 10 )
  295.    
  296.     // little thinking
  297.    
  298.     if ForceErase then
  299.        
  300.         deleteSymbol(F.TextField.CaretPos[1], F.TextField.CaretPos[2])
  301.        
  302.     end
  303.    
  304. end
  305.  
  306. F.TextField.OnMousePressed = function(self, mcode)
  307.    
  308.     local s = string.Explode('\n', self.TEXT)
  309.    
  310.     if mcode == MOUSE_LEFT then
  311.    
  312.         local x, y = self:LocalCursorPos()
  313.        
  314.         for id = 0, #s do
  315.            
  316.             local line = s[id == 0 and 1 or id]
  317.            
  318.             for ID = 0, #string.Explode('', line) do
  319.                
  320.                 local char = string.Explode('', line)[ID]
  321.                
  322.                 local x___lastSymbol = ID < #line and ( left_border_offset+(ID*char_w)+char_w*1.5 ) or ( self:GetWide() - left_border_offset+(ID*char_w)-char_w/2 )
  323.                
  324.                 if Inrange( x, left_border_offset+(ID*char_w)-char_w/2, x___lastSymbol ) and Inrange( y, (id*char_h), (id*char_h)+char_h ) then
  325.                    
  326.                     F.TextField.CaretPos = { ID+1, id } -- x, y
  327.                     F.DirectPos = id*ID
  328.                    
  329.                 end
  330.            
  331.             end
  332.            
  333.         end
  334.        
  335.         self:RequestFocus()
  336.         --self:SetSelected(true)
  337.         --self:MakePopup()
  338.  
  339.     end
  340.  
  341. end
  342.  
  343. F.TextField.OnKeyCodePressed = function(self, key)
  344.     chat.AddText(''..key)
  345.     for i, VAL in pairs(self.Keys) do
  346.        
  347.         if key == i then
  348.            
  349.             if input.IsKeyDown(KEY_LSHIFT) then
  350.                
  351.                 if self.ShiftKeys[i] != nil then
  352.                    
  353.                     pasteSymbol(self.ShiftKeys[i])
  354.                    
  355.                 else
  356.                    
  357.                     pasteSymbol(string.upper(VAL))
  358.                    
  359.                 end
  360.                
  361.             else
  362.                
  363.                 pasteSymbol(VAL)
  364.                
  365.             end
  366.            
  367.         end
  368.        
  369.         if key == 64 and i == 64 then
  370.            
  371.             F.TextField.CaretPos = {1, F.TextField.CaretPos[2]+1}
  372.            
  373.         end
  374.        
  375.         if key == 89 and i == 1 then
  376.            
  377.             caretLeft()
  378.            
  379.         end
  380.        
  381.         if key == 91 and i == 1 then
  382.            
  383.             caretRight()
  384.            
  385.         end
  386.        
  387.         if key == 67 and i == 1 then
  388.            
  389.             self:StartBoxSelection()
  390.            
  391.         end
  392.        
  393.         if key == 66 and i == 1 then
  394.            
  395.             deleteSymbol(F.TextField.CaretPos[1], F.TextField.CaretPos[2])
  396.             timer.Start('ERASER')
  397.            
  398.         end
  399.        
  400.     end
  401.  
  402. end
  403.  
  404. F.TextField.OnKeyCodeReleased = function(self, key)
  405.    
  406.     if key == 66 then
  407.        
  408.         ForceErase = false
  409.         timer.Stop('ERASER')
  410.        
  411.     end
  412.    
  413. end
  414.  
  415. --btn.isEditing = true
  416.  
  417. F.OnClose = function()
  418.  
  419.     -- ~~
  420.    
  421.     timer.Remove('ERASER')
  422.    
  423.     --btn.isEditing = false
  424.  
  425. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement