diff --git a/src/recordpanel.cpp b/src/recordpanel.cpp --- a/src/recordpanel.cpp +++ b/src/recordpanel.cpp @@ -23,7 +23,11 @@ #include #include #include +#include +#include +#include #include +#include #include "recordpanel.h" #include "ui_recordpanel.h" @@ -71,6 +75,12 @@ RecordPanel::RecordPanel(Stream* stream, connect(&recordAction, &QAction::toggled, ui->cbTimestamp, &QWidget::setDisabled); connect(&recordAction, &QAction::toggled, ui->leSeparator, &QWidget::setDisabled); connect(&recordAction, &QAction::toggled, ui->pbBrowse, &QWidget::setDisabled); + + QCompleter *completer = new QCompleter(this); + // TODO: QDirModel is deprecated, use QFileSystemModel (but it doesn't work) + completer->setModel(new QDirModel(completer)); + completer->setCaseSensitivity(Qt::CaseInsensitive); + ui->leFileName->setCompleter(completer); } RecordPanel::~RecordPanel() @@ -99,13 +109,75 @@ bool RecordPanel::selectFile() } else { - selectedFile = fileName; - ui->lbFileName->setText(selectedFile); + setSelectedFile(fileName); overwriteSelected = QFile::exists(fileName); return true; } } +QString RecordPanel::selectedFile() const +{ + return ui->leFileName->text(); +} + +void RecordPanel::setSelectedFile(QString f) +{ + ui->leFileName->setText(f); +} + +QString RecordPanel::getSelectedFile() +{ + if (selectedFile().isEmpty()) + { + if (!selectFile()) return QString(); + } + + // assume that file name contains a time format specifier + if (selectedFile().contains("%")) + { + auto ts = formatTimeStamp(selectedFile()); + if (!QFile::exists(ts) || // file doesn't exists + confirmOverwrite(ts)) // exists but user accepted overwrite + { + return ts; + } + return QString(); + } + + // if no timestamp and file exists try autoincrement option + if (!overwriteSelected && QFile::exists(selectedFile())) + { + if (ui->cbAutoIncrement->isChecked()) + { + if (!incrementFileName()) return QString(); + } + else + { + if (!confirmOverwrite(selectedFile())) + return QString(); + } + } + + return selectedFile(); +} + +QString RecordPanel::formatTimeStamp(QString t) const +{ + auto maxSize = t.size() + 1024; + auto r = new char[maxSize]; + + time_t rawtime; + struct tm * timeinfo; + + time(&rawtime); + timeinfo = localtime (&rawtime); + strftime(r, maxSize, t.toLatin1().data(), timeinfo); + + auto rs = QString(r); + delete r; + return rs; +} + void RecordPanel::onRecord(bool start) { if (!start) @@ -124,22 +196,11 @@ void RecordPanel::onRecord(bool start) } // check file name - if (!canceled && selectedFile.isEmpty() && !selectFile()) - { - canceled = true; - } - - if (!canceled && !overwriteSelected && QFile::exists(selectedFile)) + QString fn; + if (!canceled) { - if (ui->cbAutoIncrement->isChecked()) - { - // TODO: should we increment even if user selected to replace? - canceled = !incrementFileName(); - } - else - { - canceled = !confirmOverwrite(selectedFile); - } + fn = getSelectedFile(); + canceled = fn.isEmpty(); } if (canceled) @@ -149,13 +210,13 @@ void RecordPanel::onRecord(bool start) else { overwriteSelected = false; - startRecording(); + startRecording(fn); } } bool RecordPanel::incrementFileName(void) { - QFileInfo fileInfo(selectedFile); + QFileInfo fileInfo(selectedFile()); QString base = fileInfo.completeBaseName(); QRegularExpression regex("(.*?)(\\d+)(?!.*\\d)(.*)"); @@ -190,10 +251,9 @@ bool RecordPanel::incrementFileName(void } else { - selectedFile = autoFileName; + setSelectedFile(autoFileName); } - ui->lbFileName->setText(selectedFile); return true; } @@ -220,7 +280,7 @@ bool RecordPanel::confirmOverwrite(QStri } else if (mb.clickedButton() == bOverwrite) { - selectedFile = fileName; + setSelectedFile(fileName); return true; } else // select button @@ -229,14 +289,14 @@ bool RecordPanel::confirmOverwrite(QStri } } -void RecordPanel::startRecording(void) +void RecordPanel::startRecording(QString fileName) { QStringList channelNames; if (ui->cbHeader->isChecked()) { channelNames = _stream->infoModel()->channelNames(); } - if (recorder.startRecording(selectedFile, getSeparator(), + if (recorder.startRecording(fileName, getSeparator(), channelNames, ui->cbTimestamp->isChecked())) { _stream->connectFollower(&recorder); diff --git a/src/recordpanel.h b/src/recordpanel.h --- a/src/recordpanel.h +++ b/src/recordpanel.h @@ -62,7 +62,6 @@ private: Ui::RecordPanel *ui; QToolBar recordToolBar; QAction recordAction; - QString selectedFile; bool overwriteSelected; DataRecorder recorder; Stream* _stream; @@ -90,7 +89,26 @@ private: */ bool confirmOverwrite(QString fileName); - void startRecording(void); + /// Returns filename in edit box. May be invalid! + QString selectedFile() const; + /// Sets the filename in edit box. + void setSelectedFile(QString f); + + /** + * Tries to get a valid file name by handling user interactions and + * automatic naming (increment, timestamp etc). + * + * Returned file name can be used immediately. File name box should also be + * set to selected file name. + * + * @return empty if failure otherwise valid filename + */ + QString getSelectedFile(); + + /// Formats timestamp in given text + QString formatTimeStamp(QString t) const; + + void startRecording(QString fileName); void stopRecording(void); /// Returns separator text from ui. "\t" is converted to TAB diff --git a/src/recordpanel.ui b/src/recordpanel.ui --- a/src/recordpanel.ui +++ b/src/recordpanel.ui @@ -19,6 +19,22 @@ + + + + 0 + 0 + + + + You can use C `strftime` function format specifiers for timestamps in your file name. + + + Enter file name or browse + + + + Select record file @@ -28,19 +44,6 @@ - - - - - 0 - 0 - - - - Select file... - - -