Restore splitting paths for folders on design creation.

This commit is contained in:
Ottermandias 2023-09-26 18:51:08 +02:00
parent 954294b669
commit d0b7c1f607
6 changed files with 55 additions and 17 deletions

View file

@ -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);

View file

@ -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);
}
} }

View file

@ -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>

View file

@ -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;
} }

View file

@ -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;

View file

@ -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;
} }