Search code examples
nsis

How do I only disable a section in a certain InstType, but force it on otherwise (even in the "Custom" InstType)?


I have a Section that is set to RO and occurs in all InstTypes except for a special one.

When the user first selects the special InstType and then selects "Custom" as the InstType the section is unchecked and can't be checked again in the "Custom" InstType.

So everything is fine except that when the users selects the "Custom" InstType the Section should always be checked again.

Only in the special InstType use case it should be unchecked.

How can I achieve this?


Solution

  • You can enforce whatever logic you want in .onSelChange:

    !include WinMessages.nsh
    !include LogicLib.nsh
    !include Sections.nsh
    
    Page Components
    Page InstFiles
    
    InstType "Normal1"
    !define CIT_Special 1
    InstType "Special"
    InstType "Normal2"
    
    Section Foo
    SectionIn 1 2 3
    SectionEnd
    
    Section Bar SEC_Special
    SectionIn 1 3
    SectionIn RO
    SectionEnd
    
    Section Baz
    SectionIn 1 2 ;3 << Not the same as Foo just to have some sort of difference
    SectionEnd
    
    Function .onSelChange
    ;Normally you would call GetCurInstType here, but it seems we need a little hack to detect the custom section
    FindWindow $1 "#32770" "" $HWNDPARENT
    GetDlgItem $1 $1 0x3F9
    SendMessage $1 ${CB_GETCURSEL} 0 0 $2
    SendMessage $1 ${CB_GETITEMDATA} $2 0 $2
    ${If} $2 = ${CIT_Special}
        !insertmacro UnselectSection ${SEC_Special}
    ${Else}
        !insertmacro SelectSection ${SEC_Special}
    ${EndIf}
    FunctionEnd