#include "main_widget.hpp"
#include <QDir>
#include <QFileDialog>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QMessageBox>
#include <QComboBox>
#include <cvb/image.hpp>
#include <cvb/device_factory.hpp>
#include <cvb/device.hpp>
#include <cvb/driver/driver.hpp>
#include <cvb/driver/stream.hpp>
#include <cvb/size_2d.hpp>
#include <cvb/movie2/recorder.hpp>
#include <cvb/movie2/recording_settings.hpp>
MainWidget::MainWidget()
: QWidget()
{
auto layout = new QGridLayout;
auto fileName = QDir::homePath() + QDir::separator() + "Documents" + QDir::separator() + "Movie2ExampleVideo.avi";
movieFile_ = new QLineEdit(fileName);
auto btnFileSelect = new QPushButton("Record to...");
QObject::connect(btnFileSelect, &QPushButton::clicked, [=]() {
auto file = QFileDialog::getSaveFileName(this, "Record Video", fileName, "Video Files (*.avi)");
if (file.isEmpty())
file = fileName;
movieFile_->setText(file);
});
imageView_->SetRenderEngine(Cvb::UI::RenderEngine::Raster);
imageView_->resize(800, 600);
QPushButton* openImgBtn = new QPushButton("Open Image");
QObject::connect(openImgBtn, &QPushButton::clicked, [=]()
{
auto driver = QFileDialog::getOpenFileName(this, "Load Image"
, "CVB Emulator Image Lists (*.emu);;CVB Drivers (*.vin);;Images (*.bmp *.png *.tif *.tiff *.jpg)");
Load(driver);
});
grabCheckBox_ = new QCheckBox("Grab");
QObject::connect(grabCheckBox_, &QCheckBox::stateChanged, [=](int state)
{
if (state == Qt::CheckState::Checked)
{
streamHandler_->Run();
assert(streamHandler_->IsActive());
}
else
{
bool wait = imageView_->IsWaitForRepaintEnabled();
if (wait)
imageView_->SetWaitForRepaintEnabled(!wait);
streamHandler_->Finish();
imageView_->SetWaitForRepaintEnabled(wait);
assert(!streamHandler_->IsActive());
}
});
auto recordCheckBox = new QCheckBox("Record");
QObject::connect(recordCheckBox, &QPushButton::clicked, [=]()
{
if (!recorder_)
{
Cvb::Movie2::RecorderPixelFormat::Mono, settings_);
}
else
{
recorder_.reset();
}
});
auto codecComboBox = new QComboBox();
auto codecs = settings_.AvailableCodecs();
for(const auto & codec : codecs)
layout->addWidget(btnFileSelect, 0, 0);
layout->addWidget(movieFile_, 0, 1);
layout->addWidget(openImgBtn, 0, 2);
layout->addWidget(grabCheckBox_, 0, 3);
layout->addWidget(recordCheckBox, 1, 2, 1, 2);
layout->addWidget(codecComboBox, 2, 2, 1, -1);
layout->addWidget(imageView_, 1, 0, 3, 2);
setLayout(layout);
}
void MainWidget::Load(const QString& driver)
{
QString fileName = driver;
if (fileName.isEmpty())
return;
if (fileName.contains(".emu", Qt::CaseInsensitive))
fileName = fileName.replace("/", "\\");
try
{
if (fileName.contains(".bmp", Qt::CaseInsensitive) || fileName.contains(".png", Qt::CaseInsensitive) || fileName.contains(".tif", Qt::CaseInsensitive) || fileName.contains(".jpg", Qt::CaseInsensitive))
{
imageView_->Refresh(image);
grabCheckBox_->setEnabled(false);
}
else
{
imageView_->Refresh(device->DeviceImage(), Cvb::UI::AutoRefresh::On);
streamHandler_ = CustomStreamHandler::Create(device->Stream(), *this);
grabCheckBox_->setEnabled(true);
}
}
catch (const std::exception& error)
{
QMessageBox::critical(this, "Error", QString(error.what()));
}
}
static std::shared_ptr< T > Open(const String &provider, AcquisitionStack acquisitionStack=AcquisitionStack::PreferVin)
static std::unique_ptr< Image > Load(const String &fileName)
static std::unique_ptr< Recorder > Create(const String &path, Size2D< int > size, RecorderPixelFormat pixelFormat, const RecordingSettings &settings)
void SetUploadMode(Cvb::UI::UploadMode uploadMode)
Cvb::String QtToCvb(const QString text) noexcept
QString CvbToQt(const Cvb::String &text) noexcept
std::shared_ptr< Image > ImagePtr