Advertisement
anonymous1184

ClipHistory.ahk

Jan 23rd, 2021
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. class ClipHistory
  2. {
  3.  
  4.     static _data := []
  5.         , _skip := false
  6.         , _histSize := 0
  7.         , _filePath := ""
  8.         , _snippets := ""
  9.         , _prevClip := ""
  10.  
  11.     __New(conf)
  12.     {
  13.         if (!FileExist(conf))
  14.         {
  15.             MsgBox, 0x10, > ClipHistory, % conf " not found"
  16.             return
  17.         }
  18.         IniRead, filePath, % conf, CLIPBOARD, path
  19.         if (!InStr(FileExist(filePath), "D"))
  20.         {
  21.             MsgBox, 0x10, > ClipHistory, % "Bad path, check " conf
  22.             return
  23.         }
  24.         this._filePath := filePath
  25.  
  26.         IniRead, key1, % conf, CLIPBOARD, key1, 0
  27.         if (key1)
  28.         {
  29.             menuHist := ObjBindMethod(this, "_histMenu")
  30.             Hotkey, % key1, % menuHist
  31.             OnClipboardChange(ObjBindMethod(this, "_monitor"))
  32.         }
  33.         else
  34.         {
  35.             return
  36.         }
  37.  
  38.         IniRead, histSize, % conf, CLIPBOARD, size, 49
  39.         if histSize is digit
  40.         {
  41.             this._histSize := (histSize > 99 ? 99 : histSize)
  42.         }
  43.         else
  44.         {
  45.             this._histSize := 49
  46.         }
  47.  
  48.         IniRead, key2, % conf, CLIPBOARD, key2, 0
  49.         if (key2)
  50.         {
  51.             snipsMenu := ObjBindMethod(this, "_snipsMenu")
  52.             Hotkey, % key2, % snipsMenu
  53.             IniRead, snippets, % conf, SNIPPETS
  54.             loop, Parse, snippets, `n, `r
  55.             {
  56.                 if (A_Index > 9)
  57.                 {
  58.                     break
  59.                 }
  60.                 this._snippets .= A_LoopField "`n"
  61.             }
  62.         }
  63.     }
  64.  
  65.     restore(secs := 0)
  66.     {
  67.         if (secs)
  68.         {
  69.             fn := ObjBindMethod(this, "restore")
  70.             SetTimer, % fn, % secs * -1000
  71.         }
  72.         else
  73.         {
  74.             this._skip := true
  75.             Clipboard := this._prevClip
  76.             this._prevClip := ""
  77.         }
  78.     }
  79.  
  80.     skip(copy := false)
  81.     {
  82.         this._skip := true
  83.         this._prevClip := ClipboardAll
  84.         Clipboard := ""
  85.         if (copy = true)
  86.         {
  87.             SendInput, ^{Insert} ; Sadly Chr(3) doesn't work
  88.             ClipWait
  89.         }
  90.         else if (copy)
  91.         {
  92.             Clipboard := copy
  93.             ClipWait
  94.         }
  95.         return (copy ? Clipboard : true)
  96.     }
  97.  
  98.     _cancel()
  99.     {
  100.     }
  101.  
  102.     _clear()
  103.     {
  104.         FileDelete, % this._filePath "\*.clip"
  105.     }
  106.  
  107.     _histMenu()
  108.     {
  109.         clipFiles := ""
  110.         loop, Files, % this._filePath "\*.clip"
  111.         {
  112.             clipFiles .= A_LoopFileFullPath "`n"
  113.         }
  114.  
  115.         ; No History
  116.         if (!clipFiles)
  117.         {
  118.             return
  119.         }
  120.         Sort, clipFiles, R
  121.  
  122.         ; (Re)Set
  123.         this._filePaths := []
  124.         , this._data["hist"] := []
  125.         , fnClear := ObjBindMethod(this, "_clear")
  126.         , fnCancel := ObjBindMethod(this, "_cancel")
  127.         , fnAction := ObjBindMethod(this, "_historyPaste")
  128.  
  129.         loop, Parse, % RTrim(clipFiles, "`n"), `n
  130.         {
  131.             if (A_Index > this._histSize)
  132.             {
  133.                 FileDelete, % A_LoopField
  134.                 continue
  135.             } ; Max History, FIFO mode.
  136.  
  137.             FileRead, txtConts, % "*P1200 " A_LoopField
  138.             index := Format("{:02}", A_Index)
  139.             , clipTitle := SubStr(txtConts, 1, 60)
  140.             , this._filePaths[A_Index] := A_LoopField
  141.             , this._data["hist"][A_Index] := txtConts
  142.             , this._histMenuBuild(index, clipTitle)
  143.         }
  144.         Menu, clipMenu, Add
  145.         Menu, clipMenu, Add, C&lear, % fnClear
  146.         Menu, clipMenu, Add, &Cancel, % fnCancel
  147.         Menu, clipMenu, Show
  148.  
  149.         ; Cleanup
  150.         Menu, clipMenu, DeleteAll
  151.         loop, 9
  152.         {
  153.             Menu, % "clipSub"A_Index, Add
  154.             Menu, % "clipSub"A_Index, DeleteAll
  155.         }
  156.     }
  157.  
  158.     _histMenuBuild(index, title)
  159.     {
  160.         lDigit := SubStr(index, 1, 1)
  161.         , rDigit := SubStr(index, 0, 1)
  162.         , title := StrReplace(title, "&", "&&")
  163.         , fnPaste := ObjBindMethod(this, "_paste", "hist", "dummy", index)
  164.  
  165.         if (lDigit = "0")
  166.         {
  167.             Menu, clipMenu, Add, % "&" rDigit ") " title, % fnPaste
  168.         }
  169.         else
  170.         {
  171.             Menu, % "clipSub" lDigit, Add, % index ") " title, % fnPaste
  172.         }
  173.         if (rDigit = "0")
  174.         {
  175.             Menu, clipMenu, Add, % "(" lDigit "0-" lDigit "9)", % ":clipSub" lDigit
  176.         }
  177.     }
  178.  
  179.     _monitor(type)
  180.     {
  181.         if (this._skip)
  182.         {
  183.             this._skip := false
  184.         }
  185.         else if (Clipboard && type = 1) ; 1=text, 2=image
  186.         {
  187.             ; Dupes
  188.             loop, Files, % this._filePath "\*.clip"
  189.             {
  190.                 FileRead, data, % "*P1200 "  A_LoopFileFullPath
  191.                 if (Clipboard = data)
  192.                 {
  193.                     FileDelete, % A_LoopFileFullPath
  194.                     break
  195.                 }
  196.             }
  197.             FileAppend, % Clipboard, % this._filePath "\" A_now ".clip", CP1200
  198.         }
  199.     }
  200.  
  201.     _paste(type, dummy, index)
  202.     {
  203.         if (type = "snip")
  204.         {
  205.             this._skip := true
  206.         }
  207.         Clipboard := ""
  208.         Clipboard := this._data[type][index]
  209.         ClipWait
  210.         SendInput, % Chr(22) ; || +{Insert}
  211.     }
  212.  
  213.     _snipsMenu()
  214.     {
  215.         static built := false
  216.         if (!built)
  217.         {
  218.             this._data["snip"] := []
  219.             , snippets := RTrim(this._snippets, "`n")
  220.             , fnCancel := ObjBindMethod(this, "_cancel")
  221.             , fnPaste := ObjBindMethod(this, "_paste", "snip")
  222.             loop, Parse, snippets, `n
  223.             {
  224.                 snip := StrSplit(A_LoopField, "=",, 2)
  225.                 , this._data["snip"][A_Index] := snip[2]
  226.                 Menu, clipSnips, Add, % "(&" A_Index ") " snip[1], % fnPaste
  227.             }
  228.             Menu, clipSnips, Add
  229.             Menu, clipSnips, Add, &Cancel, % fnCancel
  230.             built := true
  231.         }
  232.         Menu, clipSnips, Show
  233.     }
  234.  
  235. }
  236.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement