ESO Lua File v100012

common/gamepad/screenadjust/screenadjust.lua

[◄ back to folders ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
local ScreenAdjust = ZO_Object:Subclass()
local g_actionLayerFragment = nil
function ScreenAdjust:New(...)
    local adjust = ZO_Object.New(self)
    adjust:Initialize(...)
    return adjust
end
function ScreenAdjust:Initialize(control, sceneName)
    self.control = control
    self.sceneName = sceneName
    self.readyToSave = false
    local sceneFragment = ZO_FadeSceneFragment:New(control)
    -- adjust screen to be used from options menus
    local actionLayerFragment = ZO_ScreenAdjust_GetActionLayerFragment()
    local scene = ZO_Scene:New(sceneName, SCENE_MANAGER)
    scene:AddFragment(sceneFragment)
    scene:AddFragment(actionLayerFragment)
    scene:RegisterCallback("StateChange", function(oldState, newState)
        if newState == SCENE_SHOWN then
            local SAVE_INITIAL_SCREEN_SIZE = true
            self:InitializeSize(SAVE_INITIAL_SCREEN_SIZE)
            if IsInGamepadPreferredMode() then
                DIRECTIONAL_INPUT:Activate(self, self.control)
            end
            self.readyToSave = true
        elseif newState == SCENE_HIDING then
            if SCENE_MANAGER:IsCurrentSceneGamepad() then
                DIRECTIONAL_INPUT:Deactivate(self)
            end
        end
    end)
    control:RegisterForEvent(EVENT_SCREEN_RESIZED, function(_, width, height, guiName)
        if guiName == "ingame" then
            self:RefreshGuiDimensions()
            if scene:IsShowing() then
                local IGNORE_INITIAL_SCREEN_SIZE = false
                self:InitializeSize(IGNORE_INITIAL_SCREEN_SIZE)
            end
        end
    end)
    EVENT_MANAGER:RegisterForEvent("ScreenAdjustResizeEvent", 
                                EVENT_ALL_GUI_SCREENS_RESIZE_STARTED, 
                                function()
                                    self.saveButton:SetEnabled(false)
                                    self.saveButton:SetText(GetString(SI_SETTING_SHOW_SCREEN_ADJUST_DISABLED))
                                end)
    EVENT_MANAGER:RegisterForEvent("ScreenAdjustResizeEvent", 
                                EVENT_ALL_GUI_SCREENS_RESIZED, 
                                function()
                                    self.saveButton:SetText(GetString(SI_SAVE))
                                    self.saveButton:SetEnabled(true)
                                end)
end
function ScreenAdjust:InitializeKeybindButtons()
    local bindsContainer = self.control:GetNamedChild("InstructionsBinds")
    local adjustButton = bindsContainer:GetNamedChild("Adjust")
    adjustButton:SetText(GetString(SI_SCREEN_ADJUST))
    if GetGamepadType() == GAMEPAD_TYPE_PS4 then
        adjustButton:SetCustomKeyIcon("EsoUI/Art/Buttons/Gamepad/PS4/Nav_Ps4_LS_Slide_Scroll.dds")
    else
        adjustButton:SetCustomKeyIcon("EsoUI/Art/Buttons/Gamepad/XBox/Nav_XBone_LS_Slide_Scroll.dds")
    end
    adjustButton:SetupStyle(KEYBIND_STRIP_GAMEPAD_STYLE)
    self.saveButton = bindsContainer:GetNamedChild("Save")
    self.saveButton:SetText(GetString(SI_SAVE))
    self.saveButton:SetKeybind("SCREEN_ADJUST_SAVE")
    self.saveButton:SetupStyle(KEYBIND_STRIP_GAMEPAD_STYLE)
    self.saveButton:SetClickSound(SOUNDS.DIALOG_ACCEPT)
    self.saveButton:SetCallback(function()
        -- only allow resizing once the previous one has been completed.
        if not IsGUIResizing() then
            self:Commit()
            SCENE_MANAGER:Hide(self.sceneName)
        end
    end)
    self.cancelButton = bindsContainer:GetNamedChild("Cancel")
    self.cancelButton:SetText(GetString(SI_CANCEL))
    self.cancelButton:SetKeybind("SCREEN_ADJUST_CANCEL")
    self.cancelButton:SetupStyle(KEYBIND_STRIP_GAMEPAD_STYLE)
    self.cancelButton:SetClickSound(SOUNDS.DIALOG_DECLINE)
    self.cancelButton:SetCallback(function()
        self:RevertChanges()
        SCENE_MANAGER:Hide(self.sceneName)
    end)
end
function ScreenAdjust:RefreshGuiDimensions()
    self.rootWidth, self.rootHeight = GuiRoot:GetDimensions()
end
function ScreenAdjust:InitializeSize(storeInitialValues)
    local STARTING_PERCENTAGE = 0.9
    self:SetSize(self.rootWidth * STARTING_PERCENTAGE, self.rootHeight * STARTING_PERCENTAGE)
    local x, y, width, height = GetOverscanOffsets()
    -- reset to max screen
    if(x ~= 0 or y ~= 0 or width ~= 0 or height ~= 0) then
        SetOverscanOffsets(0, 0, 0, 0)
    end
    if storeInitialValues then
        -- store these values in case the user cancels out
        self.xOffsetInitialValue = x
        self.yOffsetInitialValue = y
        self.widthOffsetInitialValue = width
        self.heightOffsetInitialValue = height
    end
end
function ScreenAdjust:SetSize(width, height)
    local MIN_PERCENTAGE = 0.9
    width = zo_clamp(width, self.rootWidth * MIN_PERCENTAGE, self.rootWidth)
    height = zo_clamp(height, self.rootHeight * MIN_PERCENTAGE, self.rootHeight)
    self.width = width
    self.height = height
    self.control:SetDimensions(width, height)
end
function ScreenAdjust:Commit()
    if (self.readyToSave) then
        local xUI = self.control:GetLeft()
        local yUI = self.control:GetTop()
        local xScreenSpace = xUI * GetUIGlobalScale()
        local yScreenSpace = yUI * GetUIGlobalScale()
        --overscan offsets are in screen space so multiply by global scale to convert the UI coordinates to screen space (pixels)
        SetOverscanOffsets(xScreenSpace, yScreenSpace, -2 * xScreenSpace, -2 * yScreenSpace)
        self.readyToSave = false
    end
end
function ScreenAdjust:RevertChanges()
    SetOverscanOffsets(self.xOffsetInitialValue, self.yOffsetInitialValue, self.widthOffsetInitialValue, self.heightOffsetInitialValue)
end
function ScreenAdjust:OnSave()
    self.saveButton:OnClicked()
end
function ScreenAdjust:OnCancel()
    self.cancelButton:OnClicked()
end
function ScreenAdjust:UpdateDirectionalInput()
    local currentTimeMs = GetGameTimeMilliseconds()
    if self.lastFrameMs == nil then
        self.lastFrameMs = currentTimeMs
    end
    local MAX_TIME_MS = 100
    local deltaTimeMs = zo_min(currentTimeMs - self.lastFrameMs, MAX_TIME_MS)
    self.lastFrameMs = currentTimeMs
    local dx, dy = DIRECTIONAL_INPUT:GetXY(ZO_DI_LEFT_STICK)
    -- negative X direction is to make it larger
    dx = -dx
    -- make sure to make scaling uniform
    if zo_abs(dx) > zo_abs(dy) then
        dy = dx
    else
        dx = dy
    end
    local SCALE_RATE = 0.0001
    local xRate = SCALE_RATE * self.rootWidth
    local yRate = SCALE_RATE * self.rootHeight
    dx = dx * deltaTimeMs * xRate
    dy = dy * deltaTimeMs * yRate
    self:SetSize(self.width + dx, self.height + dy)
end
--Global XML
    if SCENE_MANAGER:IsShowing("screenAdjust") then
        SCREEN_ADJUST:OnSave()
    elseif SCENE_MANAGER:IsShowing("screenAdjustIntro") then
        SCREEN_ADJUST_INTRO:OnSave()
    end
end
    if SCENE_MANAGER:IsShowing("screenAdjust") then
        SCREEN_ADJUST:OnCancel()
    elseif SCENE_MANAGER:IsShowing("screenAdjustIntro") then
        SCREEN_ADJUST_INTRO:OnCancel()
    end
end
    if g_actionLayerFragment == nil then
        g_actionLayerFragment = ZO_ActionLayerFragment:New("ScreenAdjust")
    end
    return g_actionLayerFragment
end
    SCREEN_ADJUST = ScreenAdjust:New(self, "screenAdjust")
end
    SCREEN_ADJUST_INTRO = ScreenAdjust:New(self, "screenAdjustIntro")
end