diff options
author | Tanu Kaskinen <tanuk@iki.fi> | 2018-12-12 11:26:09 +0200 |
---|---|---|
committer | Tanu Kaskinen <tanuk@iki.fi> | 2019-02-26 15:42:57 +0000 |
commit | f200a10d98dc2320c4a5d269b2950cdc47c2b8fe (patch) | |
tree | 96965eb8cbc8e85fe17aaaf4081d9b2d59dbb650 | |
parent | 46ce3e418e5cebf786fe33859196ae63cbc226bb (diff) |
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.
-rw-r--r-- | src/channelwidget.cc | 18 | ||||
-rw-r--r-- | src/channelwidget.h | 11 | ||||
-rw-r--r-- | src/devicewidget.cc | 10 | ||||
-rw-r--r-- | 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::RefPtr<Gtk::Bu volumeScale->signal_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<Gtk::Builder> 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), "<b>%s</b>", 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<Gtk::Builder>& 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), "<b>%s</b>", 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), "<b>%s</b>", 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); |