// Fill out your copyright notice in the Description page of Project Settings.


#include "CustomizationOptionWidget.h"

#include "Components/Border.h"
#include "Components/Button.h"
#include "Components/Image.h"
#include "Components/TextBlock.h"
#include "Engine/Texture2D.h"

void UCustomizationOptionWidget::NativeOnInitialized()
{
	Super::NativeOnInitialized();

	if (OptionButton)
	{
		OptionButton->OnClicked.AddDynamic(this, &UCustomizationOptionWidget::HandleButtonClicked);
	}

	SetSelected(false);
}

void UCustomizationOptionWidget::SetupAsPart(int32 InIndex, UTexture2D* Icon)
{
	OptionIndex = InIndex;

	if (OptionImage)
	{
		// Le blanc et pas la couleur d'origine : SetupAsColor a pu teinter
		// cette image lors d'un passage precedent, et la case est recyclee.
		// Sans cette remise a plat, une vignette heriterait de la teinte de la
		// pastille qui occupait la meme case avant elle.
		OptionImage->SetColorAndOpacity(FLinearColor::White);
		OptionImage->SetBrushFromTexture(Icon);
		OptionImage->SetVisibility(Icon ? ESlateVisibility::Visible : ESlateVisibility::Collapsed);
	}

	if (IndexText)
	{
		// Le numero ne sert que de repli. Affiche a cote d'une vignette, il la
		// salirait ; affiche seul, il rend la case utilisable.
		IndexText->SetText(FText::AsNumber(InIndex + 1));
		IndexText->SetVisibility(Icon ? ESlateVisibility::Collapsed : ESlateVisibility::HitTestInvisible);
	}
}

void UCustomizationOptionWidget::SetupAsColor(int32 InIndex, const FLinearColor& Color)
{
	OptionIndex = InIndex;

	if (OptionImage)
	{
		// Aucune texture assignee : le pinceau par defaut d'une UImage est un
		// aplat blanc, que la teinte suffit a colorer. C'est ce qui permet a
		// une pastille de n'avoir besoin d'aucun asset.
		OptionImage->SetBrushFromTexture(nullptr);
		OptionImage->SetColorAndOpacity(Color);
		OptionImage->SetVisibility(ESlateVisibility::Visible);
	}

	if (IndexText)
	{
		IndexText->SetVisibility(ESlateVisibility::Collapsed);
	}
}

void UCustomizationOptionWidget::SetSelected(bool bInSelected)
{
	if (SelectionBorder)
	{
		SelectionBorder->SetBrushColor(bInSelected ? SelectedBorderColor : UnselectedBorderColor);
	}

	// La case deja choisie n'est plus cliquable : re-cliquer une option active
	// ne ferait rien, et un bouton qui ne fait rien laisse croire que le clic
	// n'a pas ete pris. Le style Disabled du bouton la marque au passage --
	// c'est un second signal de selection, gratuit, en plus du cadre.
	if (OptionButton)
	{
		OptionButton->SetIsEnabled(!bInSelected);
	}
}

void UCustomizationOptionWidget::HandleButtonClicked()
{
	OnOptionClicked.Broadcast(OptionIndex);
}
