Sorting Components: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
(I placed it in Tutorials, reason I was looking for this but couldnt find in the tutorial list)
(Fix script (there were errors and it was not compatible with Unicode))
 
Line 1: Line 1:
{{PageAuthor|KiCHiK}}
{{PageAuthor|KiCHiK}}


The following script shows how to sort components in the components page under a certain group. It was written for [http://forums.winamp.com/showthread.php?s=&threadid=227483 theAdib in the forums]. His intention was to keep sections sorted for all available languages.<highlight-nsis>!define TVGN_ROOT        0
The following script shows how to sort components in the components page under a certain group. It was written for [http://forums.winamp.com/showthread.php?s=&threadid=227483 theAdib in the forums]. His intention was to keep sections sorted for all available languages.
 
<highlight-nsis>
!define TVGN_ROOT        0
!define TVGN_NEXT        1
!define TVGN_NEXT        1
!define TVGN_NEXTVISIBLE 6
!define TVGN_NEXTVISIBLE 6
Line 8: Line 11:


!define TVM_GETNEXTITEM  4362
!define TVM_GETNEXTITEM  4362
!define TVM_GETITEM      4364
!define TVM_GETITEMA    4364
!define TVM_GETITEMW    4414
!define TVM_SORTCHILDREN 4371
!define TVM_SORTCHILDREN 4371


!define TVITEM '(i, i, i, i, i, i, i, i, i, i)'
!define TVITEM '(i, i, i, i, i, i, i, i, i, i)'
!ifdef NSIS_UNICODE
    !define TVM_GETITEM ${TVM_GETITEMW}
!else
    !define TVM_GETITEM ${TVM_GETITEMA}
!endif


Page components "" compShow
Page components "" compShow
Line 46: Line 57:
System::Alloc ${NSIS_MAX_STRLEN}
System::Alloc ${NSIS_MAX_STRLEN}
Pop $2
Pop $2
System::Call '*${TVITEM}(${TVIF_TEXT}, r1,,, r2, ${NSIS_MAX_STRLEN},,,,) i .r3'


loop:
loop:
System::Call '*${TVITEM}(${TVIF_TEXT}, r1,,, r2, ${NSIS_MAX_STRLEN},,,,) i .r3'
SendMessage $0 ${TVM_GETITEM} 0 $3
SendMessage $0 ${TVM_GETITEM} 0 $3
System::Call '*$2(&t${NSIS_MAX_STRLEN} .r4)'
System::Call '*$2(&t${NSIS_MAX_STRLEN} .r4)'
Line 55: Line 66:


SendMessage $0 ${TVM_GETNEXTITEM} ${TVGN_NEXTVISIBLE} $1 $1
SendMessage $0 ${TVM_GETNEXTITEM} ${TVGN_NEXTVISIBLE} $1 $1
StrCmp $1 loop done
StrCmp 0 $1 done loop


found:
found:
Line 66: Line 77:
System::Free $3
System::Free $3


FunctionEnd</highlight-nsis>
FunctionEnd
</highlight-nsis>
 
[[Category:Tutorials]]
[[Category:Tutorials]]
[[Category:Code Examples]]
[[Category:Code Examples]]
[[Category:System Plugin Examples]]
[[Category:System Plugin Examples]]

Latest revision as of 20:10, 14 January 2017

Author: KiCHiK (talk, contrib)


The following script shows how to sort components in the components page under a certain group. It was written for theAdib in the forums. His intention was to keep sections sorted for all available languages.

!define TVGN_ROOT        0
!define TVGN_NEXT        1
!define TVGN_NEXTVISIBLE 6
 
!define TVIF_TEXT   1
 
!define TVM_GETNEXTITEM  4362
!define TVM_GETITEMA     4364
!define TVM_GETITEMW     4414
!define TVM_SORTCHILDREN 4371
 
!define TVITEM '(i, i, i, i, i, i, i, i, i, i)'
 
!ifdef NSIS_UNICODE
    !define TVM_GETITEM ${TVM_GETITEMW}
!else
    !define TVM_GETITEM ${TVM_GETITEMA}
!endif
 
 
Page components "" compShow
Page instfiles
 
XPStyle on
 
Name "test"
OutFile "test.exe"
 
Section ztest
SectionEnd
 
SectionGroup /e test
 
Section c
SectionEnd
 
Section b
SectionEnd
 
Section a
SectionEnd
 
SectionGroupEnd
 
Function compShow
 
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1032
 
SendMessage $0 ${TVM_GETNEXTITEM} ${TVGN_ROOT} 0 $1
 
System::Alloc ${NSIS_MAX_STRLEN}
Pop $2
 
loop:
	System::Call '*${TVITEM}(${TVIF_TEXT}, r1,,, r2, ${NSIS_MAX_STRLEN},,,,) i .r3'
	SendMessage $0 ${TVM_GETITEM} 0 $3
	System::Call '*$2(&t${NSIS_MAX_STRLEN} .r4)'
	StrCmp $4 "test" 0 +2 ### CHANGE ME
		Goto found
 
	SendMessage $0 ${TVM_GETNEXTITEM} ${TVGN_NEXTVISIBLE} $1 $1
	StrCmp 0 $1 done loop
 
found:
	SendMessage $0 ${TVM_SORTCHILDREN} 0 $1
	# recursive - SendMessage $0 ${TVM_SORTCHILDREN} 1 $1
 
done:
 
System::Free $2
System::Free $3
 
FunctionEnd