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.Linq;
using System.Text.RegularExpressions;
using Dalamud.Interface.Internal.Notifications;
using Glamourer.Events;
using Glamourer.Interop.Penumbra;
using Glamourer.Services;
@ -102,7 +103,21 @@ public sealed class DesignFileSystem : FileSystem<Design>, IDisposable, ISavable
switch (type)
{
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;
case DesignChanged.Type.Deleted:
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:
if (!FindLeaf(design, out var leaf2))
return;
var old = oldName.FixName();
if (old == leaf2.Name || leaf2.Name.IsDuplicateName(out var baseName, out _) && baseName == old)
RenameWithDuplicates(leaf2, design.Name);

View file

@ -88,57 +88,61 @@ public class DesignManager
=> new(_items);
/// <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)
{
CreationDate = DateTimeOffset.UtcNow,
LastEdit = DateTimeOffset.UtcNow,
Identifier = CreateNewGuid(),
Name = name,
Name = actualName,
Index = _designs.Count,
};
_designs.Add(design);
Glamourer.Log.Debug($"Added new design {design.Identifier}.");
_saveService.ImmediateSave(design);
_event.Invoke(DesignChanged.Type.Created, design);
_event.Invoke(DesignChanged.Type.Created, design, path);
return design;
}
/// <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)
{
CreationDate = DateTimeOffset.UtcNow,
LastEdit = DateTimeOffset.UtcNow,
Identifier = CreateNewGuid(),
Name = name,
Name = actualName,
Index = _designs.Count,
};
_designs.Add(design);
Glamourer.Log.Debug($"Added new design {design.Identifier} by cloning Temporary Design.");
_saveService.ImmediateSave(design);
_event.Invoke(DesignChanged.Type.Created, design);
_event.Invoke(DesignChanged.Type.Created, design, path);
return design;
}
/// <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)
{
CreationDate = DateTimeOffset.UtcNow,
LastEdit = DateTimeOffset.UtcNow,
Identifier = CreateNewGuid(),
Name = name,
Name = actualName,
Index = _designs.Count,
};
_designs.Add(design);
Glamourer.Log.Debug(
$"Added new design {design.Identifier} by cloning {clone.Identifier.ToString()}.");
_saveService.ImmediateSave(design);
_event.Invoke(DesignChanged.Type.Created, design);
_event.Invoke(DesignChanged.Type.Created, design, path);
return design;
}
@ -633,4 +637,22 @@ public class DesignManager
_event.Invoke(DesignChanged.Type.Created, design);
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
{
/// <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,
/// <summary> An existing design was deleted. Data is null. </summary>

View file

@ -334,7 +334,7 @@ public class ActorPanel
return;
if (_newDesign != null && _newName.Length > 0)
_designManager.CreateClone(_newDesign, _newName);
_designManager.CreateClone(_newDesign, _newName, true);
_newDesign = null;
_newName = string.Empty;
}

View file

@ -180,9 +180,9 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
{
var design = _converter.FromBase64(_clipboardText, true, true, out _);
if (design is Design d)
_designManager.CreateClone(d, _newName);
_designManager.CreateClone(d, _newName, true);
else if (design != null)
_designManager.CreateClone(design, _newName);
_designManager.CreateClone(design, _newName, true);
else
Glamourer.Chat.NotificationMessage("Could not create a design, clipboard did not contain valid design data.", "Failure",
NotificationType.Error);
@ -190,12 +190,12 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
}
else if (_cloneDesign != null)
{
_designManager.CreateClone(_cloneDesign, _newName);
_designManager.CreateClone(_cloneDesign, _newName, true);
_cloneDesign = null;
}
else
{
_designManager.CreateEmpty(_newName);
_designManager.CreateEmpty(_newName, true);
}
_newName = string.Empty;

View file

@ -437,7 +437,7 @@ public class CommandService : IDisposable
}
var design = _converter.Convert(state, EquipFlagExtensions.All, CustomizeFlagExtensions.AllRelevant);
_designManager.CreateClone(design, split[0]);
_designManager.CreateClone(design, split[0], true);
return true;
}