取消选中SectionGroup时,禁用两个互斥的部分?

时间:2014-01-06 23:21:55

标签: installer nsis

我有一个带有两个SectionGroup的NSIS安装程序脚本。每个SectionGroup有两个部分,它们是互斥的。

我需要让用户取消选中SectionGroup,取消选中并禁用(“灰显”)部分。基本上用户可以选择安装其中一个部分,也可以不选择。最重要的是,如果未选中第一个SectionGroup,则必须禁用第二个SectionGroup。

我使用此脚本作为参考来控制互斥的章节:http://nsis.sourceforge.net/Mutually_Exclusive_Sections

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的禁用/灰色要求没有意义。如果再次单击部分组以启用“子部分”,则会检查两部分中的哪一部分?而且你只能通过单击组本身离开禁用状态,所以我没有实现它。

通常,除了简单的单选按钮行为之外的任何事情都会很快变得复杂如果您使用的是NSIS的3.0 alpha版本,那么.onSelChange实际上会告诉您哪个项目发生了变化,这会使这个问题变得不那么复杂......

Page Components "" SaveState
Page Instfiles


!include sections.nsh
!include logiclib.nsh

SectionGroup /e "Grp1" GRP_1
Section "A" SEC_A
SectionEnd
Section /o "B" SEC_B
SectionEnd
SectionGroupEnd

SectionGroup /e "Grp2" GRP_2
Section /o "C" SEC_C
SectionEnd
Section "D" SEC_D
SectionEnd
SectionGroupEnd

; Remove comments for a different behavior

Function SaveState
!macro SaveSel id var
SectionGetFlags ${id} ${var}
IntOp ${var} ${var} & ${SF_SELECTED}
!macroend
#SectionGetFlags ${GRP_1} $R0
!insertmacro SaveSel ${SEC_A} $R1
!insertmacro SaveSel ${SEC_B} $R2
#SectionGetFlags ${GRP_2} $R3
!insertmacro SaveSel ${SEC_C} $R4
!insertmacro SaveSel ${SEC_D} $R5
FunctionEnd

Function .onSelChange
!macro OneOfTwoItemsInAGroup gid gv i1 v1 i2 v2
#SectionGetFlags ${gid} $0
!insertmacro SaveSel ${i1} $1
!insertmacro SaveSel ${i2} $2
${If} $1 <> 0
${AndIf} $2 <> 0
    StrCpy $1 ${i1}
    ${IfThen} ${v1} = 0 ${|} StrCpy $1 ${i2} ${|}
    !insertmacro UnselectSection $1
    /*${If} ${gv} = $0 
        !insertmacro UnselectSection ${gid}
    ${EndIf}*/
${EndIf}
!macroend
!insertmacro OneOfTwoItemsInAGroup ${GRP_1} $R0 ${SEC_A} $R1 ${SEC_B} $R2
!insertmacro OneOfTwoItemsInAGroup ${GRP_2} $R3 ${SEC_C} $R4 ${SEC_D} $R5
Call SaveState
FunctionEnd