// Icon Studio - Mathew Simon

#pragma once

#include "CoreMinimal.h"
#include "Styling/SlateBrush.h"
#include "Widgets/SCompoundWidget.h"

class IDetailsView;
class UIconStudioSubsystem;
class UTexture2D;

/**
 * La fenetre du studio, entierement en Slate.
 *
 * Aucun asset a creer dans l'editeur : l'outil est complet des le chargement du
 * module. En contrepartie, retoucher la mise en page demande une recompilation --
 * un echange raisonnable pour un outil dont l'interface ne bouge quasiment pas.
 *
 * Les deux panneaux de droite sont des IDetailsView, ceux du moteur : ils
 * fabriquent leurs champs a partir des UPROPERTY de la session et du preset.
 * Ajouter un reglage a UIconStudioPreset le fait donc apparaitre tout seul, sans
 * une ligne d'interface a ecrire.
 */
class SIconStudioTab : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SIconStudioTab) {}
	SLATE_END_ARGS()

	void Construct(const FArguments& InArgs);
	virtual ~SIconStudioTab() override;

private:
	static UIconStudioSubsystem* GetStudio();

	TSharedRef<SWidget> BuildPreviewPanel();
	TSharedRef<SWidget> BuildSettingsPanel();

	void HandlePreviewUpdated(UTexture2D* PreviewTexture);
	void HandleStatus(const FString& Message);

	FReply OnRefreshClicked();
	FReply OnGenerateClicked();
	FReply OnUseSelectionClicked();
	FReply OnAddSelectionClicked();
	FReply OnGenerateBatchClicked();
	FReply OnClearBatchClicked();

	FText GetStatusText() const { return StatusMessage; }
	EVisibility GetPreviewVisibility() const;

	TSharedPtr<IDetailsView> SessionDetails;
	TSharedPtr<IDetailsView> PresetDetails;

	/**
	 * La brosse pointe sur la texture de previsualisation, qui est recreee des
	 * que la resolution change : elle est donc reassignee a chaque rendu, jamais
	 * construite une fois pour toutes.
	 */
	FSlateBrush PreviewBrush;

	FText StatusMessage;

	FDelegateHandle PreviewHandle;
	FDelegateHandle StatusHandle;
};
