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
}
unix: {
DEFINES += __LINUX_ALSA__
LIBS += -lasound
}
DEFINES += QT_DEPRECATED_WARNINGS QT_DISABLE_DEPRECATED_BEFORE=0x060000
SOURCES += \

View File

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

View File

@ -192,7 +192,16 @@
</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>
</item>
</layout>
@ -222,6 +231,12 @@
<header>presetdetailwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>SequencerWidget</class>
<extends>QWidget</extends>
<header>sequencerwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>

View File

@ -28,8 +28,6 @@ SamplesWidget::SamplesWidget(QWidget *parent) :
for (const auto &ref : getWidgets())
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_2->setNote(50);
m_ui->sampleWidget_3->setNote(52);
@ -58,8 +56,6 @@ void SamplesWidget::setPreset(const presets::Preset &preset)
{
m_preset = preset;
m_ui->sequencerWidget->setPreset(preset);
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)
{
for (const auto &ref : getWidgets())
@ -124,17 +131,6 @@ void SamplesWidget::updateWidgets()
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()
{
for (const auto &ref : getWidgets())

View File

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

View File

@ -13,145 +13,26 @@
<property name="windowTitle">
<string>Form</string>
</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">
<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>
<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="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"/>
</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">
<item>
<spacer name="horizontalSpacer_4">
@ -166,30 +47,6 @@
</property>
</spacer>
</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>
<widget class="QCheckBox" name="checkBox">
<property name="text">
@ -219,19 +76,99 @@
</item>
</layout>
</item>
<item row="0" column="4">
<spacer name="verticalSpacer_3">
<item row="3" column="2">
<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">
<enum>Qt::Vertical</enum>
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</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>
</widget>
<customwidgets>
@ -241,12 +178,6 @@
<header>samplewidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>SequencerWidget</class>
<extends>QWidget</extends>
<header>sequencerwidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>

View File

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

View File

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

View File

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

View File

@ -3,6 +3,8 @@
#include <algorithm>
#include <QDebug>
#include "presets.h"
SequencerWidget::SequencerWidget(QWidget *parent) :
@ -30,6 +32,9 @@ void SequencerWidget::setPreset(const presets::Preset &preset)
if (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_ui->horizontalSlider->setMaximum(0);

View File

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

View File

@ -6,16 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>412</width>
<height>65</height>
<width>912</width>
<height>611</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,1">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,1">
<item>
<widget class="QSpinBox" name="spinBoxTempo">
<property name="suffix">
@ -62,13 +62,457 @@
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="horizontalSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QSlider" name="horizontalSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QScrollArea" name="scrollArea">
<property name="widgetResizable">
<bool>true</bool>
</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>
</item>
</layout>