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.
This commit is contained in:
Tanu Kaskinen 2018-12-12 11:26:09 +02:00
parent 46ce3e418e
commit f200a10d98
4 changed files with 32 additions and 19 deletions

View File

@ -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];

View File

@ -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

View File

@ -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());

View File

@ -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);