wip settings
This commit is contained in:
parent
52b44a4d7c
commit
333d7c7b49
11 changed files with 215 additions and 77 deletions
|
@ -167,12 +167,44 @@ void CueTrackWidget::setupStatusCombo() {
|
||||||
statusCombo->addItem("PlayingFolderRandom", PlayingFolderRandom);
|
statusCombo->addItem("PlayingFolderRandom", PlayingFolderRandom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CueTrackWidget::loadCueTrack(const CueTrack &cueTrack) {
|
||||||
|
filePathEdit->setText(QString::fromStdString(cueTrack.filePath));
|
||||||
|
volumeSpin->setValue(cueTrack.volume);
|
||||||
|
panSpin->setValue(cueTrack.pan);
|
||||||
|
pitchSpin->setValue(cueTrack.pitch);
|
||||||
|
bus1Spin->setValue(cueTrack.bus1);
|
||||||
|
bus2Spin->setValue(cueTrack.bus2);
|
||||||
|
fadeInSpin->setValue(cueTrack.fadeIn);
|
||||||
|
fadeOutSpin->setValue(cueTrack.fadeOut);
|
||||||
|
waitInSpin->setValue(cueTrack.waitIn);
|
||||||
|
waitOutSpin->setValue(cueTrack.waitOut);
|
||||||
|
stopAtEndCheck->setChecked(cueTrack.stopAtEnd);
|
||||||
|
nameEdit->setText(QString::fromStdString(cueTrack.name));
|
||||||
|
descriptionEdit->setText(QString::fromStdString(cueTrack.description));
|
||||||
|
userNumberSpin->setValue(cueTrack.userNumber);
|
||||||
|
entryPointSpin->setValue(cueTrack.entryPoint);
|
||||||
|
exitPointSpin->setValue(cueTrack.exitPoint);
|
||||||
|
statusCombo->setCurrentIndex(statusCombo->findData(cueTrack.status));
|
||||||
|
}
|
||||||
|
|
||||||
CueTrack CueTrackWidget::saveCueTrack() const {
|
CueTrack CueTrackWidget::saveCueTrack() const {
|
||||||
CueTrack cueTrack;
|
CueTrack cueTrack;
|
||||||
cueTrack.filePath = filePathEdit->text().toStdString();
|
cueTrack.filePath = filePathEdit->text().toStdString();
|
||||||
cueTrack.volume = volumeSpin->value();
|
cueTrack.volume = volumeSpin->value();
|
||||||
// Guarda el resto de los campos aquí...
|
cueTrack.pan = panSpin->value();
|
||||||
|
cueTrack.pitch = pitchSpin->value();
|
||||||
|
cueTrack.bus1 = bus1Spin->value();
|
||||||
|
cueTrack.bus2 = bus2Spin->value();
|
||||||
|
cueTrack.fadeIn = fadeInSpin->value();
|
||||||
|
cueTrack.fadeOut = fadeOutSpin->value();
|
||||||
|
cueTrack.waitIn = waitInSpin->value();
|
||||||
|
cueTrack.waitOut = waitOutSpin->value();
|
||||||
|
cueTrack.stopAtEnd = stopAtEndCheck->isChecked();
|
||||||
|
cueTrack.name = nameEdit->text().toStdString();
|
||||||
|
cueTrack.description = descriptionEdit->text().toStdString();
|
||||||
|
cueTrack.userNumber = userNumberSpin->value();
|
||||||
|
cueTrack.entryPoint = entryPointSpin->value();
|
||||||
|
cueTrack.exitPoint = exitPointSpin->value();
|
||||||
cueTrack.status = static_cast<Status>(statusCombo->currentData().toInt());
|
cueTrack.status = static_cast<Status>(statusCombo->currentData().toInt());
|
||||||
return cueTrack;
|
return cueTrack;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,13 @@ class CueTrackWidget : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CueTrackWidget(QWidget *parent = nullptr);
|
|
||||||
|
|
||||||
CueTrack saveCueTrack() const;
|
|
||||||
QWidget *createHeader();
|
|
||||||
int audioLayer = 0;
|
int audioLayer = 0;
|
||||||
|
|
||||||
|
explicit CueTrackWidget(QWidget *parent = nullptr);
|
||||||
|
CueTrack saveCueTrack() const;
|
||||||
|
void loadCueTrack(const CueTrack &cueTrack);
|
||||||
|
QWidget *createHeader();
|
||||||
|
|
||||||
int getVolume() const { return volumeSpin->value(); }
|
int getVolume() const { return volumeSpin->value(); }
|
||||||
int getPan() const { return panSpin->value(); }
|
int getPan() const { return panSpin->value(); }
|
||||||
int getPitch() const { return pitchSpin->value(); }
|
int getPitch() const { return pitchSpin->value(); }
|
||||||
|
@ -39,13 +40,10 @@ public:
|
||||||
int getEntryPoint() const { return entryPointSpin->value(); }
|
int getEntryPoint() const { return entryPointSpin->value(); }
|
||||||
int getExitPoint() const { return exitPointSpin->value(); }
|
int getExitPoint() const { return exitPointSpin->value(); }
|
||||||
void highlight(bool highlight) {
|
void highlight(bool highlight) {
|
||||||
if (highlight)
|
if (highlight) this->setStyleSheet("background-color: yellow;");
|
||||||
this->setStyleSheet("background-color: yellow;");
|
else this->setStyleSheet("background-color: white;");
|
||||||
else
|
|
||||||
this->setStyleSheet("background-color: white;");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
QCheckBox* active;
|
QCheckBox* active;
|
||||||
QLineEdit* filePathEdit;
|
QLineEdit* filePathEdit;
|
||||||
QSpinBox* volumeSpin;
|
QSpinBox* volumeSpin;
|
||||||
|
@ -65,6 +63,7 @@ private:
|
||||||
QSpinBox* entryPointSpin;
|
QSpinBox* entryPointSpin;
|
||||||
QSpinBox* exitPointSpin;
|
QSpinBox* exitPointSpin;
|
||||||
|
|
||||||
|
private:
|
||||||
void setupUi();
|
void setupUi();
|
||||||
void setupStatusCombo();
|
void setupStatusCombo();
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
libreMediaServerAudio::libreMediaServerAudio()
|
libreMediaServerAudio::libreMediaServerAudio()
|
||||||
{
|
{
|
||||||
m_settings = Settings::getInstance();
|
m_settings = Settings::getInstance(this);
|
||||||
m_settings->readFile();
|
m_settings->readFile();
|
||||||
m_ui = m_settings->getShowUi();
|
m_ui = m_settings->getShowUi();
|
||||||
m_layersQty = m_settings->getLayersNumber();
|
m_layersQty = m_settings->getLayersNumber();
|
||||||
|
|
|
@ -31,8 +31,12 @@ bool hasUi(int &argc, char *argv[])
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
libreMediaServerAudio lms;
|
libreMediaServerAudio lms;
|
||||||
|
app.setApplicationName("LibreMediaServerAudio");
|
||||||
|
app.setOrganizationName("Criptomart");
|
||||||
|
app.setOrganizationDomain("Criptomart.net");
|
||||||
|
app.setApplicationVersion(VERSION);
|
||||||
#ifndef NOGUI
|
#ifndef NOGUI
|
||||||
if (hasUi(argc, argv) || lms.getShowUi())
|
if (hasUi(argc, argv) || lms.getShowUi())
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,20 +2,82 @@
|
||||||
|
|
||||||
Settings *Settings::_instance = 0;
|
Settings *Settings::_instance = 0;
|
||||||
|
|
||||||
Settings *Settings::getInstance() {
|
Settings *Settings::getInstance(QObject *parent) {
|
||||||
|
|
||||||
if (_instance == 0) {
|
if (_instance == 0) {
|
||||||
_instance = new Settings();
|
_instance = new Settings(parent);
|
||||||
Q_CHECK_PTR(_instance);
|
Q_CHECK_PTR(_instance);
|
||||||
}
|
}
|
||||||
return _instance;
|
return _instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings::Settings(QObject *parent) :
|
Settings::Settings(QObject *parent) :
|
||||||
QObject(parent)
|
QSettings{parent}
|
||||||
{
|
{
|
||||||
m_layersNumber = 0;
|
m_layersNumber = 0;
|
||||||
m_ui = false;
|
m_ui = false;
|
||||||
|
m_audioDeviceQty = 0;
|
||||||
|
for (uint i = 0; i < MAX_AUDIODEVICES; i++)
|
||||||
|
m_audioDeviceId[i] = -1;
|
||||||
|
settingsLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings::~Settings() {
|
||||||
|
settingsSaver();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Settings::settingsLoader()
|
||||||
|
{
|
||||||
|
beginGroup("lmsAudio");
|
||||||
|
m_ui = value("ui", 0).toBool();
|
||||||
|
m_layersNumber = value("layersNumber", 0).toInt();
|
||||||
|
m_pathmedia = value("path", "").toString();
|
||||||
|
endGroup();
|
||||||
|
beginGroup("audioDevice");
|
||||||
|
m_audioDeviceQty = value("devicesNumber", 0).toInt();
|
||||||
|
for (uint i = 0; i < m_audioDeviceQty; i++)
|
||||||
|
m_audioDeviceId[i] = value(QString("id%1").arg(i), -1).toInt();
|
||||||
|
endGroup();
|
||||||
|
beginGroup("layers");
|
||||||
|
for (int i = 0; i < m_layersNumber; i++) {
|
||||||
|
beginGroup(QString("layer%1").arg(i));
|
||||||
|
dmxSetting temp;
|
||||||
|
temp.address = value("dmx", 0).toInt();
|
||||||
|
temp.universe = value("universe", 0).toInt();
|
||||||
|
temp.layer = value("id", 0).toInt();
|
||||||
|
temp.audioDevice = value("audioDevice", 0).toInt();
|
||||||
|
m_settings.append(temp);
|
||||||
|
if (!m_universe.contains(temp.universe)) {
|
||||||
|
m_universe.insert(temp.universe);
|
||||||
|
}
|
||||||
|
endGroup();
|
||||||
|
}
|
||||||
|
endGroup();
|
||||||
|
printSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Settings::settingsSaver()
|
||||||
|
{
|
||||||
|
beginGroup("lmsAudio");
|
||||||
|
setValue("ui", m_ui);
|
||||||
|
setValue("layersNumber", m_layersNumber);
|
||||||
|
setValue("path", m_pathmedia);
|
||||||
|
endGroup();
|
||||||
|
beginGroup("audioDevice");
|
||||||
|
setValue("devicesNumber", m_audioDeviceQty);
|
||||||
|
for (uint i = 0; i < m_audioDeviceQty; i++)
|
||||||
|
setValue(QString("id%1").arg(i), m_audioDeviceId[i]);
|
||||||
|
endGroup();
|
||||||
|
beginGroup("layers");
|
||||||
|
for (int i = 0; i < m_layersNumber; i++) {
|
||||||
|
beginGroup(QString("layer%1").arg(i));
|
||||||
|
setValue("dmx", m_settings[i].address);
|
||||||
|
setValue("universe", m_settings[i].universe);
|
||||||
|
setValue("id", m_settings[i].layer);
|
||||||
|
setValue("audioDevice", m_settings[i].audioDevice);
|
||||||
|
endGroup();
|
||||||
|
}
|
||||||
|
endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the dmx settings for dmx.xml At the moment we need:
|
// Read the dmx settings for dmx.xml At the moment we need:
|
||||||
|
|
|
@ -6,20 +6,23 @@
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
#include "medialibrary.h"
|
#include "medialibrary.h"
|
||||||
#include "audiowidget.h"
|
#include "audiowidget.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
|
|
||||||
class Settings : public QObject
|
class Settings : public QSettings
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Settings(QObject *parent = 0);
|
Settings(QObject *parent = nullptr);
|
||||||
static Settings *getInstance();
|
~Settings();
|
||||||
|
static Settings *getInstance(QObject *parent = nullptr);
|
||||||
inline QSet<int> getUniverses() { return m_universe; }
|
inline QSet<int> getUniverses() { return m_universe; }
|
||||||
inline QString getPathMedia() { return m_pathmedia; }
|
inline QString getPathMedia() { return m_pathmedia; }
|
||||||
|
inline void setPathMedia(QString new_path) { m_pathmedia = new_path; };
|
||||||
inline QList<dmxSetting> getDmxSettings() { return m_settings; }
|
inline QList<dmxSetting> getDmxSettings() { return m_settings; }
|
||||||
inline int getLayersNumber() { return m_layersNumber; }
|
inline int getLayersNumber() { return m_layersNumber; }
|
||||||
inline uint *getAudioDeviceId() { return m_audioDeviceId; }
|
inline uint *getAudioDeviceId() { return m_audioDeviceId; }
|
||||||
|
@ -28,6 +31,8 @@ public:
|
||||||
void readFile();
|
void readFile();
|
||||||
void readFromFile(QString file);
|
void readFromFile(QString file);
|
||||||
void printSettings();
|
void printSettings();
|
||||||
|
void settingsLoader();
|
||||||
|
void settingsSaver();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static Settings *_instance;
|
static Settings *_instance;
|
||||||
|
|
|
@ -1,47 +1,5 @@
|
||||||
#include "showplayer.h"
|
#include "showplayer.h"
|
||||||
|
|
||||||
QWidget *ShowPlayer::createHeader()
|
|
||||||
{
|
|
||||||
QWidget *ret = new QWidget();
|
|
||||||
|
|
||||||
auto layout = new QHBoxLayout(this);
|
|
||||||
QLabel *l = new QLabel("Cue Number");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("File Path");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Volume");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Bus 1");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Bus 2");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Pan");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Pitch");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Playback Status");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Fade In");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Fade Out");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Wait In");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Wait Out ");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Halt");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Name");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Notes");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Entry Point");
|
|
||||||
layout->addWidget(l);
|
|
||||||
l = new QLabel("Exit Point");
|
|
||||||
layout->addWidget(l);
|
|
||||||
ret->setLayout(layout);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShowPlayer::ShowPlayer(QWidget *parent) :
|
ShowPlayer::ShowPlayer(QWidget *parent) :
|
||||||
QDialog(parent)
|
QDialog(parent)
|
||||||
|
@ -50,9 +8,7 @@ ShowPlayer::ShowPlayer(QWidget *parent) :
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
connect(ui->addCueButton, SIGNAL(clicked()), this, SLOT(onAddTrack()));
|
connect(ui->addCueButton, SIGNAL(clicked()), this, SLOT(onAddTrack()));
|
||||||
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go()));
|
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go()));
|
||||||
QWidget *w = createHeader();
|
currentTrackIndex = 0;
|
||||||
ui->headerLayout->addWidget(w);
|
|
||||||
currentTrackIndex = 0;
|
|
||||||
filesLoaded = 0;
|
filesLoaded = 0;
|
||||||
currentStatus = Status::Iddle;
|
currentStatus = Status::Iddle;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,6 @@ private:
|
||||||
size_t filesLoaded = 0;
|
size_t filesLoaded = 0;
|
||||||
int layersUsed[MAX_LAYERS] = { -1 };
|
int layersUsed[MAX_LAYERS] = { -1 };
|
||||||
|
|
||||||
QWidget *createHeader();
|
|
||||||
|
|
||||||
void updateTrackStateInEngine(size_t index, int layer) {
|
void updateTrackStateInEngine(size_t index, int layer) {
|
||||||
CueTrackWidget *track = ui->cueListWidget->getTrackAtIndex(index);
|
CueTrackWidget *track = ui->cueListWidget->getTrackAtIndex(index);
|
||||||
emit uiSliderChanged(layer, Slider::Volume, track->getVolume());
|
emit uiSliderChanged(layer, Slider::Volume, track->getVolume());
|
||||||
|
|
|
@ -117,16 +117,6 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="horizontalLayoutWidget_2">
|
|
||||||
<layout class="QHBoxLayout" name="headerLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetMaximumSize</enum>
|
|
||||||
</property>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="CueTrackListWidget" name="cueListWidget" native="true">
|
<widget class="CueTrackListWidget" name="cueListWidget" native="true">
|
||||||
<property name="enabled">
|
<property name="enabled">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
|
58
src/trackdialog.cpp
Normal file
58
src/trackdialog.cpp
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
#include "trackdialog.h"
|
||||||
|
#include "settings.h"
|
||||||
|
|
||||||
|
TrackDialog::TrackDialog(QWidget *parent) : QDialog(parent) {
|
||||||
|
setupUi();
|
||||||
|
connectSignals();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackDialog::setupUi() {
|
||||||
|
okButton = new QPushButton(tr("OK"), this);
|
||||||
|
cancelButton = new QPushButton(tr("Cancelar"), this);
|
||||||
|
browseButton = new QPushButton(tr("Buscar..."), this);
|
||||||
|
|
||||||
|
QFormLayout *layout = new QFormLayout(this);
|
||||||
|
track = new CueTrack();
|
||||||
|
layout->addRow(tr("&User number"), track->userNumber);
|
||||||
|
layout->addRow(tr("&Name"), track->name);
|
||||||
|
layout->addRow(tr("&Description"), track->description);
|
||||||
|
layout->addRow(tr("&File"), track->filePath);
|
||||||
|
layout->addRow(tr("&Browse files"), browseButton);
|
||||||
|
layout->addRow(tr("&Status"), track->status);
|
||||||
|
layout->addRow(tr("&Fade in"), track->fadeIn);
|
||||||
|
layout->addRow(tr("Fade &Out"), track->fadeOut);
|
||||||
|
layout->addRow(tr("&Wait In"), track->waitIn);
|
||||||
|
layout->addRow(tr("&Wait Ou&t"), track->waitOut);
|
||||||
|
layout->addRow(tr("Sto&p at end"), track->stopAtEnd);
|
||||||
|
layout->addRow(tr("&Volume"), track->volume);
|
||||||
|
layout->addRow(tr("pan"), track->pan);
|
||||||
|
layout->addRow(tr("pitch"), track->pitch);
|
||||||
|
layout->addRow(tr("Bus&1"), track->bus1);
|
||||||
|
layout->addRow(tr("Bus&2"), track->bus2);
|
||||||
|
layout->addRow(tr("&Entry Point"), track->entryPoint);
|
||||||
|
layout->addRow(tr("E&xit Point"), track->exitPoint);
|
||||||
|
layout->addWidget(okButton);
|
||||||
|
layout->addWidget(cancelButton);
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TrackDialog::connectSignals() {
|
||||||
|
connect(okButton, &QPushButton::clicked, this, &TrackDialog::accept);
|
||||||
|
connect(cancelButton, &QPushButton::clicked, this, &TrackDialog::reject);
|
||||||
|
connect(browseButton, &QPushButton::clicked, this, &TrackDialog::browseFiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TrackDialog::browseFiles() const {
|
||||||
|
QString filePath = QFileDialog::getOpenFileName(
|
||||||
|
const_cast<TrackDialog*>(this),
|
||||||
|
tr("Select File"),
|
||||||
|
Settings::getInstance()->getPathMedia(),
|
||||||
|
tr("Archivos de audio (*.mp3 *.wav *.flac);;Todos los archivos (*)")
|
||||||
|
);
|
||||||
|
if (!filePath.isEmpty()) {
|
||||||
|
track->setFilePath(filePath);
|
||||||
|
QDir dir;
|
||||||
|
Settings::getInstance()->setPathMedia(dir.absoluteFilePath(filePath));
|
||||||
|
}
|
||||||
|
return filePath;
|
||||||
|
}
|
34
src/trackdialog.h
Normal file
34
src/trackdialog.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef TRACKDIALOG_H
|
||||||
|
#define TRACKDIALOG_H
|
||||||
|
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QFormLayout>
|
||||||
|
#include <QFileDialog>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "cuetrackwidget.h"
|
||||||
|
|
||||||
|
class TrackDialog : public QDialog {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
CueTrack *track;
|
||||||
|
|
||||||
|
explicit TrackDialog(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPushButton *okButton;
|
||||||
|
QPushButton *cancelButton;
|
||||||
|
QPushButton *browseButton;
|
||||||
|
|
||||||
|
void setupUi();
|
||||||
|
void connectSignals();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
QString browseFiles() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Reference in a new issue