#COMPILE EXE "ShuffleGUI.exe" #RESOURCE "ShuffleGUI.pbr" #INCLUDE ONCE "inc\ReadShortcut.inc" #INCLUDE ONCE "inc\Registry.inc" #INCLUDE ONCE "inc\Tooltip.inc" #INCLUDE ONCE "inc\Ini.inc" #INCLUDE ONCE "inc\RunCmd.inc" #INCLUDE ONCE "inc\Icon.inc" #INCLUDE ONCE "inc\RTF.inc" $VER = "1.0" GLOBAL g_sc() AS STRING ' Shortcuts GLOBAL g_pc() AS LONG ' Pics (index in shortcuts) GLOBAL g_vd() AS LONG ' Vidz (index in shortcuts) GLOBAL g_an() AS LONG ' Anything (index in shortcuts) GLOBAL g_vlcpath AS STRING ' VLC path GLOBAL g_ratio AS SINGLE ' Grid aspect ratio GLOBAL g_icow AS LONG ' Grid icon size in pixels GLOBAL g_magick AS LONG ' Whether ImageMagick is installed or not MACRO DlgBgCol = GETSYSCOLOR(%COLOR_BTNFACE) '------------------------------------------------------------------------------------------- FUNCTION EXISTS(BYVAL f AS STRING) AS LONG LOCAL i AS LONG i = GETATTR(f) FUNCTION = (ERRCLEAR = 0) END FUNCTION '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- SUB WriteIni() LOCAL ff AS LONG ff = FREEFILE OPEN LEFT$(EXE.FULL$,-3)+"ini" FOR OUTPUT AS #ff PRINT #ff, "[ShuffleGUI-Config]" PRINT #ff, "# Grid aspect ratio, can be 16:9 or 4:3 or 1:1 etc." PRINT #ff, "grid-aspect-ratio=4:3" PRINT #ff, "# Size of grid icons, in pixel. For best aspect use 64" PRINT #ff, "grid-icon-size=64" CLOSE #ff END SUB '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- SUB ReadPrefs() LOCAL e AS STRING LOCAL w, h, i AS LONG ' Get grid aspect ratio e.g. 16:9, 4:3, 1:1 etc. e = GetIniS(LEFT$(EXE.FULL$,-3)+"ini", "ShuffleGUI-Config", "grid-aspect-ratio") i = INSTR(e, ":") IF i = 0 THEN ' syntax error g_ratio = 4/3 ELSE w = VAL(LEFT$(e,i-1)) h = VAL( MID$(e,i+1)) IF w = 0 OR h = 0 THEN ' out of bounds g_ratio = 4/3 ELSE g_ratio = w/h IF g_ratio <= 0.1 OR g_ratio >= 9 THEN g_ratio = 4/3 ' security END IF END IF ' Get grid icon size in pixels g_icow = GetIniV(LEFT$(EXE.FULL$,-3)+"ini", "ShuffleGUI-Config", "grid-icon-size") END SUB '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- FUNCTION ReadShortcut2(BYVAL LnkPath AS STRING) AS STRING ' Returns "P|Path\To\Shortcut.lnk|Path\To\Icon.ico|TargetFolder" if a Picture folder ' or "V|Path\To\Shortcut.lnk|Path\To\Icon.ico|TargetFolder" if a Video folder LOCAL Link AS LinkType LOCAL r, e AS STRING Link.zLinkName = (PATHNAME$(NAMEX, LnkPath)) Link.zLinkFolder = (PATHNAME$(PATH, LnkPath)) LinkQuery(Link) IF ISTRUE INSTR(Link.zExeName, "img-rnd") THEN r = "P|" ELSE r = "V|" r += LnkPath + "|" ' If shortcut created by img-rnd-builder or manually: take its icon IF ISFALSE INSTR(LCASE$(Link.zExeName), "vlc") THEN r + = Link.zIconFile ' If no specific icon (or vlc icon): is there an icon file at the same root? ' ImageMagick installed: any ico/bmp/png/jpg... will do (calls ConvertIco if needed) ELSEIF ISTRUE g_magick THEN r += SearchForIco((Link.zWorkDir)) ' ImageMagick NOT installed: need a .ico only! ELSEIF EXISTS((Link.zWorkDir)+".ico") THEN r += (Link.zWorkDir) + ".ico" ELSE r += "!" END IF r += "|" + Link.zWorkDir FUNCTION = r END FUNCTION '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- SUB DetectAllShortcuts() ' 1: P|V ' 2: Path\To\Shortcut.lnk ' 3: Path\To\Icon.ico ' 4: TargetFolder LOCAL e, tmp() AS STRING LOCAL i AS LONG REDIM g_sc(0), g_vd(0), g_pc(0), g_an(0) e = DIR$("*.lnk") WHILE LEN(e) ' Add to shortcuts REDIM PRESERVE g_sc(1 + UBOUND(g_sc)) g_sc(UBOUND(g_sc)) = ReadShortcut2(CURDIR$ + "\" + e) ' Continue with next shortcut e = DIR$(NEXT) WEND DIR$ CLOSE ' Sort alphabetically (pics & vidz folders mixed) DIM tmp(UBOUND(g_sc)) FOR i = 1 TO UBOUND(g_sc) tmp(i) = PATHNAME$(NAME, PARSE$(g_sc(i), "|", 2)) NEXT ARRAY SORT tmp(), COLLATE UCASE, TAGARRAY g_sc() ' Create pic/vid/anything lists REDIM g_an(UBOUND(g_sc)) FOR i = 1 TO UBOUND(g_sc) ' Add to anything g_an(i) = i ' Add to pics or vidz IF LEFT$(g_sc(i), 1) = "V" THEN REDIM PRESERVE g_vd(1 + UBOUND(g_vd)) g_vd(UBOUND(g_vd)) = i ELSE REDIM PRESERVE g_pc(1 + UBOUND(g_pc)) g_pc(UBOUND(g_pc)) = i END IF NEXT ' Randomize pics/vidz/anything lists RANDOMIZE TIMER FOR i = 1 TO UBOUND(g_pc) SWAP g_pc(RND(1,UBOUND(g_pc))), g_pc(RND(1,UBOUND(g_pc))) NEXT FOR i = 1 TO UBOUND(g_vd) SWAP g_vd(RND(1,UBOUND(g_vd))), g_vd(RND(1,UBOUND(g_vd))) NEXT FOR i = 1 TO UBOUND(g_an) SWAP g_an(RND(1,UBOUND(g_an))), g_an(RND(1,UBOUND(g_an))) NEXT END SUB '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- FUNCTION NextRndPic() AS LONG STATIC n AS LONG INCR n IF n > UBOUND(g_pc) THEN n = 1 FUNCTION = g_pc(n) END FUNCTION '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- FUNCTION NextRndVid() AS LONG STATIC n AS LONG INCR n IF n > UBOUND(g_vd) THEN n = 1 FUNCTION = g_vd(n) END FUNCTION '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- FUNCTION NextRndAnything() AS LONG STATIC n AS LONG INCR n IF n > UBOUND(g_an) THEN n = 1 FUNCTION = g_an(n) END FUNCTION '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- FUNCTION PBMAIN () AS LONG LOCAL w, h, n AS LONG LOCAL hDlg AS DWORD ' Check if ImageMagick is installed on the system g_magick = IsImageMagickInstalled() ' Get VLC path from registry LET g_vlcpath = GETREGVALUE(%HKEY_LOCAL_MACHINE, "SOFTWARE\VideoLAN\VLC", "") ' GetPreferences IF NOT EXISTS(LEFT$(EXE.FULL$,-3)+"ini") THEN WriteIni() ReadPrefs() ' Search for all shortcuts in current directory DetectAllShortcuts() n = CEIL(g_ratio * CEIL(SQR(UBOUND(g_sc)))) w = MAX(320, 10 + (g_icow+10) * n) h = MAX(240, 60 + (g_icow+10) * CEIL(UBOUND(g_sc)/n) + 30) ' Create dialog DIALOG NEW PIXELS, 0, "Shuffle GUI", , , w, h, %WS_POPUP _ OR %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR %WS_SYSMENU OR _ %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _ %DS_NOFAILCREATE OR %DS_SETFONT OR %WS_MINIMIZEBOX, %WS_EX_CONTROLPARENT OR _ %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg DIALOG SET ICON hDlg, "AICO" ' No shortcut found near program > readme IF n = 0 THEN ' Create RTF control LoadLibrary("RICHED32.DLL") CONTROL ADD "RichEdit", hDlg, 991, "", 8, 8, w-16, h-40, _ %WS_CHILD OR %WS_VISIBLE OR %ES_MULTILINE _ OR %ES_READONLY OR %WS_VSCROLL Fill_RichEdit hDlg, 991 CONTROL ADD BUTTON, hDlg, %IDCANCEL, "OK", (w-60)\2, h-32, 60, 24 ' Shortcuts found near the program > GUI ELSE ' Build header: ' Any picture CONTROL ADD GRAPHIC, hDlg, 991, "", 5, 22, 16, 16 GRAPHIC ATTACH hDlg, 991 GRAPHIC CLEAR DlgBgCol GraphicDrawIconDll hDlg, 991, "imageres.dll", 67, 0, 0, 16, 16 CONTROL ADD BUTTON, hDlg, 992, "Any picture", 21, 20, 80, 20 ' Any video CONTROL ADD GRAPHIC, hDlg, 993, "", 110, 22, 16, 16 GRAPHIC ATTACH hDlg, 993 GRAPHIC CLEAR DlgBgCol GraphicDrawIconDll hDlg, 993, (g_vlcpath), 0, 0, 0, 16, 16 CONTROL ADD BUTTON, hDlg, 994, "Any video", 126, 20, 80, 20 ' Anything CONTROL ADD GRAPHIC, hDlg, 995, "", 215, 22, 16, 16 GRAPHIC ATTACH hDlg, 995 GRAPHIC CLEAR DlgBgCol GraphicDrawIconDll hDlg, 995, "imageres.dll", 95, 0, 0, 16, 16 CONTROL ADD BUTTON, hDlg, 996, "Anything!", 231, 20, 80, 20 ' Build footer: CONTROL ADD LINE, hDlg, 888, "", 2, h-23, w-4, 1 CONTROL ADD LABEL, hDlg, 997, "v" + $VER + " (c) mougino.free.fr 2025", 10, h-18, 150, 16, %SS_NOTIFY CONTROL ADD GRAPHIC, hDlg, 998, "", 160, h-19, 16, 16, %SS_NOTIFY GRAPHIC ATTACH hDlg, 998 GRAPHIC CLEAR DlgBgCol GraphicDrawIconDll hDlg, 998, "imageres.dll", 76, 0, 0, 16, 16 END IF ' Show dialog DIALOG SHOW MODAL hDlg CALL DlgProc END FUNCTION '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- MACRO LaunchShortcut(sc_ini) MACROTEMP sc_n DIM sc_n AS LONG sc_n = sc_ini ShellExecute %NULL, "open", PARSE$(g_sc(sc_n), "|", 2), "", "", %SW_SHOW FOR i = 1 TO 3 CONTROL SHOW STATE CB.HNDL, 1000+sc_n, %SW_HIDE DIALOG REDRAW CB.HNDL SLEEP 500 CONTROL SHOW STATE CB.HNDL, 1000+sc_n, %SW_SHOW DIALOG REDRAW CB.HNDL SLEEP 500 NEXT END MACRO '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- CALLBACK FUNCTION DlgProc () AS LONG LOCAL i, j, k, n, w, h, x, y AS LONG LOCAL hFnt AS DWORD LOCAL r AS STRING SELECT CASE CB.MSG CASE %WM_INITDIALOG SetTimer(CB.HNDL, 0, 50, 0) 'start prebuffer monitoring CASE %WM_SETCURSOR ' change cursor to link-hand when hovering over controls i = GetDlgCtrlId(CB.WPARAM) IF i >= 997 AND i <= 1000 + UBOUND(g_sc) THEN SetCursor LoadCursor(%NULL, BYVAL %IDC_HAND) SetWindowLong CB.HNDL, %dwl_msgresult, 1 FUNCTION = 1 END IF CASE %WM_TIMER KillTimer(CB.HNDL, 0) n = CEIL(g_ratio * CEIL(SQR(UBOUND(g_sc)))) FONT NEW "", 7, 0, 0, 0, 0 TO hFnt FOR j = 1 TO CEIL(UBOUND(g_sc)/n) FOR i = 1 TO n IF n*(j-1)+i > UBOUND(g_sc) THEN EXIT FOR x = 4 + (g_icow + 10) * (i - 1) y = 60 + (g_icow + 10) * (j - 1) ' Create graphic control CONTROL ADD GRAPHIC, CB.HNDL, 1000 + n*(j-1)+i, "", x, y, g_icow, g_icow+2, %SS_NOTIFY SetTooltip CB.HNDL, 1000 + n*(j-1)+i, PARSE$(g_sc(n*(j-1)+i), "|", 4) GRAPHIC ATTACH CB.HNDL, 1000 + n*(j-1)+i, REDRAW r = PARSE$(g_sc(n*(j-1)+i), "|", 3) ' shortcut icon path IF r = "!" OR r = "" THEN ' Draw custom folder icon GRAPHIC BOX (6,0)-(6+g_icow,g_icow), 0, RGB(235,199,100), RGB(235,199,100) ELSE ' Render pic shortcut icon GraphicDrawIconFile CB.HNDL, 1000 + n*(j-1)+i, r, 6, 0, g_icow, g_icow END IF ' Carve the icon to make it look like a folder: GRAPHIC BOX (6,0)-(10,g_icow+6), 0, DlgBgCol, DlgBgCol ' left border GRAPHIC BOX (g_icow+2,0)-(g_icow+6,g_icow+6), 0, DlgBgCol, DlgBgCol ' right border GRAPHIC BOX (6,0)-(g_icow+6,8), 0, DlgBgCol, DlgBgCol ' top border GRAPHIC BOX (6,g_icow-10)-(g_icow+6,g_icow+6), 0, DlgBgCol, DlgBgCol ' bottom border GRAPHIC BOX (36,0)-(g_icow+12,15), -2, DlgBgCol, DlgBgCol ' top right carving ' Print shortcut name r = PATHNAME$(NAME, PARSE$(g_sc(n*(j-1)+i), "|", 2)) IF MID$(r, LEN(r)-2, 1) = "_" AND RIGHT$(r, 1) = "c" THEN r = LEFT$(r, -3) GRAPHIC SET FONT hFnt GRAPHIC COLOR -1, -1 GRAPHIC TEXT SIZE r TO w, h GRAPHIC SET POS (MAX(0,6+(g_icow-w)\2), g_icow-10) GRAPHIC PRINT r ' Draw scale on left if applicable GRAPHIC ATTACH CB.HNDL, 1000 + n*(j-1)+i r = PATHNAME$(NAME, PARSE$(g_sc(n*(j-1)+i), "|", 2)) IF RIGHT$(r, 3) = "_hc" THEN GRAPHIC BOX (0,12+1*(g_icow-16)\8)-(9,11+2*(g_icow-16)\8), -1, RGB(177,30,12), RGB(177,30,12) GRAPHIC BOX (1,12+2*(g_icow-16)\8)-(9,11+3*(g_icow-16)\8), -1, RGB(249,65,30), RGB(249,65,30) END IF IF RIGHT$(r, 3) = "_hc" OR RIGHT$(r, 3) = "_mc" THEN GRAPHIC BOX (2,12+3*(g_icow-16)\8)-(9,11+4*(g_icow-16)\8), -1, RGB(254,183,7), RGB(254,183,7) GRAPHIC BOX (3,12+4*(g_icow-16)\8)-(9,11+5*(g_icow-16)\8), -1, RGB(250,210,50), RGB(250,210,50) END IF IF RIGHT$(r, 3) = "_hc" OR RIGHT$(r, 3) = "_mc" OR RIGHT$(r, 3) = "_sc" THEN GRAPHIC BOX (4,12+5*(g_icow-16)\8)-(9,11+6*(g_icow-16)\8), -1, RGB(124,188,3), RGB(124,188,3) GRAPHIC BOX (5,12+6*(g_icow-16)\8)-(9,11+7*(g_icow-16)\8), -1, RGB(153,209,46), RGB(153,209,46) END IF ' Video folder -> draw VLC icon in overlay ' Picture folder -> system image icon IF PARSE$(g_sc(n*(j-1)+i), "|", 1) = "V" THEN r = (g_vlcpath) : k = 0 ELSE r = "imageres.dll" : k = 67 END IF GraphicDrawIconDll CB.HNDL, 1000 + n*(j-1)+i, r, k, 0, 0, 16, 16 GRAPHIC REDRAW NEXT i IF n*(j-1)+i > UBOUND(g_sc) THEN EXIT FOR NEXT j DIALOG REDRAW CB.HNDL ' Process RTF hyperlinks CASE %WM_NOTIFY IF CB.NMID = 991 AND CB.NMCODE = %EN_LINK THEN RTF_hyperlink CB.HNDL, 991, CB.LPARAM CASE %WM_COMMAND IF CB.CTLMSG <> %BN_CLICKED THEN EXIT FUNCTION ' Click on the footer IF CB.CTL = 997 OR CB.CTL = 998 THEN ShellExecute %NULL, "open", "http://mougino.free.fr/freeware", "", "", %SW_SHOW ' Click on a shortcut ELSEIF CB.CTL > 1000 AND CB.CTL <= 1000 + UBOUND(g_sc) THEN LaunchShortcut (CB.CTL - 1000) ' Click on "Any picture" ELSEIF CB.CTL = 992 THEN LaunchShortcut (NextRndPic()) ' Click on "Any video" ELSEIF CB.CTL = 994 THEN LaunchShortcut (NextRndVid()) ' Click on "Anything!" ELSEIF CB.CTL = 996 THEN LaunchShortcut (NextRndAnything()) ' Click on "OK" in the readme ELSEIF CB.CTL = %IDCANCEL THEN DIALOG END CB.HNDL END IF END SELECT END FUNCTION '------------------------------------------------------------------------------------------- '------------------------------------------------------------------------------------------- SUB Fill_RichEdit (hD AS DWORD, CtlId AS LONG) LOCAL richtext AS STRING richtext = "[black][c]" richtext += "[font:o,11][b]ShuffleGUI.exe v" + $VER + "[/b][eol][l]" richtext += "[font:o,9][black][l][eol]" richtext += "This program works best displaying the shortcuts produced by " richtext += "[blue]img-rnd[black] (http://mougino.free.fr/freeware/#imgrnd) and " richtext += "[blue]VLC Folder[black] (http://mougino.free.fr/freeware/#vspf).[eol]" richtext += "[eol]" richtext += "If you want to see a small demo, double-click on " richtext += "[blue]UnpackDemo.exe [black], provided in the download archive, " richtext += "then run this program again.[eop]" richtext += "[eol]" richtext += "[c][b][maroon]C[red]r[fuschia]e[purple]a[blue]t[teal]e[green]d [lime]b[grey]y [maroon]m[red]o[fuschia]u[purple]g[blue]i[teal]n[green]o[lime]" richtext += " - http://mougino.free.fr[/b]" richtext += "[eol]" richtext += "[eop]" RTF_SET hD, CtlId, richtext END SUB '-------------------------------------------------------------------------------------------