It's complicated to explain if you have no idea what I am talking about, but the app is used to fuzzy match one file name to another. It's purpose is to match pictures and videos to rom names for use in front ends for Emulation, although there may be other uses. It was written in basic. It appears that some of the dll calls don't work properly in version 1.1.14.2. I attached the exe in case the code doesn't work properly for whatever version of AHK you are using.
Code: Select all
#NoTrayIcon
#SingleInstance Force
#NoEnv
#WinActivateForce
SetBatchLines, -1
DetectHiddenWindows, On
ScriptName := "Perfect Match"
ScriptIni = %A_ScriptDir%\%ScriptName%.ini
SetWorkingDir, %A_ScriptDir%
ShowSplash()
InitializeVars()
CreateGuis()
OnMessage(0x47, "WM_WINDOWPOSCHANGED")
OnMessage(0x112,"WM_SYSCOMMAND")
OnExit, ExitSub
Menu, tray, Icon
Sleep, 3000
DllCall("AnimateWindow","UInt",Splash_ID,"Int",1000,"UInt","0x90000")
;Gosub, ShowCredits
Return
#Include C:\Program Files (x86)\AutoHotkey\Lib\Robert's INI library Basic.ahk
#Include C:\Program Files (x86)\AutoHotkey\Lib\UnHtm.ahk
#Include C:\Program Files (x86)\AutoHotkey\Lib\Ansi2Unicode.ahk
;*************************************** Show Splash Screen ****************************************
ShowSplash()
{
Global
Gui, 1:Default
Gui, +LastFound
Gui1ID := WinExist()
LV_guiID := Gui1ID
GroupAdd, GuiNum1, ahk_id %Gui1ID%
Gui, 77:Default
Gui, +LastFound
Gui, +Owner1 +ToolWindow
Splash_ID:=WinExist()
Gui, -Caption +AlwaysOnTop +Border
Gui, Add, Picture, w1044 h798, PerfectLogo.jpg
Gui, Show, Hide
DllCall("AnimateWindow","UInt",Splash_ID,"Int",250,"UInt","0x16")
}
; ************************************* Initialize Variables ***************************************
InitializeVars()
{
Global
Error := RIni_Read(1, ScriptIni)
IniSections := RIni_GetSections(1)
If (Error = -11) OR (IniSections = "General") OR (IniSections = "")
{
FileDelete, %ScriptIni%
FileAppend,
(LTrim
[General]
LastProject=Default
HideMessages=
MessageOption=2
MessageTips=0
[Default]
MatchedRoms=
LastRomFolder=
LastArtFolder=
ArtFolderList=
RomExtensions=zip,7z
ArtExtensions=avi,bmp,flv,jpg,jpeg,mpg,mpeg,png,mp4
Recurse=0
MoveFiles=0
RemoveExact=0
Remove99=0
RomSquareBracket=0
RomCurlyBracket=0
RomRoundBracket=0
ArtSquareBracket=0
ArtCurlyBracket=0
ArtRoundBracket=0
RomTrimLeft=0
RomTrimRight=0
ArtTrimLeft=0
ArtTrimRight=0
Regex=[^a-zA-Z0-9& ]
ReplaceLV=vs\versus\X\X|gp\grand prix\X\X|bros\brothers\X\X|one\1\X\X|two\2\X\X|three\3\X\X|four\4\X\X|five\5\X\X|six\6\X\X|seven\7\X\X|eight\8\X\X|nine\9\X\X|Ten\10\X\X|I\1\X\X|II\2\X\X|III\3\X\X|IV\4\X\X|V\5\X\X|VI\6\X\X|VII\7\X\X|VIII\8\X\X|IX\9\X\X|X\10\X\X|VV\55\X\X|A\\X\X|, The\\X\X|The\\X\|
), %ScriptIni%
}
IniRead, LastProject, %ScriptIni%, General, LastProject, General
IniRead, HideMessages, %ScriptIni%, General, HideMessages
IniRead, MessageOption, %ScriptIni%, General, MessageOption
IniRead, MessageTips, %ScriptIni%, General, MessageTips
Keys := "MatchedRoms,LastRomFolder,LastArtFolder,ArtFolderList,RomExtensions,ArtExtensions,Recurse,MoveFiles,RemoveExact,Remove99,RomSquareBracket
,RomCurlyBracket,RomRoundBracket,ArtSquareBracket,ArtCurlyBracket,ArtRoundBracket,RomTrimLeft,RomTrimRight,ArtTrimLeft,ArtTrimRight,Regex,ReplaceLV"
Loop, Parse, Keys, `,
IniRead, %A_LoopField%, %ScriptIni%, %LastProject%, %A_LoopField%, %A_Space%
Loop, 3
MO%A_Index% := A_Index = MessageOption ? 1 : 0
Loop, 2
MT%A_Index% := A_Index = MessageTips ? 1 : 0
SplitPath, LastRomFolder,, OutExt
IllegalChars = \/:?<>*|"
Null =
Stop = 0
RefreshMatchLV = 1
;Delete Brackets
BracketTypes := "Round,Square,Curly"
RoundRegex := "\(.+?\)"
SquareRegex := "\[.+?]"
CurlyRegex := "\{.+?}"
; In Cell Editing
SetControlDelay,0
LV_EnableCVSmode = 0 ;makes column headers "A-Z"
LV_EnableLineNumbers=0 ;0 or 1 - add line numbers in column one or not - for in-cell editing
LV_FontSize = 10 ;specify font size for listview, static, edit controls - for in-cell editing
LV_EnableSingleClick = 1 ;whether or not to do cell highlighting on singleclick
LV_EnterRight = 1 ;when enter pressed, move cell highlight down or right
LV_AddRowsOnScroll = 0 ;if at last row and down arrow is pressed, add rows as needed
LV_AddColsOnScroll = 0 ;if at last col and right arrow is pressed, add columns as needed
LV_NewColWidth = 100 ;default width for new columns
Message1 := "`n Settings saved for XXX "
Message2 := "`n There are no projects to open. "
Message3 := "`n Select a project to open. "
Message4 := "`nEither select a project from the list or`ntype a new name into the box. "
Message5 := "`n Could not create folder. XXX "
Message6 := "`n XXX extensions have not been changed. "
Message7 := "`n There are no files with XXX extensions. `n You will need to set extensions to add YYY "
Message8 := "`n Use [...] to change primary art folder. "
Message9 := " Unable to get Rom names from XXX `n If you are positive that this a rom dat or xml file `n please report this error along with your file. "
Message10 := "`n You need to match your files first. "
Message11 := "`n You need to select at least one row. "
Message12 := "`n You need to select at least one file. "
Message13 := "`n You Have Not Set Your XXX Path. "
Message14 := "`n No Roms found. Please check for directory and extensions settings "
Message15 := "`n It would appear that all of your roms have an art file. "
Message16 := "`n XXX has been saved. "
Message17 := "`n Settings saved for XXX "
Message18 := "`n You need to match your files first. "
Message19 := "`n You need to select at least one row. "
Message20 := "`n You Have Not Set Your XXX Path. "
Message21 := "`n XXX extensions have not been changed. "
Message22 := "`n You need to select at least one row. "
Message23 := "`n You need to select at least one file. "
}
;***************************************************************************************************
;****************************************** Create Gui's *******************************************
;***************************************************************************************************
CreateGuis()
{
Global
Gui, 1:Default
Gui, +OwnDialogs
Gui, Margin, 0, 0
Gui, Color, FBA441, FBA441 ;AC201C
SysGet, CBW, 71
SysGet, CBH, 72
CBW-=2
CBH-=2
;******************************************* Match Tab *********************************************
Menu, ProjectMenu, Add, Open Project...%A_Tab%Ctrl+O, OpenProject
Menu, ProjectMenu, Add, Save Project%A_Tab%Ctrl+S, SaveProject
Menu, ProjectMenu, Add, Save Project As...%A_Tab%F12, SaveProjectAs
Menu, MyMenuBar, Add, Projects, :ProjectMenu
Menu, MyMenuBar, Add, Messages, MessageSettings ;:SettingsMenu
Menu, MyMenuBar, Add, Credits, ShowCredits
Menu, MyMenuBar, Color, FBA441
Gui, Menu, MyMenuBar
Gui, Add, Tab2, h708 w1010 vCurrentTab gChangeTabs, Settings||Match
Gui, Tab, Match
Gui, Add, Picture, x2 y22 w1006 h685 0x120E hwnddHwnd
Gui, Add, ListView, -ReadOnly x20 y40 r37 w800 +altsubmit vMatchLV gMatchLV_Events, RomName|Suggested ArtWork|Match `%|Hidden|Short Name
LV_ModifyCol(1,363)
LV_ModifyCol(2,363)
LV_ModifyCol(3,53)
LV_ModifyCol(3,"Integer")
LV_ModifyCol(4,0)
LV_ModifyCol(5,0)
Gui, Add, StatusBar, -Theme BackgroundFBA441 ;FF8040 A04020
SB_SetParts(150)
SB_SetText(" " ScriptName " by Matt McLemore AKA 'Tempest'", 2)
SB_SetText(" " LastProject)
Gui, Add, Button, x860 y110 w100 h30 vB10 gSelectAll, Select &All
Gui, Add, Button, xp y+10 w100 h30 vB11 gSelectNone, Select &None
Gui, Add, Button, xp y+35 w100 h30 vB12 gStartMatch, &Start Match
Gui, Add, Button, xp y+10 w100 h30 vB13 gStopMatch, Stop Match
Gui, Add, Button, xp y+35 w100 h30 vB14 gSearchArt, Search &Art Folder
Gui, Add, Button, xp y+10 w100 h30 vB15 gViewArt, &View Art
Gui, Add, Button, xp y+35 w100 h30 vB16 gMissList, Miss List
Gui, Add, Button, xp y+10 w100 h30 vB17 gRename, Rename
Gui, Add, Button, xp y+35 w100 h30 vB18 gRestart, Start Over
Gui, Add, Button, xp y+10 w100 h30 vB19 gExitSub, Quit
;****************************************** Settings Tab *******************************************
;Paths and Extensions
Gui, Tab, Settings
Gui, Add, Picture, x2 y22 w1006 h685 0x120E hwndcHwnd
Gui, Add, Text, BackgroundTrans x20 y40 w87, Rom/dat/xml Path
Gui, Add, Edit, x+10 yp-3 w325 r1 vLastRomFolder, %LastRomFolder%
Gui, Add, Button, x+10 yp-2 w25 vB1 gGetRomFolder, ...
Gui, Add, Text, BackgroundTrans x20 y+15 w87, Rom Extensions
Gui, Add, Edit, x+10 yp-3 w325 vRomExtensions gGuiPreview, %RomExtensions%
Gui, Add, Button, x+10 yp-2 w25 vExtButton gSetRomExtensions, Set
Control_Colors("ExtButton", "Set", "0x1C20AC")
Gui, Add, Text, BackgroundTrans x20 y+15 w87, Rom Preview File
Gui, Add, Edit, x+10 yp-3 w325 vRomPreviewFile gGuiPreview
Gui, Add, Button, x+10 yp-2 w25 vB2 gGetRomPreviewFile, ...
StringTrimLeft, TempVar, ArtFolderList, 1
Gui, Add, Text, BackgroundTrans Section x490 y40 w73, Art Path
Gui, Add, DropDownList, cbFBA441 x+10 yp-3 w325 0x80 vLastArtFolder gSetArtPreview, %TempVar%
Gui, Add, Button, x+10 yp-2 w25 vNewArtFolder gGetArtFolder, ...
Control_Colors("NewArtFolder", "Set", "0x1C20AC")
Gui, Add, Button, x+8 yp w25 vAddArtFolder gGetArtFolder, Add
Control_Colors("AddArtFolder", "Set", "0x1C20AC")
Gui, Add, Button, x+8 yp w25 vDelArtFolder gDelArtFolder, Del
Control_Colors("DelArtFolder", "Set", "0x1C20AC")
Gui, Add, Text, BackgroundTrans xs y+15 w73, Art Extensions
Gui, Add, Edit, x+10 yp-3 w325 vArtExtensions gGuiPreview, %ArtExtensions%
Gui, Add, Button, x+10 yp-2 w25 vB3 gSetArtExtensions, Set
Gui, Add, Text, BackgroundTrans xs y+15 w73, Art Preview File
Gui, Add, Edit, x+10 yp-3 w325 vArtPreviewFile gGuiPreview
Gui, Add, Button, x+10 yp-2 w25 vB4 gGetArtPreviewFile, ...
;Rom Brackets Options
Gui, Add, GroupBox, Section x25 y145 w250 h180
Gui, Add, Edit, Disabled xp+20 yp w117
Gui, Add, Text, xs+24 yp+3, Delete Brackets (Rom)
Gui, Add, Text, BackgroundTrans xs+20 yp+25, %A_Space%[ ... ]
Gui, Add, Edit, xp+35 yp-3 w30 Number vRomSquareBracket gGuiPreview Limit1
Gui, Add, UpDown, cRed x+5 yp Range-5-5 Wrap, %RomSquareBracket%
Gui, Add, Text, BackgroundTrans x+5 yp+3, Bracket Block
Gui, Add, Text, BackgroundTrans xs+20 yp+30, %A_Space%{ ... }
Gui, Add, Edit, xp+35 yp-3 w30 Number vRomCurlyBracket gGuiPreview Limit1
Gui, Add, UpDown, x+5 yp Range-5-5 Wrap, %RomCurlyBracket%
Gui, Add, Text, BackgroundTrans x+5 yp+3, Bracket Block
Gui, Add, Text, BackgroundTrans xs+20 yp+30, %A_Space%( ... )
Gui, Add, Edit, xp+35 yp-3 w30 Number vRomRoundBracket gGuiPreview Limit1
Gui, Add, UpDown, x+5 yp Range-5-5 Wrap, %RomRoundBracket%
Gui, Add, Text, BackgroundTrans x+5 yp+3, Bracket Block
Gui, Add, Text, BackgroundTrans xs+20 yp+35 w150, Rom Bracket Preview
Gui, Add, Edit, xp yp+20 w210 ReadOnly vRomBracketResult
;RomTrim
Gui, Add, GroupBox, Section xs yp+47 w250 h155
Gui, Add, Edit, Disabled xp+20 yp w115
Gui, Add, Text, xs+24 yp+3, Trim Characters (Rom)
Gui, Add, Edit, xs+20 yp+25 w30 Number vRomTrimLeft gGuiPreview Limit1
Gui, Add, UpDown, yp Range0-9 Wrap, %RomTrimLeft%
Gui, Add, Text, BackgroundTrans xp+35 yp+3, Left Side
Gui, Add, Edit, xs+20 yp+30 w30 Number vRomTrimRight gGuiPreview Limit1
Gui, Add, UpDown, yp Range0-9 Wrap, %RomTrimRight%
Gui, Add, Text, BackgroundTrans xp+35 yp+3, Right Side
Gui, Add, Text, BackgroundTrans xs+20 yp+35 w150, Rom Trim Preview
Gui, Add, Edit, xp yp+20 w210 ReadOnly vRomTrimResult
Recurse = 0
;Match Options
Gui, Add, GroupBox, Section xs yp+47 h200 w250
Gui, Add, Edit, Disabled xp+20 yp w78
Gui, Add, Text, xs+24 yp+3, Match Options
Gui, Add, CheckBox, xs+20 yp+30 w%CBW% h%CBH% vRecurse gGuiPreview Checked%Recurse%
Gui, Add, Text, BackgroundTrans x+0 yp, % " Scan Rom Sub-Folders"
Gui, Add, CheckBox, xs+20 yp+30 w%CBW% h%CBH% vMoveFiles gGuiPreview Checked%MoveFiles%
Gui, Add, Text, BackgroundTrans x+ yp, % " Delete Original Art"
Gui, Add, CheckBox, xs+20 yp+30 w%CBW% h%CBH% vRemoveExact gGuiPreview Checked%RemoveExact%
Gui, Add, Text, BackgroundTrans x+ yp, % " Remove 100`% matches from search"
Gui, Add, CheckBox, xs+20 yp+30 w%CBW% h%CBH% vRemove99 Checked%Remove99%
Gui, Add, Text, BackgroundTrans x+ yp, % " Remove 99.9`% matches from search"
Gui, Add, Text, BackgroundTrans x-20 y-20 vRegion, Region
; Gui, Add, Text, BackgroundTrans xp yp+30, Match Rom to Art
;Art Brackets Options
Gui, Add, GroupBox, Section x298 y145 w250 h180
Gui, Add, Edit, Disabled xp+20 yp w107
Gui, Add, Text, xs+24 yp+3, Delete Brackets (Art)
Gui, Add, Text, BackgroundTrans xs+20 yp+25, %A_Space%[ ... ]
Gui, Add, Edit, xp+35 yp-3 w30 Number vArtSquareBracket gGuiPreview Limit1
Gui, Add, UpDown, x+5 yp Range-5-5 Wrap, %ArtSquareBracket%
Gui, Add, Text, BackgroundTrans x+5 yp+3, Bracket Block
Gui, Add, Text, BackgroundTrans xs+20 yp+30, %A_Space%{ ... }
Gui, Add, Edit, xp+35 yp-3 w30 Number vArtCurlyBracket gGuiPreview Limit1
Gui, Add, UpDown, x+5 yp Range-5-5 Wrap, %ArtCurlyBracket%
Gui, Add, Text, BackgroundTrans x+5 yp+3, Bracket Block
Gui, Add, Text, BackgroundTrans xs+20 yp+30, %A_Space%( ... )
Gui, Add, Edit, xp+35 yp-3 w30 Number vArtRoundBracket gGuiPreview Limit1
Gui, Add, UpDown, x+5 yp Range-5-5 Wrap, %ArtRoundBracket%
Gui, Add, Text, BackgroundTrans x+5 yp+3, Bracket Block
Gui, Add, Text, BackgroundTrans xs+20 yp+35 w150, Art Bracket Preview
Gui, Add, Edit, xp yp+20 w210 ReadOnly vArtBracketResult
;ArtTrim
Gui, Add, GroupBox, xs yp+47 w250 h155
Gui, Add, Edit, Disabled xp+20 yp w105
Gui, Add, Text, xs+24 yp+3, Trim Characters (Art)
Gui, Add, Edit, xs+20 yp+25 w30 Number vArtTrimLeft gGuiPreview Limit1
Gui, Add, UpDown, yp Range0-9 Wrap, %ArtTrimLeft%
Gui, Add, Text, BackgroundTrans xp+35 yp+3, Left Side
Gui, Add, Edit, xs+20 yp+30 w30 Number vArtTrimRight gGuiPreview Limit1
Gui, Add, UpDown, yp Range0-9 Wrap, %ArtTrimRight%
Gui, Add, Text, BackgroundTrans xp+35 yp+3, Right Side
Gui, Add, Text, BackgroundTrans xs+20 yp+35 w150, Art Trim Preview
Gui, Add, Edit, xp yp+20 w210 ReadOnly vArtTrimResult
; Regex
Gui, Add, GroupBox, xs yp+47 w250 h200
Gui, Add, Edit, Disabled xp+20 yp w82
Gui, Add, Text, xs+24 yp+3 cBlue vRegReplace, Regex Replace
Gui, Font, Norm
Gui, Add, Edit, xp yp+25 w210 gGuiPreview vRegex, %Regex%
Gui, Add, Text, BackgroundTrans xp yp+30 w150, Replacement Text
Gui, Add, Edit, xp yp+15 w210 gGuiPreview vReplaceText
Gui, Add, Text, BackgroundTrans xp yp+30 w150, Regex Preview (Rom)
Gui, Add, Edit, xp yp+15 w210 ReadOnly vRomRegexResult
Gui, Add, Text, BackgroundTrans xp yp+30 w150, Regex Preview (Art)
Gui, Add, Edit, xp yp+15 w210 ReadOnly vArtRegexResult
;StringReplace
Gui, Add, GroupBox, Section x566 y145 w418 h556
Gui, Add, Edit, Disabled xs+20 yp w73
Gui, Add, Text, xs+24 yp+3, Replace Text
Gui, Add, ListView, xs+20 yp+25 w378 r18 AltSubmit vReplaceLV hwndLV_LView, Search For:|Replace With:|A|W
LV_ModifyCol(1, 162)
LV_ModifyCol(2, 162)
LV_ModifyCol(3, 25)
LV_ModifyCol(4, 25)
Gosub, LoadSRL
Gui, Add, Button, xp y+25 w85 h30 vB5 gAddSRL, Add New
Gui, Add, Button, x+15 yp w85 h30 vB6 gRemoveSRL, Delete
Gui, Add, Button, x+15 yp w85 h30 vB7 gClearSRL, Delete All
Gui, Add, Button, x+15 yp w38 h30 vB8 gMoveUp, /\
Gui, Add, Button, x+2 yp w38 h30 vB9 gMoveDown, \/
Gui, Add, Text, BackgroundTrans xs+20 yp+43 w150, Final Preview (Rom)
Gui, Add, Edit, xp yp+20 w378 ReadOnly vRomReplacementResult
Gui, Add, Text, BackgroundTrans xs+20 yp+43 w150, Final Preview (Art)
Gui, Add, Edit, xp yp+20 w378 ReadOnly vArtReplacementResult
Loop, 19
Control_Colors("B" A_Index, "Set", "0x1C20AC")
Control_Colors(Gui1ID, "RCB", 0, 0)
Gui, Show, Hide
;*************************************** Regex Help (GUI 2) ****************************************
Gui, 2:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
Gui, Color, AC201C, FBA441
Gui, Font, s10
Gui, Add, Text,x10 y10, A Perl-Compatible Regular Expression (PCRE) Pattern`n\.*?+[{|()^$ must be preceded by a backslash to be seen as literal.
Gui, Add, Text,y+10 x10, Examples:
Gui, Add, Edit, y+5 x10, 1. [^a-zA-Z0-9& ] Only match characters a-z, A-Z, 0-9, &, and {space}
Gui, Add, Text, y+5 x30, Before: 'Game_Name!, The'
Gui, Add, Text, y+5 x30, After: 'Game Name The'
Gui, Add, Edit,y+10 x10, 2. \_.* Matches up to the first _ {Underscore}
Gui, Add, Text, y+5 x30, Before: 'Game_Name!, The'
Gui, Add, Text, y+5 x30, After: 'Game'
Gui, Font, Underline
Gui, Add, Text, y+10 x120 cBlue gLink1 vURL_Link1, (RegEx) - Quick Reference
Gui, Add, Button, Default yp x+100 vClose, Close
GuiControl, Focus, Close
Gui, Font, norm
;************************************** Search Roms (GUI 3) ****************************************
Gui, 3:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
Gui, Color, AC201C, FBA441
Gui, +LastFound
Gui3ID := WinExist()
GroupAdd, GuiNum3, ahk_id %Gui3ID%
Gui, Add, ListView, r20 w550 h368 vSearchLV gSearchLV AltSubmit -Hdr +Grid, Search Roms
Gui, Add, CheckBox, x20 y+15 vAnyWhere gSearch, Search anywhere in filename
Gui, Add, Text, x+20 yp, Search
Gui, Add, Edit, x+5 yp-3 w200 Lowercase Limit25 vSearch gSearch
Gui, Add, Button, x+30 yp w70, Close
;*************************************** Miss List (Gui 4) ****************************************
Gui, 4:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
Gui, Color, AC201C, FBA441
Gui, Add, Text, r2 w550 vGui4Text
Gui, Add, ListView, r20 w550 h368 -hdr vMissListLV, A
Gui, Add, Button, w70 x400 gSaveList, Save
Gui, Add, Button, x+20 yp w70, Close
;************************************* Set Extensions (Gui 5) **************************************
Gui, 5:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
Gui, Color, AC201C, FBA441
Gui, Add, Text, vExtGuiText w150, XXX XXXXXXXXXXX
Gui, Add, ListView, w200 r6 vExtLV checked -hdr, A
Gui, Add, Button, w60 y+10 xp+140, OK
Gui, Show, Hide
;************************************ Get File/Folder (Gui 6) **************************************
Gui, 6:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
Gui, Color, AC201C, FBA441
If FoF_ImageListID =
{
FoF_Ext := "dat,xml" ; Comma Delimited List of Extensions. Leave Blank If No Filter Is Desired.
Loop, Parse, FoF_Ext, `,
FoF_Text .= FoF_Text = "" ? "*." A_LoopField : ",*." A_LoopField
FoF_ImageListID := IL_Create(10)
Loop 12
IL_Add(FoF_ImageListID, "shell32.dll", A_Index)
Gui, +Resize -MaximizeBox -MinimizeBox -SysMenu +AlwaysOnTop
Gui, Add, Text, y10, Folder or File. (%FoF_Text%)
Gui, Add, TreeView, Section r10 w300 vFoF_Tree gFoF_AddChildren AltSubmit -Lines ImageList%FoF_ImageListID%
Gui, Add, Button, x148 y+10 w74 gFoF_OK Default, OK
Gui, Add, Button, x+6 yp w74 gFoF_Cancel, Cancel
FoF_ID := TV_Add("DeskTop", 0, "icon3")
FoF_AddFilesToTree(A_Desktop, FoF_ID, FoF_ImageListID)
FoF_ID := TV_Add("Documents", 0, "icon4")
FoF_AddFilesToTree(A_MyDocuments, FoF_ID, FoF_ImageListID)
FoF_ID := TV_Add("Programs", 0, "icon4")
FoF_AddFilesToTree(A_ProgramFiles, FoF_ID, FoF_ImageListID)
FoF_DriveTypes := "Fixed,CdRom,Removable"
FoF_IconNumber := "9,12,7"
StringSplit, FoF_IconNumber, FoF_IconNumber, `,
Loop, Parse, FoF_DriveTypes, `,
{
FoF_IconNumber := FoF_IconNumber%A_Index%
DriveGet, FoF_List, List, %A_LoopField%
Loop, Parse, FoF_List
{
FoF_ID := TV_Add(A_LoopField . ":", 0, "Icon" FoF_IconNumber)
FoF_AddFilesToTree(A_LoopField . ":", FoF_ID, FoF_ImageListID)
}
}
}
;******************************* Get Preview File From Dat (Gui 7) *********************************
Gui, 7:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
Gui, Color, AC201C, FBA441
Gui, +Resize -MaximizeBox -MinimizeBox -SysMenu +AlwaysOnTop
Gui, Add, Text, y10
Gui, Add, ListView, Section r10 w300 vRomFromDat gGetRomPreviewFile, File Name
Gui, Add, Button, x148 y+10 w74 Default, OK
Gui, Add, Button, x+6 yp w74, Cancel
;************************************ Display Messages (Gui 8) *************************************
Gui, 8:Default
Gui, +Owner1 +Border +0x40000 ;+OwnDialogs
Gui, Color, AC201C, FBA441
Gui, Add, Text, BackgroundTrans r5 w220 vGui8Text
Gui, Add, Button, x65 y85 w70 Default vMBoxOK gMBoxOK, OK
Control_Colors("MBoxOK", "Set", "0x1C20AC")
Gui, Add, Button, x+20 yp w70 vMsgCancel gMsgCancel, Cancel
Control_Colors("MBoxCancel", "Set", "0x1C20AC")
Gui, Add, Checkbox, x20 y+15 vHideMessage, Do not show this message again.
Gui, Add, Edit, x10 y10 w50 vMsgNum
GuiControl, Hide, MsgNum
;************************************** Project Gui (Gui 9) ****************************************
Gui, 9:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
Gui, Color, AC201C, FBA441
Gui, Add, Text, w300 vProjectText, Open Project
Gui, Add, ListView, r20 w300 r10 AltSubmit -Hdr vProjectsLV gProjectsLV, A
Gui, Add, Text, y+20, Project Name:
Gui, Add, Edit, x+5 yp-3 w228 vProjectEdit
Gui, Add, Button, w70 x150 y+20 vProjectSave, Save
Gui, Add, Button, w70 xp yp vProjectOpen, Open
Gui, Add, Button, x+20 yp w70, Cancel
;*************************************** BackDrop (Gui10) *****************************************
Gui, 10:Default
Gui, +LastFound
Gui10ID := WinExist()
Gui, -caption +0x40000 +ToolWindow
Gui, Color, Black
;************************************* Settings Gui (Gui 11) ***************************************
Gui, 11:Default
Gui, +Owner1 +OwnDialogs +Border +0x40000
; Gui, Color, FBA441, FBA441
Gui, Color, AC201C, FBA441
; Gui, Add, Picture, x0 y0 w600 h180 0x120E hwnddHwnd
Gui, Add, GroupBox, Section w300 h235
Gui, Add, Edit, Disabled xp+20 yp w117
Gui, Add, Text, xs+24 yp+3, Message Options
Gui, Font, Bold cFBA441
Gui, Add, Text, xs+15 ys+35, Show Messages
Gui, Font, Norm
Gui, Add, Radio, xs+25 y+15 Checked%MO1% vMessageOption, Hide all messsages
Gui, Add, Radio, xs+25 y+15 Checked%MO2%, Show all messages
Gui, Add, Radio, xs+25 y+15 Checked%MO3%, Do Not Show Hidden Messages
Gui, Font, Bold
Gui, Add, Text, xs+15 y+20, Tooltips
Gui, Font, Norm
Gui, Add, Radio, xs+25 y+15 Checked%MT1% vMessageTips, Show hidden messages as Tooltips
Gui, Add, Radio, xs+25 y+15 Checked%MT2%, Show all messages as Tooltips
Gui, Add, CheckBox, xs y+40 vResetMessages, Reset hidden messages
Gui, Font, Norm cBlack
Gui, Add, Button, w70 x150 yp-3, OK
Gui, Add, Button, w70 x+20 yp, Cancel
;************************************** Credits GUI (Gui 12) ***************************************
CreditsText =
(
`t
`t`tAuthor:`t Matt McLemore Aka 'Tempest'
`t`t`tFunctions by others:
`t`t`tAddFileIcon() by Icarus
http://www.autohotkey.com/community/viewtopic.php?t=29642
`t`t`tAnsi2Unicode() by Sean
http://www.autohotkey.com/community/viewtopic.php?t=17343
`t`tControl_Colors() by DerRaphael
http://www.autohotkey.com/community/viewtopic.php?p=208290
`t`tCreateGradientBitmap() by Skan
http://www.autohotkey.com/community/viewtopic.php?p=425387
`t`tListview In-Cell Editing by Micahs
`thttp://www.autohotkey.com/forum/topic19929.html
`t`tRobert's INI library Basic by Rseding
`thttp://www.autohotkey.net/~Rseding91/Fast ini library/
`tStdLib Compliant/Basic/RIni.ahk
`t`t`tSetTip() by Micahs
http://www.autohotkey.com/community/viewtopic.php?p=262187
`t`t UnHtm() by Skan 19-Nov-2009
`t www.autohotkey.com/forum/topic51342.html
)
WinH = 100 ; Height of GUI
YPos := WinH ; Bottom of GUI Window
Gui, 12:Default
Gui, +Owner1 +ToolWindow
Gui, Margin, 0, 0
Gui, Font, Bold s10
Gui, Add, Picture, x0 y0 w600 h180 0x120E hwnddHwnd
Gui, Add, Text, BackgroundTrans vCreditsGui x0 y%YPos% w600, %CreditsText%
Gui, Font, Normal
;**************************************** Initialize Gui 1 *****************************************
Gui, 1:Default
Gui, Show, Hide Center AutoSize, % ScriptName " by Matt McLemore AKA 'Tempest'"
Gui, Submit, Hide
DllCall( "DeleteObject", UInt,hBMP )
hBMP := GDI_CreateGradientBitmap( 3, "FBA441", "AC201C", 1024, 768 ) ;"FBA441", "AC201C" "FF8040", "A04020"
DllCall( "SendMessage", UInt,cHwnd, UInt,0x172, UInt,0, UInt,hBMP )
DllCall( "SendMessage", UInt,dHwnd, UInt,0x172, UInt,0, UInt,hBMP )
GuiControl, Focus, Region
SetPreviewFile("Rom", LastRomFolder)
SetPreviewFile("Art", LastArtFolder)
ClickLink()
WinGetPos, GuiX, GuiY, GuiW, GuiH, ahk_id%Gui1ID%
GuiW -= 10, GuiH -=10
Gui, 10:Show, x%GuiX% y%Guiy% w%GuiW% h%GuiH%
Gui, 1:Show
InitCellEditing("ReplaceLV", "1")
} ; End Create Gui's
;******************************************* On Message ********************************************
WM_SYSCOMMAND(wParam)
{
Global Gui1ID
If (A_Gui = 1 && wParam = 0xF020) ; SC_MINIMIZE
{
Gui, 10: Hide
Gui, 1: Minimize
}
If (A_Gui = 1 && wParam = 0xF120) ; SC_RESTORE
{
Gui, 1: +AlwaysOnTop
Gui, 1: Restore
Sleep, 10
Gui, 10:Show
Gui, 1: -AlwaysOnTop
}
}
WM_WINDOWPOSCHANGED()
{
Global Gui1ID, Gui10ID
WinGetPos, GuiX, GuiY,,, ahk_id%Gui1ID%
GuiX -= 6, GuiY -=6
WinMove, ahk_id%Gui10ID%,, %GuiX%, %GuiY%
}
;****************************************** Project Menu *******************************************
OpenProject:
LoadProjectsLV("Open")
Return
SaveProjectAs:
LoadProjectsLV()
Return
SaveProject:
IniSave()
MBox(1,LastProject)
Return
LoadProjectsLV(Param="")
{
Global IniSections, ProjectsLV
Gui, +Disabled
Gui, 9:Default
Gui, 9:ListView, ProjectsLV
LV_Delete()
Flag = 0
Loop, Parse, IniSections, `,
{
If (A_LoopField <> "General")
{
LV_Add("", A_LoopField)
Flag = 1
}
}
If Flag = 0
{
MBox(2)
Return
}
If Param = Open
{
GuiControl,, ProjectText, Open Project
GuiControl, Hide, ProjectSave
GuiControl, Show, ProjectOpen
}
Else
{
GuiControl,, ProjectText, Save Project as:
GuiControl, Hide, ProjectOpen
GuiControl, Show, ProjectSave
}
Gui, 9:Show,, %ScriptName%
WinGet, GuiID, ID, A
WinWaitNotActive, ahk_id %GuiID%
Gui, 1:Default
Gui, -Disabled
Gui, 1:Show
}
;********************************* Project Dialog (Gui 9) Actions **********************************
ProjectsLV:
If A_GuiEvent = Normal
{
RowNumber := LV_GetNext(0)
If RowNumber <> 0
{
LV_GetText(TempVar, RowNumber)
GuiControl,, ProjectEdit, %TempVar%
}
}
Return
9ButtonOpen:
GuiControlGet, ProjectEdit
If ProjectEdit =
Mbox(3)
Else
{
LastProject := ProjectEdit
Gui, 9:Hide
Loop, Parse, Keys, `,
{
IniRead, %A_LoopField%, %ScriptIni%, %LastProject%, %A_LoopField%
GuiControl, 1:, %A_LoopField%, % %A_LoopField%
}
GoSub, LoadSRL
SetTip("Edit1", LastRomFolder)
SetTip("ComboBox1", LastArtFolder)
SB_SetText(" " LastProject)
}
Return
9ButtonSave:
GuiControlGet, ProjectEdit
If ProjectEdit =
Mbox(4)
Else
{
LastProject := ProjectEdit
If LastProject Not In %IniSections%
IniSections .= "," LastProject
IniSave()
Gui, 9:Hide
SB_SetText(" " LastProject)
MBox(17, LastProject)
}
Return
9ButtonCancel:
9GuiClose:
Gui, Hide
Return
;**************************************** Message Options ******************************************
MessageSettings:
Gui, 11:Default
Gui, Show
WinGet, GuiID, ID, A
WinWaitNotActive, ahk_id %GuiID%
Return
11ButtonOK:
Gui, 11:Submit
If ResetMessages = 1
{
GuiControl,, ResetMessages, 0
HideMessages =
}
11ButtonCancel:
11GuiClose:
Gui, Hide
Gui, 1:Default
Gui, 1:Show
Return
;*********************************** Custom Message Box (Gui 8) ************************************
MBox(MsgNum, Var="", Cancel=False)
{
Global MBoxOK, HideMessages, MessageOption, MessageTips, TipActive, GuiPid
If (MessageOption = 1) OR (GuiPid = "") ;Hide all messsages
Return
GuiControl, 8:, MsgNum, %MsgNum%
Var1 := "XXX", Var2 := "YYY"
Message := Message%MsgNum%
Loop, Parse, Var, |
StringReplace, Message, Message, % Var%A_Index%, %A_LoopField%, A
Hidden = 0
If MsgNum In %HideMessages%
Hidden = 1
If MessageOption = 2 ;Show all messages
{
If MessageTips = 2 ;Show all Messages as ToolTips
{
Message .= "`n "
ToolTip, %Message%,,, 20
TipActive = 1
}
Else If Hidden = 1
{
Message .= "`n "
ToolTip, %Message%,,, 20
TipActive = 1
}
Else GoSub, ShowMessage
}
Else If (MessageOption = 3 AND Hidden = 0) ;Do Not Show Hidden Messages
{
If MessageTips = 2
{
Message .= "`n "
ToolTip, %Message%,,, 20
TipActive = 1
}
Else Gosub, ShowMessage
}
Return
ShowMessage:
MBoxOK = 1
StringReplace, Message, Message, `n, `n, UseErrorLevel
Loop, % 2 - ErrorLevel
Message := "`n" Message
Gui, 8:Default
GuiControl,, Gui8Text, %Message%
If Cancel
{
GuiControl, Show, MsgCancel
GuiControl, Move, MBoxOK, x65
}
Else
{
GuiControl, Hide, MsgCancel
GuiControl, Move, MBoxOK, x155
}
Gui, Show, w232 h155, %ScriptName%
WinGet, GuiID, ID, A
WinWaitNotActive, ahk_id %GuiID%
Return
}
8GuiClose:
MsgCancel:
MBoxOK = 0
MBoxOK:
GuiControlGet, HideMessage
If HideMessage = 1
{
GuiControlGet, MsgNum, 8:
HideMessages .= HideMessages = "" ? MsgNum : "," MsgNum
Sort, HideMessages, D`, U
GuiControl,, HideMessage, 0
}
Gui, Hide
Gui, 1:Default
Return
;****************************************** GUI Previews *******************************************
GuiPreview:
Gui, Submit, NoHide
MatchedOnce = 0
If (A_GuiControl <> "RemoveExact") And (A_GuiControl <> "Remove99")
{
RefreshMatchLV = 1
GoSub, StringReplaceInit
GuiPreview("Art")
GuiPreview("Rom")
}
Return
GuiPreview(Type)
{
GuiControlGet, Text,, %Type%PreviewFile
If Text = No file found.
Text =
Text := DeleteBrackets(Text,Type)
Text := RemoveSpaces(Text)
GuiControl, 1:, %Type%BracketResult, %Text%
Text := TrimChars(Text,Type)
Text := RemoveSpaces(Text)
GuiControl, 1:, %Type%TrimResult, %Text%
Text := Regex(Text)
Text := RemoveSpaces(Text)
GuiControl, 1:, %Type%RegexResult, %Text%
Text := StringReplacement(Text)
Text := RemoveSpaces(Text)
GuiControl, 1:, %Type%ReplacementResult, %Text%
}
;***************************************** Get Rom Folder ******************************************
GetRomFolder:
GoSub, SelectFileFolder
If FoF_FullPath =
Return
GuiControl,1:, LastRomFolder, %FoF_FullPath%
Flag := SetPreviewFile("Rom", FoF_FullPath)
Return
SelectFileFolder:
Gui, 6:Default
Gui, Show, h286 w317, Browse For File Or Folder
WinGet, GuiID, ID, A
WinWaitNotActive, ahk_id %GuiID%
Return
FoF_Cancel:
6GuiClose:
FoF_FullPath =
FoF_Ok:
Gui, 6:Hide
Gui, 1:Default
Return
;***************************************************************************************************
FoF_AddChildren:
If A_GuiEvent = Normal
{
FoF_ItemID := A_EventInfo
FoF_ParentID := FoF_ItemID
FoF_FullPath =
Loop
{
TV_GetText(ParentText, FoF_ParentID)
FoF_ParentID := TV_GetParent(FoF_ParentID)
If FoF_ParentID = 0
{
If ParentText = desktop
ParentText = %A_Desktop%
If ParentText = documents
ParentText = %A_MyDocuments%
If ParentText = programs
ParentText = %A_ProgramFiles%
FoF_FullPath = %ParentText%\%FoF_FullPath%
Break
}
Else FoF_FullPath = %ParentText%\%FoF_FullPath%
}
StringReplace, FoF_FullPath, FoF_FullPath, \\ , \
StringRight, FoF_LastChar, FoF_FullPath, 1
If FoF_LastChar = \
StringTrimRight, FoF_FullPath, FoF_FullPath, 1
FoF_AddFilesToTree(FoF_FullPath, FoF_ItemID, FoF_ImageListID, 1)
}
Return
FoF_AddFilesToTree(Path, ParentID, FoF_ImageListID, Flag = 0)
{
Static TreeMap := "`n"
Global FoF_Ext
If Flag = 0
{
TreeMap .= ParentID "`n"
Loop, %Path%\*.*, 1
{
SplitPath, A_LoopFileName,,, FoF_ThisExt
If (FoF_Ext = "") OR InStr(FoF_Ext, FoF_ThisExt)
{
FoF_IconNumber := AddFileIcon(A_LoopFileFullPath, FoF_ImageListID)
ChildID := TV_Add(A_LoopFileName, ParentID , "Icon" . FoF_IconNumber)
Loop, %A_LoopFileFullPath%\*.*, 1
{
SplitPath, A_LoopFileName,,, FoF_ThisExt
If (FoF_Ext = "") OR InStr(FoF_Ext, FoF_ThisExt)
{
FoF_IconNumber := AddFileIcon(A_LoopFileFullPath, FoF_ImageListID)
TV_Add(A_LoopFileName, ChildID , "Icon" . FoF_IconNumber)
}
}
}
}
}
Else
{
Pos := InStr( TreeMap, "`n" ParentID "`n" )
If Pos = 0
{
TreeMap .= ParentID "`n"
ChildID := TV_GetChild(ParentID)
Loop
{
If ChildID = 0
Break
TV_GetText(Dir, ChildID)
Loop, %path%\%Dir%\*.*, 1
{
SplitPath, A_LoopFileName,,, FoF_ThisExt
If (FoF_Ext = "") OR InStr(FoF_Ext, FoF_ThisExt)
{
FoF_IconNumber := AddFileIcon(A_LoopFileFullPath, FoF_ImageListID)
TV_ADD(A_LoopFileName, ChildID , "Icon" . FoF_IconNumber)
}
}
ChildID := TV_GetNext(ChildID)
}
}
}
GuiControl, MoveDraw, FoF_Tree
}
;************* By Icarus - http://www.autohotkey.com/community/viewtopic.php?t=29642 ***************
AddFileIcon(File, ImageList)
{
VarSetCapacity(Filename, 260)
sfi_size = 352
VarSetCapacity(sfi, sfi_size)
FileName := file
SplitPath, FileName,,, FileExt
If FileExt in EXE,ICO,ANI,CUR
{
ExtID := FileExt
IconNumber = 0
}
Else
{
ExtID = 0
Loop 7
{
StringMid, ExtChar, FileExt, A_Index, 1
If Not ExtChar
Break
ExtID := ExtID | (Asc(ExtChar) << (8 * (A_Index - 1)))
}
IconNumber := IconArray%ExtID%
}
If Not IconNumber
{
If not DllCall("Shell32\SHGetFileInfoA", "str", FileName, "uint", 0, "str", sfi, "uint", sfi_size, "uint", 0x101)
IconNumber = 9999999
Else
{
hIcon = 0
Loop 4
hIcon += *(&sfi + A_Index-1) << 8*(A_Index-1)
IconNumber := DllCall("ImageList_ReplaceIcon", "uint", imageList, "int", -1, "uint", hIcon) + 1
DllCall("DestroyIcon", "uint", hIcon)
IconArray%ExtID% := IconNumber
}
}
Return IconNumber
}
;***************************************** Get Art Folder ******************************************
GetArtFolder:
FileSelectFolder, ArtFolder, *%LastArtFolder%,, Skinny Match - Browse to your Art Folder
If Errorlevel = 1
Return
GuiControl := A_GuiControl
Flag := SetPreviewFile("Art", ArtFolder)
If Flag = 1
{
ControlGet, ArtFolderList, List,, Combobox1
If GuiControl = NewArtFolder
ArtFolderList := "|" ArtFolder "||"
Else
{
StringReplace, ArtFolderList, ArtFolderList, `n, |, A
ArtFolderList := "|" ArtFolderList "|"
IfNotInstring, ArtfolderList, |%Artfolder%|
ArtFolderList .= ArtFolder "||"
Else
StringReplace, ArtFolderList, ArtFolderList, |%Artfolder%|, |%Artfolder%||
}
GuiControl, 1:, LastArtFolder, %ArtFolderList%
IniWrite, |%ArtFolderList%, %ScriptIni%, %LastProject%, ArtFolderList
}
Return
;*************************************** Delete Art Folder *****************************************
DelArtFolder:
GuiControlGet, ArtFolder,, LastArtFolder
ControlGet, ArtFolderList, List,, Combobox1
IfInString, ArtFolderList, `n
{
StringReplace, ArtFolderList, ArtFolderList, `n, |, A
ArtFolderList := RegexReplace(ArtFolderList, "^\Q" ArtFolder "\E\||\|\Q" ArtFolder "\E\||\|\Q" ArtFolder "\E$", "|", Count)
ArtFolderList := RegexReplace(ArtFolderList, "^\||\|$")
IfInString, ArtFolderList, |
StringReplace, ArtFolderList, ArtFolderList, |, ||
Else ArtFolderList .= "||"
GuiControl,, LastArtFolder, |%ArtFolderList%
GuiControlGet, ArtFolder,, LastArtFolder
SetPreviewFile("Art", ArtFolder)
IniWrite, |%ArtFolderList%, %ScriptIni%, %LastProject%, ArtFolderList
}
Else MBox(8)
Return
;************************************ Set Preview (Automatic) **************************************
SetArtPreview:
GuiControlGet, ArtFolder,, LastArtFolder
SetPreviewFile("Art", ArtFolder)
Return
SetPreviewFile(Type, Folder)
{
Global RefreshMatchLV, Data, ScriptIni, StartPos, LastProject, Needle, DataFileType
Flag = 0
SplitPath, Folder,,, OutExt
If OutExt = ;No extension means user selected a folder
{
GuiControlGet, Extensions, 1:, %Type%Extensions
If Extensions =
Extensions = *
Recurse = 0
If Type = Rom
GuiControlGet, Recurse, 1:, Recurse
Loop, Parse, Extensions, `,
{
Loop, %Folder%\*.%A_LoopField%, 0, %Recurse%
{
Flag = 1
SplitPath, A_LoopFileName,,,, NameNoExt
If Type = Rom
{
GuiControl, Enable, Recurse
GuiControl, Enable, RomExtensions
GuiControl, Enable, ExtButton
}
Break
}
}
If Flag = 0
{
MBox(7, Extensions "|" Folder)
GuiControl,, %Type%PreviewFile, No file found.
Return
}
}
Else
{
FileRead, Data, %Folder%
DataFileType := "SoftList"
Needle := "m)^\s*<software name= ?""(?!.*\[BIOS])(.+?)"""
StartPos := InStr(Data, "<softwarelist name=")
If StartPos = 0
{
DataFileType := "HyperSpinXML"
Needle := "m)^\s*<game name= ?""(?!.*\[BIOS])(.+?)"""
StartPos := InStr(Data, "<game name=")
}
If StartPos = 0
{
DataFileType := "CMP"
Needle := "m)^\s*name ?""(?!.*\[BIOS])(.+?)"""
StartPos := InStr(Data, "game (")
}
;\.*?+[{|()^$
;<game name="Activision Decathlon, The (USA)"> HyperSpin
;name "[BIOS] Atari 5200 (USA)" CMP (NoIntro/Tosec)
;rom ( name "5200 Menu Program (2003) (PD).a52" GoodSet
;<software name="aeroblst"> SoftList
; <description>Aero Blasters</description>
If DataFileType = SoftList
Flag := RegExMatch(Data, "<description>(.+?)</description>", NameNoExt, StartPos)
Else
Flag := RegExMatch(Data, Needle, NameNoExt, StartPos)
NameNoExt := UnHTM(NameNoExt1)
NameNoExt := UTF82Ansi(NameNoExt)
If (StartPos = 0) OR (Flag = 0)
{
DataFileType =
MBox(9,Folder)
Return
}
GuiControl, Disable, Recurse
GuiControl, Disable, RomExtensions
GuiControl, Disable, ExtButton
}
Class := Type = "Rom" ? "Edit1" : "ComboBox1"
SetTip(Class, Folder)
Last%Type%Folder = %Folder%
IniWrite, %Folder%, %ScriptIni%, %LastProject%, Last%Type%Folder
GuiControl, 1:, %Type%PreviewFile, %NameNoExt%
RefreshMatchLV = 1
Return Flag
}
;********************************** Get Preview (User Selected) ************************************
GetRomPreviewFile:
GetPreviewFile("Rom")
Return
GetArtPreviewFile:
GetPreviewFile("Art")
Return
GetPreviewFile(Type)
{
Global Data, StartPos, Needle, DataFileType
GuiControlGet, Folder, 1:, Last%Type%Folder
SplitPath, Folder,,, OutExt
If OutExt <>
{
Gui, 7:Default
Gui, 7:ListView, RomFromDat
LV_Delete()
Pos := StartPos
Loop
{
If DataFileType = SoftList
Pos := RegExMatch(Data, "<description>(.+?)</description>", TempVar, Pos)
Else
Pos := RegExMatch(Data, Needle, TempVar, Pos)
If Pos = 0
Break
Pos += StrLen(TempVar1)
NameNoExt := UnHTM(TempVar1)
NameNoExt := UTF82Ansi(NameNoExt)
LV_ADD("", NameNoExt)
}
Gui, 7:Show,, %ScriptName%
WinGet, GuiID, ID, A
WinWaitNotActive, ahk_id %GuiID%
}
Else
{
GuiControlGet, Extensions, 1:, %Type%Extensions
StringReplace, TempVar, Extensions, `,, `;*., A
If TempVar =
TempVar := "*"
TempVar = *.%TempVar%
FileSelectFile, PreviewFile,,%Folder%, Select %Type% Preview File, %TempVar%
If PreviewFile <>
{
SplitPath, PreviewFile, Name,, Ext, NameNoExt
GuiControl,, %Type%PreviewFile, %NameNoExt%
}
}
}
7ButtonOK:
Gui +OwnDialogs
RowNumber := LV_GetNext()
LV_GetText(NameNoExt, RowNumber)
GuiControl, 1:, RomPreviewFile, %NameNoExt%
7ButtonCancel:
7GuiClose:
Gui, Hide
Gui, 1:Default
Gui, 1:Show
Return
;************************************* Handle Match LV Events ***************************************
MatchLV_Events:
If (A_GuiEvent == "e")
{
LV_GetText(NextText, EditRow)
Tooltip
If PrevText <> %NextText%
LV_Modify(EditRow,"",PrevText,NextText,"Edit")
}
Else If (A_GuiEvent == "E")
{
EditRow := A_EventInfo
LV_GetText(PrevText, A_EventInfo)
ToolTip,%PrevText%
}
Else If (A_GuiEvent == "F")
{
RefreshMatchLV()
}
Else If A_GuiEvent = R
{
RowNumber := A_EventInfo
Goto, SearchArt
}
Else If (A_GuiEvent = "DoubleClick") AND (MatchedOnce = 1)
{
GoSub, ViewArt
}
Else If (A_GuiEvent = "RightClick") AND (MatchedOnce = 1)
{
MenuRow := A_EventInfo
Gui, 1:Default
Menu, MyMenu, Add
Menu, MyMenu, DeleteAll
LV_GetText(MatchCount, MenuRow, 4)
Flag = 0
Loop, Parse, AltMatch%MatchCount%, `,
{
Flag = 1
StringSplit, TempVar, A_LoopField, |
MenuItem := s_ItemList%TempVar1% A_Tab TempVar2 "%"
Menu, MyMenu, Add, %MenuItem%, MenuHandler
}
If Flag = 1
Menu, MyMenu, Show
}
Return
MenuHandler:
StringSplit, MenuItem, A_ThisMenuItem, %A_Tab%
Gui, 1:ListView, MatchLV
LV_Modify(MenuRow,"-select Col2",MenuItem1,"Menu")
Return
;******************************* Refresh Match Lv if Options Change ********************************
RefreshMatchLV()
{
Global
If RefreshMatchLV = 1
{
Gui, Submit, NoHide
Gui, 1:Default
Gui, 1:ListView, MatchLV
LV_Delete()
GuiControl, -Redraw, MatchLV
SplitPath, LastRomFolder,,, OutExt
If (OutExt = "")
{
Loop, Parse, RomExtensions, `,
{
Loop, %LastRomFolder%\*.%A_LoopField%, 0, %Recurse%
{
; MsgBox, %A_LoopFileName%
IfNotInString, A_LoopFileName, [Bios]
{
SplitPath, A_LoopFileName, Name,, Ext, NameNoExt
If NameNoExt Not in %MatchedRoms%
LV_ADD("", NameNoExt)
}
}
}
}
Else
{
Pos := StartPos
Loop
{
Pos := RegExMatch(Data, Needle , TempVar, Pos)
If Pos = 0
Break
Pos += StrLen(TempVar1)
NameNoExt := UnHTM(TempVar1)
NameNoExt := UTF82Ansi(NameNoExt)
If NameNoExt Not in %MatchedRoms%
{
If DataFileType = SoftList
{
ShortName := NameNoExt
Pos := RegExMatch(Data, "<description>(.+?)</description>" , TempVar, Pos)
NameNoExt := UnHTM(TempVar1)
NameNoExt := UTF82Ansi(NameNoExt)
LV_ADD("", NameNoExt,"","","", ShortName)
}
Else
LV_ADD("", NameNoExt)
}
}
}
GuiControl, +Redraw, MatchLV
MatchedOnce = 0
Save = 0
RefreshMatchLV = 0
}
}
;***************************************************************************************************
;********************************** GUI (1) Labels and Hot Keys ************************************
;***************************************************************************************************
; Hot Keys
^Q:: ExitApp
#IfWinActive ahk_group GuiNum1
Escape:: GoTo, StopMatch
^A:: GoTo, Selectall
^N:: GoTo, SelectNone
~^V:: GoTo, ViewArt
^R:: GoTo, SearchArt
F12:: GoTo, SaveProjectAs
^O:: GoTo, OpenProject
^S:: GoTo, SaveProject
DEL:: GoTo, HideTip
#IfWinActive
HideTip:
If TipActive = 1
{
GuiControlGet, MsgNum, 8:
HideMessages .= HideMessages = "" ? MsgNum : "," MsgNum
Tooltip,,,, 20
}
Return
ChangeTabs:
GuiControlGet, CurrentTab
If CurrentTab = Match
RefreshMatchLV()
Return
GuiContextMenu:
If A_GuiControl = RegReplace
{
Gui, 2:Default
Gui, 2:Show,,%ScriptName%
}
Return
Restart:
Run, %A_ScriptName%
StopMatch:
GuiControlGet, CurrentTab
If CurrentTab = Match
{
Stop = 1
WinActivate, Matt McLemore
}
Return
Selectall:
GuiControlGet, CurrentTab
Gui, 1:ListView, MatchLV
If CurrentTab = Match
LV_Modify(0, "Select")
Return
SelectNone:
GuiControlGet, CurrentTab
Gui, 1:ListView, MatchLV
If CurrentTab = Match
LV_Modify(0, "-Select")
Return
;************************************** View Image - GUI (2) ***************************************
ViewArt:
If (CurrentTab = "Match")
{
If MatchedOnce = 0
MBox(10)
Else
{
Gui, ListView, MatchLV
RowNumber := LV_GetNext(0)
If Not RowNumber
MBox(11)
Else
{
GuiControlGet, ArtExtensions
WinGetActiveTitle, Title
RowNumber = 0
While RowNumber := LV_GetNext(RowNumber)
{
Loop, Parse, ArtExtensions, `,
{
LV_GetText(ArtFile, RowNumber, 2)
IfExist %ArtFolder%\%ArtFile%.%A_LoopField%
RunWait, %ArtFolder%\%ArtFile%.%A_LoopField%
}
}
}
}
}
Return
;********************************** Search Art Folder - GUI (3) ************************************
SearchArt:
If (CurrentTab = "Match")
{
If MatchedOnce = 0
MBox(18)
Else
{
RefreshMatchLV()
RowNumber := LV_GetNext(0)
If Not RowNumber
MBox(19)
Else
{
LV_GetText(Title,Rownumber)
Gui, 3:Default
Gui, 3:Show,, %Title%
ControlFocus, Edit1, %Title%
GuiControl,, Search, %Null%
LV_Modify( 1, "Select")
}
}
}
Return
Search:
GuiControlGet, AnyWhere
GuiControlGet, Search
LV_Delete()
GuiControl, -Redraw, SearchLV
Loop, %OrigArtList0%
{
If OrigArtList%A_Index% =
Continue
If AnyWhere = 0
{
StringLeft, SearchText, OrigArtList%A_Index%, StrLen(Search)
If SearchText = %Search%
LV_Add("", OrigArtList%A_Index%)
}
Else
{
IfInString, OrigArtList%A_Index%, %Search%
LV_Add("", OrigArtList%A_Index%)
}
}
GuiControl, +Redraw, SearchLV
LV_Modify( 1, "Select")
Return
; Accept choice in Search GUI
#IfWinActive ahk_group GuiNum3
Enter::
EventInfo := "1"
Enter()
Return
#IfWinActive
SearchLV:
If(A_GuiEvent = "Normal")
{
EventInfo := A_EventInfo
Enter()
}
Return
Enter()
{
Global RowNumber, EventInfo
Gui, 3:Default
Lv_GetText(SearchText, EventInfo)
Gui, 3:Hide
Gui, 1:Default
If RowNumber <> 0
LV_Modify( RowNumber, "Col2", SearchText,"Search")
Gui, Show
}
;************************************* Missing List - GUI (4) **************************************
MissList:
Gui, Submit, NoHide
SaveText=
If % LV_GetCount() = 0
MBox(14)
Else
{
Loop % LV_GetCount()
{
LV_GetText(NameNoExt, A_Index)
IfExist, % ArtFolder . "\" . NameNoExt . ".*"
Continue
IfExist, % ArtFolder . "\Renamed\" . NameNoExt . ".*"
Continue
SaveText.= NameNoExt . "`n"
}
If SaveText <>
{
Gui, 4:Default
Gui, ListView, MissListLV
LV_Delete()
GuiControl,, Gui4Text, %ArtFolder%`n%Artfolder%\Renamed
Loop, Parse, SaveText, `n
LV_Add("", A_LoopField)
Gui, 4:Show,, Roms Without Art
}
Else MBox(15)
}
Return
SaveList:
Gui +OwnDialogs
Fileselectfile, savefile, s,,Save As:,*.txt
If ErrorLevel = 0
{
FileDelete, %SaveFile%
Loop, 50
{
Sleep, 50
IfNotExist, %SaveFile%
Break
}
FileAppend, %SaveText%, %SaveFile%
MBox(16, SaveFile)
}
4ButtonClose:
4GuiClose:
Gui, Hide
Gui, 1:Default
Gui, 1:Show
Return
;************************************ Set Extensions - GUI (5) *************************************
SetArtExtensions:
Type := "Art"
ControlGet, FolderList, List,, Combobox1
GoTo, ExtLV
SetRomExtensions:
Type := "Rom"
GuiControlGet, FolderList,, LastRomFolder
ExtLV:
If Last%Type%Folder =
MBox(20, Type)
Else
{
GuiControlGet, CurrentExt, 1:, %Type%Extensions
StringSplit, Folder, FolderList, `n, `r
If CurrentExt =
CurrentExt = *
Extensions := CurrentExt
Recurse = 0
If Type = Rom
GuiControlGet, Recurse
Loop, %Folder0%
{
Loop, % Folder%A_Index% "\*.*",, %Recurse%
{
IfNotInString, Extensions, %A_LoopFileExt%
IF StrLen(A_LoopFileExt) = 3
Extensions .= "," A_LoopFileExt
}
}
Sort, Extensions, U D,
StringLower, Extensions, Extensions
Gui, 5:Default
GuiControl,, ExtGuiText, %Type% Extensions:
Gui, ListView, ExtLV
LV_Delete()
Loop, Parse, Extensions, `,
{
If A_LoopField <>
{
If A_LoopField in %CurrentExt%
LV_add("Check", A_LoopField)
Else
LV_add("", A_LoopField)
}
}
Gui, Show,, %ScriptName%
WinGet, GuiID, ID, A
WinWaitNotActive, ahk_id %GuiID%
}
Return
5ButtonOK:
Extensions =
While RowNumber := LV_GetNext(RowNumber, "Check")
{
LV_GetText(Ext, RowNumber, 1)
Extensions .= Ext . ","
}
Gui, Hide
Gui, 1:Default
StringTrimRight, Extensions, Extensions, 1
If Extensions = %CurrentExt%
MBox(21, Type)
Else
{
GuiControl, 1:, %Type%Extensions, %Extensions%
GuiControlGet, Folder, 1:, Last%Type%Folder
SetPreviewFile(Type, Folder)
}
Return
5GuiClose:
3ButtonClose:
3GuiClose:
2ButtonClose:
Gui, Hide
Gui, 1:Default
Gui, 1:Show, Restore
Return
;************************************* Prepare Name For Match **************************************
PrepName4Match(Text, Type, NoSpaces = 0)
{
; Gui, Submit, NoHide ; this and
; GoSub, StringReplaceInit ; this need to go before the line that calls this function.
OutText =
Loop, Parse, Text, `n
{
TempVar := DeleteBrackets(A_Loopfield, Type)
TempVar := TrimChars(TempVar, Type)
TempVar := Regex(TempVar)
OutText .= StringReplacement(TempVar) "`n"
}
StringTrimRight, OutText, OutText, 1
If NoSpaces = 1
StringReplace, OutText, OutText, %A_Space%, %Null%, A
Else OutText := RemoveSpaces(OutText)
Return OutText
}
;************************************** Renaming Algorithms ****************************************
DeleteBrackets(Text, Type)
{
Global
Loop, Parse, BracketTypes, `,
{
If %Type%%A_LoopField%Bracket <> 0
{
Pos = 1
BracketRegex = %A_LoopField%Regex
Count = %Type%%A_LoopField%Bracket
Limit := ABS(%Count%)
If %Count% < 0
{
Loop, %Limit%
{
Pos := RegexMatch(Text, %BracketRegex%,"", Pos)
If Pos = 0
Break
Pos++
}
}
Text := RegexReplace(Text, %BracketRegex%, "", "", Limit, Pos)
Text = %Text%
}
}
Return Text
}
TrimChars(Text,Type)
{
Global ArtTrimLeft, ArtTrimRight, RomTrimLeft, RomTrimRight
TrimRight := Type . "TrimRight"
TrimLeft := Type . "TrimLeft"
StringTrimRight, Text, Text, % %TrimRight% + 0
StringTrimLeft, Text, Text, % %TrimLeft% + 0
Return Text
}
Regex(Text)
{
Global Regex, ReplaceText
If Regex <>
{
TempVar := RegexMatch(Text, "([\[\{\(].+?[]}\)])", BracketInfo)
StringReplace, Text, Text, %BracketInfo1%, ¬
StringSplit, Text, Text, ¬
Text1 := RegexReplace(Text1, Regex, ReplaceText)
Text = %Text1%%BracketInfo1%%Text2%
}
Return Text
}
StringReplacement(Text)
{
Global ReplacementCount, SearchString, ReplaceString, ReplaceWholeWords, ReplaceAll, IllegalChars
Loop, %ReplacementCount%
{
TempText := Text
TempSearchString := SearchString%A_Index%
TempReplaceString := ReplaceString%A_Index%
If ReplaceWholeWords%A_Index%
{
TempText := A_Space . TempText . A_Space
TempSearchString := A_Space . TempSearchString . A_Space
TempReplaceString := A_Space . TempReplaceString . A_Space
}
StringReplace, Text, TempText, %TempSearchString%, %TempReplaceString%, % ReplaceAll%A_Index%
}
Loop, Parse, IllegalChars
StringReplace, Text, Text, %A_loopfield%,, A
Text = %Text%
Return Text
}
;************************************** Remove Extra Spaces ****************************************
RemoveSpaces(Text)
{
Loop
{
StringReplace, Text, Text, %A_Space%%A_Space%, %A_Space%, UseErrorLevel
If ErrorLevel = 0
Break
}
Return Text
}
;******************************* String Replacement LV Labels/Subs *********************************
StringReplaceInit:
Gui, 1:ListView, ReplaceLV
ReplacementCount = 0
Loop % LV_GetCount()
{
ReplacementCount := A_Index
LV_GetText(SearchString%A_Index%, A_Index, 1)
LV_GetText(ReplaceString%A_Index%, A_Index, 2)
LV_GetText(TempVar, A_Index, 3)
ReplaceAll%A_Index% := TempVar=X ? 0 : 1
LV_GetText(TempVar, A_Index, 4)
ReplaceWholeWords%A_Index% := TempVar=X ? 0 : 1
}
Return
AddSRL:
Gui, 1:ListView, ReplaceLV
LV_ADD()
LV_Modify(LV_GetCount(),"Vis Focus Select")
LV_mx := lv_lx +12
LV_my := LV_ly + LV_lh - 12
GoSub, DoubleClick
Return
RemoveSRL:
Gui, 1:ListView, ReplaceLV
RowNumber := LV_GetNext(0)
IF RowNumber <> 0
{
LV_Delete(RowNumber)
If (LV_GetCount()<18)
{
LV_ModifyCol(1, 162)
LV_ModifyCol(2, 162)
}
Gosub, GuiPreview
}
Return
ClearSRL:
Gui, 1:ListView, ReplaceLV
LV_Delete()
LV_ModifyCol(1, 162)
LV_ModifyCol(2, 162)
Gosub, GuiPreview
Return
MoveUp:
PgUp:
Gui, 1:ListView, ReplaceLV
LV_MoveRow()
Gosub, GuiPreview
Return
MoveDown:
PgDn:
Gui, 1:ListView, ReplaceLV
LV_MoveRow(false)
Gosub, GuiPreview
Return
LV_MoveRow(moveup = true)
{
Loop, % (allr := LV_GetCount("Selected"))
max := LV_GetNext(max)
Loop, %allr%
{
cur := LV_GetNext(cur)
If ((cur = 1 && moveup) || (max = LV_GetCount() && !moveup))
Return
Loop, % (ccnt := LV_GetCount("Col"))
LV_GetText(col_%A_Index%, cur, A_Index)
LV_Delete(cur), cur := moveup ? cur-1 : cur+1
LV_Insert(cur, "Select Focus", col_1)
Loop, %ccnt%
LV_Modify(cur, "Col" A_Index, col_%A_Index%), col_%A_Index% := ""
}
}
LoadSRL:
Gui, 1:ListView, ReplaceLV
GuiControl, -Redraw, ReplaceLV
LV_Delete()
Loop, Parse, ReplaceLV, |
{
StringSplit, OutArray, A_LoopField, \
If OutArray0
LV_Add("", OutArray1, OutArray2, OutArray3, OutArray4)
}
If LV_GetCount()> 15
{
LV_ModifyCol(1, 153)
LV_ModifyCol(2, 153)
}
GuiControl, +Redraw, ReplaceLV
Return
;****************************************** StartMatch ********************************************
;**************** OrigArtList (string) Contains the list of items to be searched *****************
;**************************************************************************************************
StartMatch:
Gui, Submit, NoHide
If LastRomFolder =
Gosub, GetRomFolder
If LastRomFolder =
Return
If LastArtFolder =
GoSub, GetArtFolder
If LastArtFolder =
Return
Gui, 1:ListView, MatchLV
If % LV_GetCount("Selected") = 0
{
MBox(22)
Return
}
If (LastArtFolder <> PrevArtFolder) ; Shouldn't this IF include everything below it?
{
MatchedOnce = 0
PrevArtFolder := LastArtFolder
SB_SetText(" Initializing " LastArtFolder,2)
OrigArtList =
Loop, Parse, ArtExtensions, `,
{
Loop, %LastArtFolder%\*.%A_LoopField%
{
SplitPath, A_LoopFileName, Name,, Ext, NameNoExt
OrigArtList .= NameNoExt . "`n"
}
}
Sort, OrigArtList, U
OrigArtList := "`n" OrigArtList
}
Gosub, StringReplaceInit
MatchCount = 0
StartTime := A_TickCount
Gui, 1:ListView, MatchLV
If MatchedOnce = 0
{
TempArtList := OrigArtList
PreppedArtList := PrepName4Match(TempArtList, "Art")
PreppedArtList_NoSpace := PrepName4Match(TempArtList, "Art", 1)
StringSplit, TempArtList, TempArtList, `n
RowNumber = 0
While RowNumber := LV_GetNext(RowNumber) ; 100% Matches
{
LV_GetText(RomName, RowNumber)
SB_SetText(" Searching for 100% Matches: " RomName, 2)
IfInString TempArtList, `n%RomName%`n
{
MatchCount++
LV_Modify(RowNumber, "Col2 -Select", RomName, "100%", MatchCount)
If RemoveExact = 1
StringReplace, OrigArtList, OrigArtList, `n%RomName%`n, `n
}
}
While RowNumber := LV_GetNext(RowNumber) ; 99.9% Matches
{
LV_GetText(RomName, RowNumber)
SB_SetText(" Searching for 99.9% Matches: " RomName, 2)
PreppedRom := PrepName4Match(RomName, "Rom")
Pos := InStr(PreppedArtList, "`n" PreppedRom "`n")
If Pos > 0
{
MatchCount++
TempVar := SubStr(PreppedArtList, 1, Pos)
StringReplace, TempVar, TempVar, `n, `n, UseErrorLevel
Index := ErrorLevel + 1
TempVar := TempArtList%Index%
LV_Modify(RowNumber, "Col2 -Select", TempVar, "99.9%", MatchCount)
If Remove99 = 1
; {
StringReplace, OrigArtList, OrigArtList, % "`n" TempVar "`n", `n
; StringReplace, PreppedArtList, PreppedArtList, % "`n" PreppedRom "`n", `n
; }
}
Else
{
StringReplace, PreppedRom, PreppedRom, %A_Space%,,A
Pos := InStr(PreppedArtList_NoSpace, "`n" PreppedRom "`n")
If Pos > 0
{
MatchCount++
TempVar := SubStr(PreppedArtList_NoSpace, 1, Pos)
StringReplace, TempVar, TempVar, `n, `n, UseErrorLevel
Index := ErrorLevel + 1
TempVar := TempArtList%Index%
LV_Modify(RowNumber, "Col2 -Select", TempVar, "99.9%", MatchCount)
If Remove99 = 1
; {
StringReplace, OrigArtList, OrigArtList, % "`n" TempVar "`n", `n
; StringReplace, PreppedArtList_NoSpace, PreppedArtList_NoSpace, % "`n" PreppedRom "`n", `n
; StringReplace, PreppedArtList, PreppedArtList, % "`n" PreppedRom "`n", `n
; }
}
}
}
If Stop = 1
{
Stop = 0
SoundPlay, *64
SB_SetText(" Matching Stopped by User", 2)
Return
}
}
MatchedOnce = 1
TempRomList =
TempArtList =
SB_SetText(" Preparing for Fuzzy Match...", 2)
s_ItemList := PrepName4Match(OrigArtList, "Art")
StringSplit, S_ItemList, S_ItemList, `n
StringSplit, OrigArtList, OrigArtList, `n
;create array of Trigrams for each word in Search Items
Loop, Parse, s_ItemList, `n
{
Index := A_Index
s_ItemTrigrams%Index% =
s_NumTrigrams%Index% =
StringReplace, TempItem, A_LoopField, %A_Space%,, All
Trigrams := StrLen(TempItem) - 2
Loop, %Trigrams%
{
s_NumTrigrams%Index%++
s_ItemTrigrams%Index% .= SubStr(TempItem,A_Index, 3) . "`n"
}
StringTrimRight, s_ItemTrigrams%Index%, s_ItemTrigrams%Index%, 1
}
;Begin Fuzzy Match
RowNumber = 0
While RowNumber := LV_GetNext(RowNumber)
{
LV_GetText(RomName, RowNumber)
SB_SetText(" Fuzzy Matching: " RomName, 2)
MatchCount++
m_Length := StrLen(RomName)
;create List of Trigrams for Match Item
m_NumTrigrams =
m_ItemTrigrams =
StringReplace, TempItem, RomName, %A_Space%,, All
Trigrams := StrLen(TempItem) - 2
Loop, %Trigrams%
{
m_NumTrigrams++
m_ItemTrigrams .= SubStr(TempItem,A_Index, 3) . "`n"
}
StringTrimRight, m_ItemTrigrams, m_ItemTrigrams, 1
Loop, 7
{
BestIndex%A_Index% = 0
BestFitness%A_Index% = 0
}
Loop, Parse, s_ItemList, `n ;Compare Match Item to Search List
{
If A_LoopField =
Continue
s_ItemIndex := A_Index
SearchItem = %A_LoopField%
s_Length := StrLen(SearchItem)
;Match #1 Instr() Match
iLength := m_Length < s_Length ? m_Length : s_Length
tLength := m_Length > s_Length ? m_Length : s_Length
TempVar1 := SubStr(SearchItem,1,iLength)
IfInstring, RomName, %TempVar1%
{
TempFitness := Round(iLength / tLength *100)
If TempFitness > %BestFitness1%
{
BestIndex1 := s_ItemIndex
BestFitness1 := TempFitness
}
}
;Match #2 Instr() Match
TempVar1 := SubStr(RomName,1,iLength)
IfInstring, SearchItem, %TempVar1%
{
TempFitness := Round(iLength / tLength *100)
If TempFitness > %BestFitness2%
{
BestIndex2 := s_ItemIndex
BestFitness2 := TempFitness
}
}
; Match #3 Greatest number of matching words.
m_Fitness = 0
m_WordCount = 0
TempSearchItem := A_Space . SearchItem . A_Space
Loop, Parse, RomName, %A_Space%
{
m_WordCount++
LoopField := A_Space . A_LoopField . A_Space
IfInString, TempSearchItem, %LoopField%
{
StringReplace, TempSearchItem, TempSearchItem, %LoopField%, %A_Space%
m_Fitness++
}
}
s_Fitness = 0
s_WordCount = 0
TempMatchItem := A_Space . RomName . A_Space
Loop, Parse, SearchItem, %A_Space%
{
s_WordCount++
LoopField := A_Space . A_LoopField . A_Space
IfInString, TempMatchItem, %LoopField%
{
StringReplace, TempMatchItem, TempMatchItem, %LoopField%, %A_Space%
s_Fitness++
}
}
iWordCount := s_WordCount > m_WordCount ? s_WordCount : m_WordCount
m_Fitness := Round(m_Fitness / iWordCount * 100)
If m_Fitness > %BestFitness3%
{
BestIndex3 := s_ItemIndex
BestFitness3 := m_Fitness
}
s_Fitness := Round(s_Fitness / iWordCount * 100)
If s_Fitness > %BestFitness6%
{
BestIndex6 := s_ItemIndex
BestFitness6 := s_Fitness
}
; Match #4 Greatest number of matching TriGrams.
TempFitness =
sTrigrams := s_ItemTrigrams%A_Index%
mTrigrams := m_ItemTrigrams
If s_NumTrigrams%A_Index% > %m_NumTrigrams%
{
sTrigrams := m_ItemTrigrams
mTrigrams := s_ItemTrigrams%A_Index%
}
Loop, Parse, mTrigrams, `n
{
IfInString, sTrigrams, %A_LoopField%
{
StringReplace, sTrigrams, sTrigrams, %A_LoopField%
TempFitness++
}
}
iTrigrams := m_NumTrigrams > s_NumTrigrams%s_ItemIndex% ? m_NumTrigrams : s_NumTrigrams%s_ItemIndex%
TempFitness := Round(TempFitness / iTrigrams * 100)
If TempFitness > %BestFitness4%
{
BestIndex5 := BestIndex4
BestFitness5 := BestFitness4
BestIndex4 := s_ItemIndex
BestFitness4 := TempFitness
}
}
; Sort out the best match and alternative matches for context menu
AltMatch%MatchCount% =
Sort()
Loop, 6
{
If BestFitness%A_Index% <> 0
{
IfNotInstring, AltMatch%MatchCount%, % BestIndex%A_Index% . "|"
AltMatch%MatchCount% .= BestIndex%A_Index% . "|" . BestFitness%A_Index% . ","
If BestFitness%A_Index% > %BestFitness7%
{
BestIndex7 := BestIndex%A_Index%
BestFitness7 := BestFitness%A_Index%
}
}
}
StringTrimRight, AltMatch%MatchCount%, AltMatch%MatchCount%, 1
i_MatchName := "NO MATCH FOUND"
If BestFitness7 = 100
BestFitness7 = 99.9
If BestFitness7 <> 0
i_MatchName := OrigArtList%BestIndex7%
LV_Modify(RowNumber, "Col2 -Select", i_MatchName, BestFitness7 "%", MatchCount)
If Stop = 1
{
Stop = 0
SoundPlay, *64
SB_SetText(" Matching Stopped by User", 2)
Return
}
}
SoundPlay, *64
ElapsedTime := (A_TickCount - StartTime)/1000
dt = 20000101000000
dt += ElapsedTime, seconds
FormatTime, ElapsedTime, %dt%, H:mm:ss
SB_SetText(" Matched " MatchCount " Items in " ElapsedTime " Seconds", 2)
Return
;********************************************** Sort ***********************************************
Sort()
{
Global
Loop, 5
{
Min := A_Index
Max := A_Index +1
While Max < 7
{
If (BestFitness%Min% < BestFitness%Max%)
Min := Max
Max++
}
Swap(BestFitness%A_Index%,BestFitness%Min%)
Swap(BestIndex%A_Index%,BestIndex%Min%)
}
}
Swap(ByRef Old, ByRef New)
{
temp := Old
Old := New
New := temp
}
;********************************************* Rename **********************************************
Rename:
Gui +OwnDialogs
If (CurrentTab = "Match") AND (MatchedOnce = 1)
{
Gui, 1:ListView, MatchLV
MatchCount = 0
RowNumber = 0
While RowNumber := LV_GetNext(RowNumber)
{
MatchCount++
RowNumber%MatchCount% := RowNumber
}
If MatchCount = 0
{
MBox(23)
Return
}
ControlGet, ArtFolderList, List,, Combobox1
StringReplace, TempVar, ArtFolderList, ||, |, A
; StringTrimLeft, TempVar, TempVar, 1
StringSplit, Folder, TempVar, |
Loop, %Folder0%
{
IfNotExist, % Folder%A_Index% . "\Renamed"
{
FileCreateDir, % Folder%A_Index% . "\Renamed"
If ErrorLevel <> 0
MBox(5, ErrorLevel)
}
}
GuiControl, -Redraw, MatchLV
GuiControlGet, MoveFiles
GuiControlGet, ArtExtensions
Loop %MatchCount%
{
ThisRow := MatchCount - A_Index +1
LV_GetText(OldName, RowNumber%ThisRow%, 2)
If OldName =
Continue
If DataFileType = SoftList
LV_GetText(NewName, RowNumber%ThisRow%, 5)
Else
LV_GetText(NewName, RowNumber%ThisRow%, 1)
SB_SetText(" Renaming: " OldName, 2)
Loop, %Folder0%
{
Index := A_Index
Loop, Parse, ArtExtensions, `,
{
If MoveFiles = 1
FileMove, % Folder%Index% "\" OldName "." A_LoopField, % Folder%Index% "\Renamed\" NewName "." A_LoopField
Else
FileCopy, % Folder%Index% "\" OldName "." A_LoopField, % Folder%Index% "\Renamed\" NewName "." A_LoopField
}
}
StringReplace, OldName, OldName, `,, |, A
MatchedRoms .= MatchedRoms = "" ? OldName : "," OldName
LV_Delete(RowNumber%ThisRow%)
}
GuiControl, +Redraw, MatchLV
SoundPlay, *64
SB_SetText(" Renaming Completed.", 2)
}
If MatchedOnce = 0
MBox(10)
Return
;***************************************** Clickable Link ******************************************
ClickLink()
{
Global
Process, Exist
GuiPid := ErrorLevel
WinGet, hw_gui, ID, ahk_class AutoHotkeyGUI ahk_pid %GuiPid%
; OnMessage(0x20, "HandleMessage")
; OnMessage(0x200, "HandleMessage")
}
Link1:
Run, http://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm,,, Pid
WinWaitActive, Regular Expressions (RegEx) - Quick Reference
WinWaitNotActive, Regular Expressions (RegEx) - Quick Reference
WinActivate, AHK_Group GuiNum1
Return
HandleMessage(p_w, p_l, p_m, p_hw)
{
global WM_SETCURSOR, WM_MOUSEMOVE,
static URL_hover, h_cursor_hand, h_old_cursor, CtrlIsURL, LastCtrl
If (p_m = WM_SETCURSOR)
{
If URL_hover
Return, true
}
Else If (p_m = WM_MOUSEMOVE)
{
; Mouse cursor hovers URL text control
StringLeft, CtrlIsURL, A_GuiControl, 3
If (CtrlIsURL = "URL")
{
If URL_hover=
{
Gui, Font, cBlue underline
GuiControl, Font, %A_GuiControl%
LastCtrl = %A_GuiControl%
h_cursor_hand := DllCall("LoadCursor", "uint", 0, "uint", 32649)
URL_hover := true
}
h_old_cursor := DllCall("SetCursor", "uint", h_cursor_hand)
}
; Mouse cursor doesn't hover URL text control
Else
{
If URL_hover
{
Gui, Font, norm cBlue
GuiControl, Font, %LastCtrl%
DllCall("SetCursor", "uint", h_old_cursor)
URL_hover=
}
}
}
}
;****************************************** Show Credits *******************************************
ShowCredits:
Gui, +Disabled
Gui, 12:Default
Gui, Show, w500 h%WinH%, %ScriptName% Credits:
Loop
{
YPos := 0 ; Bottom of GUI Window
Loop
{
YPos--
GuiControl 12:Move, CreditsGui, y%YPos%
GuiControlGet CreditsGui, Pos
If (CreditsGuiY + CreditsGuiH < WinH)
Break
Sleep 50
}
}
Return
#IfWinActive, RomData Magician Credits:
Pause::Pause, Toggle, 1
#IfWinActive
12GuiClose:
Gui, 1:Default
Gui, -Disabled
Gui, 12:Hide
Return
;********************************************** Exit ***********************************************
GuiClose:
ExitApp
ExitSub:
IniSave()
ExitApp
IniSave()
{
Global
Gui, 1:Default
Gui, Submit, Nohide
GuiControlGet, ArtFolder,, LastArtFolder
ControlGet, ArtFolderList, List,, Combobox1, ahk_group GuiNum1
TempVar =
Loop, Parse, ArtFolderList, `n
{
IfNotInString, TempVar, %A_LoopField%|
TempVar .= A_LoopField = ArtFolder ? A_LoopField "||" : A_LoopField "|"
}
ArtFolderList := TempVar
Gui, 1:ListView, ReplaceLV
ReplaceLV =
Loop % LV_GetCount()
{
LV_GetText(SearchString, A_Index, 1)
If SearchString <>
{
LV_GetText(ReplaceString, A_Index, 2)
LV_GetText(ReplaceAll, A_Index, 3)
LV_GetText(ReplaceWholeWords, A_Index, 4)
ReplaceLV .= SearchString "\" ReplaceString "\" ReplaceAll "\" ReplaceWholeWords "|"
}
}
ArtFolderList := "|" ArtFolderList
Loop, Parse, Keys, `,
{
LoopField := %A_LoopField%
IniWrite, %LoopField%, %ScriptIni%, %LastProject%, %A_LoopField%
}
IniWrite, %LastProject%, %ScriptIni%, General, LastProject
IniWrite, %HideMessages%, %ScriptIni%, General, HideMessages
IniWrite, %MessageOption%, %ScriptIni%, General, MessageOption
IniWrite, %MessageTips%, %ScriptIni%, General, MessageTips
}
;********************************** Control_Colors by DerRaphael ***********************************
;*************** http://www.autohotkey.com/community/viewtopic.php?p=208290#p208290 ****************
Control_Colors(Hwnd, Msg, wParam, lParam = 0)
{
;Critical
If !(Hwnd+0) {
GuiControlGet, nHwnd, Hwnd, %Hwnd%
Hwnd := nhwnd
}
Static OldWinProc := "" ; origin Windowprocedure
Static NewWinProc := "" ; new Windowprocedure
Static SetValue := "Set" ; take over Values
Static Register := "RCB" ; RegisterCallBack
Static ValueList := "" ; Values
; Aufruf als Fensterprozedur?
If (A_EventInfo <> NewWinProc) {
If (Msg = SetValue) {
If (RegExMatch(ValueList, "m)^" . (Hwnd +0) . "\|")) {
ValueList := RegExReplace(ValueList
, "m)^" . (Hwnd + 0) . "\|.*$"
, (Hwnd + 0) . "|"
. (wParam + 0) . "|"
. (lParam + 0))
} Else {
ValueList .= (Hwnd + 0) . "|"
. (wParam + 0) . "|"
. (lParam + 0) . "`r`n"
}
Return
}
If (Msg = Register) {
If (NewWinProc = "") {
NewWinProc := RegisterCallback("Control_Colors","",4)
OldWinProc := DllCall("SetWindowLong"
, UInt, Hwnd
, Int, -4
, Int, NewWinProc
, UInt)
}
Return
}
Return
}
; 0x0133 : WM_CTLCOLOREDIT
; 0x0138 : WM_CTLCOLORSTATIC
If (Msg = 0x0133 Or Msg = 0x0135 Or Msg = 0x0138) {
If (RegExMatch(ValueList, "m)^"
. (lParam + 0) . "\|(?P<BG>\d+)\|(?P<TX>\d+)$"
, C)) {
DllCall("SetTextColor", UInt, wParam, UInt, CTX)
DllCall("SetBkColor", UInt, wParam, UInt, CBG)
Return, DllCall("CreateSolidBrush", UInt, CBG)
}
}
Return DllCall("CallWindowProcA"
, UInt, OldWinProc
, UInt, Hwnd
, UInt, Msg
, UInt, wParam
, UInt, lParam)
}
;********************************** CreateGradientBitmap By Skan ***********************************
;*************** http://www.autohotkey.com/community/viewtopic.php?p=425387#p425387 ****************
GDI_CreateGradientBitmap( G=3, C1="ABCDEF", C2="123456", W=256, H=256 ) {
; Thanks to HotkeyIt : www.autohotkey.com/forum/viewtopic.php?t=37376
; This post : www.autohotkey.com/forum/viewtopic.php?p=425387#425387
D := ( G := G<1||G>5 ? 3:G ) < 3 ? 2 : 3, SZ := D*D*4, VarSetCapacity( B$,40+SZ,0 )
; Init BITMAPINFOHEADER ( 40 Bytes )
NumPut(SZ,NumPut(0x180001,NumPut(D,NumPut(D,NumPut(40,B$))))+4), C1:="0x" C1, C2:="0x" C2
; Dynamic BITMAP Data
_ := G=1 ? NumPut(C1,NumPut(C1,NumPut(C2,NumPut(C2,&B$+40)-1)+1)-1) : G=2 ? NumPut(C2
,NumPut(C1,NumPut(C2,NumPut(C1,&B$+40)-1)+1)-1) : G=3 ? NumPut(C2,NumPut(C2,NumPut(C2
,NumPut(C2,NumPut(C1,NumPut(C2,NumPut(C2,NumPut(C2,NumPut(C2,&B$+40)-1)-1)+2)-1)-1)+2)-1)
-1):G=4 ? NumPut(C2,NumPut(C1,NumPut(C2,NumPut(C2,NumPut(C1,NumPut(C2,NumPut(C2,NumPut(C1
,NumPut(C2,&B$+40)-1)-1)+2)-1)-1)+2)-1)-1) :G=5 ? NumPut(C2,NumPut(C2,NumPut(C2,NumPut(C1
,NumPut(C1,NumPut(C1,NumPut(C2,NumPut(C2,NumPut(C2,&B$+40)-1)-1)+2)-1)-1)+2)-1)-1) : 0
; Obtain GDI Bitmap
hBM := DllCall( "CreateDIBitmap", UInt, hDC := DllCall( "GetDC", UInt,cHwnd ), UInt,&B$
, Int,6, UInt,&B$+40, UInt,&B$, UInt,1 ), DllCall( "ReleaseDC", UInt,hDC )
; Obtain Resized GDI Bitmap / Obtain a copy with DIB section
hBM := DllCall( "CopyImage", UInt,hBM, UInt,0, Int,W, Int,H, UInt,0x8, UInt )
Return DllCall( "CopyImage", UInt,hBM, UInt,0, Int,0, Int,0, UInt,0x2000|0x8, UInt )
}
;******************************* Listview In-Cell Editing by Micahs ********************************
;************************ http://www.autohotkey.com/forum/topic19929.html **************************
InitCellEditing(LV_lvname, LV_g=1) ;name of control ;LV_g = gui number, default = 1
{
global
LVS_SINGLESEL = 0x4 ;allow one item to be selected
LVS_SHOWSELALWAYS = 0x8 ;shows selection highlighting even if no focus
LVS_EX_FULLROWSELECT = LV0x20 ;whole row selection
debounce=0
LV_listOptions =
(Join`s LTrim
+AltSubmit
NoSort
-Checked
+Grid
+%LVS_EX_FULLROWSELECT%
+%LVS_SHOWSELALWAYS%
+%LVS_SINGLESEL%
+glistClick
)
LV_dhw := A_DetectHiddenWindows ;save current state
DetectHiddenWindows,On
; Gui,%LV_g%:+LastFound
Gui,%LV_g%:Default
; LV_guiID := WinExist() ;get id for gui
DetectHiddenWindows, %LV_dhw% ;restore original state
GuiControl, %LV_g%:%LV_listOptions%, %LV_lvname%
; ControlGet, LV_LView, Hwnd,, %LV_lvname%, ahk_id %LV_guiID%
;~ OutputDebug,%LV_lvname% ID: %LV_LView%, on %LV_guiID%
SysGet,SM_CXVSCROLL,2 ;get width of vertical scrollbar
LVIR_LABEL = 0x0002 ;LVM_GETSUBITEMRECT constant - get label info
LVM_GETITEMCOUNT = 4100 ;gets total number of rows
LVM_SCROLL = 4116 ;scrolls the listview
LVM_GETTOPINDEX = 4135 ;gets the first displayed row
LVM_GETCOUNTPERPAGE = 4136 ;gets number of displayed rows
LVM_GETSUBITEMRECT = 4152 ;gets cell width,height,x,y
Gui, %LV_g%:Add, Edit, x0 y-50 vLV_CellEdit hwndLV_Edit ;make edit control
Gui, %LV_g%:Add, Text, x0 y-50 vCellHighlight hwndLV_Highlight +Border +BackgroundTrans -Wrap ;make static control
LV_LV := getClassNN(LV_LView)
LV_ED := getClassNN(LV_Edit)
LV_ST := getClassNN(LV_Highlight)
ControlGetPos,LV_lx,LV_ly,LV_lw,LV_lh,%LV_LV%,ahk_id %LV_guiID% ;get info on listview
GroupAdd,LV_editKeypress,ahk_id %LV_guiID% ;for ENTER, ESC, and ARROW key handling
Hotkey, IfWinActive, ahk_group LV_editKeypress ;create hotkeys
Hotkey,Enter ,EnterPressed
Hotkey,Esc ,CommandPressed
Hotkey, IfWinActive
If(!LV_Getcount())
{
LV_Add()
}
;SetTimer, IsScrolling, 350
Return ;end init
}
listClick:
If (A_GuiEvent = "ColClick")
{
GuiControl,1:Hide,%LV_ST% ;hide static control
GuiControl,1:Hide,%LV_ED% ;hide edit control
If A_EventInfo > 2
{
ColValue3 := ColValue3 = "X" ? "" : "X"
ColValue4 := ColValue4 = "X" ? "" : "X"
LV_Modify(0, "Col"A_EventInfo, ColValue%A_EventInfo%)
}
Gosub, GuiPreview
}
Else If(A_GuiEvent = "DoubleClick")
{
CoordMode,MOUSE,RELATIVE
MouseGetPos,LV_mx,LV_my ;,LV_oID,LV_oCNN
Gosub doubleclick
}
Else If(A_GuiEvent = "Normal" and LV_EnableSingleClick)
{
CoordMode,MOUSE,RELATIVE
MouseGetPos,LV_mx,LV_my ;,LV_oID,LV_oCNN
Gosub singleclick
}
Else If A_GuiEvent In D,d,e,S,s,RightClick ;hide edit on these events
{
GuiControl,1:Hide,%LV_ST% ;hide static control
GuiControl,1:Hide,%LV_ED% ;hide edit control
; GuiControl,+Redraw,ReplaceLV
}
Else If(A_GuiEvent = "K") ;user started typing
{
LV_tmp := RegExReplace(Chr(A_EventInfo),"\W","")
If(LV_tmp)
{
VarSetCapacity(LV_XYstruct, 16, 0) ;recreate struct ;get the cell info before edit show
;InsertInteger(LVIR_LABEL ,LV_XYstruct,0) ;get label info constant
;InsertInteger(LV_currCol ,LV_XYstruct,4) ;subitem index
NumPut(LVIR_LABEL, LV_XYstruct, 0) ;get label info constant
NumPut(LV_currCol, LV_XYstruct, 4) ;subitem index
SendMessage,LVM_GETSUBITEMRECT,%LV_currRow%,&LV_XYstruct,%LV_LV%,ahk_id %LV_guiID% ;get cell coords
LV_mx := ExtractInteger(LV_XYstruct,0,4) + LV_lx ;row upperleft x = itempos x + listview x
LV_my := ExtractInteger(LV_XYstruct,4,4) + LV_ly ;row upperleft y = itempos y + listview y
Gosub CellInfo
LV_DispControl := LV_ED ;make edit1 the default control
LV_spacer =
Gosub CellReSize
GuiControl,+Redraw,ReplaceLV ;update the listview
Gosub CellPosition
GuiControl,Focus,%LV_DispControl% ;set focus
If !GetKeyState("Shift") or !GetKeyState("Shiftlock","T")
{
StringLower,LV_tmp, LV_tmp
}
GuiControl,1:,%LV_DispControl%,%LV_tmp% ;set the text
Send,{End}
}
}
Return
doubleclick:
Gosub, CellInfo
GuiControl,1:Hide,%LV_ED% ;hide edit control
GuiControl,1:Hide,%LV_ST% ;hide static control
If(LV_currCol = 1) OR (LV_currCol = 2) ;if not column one
{
LV_DispControl := LV_ED ;make edit1 the default control
LV_spacer =
Gosub CellReSize
Gosub CellPosition
; LV_Modify(LV_currRow, "Focus Select")
GuiControl,1:Focus,%LV_DispControl% ;set focus
LV_Modify(LV_currRow, "-Focus -Select")
Send,+{End}
SetTimer,isEditFocused,75 ;start edit focus monitor
}
Return
singleclick:
GuiControl,1:Hide,%LV_ED% ;hide edit control
GuiControl,1:Hide,%LV_ST% ;hide edit control
Gosub CellInfo
If (LV_currCol = 3) OR (LV_currCol = 4) ;if not column one
{
LV_GetText(Option,LV_currRow,LV_currCol)
Option := Option = "X" ? "" : "X"
LV_Modify(LV_currRow,"Col"LV_currCol,Option)
Gosub, GuiPreview
LV_Modify(LV_currRow, "Focus Select")
}
Return
;*************************cell size and position stuff******************************
CellInfo:
SendMessage,LVM_GETITEMCOUNT,0,0,%LV_LV%,ahk_id %LV_guiID%
LV_TotalNumOfRows := ErrorLevel ;get total number of rows
SendMessage,LVM_GETCOUNTPERPAGE,0,0,%LV_LV%,ahk_id %LV_guiID%
LV_NumOfRows := ErrorLevel ;get number of displayed rows
SendMessage,LVM_GETTOPINDEX,0,0,%LV_LV%,ahk_id %LV_guiID%
LV_topIndex := ErrorLevel ;get first displayed row
VarSetCapacity(LV_XYstruct, 16, 0) ;create struct
Loop,%LV_NumOfRows% ;gets the current row, and cell Y,H
{
LV_which := LV_topIndex + A_Index - 1 ;loop through each displayed row
NumPut(LVIR_LABEL ,LV_XYstruct,0) ;get label info constant
NumPut(A_Index - 1 ,LV_XYstruct,4) ;subitem index
SendMessage,LVM_GETSUBITEMRECT,%LV_which%,&LV_XYstruct,%LV_LV%,ahk_id %LV_guiID% ;get cell coords
LV_RowY := ExtractInteger(LV_XYstruct,4,4) + LV_ly ;row upperleft y = itempos y + listview y
LV_RowY2 := ExtractInteger(LV_XYstruct,12,4) + LV_ly ;row bottomright y2 = itempos y2 + listview y
LV_currColHeight := LV_RowY2 - LV_RowY ;get cell height
If(LV_my <= LV_RowY + LV_currColHeight) ;if mouse Y pos less than row pos + height
{
LV_currRow := LV_which +1 ;1-based current row
LV_currRow0 := LV_which ;0-based current row
Break
}
}
VarSetCapacity(LV_XYstruct, 16, 0) ;create struct
Loop % LV_GetCount("Col") ;gets the current column, and cell X,W
{
NumPut(LVIR_LABEL ,LV_XYstruct,0) ;get label info constant
NumPut(A_Index - 1 ,LV_XYstruct,4) ;subitem index
SendMessage,LVM_GETSUBITEMRECT,%LV_currRow0%,&LV_XYstruct,%LV_LV%,ahk_id %LV_guiID% ;get cell coords
LV_RowX := ExtractInteger(LV_XYstruct,0,4) + LV_lx ;row upperleft x = itempos x + listview x
LV_RowX2 := ExtractInteger(LV_XYstruct,8,4) + LV_lx ;row bottomright x2 = itempos x2 + listview x
LV_currColWidth := LV_RowX2 - LV_RowX ;get cell width
If(LV_mx <= LV_RowX + LV_currColWidth) ;if mouse X pos less than column pos+width
{
LV_currCol := A_Index ;get current column number
Break
}
}
Return
CellReSize:
If(LV_RowX < LV_lx) ;make sure the cell is in view, then get the cell x coord again if it wasn't
{
LV_hscrollVal := LV_RowX - LV_lx - 4 ;get the difference
SendMessage,LVM_SCROLL,%LV_hscrollVal%,0,%LV_LV%,ahk_id %LV_guiID% ;scroll the column into view
VarSetCapacity(LV_XYstruct, 16, 0) ;recreate struct
NumPut(LVIR_LABEL ,LV_XYstruct,0) ;get just label coords
NumPut(LV_currCol-1,LV_XYstruct,4) ;0-based subitem index
SendMessage,LVM_GETSUBITEMRECT,%LV_currRow0%,&LV_XYstruct,%LV_LV%,ahk_id %LV_guiID% ;get cell coords
LV_RowX := ExtractInteger(LV_XYstruct,0,4) + LV_lx ;row upperleft x = itempos x + listview x
}
LV_scrollWidth := LV_TotalNumOfRows > LV_NumOfRows ? SM_CXVSCROLL : 0 ;0 if no vscroll, else = SM_CXVSCROLL
If(LV_RowX+LV_currColWidth > LV_lx+LV_lw-LV_scrollWidth) ;if edit will be too wide, shrink it
{
LV_currColWidth -= ((LV_RowX+LV_currColWidth) - (LV_lx+LV_lw-LV_scrollWidth)) + 3
}
Return
CellPosition:
LV_CellX_LV := LV_currCol ;get cell column
LV_CellY_LV := LV_currRow ;get cell row
LV_GetText(LV_coltxt,LV_CellY_LV,LV_CellX_LV) ;get the text
LV_edW := LV_currColWidth ;get control width
LV_edH := LV_currColHeight + 1 ;get control height
LV_edX := LV_RowX + 2 ;get control x pos
LV_edY := LV_RowY + 1 ;get control y pos
ControlMove,%LV_DispControl%,LV_edX,LV_edY,LV_edW,LV_edH ;move and size control
If(LV_DispControl = LV_ED)
{
GuiControl,1:,%LV_DispControl%,%LV_coltxt% ;set the text
}
GuiControl,1:Show,%LV_DispControl% ;show control
Return
CellHide:
SetTimer,CellHide,Off ;just to let the hotkeys work - can't have hotkeys in a func
GuiControl,1:Hide, %LV_ED% ;%LV_DispControl%
LV_Modify(LV_currRow, "Focus Select")
Return
;*************************end cell size and position stuff******************************
isEditFocused:
GuiControlGet,LV_cFoc,Focus
If(LV_cFoc != LV_DispControl)
{
SetTimer,isEditFocused,Off
Gosub CellHide
}
Return
EnterPressed: ;called from hotkey "enter"
If CurrentTab = Match
Return
Editing = 0
GuiControlGet,LV_fControl,Focus ;get control with focus
If(LV_fControl = LV_DispControl) ;if Edit, save any changes
{
Editing = 1
Gui,Submit,NoHide
LV_clickedRow := LV_topIndex + LV_currRow
LV_CellX_save = Col%LV_CellX_LV% ;save edit contents
LV_Modify(LV_CellY_LV,LV_CellX_save,LV_CellEdit)
Gosub CellHide
LV_fControl := LV_LV
LV_xChange = 1 ;set default values for enter key event
LV_yChange = 0
}
GoSub, GuiPreview
If(LV_fControl = LV_LV) ;listview has focus - arrows or enter pressed
{
LV_scrollChange = 0
SendMessage,LVM_GETITEMCOUNT,0,0,%LV_LV%,ahk_id %LV_guiID%
LV_TotalNumOfRows := ErrorLevel ;get total number of rows
LV_TotalNumOfCols := LV_GetCount("Column")-1 ;get total number of columns
GuiControl,1:Hide,%LV_ST% ;hide static control to avoid artifacts
LV_RowTmp := LV_currRow + LV_yChange < 1 ? 1 : LV_currRow + LV_yChange ;can't be less than one (up-down)
LV_ColTmp := LV_currCol + LV_xChange < 1 ? 1 : LV_currCol + LV_xChange ;can't be less than two (left-right)
LV_Modify(LV_RowTmp, "Focus Select") ;select new row
VarSetCapacity(LV_XYstruct, 16, 0) ;recreate struct
NumPut(LVIR_LABEL ,LV_XYstruct,0) ;get label info constant
NumPut(LV_ColTmp ,LV_XYstruct,4) ;subitem index
SendMessage,LVM_GETSUBITEMRECT,%LV_RowTmp%,&LV_XYstruct,%LV_LV%,ahk_id %LV_guiID% ;get cell coords
LV_mx := ExtractInteger(LV_XYstruct,0,4) + LV_lx ;row upperleft x = itempos x + listview x
LV_my := ExtractInteger(LV_XYstruct,4,4) + LV_ly ;row upperleft y = itempos y + listview y
Gosub CellInfo
;after all this must get cellinfo again if changed!
If(LV_scrollChange) ;if listview scroll value changed, recalc cell pos
{
VarSetCapacity(LV_XYstruct, 16, 0) ;recreate struct ;get the cell info again after any changes
NumPut(LVIR_LABEL ,LV_XYstruct,0) ;get label info constant
NumPut(LV_ColTmp ,LV_XYstruct,4) ;subitem index
SendMessage,LVM_GETSUBITEMRECT,%LV_currRow%,&LV_XYstruct,%LV_LV%,ahk_id %LV_guiID% ;get cell coords
LV_mx := ExtractInteger(LV_XYstruct,0,4) + LV_lx ;row upperleft x = itempos x + listview x
LV_my := ExtractInteger(LV_XYstruct,4,4) + LV_ly ;row upperleft y = itempos y + listview y
Gosub CellInfo
}
Keywait, Enter
If(LV_currCol = 2)
{
LV_DispControl := LV_ED ;make edit1 the default control
LV_spacer = %A_Space%
Gosub CellReSize
Gosub CellPosition
GuiControl,Focus,%LV_DispControl%
LV_Modify(LV_currRow, "-Focus -Select")
Send,+{End}
SetTimer,isEditFocused,75
}
}
Return
CommandPressed:
If(A_ThisHotkey="Esc") AND (CurrentTab <> "Match")
{
Gosub CellHide ;cancel
GuiControl,1:Show,%LV_ST%
}
Return
getClassNN(kID,kTxt=0,g=1) ;kID = control Hwnd ;kTxt = control text, default=0 ;g = gui number, default=1
{
Gui,%g%:+LastFound
guiID := WinExist() ;get the id for the gui
If(kTxt) and (!kID) ;don't do this if the id is provided
{
mm := A_TitleMatchMode
SetTitleMatchMode,3 ;exact match only
ControlGet,o,hWnd,,%kTxt%,ahk_id %guiID% ;get the id
SetTitleMatchMode,%mm% ;restore previous setting
If(o) ;found match
{
kID := o ;set sought-after id
}
}
WinGet, controls, ControlList, ahk_id %guiID%
Loop, Parse, controls, `n
{
ControlGet,o,hWnd,,%A_LoopField%,ahk_id %guiID% ;get the id
If(o = kID) ;found it
{
Return A_Loopfield ;return the classnn
}
}
}
InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4)
; The caller must ensure that pDest has sufficient capacity. To preserve any existing contents in pDest,
; only pSize number of bytes starting at pOffset are altered in it.
{
Loop %pSize% ; Copy each byte in the integer into the structure as raw binary data.
{
;DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
NumPut(pInteger, pDest + A_Index-1, pOffset, "UChar")
}
}
ExtractInteger(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4)
; pSource is a string (buffer) whose memory area contains a raw/binary integer at pOffset.
; The caller should pass true for pSigned to interpret the result as signed vs. unsigned.
; pSize is the size of PSource's integer in bytes (e.g. 4 bytes for a DWORD or Int).
; pSource must be ByRef to avoid corruption during the formal-to-actual copying process
; (since pSource might contain valid data beyond its first binary zero).
{
Loop %pSize% ; Build the integer by adding up its bytes.
result += *(&pSource + pOffset + A_Index-1) << 8*(A_Index-1)
if (!pIsSigned OR pSize > 4 OR result < 0x80000000)
return result ; Signed vs. unsigned doesn't matter in these cases.
; Otherwise, convert the value (now known to be 32-bit) to its signed counterpart:
return -(0xFFFFFFFF - result + 1)
}
;***** Tooltip by Micahs - http://www.autohotkey.com/community/viewtopic.php?p=262187#p262187 ******
/*
tooltipV2.ahk
Version: 1.2
By: Micahs
CallWith: (You can use Hwnd, var, text, classnn)
setTip("Button1", "This button does absolutely nothing.") ;using the classnn
setTip("Ok", "Begin the Process") ;using the caption
setTip("Cancel", "Cancel Whatever is Happening!")
setTip(DDL, "Dropdownlist") ;using the variable
setTip(MYEdit, "The infamous edit control") ;using the hwnd
*/
SetTip(tipControl, tipText, guiNum=1) ;tipControl - text,variable,hwnd,classnn ; tipText - text to display ; gui number, default is 1
{
global
local List_ClassNN
Gui,%guiNum%:Submit,NoHide
Gui,%guiNum%:+LastFound
WinGet, tipGui_guiID, ID
WinGet, List_ClassNN, ControlList
StringReplace, List_ClassNN, List_ClassNN, `n, `,, All
IfInString, tipControl, %List_ClassNN% ;it is a classnn
{ tipGui_ClassNN := tipControl ;use it as is
}
Else ;must be text/var or ID
{ tipGui_ClassNN := tipGui_getClassNN(tipControl, guiNum) ;get the classnn
}
tipGui_%guiNum%_%tipGui_ClassNN% := tipText ;set the tip
If(!tipGui_Init) ;enable tooltips when the first one is set, but only if TipsState has not been called (either to enable or disable)
{ TipsState(1)
}
}
TipsState(ShowToolTips)
{
global tipGui_Init
tipGui_Init = 1 ;iniialize this latch
If(ShowToolTips)
{ OnMessage(0x200, "WM_MOUSEMOVE") ;enable tips
}
Else
{ OnMessage(0x200, "") ;disable tips
}
}
WM_MOUSEMOVE()
{
global
IfEqual, A_Gui,, Return
MouseGetPos,,,tipGui_outW,tipGui_outC
If(tipGui_outC != tipGui_OLDoutC)
{ tipGui_OLDoutC := tipGui_outC
ToolTip,,,, 20
tipGui_counter := A_TickCount + 500
Loop
{ MouseGetPos,,,, tipGui_newC
IfNotEqual, tipGui_outC, %tipGui_newC%, Return
tipGui_looper := A_TickCount
IfGreater, tipGui_looper, %tipGui_counter%, Break
Sleep, 50
}
Gui, %A_Gui%:+LastFound
tipGui_ID := WinExist()
SetTimer, tipGui_killTip, 500
tooltip, % tipGui_%A_Gui%_%tipGui_outC%,,, 20
}
Return
tipGui_killTip:
tipGui_killTipCounter++
MouseGetPos,,, tipGui_outWm
If(tipGui_outWm != tipGui_ID) or (tipGui_killTipCounter >= 8) ;(A_TimeIdle >= 4000)
{ SetTimer, tipGui_killTip, Off
ToolTip,,,, 20
TipActive = 0
tipGui_killTipCounter=0
}
Return
}
tipGui_getClassNN(tipControl, g=1) ;tipControl = text/var,Hwnd ;g = gui number, default=1
{
Gui,%g%:+LastFound
guiID := WinExist() ;get the id for the gui
WinGet, List_controls, ControlList
StringReplace, List_controls, List_controls, `n, `,, All
;if id supplied do nothing special
IfNotInString, tipControl, %List_controls% ;must be the text/var - get the ID
{ mm := A_TitleMatchMode
SetTitleMatchMode, 3 ;exact match only
ControlGet, o, hWnd,, %tipControl% ;get the id
SetTitleMatchMode, %mm% ;restore previous setting
If(o) ;found match
{ tipControl := o ;set sought-after id
}
}
Loop, Parse, List_controls, CSV
{ ControlGet, o, hWnd,, %A_LoopField% ;get the id of current classnn
If(o = tipControl) ;if it is the one we want
{ Return A_Loopfield ;return the classnn
}
}
}