Skip to content

Commit

Permalink
fix #115846: load multiple sfz at once
Browse files Browse the repository at this point in the history
  • Loading branch information
hpfmn authored and lasconic committed Jun 22, 2016
1 parent 79f05eb commit 9f86a9a
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 43 deletions.
91 changes: 51 additions & 40 deletions zerberus/zerberusgui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,18 @@ SfzListDialog::SfzListDialog(QWidget* parent)
setWindowTitle(tr("SFZ Files"));
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
list = new QListWidget;
list->setSelectionMode(QAbstractItemView::ExtendedSelection);
okButton = new QPushButton;
cancelButton = new QPushButton;
okButton->setText(tr("Load"));
cancelButton->setText(tr("Cancel"));
QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(list);
layout->addWidget(okButton);
layout->addWidget(cancelButton);
setLayout(layout);
connect(list, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(itemSelected(QListWidgetItem*)));
connect(okButton, SIGNAL(clicked()), SLOT(okClicked()));
connect(cancelButton, SIGNAL(clicked()), SLOT(cancelClicked()));
}

//---------------------------------------------------------
Expand All @@ -43,35 +51,24 @@ void SfzListDialog::add(const QString& name, const QString& path)
}

//---------------------------------------------------------
// itemSelected
// okClicked
//---------------------------------------------------------

void SfzListDialog::itemSelected(QListWidgetItem* item)
void SfzListDialog::okClicked()
{
_idx = list->row(item);
for (auto item : list->selectedItems()) {
_namePaths.push_back({item->text(), item->data(Qt::UserRole).toString()});
}
accept();
}

//---------------------------------------------------------
// name
//---------------------------------------------------------

QString SfzListDialog::name()
{
if (_idx == -1)
return QString();
return list->item(_idx)->text();
}

//---------------------------------------------------------
// path
// cancelClicked
//---------------------------------------------------------

QString SfzListDialog::path()
void SfzListDialog::cancelClicked()
{
if (_idx == -1)
return QString();
return list->item(_idx)->data(Qt::UserRole).toString();
reject();
}

//---------------------------------------------------------
Expand Down Expand Up @@ -147,30 +144,21 @@ QFileInfoList Zerberus::sfzFiles()
return l;
}

//---------------------------------------------------------
// addClicked
//---------------------------------------------------------

void ZerberusGui::addClicked()
{
zerberus()->setLoadWasCanceled(false);

QFileInfoList l = Zerberus::sfzFiles();
void ZerberusGui::loadSfz() {

SfzListDialog ld(this);
foreach (const QFileInfo& fi, l)
ld.add(fi.fileName(), fi.absoluteFilePath());
if (!ld.exec())
if (_sfzToLoad.empty())
return;

QString sfName = ld.name();
QString sfPath = ld.path();
struct SfzNamePath item = _sfzToLoad.back();
QString sfName = item.name;
QString sfPath = item.path;
_sfzToLoad.pop_back();

QStringList sl;
for (int i = 0; i < files->count(); ++i) {
QListWidgetItem* item = files->item(i);
sl.append(item->text());
}
QStringList sl;
for (int i = 0; i < files->count(); ++i) {
QListWidgetItem* item = files->item(i);
sl.append(item->text());
}

if (sl.contains(sfPath)) {
QMessageBox::warning(this,
Expand All @@ -187,6 +175,28 @@ void ZerberusGui::addClicked()
}
}

//---------------------------------------------------------
// addClicked
//---------------------------------------------------------

void ZerberusGui::addClicked()
{
zerberus()->setLoadWasCanceled(false);

QFileInfoList l = Zerberus::sfzFiles();

SfzListDialog ld(this);
foreach (const QFileInfo& fi, l)
ld.add(fi.fileName(), fi.absoluteFilePath());
if (!ld.exec())
return;

for (auto item : ld.getNamePaths()) {
_sfzToLoad.push_back(item);
}
loadSfz();
}

//---------------------------------------------------------
// cancelLoad
//---------------------------------------------------------
Expand Down Expand Up @@ -238,6 +248,7 @@ void ZerberusGui::onSoundFontLoaded()
tr("MuseScore"),
tr("Cannot load SoundFont %1").arg(_loadedSfPath));
}
loadSfz();
}

//---------------------------------------------------------
Expand Down
16 changes: 13 additions & 3 deletions zerberus/zerberusgui.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,30 @@

class QProgressDialog;

struct SfzNamePath {
QString name;
QString path;
};

//---------------------------------------------------------
// SfzListDialog
//---------------------------------------------------------

class SfzListDialog : public QDialog {
Q_OBJECT
int _idx = -1;
std::vector<struct SfzNamePath> _namePaths;
QListWidget* list;
QPushButton* okButton;
QPushButton* cancelButton;

private slots:
void itemSelected(QListWidgetItem*);
void okClicked();
void cancelClicked();

public:
SfzListDialog(QWidget* parent = 0);
QString name();
QString path();
std::vector<struct SfzNamePath> getNamePaths() { return _namePaths; }
void add(const QString& name, const QString& path);
};

Expand All @@ -50,6 +58,8 @@ class ZerberusGui : public Ms::SynthesizerGui, Ui::ZerberusGui {
QString _loadedSfName;
QProgressDialog* _progressDialog;
QTimer * _progressTimer;
std::vector<struct SfzNamePath> _sfzToLoad;
void loadSfz();

private slots:
void addClicked();
Expand Down

0 comments on commit 9f86a9a

Please sign in to comment.