Better separation

This commit is contained in:
2020-04-25 23:03:33 +02:00
parent 202a0a8a0a
commit e5654e5131
12 changed files with 629 additions and 206 deletions

View File

@ -11,6 +11,11 @@ win32: {
LIBS += -lwinmm LIBS += -lwinmm
} }
unix: {
DEFINES += __LINUX_ALSA__
LIBS += -lasound
}
DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000 DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000
SOURCES += \ SOURCES += \

View File

@ -17,9 +17,12 @@ MainWindow::MainWindow(const presets::PresetsConfig &presetsConfig, QWidget *par
m_presetsModel{*presetsConfig.presets} m_presetsModel{*presetsConfig.presets}
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
m_ui->splitter->setSizes({99999, 1});
connect(&m_midiIn, &MidiInWrapper::messageReceived, this, &MainWindow::messageReceived); connect(&m_midiIn, &MidiInWrapper::messageReceived, this, &MainWindow::messageReceived);
connect(m_ui->sequencerWidget, &SequencerWidget::triggerSample, m_ui->samplesWidget, &SamplesWidget::sequencerTriggerSample);
updateMidiDevices(); updateMidiDevices();
connect(m_ui->pushButtonMidiController, &QAbstractButton::pressed, this, [this](){ connect(m_ui->pushButtonMidiController, &QAbstractButton::pressed, this, [this](){
@ -99,6 +102,7 @@ void MainWindow::currentRowChanged(const QModelIndex &current)
m_ui->presetDetailWidget->setPreset(preset); m_ui->presetDetailWidget->setPreset(preset);
m_filesModel.setPreset(preset); m_filesModel.setPreset(preset);
m_ui->sequencerWidget->setPreset(preset);
m_ui->samplesWidget->setPreset(preset); m_ui->samplesWidget->setPreset(preset);
} }

View File

@ -192,7 +192,16 @@
</widget> </widget>
</widget> </widget>
</widget> </widget>
<widget class="SamplesWidget" name="samplesWidget" native="true"/> <widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" stretch="1,0">
<item>
<widget class="SequencerWidget" name="sequencerWidget" native="true"/>
</item>
<item>
<widget class="SamplesWidget" name="samplesWidget" native="true"/>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>
@ -222,6 +231,12 @@
<header>presetdetailwidget.h</header> <header>presetdetailwidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>SequencerWidget</class>
<extends>QWidget</extends>
<header>sequencerwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -28,8 +28,6 @@ SamplesWidget::SamplesWidget(QWidget *parent) :
for (const auto &ref : getWidgets()) for (const auto &ref : getWidgets())
connect(&ref.get(), &SampleWidget::chokeTriggered, this, &SamplesWidget::chokeTriggered); connect(&ref.get(), &SampleWidget::chokeTriggered, this, &SamplesWidget::chokeTriggered);
connect(m_ui->sequencerWidget, &SequencerWidget::triggerSample, this, &SamplesWidget::sequencerTriggerSample);
m_ui->sampleWidget_1->setNote(48); m_ui->sampleWidget_1->setNote(48);
m_ui->sampleWidget_2->setNote(50); m_ui->sampleWidget_2->setNote(50);
m_ui->sampleWidget_3->setNote(52); m_ui->sampleWidget_3->setNote(52);
@ -58,8 +56,6 @@ void SamplesWidget::setPreset(const presets::Preset &preset)
{ {
m_preset = preset; m_preset = preset;
m_ui->sequencerWidget->setPreset(preset);
updateWidgets(); updateWidgets();
} }
@ -95,6 +91,17 @@ void SamplesWidget::setAudioDevice(const QAudioDeviceInfo &device)
} }
} }
void SamplesWidget::sequencerTriggerSample(int index)
{
const auto widgets = getWidgets();
if (index < 0 || index >= std::size(widgets))
{
qDebug() << "index out of range" << index;
return;
}
widgets[index].get().pressed(127);
}
void SamplesWidget::chokeTriggered(int choke) void SamplesWidget::chokeTriggered(int choke)
{ {
for (const auto &ref : getWidgets()) for (const auto &ref : getWidgets())
@ -124,17 +131,6 @@ void SamplesWidget::updateWidgets()
widgetsIter->get().setFile(*m_preset.id, *filesIter); widgetsIter->get().setFile(*m_preset.id, *filesIter);
} }
void SamplesWidget::sequencerTriggerSample(int index)
{
const auto widgets = getWidgets();
if (index < 0 || index >= std::size(widgets))
{
qDebug() << "index out of range" << index;
return;
}
widgets[index].get().pressed(127);
}
void SamplesWidget::stopAll() void SamplesWidget::stopAll()
{ {
for (const auto &ref : getWidgets()) for (const auto &ref : getWidgets())

View File

@ -28,10 +28,12 @@ public:
void setAudioDevice(const QAudioDeviceInfo &device); void setAudioDevice(const QAudioDeviceInfo &device);
public slots:
void sequencerTriggerSample(int index);
private slots: private slots:
void chokeTriggered(int choke); void chokeTriggered(int choke);
void updateWidgets(); void updateWidgets();
void sequencerTriggerSample(int index);
void stopAll(); void stopAll();
private: private:

View File

@ -13,145 +13,26 @@
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout" rowstretch="1,0,1,0,0,0,0,1" columnstretch="1,0,0,0,1,0,0,0,1"> <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0" columnstretch="0,0,0,0,0,0,0,0,0">
<item row="3" column="5">
<widget class="SampleWidget" name="sampleWidget_13" native="true"/>
</item>
<item row="6" column="2">
<widget class="SampleWidget" name="sampleWidget_11" native="true"/>
</item>
<item row="2" column="4">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="1">
<widget class="SampleWidget" name="sampleWidget_4" native="true"/>
</item>
<item row="3" column="2">
<widget class="SampleWidget" name="sampleWidget_2" native="true"/>
</item>
<item row="4" column="7">
<widget class="SampleWidget" name="sampleWidget_18" native="true"/>
</item>
<item row="3" column="8">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="6" column="5">
<widget class="SampleWidget" name="sampleWidget_22" native="true"/>
</item>
<item row="5" column="5">
<widget class="SampleWidget" name="sampleWidget_19" native="true"/>
</item>
<item row="5" column="2">
<widget class="SampleWidget" name="sampleWidget_8" native="true"/>
</item>
<item row="3" column="3"> <item row="3" column="3">
<widget class="SampleWidget" name="sampleWidget_3" native="true"/>
</item>
<item row="5" column="7">
<widget class="SampleWidget" name="sampleWidget_21" native="true"/>
</item>
<item row="6" column="7">
<widget class="SampleWidget" name="sampleWidget_24" native="true"/>
</item>
<item row="5" column="1">
<widget class="SampleWidget" name="sampleWidget_7" native="true"/>
</item>
<item row="6" column="3">
<widget class="SampleWidget" name="sampleWidget_12" native="true"/>
</item>
<item row="4" column="2">
<widget class="SampleWidget" name="sampleWidget_5" native="true"/>
</item>
<item row="4" column="6">
<widget class="SampleWidget" name="sampleWidget_17" native="true"/>
</item>
<item row="3" column="7">
<widget class="SampleWidget" name="sampleWidget_15" native="true"/>
</item>
<item row="3" column="4">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="6">
<widget class="SampleWidget" name="sampleWidget_20" native="true"/>
</item>
<item row="3" column="1">
<widget class="SampleWidget" name="sampleWidget_1" native="true"/>
</item>
<item row="4" column="3">
<widget class="SampleWidget" name="sampleWidget_6" native="true"/>
</item>
<item row="4" column="5">
<widget class="SampleWidget" name="sampleWidget_16" native="true"/>
</item>
<item row="6" column="6">
<widget class="SampleWidget" name="sampleWidget_23" native="true"/>
</item>
<item row="3" column="6">
<widget class="SampleWidget" name="sampleWidget_14" native="true"/>
</item>
<item row="7" column="4">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="6" column="1">
<widget class="SampleWidget" name="sampleWidget_10" native="true"/>
</item>
<item row="5" column="3">
<widget class="SampleWidget" name="sampleWidget_9" native="true"/> <widget class="SampleWidget" name="sampleWidget_9" native="true"/>
</item> </item>
<item row="1" column="0" colspan="9"> <item row="4" column="3">
<widget class="SampleWidget" name="sampleWidget_12" native="true"/>
</item>
<item row="1" column="5">
<widget class="SampleWidget" name="sampleWidget_13" native="true"/>
</item>
<item row="1" column="7">
<widget class="SampleWidget" name="sampleWidget_15" native="true"/>
</item>
<item row="2" column="7">
<widget class="SampleWidget" name="sampleWidget_18" native="true"/>
</item>
<item row="4" column="6">
<widget class="SampleWidget" name="sampleWidget_23" native="true"/>
</item>
<item row="0" column="0" colspan="9">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<spacer name="horizontalSpacer_4"> <spacer name="horizontalSpacer_4">
@ -166,30 +47,6 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Sequencer</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="SequencerWidget" name="sequencerWidget" native="true"/>
</item>
</layout>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="checkBox"> <widget class="QCheckBox" name="checkBox">
<property name="text"> <property name="text">
@ -219,19 +76,99 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="4"> <item row="3" column="2">
<spacer name="verticalSpacer_3"> <widget class="SampleWidget" name="sampleWidget_8" native="true"/>
</item>
<item row="4" column="7">
<widget class="SampleWidget" name="sampleWidget_24" native="true"/>
</item>
<item row="1" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>40</width>
<height>40</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="1">
<widget class="SampleWidget" name="sampleWidget_1" native="true"/>
</item>
<item row="3" column="5">
<widget class="SampleWidget" name="sampleWidget_19" native="true"/>
</item>
<item row="3" column="7">
<widget class="SampleWidget" name="sampleWidget_21" native="true"/>
</item>
<item row="1" column="8">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="2">
<widget class="SampleWidget" name="sampleWidget_5" native="true"/>
</item>
<item row="1" column="2">
<widget class="SampleWidget" name="sampleWidget_2" native="true"/>
</item>
<item row="2" column="6">
<widget class="SampleWidget" name="sampleWidget_17" native="true"/>
</item>
<item row="3" column="6">
<widget class="SampleWidget" name="sampleWidget_20" native="true"/>
</item>
<item row="1" column="4">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="5">
<widget class="SampleWidget" name="sampleWidget_16" native="true"/>
</item>
<item row="2" column="1">
<widget class="SampleWidget" name="sampleWidget_4" native="true"/>
</item>
<item row="4" column="5">
<widget class="SampleWidget" name="sampleWidget_22" native="true"/>
</item>
<item row="4" column="2">
<widget class="SampleWidget" name="sampleWidget_11" native="true"/>
</item>
<item row="1" column="3">
<widget class="SampleWidget" name="sampleWidget_3" native="true"/>
</item>
<item row="1" column="6">
<widget class="SampleWidget" name="sampleWidget_14" native="true"/>
</item>
<item row="4" column="1">
<widget class="SampleWidget" name="sampleWidget_10" native="true"/>
</item>
<item row="2" column="3">
<widget class="SampleWidget" name="sampleWidget_6" native="true"/>
</item>
<item row="3" column="1">
<widget class="SampleWidget" name="sampleWidget_7" native="true"/>
</item>
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>
@ -241,12 +178,6 @@
<header>samplewidget.h</header> <header>samplewidget.h</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>SequencerWidget</class>
<extends>QWidget</extends>
<header>sequencerwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -2,7 +2,6 @@
#include "ui_samplewidget.h" #include "ui_samplewidget.h"
#include <QAbstractEventDispatcher> #include <QAbstractEventDispatcher>
#include <QAudioDeviceInfo>
#include <QSoundEffect> #include <QSoundEffect>
#include <QDebug> #include <QDebug>
@ -32,14 +31,14 @@ SampleWidget::SampleWidget(QWidget *parent) :
connect(m_ui->pushButton, &QAbstractButton::pressed, this, [this](){ pressed(127); }); connect(m_ui->pushButton, &QAbstractButton::pressed, this, [this](){ pressed(127); });
connect(m_ui->pushButton, &QAbstractButton::released, this, &SampleWidget::released); connect(m_ui->pushButton, &QAbstractButton::released, this, &SampleWidget::released);
connect(m_ui->toolButtonReload, &QAbstractButton::pressed, this, &SampleWidget::createEffect);
updateStatus(); updateStatus();
} }
SampleWidget::~SampleWidget() SampleWidget::~SampleWidget()
{ {
if (m_effect) destroyEffect();
QMetaObject::invokeMethod(m_effect.get(), [effect=m_effect.release()](){ delete effect; });
} }
void SampleWidget::setFile(const QString &presetId, const presets::File &file) void SampleWidget::setFile(const QString &presetId, const presets::File &file)
@ -112,7 +111,9 @@ void SampleWidget::pressed(quint8 velocity)
Q_UNUSED(velocity) Q_UNUSED(velocity)
if (m_effect) if (m_effect)
{
QMetaObject::invokeMethod(m_effect.get(), &QSoundEffect::play); QMetaObject::invokeMethod(m_effect.get(), &QSoundEffect::play);
}
if (m_file && m_file->choke && *m_file->choke) if (m_file && m_file->choke && *m_file->choke)
emit chokeTriggered(*m_file->choke); emit chokeTriggered(*m_file->choke);
@ -130,8 +131,16 @@ void SampleWidget::forceStop()
void SampleWidget::setupAudioThread(const QAudioDeviceInfo &device, QThread &thread) void SampleWidget::setupAudioThread(const QAudioDeviceInfo &device, QThread &thread)
{ {
const auto setupEffect = [this,device](){ m_device = device;
m_effect = std::make_unique<QSoundEffect>(device); m_thread = &thread;
createEffect();
}
void SampleWidget::createEffect()
{
QMetaObject::invokeMethod(QAbstractEventDispatcher::instance(m_thread), [this](){
m_effect = std::make_unique<QSoundEffect>(m_device);
connect(m_effect.get(), &QSoundEffect::playingChanged, this, &SampleWidget::updateStatus); connect(m_effect.get(), &QSoundEffect::playingChanged, this, &SampleWidget::updateStatus);
connect(m_effect.get(), &QSoundEffect::statusChanged, this, &SampleWidget::updateStatus); connect(m_effect.get(), &QSoundEffect::statusChanged, this, &SampleWidget::updateStatus);
@ -141,10 +150,7 @@ void SampleWidget::setupAudioThread(const QAudioDeviceInfo &device, QThread &thr
m_effect->setSource(sampleUrl); m_effect->setSource(sampleUrl);
QMetaObject::invokeMethod(this, &SampleWidget::updateStatus); QMetaObject::invokeMethod(this, &SampleWidget::updateStatus);
}; });
QMetaObject::invokeMethod(QAbstractEventDispatcher::instance(&thread), setupEffect);
//setupEffect();
} }
void SampleWidget::updateStatus() void SampleWidget::updateStatus()
@ -183,6 +189,12 @@ void SampleWidget::updateStatus()
m_ui->statusLabel->setText(toString(m_effect->status())); m_ui->statusLabel->setText(toString(m_effect->status()));
} }
void SampleWidget::destroyEffect()
{
if (m_effect)
QMetaObject::invokeMethod(m_effect.get(), [effect=m_effect.release()](){ delete effect; });
}
QUrl SampleWidget::sampleUrl() const QUrl SampleWidget::sampleUrl() const
{ {
if (!m_file || !m_file->filename) if (!m_file || !m_file->filename)

View File

@ -3,12 +3,12 @@
#include <memory> #include <memory>
#include <QFrame> #include <QFrame>
#include <QAudioDeviceInfo>
#include "presets.h" #include "presets.h"
namespace Ui { class SampleWidget; } namespace Ui { class SampleWidget; }
class QThread; class QThread;
class QAudioDeviceInfo;
class QSoundEffect; class QSoundEffect;
class SampleWidget : public QFrame class SampleWidget : public QFrame
@ -40,9 +40,12 @@ signals:
void chokeTriggered(int choke); void chokeTriggered(int choke);
private slots: private slots:
void createEffect();
void updateStatus(); void updateStatus();
private: private:
void destroyEffect();
QUrl sampleUrl() const; QUrl sampleUrl() const;
const std::unique_ptr<Ui::SampleWidget> m_ui; const std::unique_ptr<Ui::SampleWidget> m_ui;
@ -51,4 +54,7 @@ private:
std::optional<presets::File> m_file; std::optional<presets::File> m_file;
std::unique_ptr<QSoundEffect> m_effect; std::unique_ptr<QSoundEffect> m_effect;
QThread *m_thread{};
QAudioDeviceInfo m_device;
}; };

View File

@ -33,7 +33,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QToolButton" name="toolButton"> <widget class="QToolButton" name="toolButtonReload">
<property name="text"> <property name="text">
<string>↻</string> <string>↻</string>
</property> </property>

View File

@ -3,6 +3,8 @@
#include <algorithm> #include <algorithm>
#include <QDebug>
#include "presets.h" #include "presets.h"
SequencerWidget::SequencerWidget(QWidget *parent) : SequencerWidget::SequencerWidget(QWidget *parent) :
@ -30,6 +32,9 @@ void SequencerWidget::setPreset(const presets::Preset &preset)
if (preset.tempo) if (preset.tempo)
m_ui->spinBoxTempo->setValue(*preset.tempo); m_ui->spinBoxTempo->setValue(*preset.tempo);
for (int i = 0; i < 24; i++)
qobject_cast<QLabel*>(m_ui->gridLayout->itemAtPosition(2+(i*2), 0)->widget())->setText(*preset.files->at(i).filename);
m_selectedSequence = nullptr; m_selectedSequence = nullptr;
m_ui->horizontalSlider->setMaximum(0); m_ui->horizontalSlider->setMaximum(0);

View File

@ -2,12 +2,14 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <array>
#include <QWidget> #include <QWidget>
#include <QTimer> #include <QTimer>
namespace Ui { class SequencerWidget; } namespace Ui { class SequencerWidget; }
namespace presets { class Preset; class Sequence; } namespace presets { class Preset; class Sequence; }
class QLabel;
class SequencerWidget : public QWidget class SequencerWidget : public QWidget
{ {
@ -41,4 +43,5 @@ private:
QTimer m_timer; QTimer m_timer;
int m_pos; int m_pos;
std::array<QLabel*, 24> m_sampleLabels;
}; };

View File

@ -6,16 +6,16 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>412</width> <width>912</width>
<height>65</height> <height>611</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,1">
<item> <item>
<widget class="QSpinBox" name="spinBoxTempo"> <widget class="QSpinBox" name="spinBoxTempo">
<property name="suffix"> <property name="suffix">
@ -62,13 +62,457 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QSlider" name="horizontalSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QSlider" name="horizontalSlider"> <widget class="QScrollArea" name="scrollArea">
<property name="orientation"> <property name="widgetResizable">
<enum>Qt::Horizontal</enum> <bool>true</bool>
</property> </property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>878</width>
<height>921</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0,1">
<item row="38" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="34" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="19" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="15" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="41" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="44" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="47" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="29" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="32" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="27" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="48" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="11" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="28" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="18" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="13" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="25" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="40" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="30" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="26" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="43" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="42" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="39" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="21" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="31" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="23" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="37" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="35" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="9" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="17" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="36" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="0" column="1" rowspan="49" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::VLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="33" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="22" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="46" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="45" column="0" colspan="3">
<widget class="QFrame">
<property name="frameShape">
<enum>QFrame::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
</property>
</widget>
</item>
<item row="24" column="0">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel">
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>