File: choice.nsh

package info (click to toggle)
win32-loader 0.10.6
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid
  • size: 1,868 kB
  • sloc: ansic: 2,492; sh: 706; asm: 344; makefile: 338
file content (163 lines) | stat: -rw-r--r-- 4,156 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
; Licensed under the zlib/libpng license (same as NSIS)

!ifndef CHOICE_INCLUDED
!define CHOICE_INCLUDED

!ifndef CHOICE_INNER_DIALOG_HEIGHT
!define CHOICE_INNER_DIALOG_HEIGHT 125
!endif

!include include\stdmacros.nsh
!include nsDialogs.nsh
!include Win\WinUser.nsh

!define CHOICE_PREFIX "Choice_"
!define CHOICE_UNFUNC "un."

${STDMACROS_DefIfNotDef} IDC_CHILDRECT 1018

!define CHOICE_FUNCDEF \
  `!insertmacro STDMACROS_FUNCDEF ${CHOICE_PREFIX}`
!define CHOICE_FUNCINC \
  `!insertmacro STDMACROS_FUNCINC ${CHOICE_PREFIX}`
!define CHOICE_FUNCPROLOG \
  `!insertmacro STDMACROS_FUNCPROLOG ${CHOICE_PREFIX}`

; ${Choice_Present} name total
${CHOICE_FUNCDEF} Present
!macro Choice_Present_Call UN NAME TOTAL
  !ifndef ${__MACRO__}_COUNTER
    !define ${__MACRO__}_COUNTER ${TOTAL}
  !else
    !define /redef /math ${__MACRO__}_COUNTER ${${__MACRO__}_COUNTER} - 1
  !endif
  !if ${${__MACRO__}_COUNTER} > 0
    Push $(${NAME}${${__MACRO__}_COUNTER})
    !insertmacro ${__MACRO__} "${UN}" ${NAME} ${TOTAL}
  !else
    Push ${TOTAL}
    Call `${UN}${CHOICE_PREFIX}Present`
    !undef ${__MACRO__}_COUNTER
  !endif
!macroend

; ${Choice_OnClick} hwnd
${CHOICE_FUNCDEF} OnClick
!macro Choice_OnClick_Call UN HWND
  Push ${HWND}
  Call `${UN}${CHOICE_PREFIX}OnClick`
!macroend

; ${Choice_Get} value
; Get choice
; Return value:
;   index number of choice
!macro Choice_Get UN
  !define ${UN}${CHOICE_PREFIX}Get_INCLUDED
!macroend
${CHOICE_FUNCDEF} Get
!macro Choice_Get_Call UN VALUE
  !insertmacro STDMACROS_ToSystemReg ${VALUE} ${__MACRO__}_VALUE
!if ${NSIS_PTR_SIZE} != 4
  System::Call 'user32::GetWindowLongPtr(p $HWNDPARENT, i ${DWLP_USER}) p.${${__MACRO__}_VALUE}'
!else
  System::Call 'user32::GetWindowLong(p $HWNDPARENT, i ${DWLP_USER}) i.${${__MACRO__}_VALUE}'
!endif
!macroend

; ${Choice_Set} value
; Save choice in user data of dialog
; Parameter:
;   value - index number of choice
!macro Choice_Set UN
  !define ${UN}${CHOICE_PREFIX}Set_INCLUDED
!macroend
${CHOICE_FUNCDEF} Set
!macro Choice_Set_Call UN VALUE
  !insertmacro STDMACROS_ToSystemReg ${VALUE} ${__MACRO__}_VALUE
!if ${NSIS_PTR_SIZE} != 4
  System::Call 'user32::SetWindowLongPtr(p $HWNDPARENT, i ${DWLP_USER}, p ${${__MACRO__}_VALUE})'
!else
  System::Call 'user32::SetWindowLong(p $HWNDPARENT, i ${DWLP_USER}, i ${${__MACRO__}_VALUE})'
!endif
!macroend

!macro Choice_OnClick UN
${CHOICE_FUNCINC} "${UN}" Set
; Click event handler
; Parameter:
;   hwnd - handle of window control
${CHOICE_FUNCPROLOG} "${UN}" OnClick
  Exch $0
  Push $1
  ${NSD_GetState} $0 $1
  ${If} $1 != 0
    nsDialogs::GetUserData $0
    Pop $0
    !insertmacro ${CHOICE_PREFIX}Set_Call "${UN}" $0
  ${EndIf}
  Pop $1
  Pop $0
FunctionEnd
!macroend ; Choice_OnClick

!macro Choice_Present UN
${CHOICE_FUNCINC} "${UN}" OnClick
; Create and show choice dialog
; Parameters:
;   text for last option
;   ...
;   text for 2nd option
;   text for 1st option
;   sub text for header
;   total number of elements on stack excluding this one
${CHOICE_FUNCPROLOG} "${UN}" Present
  System::Store 'S'
  nsDialogs::Create ${IDC_CHILDRECT}
  Pop $0

  Pop $4
  ${If} $0 != error
  ${AndIf} $4 > 1
    StrCpy $2 ${CHOICE_INNER_DIALOG_HEIGHT}
    ; Size per item
    IntOp $3 $2 / $4
    ; Vertical position
    IntOp $2 $3 / 2
    ; Sub text for header
    Pop $6
    IntOp $4 $4 - 1
    !insertmacro MUI_HEADER_TEXT $(^NameDA) $6
    ; 1st option
    Pop $6
    IntOp $4 $4 - 1
    StrCpy $5 1
    ${NSD_CreateRadioButton} 3u $2u -6u $3u $6
    Pop $1
    nsDialogs::SetUserData $1 $5
    ${NSD_OnClick} $1 `${UN}${CHOICE_PREFIX}OnClick`
    ; Select 1st option
    ${NSD_SetState} $1 1
    !insertmacro ${CHOICE_PREFIX}Set_Call "${UN}" $5
    ${While} $4 > 0
      IntOp $2 $2 + $3
      IntOp $4 $4 - 1
      IntOp $5 $5 + 1
      Pop $6
      ${NSD_CreateRadioButton} 3u $2u -6u $3u $6
      Pop $1
      nsDialogs::SetUserData $1 $5
      ${NSD_OnClick} $1 `${UN}${CHOICE_PREFIX}OnClick`
    ${EndWhile}
    nsDialogs::Show
  ${EndIf}
  ; Clear arguments from stack
  ${While} $4 > 0
    Pop $6
    IntOp $4 $4 - 1
  ${EndWhile}
  System::Store 'L'
FunctionEnd
!macroend ; Choice_Present

!endif ; CHOICE_INCLUDED