Controlling Available Install Options: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Adding new author and category links.)
Line 8: Line 8:
== The Script ==
== The Script ==
Here's the script for NSIS 2.0a0 up to 2.0b0 that solves the problem. If you are using version 2.0b0 and above use Examples\one-section.nsi. This script can work on version 1.98 too. All you need to do is remove "SectionIn RO", sec1, sec2, sec3, and sec4, and replace every ${sec*} with the appropriate section number.
Here's the script for NSIS 2.0a0 up to 2.0b0 that solves the problem. If you are using version 2.0b0 and above use Examples\one-section.nsi. This script can work on version 1.98 too. All you need to do is remove "SectionIn RO", sec1, sec2, sec3, and sec4, and replace every ${sec*} with the appropriate section number.
NOTE on using this sample:
Before it would work I had to change
SECTION_ON to 0x00000001
SECTION_OFF to 0xfffffff7
I also use
RO_ON 0x00000010
RO_OFF 0xffffff7f


<highlight-nsis>
<highlight-nsis>

Revision as of 20:12, 27 October 2005

Author: KiCHiK (talk, contrib)


Description

I wrote this script in answer to the following question on the forum by user Sailo:

I have 5 install options 1 is required and the other 4 are optional. The only problem is i want the user to only be able to select 1 of the 4 options so that when you check 1 box the check disappears from 1 of the other options. Is this possible?

The Script

Here's the script for NSIS 2.0a0 up to 2.0b0 that solves the problem. If you are using version 2.0b0 and above use Examples\one-section.nsi. This script can work on version 1.98 too. All you need to do is remove "SectionIn RO", sec1, sec2, sec3, and sec4, and replace every ${sec*} with the appropriate section number.

NOTE on using this sample: Before it would work I had to change SECTION_ON to 0x00000001 SECTION_OFF to 0xfffffff7 I also use RO_ON 0x00000010 RO_OFF 0xffffff7f

# This example demonstrates how to control section selection.
# It allows only one of the four optional section to be
# selected at any given time.
#
# Please note that the initial value will not be what you expect
# it to be if you are are using InstType because InstType is taken
# into consideration after the .onInit, where the initial state is
# set, executes.
# To use this code with InstType you will either have to specify
# you first InstType to match the initial value you set in .onInit
# (only StrCpy $1 ${sec1} is important in this case because the
# other set the section and that will be done by InstType), or set
# the initial section selection from .onSelChange when it is called
# for the first time.
 
Name example
OutFile setup.exe
 
ComponentText "please choose just one but the default"
 
Section !Required
  SectionIn RO
SectionEnd
 
Section "optional #1" sec1
SectionEnd
 
Section "optional #2" sec2
SectionEnd
 
Section "optional #3" sec3
SectionEnd
 
Section "optional #4" sec4
SectionEnd
 
!define SECTION_ON 0x80000000
!define SECTION_OFF 0x7FFFFFFF
 
Function .onInit
  Push $0
 
  StrCpy $1 ${sec1} ; Gotta remember which section we are at now...
  SectionGetFlags ${sec1} $0
  IntOp $0 $0 | ${SECTION_ON}
  SectionSetFlags ${sec1} $0
 
  SectionGetFlags ${sec2} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${sec2} $0
 
  SectionGetFlags ${sec3} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${sec3} $0
 
  SectionGetFlags ${sec4} $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags ${sec4} $0
 
  Pop $0
FunctionEnd
 
Function .onSelChange
  Push $0
 
  ; Turn off old selected section
  SectionGetFlags $1 $0
  IntOp $0 $0 & ${SECTION_OFF}
  SectionSetFlags $1 $0
 
  ; Now remember the current selection
  Push $2
  StrCpy $2 $1
 
  SectionGetFlags ${sec1} $0
  IntOp $0 $0 & ${SECTION_ON}
  IntCmp $0 ${SECTION_ON} 0 +2 +2
    StrCpy $1 ${sec1}
  SectionGetFlags ${sec2} $0
  IntOp $0 $0 & ${SECTION_ON}
  IntCmp $0 ${SECTION_ON} 0 +2 +2
    StrCpy $1 ${sec2}
  SectionGetFlags ${sec3} $0
  IntOp $0 $0 & ${SECTION_ON}
  IntCmp $0 ${SECTION_ON} 0 +2 +2
    StrCpy $1 ${sec3}
  SectionGetFlags ${sec4} $0
  IntOp $0 $0 & ${SECTION_ON}
  IntCmp $0 ${SECTION_ON} 0 +2 +2
    StrCpy $1 ${sec4}
 
  StrCmp $2 $1 0 +4 ; selection hasn't changed
    SectionGetFlags $1 $0
    IntOp $0 $0 | ${SECTION_ON}
    SectionSetFlags $1 $0
  Pop $2
  Pop $0
FunctionEnd