1 /*
2     Copyright © 2020, Inochi2D Project
3     Distributed under the 2-Clause BSD License, see LICENSE file.
4     
5     Authors: Luna Nielsen
6 */
7 module creator.windows.paramprop;
8 import creator.windows;
9 import creator.widgets;
10 import creator.core;
11 import creator.actions;
12 import creator.ext;
13 import creator;
14 import std.string;
15 import creator.utils.link;
16 import i18n;
17 import inochi2d;
18 
19 class ParamPropWindow : Window {
20 private:
21     Parameter param;
22     string paramName;
23     vec2 min;
24     vec2 max;
25 
26     bool isValidName() {
27         Parameter fparam = (cast(ExPuppet)incActivePuppet()).findParameter(paramName);
28         return fparam is null || fparam.uuid == param.uuid;
29     }
30 
31 protected:
32     override
33     void onBeginUpdate() {
34         igSetNextWindowSize(ImVec2(384, 192), ImGuiCond.Appearing);
35         igSetNextWindowSizeConstraints(ImVec2(384, 192), ImVec2(float.max, float.max));
36         super.onBeginUpdate();
37     }
38 
39     override
40     void onUpdate() {
41         igPushID(cast(void*)param);
42             if (igBeginChild("###MainSettings", ImVec2(0, -28))) {
43                 incText(_("Parameter Name"));
44                 igIndent();
45                     incInputText("Name", paramName);
46                 igUnindent();
47 
48                 incText(_("Parameter Constraints"));
49                 igIndent();
50                     igSetNextItemWidth(256);
51 
52                     if (param.isVec2) incText("X");
53                     if (param.isVec2) igIndent();
54                         
55                         // X MINIMUM
56                         igSetNextItemWidth(64);
57                         igPushID(0);
58                             incDragFloat("adj_x_min", &min.vector[0], 1, -float.max, max.x-1, "%.2f", ImGuiSliderFlags.NoRoundToFormat);
59                         igPopID();
60 
61                         igSameLine(0, 4);
62 
63                         // X MAXIUMUM
64                         igSetNextItemWidth(64);
65                         igPushID(1);
66                             incDragFloat("adj_x_max", &max.vector[0], 1, min.x+1, float.max, "%.2f", ImGuiSliderFlags.NoRoundToFormat);
67                         igPopID();
68                     if (param.isVec2) igUnindent();
69                         
70                     if (param.isVec2) {
71 
72                         incText("Y");
73 
74                         igIndent();
75 
76                             // Y MINIMUM
77                             igSetNextItemWidth(64);
78                             igPushID(2);
79                                 incDragFloat("adj_y_min", &min.vector[1], 1, -float.max, max.y-1, "%.2f", ImGuiSliderFlags.NoRoundToFormat);
80                             igPopID();
81 
82                             igSameLine(0, 4);
83 
84                             // Y Maximum
85                             igSetNextItemWidth(64);
86                             igPushID(3);
87                                 incDragFloat("adj_y_max", &max.vector[1], 1, min.y+1, float.max, "%.2f", ImGuiSliderFlags.NoRoundToFormat);
88                             igPopID();
89                         igUnindent();
90                     }
91                 igUnindent();
92             }
93             igEndChild();
94 
95             if (igBeginChild("###SettingsBtns", ImVec2(0, 0))) {
96                 incDummy(ImVec2(-64, 0));
97                 igSameLine(0, 0);
98 
99                 // Settings are autosaved, but in case the user
100                 // feels more safe with a save button then we have
101                 // it here.
102                 if (igButton(__("Save"), ImVec2(64, 24))) {
103                     
104                     if (!isValidName) {
105                         incDialog(__("Error"), _("Name is already taken"));
106                     } else {
107                         this.close();
108                     }
109                 }
110             }
111             igEndChild();
112 
113         igPopID();
114     }
115 
116     override
117     void onClose() {
118         param.name = paramName;
119         param.makeIndexable();
120 
121         param.min = min;
122         param.max = max;
123         if (min.x != param.min.x) incActionPush(new ParameterValueChangeAction!float("min X", param, incGetDragFloatInitialValue("adj_x_min"), param.min.vector[0], &param.min.vector[0]));
124         if (min.y != param.min.y) incActionPush(new ParameterValueChangeAction!float("min Y", param, incGetDragFloatInitialValue("adj_y_min"), param.min.vector[1], &param.min.vector[1]));
125         if (max.x != param.max.x) incActionPush(new ParameterValueChangeAction!float("max X", param, incGetDragFloatInitialValue("adj_x_max"), param.max.vector[0], &param.max.vector[0]));
126         if (max.y != param.max.y) incActionPush(new ParameterValueChangeAction!float("max Y", param, incGetDragFloatInitialValue("adj_y_max"), param.max.vector[1], &param.max.vector[1]));
127     }
128 
129 public:
130     this(ref Parameter param) {
131         this.param = param;
132 
133         paramName = param.name.dup;
134         min.vector = param.min.vector.dup;
135         max.vector = param.max.vector.dup;
136 
137         // Title for the parameter properties window.
138         super(_("Parameter Properties"));
139     }
140 }