/*
Copyright © 2017 Hasan Yavuz Özderya
This file is part of serialplot.
serialplot 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.
serialplot 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 serialplot. If not, see .
*/
#include "recordpanel.h"
#include "ui_recordpanel.h"
#include
#include
#include
#include
#include
#include
#include
RecordPanel::RecordPanel(QWidget *parent) :
QWidget(parent),
ui(new Ui::RecordPanel),
recordToolBar(tr("Record Toolbar")),
recordAction(QIcon::fromTheme("media-record"), tr("Record"), this),
recorder(this)
{
overwriteSelected = false;
ui->setupUi(this);
recordToolBar.setObjectName("tbRecord");
recordAction.setCheckable(true);
recordToolBar.addAction(&recordAction);
ui->pbRecord->setDefaultAction(&recordAction);
connect(ui->pbBrowse, &QPushButton::clicked,
this, &RecordPanel::selectFile);
connect(&recordAction, &QAction::triggered,
this, &RecordPanel::onRecord);
}
RecordPanel::~RecordPanel()
{
delete ui;
}
QToolBar* RecordPanel::toolbar()
{
return &recordToolBar;
}
bool RecordPanel::selectFile()
{
QString fileName = QFileDialog::getSaveFileName(
parentWidget(), tr("Select recording file"));
if (fileName.isEmpty())
{
return false;
}
else
{
selectedFile = fileName;
ui->lbFileName->setText(selectedFile);
overwriteSelected = QFile::exists(fileName);
return true;
}
}
void RecordPanel::onRecord(bool start)
{
if (!start)
{
stopRecording();
return;
}
// check file name
bool canceled = false;
if (selectedFile.isEmpty() && !selectFile())
{
canceled = true;
}
if (!overwriteSelected && QFile::exists(selectedFile))
{
if (ui->cbAutoIncrement->isChecked())
{
// TODO: should we increment even if user selected to replace?
canceled = !incrementFileName();
}
else
{
canceled = !confirmOverwrite(selectedFile);
}
}
overwriteSelected = false;
if (canceled)
{
recordAction.setChecked(false);
}
else
{
startRecording();
}
}
bool RecordPanel::incrementFileName(void)
{
QFileInfo fileInfo(selectedFile);
QString base = fileInfo.completeBaseName();
QRegularExpression regex("(.*?)(\\d+)(?!.*\\d)(.*)");
auto match = regex.match(base);
if (match.hasMatch())
{
bool ok;
int fileNum = match.captured(2).toInt(&ok);
base = match.captured(1) + QString::number(fileNum + 1) + match.captured(3);
}
else
{
base += "_1";
}
QString suffix = fileInfo.suffix();;
if (!suffix.isEmpty())
{
suffix = "." + suffix;
}
QString autoFileName = fileInfo.path() + "/" + base + suffix;
// check if auto generated file name exists, ask user another name
if (QFile::exists(autoFileName))
{
if (!confirmOverwrite(autoFileName))
{
return false;
}
}
else
{
selectedFile = autoFileName;
}
ui->lbFileName->setText(selectedFile);
return true;
}
bool RecordPanel::confirmOverwrite(QString fileName)
{
// prepare message box
QMessageBox mb(parentWidget());
mb.setWindowTitle(tr("File Already Exists"));
mb.setIcon(QMessageBox::Warning);
mb.setText(tr("File (%1) already exists. How to continue?").arg(fileName));
auto bCancel = mb.addButton(QMessageBox::Cancel);
auto bOverwrite = mb.addButton(tr("Overwrite"), QMessageBox::DestructiveRole);
mb.addButton(tr("Select Another File"), QMessageBox::YesRole);
mb.setEscapeButton(bCancel);
// show message box
mb.exec();
if (mb.clickedButton() == bCancel)
{
return false;
}
else if (mb.clickedButton() == bOverwrite)
{
selectedFile = fileName;
return true;
}
else // select button
{
return selectFile();
}
}
void RecordPanel::startRecording(void)
{
qDebug() << "start recording";
// TEST CODE
QStringList cn;
cn << "chan0" << "chan1" << "chan2";
recorder.startRecording(selectedFile, cn);
// add test data
double data[3] = {15., 15., 15.};
recorder.addData(data, 3, 3);
}
void RecordPanel::stopRecording(void)
{
// TODO
qDebug() << "stop recording";
recorder.stopRecording();
}