src/channelwidget.cc | 35 ++++++++++++++++++++++++++++++++++- src/channelwidget.h | 11 +++++++++-- src/devicewidget.cc | 10 ++-------- src/pavucontrol.glade | 3 +-- src/streamwidget.cc | 12 ++++-------- 5 files changed, 50 insertions(+), 21 deletions(-)
New commits: commit 5f664bc63bcf2567bdb39be377c6c0341a9aa217 Author: Tanu Kaskinen <ta...@iki.fi> Date: Wed Dec 12 11:41:16 2018 +0200 channelwidget: ensure that all channel labels have the same width pavucontrol.glade previously set the channel label width to 15 characters, with the goal of making all channel labels have the same width. However, with some translations and font settings the configured width wasn't enough, so sometimes a label was wider than others, and that made the volume slider widths different too. If the volume sliders have different widths, it's very hard to visually compare the volumes of the channels. This patch removes the fixed width in pavucontrol.glade and solves the problem by finding the widest label and using that label's width with all labels. Fixes: https://gitlab.freedesktop.org/pulseaudio/pavucontrol/issues/51 diff --git a/src/channelwidget.cc b/src/channelwidget.cc index d58bf96..f141009 100644 --- a/src/channelwidget.cc +++ b/src/channelwidget.cc @@ -67,10 +67,27 @@ ChannelWidget* ChannelWidget::createOne(MinimalStreamWidget *owner, int channelI } 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++) + int maxLabelWidth = 0; + + for (int i = 0; i < m.channels; i++) { widgets[i] = ChannelWidget::createOne(owner, i, m.map[i], can_decibel); + Gtk::Requisition minimumSize; + Gtk::Requisition naturalSize; + widgets[i]->channelLabel->get_preferred_size(minimumSize, naturalSize); + if (naturalSize.width > maxLabelWidth) + maxLabelWidth = naturalSize.width; + } + widgets[m.channels - 1]->last = true; + + /* The channel labels have different widths by default, which makes the + * volume slider widths different too. The volume sliders must have the + * same width, otherwise it's very hard to see how the volumes of different + * channels relate to each other, so we have to change all channel labels + * to have the same width. */ + for (int i = 0; i < m.channels; i++) + widgets[i]->channelLabel->set_size_request(maxLabelWidth, -1); } void ChannelWidget::setVolume(pa_volume_t volume) { diff --git a/src/pavucontrol.glade b/src/pavucontrol.glade index a08ffca..96c35be 100644 --- a/src/pavucontrol.glade +++ b/src/pavucontrol.glade @@ -24,7 +24,6 @@ <property name="can_focus">False</property> <property name="label" translatable="yes"><b>left-front</b></property> <property name="use_markup">True</property> - <property name="width_chars">15</property> <property name="xalign">1</property> <property name="yalign">0</property> </object> commit f200a10d98dc2320c4a5d269b2950cdc47c2b8fe Author: Tanu Kaskinen <ta...@iki.fi> Date: Wed Dec 12 11:26:09 2018 +0200 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. 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); commit 46ce3e418e5cebf786fe33859196ae63cbc226bb Author: Tanu Kaskinen <ta...@iki.fi> Date: Tue Dec 11 17:17:37 2018 +0200 pavucontrol.glade: right-align channel labels The channel labels ("Front Left" etc.) that are adjacent to volume sliders used to be left-aligned, which meant that there was some empty space (depending on the text width) between the label text and the volume slider. Right-aligning the labels looks nicer. diff --git a/src/pavucontrol.glade b/src/pavucontrol.glade index 3602d5b..a08ffca 100644 --- a/src/pavucontrol.glade +++ b/src/pavucontrol.glade @@ -25,7 +25,7 @@ <property name="label" translatable="yes"><b>left-front</b></property> <property name="use_markup">True</property> <property name="width_chars">15</property> - <property name="xalign">0</property> + <property name="xalign">1</property> <property name="yalign">0</property> </object> <packing> _______________________________________________ pulseaudio-commits mailing list pulseaudio-commits@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/pulseaudio-commits