diff options
Diffstat (limited to 'qmidiplayer-desktop')
-rw-r--r-- | qmidiplayer-desktop/CMakeLists.txt | 3 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpchannelswindow.cpp | 25 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpdeviceprioritydialog.cpp | 98 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpdeviceprioritydialog.hpp | 32 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpdeviceprioritydialog.ui | 85 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmphelpwindow.hpp | 2 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpmainwindow.cpp | 9 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpmainwindow.hpp | 1 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpsettingswindow.cpp | 33 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpsettingswindow.hpp | 9 | ||||
-rw-r--r-- | qmidiplayer-desktop/qmpsettingswindow.ui | 63 |
11 files changed, 295 insertions, 65 deletions
diff --git a/qmidiplayer-desktop/CMakeLists.txt b/qmidiplayer-desktop/CMakeLists.txt index 1f40a2e..9b488e2 100644 --- a/qmidiplayer-desktop/CMakeLists.txt +++ b/qmidiplayer-desktop/CMakeLists.txt @@ -3,6 +3,7 @@ set(qmpdesktop_SOURCES qmpchanneleditor.hpp qmpchannelswindow.hpp qmpcustomizewindow.hpp + qmpdeviceprioritydialog.hpp qmpdevpropdialog.hpp qmpefxwindow.hpp qmphelpwindow.hpp @@ -17,6 +18,7 @@ set(qmpdesktop_SOURCES qmpchanneleditor.cpp qmpchannelswindow.cpp qmpcustomizewindow.cpp + qmpdeviceprioritydialog.cpp qmpdevpropdialog.cpp qmpefxwindow.cpp qmphelpwindow.cpp @@ -29,6 +31,7 @@ set(qmpdesktop_SOURCES qmpchanneleditor.ui qmpchannelswindow.ui qmpcustomizewindow.ui + qmpdeviceprioritydialog.ui qmpdevpropdialog.ui qmpefxwindow.ui qmphelpwindow.ui diff --git a/qmidiplayer-desktop/qmpchannelswindow.cpp b/qmidiplayer-desktop/qmpchannelswindow.cpp index 0c34239..029daff 100644 --- a/qmidiplayer-desktop/qmpchannelswindow.cpp +++ b/qmidiplayer-desktop/qmpchannelswindow.cpp @@ -1,5 +1,6 @@ #include <cstdio> #include <functional> +#include <set> #include <QCheckBox> #include <QPushButton> #include <QComboBox> @@ -256,27 +257,23 @@ qmpChannelsWindow::qmpChannelsWindow(QWidget *parent) : ,nullptr); std::vector<std::string> devs=qmpMainWindow::getInstance()->getPlayer()->getMidiOutDevices(); size_t devc=devs.size(); - //We setup default output here... - //Pretty strange... - for(size_t i=0;i<devc;++i) - { - qmpSettingsWindow::getDefaultOutWidget()->addItem(devs[i].c_str()); - if(!QString(devs[i].c_str()).compare(qmpSettingsWindow::getSettingsIntf()-> - value("Midi/DefaultOutput","Internal FluidSynth").toString())) - qmpSettingsWindow::getDefaultOutWidget()->setCurrentIndex(i); - } + std::set<std::string> devset; + for(auto dev:devs)devset.insert(dev); + std::string selecteddev; + for(auto setdev:qmpSettingsWindow::getSettingsIntf()->value("Midi/DevicePriority",QList<QVariant>{"Internal FluidSynth"}).toList()) + if(devset.find(setdev.toString().toStdString())!=devset.end()) + { + selecteddev=setdev.toString().toStdString(); + break; + } for(int ch=0;ch<16;++ch) { for(size_t j=0;j<devc;++j) { - if(!qmpSettingsWindow::getSettingsIntf()-> - value("Midi/DefaultOutput","Internal FluidSynth").toString().compare( - QString(devs[j].c_str()))) + if(selecteddev==devs[j]) qmpMainWindow::getInstance()->getPlayer()->setChannelOutput(ch,j); } } - qmpSettingsWindow::getSettingsIntf()->setValue("Midi/DefaultOutput", - qmpSettingsWindow::getDefaultOutWidget()->currentText()); qmpMainWindow::getInstance()->registerFunctionality( chnlf=new qmpChannelFunc(this), std::string("Channel"), diff --git a/qmidiplayer-desktop/qmpdeviceprioritydialog.cpp b/qmidiplayer-desktop/qmpdeviceprioritydialog.cpp new file mode 100644 index 0000000..a319fd1 --- /dev/null +++ b/qmidiplayer-desktop/qmpdeviceprioritydialog.cpp @@ -0,0 +1,98 @@ +#include <set> +#include <string> +#include "qmpdeviceprioritydialog.hpp" +#include "qmpsettingswindow.hpp" +#include "../core/qmpmidiplay.hpp" +#include "ui_qmpdeviceprioritydialog.h" + +qmpDevicePriorityDialog::qmpDevicePriorityDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::qmpDevicePriorityDialog) +{ + ui->setupUi(this); + model=new QStandardItemModel(this); + ui->tvDevices->setModel(model); + ui->tvDevices->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); + ui->tvDevices->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeMode::ResizeToContents); + ui->tvDevices->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows); + model->setHorizontalHeaderLabels({"E","Device","Connected?"}); + setdevs=qmpSettingsWindow::getSettingsIntf()->value("Midi/DevicePriority",QList<QVariant>{"Internal FluidSynth"}).toList(); +} + +qmpDevicePriorityDialog::~qmpDevicePriorityDialog() +{ + delete ui; +} + +void qmpDevicePriorityDialog::setupRegisteredDevices() +{ + std::set<std::string> sset,sconn; + auto conndevs=CMidiPlayer::getInstance()->getMidiOutDevices(); + for(auto dev:conndevs) + sconn.insert(dev); + for(auto dev:setdevs) + { + QStandardItem *e=new QStandardItem; + e->setCheckable(true); + e->setEditable(false); + e->setCheckState(Qt::CheckState::Checked); + QStandardItem *a=new QStandardItem; + a->setEnabled(false); + a->setText(sconn.find(dev.toString().toStdString())!=sconn.end()?"Connected":"Disconnected"); + a->setEditable(false); + QStandardItem *devn=new QStandardItem(dev.toString()); + devn->setEditable(false); + model->appendRow({e,devn,a}); + sset.insert(dev.toString().toStdString()); + } + for(auto dev:conndevs) + { + if(sset.find(dev)!=sset.end())continue; + QStandardItem *e=new QStandardItem; + e->setCheckable(true); + e->setEditable(false); + e->setCheckState(Qt::CheckState::Unchecked); + QStandardItem *a=new QStandardItem; + a->setEnabled(false); + a->setText("Connected"); + a->setEditable(false); + QStandardItem *devn=new QStandardItem(QString::fromStdString(dev)); + devn->setEditable(false); + model->appendRow({e,devn,a}); + } +} + +void qmpDevicePriorityDialog::on_pbUp_clicked() +{ + const QModelIndex &idx=ui->tvDevices->selectionModel()->currentIndex(); + if(idx.isValid()&&idx.row()>0) + { + int row=idx.row(); + auto r=model->takeRow(row); + model->insertRow(row-1,r); + ui->tvDevices->clearSelection(); + ui->tvDevices->selectionModel()->setCurrentIndex(model->index(row-1,idx.column()),QItemSelectionModel::Rows|QItemSelectionModel::Select); + } +} + +void qmpDevicePriorityDialog::on_pbDown_clicked() +{ + const QModelIndex &idx=ui->tvDevices->selectionModel()->currentIndex(); + if(idx.isValid()&&idx.row()<model->rowCount()-1) + { + int row=idx.row(); + auto r=model->takeRow(row); + model->insertRow(row+1,r); + ui->tvDevices->clearSelection(); + ui->tvDevices->selectionModel()->setCurrentIndex(model->index(row+1,idx.column()),QItemSelectionModel::Rows|QItemSelectionModel::Select); + } +} + +void qmpDevicePriorityDialog::on_buttonBox_accepted() +{ + QList<QVariant> setdevs; + for(int i=0;i<model->rowCount();++i) + if(model->item(i,0)->checkState()==Qt::CheckState::Checked) + setdevs.push_back(model->item(i,1)->text()); + qmpSettingsWindow::getSettingsIntf()->setValue("Midi/DevicePriority",setdevs); +} diff --git a/qmidiplayer-desktop/qmpdeviceprioritydialog.hpp b/qmidiplayer-desktop/qmpdeviceprioritydialog.hpp new file mode 100644 index 0000000..d48a2aa --- /dev/null +++ b/qmidiplayer-desktop/qmpdeviceprioritydialog.hpp @@ -0,0 +1,32 @@ +#ifndef QMPDEVICEPRIORITYDIALOG_HPP +#define QMPDEVICEPRIORITYDIALOG_HPP + +#include <QDialog> +#include <QShowEvent> +#include <QStandardItemModel> + +namespace Ui { +class qmpDevicePriorityDialog; +} + +class qmpDevicePriorityDialog : public QDialog +{ + Q_OBJECT + +public: + explicit qmpDevicePriorityDialog(QWidget *parent=nullptr); + ~qmpDevicePriorityDialog(); + void setupRegisteredDevices(); + +private slots: + void on_pbUp_clicked(); + void on_pbDown_clicked(); + void on_buttonBox_accepted(); + +private: + Ui::qmpDevicePriorityDialog *ui; + QStandardItemModel *model; + QList<QVariant> setdevs; +}; + +#endif // QMPDEVICEPRIORITYDIALOG_HPP diff --git a/qmidiplayer-desktop/qmpdeviceprioritydialog.ui b/qmidiplayer-desktop/qmpdeviceprioritydialog.ui new file mode 100644 index 0000000..9fc464f --- /dev/null +++ b/qmidiplayer-desktop/qmpdeviceprioritydialog.ui @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>qmpDevicePriorityDialog</class> + <widget class="QDialog" name="qmpDevicePriorityDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Select MIDI Output Devices</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTableView" name="tvDevices"/> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="pbUp"> + <property name="text"> + <string>Move Up</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbDown"> + <property name="text"> + <string>Move Down</string> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>qmpDevicePriorityDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>qmpDevicePriorityDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/qmidiplayer-desktop/qmphelpwindow.hpp b/qmidiplayer-desktop/qmphelpwindow.hpp index f68e38e..4e1ca4c 100644 --- a/qmidiplayer-desktop/qmphelpwindow.hpp +++ b/qmidiplayer-desktop/qmphelpwindow.hpp @@ -2,7 +2,7 @@ #define QMPHELPWINDOW_H #include <QDialog> -#define APP_VERSION "0.8.6" +#define APP_VERSION "0.8.7" #ifndef BUILD_MACHINE #define BUILD_MACHINE UNKNOWN #endif diff --git a/qmidiplayer-desktop/qmpmainwindow.cpp b/qmidiplayer-desktop/qmpmainwindow.cpp index 76cd221..0bcf070 100644 --- a/qmidiplayer-desktop/qmpmainwindow.cpp +++ b/qmidiplayer-desktop/qmpmainwindow.cpp @@ -52,9 +52,8 @@ qmpMainWindow::~qmpMainWindow() delete a[i]; } pmgr->deinitPlugins(); - std::vector<std::pair<qmpMidiOutRtMidi*,std::string>> rtdev=rtmididev->getDevices(); + auto rtdev=qmpRtMidiManager::getDevices(); for(auto &i:rtdev)player->unregisterMidiOutDevice(i.second); - rtmididev->deleteDevices(); delete pmgr; if(timer)delete timer; delete helpw;helpw=nullptr; @@ -83,9 +82,7 @@ void qmpMainWindow::init() [this] { player=new CMidiPlayer(); - rtmididev=new qmpRtMidiManager(); - rtmididev->createDevices(); - std::vector<std::pair<qmpMidiOutRtMidi*,std::string>> rtdev=rtmididev->getDevices(); + auto rtdev=qmpRtMidiManager::getDevices(); for(auto &i:rtdev) { player->registerMidiOutDevice(i.first,i.second); @@ -133,7 +130,7 @@ void qmpMainWindow::init() ui->pbSettings->setIcon(QIcon(getThemedIcon(":/img/settings.svg"))); ui->pbAdd->setIcon(QIcon(getThemedIcon(":/img/open.svg"))); if(argfiles.size())on_pbPlayPause_clicked(); - setupWidget();settingsw->verifySF(); + setupWidget();settingsw->postInit(); } int qmpMainWindow::parseArgs() diff --git a/qmidiplayer-desktop/qmpmainwindow.hpp b/qmidiplayer-desktop/qmpmainwindow.hpp index a95d1fe..ea5209c 100644 --- a/qmidiplayer-desktop/qmpmainwindow.hpp +++ b/qmidiplayer-desktop/qmpmainwindow.hpp @@ -194,7 +194,6 @@ class qmpMainWindow:public QMainWindow std::chrono::steady_clock::time_point st; double offset; CMidiPlayer *player; - qmpRtMidiManager *rtmididev; qmpFileRendererFluid *fluidrenderer; qmpPluginManager *pmgr; QPointer<qmpPlistWindow> plistw; diff --git a/qmidiplayer-desktop/qmpsettingswindow.cpp b/qmidiplayer-desktop/qmpsettingswindow.cpp index bb0ba05..409b087 100644 --- a/qmidiplayer-desktop/qmpsettingswindow.cpp +++ b/qmidiplayer-desktop/qmpsettingswindow.cpp @@ -1,3 +1,4 @@ +#include <set> #include <QLineEdit> #include <QToolButton> #include <QFileDialog> @@ -6,11 +7,11 @@ #include <QDesktopWidget> #include <QStandardPaths> #include "qmpsettingswindow.hpp" +#include "qmpdeviceprioritydialog.hpp" #include "ui_qmpsettingswindow.h" #include "qmpmainwindow.hpp" QSettings* qmpSettingsWindow::settings=nullptr; -QComboBox* qmpSettingsWindow::outwidget=nullptr; void qmpFluidForEachOpt(void* data,const char*,const char* option) { @@ -25,13 +26,14 @@ qmpSettingsWindow::qmpSettingsWindow(QWidget *parent) : ui->setupUi(this);customOptions.clear();customOptPages.clear(); connect(this,&qmpSettingsWindow::dialogClosing,(qmpMainWindow*)parent,&qmpMainWindow::dialogClosed); settings=new QSettings(QStandardPaths::writableLocation(QStandardPaths::StandardLocation::ConfigLocation)+QString("/qmprc"),QSettings::IniFormat); - settingsInit();outwidget=ui->cbOutputDevice; + settingsInit(); ui->pbAdd->setIcon(QIcon(getThemedIcon(":/img/add.svg"))); ui->pbRemove->setIcon(QIcon(getThemedIcon(":/img/remove.svg"))); ui->pbDown->setIcon(QIcon(getThemedIcon(":/img/down.svg"))); ui->pbUp->setIcon(QIcon(getThemedIcon(":/img/up.svg"))); cw=new qmpCustomizeWindow(this); dps=new qmpDevPropDialog(this); + devpriod=new qmpDevicePriorityDialog(this); } qmpSettingsWindow::~qmpSettingsWindow() @@ -56,7 +58,6 @@ void qmpSettingsWindow::hideEvent(QHideEvent *event) QTableWidget* qmpSettingsWindow::getSFWidget(){return ui->twSoundfont;} -QComboBox* qmpSettingsWindow::getDefaultOutWidget(){return outwidget;} void qmpSettingsWindow::on_buttonBox_accepted() { @@ -75,8 +76,6 @@ void qmpSettingsWindow::settingsInit() { fluid_settings_t *fsettings=new_fluid_settings(); - settings->setValue("Midi/DefaultOutput",settings->value("Midi/DefaultOutput","Internal FluidSynth")); - settings->setValue("Midi/DisableMapping",settings->value("Midi/DisableMapping",0)); ui->cbDisableMapping->setChecked(settings->value("Midi/DisableMapping",0).toInt()); @@ -208,8 +207,6 @@ void qmpSettingsWindow::settingsInit() void qmpSettingsWindow::settingsUpdate() { - settings->setValue("Midi/DefaultOutput",ui->cbOutputDevice->currentText()); - settings->setValue("Midi/DisableMapping",ui->cbDisableMapping->isChecked()?1:0); settings->setValue("Midi/SendSysEx",ui->cbSendSysx->isChecked()?1:0); @@ -376,24 +373,35 @@ void qmpSettingsWindow::updatePluginList(qmpPluginManager *pmgr) ui->twPluginList->setColumnWidth(3,128); } -void qmpSettingsWindow::verifySF() +void qmpSettingsWindow::postInit() { int sf=0; for(int i=0;i<ui->twSoundfont->rowCount();++i) if(((QCheckBox*)ui->twSoundfont->cellWidget(i,0))->isChecked())++sf; - if(settings->value("Midi/DefaultOutput","Internal FluidSynth").toString()=="Internal FluidSynth"&&!sf) + std::string selecteddev; + std::vector<std::string> devs=qmpMainWindow::getInstance()->getPlayer()->getMidiOutDevices(); + std::set<std::string> devset; + for(auto dev:devs)devset.insert(dev); + for(auto setdev:qmpSettingsWindow::getSettingsIntf()->value("Midi/DevicePriority",QList<QVariant>{"Internal FluidSynth"}).toList()) + if(devset.find(setdev.toString().toStdString())!=devset.end()) + { + selecteddev=setdev.toString().toStdString(); + break; + } + if(selecteddev=="Internal FluidSynth"&&!sf) { // blmark: show dialog at the current screen which user using now. int curMonitor = QApplication::desktop()->screenNumber(this); if(QMessageBox::question(QDesktopWidget().screen(curMonitor),//this, tr("No soundfont loaded"), - tr("Internal fluidsynth was chosen as the default output but it has no soundfont set. " + tr("Internal fluidsynth is the only available MIDI output but it has no soundfont set. " "Would you like to setup soundfonts now? You may have to reload the internal synth afterwards."))==QMessageBox::Yes) { show(); ui->tabWidget->setCurrentWidget(ui->tab_3); } } + devpriod->setupRegisteredDevices(); } void qmpSettingsWindow::updateCustomOptions() @@ -747,3 +755,8 @@ void qmpSettingsWindow::on_pbExtDevSetup_clicked() { dps->launch(); } + +void qmpSettingsWindow::on_pbDevPrio_clicked() +{ + devpriod->show(); +} diff --git a/qmidiplayer-desktop/qmpsettingswindow.hpp b/qmidiplayer-desktop/qmpsettingswindow.hpp index 72b0aa1..0e208ca 100644 --- a/qmidiplayer-desktop/qmpsettingswindow.hpp +++ b/qmidiplayer-desktop/qmpsettingswindow.hpp @@ -79,6 +79,8 @@ class QHexSpinBox:public QSpinBox {return *reinterpret_cast<int*>(&u);} }; +class qmpDevicePriorityDialog; + class qmpSettingsWindow:public QDialog { Q_OBJECT @@ -109,7 +111,7 @@ class qmpSettingsWindow:public QDialog void registerOptionEnumInt(std::string tab,std::string desc,std::string key,std::vector<std::string> options,int defaultval); int getOptionEnumInt(std::string key); void setOptionEnumInt(std::string key,int val); - void verifySF(); + void postInit(); signals: void dialogClosing(); @@ -133,6 +135,8 @@ class qmpSettingsWindow:public QDialog void on_pbExtDevSetup_clicked(); + void on_pbDevPrio_clicked(); + private: Ui::qmpSettingsWindow *ui; void settingsUpdate(); @@ -141,11 +145,10 @@ class qmpSettingsWindow:public QDialog void updateCustomOptions(); qmpCustomizeWindow *cw; qmpDevPropDialog *dps; + qmpDevicePriorityDialog *devpriod; static QSettings *settings; - static QComboBox* outwidget; public: static QSettings* getSettingsIntf(){return settings;} - static QComboBox* getDefaultOutWidget(); }; #endif // QMPSETTINGSWINDOW_H diff --git a/qmidiplayer-desktop/qmpsettingswindow.ui b/qmidiplayer-desktop/qmpsettingswindow.ui index a2400c5..3619943 100644 --- a/qmidiplayer-desktop/qmpsettingswindow.ui +++ b/qmidiplayer-desktop/qmpsettingswindow.ui @@ -31,36 +31,9 @@ </attribute> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> - <layout class="QHBoxLayout" name="horizontalLayout_6"> - <item> - <widget class="QLabel" name="lbOutputDevice"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Default Output Device</string> - </property> - </widget> - </item> - <item> - <widget class="QComboBox" name="cbOutputDevice"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - </layout> - </item> - <item> <widget class="QCheckBox" name="cbDisableMapping"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -73,7 +46,7 @@ <item> <widget class="QCheckBox" name="cbSendSysx"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -86,7 +59,7 @@ <item> <widget class="QCheckBox" name="cbWaitVoice"> <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> + <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -179,6 +152,36 @@ </layout> </item> <item> + <layout class="QHBoxLayout" name="horizontalLayout_8"> + <item> + <widget class="QLabel" name="lbDevPrio"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Select MIDI output devices</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pbDevPrio"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>...</string> + </property> + </widget> + </item> + </layout> + </item> + <item> <layout class="QHBoxLayout" name="horizontalLayout_5"> <item> <widget class="QLabel" name="lbExtDevSetup"> |