-
Notifications
You must be signed in to change notification settings - Fork 7
/
EditBooleanVariableDialog.go
125 lines (111 loc) · 3.61 KB
/
EditBooleanVariableDialog.go
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
package archives
import (
"github.com/inkyblackness/imgui-go/v3"
"github.com/inkyblackness/hacked/editor/values"
"github.com/inkyblackness/hacked/ss1/content/archive"
"github.com/inkyblackness/hacked/ss1/edit"
"github.com/inkyblackness/hacked/ui/gui"
)
type editBooleanVariableDialog struct {
machine gui.ModalStateMachine
view *View
service *edit.GameStateService
index int
varOverride bool
info archive.GameVariableInfo
opened bool
}
func (dialog *editBooleanVariableDialog) Render() {
if !dialog.opened {
dialog.opened = true
dialog.varOverride = dialog.service.BooleanVariableOverride(dialog.index)
dialog.info = dialog.service.BooleanVariable(dialog.index)
imgui.OpenPopup("Edit boolean variable")
}
imgui.SetNextWindowSize(imgui.Vec2{X: 600, Y: 0}.Times(dialog.view.guiScale))
if imgui.BeginPopupModalV("Edit boolean variable", nil,
imgui.WindowFlagsNoSavedSettings|imgui.WindowFlagsAlwaysAutoResize) {
dialog.renderControls()
imgui.Separator()
if imgui.Button("OK") {
dialog.applyChanges()
dialog.close()
}
imgui.SameLine()
if imgui.Button("Cancel") {
dialog.close()
}
imgui.EndPopup()
} else {
dialog.machine.SetState(nil)
}
}
func (dialog *editBooleanVariableDialog) applyChanges() {
if dialog.varOverride {
_ = dialog.service.SetBooleanVariable(dialog.index, dialog.info)
} else {
_ = dialog.service.DefaultBooleanVariable(dialog.index)
}
}
func (dialog *editBooleanVariableDialog) close() {
dialog.machine.SetState(nil)
imgui.CloseCurrentPopup()
}
func (dialog *editBooleanVariableDialog) renderControls() {
imgui.PushItemWidth(-150 * dialog.view.guiScale)
values.RenderUnifiedCheckboxCombo(false, "Override", values.UnifierFor(dialog.varOverride), func(newValue bool) {
dialog.varOverride = newValue
})
textFlags := imgui.InputTextFlagsNoUndoRedo
if !dialog.varOverride {
textFlags |= imgui.InputTextFlagsReadOnly
}
imgui.InputTextV("Name", &dialog.info.Name, textFlags, nil)
imgui.InputTextMultilineV("Description", &dialog.info.Description, imgui.Vec2{X: 0, Y: 100 * dialog.view.guiScale},
textFlags, nil)
imgui.Separator()
defaultValues := map[int]string{0: "False", 1: "True"}
valueLabels := map[bool]string{false: "Default", true: "Special"}
hasSpecialValues := dialog.info.ValueNames != nil
if dialog.varOverride {
if imgui.BeginCombo("Values", valueLabels[hasSpecialValues]) {
if imgui.SelectableV(valueLabels[false], !hasSpecialValues, 0, imgui.Vec2{}) {
dialog.info.ValueNames = nil
}
if imgui.SelectableV(valueLabels[true], hasSpecialValues, 0, imgui.Vec2{}) {
dialog.info.ValueNames = map[int16]string{0: defaultValues[0], 1: defaultValues[1]}
}
imgui.EndCombo()
}
} else {
imgui.LabelText("Values", valueLabels[hasSpecialValues])
}
hasSpecialValues = dialog.info.ValueNames != nil
if hasSpecialValues {
for i := int16(0); i < 2; i++ {
text := dialog.info.ValueNames[i]
if imgui.InputTextV(defaultValues[int(i)], &text, textFlags, nil) {
dialog.info.ValueNames[i] = text
}
}
} else {
imgui.LabelText(defaultValues[0], defaultValues[0])
imgui.LabelText(defaultValues[1], defaultValues[1])
}
initUnifier := values.UnifierFor(dialog.info.ResetValueInt())
values.RenderUnifiedCombo(dialog.info.Hardcoded || !dialog.varOverride, "Reset Value", initUnifier,
func(u values.Unifier) int { return int(u.Unified().(int16)) },
func(value int) string {
name, found := dialog.info.ValueNames[int16(value)]
if found {
return name
}
return defaultValues[value]
},
2,
func(newValue int) {
value16 := int16(newValue)
dialog.info.InitValue = &value16
})
imgui.PopItemWidth()
}