mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2025-12-12 18:27:24 +01:00
Restore splitting paths for folders on design creation.
This commit is contained in:
parent
954294b669
commit
d0b7c1f607
6 changed files with 55 additions and 17 deletions
|
|
@ -4,6 +4,7 @@ using System.Diagnostics.CodeAnalysis;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using Dalamud.Interface.Internal.Notifications;
|
||||||
using Glamourer.Events;
|
using Glamourer.Events;
|
||||||
using Glamourer.Interop.Penumbra;
|
using Glamourer.Interop.Penumbra;
|
||||||
using Glamourer.Services;
|
using Glamourer.Services;
|
||||||
|
|
@ -102,7 +103,21 @@ public sealed class DesignFileSystem : FileSystem<Design>, IDisposable, ISavable
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case DesignChanged.Type.Created:
|
case DesignChanged.Type.Created:
|
||||||
CreateDuplicateLeaf(Root, design.Name.Text, design);
|
var parent = Root;
|
||||||
|
if (data is string path)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
parent = FindOrCreateAllFolders(path);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Glamourer.Chat.NotificationMessage(ex, $"Could not move design to {path} because the folder could not be created.",
|
||||||
|
$"Could not move design to {path} because the folder could not be created", "Error",
|
||||||
|
NotificationType.Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateDuplicateLeaf(parent, design.Name.Text, design);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
case DesignChanged.Type.Deleted:
|
case DesignChanged.Type.Deleted:
|
||||||
if (FindLeaf(design, out var leaf1))
|
if (FindLeaf(design, out var leaf1))
|
||||||
|
|
@ -114,6 +129,7 @@ public sealed class DesignFileSystem : FileSystem<Design>, IDisposable, ISavable
|
||||||
case DesignChanged.Type.Renamed when data is string oldName:
|
case DesignChanged.Type.Renamed when data is string oldName:
|
||||||
if (!FindLeaf(design, out var leaf2))
|
if (!FindLeaf(design, out var leaf2))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var old = oldName.FixName();
|
var old = oldName.FixName();
|
||||||
if (old == leaf2.Name || leaf2.Name.IsDuplicateName(out var baseName, out _) && baseName == old)
|
if (old == leaf2.Name || leaf2.Name.IsDuplicateName(out var baseName, out _) && baseName == old)
|
||||||
RenameWithDuplicates(leaf2, design.Name);
|
RenameWithDuplicates(leaf2, design.Name);
|
||||||
|
|
|
||||||
|
|
@ -88,57 +88,61 @@ public class DesignManager
|
||||||
=> new(_items);
|
=> new(_items);
|
||||||
|
|
||||||
/// <summary> Create a new design of a given name. </summary>
|
/// <summary> Create a new design of a given name. </summary>
|
||||||
public Design CreateEmpty(string name)
|
public Design CreateEmpty(string name, bool handlePath)
|
||||||
{
|
{
|
||||||
|
var (actualName, path) = ParseName(name, handlePath);
|
||||||
var design = new Design(_items)
|
var design = new Design(_items)
|
||||||
{
|
{
|
||||||
CreationDate = DateTimeOffset.UtcNow,
|
CreationDate = DateTimeOffset.UtcNow,
|
||||||
LastEdit = DateTimeOffset.UtcNow,
|
LastEdit = DateTimeOffset.UtcNow,
|
||||||
Identifier = CreateNewGuid(),
|
Identifier = CreateNewGuid(),
|
||||||
Name = name,
|
Name = actualName,
|
||||||
Index = _designs.Count,
|
Index = _designs.Count,
|
||||||
};
|
};
|
||||||
_designs.Add(design);
|
_designs.Add(design);
|
||||||
Glamourer.Log.Debug($"Added new design {design.Identifier}.");
|
Glamourer.Log.Debug($"Added new design {design.Identifier}.");
|
||||||
_saveService.ImmediateSave(design);
|
_saveService.ImmediateSave(design);
|
||||||
_event.Invoke(DesignChanged.Type.Created, design);
|
_event.Invoke(DesignChanged.Type.Created, design, path);
|
||||||
return design;
|
return design;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Create a new design cloning a given temporary design. </summary>
|
/// <summary> Create a new design cloning a given temporary design. </summary>
|
||||||
public Design CreateClone(DesignBase clone, string name)
|
public Design CreateClone(DesignBase clone, string name, bool handlePath)
|
||||||
{
|
{
|
||||||
|
var (actualName, path) = ParseName(name, handlePath);
|
||||||
var design = new Design(clone)
|
var design = new Design(clone)
|
||||||
{
|
{
|
||||||
CreationDate = DateTimeOffset.UtcNow,
|
CreationDate = DateTimeOffset.UtcNow,
|
||||||
LastEdit = DateTimeOffset.UtcNow,
|
LastEdit = DateTimeOffset.UtcNow,
|
||||||
Identifier = CreateNewGuid(),
|
Identifier = CreateNewGuid(),
|
||||||
Name = name,
|
Name = actualName,
|
||||||
Index = _designs.Count,
|
Index = _designs.Count,
|
||||||
};
|
};
|
||||||
|
|
||||||
_designs.Add(design);
|
_designs.Add(design);
|
||||||
Glamourer.Log.Debug($"Added new design {design.Identifier} by cloning Temporary Design.");
|
Glamourer.Log.Debug($"Added new design {design.Identifier} by cloning Temporary Design.");
|
||||||
_saveService.ImmediateSave(design);
|
_saveService.ImmediateSave(design);
|
||||||
_event.Invoke(DesignChanged.Type.Created, design);
|
_event.Invoke(DesignChanged.Type.Created, design, path);
|
||||||
return design;
|
return design;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Create a new design cloning a given design. </summary>
|
/// <summary> Create a new design cloning a given design. </summary>
|
||||||
public Design CreateClone(Design clone, string name)
|
public Design CreateClone(Design clone, string name, bool handlePath)
|
||||||
{
|
{
|
||||||
|
var (actualName, path) = ParseName(name, handlePath);
|
||||||
var design = new Design(clone)
|
var design = new Design(clone)
|
||||||
{
|
{
|
||||||
CreationDate = DateTimeOffset.UtcNow,
|
CreationDate = DateTimeOffset.UtcNow,
|
||||||
LastEdit = DateTimeOffset.UtcNow,
|
LastEdit = DateTimeOffset.UtcNow,
|
||||||
Identifier = CreateNewGuid(),
|
Identifier = CreateNewGuid(),
|
||||||
Name = name,
|
Name = actualName,
|
||||||
Index = _designs.Count,
|
Index = _designs.Count,
|
||||||
};
|
};
|
||||||
_designs.Add(design);
|
_designs.Add(design);
|
||||||
Glamourer.Log.Debug(
|
Glamourer.Log.Debug(
|
||||||
$"Added new design {design.Identifier} by cloning {clone.Identifier.ToString()}.");
|
$"Added new design {design.Identifier} by cloning {clone.Identifier.ToString()}.");
|
||||||
_saveService.ImmediateSave(design);
|
_saveService.ImmediateSave(design);
|
||||||
_event.Invoke(DesignChanged.Type.Created, design);
|
_event.Invoke(DesignChanged.Type.Created, design, path);
|
||||||
return design;
|
return design;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -633,4 +637,22 @@ public class DesignManager
|
||||||
_event.Invoke(DesignChanged.Type.Created, design);
|
_event.Invoke(DesignChanged.Type.Created, design);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary> Split a given string into its folder path and its name, if <paramref name="handlePath"/> is true. </summary>
|
||||||
|
private static (string Name, string? Path) ParseName(string name, bool handlePath)
|
||||||
|
{
|
||||||
|
var actualName = name;
|
||||||
|
string? path = null;
|
||||||
|
if (handlePath)
|
||||||
|
{
|
||||||
|
var slashPos = name.LastIndexOf('/');
|
||||||
|
if (slashPos >= 0)
|
||||||
|
{
|
||||||
|
path = name[..slashPos];
|
||||||
|
actualName = slashPos >= name.Length - 1 ? "<Unnamed>" : name[(slashPos + 1)..];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (actualName, path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public sealed class DesignChanged : EventWrapper<Action<DesignChanged.Type, Desi
|
||||||
{
|
{
|
||||||
public enum Type
|
public enum Type
|
||||||
{
|
{
|
||||||
/// <summary> A new design was created. Data is null. </summary>
|
/// <summary> A new design was created. Data is a potential path to move it to [string?]. </summary>
|
||||||
Created,
|
Created,
|
||||||
|
|
||||||
/// <summary> An existing design was deleted. Data is null. </summary>
|
/// <summary> An existing design was deleted. Data is null. </summary>
|
||||||
|
|
|
||||||
|
|
@ -334,7 +334,7 @@ public class ActorPanel
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (_newDesign != null && _newName.Length > 0)
|
if (_newDesign != null && _newName.Length > 0)
|
||||||
_designManager.CreateClone(_newDesign, _newName);
|
_designManager.CreateClone(_newDesign, _newName, true);
|
||||||
_newDesign = null;
|
_newDesign = null;
|
||||||
_newName = string.Empty;
|
_newName = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -180,9 +180,9 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
|
||||||
{
|
{
|
||||||
var design = _converter.FromBase64(_clipboardText, true, true, out _);
|
var design = _converter.FromBase64(_clipboardText, true, true, out _);
|
||||||
if (design is Design d)
|
if (design is Design d)
|
||||||
_designManager.CreateClone(d, _newName);
|
_designManager.CreateClone(d, _newName, true);
|
||||||
else if (design != null)
|
else if (design != null)
|
||||||
_designManager.CreateClone(design, _newName);
|
_designManager.CreateClone(design, _newName, true);
|
||||||
else
|
else
|
||||||
Glamourer.Chat.NotificationMessage("Could not create a design, clipboard did not contain valid design data.", "Failure",
|
Glamourer.Chat.NotificationMessage("Could not create a design, clipboard did not contain valid design data.", "Failure",
|
||||||
NotificationType.Error);
|
NotificationType.Error);
|
||||||
|
|
@ -190,12 +190,12 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
|
||||||
}
|
}
|
||||||
else if (_cloneDesign != null)
|
else if (_cloneDesign != null)
|
||||||
{
|
{
|
||||||
_designManager.CreateClone(_cloneDesign, _newName);
|
_designManager.CreateClone(_cloneDesign, _newName, true);
|
||||||
_cloneDesign = null;
|
_cloneDesign = null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_designManager.CreateEmpty(_newName);
|
_designManager.CreateEmpty(_newName, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
_newName = string.Empty;
|
_newName = string.Empty;
|
||||||
|
|
|
||||||
|
|
@ -437,7 +437,7 @@ public class CommandService : IDisposable
|
||||||
}
|
}
|
||||||
|
|
||||||
var design = _converter.Convert(state, EquipFlagExtensions.All, CustomizeFlagExtensions.AllRelevant);
|
var design = _converter.Convert(state, EquipFlagExtensions.All, CustomizeFlagExtensions.AllRelevant);
|
||||||
_designManager.CreateClone(design, split[0]);
|
_designManager.CreateClone(design, split[0], true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue