Files @ 43e8dd7ce38b
Branch filter:

Location: tempo-plotter/src/recordpanel.cpp - annotation

Hasan Yavuz ÖZDERYA
moved auto increment checkbox to be under the file name
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
ab6bc6d4e2f6
24c9f6ea4d9d
24c9f6ea4d9d
fc149fc9db94
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
ab6bc6d4e2f6
e0c6c43cbcf5
4d2ac35fe823
ab6bc6d4e2f6
ab6bc6d4e2f6
e0c6c43cbcf5
4d2ac35fe823
fc149fc9db94
e0c6c43cbcf5
fc149fc9db94
4d2ac35fe823
ab6bc6d4e2f6
24c9f6ea4d9d
24c9f6ea4d9d
ab6bc6d4e2f6
ab6bc6d4e2f6
ab6bc6d4e2f6
ab6bc6d4e2f6
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
1f31600a1b32
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e70ba1409177
e70ba1409177
e70ba1409177
e70ba1409177
e70ba1409177
e70ba1409177
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
4d2ac35fe823
ab6bc6d4e2f6
ab6bc6d4e2f6
ab6bc6d4e2f6
ab6bc6d4e2f6
ab6bc6d4e2f6
24c9f6ea4d9d
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
e0c6c43cbcf5
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
fc149fc9db94
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
1f31600a1b32
24c9f6ea4d9d
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
24c9f6ea4d9d
24c9f6ea4d9d
1f31600a1b32
24c9f6ea4d9d
24c9f6ea4d9d
fc149fc9db94
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
1f31600a1b32
24c9f6ea4d9d
fc149fc9db94
fc149fc9db94
1f31600a1b32
fc149fc9db94
24c9f6ea4d9d
fc149fc9db94
fc149fc9db94
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
24c9f6ea4d9d
24c9f6ea4d9d
1f31600a1b32
1f31600a1b32
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
24c9f6ea4d9d
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
e969f6ecc779
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
fc149fc9db94
24c9f6ea4d9d
fc149fc9db94
24c9f6ea4d9d
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
1f31600a1b32
e969f6ecc779
e969f6ecc779
e969f6ecc779
1f31600a1b32
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
1f31600a1b32
e969f6ecc779
e969f6ecc779
e969f6ecc779
e969f6ecc779
1f31600a1b32
1f31600a1b32
1f31600a1b32
1bdd2654701b
b44879156c7c
e0c6c43cbcf5
e0c6c43cbcf5
1f31600a1b32
1f31600a1b32
1f31600a1b32
1f31600a1b32
e0c6c43cbcf5
e0c6c43cbcf5
1f31600a1b32
1bdd2654701b
1bdd2654701b
1bdd2654701b
1bdd2654701b
1bdd2654701b
1bdd2654701b
1bdd2654701b
1bdd2654701b
1bdd2654701b
/*
  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 <http://www.gnu.org/licenses/>.
*/

#include "recordpanel.h"
#include "ui_recordpanel.h"

#include <QIcon>
#include <QFile>
#include <QFileInfo>
#include <QMessageBox>
#include <QFileDialog>
#include <QRegularExpression>

#include <QtDebug>

RecordPanel::RecordPanel(DataRecorder* recorder, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RecordPanel),
    recordToolBar(tr("Record Toolbar")),
    recordAction(QIcon::fromTheme("media-record"), tr("Record"), this)
{
    overwriteSelected = false;
    _recorder = recorder;

    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);

    connect(ui->cbRecordPaused, SIGNAL(toggled(bool)),
            this, SIGNAL(recordPausedChanged(bool)));

    connect(ui->cbDisableBuffering, &QCheckBox::toggled,
            [this](bool enabled)
            {
                _recorder->disableBuffering = enabled;
            });
}

RecordPanel::~RecordPanel()
{
    delete ui;
}

QToolBar* RecordPanel::toolbar()
{
    return &recordToolBar;
}

bool RecordPanel::isRecording()
{
    return recordAction.isChecked();
}

bool RecordPanel::recordPaused()
{
    return ui->cbRecordPaused->isChecked();
}

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)
{
    // TODO: channel names
    QStringList cn;
    _recorder->startRecording(selectedFile, cn);
    emit recordStarted();
}

void RecordPanel::stopRecording(void)
{
    emit recordStopped();
    _recorder->stopRecording();
}

void RecordPanel::onPortClose()
{
    if (recordAction.isChecked() && ui->cbStopOnClose->isChecked())
    {
        stopRecording();
        recordAction.setChecked(false);
    }
}