Wire up all the new UI code.
This makes the default button work on sinks/sources, allows the drop down to actually change the sink/source and removes the old menu code. Some names and such are fixed in the glade file too.
This commit is contained in:
parent
4c3acd35e5
commit
4bd94fa2b8
|
@ -245,7 +245,8 @@ void MainWindow::updateSink(const pa_sink_info &info) {
|
|||
w->setVolume(info.volume);
|
||||
w->muteToggleButton->set_active(info.mute);
|
||||
|
||||
w->defaultMenuItem.set_active(w->name == defaultSinkName);
|
||||
w->defaultToggleButton->set_active(w->name == defaultSinkName);
|
||||
w->defaultToggleButton->set_sensitive(w->name != defaultSinkName);
|
||||
|
||||
w->updating = false;
|
||||
|
||||
|
@ -422,7 +423,8 @@ void MainWindow::updateSource(const pa_source_info &info) {
|
|||
w->setVolume(info.volume);
|
||||
w->muteToggleButton->set_active(info.mute);
|
||||
|
||||
w->defaultMenuItem.set_active(w->name == defaultSourceName);
|
||||
w->defaultToggleButton->set_active(w->name == defaultSourceName);
|
||||
w->defaultToggleButton->set_sensitive(w->name != defaultSourceName);
|
||||
|
||||
w->updating = false;
|
||||
|
||||
|
@ -592,7 +594,9 @@ void MainWindow::updateServer(const pa_server_info &info) {
|
|||
continue;
|
||||
|
||||
w->updating = true;
|
||||
w->defaultMenuItem.set_active(w->name == defaultSinkName);
|
||||
w->defaultToggleButton->set_active(w->name == defaultSinkName);
|
||||
w->defaultToggleButton->set_sensitive(w->name != defaultSinkName);
|
||||
|
||||
w->updating = false;
|
||||
}
|
||||
|
||||
|
@ -603,7 +607,8 @@ void MainWindow::updateServer(const pa_server_info &info) {
|
|||
continue;
|
||||
|
||||
w->updating = true;
|
||||
w->defaultMenuItem.set_active(w->name == defaultSourceName);
|
||||
w->defaultToggleButton->set_active(w->name == defaultSourceName);
|
||||
w->defaultToggleButton->set_sensitive(w->name != defaultSourceName);
|
||||
w->updating = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,58 +40,9 @@ MinimalStreamWidget::MinimalStreamWidget(BaseObjectType* cobject, const Glib::Re
|
|||
peakProgressBar.set_size_request(-1, 10);
|
||||
channelsVBox->pack_end(peakProgressBar, false, false);
|
||||
|
||||
//menu.signal_deactivate().connect(sigc::mem_fun(*this, &MinimalStreamWidget::onMenuDeactivated));
|
||||
|
||||
peakProgressBar.hide();
|
||||
}
|
||||
|
||||
void MinimalStreamWidget::prepareMenu(void) {
|
||||
}
|
||||
|
||||
void MinimalStreamWidget::onMenuDeactivated(void) {
|
||||
//streamToggleButton->set_active(false);
|
||||
}
|
||||
|
||||
void MinimalStreamWidget::popupMenuPosition(int& x, int& y, bool& push_in G_GNUC_UNUSED) {
|
||||
/*
|
||||
Gtk::Requisition r;
|
||||
|
||||
streamToggleButton->get_window()->get_origin(x, y);
|
||||
r = menu.size_request();
|
||||
|
||||
// Align the right side of the menu with the right side of the togglebutton
|
||||
x += streamToggleButton->get_allocation().get_x();
|
||||
x += streamToggleButton->get_allocation().get_width();
|
||||
x -= r.width;
|
||||
|
||||
// Align the top of the menu with the buttom of the togglebutton
|
||||
y += streamToggleButton->get_allocation().get_y();
|
||||
y += streamToggleButton->get_allocation().get_height();
|
||||
*/
|
||||
}
|
||||
|
||||
void MinimalStreamWidget::onStreamToggleButton(void) {
|
||||
/*
|
||||
if (streamToggleButton->get_active()) {
|
||||
prepareMenu();
|
||||
menu.popup(sigc::mem_fun(*this, &MinimalStreamWidget::popupMenuPosition), 0, gtk_get_current_event_time());
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
bool MinimalStreamWidget::on_button_press_event (GdkEventButton* event) {
|
||||
if (Gtk::VBox::on_button_press_event(event))
|
||||
return TRUE;
|
||||
|
||||
if (event->type == GDK_BUTTON_PRESS && event->button == 3) {
|
||||
prepareMenu();
|
||||
menu.popup(0, event->time);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define DECAY_STEP .04
|
||||
|
||||
void MinimalStreamWidget::updatePeak(double v) {
|
||||
|
|
|
@ -29,29 +29,20 @@ public:
|
|||
|
||||
Gtk::VBox *channelsVBox;
|
||||
Gtk::Label *nameLabel, *boldNameLabel;
|
||||
Gtk::Menu menu;
|
||||
Gtk::Image *iconImage;
|
||||
Gtk::ProgressBar peakProgressBar;
|
||||
double lastPeak;
|
||||
|
||||
bool updating;
|
||||
|
||||
/**/void onStreamToggleButton();
|
||||
/**/void onMenuDeactivated();
|
||||
/**/void popupMenuPosition(int& x, int& y, bool& push_in);
|
||||
|
||||
virtual void onMuteToggleButton() = 0;
|
||||
virtual void updateChannelVolume(int channel, pa_volume_t v) = 0;
|
||||
virtual void prepareMenu(void);
|
||||
|
||||
bool volumeMeterEnabled;
|
||||
void enableVolumeMeter();
|
||||
void updatePeak(double v);
|
||||
|
||||
Glib::ustring beepDevice;
|
||||
|
||||
protected:
|
||||
virtual bool on_button_press_event(GdkEventButton* event);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -786,11 +786,11 @@ Monitors</property>
|
|||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkToggleButton" id="defaultToggle">
|
||||
<widget class="GtkToggleButton" id="defaultToggleButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip" translatable="yes">Open menu</property>
|
||||
<property name="tooltip" translatable="yes">Set as default</property>
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox2">
|
||||
<property name="visible">True</property>
|
||||
|
|
|
@ -30,15 +30,9 @@
|
|||
|
||||
SinkInputWidget::SinkInputWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) :
|
||||
StreamWidget(cobject, x),
|
||||
titleMenuItem(_("_Move Stream..."), true),
|
||||
mpMainWindow(NULL) {
|
||||
|
||||
directionLabel->set_label(_("<i>Playing on </i> "));
|
||||
|
||||
add_events(Gdk::BUTTON_PRESS_MASK);
|
||||
|
||||
menu.append(titleMenuItem);
|
||||
titleMenuItem.set_submenu(submenu);
|
||||
}
|
||||
|
||||
void SinkInputWidget::init(MainWindow* mainWindow) {
|
||||
|
@ -47,10 +41,6 @@ void SinkInputWidget::init(MainWindow* mainWindow) {
|
|||
deviceCombo->pack_start(mpMainWindow->deviceColumns.name);
|
||||
}
|
||||
|
||||
SinkInputWidget::~SinkInputWidget() {
|
||||
clearMenu();
|
||||
}
|
||||
|
||||
SinkInputWidget* SinkInputWidget::create(MainWindow* mainWindow) {
|
||||
SinkInputWidget* w;
|
||||
Glib::RefPtr<Gnome::Glade::Xml> x = Gnome::Glade::Xml::create(GLADE_FILE, "streamWidget");
|
||||
|
@ -61,7 +51,10 @@ SinkInputWidget* SinkInputWidget::create(MainWindow* mainWindow) {
|
|||
|
||||
void SinkInputWidget::setSinkIndex(uint32_t idx) {
|
||||
mSinkIndex = idx;
|
||||
|
||||
mSuppressDeviceChange = true;
|
||||
deviceCombo->set_active(mpMainWindow->sinkTreeIndexes[idx]);
|
||||
mSuppressDeviceChange = false;
|
||||
}
|
||||
|
||||
uint32_t SinkInputWidget::sinkIndex() {
|
||||
|
@ -94,30 +87,6 @@ void SinkInputWidget::onMuteToggleButton() {
|
|||
pa_operation_unref(o);
|
||||
}
|
||||
|
||||
void SinkInputWidget::prepareMenu() {
|
||||
clearMenu();
|
||||
buildMenu();
|
||||
}
|
||||
|
||||
void SinkInputWidget::clearMenu() {
|
||||
|
||||
while (!sinkMenuItems.empty()) {
|
||||
std::map<uint32_t, SinkMenuItem*>::iterator i = sinkMenuItems.begin();
|
||||
delete i->second;
|
||||
sinkMenuItems.erase(i);
|
||||
}
|
||||
}
|
||||
|
||||
void SinkInputWidget::buildMenu() {
|
||||
for (std::map<uint32_t, SinkWidget*>::iterator i = mpMainWindow->sinkWidgets.begin(); i != mpMainWindow->sinkWidgets.end(); ++i) {
|
||||
SinkMenuItem *m;
|
||||
sinkMenuItems[i->second->index] = m = new SinkMenuItem(this, i->second->description.c_str(), i->second->index, i->second->index == mSinkIndex);
|
||||
submenu.append(m->menuItem);
|
||||
}
|
||||
|
||||
menu.show_all();
|
||||
}
|
||||
|
||||
void SinkInputWidget::onKill() {
|
||||
pa_operation* o;
|
||||
if (!(o = pa_context_kill_sink_input(get_context(), index, NULL, NULL))) {
|
||||
|
@ -129,21 +98,26 @@ void SinkInputWidget::onKill() {
|
|||
}
|
||||
|
||||
void SinkInputWidget::onDeviceChange() {
|
||||
}
|
||||
Gtk::TreeModel::iterator iter;
|
||||
|
||||
void SinkInputWidget::SinkMenuItem::onToggle() {
|
||||
|
||||
if (widget->updating)
|
||||
return;
|
||||
|
||||
if (!menuItem.get_active())
|
||||
if (updating || mSuppressDeviceChange)
|
||||
return;
|
||||
|
||||
iter = deviceCombo->get_active();
|
||||
if (iter)
|
||||
{
|
||||
Gtk::TreeModel::Row row = *iter;
|
||||
if (row)
|
||||
{
|
||||
pa_operation* o;
|
||||
if (!(o = pa_context_move_sink_input_by_index(get_context(), widget->index, index, NULL, NULL))) {
|
||||
uint32_t sink_index = row[mpMainWindow->deviceColumns.index];
|
||||
|
||||
if (!(o = pa_context_move_sink_input_by_index(get_context(), index, sink_index, NULL, NULL))) {
|
||||
show_error(_("pa_context_move_sink_input_by_index() failed"));
|
||||
return;
|
||||
}
|
||||
|
||||
pa_operation_unref(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,6 @@ class SinkInputWidget : public StreamWidget {
|
|||
public:
|
||||
SinkInputWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x);
|
||||
static SinkInputWidget* create(MainWindow* mainWindow);
|
||||
virtual ~SinkInputWidget();
|
||||
|
||||
void init(MainWindow* mainWindow);
|
||||
|
||||
|
@ -44,31 +43,6 @@ public:
|
|||
virtual void onDeviceChange();
|
||||
virtual void onMuteToggleButton();
|
||||
virtual void onKill();
|
||||
virtual void prepareMenu();
|
||||
|
||||
Gtk::Menu submenu;
|
||||
Gtk::MenuItem titleMenuItem;
|
||||
|
||||
struct SinkMenuItem {
|
||||
SinkMenuItem(SinkInputWidget *w, const char *label, uint32_t i, bool active) :
|
||||
widget(w),
|
||||
menuItem(label),
|
||||
index(i) {
|
||||
menuItem.set_active(active);
|
||||
menuItem.set_draw_as_radio(true);
|
||||
menuItem.signal_toggled().connect(sigc::mem_fun(*this, &SinkMenuItem::onToggle));
|
||||
}
|
||||
|
||||
SinkInputWidget *widget;
|
||||
Gtk::CheckMenuItem menuItem;
|
||||
uint32_t index;
|
||||
void onToggle();
|
||||
};
|
||||
|
||||
std::map<uint32_t, SinkMenuItem*> sinkMenuItems;
|
||||
|
||||
void clearMenu();
|
||||
void buildMenu();
|
||||
|
||||
private:
|
||||
MainWindow *mpMainWindow;
|
||||
|
|
|
@ -27,15 +27,7 @@
|
|||
#include "i18n.h"
|
||||
|
||||
SinkWidget::SinkWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) :
|
||||
DeviceWidget(cobject, x),
|
||||
defaultMenuItem("_Default", true){
|
||||
|
||||
add_events(Gdk::BUTTON_PRESS_MASK);
|
||||
|
||||
defaultMenuItem.set_active(false);
|
||||
defaultMenuItem.signal_toggled().connect(sigc::mem_fun(*this, &SinkWidget::onDefaultToggle));
|
||||
menu.append(defaultMenuItem);
|
||||
menu.show_all();
|
||||
DeviceWidget(cobject, x) {
|
||||
}
|
||||
|
||||
SinkWidget* SinkWidget::create() {
|
||||
|
@ -71,9 +63,11 @@ void SinkWidget::onMuteToggleButton() {
|
|||
pa_operation_unref(o);
|
||||
}
|
||||
|
||||
void SinkWidget::onDefaultToggle() {
|
||||
void SinkWidget::onDefaultToggleButton() {
|
||||
pa_operation* o;
|
||||
|
||||
DeviceWidget::onDefaultToggleButton();
|
||||
|
||||
if (updating)
|
||||
return;
|
||||
|
||||
|
|
|
@ -36,11 +36,9 @@ public:
|
|||
uint32_t index, monitor_index, card_index;
|
||||
bool can_decibel;
|
||||
|
||||
Gtk::CheckMenuItem defaultMenuItem;
|
||||
|
||||
virtual void onMuteToggleButton();
|
||||
virtual void executeVolumeUpdate();
|
||||
virtual void onDefaultToggle();
|
||||
virtual void onDefaultToggleButton();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -30,15 +30,9 @@
|
|||
|
||||
SourceOutputWidget::SourceOutputWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) :
|
||||
StreamWidget(cobject, x),
|
||||
titleMenuItem(_("_Move Stream..."), true),
|
||||
mpMainWindow(NULL) {
|
||||
|
||||
directionLabel->set_label(_("<i>Recording from </i> "));
|
||||
|
||||
add_events(Gdk::BUTTON_PRESS_MASK);
|
||||
|
||||
menu.append(titleMenuItem);
|
||||
titleMenuItem.set_submenu(submenu);
|
||||
}
|
||||
|
||||
void SourceOutputWidget::init(MainWindow* mainWindow) {
|
||||
|
@ -47,10 +41,6 @@ void SourceOutputWidget::init(MainWindow* mainWindow) {
|
|||
deviceCombo->pack_start(mpMainWindow->deviceColumns.name);
|
||||
}
|
||||
|
||||
SourceOutputWidget::~SourceOutputWidget() {
|
||||
clearMenu();
|
||||
}
|
||||
|
||||
SourceOutputWidget* SourceOutputWidget::create(MainWindow* mainWindow) {
|
||||
SourceOutputWidget* w;
|
||||
Glib::RefPtr<Gnome::Glade::Xml> x = Gnome::Glade::Xml::create(GLADE_FILE, "streamWidget");
|
||||
|
@ -61,7 +51,10 @@ SourceOutputWidget* SourceOutputWidget::create(MainWindow* mainWindow) {
|
|||
|
||||
void SourceOutputWidget::setSourceIndex(uint32_t idx) {
|
||||
mSourceIndex = idx;
|
||||
|
||||
mSuppressDeviceChange = true;
|
||||
deviceCombo->set_active(mpMainWindow->sourceTreeIndexes[idx]);
|
||||
mSuppressDeviceChange = false;
|
||||
}
|
||||
|
||||
uint32_t SourceOutputWidget::sourceIndex() {
|
||||
|
@ -78,46 +71,27 @@ void SourceOutputWidget::onKill() {
|
|||
pa_operation_unref(o);
|
||||
}
|
||||
|
||||
void SourceOutputWidget::clearMenu() {
|
||||
|
||||
while (!sourceMenuItems.empty()) {
|
||||
std::map<uint32_t, SourceMenuItem*>::iterator i = sourceMenuItems.begin();
|
||||
delete i->second;
|
||||
sourceMenuItems.erase(i);
|
||||
}
|
||||
}
|
||||
|
||||
void SourceOutputWidget::buildMenu() {
|
||||
for (std::map<uint32_t, SourceWidget*>::iterator i = mpMainWindow->sourceWidgets.begin(); i != mpMainWindow->sourceWidgets.end(); ++i) {
|
||||
SourceMenuItem *m;
|
||||
sourceMenuItems[i->second->index] = m = new SourceMenuItem(this, i->second->description.c_str(), i->second->index, i->second->index == mSourceIndex);
|
||||
submenu.append(m->menuItem);
|
||||
}
|
||||
|
||||
menu.show_all();
|
||||
}
|
||||
|
||||
void SourceOutputWidget::prepareMenu(void) {
|
||||
clearMenu();
|
||||
buildMenu();
|
||||
}
|
||||
|
||||
void SourceOutputWidget::onDeviceChange() {
|
||||
}
|
||||
Gtk::TreeModel::iterator iter;
|
||||
|
||||
void SourceOutputWidget::SourceMenuItem::onToggle() {
|
||||
|
||||
if (widget->updating)
|
||||
return;
|
||||
|
||||
if (!menuItem.get_active())
|
||||
if (updating || mSuppressDeviceChange)
|
||||
return;
|
||||
|
||||
iter = deviceCombo->get_active();
|
||||
if (iter)
|
||||
{
|
||||
Gtk::TreeModel::Row row = *iter;
|
||||
if (row)
|
||||
{
|
||||
pa_operation* o;
|
||||
if (!(o = pa_context_move_source_output_by_index(get_context(), widget->index, index, NULL, NULL))) {
|
||||
uint32_t source_index = row[mpMainWindow->deviceColumns.index];
|
||||
|
||||
if (!(o = pa_context_move_source_output_by_index(get_context(), source_index, index, NULL, NULL))) {
|
||||
show_error(_("pa_context_move_source_output_by_index() failed"));
|
||||
return;
|
||||
}
|
||||
|
||||
pa_operation_unref(o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,6 @@ class SourceOutputWidget : public StreamWidget {
|
|||
public:
|
||||
SourceOutputWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x);
|
||||
static SourceOutputWidget* create(MainWindow* mainWindow);
|
||||
virtual ~SourceOutputWidget();
|
||||
|
||||
void init(MainWindow* mainWindow);
|
||||
|
||||
|
@ -43,31 +42,6 @@ public:
|
|||
virtual void onDeviceChange();
|
||||
virtual void onKill();
|
||||
|
||||
Gtk::Menu submenu;
|
||||
Gtk::MenuItem titleMenuItem;
|
||||
|
||||
struct SourceMenuItem {
|
||||
SourceMenuItem(SourceOutputWidget *w, const char *label, uint32_t i, bool active) :
|
||||
widget(w),
|
||||
menuItem(label),
|
||||
index(i) {
|
||||
menuItem.set_active(active);
|
||||
menuItem.set_draw_as_radio(true);
|
||||
menuItem.signal_toggled().connect(sigc::mem_fun(*this, &SourceMenuItem::onToggle));
|
||||
}
|
||||
|
||||
SourceOutputWidget *widget;
|
||||
Gtk::CheckMenuItem menuItem;
|
||||
uint32_t index;
|
||||
void onToggle();
|
||||
};
|
||||
|
||||
std::map<uint32_t, SourceMenuItem*> sourceMenuItems;
|
||||
|
||||
void clearMenu();
|
||||
void buildMenu();
|
||||
virtual void prepareMenu();
|
||||
|
||||
private:
|
||||
MainWindow *mpMainWindow;
|
||||
uint32_t mSourceIndex;
|
||||
|
|
|
@ -27,15 +27,7 @@
|
|||
#include "i18n.h"
|
||||
|
||||
SourceWidget::SourceWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) :
|
||||
DeviceWidget(cobject, x),
|
||||
defaultMenuItem(_("_Default"), true){
|
||||
|
||||
add_events(Gdk::BUTTON_PRESS_MASK);
|
||||
|
||||
defaultMenuItem.set_active(false);
|
||||
defaultMenuItem.signal_toggled().connect(sigc::mem_fun(*this, &SourceWidget::onDefaultToggle));
|
||||
menu.append(defaultMenuItem);
|
||||
menu.show_all();
|
||||
DeviceWidget(cobject, x) {
|
||||
}
|
||||
|
||||
SourceWidget* SourceWidget::create() {
|
||||
|
@ -71,9 +63,11 @@ void SourceWidget::onMuteToggleButton() {
|
|||
pa_operation_unref(o);
|
||||
}
|
||||
|
||||
void SourceWidget::onDefaultToggle() {
|
||||
void SourceWidget::onDefaultToggleButton() {
|
||||
pa_operation* o;
|
||||
|
||||
DeviceWidget::onDefaultToggleButton();
|
||||
|
||||
if (updating)
|
||||
return;
|
||||
|
||||
|
|
|
@ -36,11 +36,9 @@ public:
|
|||
uint32_t index, card_index;
|
||||
bool can_decibel;
|
||||
|
||||
Gtk::CheckMenuItem defaultMenuItem;
|
||||
|
||||
virtual void onMuteToggleButton();
|
||||
virtual void executeVolumeUpdate();
|
||||
virtual void onDefaultToggle();
|
||||
virtual void onDefaultToggleButton();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -27,7 +27,8 @@
|
|||
|
||||
/*** StreamWidget ***/
|
||||
StreamWidget::StreamWidget(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml>& x) :
|
||||
MinimalStreamWidget(cobject, x) {
|
||||
MinimalStreamWidget(cobject, x),
|
||||
mSuppressDeviceChange(false) {
|
||||
|
||||
x->get_widget("lockToggleButton", lockToggleButton);
|
||||
x->get_widget("muteToggleButton", muteToggleButton);
|
||||
|
|
|
@ -45,9 +45,9 @@ public:
|
|||
|
||||
ChannelWidget *channelWidgets[PA_CHANNELS_MAX];
|
||||
|
||||
virtual void onKill();
|
||||
virtual void onDeviceChange() = 0;
|
||||
virtual void onMuteToggleButton();
|
||||
virtual void onDeviceChange() = 0;
|
||||
virtual void onKill();
|
||||
|
||||
sigc::connection timeoutConnection;
|
||||
|
||||
|
@ -59,6 +59,8 @@ public:
|
|||
|
||||
protected:
|
||||
Gtk::ComboBox *deviceCombo;
|
||||
|
||||
bool mSuppressDeviceChange;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue