252 lines
6.2 KiB
Plaintext
252 lines
6.2 KiB
Plaintext
FunctionUnLockFunc = class("FunctionUnLockFunc")
|
|
|
|
autoImport("ConditionCheck")
|
|
|
|
LockFuncReason = {
|
|
MenuLock = "MenuLock",
|
|
Interface = "Interface",
|
|
}
|
|
|
|
MenuUnlockType =
|
|
{
|
|
View = 1,
|
|
NpcFunction = 2,
|
|
}
|
|
|
|
function FunctionUnLockFunc.Me()
|
|
if nil == FunctionUnLockFunc.me then
|
|
FunctionUnLockFunc.me = FunctionUnLockFunc.new()
|
|
end
|
|
return FunctionUnLockFunc.me
|
|
end
|
|
|
|
function FunctionUnLockFunc:ctor()
|
|
self.menuData = {};
|
|
self:InitMenuUnLock();
|
|
self:InitInterfaceData();
|
|
|
|
self.enterBtnsMap = {};
|
|
end
|
|
|
|
function FunctionUnLockFunc:InitMenuUnLock()
|
|
for key,data in pairs(Table_Menu)do
|
|
local mData = self.menuData[key];
|
|
if(not mData)then
|
|
mData = {};
|
|
mData.checker = ConditionCheck.new();
|
|
self.menuData[key] = mData;
|
|
end
|
|
mData.staticData = data;
|
|
mData.checker:SetReason(LockFuncReason.MenuLock);
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:GetMenuId(menuData)
|
|
if(menuData)then
|
|
if(menuData.staticData)then
|
|
return menuData.staticData.id;
|
|
elseif(menuData.interfaceData)then
|
|
return menuData.interfaceData.id;
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:GetMenuData(menuid)
|
|
return self.menuData[menuid];
|
|
end
|
|
|
|
function FunctionUnLockFunc:GetMenuDataByPanelID(panelId, unlockType)
|
|
for _,mData in pairs(self.menuData)do
|
|
if(mData.staticData)then
|
|
if(mData.staticData.PanelID == panelId and mData.staticData.type == unlockType)then
|
|
return mData;
|
|
end
|
|
end
|
|
if(mData.interfaceData)then
|
|
if(mData.interfaceData.PanelID == panelId)then
|
|
return mData;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:InitInterfaceData()
|
|
self.propMap = {};
|
|
for _,iData in pairs(Table_InterfaceOpen)do
|
|
if(iData.Condition and iData.Condition.Prop)then
|
|
if(iData.Condition.Prop.VarName)then
|
|
self.propMap[iData.Condition.Prop.VarName] = 1;
|
|
end
|
|
if(iData.PanelID)then
|
|
local mData = self:GetMenuDataByPanelID(iData.PanelID, MenuUnlockType.View);
|
|
if(not mData)then
|
|
-- interface表 和 menu表 兩張表沒有統一的唯一Key 但是兩者的reason卻要統一
|
|
-- (待優化)這樣寫應該是不被允許的 可臨時解決問題
|
|
local key = "Interface"..iData.PanelID;
|
|
mData = {};
|
|
mData.checker = ConditionCheck.new();
|
|
self.menuData[key] = mData;
|
|
iData.id = key;
|
|
end
|
|
mData.interfaceData = iData;
|
|
self:SetReason(self:GetMenuId(mData), LockFuncReason.Interface);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:SetReason(menuid, reason)
|
|
local menuData = self.menuData[menuid];
|
|
if(menuData)then
|
|
menuData.checker:SetReason(reason);
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:RemoveReason(menuid, reason)
|
|
local mData = self.menuData[menuid];
|
|
if(mData)then
|
|
mData.checker:RemoveReason(reason);
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:ClearUselessButton()
|
|
for key,buttons in pairs(self.enterBtnsMap)do
|
|
for i=#buttons, 1, -1 do
|
|
if(GameObjectUtil.Instance:ObjectIsNULL(buttons[i]))then
|
|
table.remove(buttons, i);
|
|
end
|
|
end
|
|
if(#buttons == 0)then
|
|
self.enterBtnsMap[key] = nil;
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:RegisteEnterBtn(menuid, button)
|
|
local mData = self.menuData[menuid];
|
|
if(mData and mData.staticData.Enterhide == 1)then
|
|
if(not self:CheckCanOpen(menuid))then
|
|
local buttonMap = self.enterBtnsMap[menuid];
|
|
if(not buttonMap)then
|
|
self.enterBtnsMap[menuid] = {};
|
|
buttonMap = self.enterBtnsMap[menuid];
|
|
end
|
|
table.insert(buttonMap, button);
|
|
button.gameObject:SetActive(false);
|
|
end
|
|
end
|
|
self:ClearUselessButton();
|
|
end
|
|
|
|
function FunctionUnLockFunc:RegisteEnterBtnByPanelID(panelid, button)
|
|
local data = self:GetMenuDataByPanelID(panelid, MenuUnlockType.View);
|
|
if(data)then
|
|
self:RegisteEnterBtn(self:GetMenuId(data), button)
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:UnRegisteEnterBtn(menuid)
|
|
local buttons = self.enterBtnsMap[menuid];
|
|
if(buttons)then
|
|
for _,button in pairs(buttons)do
|
|
if(not GameObjectUtil.Instance:ObjectIsNULL(button))then
|
|
button.gameObject:SetActive(true);
|
|
end
|
|
end
|
|
self.enterBtnsMap[menuid] = nil;
|
|
GameFacade.Instance:sendNotification(UIMenuEvent.UnRegisitButton);
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:CheckCanOpen(menuid, withTip)
|
|
if(menuid == nil)then
|
|
return true;
|
|
end
|
|
|
|
local menuData = self.menuData[menuid];
|
|
if(menuData)then
|
|
local open = not menuData.checker:HasReason();
|
|
if(withTip and not open)then
|
|
self:ErrorMsg(menuid);
|
|
end
|
|
return open;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
function FunctionUnLockFunc:CheckCanOpenByPanelId(panelId, withTip, unlockType)
|
|
unlockType = unlockType or MenuUnlockType.View;
|
|
|
|
local menuData = self:GetMenuDataByPanelID(panelId, unlockType);
|
|
if(menuData)then
|
|
return self:CheckCanOpen(self:GetMenuId(menuData), withTip);
|
|
end
|
|
return true;
|
|
end
|
|
|
|
function FunctionUnLockFunc:ErrorMsg(menuid)
|
|
local mData = self:GetMenuData(menuid);
|
|
if(mData) then
|
|
local msgid, params;
|
|
local reasons = mData.checker.reasons;
|
|
if(type(reasons)=="table")then
|
|
local _,reason = next(reasons);
|
|
if(reason == LockFuncReason.MenuLock)then
|
|
msgid = mData.staticData.sysMsg.id;
|
|
params = mData.staticData.sysMsg.params;
|
|
elseif(reason == LockFuncReason.Interface and mData.interfaceData)then
|
|
msgid = mData.interfaceData.SysMsgID.id;
|
|
params = mData.interfaceData.SysMsgID.params;
|
|
end
|
|
end
|
|
if(msgid)then
|
|
MsgManager.ShowMsgByIDTable(msgid, params);
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:UnLockMenu(menuid)
|
|
self:RemoveReason(menuid, LockFuncReason.MenuLock);
|
|
end
|
|
|
|
function FunctionUnLockFunc:LockMenu(menuid)
|
|
self:SetReason(menuid, LockFuncReason.MenuLock);
|
|
end
|
|
|
|
function FunctionUnLockFunc:CheckProp(prop)
|
|
if(not prop or not self.propMap[prop.propVO.name])then
|
|
return;
|
|
end
|
|
for _,mData in pairs(self.menuData)do
|
|
if(mData.interfaceData)then
|
|
local condition = mData.interfaceData.Condition;
|
|
if(condition.Prop and condition.Prop.VarName == prop.propVO.name)then
|
|
if(prop:GetValue() == condition.Prop.value)then
|
|
self:RemoveReason(self:GetMenuId(mData), LockFuncReason.Interface);
|
|
else
|
|
self:SetReason(self:GetMenuId(mData), LockFuncReason.Interface);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function FunctionUnLockFunc:GetPanelConfigById(panelid)
|
|
if(not self.panelConfigMap)then
|
|
self.panelConfigMap = {};
|
|
for _, config in pairs(PanelConfig) do
|
|
self.panelConfigMap[config.id] = config;
|
|
end
|
|
end
|
|
return self.panelConfigMap[panelid];
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|