2023-10-01 20:50:21 +00:00
using System ;
using System.Linq ;
using System.Numerics ;
using Dalamud.Interface ;
using Dalamud.Interface.Components ;
using Dalamud.Interface.Windowing ;
using Dalamud.Plugin ;
using ImGuiNET ;
using Workshoppa.GameData ;
namespace Workshoppa.Windows ;
internal sealed class MainWindow : Window
{
private readonly WorkshopPlugin _plugin ;
private readonly DalamudPluginInterface _pluginInterface ;
private readonly Configuration _configuration ;
private readonly WorkshopCache _workshopCache ;
private string _searchString = string . Empty ;
public MainWindow ( WorkshopPlugin plugin , DalamudPluginInterface pluginInterface , Configuration configuration , WorkshopCache workshopCache )
: base ( "Workshoppa###WorkshoppaMainWindow" )
{
_plugin = plugin ;
_pluginInterface = pluginInterface ;
_configuration = configuration ;
_workshopCache = workshopCache ;
Position = new Vector2 ( 100 , 100 ) ;
PositionCondition = ImGuiCond . FirstUseEver ;
SizeConstraints = new WindowSizeConstraints
{
MinimumSize = new Vector2 ( 350 , 50 ) ,
MaximumSize = new Vector2 ( 500 , 500 ) ,
} ;
Flags = ImGuiWindowFlags . AlwaysAutoResize | ImGuiWindowFlags . NoCollapse ;
}
public bool NearFabricationStation { get ; set ; } = false ;
public ButtonState State { get ; set ; } = ButtonState . None ;
public override void Draw ( )
{
var currentItem = _configuration . CurrentlyCraftedItem ;
if ( currentItem ! = null )
{
var currentCraft = _workshopCache . Crafts . Single ( x = > x . WorkshopItemId = = currentItem . WorkshopItemId ) ;
ImGui . Text ( $"Currently Crafting: {currentCraft.Name}" ) ;
ImGui . BeginDisabled ( ! NearFabricationStation ) ;
if ( _plugin . CurrentStage = = Stage . Stopped )
{
if ( currentItem . StartedCrafting )
{
if ( ImGuiComponents . IconButtonWithText ( FontAwesomeIcon . Play , "Resume" ) )
State = ButtonState . Resume ;
}
else
{
if ( ImGuiComponents . IconButtonWithText ( FontAwesomeIcon . Play , "Start Crafting" ) )
State = ButtonState . Start ;
}
ImGui . SameLine ( ) ;
ImGui . BeginDisabled ( ! ImGui . GetIO ( ) . KeyCtrl ) ;
if ( ImGuiComponents . IconButtonWithText ( FontAwesomeIcon . Times , "Cancel" ) )
{
State = ButtonState . Pause ;
_configuration . CurrentlyCraftedItem = null ;
Save ( ) ;
}
ImGui . EndDisabled ( ) ;
if ( ImGui . IsItemHovered ( ImGuiHoveredFlags . AllowWhenDisabled ) & & ! ImGui . GetIO ( ) . KeyCtrl )
ImGui . SetTooltip (
$"Hold CTRL to remove this as craft. You have to manually use the fabrication station to cancel or finish this craft before you can continue using the queue." ) ;
}
else
{
ImGui . BeginDisabled ( _plugin . CurrentStage = = Stage . RequestStop ) ;
if ( ImGuiComponents . IconButtonWithText ( FontAwesomeIcon . Pause , "Pause" ) )
State = ButtonState . Pause ;
ImGui . EndDisabled ( ) ;
}
ImGui . EndDisabled ( ) ;
}
else
{
ImGui . Text ( "Currently Crafting: ---" ) ;
ImGui . BeginDisabled ( ! NearFabricationStation | | _configuration . ItemQueue . Sum ( x = > x . Quantity ) = = 0 | | _plugin . CurrentStage ! = Stage . Stopped ) ;
if ( ImGuiComponents . IconButtonWithText ( FontAwesomeIcon . Play , "Start Crafting" ) )
State = ButtonState . Start ;
ImGui . EndDisabled ( ) ;
}
ImGui . Separator ( ) ;
ImGui . Text ( "Queue:" ) ;
2023-10-01 21:33:09 +00:00
ImGui . BeginDisabled ( _plugin . CurrentStage ! = Stage . Stopped ) ;
2023-10-01 20:50:21 +00:00
for ( int i = 0 ; i < _configuration . ItemQueue . Count ; + + i )
{
ImGui . PushID ( $"ItemQueue{i}" ) ;
var item = _configuration . ItemQueue [ i ] ;
var craft = _workshopCache . Crafts . Single ( x = > x . WorkshopItemId = = item . WorkshopItemId ) ;
ImGui . SetNextItemWidth ( 100 ) ;
int quantity = item . Quantity ;
if ( ImGui . InputInt ( craft . Name , ref quantity ) )
{
item . Quantity = Math . Max ( 0 , quantity ) ;
Save ( ) ;
}
ImGui . PopID ( ) ;
}
ImGui . SetNextItemWidth ( ImGui . GetContentRegionAvail ( ) . X ) ;
if ( ImGui . BeginCombo ( "##CraftSelection" , "Add Craft..." ) )
{
ImGui . SetNextItemWidth ( ImGui . GetContentRegionAvail ( ) . X ) ;
ImGui . InputTextWithHint ( "" , "Filter..." , ref _searchString , 256 ) ;
foreach ( var craft in _workshopCache . Crafts
. Where ( x = > x . Name . ToLower ( ) . Contains ( _searchString . ToLower ( ) ) )
. OrderBy ( x = > x . WorkshopItemId ) )
{
if ( ImGui . Selectable ( $"{craft.Name}##SelectCraft{craft.WorkshopItemId}" ) )
{
_configuration . ItemQueue . Add ( new Configuration . QueuedItem
{
WorkshopItemId = craft . WorkshopItemId ,
Quantity = 1 ,
} ) ;
Save ( ) ;
}
}
ImGui . EndCombo ( ) ;
}
2023-10-01 21:33:09 +00:00
ImGui . EndDisabled ( ) ;
2023-10-01 20:50:21 +00:00
ImGui . Separator ( ) ;
2023-10-01 21:33:09 +00:00
ImGui . Text ( $"Debug (Stage): {_plugin.CurrentStage}" ) ;
2023-10-01 20:50:21 +00:00
}
private void Save ( )
{
_pluginInterface . SavePluginConfig ( _configuration ) ;
}
public enum ButtonState
{
None ,
Start ,
Resume ,
Pause ,
Stop ,
}
}