Back to Home

ESO Lua File v101044

pregameandingame/zo_options/optionswindowtemplate.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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
-- Control types used in the settings panels
OPTIONS_DROPDOWN = 1
OPTIONS_CHECKBOX = 2
OPTIONS_SECTION_TITLE = 3
OPTIONS_SLIDER = 4
OPTIONS_CUSTOM = 5
OPTIONS_HORIZONTAL_SCROLL_LIST = 6
OPTIONS_FINITE_LIST = 7
OPTIONS_INVOKE_CALLBACK = 8
OPTIONS_COLOR = 9
OPTIONS_CHAT_COLOR = 10
local function GetControlType(control)
    return control.optionsManager:GetControlTypeFromControl(control)
end
    local data = control.data
    if data.GetSettingOverride then
        return data.GetSettingOverride(control)
    end
    if GetControlType(control) == OPTIONS_CHECKBOX then
        return GetSetting_Bool(data.system, data.settingId)
    end
    return GetSetting(data.system, data.settingId)
end
    local shownValue = tonumber(value)
    local min = data.showValueMin or data.minValue
    local max = data.showValueMax or data.maxValue
    local formattedValueString
    if data.showValueFunc then
        formattedValueString = data.showValueFunc(shownValue)
        min = data.showValueFunc(min)
        max = data.showValueFunc(max)
    else
        if data.showValueMin and data.showValueMax and data.showValueMax > data.showValueMin then
            local range = data.maxValue - data.minValue
            local percentage = (shownValue - data.minValue) / range
            local shownRange = data.showValueMax - data.showValueMin
            shownValue = data.showValueMin + percentage * shownRange
            shownValue = string.format("%d", shownValue)
        end
        if data.valueTextFormatter then
            formattedValueString = zo_strformat(data.valueTextFormatter, shownValue)
            min = zo_strformat(data.valueTextFormatter, min)
            max = zo_strformat(data.valueTextFormatter, max)
        else
            formattedValueString = shownValue
        end
    end
    return formattedValueString, min, max
end
local function SetSettingFromControl(control, value)
    local data = control.data
    if data.SetSettingOverride then
        data.SetSettingOverride(control, value)
    end
    SetSetting(data.system, data.settingId, tostring(value))
end
local function IsGamepadOption(control)
    return control.optionsManager:IsGamepadOptions()
end
SAVE_CURRENT_VALUES         = 1
DONT_SAVE_CURRENT_VALUES    = 2
local ENABLED_STATE = 1
local DISABLED_STATE = 0.5
local function SetupColorOptionActivated(control, activated)
    control:GetNamedChild("Color"):SetAlpha(activated and ENABLED_STATE or DISABLED_STATE)
    control:GetNamedChild("Border"):SetAlpha(activated and ENABLED_STATE or DISABLED_STATE)
end
local activateOptionControl =
{
    [OPTIONS_DROPDOWN] =    function(control)
                                local dropdown = control:GetNamedChild("Dropdown")
                                ZO_ComboBox_Enable(dropdown)
                                dropdown:GetNamedChild("SelectedItemText"):SetAlpha(ENABLED_STATE)
                                dropdown:GetNamedChild("BG"):SetAlpha(ENABLED_STATE)
                                dropdown:GetNamedChild("OpenDropdown"):SetAlpha(ENABLED_STATE)
                            end,
    [OPTIONS_CHECKBOX] =    function(control)
                                local boxControl = control:GetNamedChild("Checkbox")
                                ZO_CheckButton_Enable(boxControl)
                                boxControl:SetAlpha(ENABLED_STATE)
                            end,
    [OPTIONS_SLIDER] =      function(control)
                                control:GetNamedChild("Slider"):SetEnabled(true)
                                control:GetNamedChild("SliderBackdrop"):SetAlpha(ENABLED_STATE)
                                control:GetNamedChild("ValueLabel"):SetAlpha(ENABLED_STATE)
                            end,
    [OPTIONS_COLOR] =       function(control)
                                SetupColorOptionActivated(control, true)
                            end,
    [OPTIONS_CHAT_COLOR] =  function(control)
                                SetupColorOptionActivated(control, true)
                            end,
    [OPTIONS_INVOKE_CALLBACK] = function(control)
                                    control:GetNamedChild("Button"):SetEnabled(true)
                                end,
}
local deactivateOptionControl =
{
    [OPTIONS_DROPDOWN] =    function(control)
                                local dropdown = control:GetNamedChild("Dropdown")
                                ZO_ComboBox_Disable(dropdown)
                                dropdown:GetNamedChild("SelectedItemText"):SetAlpha(DISABLED_STATE)
                                dropdown:GetNamedChild("BG"):SetAlpha(DISABLED_STATE)
                                dropdown:GetNamedChild("OpenDropdown"):SetAlpha(DISABLED_STATE)
                            end,
    [OPTIONS_CHECKBOX] =    function(control)
                                local boxControl = control:GetNamedChild("Checkbox")
                                ZO_CheckButton_Disable(boxControl)
                                boxControl:SetAlpha(DISABLED_STATE)
                            end,
    [OPTIONS_SLIDER] =      function(control)
                                control:GetNamedChild("Slider"):SetEnabled(false)
                                control:GetNamedChild("SliderBackdrop"):SetAlpha(DISABLED_STATE)
                                control:GetNamedChild("ValueLabel"):SetAlpha(DISABLED_STATE)
                            end,
    [OPTIONS_COLOR] =       function(control)
                                SetupColorOptionActivated(control, false)
                            end,
    [OPTIONS_CHAT_COLOR] =  function(control)
                                SetupColorOptionActivated(control, false)
                            end,
    [OPTIONS_INVOKE_CALLBACK] = function(control)
                                    control:GetNamedChild("Button"):SetEnabled(false)
                                end,
}
local function UpdateOptionControlState(control, updateTable, stateType)
    local controlType = GetControlType(control)
    local updateFn = updateTable[controlType]
    if updateFn then
        updateFn(control)
    end
    local nameControl = control:GetNamedChild("Name")
    local boxControl = control:GetNamedChild("Checkbox")
    if nameControl then
        if stateType == ENABLED_STATE then
            nameControl:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
        else
            nameControl:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
        end
    end
    if boxControl then
        -- the checkbox could be in the off state even though we now want it enabled
        -- so we have to override that color with the appropriate color
        local currentState = boxControl:GetState()
        if currentState ~= BSTATE_PRESSED and stateType == ENABLED_STATE then
            nameControl:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
        end
    end
    control.state = stateType
end
local function CheckEnableApplyButton(control, oldValue, currentValue)
    if oldValue ~= currentValue then
        control.optionsManager:EnableApplyButton()
    end
end
--ZO_Options_SetOptionActive/Inactive are keyboard only functions. The gamepad manages active state through
--the gamepadIsEnabledCallback. Using ZO_Options_SetOptionActive/Inactive with gamepad controls will set them
--to the keyboard colors and also doesn't handle the parametric list's selected state's impact.
    UpdateOptionControlState(control, activateOptionControl, ENABLED_STATE)
end
    UpdateOptionControlState(control, deactivateOptionControl, DISABLED_STATE)
end
    if predicate() then
    else
    end
end
    UpdateOptionControlState(control, active and activateOptionControl or deactivateOptionControl, active and ENABLED_STATE or DISABLED_STATE)
end
    if IsGamepadOption(control) then
        return control.data.enabled
    else
        return control.state == ENABLED_STATE
    end
end
end
end
    local warningControl = control:GetNamedChild("WarningIcon")
    warningControl:SetHidden(hidden)
end
    local hideWarning = text == nil or text == ""
    if not hideWarning then
        local warningControl = control:GetNamedChild("WarningIcon")
        warningControl.data.tooltipText = text
    end
end
function ZO_Options_SetWarningTexture(control, texturePath)
    local shouldHideWarning = texturePath == nil or texturePath == ""
    if not shouldHideWarning then
        local warningControl = control:GetNamedChild("WarningIcon")
        warningControl:SetTexture(texturePath)
    end
    ZO_Options_ShowOrHideAssociatedWarning(control, shouldHideWarning)
end
local function GetValidIndexFromCurrentChoice(valid, currentChoice)
    for i = 1, #valid do
        if valid[i] == currentChoice then
            return i
        end
    end
    return -1
end
local function OptionsScrollListSelectionChanged(selectedData, oldData, reselectingDuringRebuild)
    if oldData ~= nil and reselectingDuringRebuild ~= true then
        local control = selectedData.parentControl
        local oldValue = ZO_Options_GetSettingFromControl(control)
        local value = selectedData.value
        SetSettingFromControl(control, value)
        local optionsData = control.data
        if optionsData.mustPushApply then
            CheckEnableApplyButton(control, oldValue, value)
        end
        local callback = optionsData.scrollListChangedCallback
        if callback then
            callback(selectedData, oldData)
        end
        local optionsManager = control.optionsManager
        if optionsManager and optionsManager:IsGamepadOptions() and optionsManager:IsShowing() then
            SCREEN_NARRATION_MANAGER:QueueParametricListEntry(optionsManager:GetCurrentList())
        end
        if optionsData.gamepadHasEnabledDependencies then
            SYSTEMS:GetGamepadObject("options"):OnOptionWithDependenciesChanged()
        end
    end
end
local function GetValueString(data)
    return type(data) == "function" and data() or GetString(data)
end
local function GetHorizontalScrollListOptionText(control, index)
    local data = control.data
    local validValues = data.valid
    if type(validValues) == "function" then
        validValues = data.valid()
    end
    --gamepadValidStringOverrides exists in case the enum used here has PC specific localization. If so, we create the strings in ClientGamepadStrings.xml and add them
    --to the data table's gamepadValidStringOverrides in the same order.
    local hasGamepadStrings = control.optionsManager:IsGamepadOptions() and (data.gamepadValidStringOverrides ~= nil)
    if hasGamepadStrings then
        return GetString(data.gamepadValidStringOverrides[index])
    elseif data.itemText then
        return data.itemText[index]
    elseif data.valueStringPrefix then
        return GetString(data.valueStringPrefix, validValues[index])
    elseif data.valueStrings then
        local valueStrings = data.valueStrings
        if type(valueStrings) == "function" then
            valueStrings = data.valueStrings()
        end
        return GetValueString(valueStrings[index])
    else
        return validValues[index]
    end
end
local DEFAULT_SLIDER_VALUE_STEP_PERCENT = 6.66
local updateControlFromSettings =
{
    [OPTIONS_DROPDOWN] = function(control)
                                local data = control.data
                                local currentSetting = ZO_Options_GetSettingFromControl(control)
                                local currentChoice = tonumber(currentSetting) or currentSetting
                                local isValidNumber = type(currentChoice) == "number"
                               local validValues = data.valid
                                if type(validValues) == "function" then
                                    validValues = data.valid()
                                    -- When valid is a function it can change the number of items in the dropdown so setup the dropdown again.
                                    ZO_Options_SetupDropdown(control)
                                end
                                local dropdownControl = control:GetNamedChild("Dropdown")
                                local dropdown = ZO_ComboBox_ObjectFromContainer(dropdownControl)
                                if data.itemText then
                                    dropdown:SetSelectedItemText(data.itemText[GetValidIndexFromCurrentChoice(validValues, currentChoice)])
                                elseif data.valueStringPrefix and isValidNumber then
                                    dropdown:SetSelectedItemText(GetString(data.valueStringPrefix, currentChoice))
                                elseif data.valueStrings then
                                    local valueStrings = data.valueStrings
                                    if type(valueStrings) == "function" then
                                        valueStrings = data.valueStrings()
                                    end
                                    dropdown:SetSelectedItemText(GetValueString(valueStrings[GetValidIndexFromCurrentChoice(validValues, currentChoice)]))
                                else
                                    dropdown:SetSelectedItemText(tostring(currentChoice))
                                end
                                return currentChoice
                            end,
    [OPTIONS_HORIZONTAL_SCROLL_LIST] = function(control)
                            local data = control.data
                            local currentSetting = ZO_Options_GetSettingFromControl(control)
                            local currentChoice = tonumber(currentSetting) or currentSetting
                            local validValues = data.valid
                            if type(validValues) == "function" then
                                validValues = data.valid()
                            end
                            local index = 0
                            for i = 1, #validValues do
                                if currentChoice == validValues[i] then
                                    index = i
                                    break
                                end
                            end
                            local targetChild = control.horizontalListObject:GetCenterControl()
                            if control.data.enabled == false then
                                targetChild:SetText(GetString(SI_CHECK_BUTTON_DISABLED))
                                targetChild:SetColor(ZO_GAMEPAD_DISABLED_UNSELECTED_COLOR:UnpackRGBA())
                            else
                                local text = GetHorizontalScrollListOptionText(control, index)
                                targetChild:SetText(text)
                            end
                            local ALLOW_EVEN_IF_DISABLED = true
                            local NO_ANIMATION = true
                            control.horizontalListObject:SetSelectedDataIndex(index, ALLOW_EVEN_IF_DISABLED, NO_ANIMATION)
                            control.horizontalListObject:SetOnSelectedDataChangedCallback(OptionsScrollListSelectionChanged)
                            return currentChoice
                        end,
    [OPTIONS_CHECKBOX] = function(control)
                                local currentChoice = ZO_Options_GetSettingFromControl(control)
                                local checkBoxControl = control:GetNamedChild("Checkbox")
                                ZO_CheckButton_SetCheckState(checkBoxControl, currentChoice)
                                local mouseOverControl = WINDOW_MANAGER:GetMouseOverControl()
                                local nameControl = control:GetNamedChild("Name")
                                local enabled = control.data.enabled
                                if type(enabled) == "function" then
                                    enabled = control.data.enabled()
                                end
                                if not IsGamepadOption(control) then
                                    if enabled == false then
                                        ZO_CheckButton_Disable(checkBoxControl)
                                    else
                                        ZO_CheckButton_Enable(checkBoxControl)
                                    end
                                    if currentChoice then
                                        nameControl:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
                                    elseif mouseOverControl == checkBoxControl or mouseOverControl == control then
                                        nameControl:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
                                    else
                                        nameControl:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
                                    end
                                else
                                    if enabled == false then
                                        checkBoxControl:SetText(GetString(SI_CHECK_BUTTON_DISABLED))
                                        ZO_CheckButton_Disable(checkBoxControl)
                                    else
                                        checkBoxControl.checkedText = GetString(SI_CHECK_BUTTON_ON)
                                        checkBoxControl.uncheckedText = GetString(SI_CHECK_BUTTON_OFF)
                                        ZO_CheckButton_Enable(checkBoxControl)
                                    end
                                    local onLabel = control:GetNamedChild("On")
                                    local offLabel = control:GetNamedChild("Off")
                                    onLabel:SetColor((currentChoice and ZO_SELECTED_TEXT or ZO_DISABLED_TEXT):UnpackRGBA())
                                    offLabel:SetColor((currentChoice and ZO_DISABLED_TEXT or ZO_SELECTED_TEXT):UnpackRGBA())
                                    local selected = checkBoxControl.selected
                                    checkBoxControl:SetHidden(selected)
                                    onLabel:SetHidden(not selected)
                                    offLabel:SetHidden(not selected)
                                end
                                return currentChoice
                            end,
    [OPTIONS_SLIDER] =   function(control)
                                local data = control.data
                                local currentChoice = tonumber(ZO_Options_GetSettingFromControl(control))
                                
                                local slider = control:GetNamedChild("Slider")
                                --We remove the OnValueChanged handler while we set up the slider because
                                --SetMinMax, SetValue, and SetValueStep can all potentially fire the OnValueChanged event
                                --which fires a callback that will actually set whatever setting the slider is attached too.
                                slider:SetHandler("OnValueChanged", nil)
                                slider:SetMinMax(data.minValue, data.maxValue)
                                if IsGamepadOption(control) then
                                    local stepValue = (data.maxValue - data.minValue) * ((data.gamepadValueStepPercent or DEFAULT_SLIDER_VALUE_STEP_PERCENT) / 100)
                                   slider:SetValueStep(stepValue)
                                end
                                slider:SetValue(currentChoice)
                                slider:SetHandler("OnValueChanged", ZO_Options_SliderOnValueChanged)
                                local valueLabelControl = control:GetNamedChild("ValueLabel")
                                if data.showValue and valueLabelControl then
                                    local formattedValueString, min, max = ZO_Options_GetFormattedSliderValues(data, currentChoice)
                                    valueLabelControl:SetText(formattedValueString)
                                end
                                return currentChoice
                            end,
    [OPTIONS_COLOR] =       function(control)
                                local currentChoice = ZO_Options_GetSettingFromControl(control)
                                local color = ZO_ColorDef:New(currentChoice)
                                if color then
                                    control:GetNamedChild("Color"):SetColor(color:UnpackRGB())
                                end
                                --Gamepad has to setup controls out of a pool so it needs to update enabled state all the time instead
                                --of just once like keyboard. This should probably be done as a call to setting the activated state in
                                --the gamepad code instead as part of the option update in gamepad only.
                                if IsGamepadOption(control) then
                                    SetupColorOptionActivated(control, ZO_Options_IsOptionActive(control))
                                end
                            end,
    [OPTIONS_CHAT_COLOR] =  function(control)
                                local data = control.data
                                local currentRed, currentGreen, currentBlue = GetChatCategoryColor(data.chatChannelCategory)
                                control:GetNamedChild("Color"):SetColor(currentRed, currentGreen, currentBlue)
                                --Gamepad has to setup controls out of a pool so it needs to update enabled state all the time instead
                                --of just once like keyboard. This should probably be done as a call to setting the activated state in
                                --the gamepad code instead as part of the option update in gamepad only.
                                if IsGamepadOption(control) then
                                    SetupColorOptionActivated(control, ZO_Options_IsOptionActive(control))
                                end
                            end,
}
    local data = control.data
    local controlType = GetControlType(control)
    local updateFn = updateControlFromSettings[controlType]
    local currentChoice
    -- Determine the activation state from control's enabled setting before getting the current save state.
    -- The functionality for managing state is only used on Keyboard and does not have defined behavour on Gamepad
    if not IsGamepadOption(control) then
        if control.data.enabled ~= nil then
            local enabled = control.data.enabled
            if type(enabled) == "function" then
                enabled = control.data.enabled()
            end
            ZO_SetControlActiveFromPredicate(control, function() return enabled end)
        end
    end
    -- If the control is inactive, activate it temporarily
    local saveCurrentState = control.state
    if saveCurrentState == DISABLED_STATE and not IsGamepadOption(control) then
    end
    local previousChoice = data.currentChoice
    if updateFn then
        currentChoice = updateFn(control)
    end
    -- Restore the control's state
    if saveCurrentState == DISABLED_STATE and not IsGamepadOption(control) then
    end
    -- Fire events
    if currentChoice ~= previousChoice then
        data.currentChoice = currentChoice
        if data.events and data.events[currentChoice] then
            CALLBACK_MANAGER:FireCallbacks(data.events[currentChoice])
        end
    end
    return currentChoice
end
-- Change the actual settings as they are changed...they are reverted if the player chooses not to save
local function OptionsDropdown_SelectChoice(control, index)
    local data = control.data
    local oldValueString = ZO_Options_GetSettingFromControl(control)
    local validValues = data.valid
    if type(validValues) == "function" then
        validValues = data.valid()
    end
    local value = validValues[index]
    local valueString = tostring(value)
    SetSettingFromControl(control, valueString)
    if data.mustPushApply then
        -- If this control needs to be applied, update the dropdown with the local value, because the setting hasn't been changed yet.
        local dropdownControl = control:GetNamedChild("Dropdown")
        local dropdown = ZO_ComboBox_ObjectFromContainer(dropdownControl)
        if data.itemText then
            dropdown:SetSelectedItemText(data.itemText[index])
        elseif data.valueStringPrefix then
            dropdown:SetSelectedItemText(GetString(data.valueStringPrefix, value))
        elseif data.valueStrings then
            local valueStrings = data.valueStrings
            if type(valueStrings) == "function" then
                valueStrings = data.valueStrings()
            end
            dropdown:SetSelectedItemText(GetValueString(valueStrings[index]))
        else
            dropdown:SetSelectedItemText(valueString)
        end
        if data.events and data.events[value] then
            CALLBACK_MANAGER:FireCallbacks(data.events[value])
        end
        CheckEnableApplyButton(control, oldValueString, valueString)
    else
    end
    if data.mustReloadSettings then
        KEYBOARD_OPTIONS:UpdateCurrentPanelOptions(DONT_SAVE_CURRENT_VALUES)
    end
end
local function OptionsCheckBox_SelectChoice(control, boxIsChecked)
    local data = control.data
    local oldValue = ZO_Options_GetSettingFromControl(control)
    local value = boxIsChecked
    if data.mustPushApply then
        local checkBoxControl = control:GetNamedChild("Checkbox")
        ZO_CheckButton_SetCheckState(checkBoxControl, boxIsChecked)
        local mouseOverControl = WINDOW_MANAGER:GetMouseOverControl()
        local nameControl = control:GetNamedChild("Name")
        
        if not IsGamepadOption(control) then
            if boxIsChecked then
                nameControl:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
            elseif mouseOverControl == checkBoxControl or mouseOverControl == control then
                nameControl:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
            else
                nameControl:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
            end
        end
        if data.events and data.events[boxIsChecked] then
            CALLBACK_MANAGER:FireCallbacks(data.events[boxIsChecked])
        end
        CheckEnableApplyButton(control, oldValue, value)
    else
    end
    local optionsManager = control.optionsManager
    if optionsManager and optionsManager:IsGamepadOptions() and optionsManager:IsShowing() then
        SCREEN_NARRATION_MANAGER:QueueParametricListEntry(optionsManager:GetCurrentList())
    end
    
    if data.mustReloadSettings then
        KEYBOARD_OPTIONS:UpdateCurrentPanelOptions(DONT_SAVE_CURRENT_VALUES)
    end
end
local function GetSliderOptionValues(control, value)
    local data = control.data
    local oldValueString = ZO_Options_GetSettingFromControl(control)
    local valueFormat = data.valueFormat or "%d"
    local formattedValueString = string.format(valueFormat, value)
    local formattedValue = tonumber(formattedValueString)
    return oldValueString, formattedValueString, formattedValue
end
-- NOTE: Sliders do not support value-based events
local function OptionsSlider_SelectChoice(control, value, eventReason)
    local data = control.data
    local oldValueString, formattedValueString, formattedValue = GetSliderOptionValues(control, value)
    SetSettingFromControl(control, formattedValueString)
    if data.mustPushApply then
        control:GetNamedChild("Slider"):SetValue(formattedValue)
        CheckEnableApplyButton(control, oldValueString, formattedValueString)
    else
    end
    local valueLabelControl = control:GetNamedChild("ValueLabel")
    if data.showValue and valueLabelControl then
        local formattedShowValueString, min, max = ZO_Options_GetFormattedSliderValues(data, formattedValue)
        valueLabelControl:SetText(formattedShowValueString)
    end
    local optionsManager = control.optionsManager
    if optionsManager and optionsManager:IsGamepadOptions() and optionsManager:IsShowing() then
        SCREEN_NARRATION_MANAGER:QueueParametricListEntry(optionsManager:GetCurrentList())
    end
    if data.mustReloadSettings then
        KEYBOARD_OPTIONS:UpdateCurrentPanelOptions(DONT_SAVE_CURRENT_VALUES)
    end
end
    local data = control.data
    if data.onReleasedHandler then
        local oldValueString, formattedValueString, formattedValue = GetSliderOptionValues(control, value)
        if oldValueString ~= formattedValueString then
            data.onReleasedHandler(control, formattedValueString)
        end
    end
end
function ZO_Options_SliderOnValueChanged(sliderControl, value, eventReason)
    OptionsSlider_SelectChoice(sliderControl:GetParent(), value, eventReason)
end
function ZO_Options_SliderOnSliderReleased(sliderControl, value)
    OptionsSlider_OnReleased(sliderControl:GetParent(), value)
end
function ZO_Options_SetupSlider(control, selected)
    local data = control.data
    -- Sliders need a min/max value so verify that they are set here
    data.minValue = data.minValue or 0
    data.maxValue = data.maxValue or 1
    local slider = control:GetNamedChild("Slider")
    if selected ~= nil then
        slider:SetActive(selected and control.data.enabled ~= false)    --TODO: Added Gamepad Slider Disabled state colors, needs design
    end
    data.events = nil -- Sliders don't support events
    if data.defaultMarker and not IsGamepadOption(control) then
        local defaultMarkerControl = CreateControlFromVirtual("$(parent)DefaultMarker", slider, "ZO_Options_DefaultMarker")
        local offsetX = zo_clampedPercentBetween(data.minValue, data.maxValue, data.defaultMarker) * slider:GetWidth()
        defaultMarkerControl:SetAnchor(TOP, slider, LEFT, offsetX + .25, 6)
        defaultMarkerControl:SetHandler("OnClicked", function(self, button)
            PlaySound(SOUNDS.SINGLE_SETTING_RESET_TO_DEFAULT)
            slider:SetValue(data.defaultMarker)
        end)
    end
end
    local data = control.data
    local dropdownControl = control:GetNamedChild("Dropdown")
    local dropdown = ZO_ComboBox_ObjectFromContainer(dropdownControl)
    dropdown:ClearItems()
    dropdown.m_sortOrder = false        -- Add the valid items in the order they are added in the xml file (don't sort them)
    local validValues = data.valid
    if type(validValues) == "function" then
        validValues = data.valid()
    end
    local optionString, optionLine
    for index = 1, #validValues do
        if data.itemText then
            optionString = data.itemText[index]
        elseif data.valueStringPrefix then
            optionString = GetString(data.valueStringPrefix, validValues[index])
        elseif data.valueStrings then
            local valueStrings = data.valueStrings
            if type(valueStrings) == "function" then
                valueStrings = data.valueStrings()
            end
            optionString = GetValueString(valueStrings[index])
        else
            optionString = tostring(validValues[index])
        end
        optionLine = dropdown:CreateItemEntry(optionString, function() OptionsDropdown_SelectChoice(control, index) end)
        dropdown:AddItem(optionLine)
    end
end
    local callback = control.data.callback
    if callback then
        callback()
    end
end
function ZO_Options_SetupScrollList(control, selected)
    control.horizontalListObject:Clear()
    local validValues = control.data.valid
    if type(validValues) == "function" then
        validValues = control.data.valid()
    end
    for i, validOption in ipairs(validValues) do
        local entryText = GetHorizontalScrollListOptionText(control, i)
        local entryData =
        {
            text = entryText,
            value = validOption,
            parentControl = control
        }
        control.horizontalListObject:AddEntry(entryData)
    end
    control.horizontalListObject:SetOnSelectedDataChangedCallback(nil)  -- don't set the callback til after we update the menu to the right setting
    control.horizontalListObject:Commit()
    control.horizontalListObject:SetActive(selected and control.data.enabled ~= false)  --TODO: Added Gamepad Slider Disabled state colors, needs design
end
local function CheckBoxToggleFunction(checkBoxControl, boxIsChecked)
    local control = checkBoxControl:GetParent()
    OptionsCheckBox_SelectChoice(control, boxIsChecked)
end
    local checkBoxControl = control:GetNamedChild("Checkbox")
end
    local nameControl = control:GetNamedChild("Name")
    local checkBoxControl = control:GetNamedChild("Checkbox")
    if checkBoxControl and nameControl then
        local currentState = checkBoxControl:GetState()
        if currentState == BSTATE_NORMAL then
            nameControl:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
        end
        checkBoxControl:SetPressedFontColor(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_HIGHLIGHT))
        checkBoxControl:SetNormalFontColor(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_HIGHLIGHT))
    end
end
    local nameControl = control:GetNamedChild("Name")
    local checkBoxControl = control:GetNamedChild("Checkbox")
    if checkBoxControl and nameControl then
        local currentState = checkBoxControl:GetState()
        if currentState == BSTATE_NORMAL then
            nameControl:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
        end
        checkBoxControl:SetPressedFontColor(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_NORMAL))
        checkBoxControl:SetNormalFontColor(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_NORMAL))
    end
end
    local data = control.data
        local currentChoice = ZO_Options_GetSettingFromControl(control)
        local color = ZO_ColorDef:New(currentChoice)
        if color then
            local function OnColorSet(r, g, b)
                control:GetNamedChild("Color"):SetColor(r, g, b)
                local ARGBHexadecimal = ZO_ColorDef.FloatsToHex(r, g, b, 1)
                SetSetting(data.system, data.settingId, ARGBHexadecimal)
                local optionsManager = control.optionsManager
                if optionsManager and optionsManager:IsGamepadOptions() and optionsManager:IsShowing() then
                    SCREEN_NARRATION_MANAGER:QueueParametricListEntry(optionsManager:GetCurrentList())
                end
            end
            SYSTEMS:GetObject("colorPicker"):Show(OnColorSet, color:UnpackRGB())
        end
    end
end
do
    local categoryChildren =
    {
        [CHAT_CATEGORY_MONSTER_SAY] = {CHAT_CATEGORY_MONSTER_YELL, CHAT_CATEGORY_MONSTER_WHISPER, CHAT_CATEGORY_MONSTER_EMOTE}
    }
        if ZO_Options_IsOptionActive(control) then
            local data = control.data
            if data then
                local function OnColorSet(r, g, b)
                    control:GetNamedChild("Color"):SetColor(r, g, b)
                    SetChatCategoryColor(data.chatChannelCategory, r, g, b)
                    local children = categoryChildren[data.chatChannelCategory]
                    if children then
                        for i = 1, #children do
                            SetChatCategoryColor(children[i], r, g, b)
                        end
                    end
                    local optionsManager = control.optionsManager
                    if optionsManager and optionsManager:IsGamepadOptions() and optionsManager:IsShowing() then
                        SCREEN_NARRATION_MANAGER:QueueParametricListEntry(optionsManager:GetCurrentList())
                    end
                end
                local currentRed, currentGreen, currentBlue = GetChatCategoryColor(data.chatChannelCategory)
                SYSTEMS:GetObject("colorPicker"):Show(OnColorSet, currentRed, currentGreen, currentBlue)
            end
        end
    end
end
function ZO_Options_ColorOnMouseEnter(colorControl)
    local textureControl = colorControl:GetNamedChild("Color")
    local sharedHighlight = SYSTEMS:GetObject("options"):GetColorOptionHighlight()
    if sharedHighlight then
        sharedHighlight:ClearAnchors()
        sharedHighlight:SetAnchor(CENTER, textureControl, CENTER)
        sharedHighlight:SetHidden(false)
    end
    ZO_Options_OnMouseEnter(colorControl)
end
function ZO_Options_ColorOnMouseExit(colorControl)
    local sharedHighlight = SYSTEMS:GetObject("options"):GetColorOptionHighlight()
    if sharedHighlight then
        sharedHighlight:SetHidden(true)
    end
    ZO_Options_OnMouseExit(colorControl)
end
function ZO_Options_ColorOnMouseUp(control, upInside)
    if upInside then
    end
end
    if upInside then
    end
end
    if IsGamepadOption(control) then
        control:GetNamedChild("Name"):SetText(text)
    else
        local button = control:GetNamedChild("Button")
        button:SetText(text)
        button:SetHandler("OnClicked", function()
            control.data.callback()
        end)
    end
end
    local data = control.data
    local tooltipText = data.tooltipText
    if tooltipText ~= nil then
        local tooltipTextType = type(tooltipText)
        if tooltipTextType == "number" then
            tooltipText = GetString(tooltipText)
        elseif tooltipTextType == "function" then
            tooltipText = tooltipText()
        end
        if tooltipText == "" then
            return
        end
        InitializeTooltip(InformationTooltip, control, BOTTOMLEFT, 0, -2, TOPLEFT)
        SetTooltipText(InformationTooltip, tooltipText)
    end
end
    ClearTooltip(InformationTooltip)
end
    local data = control.data
    if data and data.onShow then
        data.onShow(control)
    end
end