File "ComicDir2Cbr.bas"
Path: /ComicDir2Cbr/ComicDir2Cbr.bas
File size: 8.14 KB
MIME-type:
Charset: utf-8
#COMPILE EXE "ComicDir2Cbr.exe"
' [X] handle drag & drop (in idle mode only)
' [X] add help icon + link to online manual
' [X] n CBR already existing : Replace All ? (Click 'No' to skip them)
#INCLUDE ONCE "Windows.inc"
#INCLUDE ONCE "inc\ComicDir2Cbr.inc"
#INCLUDE ONCE "inc\TextProgressBar.inc"
#INCLUDE ONCE "inc\CenterMsgbox.inc"
#INCLUDE ONCE "inc\Resource.inc"
#INCLUDE ONCE "inc\RunCmd.inc"
#INCLUDE ONCE "inc\Rar.inc"
#RESOURCE "res\comic2cbr.pbr"
%WM_STEP_NOTIFY = %WM_USER + 199
%WM_RAR_END = %WM_USER + 200
%WM_RAR_ERR = %WM_USER + 201
GLOBAL comicdir() AS STRING
GLOBAL ndir, replaceAll AS LONG
'-------------------------------------------------------------------------------------
FUNCTION ListComicDirs(src AS STRING) AS LONG
' Fill global string array 'comicdir()' with the folders candidate to convert to CBR
' Fills global long 'ndir' with the total number of candidate folders
' Return number of already existing CBRs
LOCAL rep, t AS STRING
LOCAL i, j AS LONG
ndir = 1
replaceAll = 0
IF src <> "" THEN rep = RTRIM$(src,"\") + "\"
IF INSTR(rep, EXE.PATH$) = 1 THEN rep = MID$(rep, LEN(EXE.PATH$) + 1)
comicdir(ndir) = DIR$(rep + "*.*", ONLY 16) 'search for subfolders only
WHILE comicdir(ndir) <> ""
' t += left$(comicdir(ndir),30) + $cr
comicdir(ndir) = rep + comicdir(ndir) ' prepend root folder
INCR ndir
comicdir(ndir) = DIR$(NEXT)
WEND
DIR$ CLOSE
DECR ndir ' last one is empty
' t = format$(ndir) + " raw dirs - list:"+$cr+t+$cr
' Only keep comic folders (containing at least 2 jpgs or 2 pngs)
FOR i = ndir TO 1 STEP -1
IF NOT HasPngs(comicdir(i)) AND NOT HasJpgs(comicdir(ndir)) THEN
FOR j = ndir-1 TO i STEP -1
comicdir(j) = comicdir(j+1)
NEXT
DECR ndir
END IF
NEXT
' t += FORMAT$(ndir) + " comic dirs - list:" + $cr
' FOR i = 1 to ndir
' t += left$(comicdir(i),30) + $cr
' NEXT
' ?t,,exe.name$
' List already existing CBRs
j = 0
FOR i = 1 TO ndir
IF EXIST(comicdir(i) + ".cbr") THEN INCR j
NEXT i
FUNCTION = j
END FUNCTION
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
FUNCTION PBMAIN () AS LONG
LOCAL hDlg, hFont AS DWORD
' Check if needed files exist, else dump them:
IF NOT EXIST(LocalAppData + "rar.exe") THEN
DUMP2FILE RCDATA$("RAR"), LocalAppData + "rar.exe"
END IF
KILL EXE.NAME$ + ".log"
' Build main dialog
DIALOG NEW PIXELS, 0, EXE.NAME$, , , 320, 160, _
%DS_MODALFRAME OR %WS_CAPTION OR %WS_POPUP OR %WS_SYSMENU _
OR %WS_MINIMIZEBOX, %WS_EX_ACCEPTFILES TO hDlg
FONT NEW "Lucida Console", 10, 0, %ANSI_CHARSET TO hFont
DIALOG SET COLOR hDlg, %BLACK, %WHITE
CONTROL ADD LABEL, hDlg, 1001, "", 8, 18, 314, 16
CONTROL SET COLOR hDlg, 1001, %BLACK, %WHITE
CONTROL SET FONT hDlg, 1001, hFont
ADD_TEXT_PROGRESSBAR hDlg, 1002, 8, 50, 304, 20
ADD_TEXT_PROGRESSBAR hDlg, 1003, 8, 74, 304, 20
CONTROL ADD BUTTON, hDlg, 1004, "START CBR CONVERSION", 8, 120, 280, 24
CONTROL SET FONT hDlg, 1004, hFont
CONTROL ADD BUTTON, hDlg, 1005, "?", 290, 120, 24, 24
CONTROL SET FONT hDlg, 1005, hFont
DIALOG SET ICON hDlg, "AICO"
DIALOG SHOW MODAL hDlg, CALL ProcMainDialog
FONT END hFont
END FUNCTION
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
MACRO PrepareNewConversion
IF ndir = 0 THEN
t = "No comic folder to convert."
CONTROL DISABLE CB.HNDL, 1004
ELSE
t = "Ready to convert " + FORMAT$(ndir, "0") + " comic folder" + IIF$(ndir=1, "", "s") + "."
CONTROL ENABLE CB.HNDL, 1004
END IF
CONTROL SET TEXT CB.HNDL, 1001, t
SET_TEXT_PROGRESSBAR CB.HNDL, 1002, 0, ""
SET_TEXT_PROGRESSBAR CB.HNDL, 1003, 0, ""
END MACRO
'-------------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
CALLBACK FUNCTION ProcMainDialog
LOCAL t AS STRING
LOCAL i, n AS LONG
STATIC hThread AS DWORD
STATIC cbrOvw AS LONG
RAR_CALLBACK ' call upload callback
SELECT CASE AS LONG CB.MSG
CASE %WM_INITDIALOG
DIM comicdir(1 TO 999)
cbrOvw = ListComicDirs("") ' List comic dirs in exe path subfolders, return existing CBRs
PrepareNewConversion
CASE %WM_DROPFILES ' Drag and drop folder on program to convert it and its neighbors
IF hThread <> 0 THEN ' only when program is not already running
CONTROL SET TEXT CB.HNDL, 1001, "Retry drag'n drop after conversion."
BEEP
EXIT FUNCTION
END IF
IF DragQueryFile(CB.WPARAM, -1, BYVAL 0, 0) > 1 THEN BEEP : EXIT FUNCTION ' ignore multiple folders
LOCAL zStr AS ASCIIZ * %MAX_PATH
DragQueryFile CB.WPARAM, i, zStr, SIZEOF(zStr)
t = TRIM$(zStr)
t = LEFT$(t, INSTR(-1, t, "\"))
DragFinish CB.WPARAM
cbrOvw = ListComicDirs(t) ' list comic dirs in new drag'n dropped folder + neighbors, return existing CBRs
PrepareNewConversion
CASE %WM_STEP_NOTIFY
i = CB.WPARAM - 1 ' CB.WPARAM = folder starting to be treated
n = CB.LPARAM ' CB.LPARAM = total number of folders
t = "Converting comic folder #" + FORMAT$(i+1, "0")
IF i < 0 THEN t = ""
SET_TEXT_PROGRESSBAR CB.HNDL, 1002, INT(100*i/n), t
CASE %WM_RAR_END
SET_TEXT_PROGRESSBAR CB.HNDL, 1002, 100, ""
SET_TEXT_PROGRESSBAR CB.HNDL, 1003, 100, ""
CONTROL SET TEXT CB.HNDL, 1001, FORMAT$(ndir, "0") + " comic folder" + IIF$(ndir=1, "", "s") + " converted to CBR!"
THREAD CLOSE hThread TO i
hThread = 0
CASE %WM_RAR_ERR
THREAD CLOSE hThread TO i
hThread = 0
CASE %WM_COMMAND
IF CB.CTL = 1004 AND CB.CTLMSG = %BN_CLICKED THEN
CONTROL DISABLE CB.HNDL, CB.CTL
IF cbrOvw > 0 THEN ' number of target CBRs already existing
i = CMSGBOX(CB.HNDL, FORMAT$(cbrOvw) + " CBR" + IIF$(n=1,"","s") _
+ " already existing : Replace All ?" + $CR _
+ "(Click 'No' to skip them)", _
EXE.NAME$, %MB_ICONQUESTION + %MB_YESNOCANCEL)
IF i = %IDCANCEL THEN CONTROL ENABLE CB.HNDL, CB.CTL : EXIT FUNCTION
replaceAll = (%IDYES = i)
END IF
THREAD CREATE CreateCbrs(CB.HNDL) TO hThread
ELSEIF CB.CTL = 1005 AND CB.CTLMSG = %BN_CLICKED THEN
ShellExecute %NULL, "open", "http://mougino.free.fr/ComicDir2Cbr.htm", "", "", %SW_SHOW
END IF
CASE %WM_DESTROY
THREAD CLOSE hThread TO i
END SELECT
END FUNCTION
'------------------------------------------------------------------------------
'-------------------------------------------------------------------------------------
THREAD FUNCTION CreateCbrs(BYVAL hDlg AS DWORD) AS LONG
LOCAL i AS LONG
KILL EXE.NAME$ + ".log"
FOR i = 1 TO ndir
DIALOG POST hDlg, %WM_STEP_NOTIFY, i, ndir
IF RAR (hDlg, 1003, comicdir(i) + ".cbr", comicdir(i)) > 0 THEN
' RAR returns 0 if achieved or error-code (>0) in case of failure
DIALOG POST hDlg, %WM_RAR_ERR, 0, 0
FUNCTION = 1
EXIT FUNCTION
END IF
NEXT
DIALOG POST hDlg, %WM_STEP_NOTIFY, 0, ndir
DIALOG POST hDlg, %WM_RAR_END, 0, 0
FUNCTION = 1
EXIT FUNCTION
END FUNCTION
'-------------------------------------------------------------------------------------