summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTanu Kaskinen <tanuk@iki.fi>2018-12-12 11:26:09 +0200
committerTanu Kaskinen <tanuk@iki.fi>2019-02-26 15:42:57 +0000
commitf200a10d98dc2320c4a5d269b2950cdc47c2b8fe (patch)
tree96965eb8cbc8e85fe17aaaf4081d9b2d59dbb650
parent46ce3e418e5cebf786fe33859196ae63cbc226bb (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.cc18
-rw-r--r--src/channelwidget.h11
-rw-r--r--src/devicewidget.cc10
-rw-r--r--src/streamwidget.cc12
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);