Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modular UI #60

Draft
wants to merge 87 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
dd56ce0
Prototype of Modular UI
emyxiv Nov 27, 2022
7f1ecff
Fix potential crash from PopupSelect
emyxiv Nov 27, 2022
00dffd6
Implements Modular editor
emyxiv Nov 27, 2022
2e88e22
Recreated Gismo Operation buttons
emyxiv Nov 27, 2022
9155dde
New Modular container: WindowBar
emyxiv Nov 27, 2022
c27e01f
New Modular panels for GizmoOperations, ControlButtonsExtra, HandleEmpty
emyxiv Nov 27, 2022
ca2b95c
Modular items are added in the last container
emyxiv Nov 27, 2022
6f6c764
New Modular containers: WindowResizable, WindowAutoResize
emyxiv Nov 27, 2022
708bbfb
Clean up
emyxiv Nov 27, 2022
b91cde3
Context menu offers delete button
emyxiv Nov 27, 2022
29d694e
Clean up
emyxiv Nov 27, 2022
8f5a04b
Misc code style changes
emyxiv Nov 27, 2022
3f80982
Early commit with refactor as suggested by Fayti
emyxiv Nov 27, 2022
2f4daa1
Fix Available not populated
emyxiv Nov 27, 2022
0b2bec2
Add item kind on item search
emyxiv Nov 27, 2022
18e8d7d
Move Modular ItemTypes
emyxiv Nov 28, 2022
56186f6
Working prototype based on interfaces
emyxiv Nov 28, 2022
f7f4fa6
Clean up delegates leftovers
emyxiv Nov 28, 2022
7f80e38
Move Advanced in DrawAdvanced()
emyxiv Nov 28, 2022
0bc9cf3
Move ImportExport into DrawImportExport()
emyxiv Nov 28, 2022
f4c5004
Move Collapsible Header out of BoneTree.Draw()
emyxiv Nov 28, 2022
843c2f7
Move Workspace Bone Categories into Categories.DrawToggleListWithHint()
emyxiv Nov 28, 2022
9195807
Move Parenting checkbox to ControlButtons.DrawParentingCheckbox()
emyxiv Nov 28, 2022
5ca4941
Move Gaze Control into EditGaze.DrawWithHint()
emyxiv Nov 28, 2022
ac32a17
Move AnimationControl's Collapsible headers in Worskpace
emyxiv Nov 28, 2022
90fcf64
Change EditActor if/else Hide/Show for Toggle
emyxiv Nov 28, 2022
8b7954b
Move Gpose indicator into DrawGposeIndicator()
emyxiv Nov 28, 2022
077c6b3
Cosmetic change in Panels.cs
emyxiv Nov 28, 2022
c234dbe
Add GposeTextIndicator Panel
emyxiv Nov 28, 2022
b424dce
Add usings for cosmetic
emyxiv Nov 28, 2022
2b28281
Change SelectInfo() to zero parameters
emyxiv Nov 28, 2022
3cc2617
New panel: PoseSwitch
emyxiv Nov 28, 2022
9fe644b
Move Edit Actor button to EditActor.DrawButton()
emyxiv Nov 28, 2022
d3ce591
New panel: EditActorButton
emyxiv Nov 28, 2022
f3d2460
Remove parameters need for AnimationControls.Draw()
emyxiv Nov 28, 2022
3843ee6
New panel: AnimationControls
emyxiv Nov 28, 2022
286a443
Moved ActorList's Collapsible header to Workspace
emyxiv Nov 28, 2022
cbe5fc9
Add DrawExtraWindows() to be executed once in workspace
emyxiv Nov 28, 2022
caddf8e
Removed params for Workspace.TransformTable()
emyxiv Nov 28, 2022
c05ed99
Changed access to Workspace.TransformTable() to internal
emyxiv Nov 28, 2022
087f722
Changed access to internal for DrawAdvanced() and DrawImportExport()
emyxiv Nov 28, 2022
5314c7f
Added Panels: GazeControl, ParentingCheckbox...
emyxiv Nov 29, 2022
f84cb1d
Fix indentation
emyxiv Nov 29, 2022
a84db88
Implements Splitter namespace
emyxiv Nov 29, 2022
08c896d
Implements drag&drop modular UI config
emyxiv Nov 29, 2022
f78592f
Fix Splitters not overriding Draw()
emyxiv Nov 29, 2022
308a8aa
Add splitter: SameLine
emyxiv Nov 29, 2022
d8a0d94
Fix error in AnyCompatibleConstructors()
emyxiv Nov 29, 2022
2627e18
Set modular config panel height to 60% of screen height
emyxiv Nov 29, 2022
a394b73
BaseSplitter takes more info
emyxiv Nov 29, 2022
adbe9e8
Add splitter: BorderlessColumns
emyxiv Nov 29, 2022
58248b7
Code style
emyxiv Nov 29, 2022
165cb7f
Displays selected node
emyxiv Nov 29, 2022
0a4195f
Move modular configuration code into new class Configurator
emyxiv Nov 29, 2022
cccee6f
Add Hide Default Window checkbox
emyxiv Nov 29, 2022
4f423e0
Add new container: TopScreenBar
emyxiv Nov 29, 2022
cb93411
New splitter: CollapsibleHeader
emyxiv Nov 30, 2022
7f986fd
Implements locale handle for modular items
emyxiv Nov 30, 2022
451176d
Add new splitter: Tabs
emyxiv Nov 30, 2022
86d2e64
Add new panel: ActorListHorizontal
emyxiv Nov 30, 2022
b357ad9
Add new panel: SettingsButton
emyxiv Nov 30, 2022
ae8cd39
Add ImportClipboard<T>() and ExportClipboard() helpers
emyxiv Dec 1, 2022
9faf26e
Change Bone Offset import/export for import/exportClipboard()
emyxiv Dec 1, 2022
77a95e8
Add Import/export buttons to modular UI configurator
emyxiv Dec 1, 2022
a21b816
Refactor to have fixed constructors with extra params
emyxiv Dec 1, 2022
a3956ba
Normalized Title/LocaleHandle to GetTitle()
emyxiv Dec 1, 2022
a69bcc1
Move Base Container/Splitter/Panel in a new file
emyxiv Dec 1, 2022
cc94dcf
New base class BaseItem for common code of container/splitter/panel
emyxiv Dec 1, 2022
bd04fd3
Fix WindowFlags not modifiable after definied
emyxiv Dec 2, 2022
dcec2f0
Add todo comments
emyxiv Dec 2, 2022
03aa4a0
Fix Ids always 0
emyxiv Dec 2, 2022
58bc2fc
Clean up
emyxiv Dec 2, 2022
3df3bd7
Add todo comment
emyxiv Dec 2, 2022
e7a4f35
Implements per item settings
emyxiv Dec 2, 2022
cd24e61
Move context menu into method DrawContextMenu()
emyxiv Dec 2, 2022
0bd6bc9
New splitter: Group
emyxiv Dec 2, 2022
a512fcc
TopScreenBar location can be changed
emyxiv Dec 2, 2022
9e77cd5
Fix rebase issues
emyxiv Dec 3, 2022
ff7e946
Restore Fia's IconsPool after merge
emyxiv Dec 3, 2022
d140187
Bit refactor based on IModularItem deserialize
emyxiv Dec 4, 2022
ee38e2f
Renamed 'object' to 'item' for former ConfigObject variables
emyxiv Dec 4, 2022
5d51c99
Fix error on delete/move item
emyxiv Dec 4, 2022
343d520
Add insert above current selection in context menu
emyxiv Dec 4, 2022
9ec53bc
Change methods to private
emyxiv Dec 4, 2022
e79c3ad
Lightens Json in export and config
emyxiv Dec 4, 2022
38b3a7b
Add Type in clipboard export
emyxiv Dec 4, 2022
fdc6ed8
Renamed Misc to JsonHelpers
emyxiv Dec 4, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions Ktisis/Configuration.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Linq;
using System.Numerics;
using System.Collections.Generic;
Expand All @@ -11,6 +11,7 @@
using Dalamud.Game.ClientState.Keys;

using Ktisis.Interface;
using Ktisis.Interface.Modular;
using Ktisis.Localization;
using Ktisis.Structs.Bones;
using Ktisis.Structs.Actor.Equip.SetSources;
Expand All @@ -34,6 +35,8 @@ public class Configuration : IPluginConfiguration {
public bool AutoOpenCtor { get; set; } = false;
public OpenKtisisMethod OpenKtisisMethod { get; set; } = OpenKtisisMethod.OnEnterGpose;

public List<IModularItem> ModularConfig { get; set; } = new();
public bool ModularHideDefaultWorkspace { get; set; } = false;
public bool DisplayCharName { get; set; } = true;
public bool CensorNsfw { get; set; } = true;

Expand Down Expand Up @@ -138,9 +141,10 @@ public bool IsBoneCategoryVisible(Category category) {

public Dictionary<string, string> SavedDirPaths { get; set; } = new();

// Data memory
// Data
public Dictionary<string, GlamourDresser.GlamourPlate[]?>? GlamourPlateData { get; set; } = null;
public Dictionary<string, Dictionary<string, Vector3>> CustomBoneOffset { get; set; } = new();
public bool ClipboardExportClearJson { get; set; } = false;

// Validate for changes in config versions.

Expand Down
38 changes: 21 additions & 17 deletions Ktisis/Interface/Components/ActorsList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ namespace Ktisis.Interface.Components {
internal static class ActorsList {

private static List<long> SavedObjects = new();
private static List<DalamudGameObject>? SelectorList = null;
internal static List<DalamudGameObject>? SelectorList = null;
private static string Search = "";
private static readonly HashSet<ObjectKind> WhitelistObjectKinds = new(){
ObjectKind.Player,
Expand All @@ -32,7 +32,7 @@ internal static class ActorsList {

// Draw

public unsafe static void Draw() {
public unsafe static void Draw(bool isHorizontal = false) {
// Prevent displaying the same target multiple time
SavedObjects = SavedObjects.Distinct().ToList();

Expand All @@ -44,20 +44,26 @@ public unsafe static void Draw() {
SavedObjects.RemoveAll(o => !IsValidActor(o));

var buttonSize = new Vector2(ImGui.GetContentRegionAvail().X, ControlButtons.ButtonSize.Y);
if (ImGui.CollapsingHeader("Actor List")) {
long? toRemove = null;
foreach (var pointer in SavedObjects) {
if (!IsValidActor(pointer)) continue;
if (ImGui.Button($"{((Actor*)pointer)->GetNameOrId()}{ExtraInfo(pointer)}##ActorList##{pointer}", buttonSize))
Services.Targets->GPoseTarget = (GameObject*)pointer;
if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
toRemove = pointer;
}
if (toRemove != null) SavedObjects.Remove((long)toRemove);

if (GuiHelpers.IconButtonTooltip(Dalamud.Interface.FontAwesomeIcon.Plus, "Add Actor", ControlButtons.ButtonSize))
OpenSelector();
long? toRemove = null;
foreach (var pointer in SavedObjects) {
if (!IsValidActor(pointer)) continue;

var buttonText = $"{((Actor*)pointer)->GetNameOrId()}{ExtraInfo(pointer)}";

if (isHorizontal) buttonSize.X = ImGui.CalcTextSize(buttonText).X + ControlButtons.ButtonSize.X;
if (ImGui.Button($"{buttonText}##ActorList##{pointer}", buttonSize))
Services.Targets->GPoseTarget = (GameObject*)pointer;
if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
toRemove = pointer;
if (isHorizontal) ImGui.SameLine();
}
if (toRemove != null) SavedObjects.Remove((long)toRemove);

if (GuiHelpers.IconButtonTooltip(Dalamud.Interface.FontAwesomeIcon.Plus, "Add Actor", ControlButtons.ButtonSize))
OpenSelector();

if (!isHorizontal) {
ImGui.SameLine(ImGui.GetContentRegionAvail().X - (ImGui.GetStyle().ItemSpacing.X) - GuiHelpers.CalcIconSize(FontAwesomeIcon.InfoCircle).X);
ControlButtons.VerticalAlignTextOnButtonSize();

Expand All @@ -68,8 +74,6 @@ public unsafe static void Draw() {
ImGui.Text("Right click to remove an Actor from the list");
ImGui.EndTooltip();
}
if (SelectorList != null)
DrawListAddActor();
}
}

Expand All @@ -94,7 +98,7 @@ private static void OpenSelector() =>

private static void CloseSelector() => SelectorList = null;

private unsafe static void DrawListAddActor() {
internal unsafe static void DrawListAddActor() {
PopupSelect.HoverPopupWindow(
PopupSelect.HoverPopupWindowFlags.SelectorList | PopupSelect.HoverPopupWindowFlags.SearchBar,
SelectorList!,
Expand Down
21 changes: 10 additions & 11 deletions Ktisis/Interface/Components/AnimationControls.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,17 @@ namespace Ktisis.Interface.Components {
public static class AnimationControls {


public static unsafe void Draw(GameObject? target) {
// Animation control
if (ImGui.CollapsingHeader("Animation Control")) {
var control = PoseHooks.GetAnimationControl(target);
if (PoseHooks.PosingEnabled || !Ktisis.IsInGPose || PoseHooks.IsGamePlaybackRunning(target) || control == null) {
ImGui.Text("Animation Control is available when:");
ImGui.BulletText("Game animation is paused");
ImGui.BulletText("Posing is off");
} else
AnimationSeekAndSpeed(control);
}
public static unsafe void Draw() {
var target = Ktisis.GPoseTarget;

// Animation control
var control = PoseHooks.GetAnimationControl(target);
if (PoseHooks.PosingEnabled || !Ktisis.IsInGPose || PoseHooks.IsGamePlaybackRunning(target) || control == null) {
ImGui.Text("Animation Control is available when:");
ImGui.BulletText("Game animation is paused");
ImGui.BulletText("Posing is off");
} else
AnimationSeekAndSpeed(control);
}
public static unsafe void AnimationSeekAndSpeed(hkaDefaultAnimationControl* control) {
var duration = control->hkaAnimationControl.Binding.ptr->Animation.ptr->Duration;
Expand Down
35 changes: 18 additions & 17 deletions Ktisis/Interface/Components/BoneTree.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,24 @@ public class BoneTree {
private static Vector2 _FrameMin;
private static Vector2 _FrameMax;

public static unsafe void Draw(Actor* actor) {
if (ImGui.CollapsingHeader("Bone List")) {
var lineHeight = ImGui.GetTextLineHeight();
if (ImGui.BeginChildFrame(471, new Vector2(-1, lineHeight * 12), ImGuiWindowFlags.HorizontalScrollbar)) {
if (actor == null || actor->Model == null || actor->Model->Skeleton == null)
return;

var body = actor->Model->Skeleton->GetBone(0, 1);
if (body != null && body.Pose != null)
DrawBoneTreeNode(body);

ImGui.EndChildFrame();

_FrameMin = ImGui.GetItemRectMin();
_FrameMax.X = ImGui.GetItemRectMax().X;
_FrameMax.Y = _FrameMin.Y + lineHeight * 11;
}
public static unsafe void Draw() {
var actor = Ktisis.Target;
if (actor->Model == null) return;

var lineHeight = ImGui.GetTextLineHeight();
if (ImGui.BeginChildFrame(471, new Vector2(-1, lineHeight * 12), ImGuiWindowFlags.HorizontalScrollbar)) {
if (actor == null || actor->Model == null || actor->Model->Skeleton == null)
return;

var body = actor->Model->Skeleton->GetBone(0, 1);
if (body != null && body.Pose != null)
DrawBoneTreeNode(body);

ImGui.EndChildFrame();

_FrameMin = ImGui.GetItemRectMin();
_FrameMax.X = ImGui.GetItemRectMax().X;
_FrameMax.Y = _FrameMin.Y + lineHeight * 11;
}
}
private unsafe static void DrawBoneTreeNode(Bone bone) {
Expand Down
11 changes: 11 additions & 0 deletions Ktisis/Interface/Components/Categories.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,17 @@ public static bool DrawConfigList(Configuration cfg) {
});
}


public static void DrawToggleListWithHint() {
if (!DrawToggleList(Ktisis.Configuration)) {
ImGui.Text("No bone found.");
ImGui.Text("Show Skeleton (");
ImGui.SameLine();
GuiHelpers.Icon(FontAwesomeIcon.EyeSlash);
ImGui.SameLine();
ImGui.Text(") to fill this.");
}
}
public static bool DrawToggleList(Configuration cfg) {
if (!DrawList(category => {

Expand Down
42 changes: 34 additions & 8 deletions Ktisis/Interface/Components/ControlButtons.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,19 @@ public static class ControlButtons {
private static bool IsSettingsHovered = false;
private static bool IsSettingsActive = false;


// utils
public static void VerticalAlignTextOnButtonSize(float percentage = 0.667f) => ImGui.SetCursorPosY(ImGui.GetCursorPosY() + (ButtonSize.Y / 2 - ImGui.GetFontSize() * percentage)); // align text with button size

public static void DrawGizmoOperations() {
ButtonChangeOperation(OPERATION.TRANSLATE, IconsPool.Position);
ImGui.SameLine();
ButtonChangeOperation(OPERATION.ROTATE, IconsPool.Rotation);
ImGui.SameLine();
ButtonChangeOperation(OPERATION.SCALE, IconsPool.Scale);
ImGui.SameLine();
ButtonChangeOperation(OPERATION.UNIVERSAL, IconsPool.Universal);
}
public static void DrawExtra() {
var gizmode = Ktisis.Configuration.GizmoMode;
if (GuiHelpers.IconButtonTooltip(gizmode == MODE.WORLD ? FontAwesomeIcon.Globe : FontAwesomeIcon.Home, "Local / World orientation mode switch.", ButtonSize))
Expand Down Expand Up @@ -69,17 +79,25 @@ private static void DrawInfo() {

GuiHelpers.Tooltip("Information");
}
private static void DrawSettings() {
ImGui.PushStyleColor(ImGuiCol.Button, 0x00000000);
ImGui.PushStyleVar(ImGuiStyleVar.FrameRounding, 200f);
ImGui.PushStyleVar(ImGuiStyleVar.FramePadding, new Vector2(ImGui.GetFontSize() * 0.25f));

if (GuiHelpers.IconButton(FontAwesomeIcon.Cog, new(ImGui.GetFontSize() * 1.5f)))
internal static void DrawSettings(int flags = 1) {
var isTitleDecoration = (flags & 1) != 0;

Vector2 buttonSize = ButtonSize;
if (isTitleDecoration) {
ImGui.PushStyleColor(ImGuiCol.Button, 0x00000000);
ImGui.PushStyleVar(ImGuiStyleVar.FrameRounding, 200f);
ImGui.PushStyleVar(ImGuiStyleVar.FramePadding, new Vector2(ImGui.GetFontSize() * 0.25f));
buttonSize = new(ImGui.GetFontSize() * 1.5f);
}

if (GuiHelpers.IconButton(FontAwesomeIcon.Cog, buttonSize))
if (ConfigGui.Visible) ConfigGui.Hide();
else ConfigGui.Show();

ImGui.PopStyleColor();
ImGui.PopStyleVar(2);
if (isTitleDecoration) {
ImGui.PopStyleColor();
ImGui.PopStyleVar(2);
}

IsSettingsHovered = ImGui.IsItemHovered();
IsSettingsActive = ImGui.IsItemActive();
Expand Down Expand Up @@ -144,6 +162,7 @@ public static void ButtonChangeOperation(OPERATION operation, FontAwesomeIcon ic

// Independant from the others
public static void DrawPoseSwitch() {
ImGui.AlignTextToFramePadding();
ImGui.SetCursorPosX(ImGui.CalcTextSize("GPose Disabled").X + (ImGui.GetFontSize() * 8) + ImGui.GetStyle().ItemSpacing.X + GuiHelpers.CalcIconSize(FontAwesomeIcon.Cog).X); // Prevents text overlap

ImGui.BeginDisabled(!Ktisis.IsInGPose);
Expand All @@ -156,6 +175,7 @@ public static void DrawPoseSwitch() {
if (Ktisis.IsInGPose) ImGui.PopStyleColor();
ImGui.SameLine();


if (!Ktisis.IsInGPose)
ImGuiComponents.DisabledToggleButton("Toggle Posing", false);
else
Expand Down Expand Up @@ -188,5 +208,11 @@ private static string SiblingLinkToTooltip(SiblingLink siblingLink)
SiblingLink.RotationMirrorX => "Mirror rotation",
_ => "No sibling link"
};

public static void DrawParentingCheckbox() {
var parent = Ktisis.Configuration.EnableParenting;
if (ImGui.Checkbox("Parenting", ref parent))
Ktisis.Configuration.EnableParenting = parent;
}
}
}
5 changes: 3 additions & 2 deletions Ktisis/Interface/Components/PopupSelect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,9 @@ public static void HoverPopupWindow<T>(
if (ImGui.IsWindowFocused(ImGuiFocusedFlags.RootAndChildWindows) && !ImGui.IsAnyItemActive() && !ImGui.IsMouseClicked(ImGuiMouseButton.Left))
ImGui.SetKeyboardFocusHere(flags.HasFlag(HoverPopupWindowFlags.SearchBar) ? -1 : 0); // TODO: verify the keyboarf focus behaviour when searchbar is disabled

bool isListBoxOpened = false;
if (flags.HasFlag(HoverPopupWindowFlags.SelectorList))
ImGui.BeginListBox(listLabel, new Vector2(-1, 300));
isListBoxOpened = ImGui.BeginListBox(listLabel, new Vector2(-1, 300));
// box has began

if (flags.HasFlag(HoverPopupWindowFlags.Header)) {
Expand Down Expand Up @@ -172,7 +173,7 @@ public static void HoverPopupWindow<T>(


// box has ended
if (flags.HasFlag(HoverPopupWindowFlags.SelectorList))
if (flags.HasFlag(HoverPopupWindowFlags.SelectorList) && isListBoxOpened)
ImGui.EndListBox();
HoverPopupWindowFocus |= ImGui.IsItemActive();

Expand Down
13 changes: 5 additions & 8 deletions Ktisis/Interface/Components/TransformTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,6 @@ public void Update(Vector3 pos, Quaternion rot, Vector3 scale) {
public bool DrawTable() {
var result = false;

var iconPosition = FontAwesomeIcon.LocationArrow;
var iconRotation = FontAwesomeIcon.Sync;
var iconScale = FontAwesomeIcon.ExpandAlt;

FetchConfigurations();

Expand All @@ -86,17 +83,17 @@ public bool DrawTable() {
// Position
result |= ColoredDragFloat3("##Position", ref Position, BaseSpeedPos * multiplier, axisColors);
ImGui.SameLine();
ControlButtons.ButtonChangeOperation(OPERATION.TRANSLATE, iconPosition);

ControlButtons.ButtonChangeOperation(OPERATION.TRANSLATE, IconsPool.Position);
// Rotation
result |= ColoredDragFloat3("##Rotation", ref Rotation, BaseSpeedRot * multiplier, axisColors);
ImGui.SameLine();
ControlButtons.ButtonChangeOperation(OPERATION.ROTATE, iconRotation);

ControlButtons.ButtonChangeOperation(OPERATION.ROTATE, IconsPool.Rotation);
// Scale
result |= ColoredDragFloat3("##Scale", ref Scale, BaseSpeedSca * multiplier, axisColors);
ImGui.SameLine();
ControlButtons.ButtonChangeOperation(OPERATION.SCALE, iconScale);
ControlButtons.ButtonChangeOperation(OPERATION.SCALE, IconsPool.Scale);

IsEditing = result;

Expand Down
Loading