Notifications
Clear all

[Closed] Can Rollouts remember their states?

I have a script with a floater with several rollouts.

I would like to know if it’s possible to have the rollouts remember their states from the last time the floater was used?

7 Replies
2 Replies
(@bobo)
Joined: 2 years ago

Posts: 0

Yes. You would have to store them all in an INI file and restore when opening again.
Will post an example if you want…

(@bobo)
Joined: 2 years ago

Posts: 0

(
 global theTestFloater 
 try(closeRolloutFloater theTestFloater)catch()
 local theIniFile = getDir #plugCfg + "/TestRolloutState.ini"
 rollout testRollout01 "Test Rollout 01"
 (
 	button testButton "Test"
 	on testRollout01 close do 
 		setIniSetting theIniFile "Rollout01" "Rolledup" (testRollout01.open as string)
 	on testRollout01 open do 
 		if (val = execute (getIniSetting theIniFile "Rollout01" "Rolledup")) != OK do testRollout01.open = val
 )
 rollout testRollout02 "Test Rollout 02"
 (
 	button testButton "Test"
 	on testRollout02 close do 
 		setIniSetting theIniFile "Rollout02" "Rolledup" (testRollout02.open as string)
 	on testRollout02 open do 
 		if (val = execute (getIniSetting theIniFile "Rollout02" "Rolledup")) != OK do testRollout02.open = val
 )
 rollout testRollout03 "Test Rollout 03"
 (
 	button testButton "Test"
 	on testRollout03 close do 
 		setIniSetting theIniFile "Rollout03" "Rolledup" (testRollout03.open as string)
 	on testRollout03 open do 
 		if (val = execute (getIniSetting theIniFile "Rollout03" "Rolledup")) != OK do testRollout03.open = val
 	
 )
 
 theTestFloater = newRolloutFloater "Test" 200 300 
 addRollout testRollout01 theTestFloater 
 addRollout testRollout02 theTestFloater 
 addRollout testRollout03 theTestFloater 
 )

Thanks Bobo!

I’ll give it a try.

Thanks Bobo, that works perfectly.

Just another quick question if you can spare the time!

I’m wondering if I can lock the tool bar button/icon for my script in an “on state” while the floater is open?

Just the way the “Layer Manager button” works for example?

Thanks again!

1 Reply
(@ofer_z)
Joined: 2 years ago

Posts: 0

here’s a little expamle of how to do this:


  macroScript testDialog
  	buttontext: "test dialog"
  	category: "Tests"
  (
  	-- declare a local variable that holds the state of the rollout.
  	-- the reason to use will be explained below.
  	local testDialgOpen = false
  	
  	rollout testDialg "test Dialog"
  	(
  		-- declare a close button
  		button cl "close"
  		on cl pressed do destroyDialog testDialg
  		
 		-- on closing of the rollout either by the close button or the window "X" button
 		-- will set the testDialgOpen to false so the toolbar button will be turned off.
  		on testDialg close do (
  			testDialgOpen = false
  			updateToolbarButtons()
  		)
  	)-- end rollout definition
  
  	-- this is the important part for having the toolbar button stay pressed when the rollout
  	-- is open. the simple case is to use: 
  	-- on isChecked return testDialg.open
  	-- however, using this, when closing the rollout using either the close button or the window's "X"
  	-- will execute the on testDialg close handler before the rollout is actually closed, and so
  	-- the toolbar button will stay pressed. using a local variable and assigning the rollout state to
  	-- it solves this issue.
  	on isChecked return testDialgOpen
  
  	-- to use the toolbar button as a toggle we use the code below to test if the rollout is open or not.
  	-- if it is not, it will be created, otherwise it will be closed.
  	on execute do (
  		if testDialg.open then (
  			destroyDialog testDialg
  		) else (
  			createDialog testDialg
  		)
  		testDialgOpen = testDialg.Open
  		updateToolbarButtons()
  	)-- end on execute handler
  )-- end of macroscript
  

hOpe this helps,
o

Ofer’s code works in all MAXScript versions since R2.
If you are using MAX 7 though, you can also use the new on closeDialogs do() handler:

macroScript TestFloater category:"Forum Help"
(
global theTestFloater --declare the floater variable
rollout testRollout01 "Test Rollout 01" --define a rollout
(
	button testButton "Test"
)
on execute do --define the on execute handler
(
	try(closeRolloutFloater theTestFloater)catch() --make sure the floater is closed
	theTestFloater = newRolloutFloater "Test" 200 300  --define new floater
	addRollout testRollout01 theTestFloater  --add the rollout
)	
on isChecked return try(theTestFloater.open)catch(false) --return true if floater open, false otherwise

--This handler is called in Max 7 instead of on Execute do 
--whenever the on isChecked handler returns true. 
--It can be used to cleanup the macro and do everything related to toggling off.
--This is how all shipping toggleable macroScripts in Max 7 have been implemented.
on closeDialogs do closeRolloutFloater theTestFloater 
	
)

Thanks again Bobo!