Как сделать раздел, необходимый для группы разделов в NSIS? - PullRequest
0 голосов
/ 11 мая 2010

Я хочу создать раздел внутри группы разделов, необходимый для этой группы разделов, но не обязательный для всей установки, если группа не отмечена. Я пробовал «SectionIn R0», но это делает этот раздел обязательным для всей установки, и я хочу, чтобы он был обязательным, только если они выбирают саму группу.

SectionGroup "group"
  Section "required for section group"
    SectionIn RO
  SectionEnd

  Section "optional"
  SectionEnd
SectionGroupEnd

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Вы не можете сделать это только с помощью свойств, вам нужен какой-то реальный код:

!include Sections.nsh
!include LogicLib.nsh

SectionGroup /e "group"
  Section "required for section group" SEC_REQ
    SectionIn RO
  SectionEnd
  Section "optional" SEC_OPT
  SectionEnd
SectionGroupEnd

Function .onSelChange
${If} ${SectionIsSelected} ${SEC_OPT}
    !define /math MYSECTIONFLAGS ${SF_SELECTED} | ${SF_RO}
    !insertmacro SetSectionFlag ${SEC_REQ} ${MYSECTIONFLAGS} 
    !undef MYSECTIONFLAGS
${Else}
    !insertmacro ClearSectionFlag ${SEC_REQ} ${SF_RO}
${EndIf}
FunctionEnd

Обратите внимание, что при снятии флажка с самой группой разделов возникает «ошибка», чтобы обойти это, вам нужно сохранить некоторое глобальное состояние, поскольку nsis не сообщает вам, какой раздел генерировал уведомление. Следующий код имеет лучшую логику:

!include Sections.nsh
!include LogicLib.nsh

SectionGroup /e "group" SEC_GRP
  Section "required for section group" SEC_REQ
    SectionIn RO
  SectionEnd
  Section "optional" SEC_OPT
  SectionEnd
  Section "" PRIVSEC_TOGGLESTATE ;hidden section to keep track of state
  SectionEnd
SectionGroupEnd

Function .onSelChange
!define /math SECFLAGS_SELRO ${SF_SELECTED} | ${SF_RO}
${IfNot} ${SectionIsSelected} ${PRIVSEC_TOGGLESTATE}
${AndIf} ${SectionIsReadOnly} ${SEC_REQ}
    !insertmacro ClearSectionFlag ${SEC_REQ} ${SECFLAGS_SELRO}
${EndIf}
${If} ${SectionIsSelected} ${SEC_OPT}
    !insertmacro SetSectionFlag ${SEC_REQ} ${SECFLAGS_SELRO} 
${Else}
    !insertmacro ClearSectionFlag ${SEC_REQ} ${SF_RO}
${EndIf}
${If} ${SectionIsSelected} ${SEC_REQ}
    !insertmacro SelectSection ${PRIVSEC_TOGGLESTATE}
${Else}
    !insertmacro UnselectSection ${PRIVSEC_TOGGLESTATE}
${EndIf}
!undef SECFLAGS_SELRO
FunctionEnd
0 голосов
/ 07 декабря 2018

Вы также можете установить разделы как обязательные разделы с помощью команды SectionSetFlags. Вам просто нужно добавить его в функцию .onInit следующим образом:

SectionGroup "group" Sec01
  Section "required for section group"
  SectionIn RO
  SectionEnd

  Section "optional" Sec01
  SectionEnd
SectionGroupEnd

Function .onInit
  SectionSetFlags ${Sec01} 17
FunctionEnd

Это выделит серым цветом «группу», но будет выбрано и установлено.

...