|
DefineClass.XCabinetBase = |
|
{ |
|
__parents = {"XDialog"}, |
|
|
|
properties = { |
|
{ category = "Scene", id = "HideDialogs", name = "Hide Dialogs", editor = "bool", default = true }, |
|
{ category = "Scene", id = "LeaveDialogsOpen", editor = "string_list", default = {}, items = ListAllDialogs, arbitrary_value = true, }, |
|
{ category = "Scene", id = "InitialDialogMode", name = "Initial Dialog Mode", editor = "text", default = false }, |
|
{ category = "Scene", id = "Lightmodel", name = "Lightmodel", editor = "combo", items = LightmodelsCombo, default = false }, |
|
{ category = "Scene", id = "SetupScene", name = "Setup Scene", editor = "func", params = "self", default = function() end }, |
|
{ category = "Scene", id = "RestorePrevScene", name = "Restore Prev Scene", editor = "func", params = "self", default = function() end }, |
|
}, |
|
|
|
hidden_meshes = false, |
|
fadeinout = true, |
|
restore_light_model = false, |
|
lightmodel_cubemaps = false, |
|
} |
|
|
|
function XCabinetBase:Init() |
|
if self.fadeinout then |
|
XDialog:new({ |
|
Id = "idFade", |
|
ZOrder = 1000, |
|
Visible = false, |
|
Background = RGBA(0, 0, 0, 255), |
|
FadeInTime = 300, |
|
FadeOutTime = 300, |
|
RolloverZoomInTime = 1000, |
|
RolloverZoomOutTime = 1000, |
|
}, self) |
|
end |
|
end |
|
|
|
function XCabinetBase:Transition(opening, inout) |
|
if opening == "open" and inout == "begin" then |
|
self.idFade:SetVisible(true) |
|
SetRolloverEnabled(false) |
|
Sleep(self.idFade.FadeInTime) |
|
WaitNextFrame(5) |
|
elseif opening == "open" and inout == "end" then |
|
self.idFade:SetVisible(false) |
|
SetRolloverEnabled(true) |
|
elseif opening == "close" and inout == "begin" then |
|
self.idFade:SetVisible(true) |
|
Sleep(self.idFade.FadeInTime) |
|
WaitNextFrame(5) |
|
elseif opening == "close" and inout == "end" then |
|
self.idFade:SetVisible(false) |
|
|
|
for i = #self, 1, -1 do |
|
if self[i].Id ~= "idFade" then |
|
self[i]:delete() |
|
end |
|
end |
|
Sleep(self.idFade.FadeOutTime) |
|
end |
|
end |
|
|
|
|
|
function XCabinetBase:CabinetRoutine() |
|
|
|
end |
|
|
|
function XCabinetBase:Open(...) |
|
XDialog.Open(self, ...) |
|
|
|
self:CreateThread("SetupScene", function() |
|
self:Transition("open", "begin") |
|
|
|
if self.Lightmodel then |
|
|
|
WindOverride = CurrentWindAnimProps() |
|
|
|
if LightmodelOverride then |
|
self.restore_light_model = LightmodelOverride |
|
end |
|
self.lightmodel_cubemaps = PreloadLightmodelCubemaps(self.Lightmodel) |
|
SetLightmodelOverride(1, self.Lightmodel) |
|
end |
|
if self.HideDialogs then |
|
XHideDialogs:new({Id = "idHideDialogs", LeaveDialogIds = self.LeaveDialogsOpen}, self):Open() |
|
end |
|
|
|
self.hidden_meshes = {} |
|
MapForEach("map", "Mesh", function(o) |
|
if o:GetEnumFlags(const.efVisible) ~= 0 then |
|
self.hidden_meshes[#self.hidden_meshes + 1] = o |
|
o:ClearEnumFlags(const.efVisible) |
|
end |
|
end) |
|
self:SetupScene() |
|
if self.InitialDialogMode then |
|
self:SetMode(self.InitialDialogMode) |
|
end |
|
self:Transition("open", "end") |
|
self:CabinetRoutine() |
|
end) |
|
end |
|
|
|
function XCabinetBase:Close(...) |
|
local force = ... |
|
if force then |
|
self:OnCloseAfterBlackFadeIn() |
|
self:OnCloseAfterBlackFadeOut() |
|
XDialog.Close(self) |
|
return |
|
end |
|
self:CreateThread("SetupScene", function() |
|
self:Transition("close", "begin") |
|
self:OnCloseAfterBlackFadeIn() |
|
if self:HasMember("idHideDialogs") and self.idHideDialogs.window_state ~= "destroying" then |
|
self.idHideDialogs:delete() |
|
end |
|
self:Transition("close", "end") |
|
self:OnCloseAfterBlackFadeOut() |
|
XDialog.Close(self) |
|
end) |
|
end |
|
|
|
function XCabinetBase:OnCloseAfterBlackFadeIn() |
|
self:RestorePrevScene() |
|
if self.Lightmodel then |
|
if self.lightmodel_cubemaps then |
|
self.lightmodel_cubemaps:Done() |
|
self.lightmodel_cubemaps = false |
|
end |
|
SetLightmodelOverride(1, self.restore_light_model) |
|
WindOverride = false |
|
end |
|
end |
|
|
|
function XCabinetBase:OnCloseAfterBlackFadeOut() |
|
if not self.hidden_meshes then return end |
|
|
|
|
|
for _, mesh in ipairs(self.hidden_meshes) do |
|
if IsValid(mesh) then |
|
mesh:SetEnumFlags(const.efVisible) |
|
end |
|
end |
|
end |