File "MaNo skin manager.bas"
Path: /MaNo skin mgr/MaNo skin manager.bas
File size: 13.53 KB
MIME-type:
Charset: utf-8
#COMPILE EXE "MaNo skin manager.exe"
#DIM ALL
$DATE = "2021-11-15"
'------------------------------------------------------------------------------
' ** Includes **
'------------------------------------------------------------------------------
#RESOURCE "res\skinmgr.pbr"
#INCLUDE ONCE "WIN32API.INC"
#INCLUDE ONCE "SHFOLDER.INC"
#INCLUDE ONCE ".\SAVEPOS.INC"
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** Constants **
'------------------------------------------------------------------------------
%IDC_LABEL1 = 1001
%IDC_LABEL2 = 1002
%IDC_BUTTON1 = 1003
%IDC_FRAME1 = 1004
%IDC_LISTBOX1 = 1005
%IDC_TEXTBOX1 = 1006
%IDC_GRAPHIC1 = 1007
%IDC_BUTTON2 = 1008
'------------------------------------------------------------------------------
GLOBAL mano_path AS STRING
GLOBAL skin_file() AS STRING
GLOBAL skin_name() AS STRING
GLOBAL skin_desc() AS STRING
GLOBAL skin_auth() AS STRING
GLOBAL skin_vers() AS STRING
GLOBAL skin_nb AS LONG
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** Main Application Entry Point **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()
MainShow %HWND_DESKTOP
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION MainProc()
LOCAL i AS LONG
LOCAL s, r AS STRING
CB_SAVEPOS()
SELECT CASE AS LONG CB.MSG
CASE %WM_INITDIALOG
' Initialization handler
mano_path = GetIniS(LocalAppData + "skinmgr.ini", "MaNo", "exe_path")
IF mano_path = "" THEN ' try to auto-detect MaNo.exe
CONTROL DISABLE CB.HNDL, %IDC_BUTTON2
s = EXE.PATH$
WHILE INSTR(s, "\") > 0 AND mano_path = ""
r = DIR$(s + "MaNo.exe") : DIR$ CLOSE
IF r <> "" THEN
mano_path = s
ELSE
i = INSTR(-2, s, "\")
IF i > 0 THEN s = LEFT$(s, i) ELSE s = ""
END IF
WEND
END IF
IF mano_path <> "" THEN
SetIni LocalAppData + "skinmgr.ini", "MaNo", "exe_path", mano_path
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, " " + mano_path
CONTROL ENABLE CB.HNDL, %IDC_BUTTON2
END IF
CASE %WM_COMMAND
' Process control notifications
SELECT CASE AS LONG CB.CTL
CASE %IDC_BUTTON1 ' Locate MaNo.exe
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
s = CHR$("MaNo executable", 0)
s += CHR$("MaNo.exe", 0)
DISPLAY OPENFILE CB.HNDL, -120, 0, "Locate MaNo.exe", "", s, _
"", "", %OFN_FILEMUSTEXIST TO s
IF s = "" THEN EXIT FUNCTION
i = INSTR(-2, s, "\")
mano_path = LEFT$(s, i)
SetIni LocalAppData + "skinmgr.ini", "MaNo", "exe_path", mano_path
CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, " " + mano_path
CONTROL ENABLE CB.HNDL, %IDC_BUTTON2
END IF
CASE %IDC_LISTBOX1
IF CB.CTLMSG = %LBN_DBLCLK THEN
IF mano_path = "" THEN EXIT FUNCTION
LISTBOX GET SELECT CB.HNDL, CB.CTL TO i
LISTBOX GET USER CB.HNDL, CB.CTL, i TO i
ApplySkin skin_file(i)
ELSEIF CB.CTLMSG = %LBN_SELCHANGE THEN
LISTBOX GET SELECT CB.HNDL, CB.CTL TO i
LISTBOX GET USER CB.HNDL, CB.CTL, i TO i
CONTROL SET TEXT CB.HNDL, %IDC_TEXTBOX1, skin_desc(i) + " - by " _
+ skin_auth(i) + ", " + skin_vers(i)
Preview skin_file(i), CB.HNDL
END IF
CASE %IDC_BUTTON2 ' Apply skin to MaNo
IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
IF mano_path = "" THEN EXIT FUNCTION
LISTBOX GET SELECT CB.HNDL, %IDC_LISTBOX1 TO i
LISTBOX GET USER CB.HNDL, %IDC_LISTBOX1, i TO i
ApplySkin skin_file(i)
END IF
END SELECT
END SELECT
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
SUB Preview(file AS STRING, hDlg AS DWORD)
LOCAL c AS DWORD
LOCAL i, x AS LONG
' Attach graphic control
GRAPHIC ATTACH hDlg, %IDC_GRAPHIC1, REDRAW ' 160 x 122
GRAPHIC BOX (0,0)-(160,122),,%WHITE,%WHITE
' Draw line number margin
IF ISTRUE GetIniV(file, "editor", "LineNbShow") THEN
c = Hex_To_Rgb(GetIniS(file, "editor", "LineNbBackColor"))
GRAPHIC BOX (0,0)-(30,122),,c,c
GRAPHIC COLOR Hex_To_Rgb(GetIniS(file, "editor", "LineNbForeColor")), c
FOR i = 5 TO 105 STEP 10
GRAPHIC SET POS (20, i)
GRAPHIC PRINT "**"
NEXT
x = 31
END IF
' Draw richedit zone
c = Hex_To_Rgb(GetIniS(file, "editor", "TextBackColor"))
GRAPHIC BOX (x,0)-(160,122),,c,c
GRAPHIC COLOR Hex_To_Rgb(GetIniS(file, "editor", "TextForeColor")), c
FOR i = 3 TO 103 STEP 10
GRAPHIC SET POS (x,i)
GRAPHIC PRINT STRING$(RND(10,30), "-")
NEXT
' Redraw
GRAPHIC REDRAW
END SUB
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
FUNCTION Hex_To_Rgb(h AS STRING) AS LONG
LOCAL r, g, b AS LONG
LOCAL c AS STRING
c = RIGHT$("000000" + h, 6)
r = VAL("&H" + LEFT$(c,2))
g = VAL("&H" + MID$(c,3,2))
b = VAL("&H" + RIGHT$(c,2))
FUNCTION = RGB(r,g,b)
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' returns a string from ini file
'------------------------------------------------------------------------------
FUNCTION GetIniS (BYVAL iniFile AS STRING, BYVAL sSection AS STRING, _
BYVAL sKey AS STRING) EXPORT AS STRING
LOCAL zText AS ASCIIZ * 255
GetPrivateProfileString BYCOPY sSection, BYCOPY sKey, "", zText, _
SIZEOF(zText), BYCOPY iniFile
FUNCTION = zText
END FUNCTION
'------------------------------------------------------------------------------
' returns a number from ini file
'------------------------------------------------------------------------------
FUNCTION GetIniV (BYVAL iniFile AS STRING, BYVAL sSection AS STRING, _
BYVAL sKey AS STRING) EXPORT AS LONG
LOCAL zText AS ASCIIZ * 255
GetPrivateProfileString BYCOPY sSection, BYCOPY sKey, "0", zText, _
SIZEOF(zText), BYCOPY iniFile
FUNCTION = VAL(zText)
END FUNCTION
'------------------------------------------------------------------------------
' sets a string in ini file
'------------------------------------------------------------------------------
FUNCTION SetIni (BYVAL iniFile AS STRING, BYVAL sSection AS STRING, _
BYVAL sKey AS STRING, BYVAL sValue AS STRING) AS LONG
FUNCTION = WritePrivateProfileString (BYCOPY sSection, BYCOPY sKey, _
BYCOPY sValue, BYCOPY iniFile)
END FUNCTION
'------------------------------------------------------------------------------
' ** Sample Code **
'------------------------------------------------------------------------------
FUNCTION SampleListBox(BYVAL hDlg AS DWORD, BYVAL lID AS LONG) AS LONG
LOCAL i AS LONG
LOCAL e AS STRING
LISTBOX RESET hDlg, lID
skin_nb = 0
e = DIR$(EXE.PATH$ + "*.ini")
WHILE LEN(e) AND e <> "skinmgr.ini"
INCR skin_nb
REDIM PRESERVE skin_file(1 TO skin_nb)
REDIM PRESERVE skin_name(1 TO skin_nb)
REDIM PRESERVE skin_desc(1 TO skin_nb)
REDIM PRESERVE skin_auth(1 TO skin_nb)
REDIM PRESERVE skin_vers(1 TO skin_nb)
skin_file(skin_nb) = EXE.PATH$ + e
skin_name(skin_nb) = GetIniS(EXE.PATH$ + e, "info", "Skin")
skin_desc(skin_nb) = GetIniS(EXE.PATH$ + e, "info", "Description")
skin_auth(skin_nb) = GetIniS(EXE.PATH$ + e, "info", "Author")
skin_vers(skin_nb) = GetIniS(EXE.PATH$ + e, "info", "Version")
LISTBOX ADD hDlg, lID, skin_name(skin_nb)
LISTBOX FIND EXACT hDlg, lID, 1, skin_name(skin_nb) TO i
LISTBOX SET USER hDlg, lID, i, skin_nb
e = DIR$(NEXT)
WEND
DIR$ CLOSE
LISTBOX SELECT hDlg, lID, 1
LISTBOX GET USER hDlg, lID, 1 TO i
CONTROL SET TEXT hDlg, %IDC_TEXTBOX1, skin_desc(i) + " - by " _
+ skin_auth(i) + ", " + skin_vers(i)
Preview skin_file(i), hDlg
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION MainShow(BYVAL hParent AS DWORD) AS LONG
LOCAL lRes AS LONG
LOCAL hDlg AS DWORD
DIALOG NEW PIXELS, hParent, "MaNo skin manager ("+$DATE+")",,, 409, 225, _
%WS_POPUP OR %WS_BORDER OR %WS_DLGFRAME OR %WS_CAPTION OR _
%WS_SYSMENU OR %WS_MINIMIZEBOX OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR _
%DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, _
%WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
%WS_EX_RIGHTSCROLLBAR, TO hDlg
DIALOG SET ICON hDlg, "AICO"
CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "MaNo.exe in", 8, 8, 64, 16
CONTROL ADD LABEL, hDlg, %IDC_LABEL2, " <not found>", 72, 8, 288, 16, _
%WS_CHILD OR %WS_VISIBLE OR %SS_LEFT OR %SS_SUNKEN OR %SS_PATHELLIPSIS, _
%WS_EX_LEFT OR %WS_EX_LTRREADING
CONTROL SET COLOR hDlg, %IDC_LABEL2, %BLACK, %WHITE
CONTROL ADD BUTTON, hDlg, %IDC_BUTTON1, "...", 360, 7, 32, 18
CONTROL ADD FRAME, hDlg, %IDC_FRAME1, "Available skins / Send yours to mougino@free.fr !", 8, 32, 384, 184
CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX1, , 24, 56, 184, 100
CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "", 24, 158, 184, 48, _
%ES_READONLY OR %WS_BORDER OR %ES_MULTILINE OR %ES_WANTRETURN
CONTROL SET COLOR hDlg, %IDC_TEXTBOX1, %RGB_NAVY, %WHITE
CONTROL ADD GRAPHIC, hDlg, %IDC_GRAPHIC1, "", 216, 56, 160, 122, _
%WS_CHILD OR %WS_VISIBLE OR %SS_SUNKEN
CONTROL ADD BUTTON, hDlg, %IDC_BUTTON2, "Apply to MaNo (restart)", 216, 182, 160, 24
SampleListBox hDlg, %IDC_LISTBOX1
DIALOG SHOW MODAL hDlg, CALL MainProc TO lRes
FUNCTION = lRes
END FUNCTION
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
TYPE WindowList
hwnd AS DWORD
Parent AS LONG
R AS RECT
END TYPE
'------------------------------------------------------------------------------
MACRO SET_INI_KEY(k) = SetIni mano_path + "MaNo.ini", "editor", k, GetIniS(skin, "editor", k)
'------------------------------------------------------------------------------
FUNCTION ParentCallback (BYVAL hWndChild AS LONG, BYREF wList() AS WindowList) AS LONG
LOCAL szParentClass AS ASCIIZ * %MAX_PATH
LOCAL aResult, iCount AS LONG
aResult = GetClassName(hWndChild, szParentClass, SIZEOF(szParentClass))
iCount = UBOUND(wList) + 1
REDIM PRESERVE wList(iCount)
wList(iCount).PARENT = 1
wList(iCount).hwnd = hWndChild
FUNCTION = %TRUE ' continue top-level enumeration...
END FUNCTION
'--------------------------------------------------------------------------------
SUB ApplySkin(skin AS STRING)
LOCAL i AS LONG
LOCAL e AS STRING
LOCAL wList() AS WindowList
LOCAL szClass, szText AS ASCIIZ * %MAX_PATH
' Apply new skin to MaNo.ini
SET_INI_KEY("TextFont")
SET_INI_KEY("TextSize")
SET_INI_KEY("TextForeColor")
SET_INI_KEY("TextBackColor")
SET_INI_KEY("LineNbShow")
SET_INI_KEY("LineNbFont")
SET_INI_KEY("LineNbSize")
SET_INI_KEY("LineNbForeColor")
SET_INI_KEY("LineNbBackColor")
' (Re)start MaNo.exe
EnumWindows(CODEPTR(ParentCallback), BYVAL VARPTR(wList())) ' Retrieve top level window names
REDIM PRESERVE wList(UBOUND(wList))
FOR i = 0 TO UBOUND(wList)
GetClassName wList(i).hwnd, szClass, SIZEOF(szClass)
IF INSTR(szClass, "MaNo_Class") = 1 THEN
GetWindowText wList(i).hwnd, szText, SIZEOF(szText)
EXIT FOR
END IF
NEXT
IF szText <> "" THEN ' MaNo already running > restart1 it
SendMessage wList(i).hwnd, %WM_CLOSE, 0, 0
END IF
i = SHELL(mano_path + "MaNo.exe")
END SUB
'------------------------------------------------------------------------------