Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions Silkstring/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace Silkstring;
public class Configuration : IPluginConfiguration
{
public int Version { get; set; } = 1;
public List<AliasFolder> Folders = new();
public List<AliasEntry> Aliases = new();
public int CommandDelay { get; set; } = 100;
public bool MultilineCommands { get; set; } = false;
Expand Down
2 changes: 2 additions & 0 deletions Silkstring/Models/AliasEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class AliasEntry
{
public static readonly string[] Blacklist = ["silkstring", "xlplugins", "xlsettings", "xldclose", "xldev"];

public string DisplayName = string.Empty;
public bool Enabled = true;
public string Name = string.Empty;
public List<CommandEntry> Output = new();
Expand Down Expand Up @@ -38,6 +39,7 @@ public AliasEntry Clone()
{
return new AliasEntry
{
DisplayName = DisplayName,
Enabled = Enabled,
Name = Name,
Output = Output.Select(c => c.Clone()).ToList()
Expand Down
9 changes: 9 additions & 0 deletions Silkstring/Models/AliasFolder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Collections.Generic;

namespace Silkstring.Models;

public class AliasFolder
{
public string Name { get; set; } = string.Empty;
public List<AliasEntry> Aliases { get; set; } = new();
}
11 changes: 6 additions & 5 deletions Silkstring/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public Plugin()

EditWindow = new EditWindow(this);
ConfigWindow = new ConfigWindow(this);
MainWindow = new MainWindow(this, EditWindow, ConfigWindow);
MainWindow = new MainWindow(this, ToggleConfigUi);

WindowSystem.AddWindow(MainWindow);
WindowSystem.AddWindow(ConfigWindow);
Expand Down Expand Up @@ -110,10 +110,11 @@ private void ProcessChatInputDetour(ShellCommandModule* shellCommandModule, Utf8
if (splitString.Length > 0)
{
var commandName = splitString[0][1..];
var alias = Configuration.Aliases.FirstOrDefault(a =>
a.Enabled &&
a.IsValid() &&
a.Name.Split('|', StringSplitOptions.TrimEntries).Any(n => n.Equals(commandName, StringComparison.OrdinalIgnoreCase)));
var alias = Configuration.Aliases.Concat(
Configuration.Folders.SelectMany(g => g.Aliases)).FirstOrDefault(a =>
a.Enabled &&
a.IsValid() &&
a.Name.Split('|', StringSplitOptions.TrimEntries).Any(n => n.Equals(commandName, StringComparison.OrdinalIgnoreCase)));
if (alias != null)
{
var commands = alias.Output
Expand Down
131 changes: 131 additions & 0 deletions Silkstring/UI/AliasEditPanel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
using System;
using System.Linq;
using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Components;
using ECommons.ImGuiMethods;
using Silkstring.Models;
using Silkstring.Windows;

namespace Silkstring.Ui;

public class AliasEditPanel
{
private readonly Configuration _configuration;
private readonly MainWindow _mainWindow;

private string _multilineBuffer = string.Empty;
private int _multilineAliasId = -1;

public AliasEditPanel(Configuration configuration, MainWindow mainWindow)
{
_configuration = configuration;
_mainWindow = mainWindow;
}

public void Draw()
{
var alias = _mainWindow.SelectedAlias;

if (alias == null)
{
DrawEmptyState();
return;
}

DrawAliasHeader(alias);
ImGui.Separator();
DrawCommandList(alias);
}

private void DrawEmptyState()
{
var placeholder = "Select an alias to edit";
var size = ImGui.CalcTextSize(placeholder);
var region = ImGui.GetContentRegionAvail();

ImGui.SetCursorPos(new Vector2((region.X - size.X) / 2, (region.Y - size.Y) / 2));
ImGui.TextDisabled(placeholder);
}

private void DrawAliasHeader(AliasEntry alias)
{
if (ImGui.Checkbox($"###enabled{alias.UniqueId}", ref alias.Enabled)) _configuration.Save();
ImGui.SameLine();
ImGui.SetNextItemWidth(-1);
if(ImGui.InputTextWithHint($"###aliasName{alias.UniqueId}", "activation command", ref alias.Name, 100)) _configuration.Save();
if(ImGui.IsItemHovered()) ImGui.SetTooltip("Seperate multiple aliases with | e.g. mew|meow|mreow");
}

private void DrawCommandList(AliasEntry alias)
{
if (_configuration.MultilineCommands)
{
DrawMultlineView(alias);
}
else
{
DrawListView(alias);
}
}

private void DrawMultlineView(AliasEntry alias)
{
if (_multilineAliasId != alias.UniqueId)
{
_multilineBuffer = string.Join("\n", alias.Output.Select(c => c.Command));
_multilineAliasId = alias.UniqueId;
}

if (ImGui.InputTextMultiline($"###multiline{alias.UniqueId}", ref _multilineBuffer, 5000, new Vector2(-1, ImGui.GetContentRegionAvail().Y)))
{
var lines = _multilineBuffer.Split('\n', StringSplitOptions.RemoveEmptyEntries).Select(c => c.Trim()).ToList();
for (var i = 0; i < lines.Count; i++)
{
if (i < alias.Output.Count) alias.Output[i].Command = lines[i];
else alias.Output.Add(new CommandEntry { Command = lines[i] });
}

if (alias.Output.Count > lines.Count) alias.Output.RemoveRange(lines.Count, alias.Output.Count - lines.Count);

_configuration.Save();
}
}

private void DrawListView(AliasEntry alias)
{
ImGui.Text("Commands:");
if (ImGui.BeginChild("###commandList"))
{
foreach (var command in alias.Output)
{
if (command.UniqueId == 0) command.UniqueId = alias.Output.Count == 0 ? 1 : alias.Output.Max(c => c.UniqueId) + 1;
DrawCommandRow(command);
}

alias.Output.RemoveAll(c => c.Delete);
}

if (ImGuiComponents.IconButton((int)FontAwesomeIcon.Plus, FontAwesomeIcon.Plus))
{
alias.Output.Add(new CommandEntry());
_configuration.Save();
}
if (ImGui.IsItemHovered()) ImGui.SetTooltip("Add Command");
ImGui.EndChild();
}

private void DrawCommandRow(CommandEntry command)
{
ImGui.SetNextItemWidth(-60);
if (ImGui.InputText($"###cmd{command.UniqueId}", ref command.Command, 200)) _configuration.Save();
ImGui.SameLine();

var canDelete = ImGui.GetIO().KeyShift && ImGui.GetIO().KeyCtrl;
ImGui.BeginDisabled(!canDelete);
if (ImGuiComponents.IconButton(command.UniqueId, FontAwesomeIcon.Trash)) command.Delete = true;
ImGui.EndDisabled();
if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled)) ImGui.SetTooltip("Hold Shift + Ctrl to delete");
}
}
Loading
Loading