Search code examples
nsis

How can I get a finish button after a nsDialogs page


I'm trying to create a post install configuration page in my nsis script using nsDialogs. My script for gathering the input and executing the configuration works however I'm never presented with a finish/close/exit button after I'm done. Currently my pages declaration looks like:

Page directory
Page instfiles
Page custom nsDialogsPage nsDialogsPageLeave

How can I get a finish/exit/done button to show after nsDialogsPageLeave executes?


Solution

  • The classic NSIS UI does not have a finish page, the instfiles page is usually the last page and it will show a "finish button" after all the sections have executed. You can set the text of any button to the same string with SendMessage $hwndButton ${WM_SETTEXT} 0 "STR:$(^CloseBtn)" if you want to provide your own finish page.

    Most installers request the required information before the instfiles page, if you cannot do this then you might want to use the Modern UI, it will provide a finish page for you:

    !insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES
    Page custom nsDialogsPage nsDialogsPageLeave
    !insertmacro MUI_PAGE_FINISH
    

    It was a little unclear to me if you wanted two pages; a input page and then a finish page or a combined input/finish page. A combined page is a little weird but it is possible:

    !define AppName "Test"
    Name "${AppName}"
    Outfile "${AppName} setup.exe"
    InstallDir $temp
    
    !include LogicLib.nsh
    !include WinMessages.nsh
    !include nsDialogs.nsh
    
    Var MyEndConfigPageStage
    
    Page Directory
    Page InstFiles
    Page Custom MyEndConfigPageCreate MyEndConfigPageLeave /EnableCancel
    
    Function MyEndConfigPageCreate
    StrCpy $MyEndConfigPageStage 0
    GetDlgItem $0 $hwndparent 1
    SendMessage $0 ${WM_SETTEXT} 0 "STR:&Apply"
    nsDialogs::Create 1018
    Pop $0
    ${NSD_CreateCheckBox} 0 13u 100% -13u "FooBar"
    Pop $1
    nsDialogs::Show
    FunctionEnd
    
    Function MyEndConfigPageLeave
    ${If} $MyEndConfigPageStage > 0
        Return
    ${EndIf}
    ${NSD_GetState} $1 $2
    ClearErrors
    WriteIniStr "$instdir\settings.ini" Dummy "FooBar" $2
    ${If} ${Errors}
        MessageBox mb_iconstop "Unable to apply settings!"
        Abort
    ${EndIf}
    IntOp $MyEndConfigPageStage $MyEndConfigPageStage + 1
    GetDlgItem $0 $hwndparent 1
    SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^CloseBtn)"
    GetDlgItem $0 $hwndparent 2
    EnableWindow $0 0 ;Disable cancel
    EnableWindow $1 0 ;Disable the checkbox
    Abort
    FunctionEnd
    
    Section
    SectionEnd