-- Reset ui & manage desktop change (one desktop per editor mode)



------------------------------------------------------------------------------------
function setActive(wndName, active)
	local wnd = getUI(wndName, r2.Config.VerboseGetUI)
	if wnd ~= nil then
		wnd.active = active
	end
end

------------------------------------------------------------------------------------
function hide(wndName)
	setActive(wndName, false)	
end	

------------------------------------------------------------------------------------
function show(wndName)
	setActive(wndName, true)		
end	


function r2:hide(wndName)
	hide(wndName)
end

-- Reset windows placement in each desktop (one desktop per mode of the editor, so no virtual desktop are available in r2ed)
function r2:resetDesktop(desktopIndex)	
	local scrW, scrH = getWindowSize()

	----------------------------------------------------------------------------------------------------------
	-- reset the EDITION desktop
	if desktopIndex == 0 then		
		hideAllWindows()								
		local palette = getUI("ui:interface:r2ed_palette")
		if palette then
			palette.active = true				
			palette.x = 4
			palette.y = scrH - 85
			palette.w = 225
			palette.h = 245
		end	
		local scenario = getUI("ui:interface:r2ed_scenario")
		if scenario then				
			scenario.active = false
			--scenario.w = 315
			scenario.w = 350
			scenario.h = 450
			scenario.x = scrW - scenario.w - 5
			scenario.y = scrH - 65
			-- by default the 'scene rollout' is opened
			--r2:setRolloutOpened(scenario:find("geo_tree").caption, scenario:find("geo_tree_list"), true)
			-- by default the 'permanent content' is opened
			--r2:setRolloutOpened(scenario:find("content_tree").caption, scenario:find("content_tree_list"), true)
			-- by default the 'act' rollout is opened
			--r2:setRolloutOpened(scenario:find("acts").caption, scenario:find("act_tree_enclosing"), true)			
		end	
		local webAdmin = getUI("ui:interface:r2ed_web_admin")
		webAdmin.active = false
		--if webAdmin then		
		--	webAdmin.active = false
		--	webAdmin.w = 250
		--	webAdmin.h = 255
		--	webAdmin.x = scrW - webAdmin.w - 5
        -- if scenario then
        -- webAdmin.y = scenario.y - scenario.h - 5
        -- else
        -- webAdmin.y = scrH -  5
        -- end
		-- end	

		local toolbar = getUI("ui:interface:r2ed_toolbar")
		if toolbar then
			toolbar.active = true
			toolbar:invalidateCoords()
			toolbar:updateCoords()			
		end
		
      
		  if r2.Scenario then
         r2:setSelectedInstanceId("") -- force a real select
			 r2:setSelectedInstanceId(r2.Scenario.InstanceId)
		  end
		-- <action handler="set" params="target='ui:interface:debug_info:active'|value=0"/>
		-- <action handler="set" params="target='ui:interface:debug_info:w'|value=350" />
		-- <action handler="set" params="target='ui:interface:debug_info:h'|value=300" />
		-- <action handler="set" params="target='ui:interface:debug_info:x'|value=10000" />
		-- <action handler="set" params="target='ui:interface:debug_info:y'|value=370" />							

	----------------------------------------------------------------------------------------------------------
	-- reset the TEST dektop		
	elseif desktopIndex == 1 then	
		hideAllWindows()
		-- show game related windows in test mode
		-- (same as virtual desktop 0 in game)

		-- Target
		runAH(nil, "set", "target='ui:interface:target:active'|value=1")
		runAH(nil, "set", "target='ui:interface:target:locked'|value=0")	
		runAH(nil, "set", "target='ui:interface:target:x'|value=sub(sub(getprop('ui:interface:w'),getprop('ui:interface:target:w')),4)")
		runAH(nil, "set", "target='ui:interface:target:y'|value=sub(getprop('ui:interface:h'),4)")
   
		-- gestion sets
		runAH(nil, "set", "target='ui:interface:gestionsets:active'|value=1")
		runAH(nil, "set", "target='ui:interface:gestionsets:x'|value=div(sub(getprop('ui:interface:w'),getprop('ui:interface:gestionsets:w')),2)")
		runAH(nil, "set", "target='ui:interface:gestionsets:y'|value=sub(getprop('ui:interface:h'),4)")
	
		-- player
		runAH(nil, "set", "target='ui:interface:player:active'|value=1")
		runAH(nil, "set", "target='ui:interface:player:x'|value=4")
		runAH(nil, "set", "target='ui:interface:player:y'|value=sub(getprop('ui:interface:h'),4)" )
		runAH(nil, "set", "target='ui:interface:player:locked'|value=0")
		runAH(nil, "set_transparent", "ui:interface:player")

		local webAdmin = getUI("ui:interface:r2ed_web_admin")
		webAdmin.active = false
		--if webAdmin then		
		--	webAdmin.active = true
		--	webAdmin.w = 250
		--	webAdmin.h = 255
		--	webAdmin.x = scrW - webAdmin.w - 5
		--	webAdmin.y = scrH - 75			
		--end	
		
		-- bonus malus window
		runAH(nil, "set", "target='ui:interface:bonus_malus:active'|value=1")
		runAH(nil, "set", "target='ui:interface:bonus_malus:x'|value=188")
		runAH(nil, "set", "target='ui:interface:bonus_malus:y'|value=sub(getprop('ui:interface:h'),4)")
		runAH(nil, "set", "target='ui:interface:bonus_malus:locked'|value=1")
		
		-- Compass
		--runAH(nil, "set", "target='ui:interface:compass:x'|value=sub(sub(getprop('ui:interface:w'),getprop('ui:interface:compass:w')),4)")
		--runAH(nil, "set", "target='ui:interface:compass:y'|value=sub(sub(getprop('ui:interface:h'),getprop('ui:interface:target:h')),8)")
		
		-- Help
		--runAH(nil, "set", "target='ui:interface:help_browser:active'|value=1")
		--runAH(nil, "set", "target='ui:interface:help_browser:locked'|value=0")
		--runAH(nil, "set", "target='ui:interface:help_browser:w'|value=410")
		--runAH(nil, "set", "target='ui:interface:help_browser:h'|value=128")
		--runAH(nil, "set", "target='ui:interface:help_browser:x'|value=sub(sub(getprop('ui:interface:w'),getprop('ui:interface:help_browser:w')),4)")
		--runAH(nil, "set", "target='ui:interface:help_browser:y'|value=add(getprop('ui:interface:help_browser:h'),4)")

		-- System Info
		--runAH(nil, "set", "target='ui:interface:system_info:w'|value=div(sub(getprop('ui:interface:w'),add(getprop('ui:interface:help_browser:w'),16)),2)")
		--runAH(nil, "set", "target='ui:interface:system_info:h'|value=128")
		--runAH(nil, "set", "target='ui:interface:system_info:x'|value=4")
		--runAH(nil, "set", "target='ui:interface:system_info:y'|value=add(getprop('ui:interface:system_info:h'),4)")
		
		-- Main Chat
		-- runAH(nil, "set", "target='ui:interface:main_chat:w'|value=getprop('ui:interface:system_info:w')")
		-- runAH(nil, "set", "target='ui:interface:main_chat:h'|value=128")
		-- runAH(nil, "set", "target='ui:interface:main_chat:x'|value=add(getprop('ui:interface:system_info:w'),8)")
		-- runAH(nil, "set", "target='ui:interface:main_chat:y'|value=add(getprop('ui:interface:system_info:h'),4)")

		
		-- Mission Journal
		--runAH(nil, "set", "target='ui:interface:info_player_journal:active'|value=1")
		--runAH(nil, "set", "target='ui:interface:info_player_journal:locked'|value=0")		
		--runAH(nil, "set", "target='ui:interface:info_player_journal:x'|value=4")
		--runAH(nil, "set", "target='ui:interface:info_player_journal:y'|value=add(add(getprop('ui:interface:system_info:h'),getprop('ui:interface:info_player_journal:h')),8)")


		-- Milko Pad
		--runAH(nil, "set", "target='ui:interface:milko:x'|value=sub(sub(getprop('ui:interface:w'),getprop('ui:interface:milko:w')),4)")
		--runAH(nil, "set", "target='ui:interface:milko:y'|value=sub(sub(getprop('ui:interface:compass:y'),getprop('ui:interface:compass:h')),4)")

      -- Hands
      
		local toolbarWindow = getUI("ui:interface:r2ed_toolbar_window")
		toolbarWindow.x=32
		toolbarWindow.y=0

		local milkoPad = getUI("ui:interface:milko_pad")
		milkoPad.y = 0
		milkoPad.x = scrW - milkoPad.w

	----------------------------------------------------------------------------------------------------------
	-- reset the DM destop		
	elseif desktopIndex == 2 then

		hideAllWindows()
		local webAdmin = getUI("ui:interface:r2ed_web_admin")
		webAdmin.active = false
		--if webAdmin then		
		--	webAdmin.active = true
		--	webAdmin.w = 250
		--	webAdmin.h = 255
		--	webAdmin.x = scrW - webAdmin.w - 5
		--	webAdmin.y = scrH - 5
		--end	
		local toolbar = getUI("ui:interface:r2ed_toolbar")
		if toolbar then
			toolbar.active = true
			toolbar:invalidateCoords()
			toolbar:updateCoords()			
		end

		local dmToolbar = getUI("ui:interface:r2ed_windows_dm_bar")
		if dmToolbar then
			dmToolbar.active = true
			dmToolbar:invalidateCoords()
			dmToolbar:updateCoords()			
		end

		hide("ui:interface:bonus_malus") -- patch for the bonus-malus window
	elseif desktopIndex == 3 then
		hideAllWindows()
	end
	r2:resetDesktopVisibleWindows(desktopIndex)
end

	
local function cleanEnv(contName)
	local cont = getUI("ui:interface" .. contName, r2.Config.VerboseGetUI)
	if cont then
		cont:deleteLUAEnvTable(true) -- recursively delete lua environments
		cont:setOnDraw("")
	end
end



----------------------------------------------------------------------------------------------------------
function r2:adjustToolbarGap()
	local toolbar = getUI("ui:interface:r2ed_toolbar")
	local dx = 0
	local numGroups = toolbar:getNumGroups()
	for k = 0, numGroups - 1 do
		local gr = toolbar:getGroup(k)
		if gr.active then
			gr.x = dx
			dx = 4
		else
			gr.x = 0
		end
	end
end

----------------------------------------------------------------------------------------------------------
-- common to r2:onChangeDesktop & r2:resetDesktop
function r2:resetDesktopVisibleWindows(desktopIndex)		
	-- reset the EDIT desktop
	if desktopIndex == 0 then				
		if (r2.CurrentPropertyWindow) then			
			r2.CurrentPropertyWindow.active = false
			r2.CurrentPropertyWindow = nil
		end
		r2.PropertyWindowVisible = false
		show("ui:interface:r2ed_tool_context_help")
		if config.R2EDExtendedDebug == 1 then
			show("ui:interface:r2ed_current_session")
		else
			hide("ui:interface:r2ed_current_session")
		end
		hide("ui:interface:welcome_info")
		hide("ui:interface:compass")
		show("ui:interface:r2ed_main_menu_button")
		show("ui:interface:r2ed_main_bl")		
		show("ui:interface:r2ed_select_bar")
		hide("ui:interface:r2ed_select_bar:buttons")
		hide("ui:interface:r2ed_select_bar:sequences")		
		hide("ui:interface:milko_pad")
		hide("ui:interface:windows")
		hide("ui:interface:r2ed_npc")
		hide("ui:interface:ring_chars_tracking")
		local b1 = getUI("ui:interface:r2ed_select_bar"):find("b1")
		if b1 then
			b1:updateCoords() -- force to update the coords, icon position not good otherwise
		end
		hide("ui:interface:bonus_malus") -- patch for the bonus-malus window
		r2.ToolUI:updateUndoRedo()		
		hide("ui:interface:r2ed_connect")
		hide("ui:interface:r2ed_toolbar_window")
		-- reset the TEST desktop
	elseif desktopIndex == 1 then		
		if config.R2EDExtendedDebug == 1 then
			show("ui:interface:r2ed_current_session")
		else
			hide("ui:interface:r2ed_current_session")
		end
		hide("ui:interface:compass")
		hide("ui:interface:welcome_info")
		show("ui:interface:r2ed_main_bl")
		hide("ui:interface:r2ed_testbar")		
		hide("ui:interface:r2ed_main_menu_button")		
		show("ui:interface:milko_pad")
		hide("ui:interface:windows")				
		hide("ui:interface:r2ed_connect")
		hide("ui:interface:ring_chars_tracking")
		if not r2.isSessionOwner() and r2.AccessMode ~= "Editor" then
			hide("ui:interface:r2ed_toolbar_window")
		else
			show("ui:interface:r2ed_toolbar_window")
		end

	-- reset the DM desktop		
	elseif desktopIndex == 2 then
		hide("ui:interface:compass")
		if config.R2EDExtendedDebug == 1 then
			show("ui:interface:r2ed_current_session")
		else
			hide("ui:interface:r2ed_current_session")
		end
		hide("ui:interface:r2ed_main_bl")
		show("ui:interface:r2ed_testbar")
		show("ui:interface:r2ed_main_menu_button")		
		hide("ui:interface:milko_pad")
		hide("ui:interface:windows")		
		hide("ui:interface:bonus_malus") -- patch for the bonus-malus window
		hide("ui:interface:r2ed_connect")
		hide("ui:interface:r2ed_toolbar_window")
		hide("ui:interface:ring_chars_tracking")
	else
		hide("ui:interface:bonus_malus") -- patch for the bonus-malus window
	end	

	hide("ui:interface:team_share") -- patch for the 'team share' window
	
	game:updateMissionJournalMode()
	r2:disableAnimals()
end

-- called by C ++ : reset non savable parts after a desktop change
function r2:onChangeDesktop(desktopIndex)
	--debugInfo("On change desktop = " .. tostring(desktopIndex))	
	hideAllNonSavableWindows();

	-- in each case, hide welcom and ring access windows
	getUI("ui:interface:npc_web_browser").active=false

	----------------------------------------------------------------------------------------------------------
	-- set the EDITION desktop
	if desktopIndex == 0 then		
		r2:setFixedLighting(false)
		hide("ui:interface:feature_help")
		r2.ui.AnimBar:clearActions()				
		local toolbar = getUI("ui:interface:r2ed_toolbar")
		if toolbar then
			toolbar.active = true
			toolbar.r2ed_tool_select.active = true
			toolbar.r2ed_tool_rotate.active = true
			toolbar.r2ed_tool_undo.active = true
			toolbar.r2ed_tool_redo.active = true
			toolbar.r2ed_tool_copy.active = true
			toolbar.r2ed_tool_paste.active = true
			toolbar.r2ed_tool_teleport.active = true
			toolbar.r2ed_tool_display_mode.active = true
			toolbar.r2ed_tool_start.active = true
			toolbar.r2ed_tool_stop.active = false
			toolbar.r2ed_stop_live.active = false
			--toolbar.r2ed_tool_teleport.x = 4
			r2:adjustToolbarGap()
			toolbar.r2ed_freeze_bot_objects.x = 4
			toolbar.r2ed_unfreeze_bot_objects.x = 0
			toolbar:invalidateCoords()
			toolbar:updateCoords()
			toolbar.r2ed_live.active = false

			
		end	
		local windowsDMBar = getUI("ui:interface:r2ed_windows_dm_bar")
		if windowsDMBar then
			windowsDMBar.active=false
			windowsDMBar:invalidateCoords()
			windowsDMBar:updateCoords()
		end			
		cleanEnv("r2ed_scenario")
		cleanEnv("r2ed_bbox_edit")
		cleanEnv("r2ed_toolbar")
		cleanEnv("r2ed_windowbar")
		cleanEnv("r2ed_testbar")
		cleanEnv("r2ed_toolbar_admin")
		cleanEnv("r2ed_table_test")
		cleanEnv("r2ed_editbox_test")
		cleanEnv("lua_inspector")
		cleanEnv("r2ed_palette")
		cleanEnv("r2ed_connect")
		cleanEnv("r2ed_property_sheet_no_selection")
		cleanEnv("r2ed_property_sheet_no_properties")
		cleanEnv("r2ed_scenario")
		r2.ScenarioWindow:resetWindow()
		r2.ContextualCommands:setupToolbar(nil)				

		-- set new title for th "keys" window
		local keys = getUI("ui:interface:keys")
		if keys then
			keys.uc_title = i18n.get("uiR2EDEditingKeys")
		end
	
		if r2.UserComponentsManager then
			r2.UserComponentsManager:updateUserComponentsUi()
		end
		r2:setupFreezeBotObjectButton()
		local goTestButton = getUI("ui:interface:r2ed_toolbar"):find("r2ed_tool_start").unselected.button
		local goTestMenu = getUI("ui:interface:r2ed_main_menu"):find("go_test")	
		goTestButton.frozen = false
		goTestMenu.grayed = false
	----------------------------------------------------------------------------------------------------------
	-- set the TEST desktop OR player desktop
	elseif desktopIndex == 1 then
		r2:setFixedLighting(false)
		hide("ui:interface:feature_help")
		r2.ui.AnimBar:clearActions()
		r2.ui.AnimBar:update()
		local toolbar = getUI("ui:interface:r2ed_toolbar")		
		toolbar.active = false
		local toolbarWindow = getUI("ui:interface:r2ed_toolbar_window")
		toolbarWindow:find("r2ed_anim_dm_mode").active = (r2.AccessMode == "Editor")
		toolbarWindow:find("r2ed_stop_live").active = not (r2.AccessMode == "Editor") and r2.isSessionOwner()
		toolbarWindow:find("player_control").active = (not (r2.AccessMode == "Editor")) and r2.isSessionOwner()
		toolbarWindow:find("r2ed_live").active = false
		
		-- resize the toolbarWindow depending on content
		r2:resizeToolbarWindow()
				
		local windowsDMBar = getUI("ui:interface:r2ed_windows_dm_bar")		
		if windowsDMBar then			
			windowsDMBar.r2ed_live.active = (not (r2.AccessMode == "Editor")) and r2.isSessionOwner() 
			windowsDMBar.player_control.active = (not (r2.AccessMode == "Editor")) and r2.isSessionOwner()			
			windowsDMBar:invalidateCoords()			
			windowsDMBar:updateCoords()			
		end	
		
		r2:adjustToolbarGap()

		local keys = getUI("ui:interface:keys")
		if keys then
			keys.uc_title = i18n.get("uiR2EDTestOrDMKeys")
		end

	----------------------------------------------------------------------------------------------------------
	-- reset the DM desktop		
	elseif desktopIndex == 2 then   
		r2:setFixedLighting(false)
		hide("ui:interface:feature_help")
		r2.ui.AnimBar:clearActions()     
		local toolbar = getUI("ui:interface:r2ed_toolbar")
		if toolbar then
			toolbar.active = true
			toolbar.r2ed_freeze_bot_objects.active = false
			toolbar.r2ed_unfreeze_bot_objects.active = false
			toolbar.r2ed_tool_select.active = false
			toolbar.r2ed_tool_rotate.active = false
			toolbar.r2ed_tool_undo.active = false
			toolbar.r2ed_tool_redo.active = false			
			toolbar.r2ed_tool_copy.active = false
			toolbar.r2ed_tool_paste.active = false
			toolbar.r2ed_tool_teleport.active = true
			toolbar.r2ed_tool_display_mode.active = false
			toolbar.r2ed_tool_start.active = false
			toolbar.r2ed_tool_stop.active = (r2.AccessMode == "Editor")			
			toolbar.r2ed_stop_live.active = (not (r2.AccessMode == "Editor")) and r2.isSessionOwner()
			--toolbar.r2ed_tool_teleport.x = -20 -- compensate x from previous buttons
			--toolbar.r2ed_stop_live.x = -8 -- compensate x from previous buttons
			toolbar.r2ed_live.active = (r2.AccessMode=="Editor" or r2.Mode=="DM") 
			r2:adjustToolbarGap()
			toolbar:invalidateCoords()
			toolbar:updateCoords()
		end

		
		local windowsDMBar = getUI("ui:interface:r2ed_windows_dm_bar")
		if windowsDMBar then
			windowsDMBar.active=true
			windowsDMBar.r2ed_live.active = (not (r2.AccessMode == "Editor")) and r2.isSessionOwner() 
			windowsDMBar.player_control.active = (not (r2.AccessMode == "Editor")) and r2.isSessionOwner()			

			windowsDMBar:invalidateCoords()
			windowsDMBar:updateCoords()
		end
		r2.ui.AnimBar:update()
		r2.ui.AnimBar:updateDMControlledEntitiesWindow()					
		local keys = getUI("ui:interface:keys")
		if keys then
			keys.uc_title = i18n.get("uiR2EDTestOrDMKeys")
		end
	end	

	-- special : if "key" window is visible on current desktop, hide, then show it again to force a refresh of its content
	local keys = getUI("ui:interface:keys")
	if keys.active then
		keys.active = false
		keys.active = true
	end

	r2:resetDesktopVisibleWindows(desktopIndex)
	r2.ToolUI:updateToggleWindowButtons()
	r2.ToolUI:updateToggleWindowDMButtons()
end

function r2:resizeToolbarWindow()
	local toolbarWindow = getUI("ui:interface:r2ed_toolbar_window")	
	toolbarWindow:updateCoords()
	local w = toolbarWindow:find("enclosing").w_real + 16		
	toolbarWindow.w = w
	toolbarWindow.pop_min_w = w
	toolbarWindow.pop_max_w = w
	toolbarWindow:updateCoords()
end

-- for masterless mode only : display option to control player & quit
function r2:initDMToolbarWindowPos()

	if not r2.isSessionOwner() then return end

	local scrW, scrH = getWindowSize()
	-- init dm toolbar default pos
	local toolbarWindow = getUI("ui:interface:r2ed_toolbar_window")	
	toolbarWindow.active = true
	toolbarWindow.x= 11
	toolbarWindow.y=scrH - 190
end
	
-- for masterless mode only : display option to control player & quit
function r2:popDMToolbarWindow()
	local toolbarWindow = getUI("ui:interface:r2ed_toolbar_window")	
	toolbarWindow.active = true	
	toolbarWindow:find("r2ed_anim_dm_mode").active = false
	toolbarWindow:find("r2ed_stop_live").active = true
	toolbarWindow:find("r2ed_live").active = true
	toolbarWindow:find("player_control").active = true
	r2:resizeToolbarWindow()
	setTopWindow(toolbarWindow)
	hide("ui:interface:r2ed_main_bl")
	game:updateMissionJournalMode()
	r2:disableAnimals()
	getUI("ui:interface:welcome_info").active=false
end


-- fix for previous versions : dm toolbar was shown on players desktop
function r2:playerModeUIFix()
	local toolbarWindow = getUI("ui:interface:r2ed_toolbar_window")	
	toolbarWindow.active = false	
	hide("ui:interface:r2ed_main_bl")
	game:updateMissionJournalMode()
	r2:disableAnimals()
	getUI("ui:interface:welcome_info").active=false
end


function r2:disableAnimals()
	local animals = getUI("ui:interface:animal_global")		
	animals.content.no_available_animals.active = true
	animals.list.active = false
	animals.header_opened.active = false
	animals.header_closed.active = true
end