/***

  Olive - Non-Linear Video Editor
  Copyright (C) 2022 Olive Team
  Modifications Copyright (C) 2025 mikesolar

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.

***/

#include "scope.h"

#include <QVBoxLayout>

#include "panel/viewer/viewer.h"

namespace olive
{

ScopePanel::ScopePanel()
	: PanelWidget(QStringLiteral("ScopePanel"))
	, viewer_(nullptr)
{
	QWidget *central = new QWidget(this);
	setWidget(central);

	QVBoxLayout *layout = new QVBoxLayout(central);

	QHBoxLayout *toolbar_layout = new QHBoxLayout();
	toolbar_layout->setContentsMargins(0, 0, 0, 0);

	scope_type_combobox_ = new QComboBox();

	for (int i = 0; i < ScopePanel::kTypeCount; i++) {
		// These strings get filled in later in Retranslate()
		scope_type_combobox_->addItem(QString());
	}

	toolbar_layout->addWidget(scope_type_combobox_);
	toolbar_layout->addStretch();

	layout->addLayout(toolbar_layout);

	stack_ = new QStackedWidget();
	layout->addWidget(stack_);

	// Create waveform view
	waveform_view_ = new WaveformScope();
	stack_->addWidget(waveform_view_);

	// Create vectorscope
	vectorscope_ = new VectorscopeScope();
	stack_->addWidget(vectorscope_);

	// Create histogram
	histogram_ = new HistogramScope();
	stack_->addWidget(histogram_);

	connect(
		scope_type_combobox_,
		static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
		stack_, &QStackedWidget::setCurrentIndex);

	Retranslate();
}

void ScopePanel::SetType(ScopePanel::Type t)
{
	scope_type_combobox_->setCurrentIndex(t);
}

QString ScopePanel::TypeToName(ScopePanel::Type t)
{
	switch (t) {
	case kTypeWaveform:
		return tr("Waveform");
	case kTypeVectorscope:
		return tr("Vectorscope");
	case kTypeHistogram:
		return tr("Histogram");
	case kTypeCount:
		break;
	}

	return QString();
}

void ScopePanel::SetViewerPanel(ViewerPanelBase *vp)
{
	if (viewer_ == vp) {
		return;
	}

	if (viewer_) {
		disconnect(viewer_, &ViewerPanelBase::TextureChanged, this,
				   &ScopePanel::SetReferenceBuffer);
		disconnect(viewer_, &ViewerPanelBase::ColorManagerChanged, this,
				   &ScopePanel::SetColorManager);
	}

	viewer_ = vp;

	if (viewer_) {
		// Connect viewer widget texture drawing to scope panel
		connect(viewer_, &ViewerPanelBase::TextureChanged, this,
				&ScopePanel::SetReferenceBuffer);
		connect(viewer_, &ViewerPanelBase::ColorManagerChanged, this,
				&ScopePanel::SetColorManager);

		SetColorManager(viewer_->GetColorManager());

		viewer_->UpdateTextureFromNode();
	} else {
		SetReferenceBuffer(nullptr);
		SetColorManager(nullptr);
	}
}

void ScopePanel::SetReferenceBuffer(TexturePtr frame)
{
	histogram_->SetBuffer(frame);
	vectorscope_->SetBuffer(frame);
	waveform_view_->SetBuffer(frame);
}

void ScopePanel::SetColorManager(ColorManager *manager)
{
	histogram_->ConnectColorManager(manager);
	vectorscope_->ConnectColorManager(manager);
	waveform_view_->ConnectColorManager(manager);
}

void ScopePanel::Retranslate()
{
	SetTitle(tr("Scopes"));

	for (int i = 0; i < ScopePanel::kTypeCount; i++) {
		scope_type_combobox_->setItemText(i, TypeToName(static_cast<Type>(i)));
	}
}

}
