/* * Oak Video Editor - Non-Linear Video Editor * Copyright (C) 2025 Olive CE Team * * 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 . */ #include "scope.h" #include #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 histogram histogram_ = new HistogramScope(); stack_->addWidget(histogram_); connect( scope_type_combobox_, static_cast(&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 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); waveform_view_->SetBuffer(frame); } void ScopePanel::SetColorManager(ColorManager *manager) { histogram_->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(i))); } } }