OrangeGuidanceTomestone/client/Ui/Viewer.cs

185 lines
5.8 KiB
C#

using System.Numerics;
using Dalamud.Interface;
using ImGuiNET;
using OrangeGuidanceTomestone.Helpers;
namespace OrangeGuidanceTomestone.Ui;
internal class Viewer {
private Plugin Plugin { get; }
internal bool Visible;
private int _idx;
internal Viewer(Plugin plugin) {
this.Plugin = plugin;
}
internal void Draw() {
if (!this.Visible) {
return;
}
var flags = ImGuiWindowFlags.NoFocusOnAppearing;
flags |= this.Plugin.Config.HideTitlebar ? ImGuiWindowFlags.NoTitleBar : ImGuiWindowFlags.None;
flags |= this.Plugin.Config.LockViewer ? ImGuiWindowFlags.NoMove : ImGuiWindowFlags.None;
flags |= this.Plugin.Config.ClickThroughViewer ? ImGuiWindowFlags.NoInputs : ImGuiWindowFlags.None;
ImGui.SetNextWindowSize(new Vector2(350, 175), ImGuiCond.FirstUseEver);
ImGui.SetNextWindowBgAlpha(this.Plugin.Config.ViewerOpacity / 100.0f);
if (!ImGui.Begin("Messages", ref this.Visible, flags)) {
ImGui.End();
return;
}
if (ImGui.IsWindowAppearing()) {
this._idx = 0;
}
var nearby = this.Plugin.Messages.Nearby()
.OrderBy(msg => msg.Id)
.ToList();
if (nearby.Count == 0) {
if (this.Plugin.Config.AutoViewerClose) {
this.Visible = false;
} else {
ImGui.TextUnformatted("No nearby messages");
}
goto End;
}
if (this._idx >= nearby.Count) {
this._idx = Math.Max(0, nearby.Count - 1);
}
if (!ImGui.BeginTable("##viewer-table", 3)) {
goto End;
}
ImGui.TableSetupColumn("##prev-arrow", ImGuiTableColumnFlags.WidthFixed);
ImGui.TableSetupColumn("##content", ImGuiTableColumnFlags.WidthStretch);
ImGui.TableSetupColumn("##next-arrow", ImGuiTableColumnFlags.WidthFixed);
ImGui.TableNextRow();
if (ImGui.TableSetColumnIndex(0)) {
var height = ImGui.GetContentRegionAvail().Y;
var buttonHeight = ImGuiHelpers.GetButtonSize("<").Y;
ImGui.Dummy(new Vector2(1, height / 2 - buttonHeight / 2 - ImGui.GetStyle().ItemSpacing.Y));
if (this._idx == 0) {
ImGui.BeginDisabled();
}
if (ImGuiHelper.IconButton(FontAwesomeIcon.AngleLeft)) {
this._idx -= 1;
}
if (this._idx == 0) {
ImGui.EndDisabled();
}
}
if (ImGui.TableSetColumnIndex(1) && this._idx > -1 && this._idx < nearby.Count) {
var message = nearby[this._idx];
var size = ImGui.CalcTextSize(message.Text, ImGui.GetContentRegionAvail().X).Y;
size += ImGui.GetStyle().ItemSpacing.Y * 2;
size += ImGui.CalcTextSize("A").Y;
size += ImGuiHelpers.GetButtonSize("A").Y;
var height = ImGui.GetContentRegionAvail().Y;
ImGui.Dummy(new Vector2(1, height / 2 - size / 2 - ImGui.GetStyle().ItemSpacing.Y));
ImGui.PushTextWrapPos();
ImGui.TextUnformatted(message.Text);
ImGui.PopTextWrapPos();
var appraisals = Math.Max(0, message.PositiveVotes - message.NegativeVotes);
ImGui.TextUnformatted($"Appraisals: {appraisals:N0}");
void Vote(int way) {
Task.Run(async () => {
var resp = await ServerHelper.SendRequest(
this.Plugin.Config.ApiKey,
HttpMethod.Patch,
$"/messages/{message.Id}/votes",
"application/json",
new StringContent(way.ToString())
);
if (resp.IsSuccessStatusCode) {
var oldWay = message.UserVote;
switch (oldWay) {
case 1:
message.PositiveVotes -= 1;
break;
case -1:
message.NegativeVotes -= 1;
break;
}
switch (way) {
case 1:
message.PositiveVotes += 1;
break;
case -1:
message.NegativeVotes += 1;
break;
}
message.UserVote = way;
}
});
}
var vote = message.UserVote;
if (vote == 1) {
ImGui.BeginDisabled();
}
if (ImGui.Button("Like")) {
Vote(1);
}
if (vote == 1) {
ImGui.EndDisabled();
}
ImGui.SameLine();
if (vote == -1) {
ImGui.BeginDisabled();
}
if (ImGui.Button("Dislike")) {
Vote(-1);
}
if (vote == -1) {
ImGui.EndDisabled();
}
}
if (ImGui.TableSetColumnIndex(2)) {
var height = ImGui.GetContentRegionAvail().Y;
var buttonHeight = ImGuiHelpers.GetButtonSize(">").Y;
ImGui.Dummy(new Vector2(1, height / 2 - buttonHeight / 2 - ImGui.GetStyle().ItemSpacing.Y));
if (this._idx == nearby.Count - 1) {
ImGui.BeginDisabled();
}
if (ImGuiHelper.IconButton(FontAwesomeIcon.AngleRight)) {
this._idx += 1;
}
if (this._idx == nearby.Count - 1) {
ImGui.EndDisabled();
}
}
ImGui.EndTable();
End:
ImGui.End();
}
}