It is currently April 16th, 2024, 9:47 pm

Instantiation like we do with objects?

Get help with creating, editing & fixing problems with skins
User avatar
Lanteust
Posts: 8
Joined: March 20th, 2020, 2:57 pm
Location: France

Instantiation like we do with objects?

Post by Lanteust »

Hello,
I still have so much to learn... :Whistle
  Is it possible to make a contraption of this like instancing it like an object?  
I have measures for specific applications, for example:

Excel:
Layout:

Code: Select all

;@includeLayoutExcel=#@#Includes\Excel\Layouts\Excel.min.inc

[IncludesModules]
@includeModuleExcel=#@#Includes\Excel\Modules\Excel.inc

;___Excel___	
	[MeterExcelImage]
	Meter=Image
	ImageName=#@#Images\Applications\Excel.png
	X=#xImage#
	Y=#yExcel#
	W=#sPicture#
	H=#sPicture#
	LeftMouseUpAction=["#@#Plugins\TaskKiller.exe" "#ExcelExe#"]
	ToolTipTitle=taskkill #ExcelExe#
	ToolTipType=1
	ToolTipIcon=WARNING
	ToolTipText=taskkill /im #ExcelExe# /f
	DynamicVariables=1
	
	[MeterExcelLabel]
	Meter=String
	MeterStyle=styleLeftText
	MeasureName=MeasureExcelRAMforScaling
	MeasureName2=MeasureExcelIORforScaling
	MeasureName3=MeasureExcelIOWforScaling
	X=#xLabel#
	Y=#yExcel#
	W=#wLabel#
	H=#hText#
	Text=Excel [#ExcelExe#]
	ToolTipTitle=#Excel#
	ToolTipType=1
	ToolTipIcon=INFO
	ToolTipText=CPU : [MeasureExcelCPU:1]%#CRLF#RAM : %1B#CRLF#IORead : %2B/s#CRLF#IOWrite : %3B/s
	DynamicVariables=1

	[MeterExcelProcess]
	Meter=String
	MeasureName=MeasureExcel
	MeterStyle=styleRightText
	X=#xProcess#
	Y=0r
	W=#wProcess#
	H=#hText#
Meter:

Code: Select all

;@includeModuleExcel=#@#Includes\Excel\Modules\Excel.inc

[Variables]
Excel=EXCEL
ExcelExe=#Excel#.EXE

;___Excel___
	[MeasureExcelProcess]
	Measure=Plugin
	Plugin=Process
	ProcessName=#ExcelExe#
	
	[MeasureExcelCPU]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=CPU
	Name=#Excel#
	
	[MeasureExcelRAM]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=RAM
	Name=#Excel#
	
	[MeasureExcelRAMforScaling]
	Measure=Calc
	Formula=MeasureExcelRAM
	
	[MeasureExcelIOR]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=IOREAD
	Name=#Excel#
	
	[MeasureExcelIORforScaling]
	Measure=Calc
	Formula=MeasureExcelIOR
	
	[MeasureExcelIOW]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=IOWRITE
	Name=#Excel#
	
	[MeasureExcelIOWforScaling]
	Measure=Calc
	Formula=MeasureExcelIOW
	
	[ToggleExcel]
	Measure=Calc
	IfCondition=MeasureExcelProcess > 0
	IfTrueAction=[!SetOption MeterExcelProcess MeterStyle styleRightTextON][!SetOption MeterExcelImage GreyScale 0][!EnableMouseAction MeterExcelImage "LeftMouseUpAction"][!SetOption MeterExcelImage ToolTipHidden 0][!SetOption MeterExcelLabel ToolTipHidden 0]
	IfFalseAction=[!SetOption MeterExcelProcess MeterStyle styleRightTextOFF][!SetOption MeterExcelImage GreyScale 1][!DisableMouseAction MeterExcelImage "LeftMouseUpAction"][!SetOption MeterExcelImage ToolTipHidden 1][!SetOption MeterExcelLabel ToolTipHidden 1]
Word:
Layout:

Code: Select all

;@includeLayoutWord=#@#Includes\Word\Layouts\Word.min.inc

[IncludesModules]
@includeModuleWord=#@#Includes\Word\Modules\Word.inc

;___Word___	
	[MeterWordImage]
	Meter=Image
	ImageName=#@#Images\Applications\Word.png
	X=#xImage#
	Y=#yWord#
	W=#sPicture#
	H=#sPicture#
	LeftMouseUpAction=["#@#Plugins\TaskKiller.exe" "#WordExe#"]
	ToolTipTitle=taskkill #WordExe#
	ToolTipType=1
	ToolTipIcon=WARNING
	ToolTipText=taskkill /im #WordExe# /f
	DynamicVariables=1
	
	[MeterWordLabel]
	Meter=String
	MeterStyle=styleLeftText
	MeasureName=MeasureWordRAMforScaling
	MeasureName2=MeasureWordIORforScaling
	MeasureName3=MeasureWordIOWforScaling
	X=#xLabel#
	Y=#yWord#
	W=#wLabel#
	H=#hText#
	Text=Word [#WordExe#]
	ToolTipTitle=#Word#
	ToolTipType=1
	ToolTipIcon=INFO
	ToolTipText=CPU : [MeasureWordCPU:1]%#CRLF#RAM : %1B#CRLF#IORead : %2B/s#CRLF#IOWrite : %3B/s
	DynamicVariables=1

	[MeterWordProcess]
	Meter=String
	MeasureName=MeasureWord
	MeterStyle=styleRightText
	X=#xProcess#
	Y=0r
	W=#wProcess#
	H=#hText#
Measure:

Code: Select all

;@includeModuleWord=#@#Includes\Word\Modules\Word.inc

[Variables]
Word=WINWORD
WordExe=#Word#.EXE

;___Word___
	[MeasureWordProcess]
	Measure=Plugin
	Plugin=Process
	ProcessName=#WordExe#
	
	[MeasureWordCPU]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=CPU
	Name=#Word#
	
	[MeasureWordRAM]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=RAM
	Name=#Word#
	
	[MeasureWordRAMforScaling]
	Measure=Calc
	Formula=MeasureWordRAM
	
	[MeasureWordIOR]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=IOREAD
	Name=#Word#
	
	[MeasureWordIORforScaling]
	Measure=Calc
	Formula=MeasureWordIOR
	
	[MeasureWordIOW]
	Measure=Plugin
	Plugin=UsageMonitor
	Alias=IOWRITE
	Name=#Word#
	
	[MeasureWordIOWforScaling]
	Measure=Calc
	Formula=MeasureWordIOW
	
	[ToggleWord]
	Measure=Calc
	IfCondition=MeasureWordProcess > 0
	IfTrueAction=[!SetOption MeterWordProcess MeterStyle styleRightTextON][!SetOption MeterWordImage GreyScale 0][!EnableMouseAction MeterWordImage "LeftMouseUpAction"][!SetOption MeterWordImage ToolTipHidden 0][!SetOption MeterWordLabel ToolTipHidden 0]
	IfFalseAction=[!SetOption MeterWordProcess MeterStyle styleRightTextOFF][!SetOption MeterWordImage GreyScale 1][!DisableMouseAction MeterWordImage "LeftMouseUpAction"][!SetOption MeterWordImage ToolTipHidden 1][!SetOption MeterWordLabel ToolTipHidden 1]

As you can see, the only difference is: Excel > Word
And i have this for ~10 applications... :vomit:

So i did a script to create everything, but it's still not good...

Code: Select all

@rem newInclude.bat
@echo off

if [%~1]==[] goto usage
if [%~2]==[] goto usage
SET mypath=%~dp0

robocopy /MIR %mypath:~0,-1%\.example  %mypath:~0,-1%\%~1 /W:0 /R:0

ren %mypath:~0,-1%\%~1\Layouts\.example.full.inc %~1.full.inc
ren %mypath:~0,-1%\%~1\Layouts\.example.std.inc %~1.std.inc
ren %mypath:~0,-1%\%~1\Layouts\.example.min.inc %~1.min.inc
ren %mypath:~0,-1%\%~1\Modules\.example.inc %~1.inc

powershell -Command "(gc %mypath:~0,-1%\%~1\Layouts\%~1.full.inc) -replace '\.example', '%~1' | Out-File -encoding ASCII %mypath:~0,-1%\%~1\Layouts\%~1.full.inc"
powershell -Command "(gc %mypath:~0,-1%\%~1\Layouts\%~1.std.inc) -replace '\.example', '%~1' | Out-File -encoding ASCII %mypath:~0,-1%\%~1\Layouts\%~1.std.inc"
powershell -Command "(gc %mypath:~0,-1%\%~1\Layouts\%~1.min.inc) -replace '\.example', '%~1' | Out-File -encoding ASCII %mypath:~0,-1%\%~1\Layouts\%~1.min.inc"
powershell -Command "(gc %mypath:~0,-1%\%~1\Modules\%~1.inc) -replace '\.example', '%~1' | Out-File -encoding ASCII %mypath:~0,-1%\%~1\Modules\%~1.inc"
powershell -Command "(gc %mypath:~0,-1%\%~1\Modules\%~1.inc) -replace '\.exeexample', '%~2' | Out-File -encoding ASCII %mypath:~0,-1%\%~1\Modules\%~1.inc"

echo Done
goto :eof

:usage
@echo Usage: %~0 ^<NewIncludeName^> ^<NewIncludeProcessName^>
exit /B 1
  Is it possible to have only a parent call that will create two children?  
PS: iKnowIDidFailMyCamelCase... but i love the first capital letter....
User avatar
Active Colors
Moderator
Posts: 1251
Joined: February 16th, 2012, 3:32 am
Location: Berlin, Germany

Re: Instantiation like we do with objects?

Post by Active Colors »

I didn't get something. How is everything arranged?

Do you have two separate skins for Layout and for Meters? Or completely everything is separated (like if you have 10 instances of word, excel, etc, so you have 10 inc files for Layout and 10 for Meters)?

I might help you here but without knowing your structure and why you have it like that it is hard to get around. Because what I see is that you have twice included @includeModuleExcel in two different place and it is quite complicated, as I imagine it could be simplified.
User avatar
Lanteust
Posts: 8
Joined: March 20th, 2020, 2:57 pm
Location: France

Re: Instantiation like we do with objects?

Post by Lanteust »

Oh, the first line is a comment of the path to the file, it's a bad idea, but it helps me to go faster...

Well, it's a bit... chaotic :twisted:
There is an illustro a bit edited and my app viewer.

Code: Select all

PS C:\Users\...\Documents\Rainmeter\Skins\MySkin> tree /f
C:.
│   IsItStillRunning.ini
│   ReadMe.md
│
├───@Resources
│   ├───Fonts
│   │       Roboto-Regular.ttf
│   │
│   ├───Images
│   │   │   Background.png
│   │   │   LightGreen.png
│   │   │   LightOff.png
│   │   │   LightRed.png
│   │   │
│   │   ├───Applications
│   │   │       Delphi.png
│   │   │       Excel.png
│   │   │       MSSQL.png
│   │   │       ShareX.png
│   │   │       SSMS.png
│   │   │       Word.png
│   │   │
│   │   └───System
│   │           BinEmpty.jpeg
│   │           BinFull.jpeg
│   │           CPU.png
│   │           Disk.png
│   │           RAM.png
│   │           Uptime.png
│   │
│   ├───Includes
│   │   │   newInclude.bat
│   │   │   Settings.inc
│   │   │   Template.Disk1.inc
│   │   │   Template.Disk2.inc
│   │   │   Template.Disks.inc
│   │   │   Template.example.inc
│   │   │   Template.inc
│   │   │   Template.Network.inc
│   │   │   Template.ShareX.inc
│   │   │   Template.System.inc
│   │   │
│   │   ├───.example
│   │   │   ├───Layouts
│   │   │   │       .example.full.inc
│   │   │   │       .example.min.inc
│   │   │   │       .example.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           .example.inc
│   │   │
│   │   ├───Delphi
│   │   │   ├───Layouts
│   │   │   │       Delphi.full.inc
│   │   │   │       Delphi.min.inc
│   │   │   │       Delphi.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           Delphi.inc
│   │   │
│   │   ├───Excel
│   │   │   ├───Layouts
│   │   │   │       Excel.full.inc
│   │   │   │       Excel.min.inc
│   │   │   │       Excel.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           Excel.inc
│   │   │
│   │   ├───MSSQL
│   │   │   ├───Layouts
│   │   │   │       MSSQL.full.inc
│   │   │   │       MSSQL.min.inc
│   │   │   │       MSSQL.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           MSSQL.inc
│   │   │
│   │   ├───ShareX
│   │   │   ├───Layouts
│   │   │   │       ShareX.img.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           ShareX.inc
│   │   │
│   │   ├───SSMS
│   │   │   ├───Layouts
│   │   │   │       SSMS.full.inc
│   │   │   │       SSMS.min.inc
│   │   │   │       SSMS.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           SSMS.inc
│   │   │
│   │   ├───System
│   │   │   ├───Layouts
│   │   │   │       Disk.light.inc
│   │   │   │       Disk1.min.inc
│   │   │   │       Disk2.min.inc
│   │   │   │       Network.min.inc
│   │   │   │       System.full.inc
│   │   │   │       System.min.inc
│   │   │   │       System.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           Disk.inc
│   │   │           Disk1.inc
│   │   │           Disk2.inc
│   │   │           Network.inc
│   │   │           System.inc
│   │   │
│   │   ├───Word
│   │   │   ├───Layouts
│   │   │   │       Word.full.inc
│   │   │   │       Word.min.inc
│   │   │   │       Word.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           Word.inc
│   │
│   └───Plugins
│           AddImageToClipboard.au3
│           AddImageToClipboard.exe
│           ShareX.bat
│           TaskKiller.au3
│           TaskKiller.exe
│
├───Disk
│       Disk 1.ini
│       Disk 2.ini
│       Disks.ini
│
├───Network
│       Network.ini
│
├───ShareX
│       ShareX.ini
│
└───System
        System.ini
The calls for example:
  • IsItStillRunning.ini Include Settings and Template:
    • @Resources/Includes/Settings.inc
    • @Resources/Includes/Template.inc Include Layouts
      • @Resources/Includes/Excel/Layouts/Excel.min.inc Include Modules
        • @Includes\Excel\Modules\Excel.inc
      • @Resources/Includes/Excel/Layouts/Word.min.inc Include Modules
        • @Includes\Excel\Modules\Word.inc
      • ...
And i do this again and again for all my apps
User avatar
balala
Rainmeter Sage
Posts: 16142
Joined: October 11th, 2010, 6:27 pm
Location: Gheorgheni, Romania

Re: Instantiation like we do with objects?

Post by balala »

Lanteust wrote: June 30th, 2020, 8:15 am
  Is it possible to have only a parent call that will create two children?  
Beside Active Colors's reply, I think doesn't matter too much how those sections are structured. I think it's not possible, at least if I didn't misunderstand something. Such tasks are possible in (I think practically all) programming languages, but Rainmeter is definitely not one. Unfortunately I think you have to copy the code, paste it ten times, then modify manually each pasted section, one by one.
Sorry, but that's it...
User avatar
Active Colors
Moderator
Posts: 1251
Joined: February 16th, 2012, 3:32 am
Location: Berlin, Germany

Re: Instantiation like we do with objects?

Post by Active Colors »

No no no, it is very possible to do. It is quite complex for me to understand and visualize your structure and offer my help here but it doesn't mean there is no workaround here. As a person who did architect complex skins and optimized every single part of them to have nothing repeated I can imagine the solution here, but it would be hard right now to get into specifics. I can only suggest my methods for optimization and simplifying skins in order to remove unnecessary repetitions.

For the repeating things I utilize several techniques in order to have sort of a template and transport it throughout the skin to omit the repetitions of the same things, and I creatively use and "bend" variables in combination with other features. Most if not all my techniques I use:
  1. MeterStyles feature is one part of the system for simplification.
  2. Using Variables is the second part on the path to simplification. You can use anywhere in the skin to substitute any repeating parts. You need to have Variables section for them which you can use in main .ini file or included .inc files. Don't forget to use !SetVariable bang in order to reflect applied changes to Variables on the go. You can as well use the variables inside of path names or to have just only one part of some value taken into variable.
  3. Using Groupsto group and sub-group relevant meters and measures and using group bangs indicated there to refer to them instead of referring to every meter separately. And you can also use !SetGroupVariable (I have never tried yet though)
  4. Obsession with Section Variables helps me a lot to sturcture all the visible elements the way I want.
  5. Creative use of Nested Variables which you can use to combine several variables to refer to one variable, not limited to that, depends how you imagine to use it. It is a really powerful tool expanding 5x times the abilities.
  6. Abuse of the built-in variable #CURRENTSECTION# which you can combine with Section Variables or Nested Variables and use anywhere else.
  7. Last but not lease, underrated ability to Escape variables.
As I said, I combine several abilities together in order to reach the most possible efficiency and use them in many small or unapparent places. And they all can be based on other variables or values as well. It is necessary to creatively "bend" them as much as possible to escape repetitions in your complex system.

Meanwhile I suggest looking at the possibilities of listed features. You might need to rewrite some parts of your skins and change your section names in order to achieve desired results.
User avatar
Lanteust
Posts: 8
Joined: March 20th, 2020, 2:57 pm
Location: France

Re: Instantiation like we do with objects?

Post by Lanteust »

Well, if you want a clear idea of my brain O.O
My idea was to help people that don't understand the code to just include what they want and to just have to play with the height...
Or have everything as modules that could be copy past from a skin to an other.
But after a few hours I have been just duplicating the same code for every app they could need. So I build my bat file to add everything.

Well, coming back to my beautifull tree (of the rewrite of my first skin)

Code: Select all

PS C:\Users\...\Documents\Rainmeter\Skins\MyIllustro> tree /f
Structure du dossier pour le volume OS
C:.
│   ReadMe.md
│
├───@Resources
│   ├───Fonts
│   │       Roboto-Regular.ttf
│   │
│   ├───Images
│   │       Background.png
│   │
│   ├───Includes
│   │   │   Settings.inc
│   │   │
│   │   ├───.example
│   │   │   ├───Images
│   │   │   ├───Layouts
│   │   │   │       .example.full.inc
│   │   │   │       .example.min.inc
│   │   │   │       .example.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           .example.inc
│   │   │
│   │   ├───Excel
│   │   │   ├───Images
│   │   │   │       Excel.png
│   │   │   │
│   │   │   ├───Layouts
│   │   │   │       Excel.full.inc
│   │   │   │       Excel.min.inc
│   │   │   │       Excel.std.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           Excel.inc
│   │   │
│   │   ├───ShareX
│   │   │   ├───Images
│   │   │   │       ShareX.png
│   │   │   │
│   │   │   ├───Layouts
│   │   │   │       ShareX.Capture.inc
│   │   │   │       ShareX.Icon.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           ShareX.LastCapture.inc
│   │   │           ShareX.Toogle.inc
│   │   │
│   │   ├───System
│   │   │   ├───Images
│   │   │   │       CPU.png
│   │   │   │       Disk.LightGreen.png
│   │   │   │       Disk.LightOff.png
│   │   │   │       Disk.LightRed.png
│   │   │   │       Disk.png
│   │   │   │       RAM.png
│   │   │   │       RecycleBin.Empty.jpeg
│   │   │   │       RecycleBin.Full.jpeg
│   │   │   │       Uptime.png
│   │   │   │
│   │   │   ├───Layouts
│   │   │   │       CPU.inc
│   │   │   │       Disk.1.inc
│   │   │   │       Disk.2.inc
│   │   │   │       Disk.light.inc
│   │   │   │       Network.Download.inc
│   │   │   │       Network.IP.inc
│   │   │   │       Network.IPLan.inc
│   │   │   │       Network.Upload.inc
│   │   │   │       RAM.inc
│   │   │   │       RecycleBin.Count.inc
│   │   │   │       RecycleBin.inc
│   │   │   │       RecycleBin.Size.inc
│   │   │   │       SWAP.inc
│   │   │   │       UpTime.inc
│   │   │   │
│   │   │   └───Modules
│   │   │           CPU.inc
│   │   │           Disk.1.inc
│   │   │           Disk.2.inc
│   │   │           Disk.inc
│   │   │           Network.Download.inc
│   │   │           Network.IP.inc
│   │   │           Network.IPLan.inc
│   │   │           Network.Upload.inc
│   │   │           RAM.inc
│   │   │           RecycleBin.Count.inc
│   │   │           RecycleBin.Size.inc
│   │   │           RecycleBin.Toogle.inc
│   │   │           SWAP.inc
│   │   │           UpTime.inc
│   │   │
│   │   └───Word
│   │       ├───Images
│   │       │       Word.png
│   │       │
│   │       ├───Layouts
│   │       │       Word.full.inc
│   │       │       Word.min.inc
│   │       │       Word.std.inc
│   │       │
│   │       └───Modules
│   │               Word.inc
│   │
│   ├───Plugins
│   │   ├───Bat
│   │   │       newInclude.bat
│   │   │       ShareX.bat
│   │   │
│   │   ├───Clipboard
│   │   │       AddToClipboard.au3
│   │   │       AddToClipboard.exe
│   │   │
│   │   └───TaskKiller
│   │           TaskKiller.au3
│   │           TaskKiller.exe
│   │           TaskKillerMulti.au3
│   │           TaskKillerMulti.exe
│   │
│   └───Templates
│           Template.Disk.1.inc
│           Template.Disk.2.inc
│           Template.Disks.inc
│           Template.IsItStillRunning.inc
│           Template.Network.inc
│           Template.ShareX.inc
│           Template.System.inc
│
├───Disk
│       Disk 1.ini
│       Disk 2.ini
│       Disks.ini
│
├───IsItStillRunning
│       IsItStillRunning.ini
│
├───Network
│       Network.ini
│
├───ShareX
│       ShareX.ini
│
└───System
        System.ini
And the code...

I don't even know if it's easier to read when you look at it now :?
  For example, do i realy need to duplicate everything for Disk 1 and Disk 2 If i want to show them at the same time? (@Ressources/Includes/System/Layouts/Disk.1.inc & Disk.2.inc)  
You do not have the required permissions to view the files attached to this post.
User avatar
Yincognito
Rainmeter Sage
Posts: 7119
Joined: February 27th, 2015, 2:38 pm
Location: Terra Yincognita

Re: Instantiation like we do with objects?

Post by Yincognito »

Active Colors wrote: June 30th, 2020, 2:57 pm No no no, it is very possible to do. It is quite complex for me to understand and visualize your structure and offer my help here but it doesn't mean there is no workaround here. As a person who did architect complex skins and optimized every single part of them to have nothing repeated I can imagine the solution here, but it would be hard right now to get into specifics. I can only suggest my methods for optimization and simplifying skins in order to remove unnecessary repetitions.

For the repeating things I utilize several techniques in order to have sort of a template and transport it throughout the skin to omit the repetitions of the same things, and I creatively use and "bend" variables in combination with other features. Most if not all my techniques I use:
  1. MeterStyles feature is one part of the system for simplification.
  2. Using Variables is the second part on the path to simplification. You can use anywhere in the skin to substitute any repeating parts. You need to have Variables section for them which you can use in main .ini file or included .inc files. Don't forget to use !SetVariable bang in order to reflect applied changes to Variables on the go. You can as well use the variables inside of path names or to have just only one part of some value taken into variable.
  3. Using Groupsto group and sub-group relevant meters and measures and using group bangs indicated there to refer to them instead of referring to every meter separately. And you can also use !SetGroupVariable (I have never tried yet though)
  4. Obsession with Section Variables helps me a lot to sturcture all the visible elements the way I want.
  5. Creative use of Nested Variables which you can use to combine several variables to refer to one variable, not limited to that, depends how you imagine to use it. It is a really powerful tool expanding 5x times the abilities.
  6. Abuse of the built-in variable #CURRENTSECTION# which you can combine with Section Variables or Nested Variables and use anywhere else.
  7. Last but not lease, underrated ability to Escape variables.
As I said, I combine several abilities together in order to reach the most possible efficiency and use them in many small or unapparent places. And they all can be based on other variables or values as well. It is necessary to creatively "bend" them as much as possible to escape repetitions in your complex system.

Meanwhile I suggest looking at the possibilities of listed features. You might need to rewrite some parts of your skins and change your section names in order to achieve desired results.
I fully agree with you, ActiveColors, and I although I'm talking about a slightly different approach that I extensively use in my skins, I guess it could be added to your list:
  • Reuse measures and meters by dynamically setting the options on them (either with or without the help of variables). This requires that you use / display only one measure / meter "set"at a time (i.e. only the Word or Excel measures / meters, but not both at once) and that each "set" is similar or identical with the others, but has the additional benefit of literally not having to repeat anything, only to create the structure of the "set template".
Profiles: Rainmeter ProfileDeviantArt ProfileSuites: MYiniMeterSkins: Earth