RadioButtons

From NSIS Wiki
Jump to navigationJump to search
Author: NHOCSUNG (talk, contrib)


Description

Macros for mutually exclusive section selection.

Usage

  !insertmacro SectionRadioButtons "${g1o1}" "${g1o1},${g1o2},${g1o3}"

Example

; one-section.nsi
;
; This example demonstrates how to control section selection.
; It allows only one of the sections of a group to be selected.
 
;--------------------------------
 
; Section define/macro header file
; See this header file for more info
 
!include "Sections.nsh"
 
;--------------------------------
 
Name "One Section"
OutFile "one-section.exe"
 
;--------------------------------
 
; Pages
 
Page components
Page instfiles
 
;--------------------------------
 
; Sections
 
Section "Group 1 - Option 1" g1o1
SectionEnd
 
Section /o "Group 1 - Option 2" g1o2
SectionEnd
 
Section /o "Group 1 - Option 3" g1o3
SectionEnd
 
Section "Group 2 - Option 1" g2o1
SectionEnd
 
Section /o "Group 2 - Option 2" g2o2
SectionEnd
 
Section /o "Group 2 - Option 3" g2o3
SectionEnd
 
;--------------------------------
 
; Functions
 
Function .onInit
 
  !insertmacro RadioGetChecked "${g1o1}" "${g1o1},${g1o2},${g1o3}"
  !insertmacro RadioGetChecked "${g2o1}" "${g2o1},${g2o2},${g2o3}"
 
FunctionEnd
 
Function .onSelChange
 
  !insertmacro SectionRadioButtons "${g1o1}" "${g1o1},${g1o2},${g1o3}"
  !insertmacro SectionRadioButtons "${g2o1}" "${g2o1},${g2o2},${g2o3}"
 
FunctionEnd

Macros

  ;--------------------------------
 
  ; Macros for mutually exclusive section selection
  ; Written by Tim Gallagher
  ;
  ; See one-section.nsi for an example of usage
 
  !include LogicLib.nsh
 
  !macro StartRadioButtons _d
    !verbose push
    !verbose ${LOGICLIB_VERBOSITY}
 
    !ifndef _CheckedButton${_d}
      var /GLOBAL _CheckedButton${_d}
      !define _CheckedButton${_d}
    !endif
 
    ${IfThen} $_CheckedButton${_d} == "" ${|} StrCpy $_CheckedButton${_d} `${_d}` ${|}
    !define CheckedButton `$_CheckedButton${_d}`
 
    Push $0
    Push $1
 
    SectionGetFlags `${CheckedButton}` $0
    IntOp $0 $0 & ${SECTION_OFF}
    SectionSetFlags `${CheckedButton}` $0
 
    StrCpy $1 `${CheckedButton}`
 
    !verbose pop
  !macroend
 
  ; A radio button
  !macro RadioButton _s
    !verbose push
    !verbose ${LOGICLIB_VERBOSITY}
 
    ${If} ${SectionIsSelected} `${_s}`
      StrCpy `${CheckedButton}` `${_s}`
    ${EndIf}
 
    !verbose pop
  !macroend
 
  ; Ends the radio button block
  !macro EndRadioButtons
    !verbose push
    !verbose ${LOGICLIB_VERBOSITY}
 
    ${If} $1 == `${CheckedButton}`                        ; selection hasn't changed
      SectionGetFlags `${CheckedButton}` $0
      IntOp $0 $0 | ${SF_SELECTED}
      SectionSetFlags `${CheckedButton}` $0
    ${EndIf}
 
    Pop $1
    Pop $0
 
    !undef CheckedButton
    !verbose pop
  !macroend
 
  !macro SectionRadioButtons _d _e
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7
 
    !insertmacro StartRadioButtons ${_d}
 
    StrCpy $3 0
    StrLen $5 `${_e}`
    ${For} $2 0 $5
      StrCpy $4 `${_e}` 1 $2
      ${If} $4 == ","
        IntOp $3 $3 + 1
      ${EndIf}
    ${Next}
 
    StrCpy $7 `${_e}`
    StrCpy $4 0
    ${Do}
 
      StrLen $5 `$7`
      ${For} $2 0 $5
        StrCpy $6 `$7` 1 $2
        ${If} $6 == ","
          StrCpy $6 `$7` $2
          IntOp $2 $2 + 1
          StrCpy $7 `$7` "" $2
          IntOp $4 $4 + 1
          ${Break}
        ${EndIf}
      ${Next}
 
      ${If} $4 <= $3
      ${AndIf} $6 != ""
        !insertmacro RadioButton $6
      ${AndIf} $4 == $3
        !insertmacro RadioButton $7
      ${EndIf}
 
    ${LoopUntil} $4 >= $3
 
    !insertmacro EndRadioButtons
 
    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
  !macroend
 
  !macro RadioGetChecked _d _e
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7
 
    !ifndef _CheckedButton${_d}
      var /GLOBAL _CheckedButton${_d}
      !define _CheckedButton${_d}
    !endif
 
    StrCpy $3 0
    StrLen $5 `${_e}`
    ${For} $2 0 $5
      StrCpy $4 `${_e}` 1 $2
      ${If} $4 == ","
        IntOp $3 $3 + 1
      ${EndIf}
    ${Next}
 
    StrCpy $7 `${_e}`
    StrCpy $4 0
    ${Do}
 
      StrLen $5 `$7`
      ${For} $2 0 $5
        StrCpy $6 `$7` 1 $2
        ${If} $6 == ","
          StrCpy $6 `$7` $2
          IntOp $2 $2 + 1
          StrCpy $7 `$7` "" $2
          IntOp $4 $4 + 1
          ${Break}
        ${EndIf}
      ${Next}
 
      ${If} $4 <= $3
      ${AndIf} $6 != ""
 
        ${If} ${SectionIsSelected} $6
          StrCpy $_CheckedButton${_d} "$6"
          ${ExitDo}
        ${EndIf}
 
        ${If} $4 == $3
        ${AndIf} ${SectionIsSelected} $7
          StrCpy $_CheckedButton${_d} "$7"
        ${EndIf}
      ${EndIf}
 
    ${LoopUntil} $4 >= $3
 
    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
  !macroend