From f200a10d98dc2320c4a5d269b2950cdc47c2b8fe Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Wed, 12 Dec 2018 11:26:09 +0200 Subject: [PATCH] channelwidget: refactor to reduce repetition DeviceWidget and StreamWidget had some duplicate code to initialize ChannelWidgets. This patch moves some of the duplicated initialization code into ChannelWidgets to reduce repetition and to improve encapsulation. --- src/channelwidget.cc | 18 +++++++++++++++++- src/channelwidget.h | 11 +++++++++-- src/devicewidget.cc | 10 ++-------- src/streamwidget.cc | 12 ++++-------- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/channelwidget.cc b/src/channelwidget.cc index cc9988b..d58bf96 100644 --- a/src/channelwidget.cc +++ b/src/channelwidget.cc @@ -47,16 +47,32 @@ ChannelWidget::ChannelWidget(BaseObjectType* cobject, const Glib::RefPtrsignal_value_changed().connect(sigc::mem_fun(*this, &ChannelWidget::onVolumeScaleValueChanged)); } -ChannelWidget* ChannelWidget::create() { +ChannelWidget* ChannelWidget::createOne(MinimalStreamWidget *owner, int channelIndex, pa_channel_position channelPosition, bool can_decibel) { ChannelWidget* w; Glib::RefPtr x = Gtk::Builder::create(); x->add_from_file(GLADE_FILE, "adjustment1"); x->add_from_file(GLADE_FILE, "channelWidget"); x->get_widget_derived("channelWidget", w); w->reference(); + + w->channel = channelIndex; + w->can_decibel = can_decibel; + w->minimalStreamWidget = owner; + + char text[64]; + snprintf(text, sizeof(text), "%s", pa_channel_position_to_pretty_string(channelPosition)); + w->channelLabel->set_markup(text); + return w; } +void ChannelWidget::create(MinimalStreamWidget *owner, const pa_channel_map &m, bool can_decibel, ChannelWidget *widgets[PA_CHANNELS_MAX]) { + for (int i = 0; i < m.channels; i++) + widgets[i] = ChannelWidget::createOne(owner, i, m.map[i], can_decibel); + + widgets[m.channels - 1]->last = true; +} + void ChannelWidget::setVolume(pa_volume_t volume) { double v; char txt[64]; diff --git a/src/channelwidget.h b/src/channelwidget.h index bcfa48d..c9c5c9d 100644 --- a/src/channelwidget.h +++ b/src/channelwidget.h @@ -28,7 +28,11 @@ class MinimalStreamWidget; class ChannelWidget : public Gtk::EventBox { public: ChannelWidget(BaseObjectType* cobject, const Glib::RefPtr& x); - static ChannelWidget* create(); + + /* This creates multiple ChannelWidgets based on the given channel map. The + * widgets are stored in the caller-provided array. */ + static void create(MinimalStreamWidget *owner, const pa_channel_map &m, bool can_decibel, + ChannelWidget *widgets[PA_CHANNELS_MAX]); void setVolume(pa_volume_t volume); @@ -47,7 +51,10 @@ public: virtual void set_sensitive(bool enabled); virtual void setBaseVolume(pa_volume_t); + +private: + static ChannelWidget *createOne(MinimalStreamWidget *owner, int channelIndex, pa_channel_position channelPosition, + bool can_decibel); }; - #endif diff --git a/src/devicewidget.cc b/src/devicewidget.cc index 0a51bc0..b7405bb 100644 --- a/src/devicewidget.cc +++ b/src/devicewidget.cc @@ -83,19 +83,13 @@ void DeviceWidget::init(MainWindow* mainWindow, Glib::ustring deviceType) { void DeviceWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) { channelMap = m; + ChannelWidget::create(this, m, can_decibel, channelWidgets); for (int i = 0; i < m.channels; i++) { - ChannelWidget *cw = channelWidgets[i] = ChannelWidget::create(); - cw->channel = i; - cw->can_decibel = can_decibel; - cw->minimalStreamWidget = this; - char text[64]; - snprintf(text, sizeof(text), "%s", pa_channel_position_to_pretty_string(m.map[i])); - cw->channelLabel->set_markup(text); + ChannelWidget *cw = channelWidgets[i]; channelsVBox->pack_start(*cw, false, false, 0); cw->unreference(); } - channelWidgets[m.channels-1]->last = true; lockToggleButton->set_sensitive(m.channels > 1); hideLockedChannels(lockToggleButton->get_active()); diff --git a/src/streamwidget.cc b/src/streamwidget.cc index 8aab675..00b7796 100644 --- a/src/streamwidget.cc +++ b/src/streamwidget.cc @@ -76,18 +76,14 @@ bool StreamWidget::onContextTriggerEvent(GdkEventButton* event) { void StreamWidget::setChannelMap(const pa_channel_map &m, bool can_decibel) { channelMap = m; + ChannelWidget::create(this, m, can_decibel, channelWidgets); + for (int i = 0; i < m.channels; i++) { - ChannelWidget *cw = channelWidgets[i] = ChannelWidget::create(); - cw->channel = i; - cw->can_decibel = can_decibel; - cw->minimalStreamWidget = this; - char text[64]; - snprintf(text, sizeof(text), "%s", pa_channel_position_to_pretty_string(m.map[i])); - cw->channelLabel->set_markup(text); + ChannelWidget *cw = channelWidgets[i]; channelsVBox->pack_start(*cw, false, false, 0); cw->unreference(); } - channelWidgets[m.channels-1]->last = true; + channelWidgets[m.channels-1]->setBaseVolume(PA_VOLUME_NORM); lockToggleButton->set_sensitive(m.channels > 1);