Lone Shepherd
5th May 2008 15:07 UTC
Handling a variable number of sections?
The installer I am working on has the primary function of copying over some library files and creating a couple of scripts based on user input during the install.
The installer will:
- Install the new version in folder My App\Version 1.4
- Optionally install common library in My App\Common
- Optionally remove older versions (My App\Version 1.3, My App\Version 1.2, etc).
I have the first couple down. For the second, I understand that I need to use locate in the install directory to find all the versions that are currently installed, and then put those on the components page, and then during the install do an RMDir on the Version (whatever) folder if the user wants to remove the old version.
But I'm not quite sure how to set up displaying a variable number of sections and then handling those sections during install.
Can anyone help walk me through this?
Anders
5th May 2008 15:17 UTC
the number of sections is hardcoded at compile time, you could probably add x number of hidden sections and use those, or you could use something other than a components page; a custom page with checkboxes or a listview
Lone Shepherd
5th May 2008 15:33 UTC
Thanks for the quick reply; that seems like it would be fine. So I would have say, 5 hidden sections with a tag for each so I can address it in a function to show it?
I'm not clear on how I would iterate on a list of X old versions to enable these sections, though.
I'll play with it, but some sample code would be great if anyone feels the inclination.
Lone Shepherd
12th May 2008 20:22 UTC
Any thoughts? What I need to do:
Create 5 hidden sections.
Search the directory My App for subdirs starting with "Version"
Populate a components page with each of those found folder names (ie, the hidden sections)
Version 1.3
Version 1.2
etc. where checking the section / component will remove that subdir during the install.
Any pointers, the more specific the better, appreciated.
Red Wine
12th May 2008 21:43 UTC
I guess you mean something like this, change the plugins with a folder name which does not exist and see the difference.
outfile test.exe
showinstdetails show
InstallDir "$PROGRAMFILES\My app"
!include logiclib.nsh
page components func_pre
page directory
page instfiles
section "Main App" sec1
sectionin ro
detailprint "now installing"
sectionend
section /o "" sec2
detailprint "now removing plugins directory"
sectionend
Function .oninit
Readregstr $0 HKLM "Software\NSIS" ""
${Unless} ${Errors}
${If} ${FileExists} "$0\plugins\*.*"
SectionSetText ${sec2} "Remove plugins directory"
SectionGetFlags ${sec2} $0
Intop $0 $0 | 1
SectionSetflags ${sec2} $0
Strcpy $R0 "Showpage"
${Endif}
${Endunless}
FunctionEnd
Function func_pre
${IfThen} $R0 != "Showpage" ${|} Abort ${|}
Functionend