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], ¶m.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], ¶m.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], ¶m.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], ¶m.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 }