*/
#include <cmath>
-#include <glib.h>
#include <sigc++/bind.h>
+#include <pbd/convert.h>
+
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/choice.h>
#include "ardour_ui.h"
#include "ardour_dialog.h"
-#include "ardour_message.h"
#include "mixer_strip.h"
#include "mixer_ui.h"
#include "keyboard.h"
using namespace Gtk;
using namespace Gtkmm2ext;
-/* XPM */
-static const gchar * small_x_xpm[] = {
-"11 11 2 1",
-" c None",
-". c #cccc99",
-" ",
-" ",
-" . . ",
-" . . ",
-" . . ",
-" . ",
-" . . ",
-" . . ",
-" . . ",
-" ",
-" "};
-
-/* XPM */
-static const gchar * lr_xpm[] = {
-"11 11 2 1",
-" c None",
-". c #cccc99",
-" ",
-" ",
-" . . ",
-" . . ",
-" . . ",
-"...........",
-" . . ",
-" . . ",
-" . . ",
-" ",
-" "};
-
+#ifdef VARISPEED_IN_MIXER_STRIP
static void
speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg)
{
snprintf (buf, 32, "%.3f", val);
}
}
+#endif
MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
: AxisView(sess),
post_redirect_box (PostFader, sess, rt, mx.plugin_selector(), mx.selection(), in_mixer),
gpm (_route, sess),
panners (_route, sess),
- button_table (8, 2),
+ button_table (6, 2),
gain_automation_style_button (""),
gain_automation_state_button (""),
pan_automation_style_button (""),
pan_automation_state_button (""),
- polarity_button (_("polarity")),
- comment_button (_("comments")),
+ comment_button (_("Comments")),
speed_adjustment (1.0, 0.001, 4.0, 0.001, 0.1),
speed_spinner (&speed_adjustment, "MixerStripSpeedBase", true)
comment_window = 0;
comment_area = 0;
- width_button.add (*(manage (new Gtk::Image (Gdk::Pixbuf::create_from_xpm_data(lr_xpm)))));
- hide_button.add (*(manage (new Gtk::Image (Gdk::Pixbuf::create_from_xpm_data(small_x_xpm)))));
+ width_button.add (*(manage (new Gtk::Image (get_xpm("lr.xpm")))));
+ hide_button.add (*(manage (new Gtk::Image (get_xpm("small_x.xpm")))));
input_label.set_text (_("INPUT"));
gain_automation_state_button.set_name ("MixerAutomationPlaybackButton");
pan_automation_style_button.set_name ("MixerAutomationModeButton");
pan_automation_state_button.set_name ("MixerAutomationPlaybackButton");
- polarity_button.set_name ("MixerPhaseInvertButton");
ARDOUR_UI::instance()->tooltips().set_tip (pan_automation_state_button, _("Pan automation mode"));
ARDOUR_UI::instance()->tooltips().set_tip (gain_automation_state_button, _("Gain automation mode"));
gain_automation_state_button.unset_flags (Gtk::CAN_FOCUS);
pan_automation_style_button.unset_flags (Gtk::CAN_FOCUS);
pan_automation_state_button.unset_flags (Gtk::CAN_FOCUS);
- polarity_button.unset_flags (Gtk::CAN_FOCUS);
button_table.set_homogeneous (true);
+ button_table.set_spacings (0);
button_table.attach (name_button, 0, 2, 0, 1);
button_table.attach (group_button, 0, 2, 1, 2);
button_table.attach (input_button, 0, 2, 2, 3);
- button_table.attach (polarity_button, 0, 2, 3, 4);
+ button_table.attach (*solo_button, 0, 1, 3, 4);
+ button_table.attach (*mute_button, 1, 2, 3, 4);
- button_table.attach (*solo_button, 0, 1, 4, 5);
- button_table.attach (*mute_button, 1, 2, 4, 5);
-
- // button_table.attach (gain_automation_style_button, 0, 1, 5, 6);
- button_table.attach (gain_automation_state_button, 0, 1, 5, 6);
- // button_table.attach (pan_automation_style_button, 0, 1, 6, 7);
- button_table.attach (pan_automation_state_button, 1, 2, 5, 6);
+ button_table.attach (gain_automation_state_button, 0, 1, 4, 5);
+ button_table.attach (pan_automation_state_button, 1, 2, 4, 5);
using namespace Menu_Helpers;
at->FreezeChange.connect (mem_fun(*this, &MixerStrip::map_frozen));
+#ifdef VARISPEED_IN_MIXER_STRIP
speed_adjustment.signal_value_changed().connect (mem_fun(*this, &MixerStrip::speed_adjustment_changed));
speed_frame.set_name ("BaseFrame");
ARDOUR_UI::instance()->tooltips().set_tip (speed_spinner, _("varispeed"));
- button_table.attach (speed_frame, 0, 2, 6, 7);
- button_table.attach (*rec_enable_button, 0, 2, 7, 8);
+ button_table.attach (speed_frame, 0, 2, 5, 6);
+#endif /* VARISPEED_IN_MIXER_STRIP */
+
+ button_table.attach (*rec_enable_button, 0, 2, 5, 6);
}
name_button.add (name_label);
group_label.set_name ("MixerGroupButtonLabel");
comment_button.set_name ("MixerCommentButton");
+
ARDOUR_UI::instance()->tooltips().set_tip (comment_button, _route.comment()=="" ?
- _("click to add/edit comments"):
+ _("Click to Add/Edit Comments"):
_route.comment());
+
comment_button.signal_clicked().connect (mem_fun(*this, &MixerStrip::comment_button_clicked));
- global_vpacker.set_border_width (4);
- global_vpacker.set_spacing (4);
+ global_vpacker.set_border_width (0);
+ global_vpacker.set_spacing (0);
Gtk::VBox *whvbox = manage (new Gtk::VBox);
global_vpacker.pack_start (*whvbox, Gtk::PACK_SHRINK);
global_vpacker.pack_start (button_table,Gtk::PACK_SHRINK);
global_vpacker.pack_start (pre_redirect_box, true, true);
- global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK);
+ global_vpacker.pack_start (gpm, Gtk::PACK_SHRINK, 4);
global_vpacker.pack_start (post_redirect_box, true, true);
global_vpacker.pack_start (panners, Gtk::PACK_SHRINK);
global_vpacker.pack_start (output_button, Gtk::PACK_SHRINK);
_route.comment_changed.connect (mem_fun(*this, &MixerStrip::comment_changed));
_route.gui_changed.connect (mem_fun(*this, &MixerStrip::route_gui_changed));
- input_button.signal_button_release_event().connect (mem_fun(*this, &MixerStrip::input_press), false);
- output_button.signal_button_release_event().connect (mem_fun(*this, &MixerStrip::output_press), false);
+ input_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::input_press), false);
+ output_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::output_press), false);
rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press));
- solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press));
- solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release));
- mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press));
- mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release));
+ solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press), false);
+ solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release), false);
+ mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press), false);
+ mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release), false);
gain_automation_style_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::gain_automation_style_button_event), false);
gain_automation_style_button.signal_button_release_event().connect (mem_fun(*this, &MixerStrip::gain_automation_style_button_event), false);
pan_automation_style_button.signal_button_release_event().connect (mem_fun(*this, &MixerStrip::pan_automation_style_button_event), false);
gain_automation_state_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::gain_automation_state_button_event), false);
- gain_automation_state_button.signal_button_release_event().connect (mem_fun(*this, &MixerStrip::gain_automation_state_button_event), false);
pan_automation_state_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::pan_automation_state_button_event), false);
- pan_automation_state_button.signal_button_release_event().connect (mem_fun(*this, &MixerStrip::pan_automation_state_button_event), false);
- polarity_button.signal_toggled().connect (mem_fun(*this, &MixerStrip::polarity_toggled));
-
- name_button.signal_button_release_event().connect (mem_fun(*this, &MixerStrip::name_button_button_release), false);
+ name_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::name_button_button_press), false);
group_button.signal_button_press_event().connect (mem_fun(*this, &MixerStrip::select_mix_group), false);
speed_changed ();
}
- /* XXX hack: no phase invert changed signal */
-
- polarity_button.set_active (_route.phase_invert());
-
update_diskstream_display ();
update_input_display ();
update_output_display ();
set_size_request (-1, -1);
xml_node->add_property ("strip_width", "wide");
- static_cast<Gtk::Label*> (rec_enable_button->get_child())->set_text (_("RECORD"));
- static_cast<Gtk::Label*> (mute_button->get_child())->set_text (_("mute"));
- static_cast<Gtk::Label*> (solo_button->get_child())->set_text (_("solo"));
- static_cast<Gtk::Label*> (comment_button.get_child())->set_text (_("comments"));
- static_cast<Gtk::Label*> (gain_automation_style_button.get_child())->set_text (astyle_string(_route.gain_automation_curve().automation_style()));
- static_cast<Gtk::Label*> (gain_automation_state_button.get_child())->set_text (astate_string(_route.gain_automation_curve().automation_state()));
- static_cast<Gtk::Label*> (pan_automation_style_button.get_child())->set_text (astyle_string(_route.panner().automation_style()));
- static_cast<Gtk::Label*> (pan_automation_state_button.get_child())->set_text (astate_string(_route.panner().automation_state()));
- static_cast<Gtk::Label*> (polarity_button.get_child())->set_text (_("polarity"));
+ rec_enable_button->set_label (_("RECORD"));
+ mute_button->set_label (_("mute"));
+ solo_button->set_label (_("solo"));
+
+ if (_route.comment() == "") {
+ comment_button.set_label (_("Comments"));
+ } else {
+ comment_button.set_label (_("*Comments*"));
+ }
+
+ gain_automation_style_button.set_label (astyle_string(_route.gain_automation_curve().automation_style()));
+ gain_automation_state_button.set_label (astate_string(_route.gain_automation_curve().automation_state()));
+ pan_automation_style_button.set_label (astyle_string(_route.panner().automation_style()));
+ pan_automation_state_button.set_label (astate_string(_route.panner().automation_state()));
Gtkmm2ext::set_size_request_to_display_given_text (name_button, "long", 2, 2);
break;
set_size_request (50, -1);
xml_node->add_property ("strip_width", "narrow");
- static_cast<Gtk::Label*> (rec_enable_button->get_child())->set_text (_("REC"));
- static_cast<Gtk::Label*> (mute_button->get_child())->set_text (_("m"));
- static_cast<Gtk::Label*> (solo_button->get_child())->set_text (_("s"));
- static_cast<Gtk::Label*> (comment_button.get_child())->set_text (_("cmt"));
- static_cast<Gtk::Label*> (gain_automation_style_button.get_child())->set_text (short_astyle_string(_route.gain_automation_curve().automation_style()));
- static_cast<Gtk::Label*> (gain_automation_state_button.get_child())->set_text (short_astate_string(_route.gain_automation_curve().automation_state()));
- static_cast<Gtk::Label*> (pan_automation_style_button.get_child())->set_text (short_astyle_string(_route.panner().automation_style()));
- static_cast<Gtk::Label*> (pan_automation_state_button.get_child())->set_text (short_astate_string(_route.panner().automation_state()));
- static_cast<Gtk::Label*> (polarity_button.get_child())->set_text (_("pol"));
+ rec_enable_button->set_label (_("REC"));
+ mute_button->set_label (_("m"));
+ solo_button->set_label (_("s"));
+
+ if (_route.comment() == "") {
+ comment_button.set_label (_("Cmt"));
+ } else {
+ comment_button.set_label (_("*Cmt*"));
+ }
+
+ gain_automation_style_button.set_label (short_astyle_string(_route.gain_automation_curve().automation_style()));
+ gain_automation_state_button.set_label (short_astate_string(_route.gain_automation_curve().automation_state()));
+ pan_automation_style_button.set_label (short_astyle_string(_route.panner().automation_style()));
+ pan_automation_state_button.set_label (short_astate_string(_route.panner().automation_state()));
Gtkmm2ext::set_size_request_to_display_given_text (name_button, "longest label", 2, 2);
break;
}
update_output_display ();
mix_group_changed (0);
name_changed (0);
+
}
void
using namespace Menu_Helpers;
if (!_session.engine().connected()) {
- ArdourMessage msg (NULL, "nojackdialog", _("Not connected to JACK - no I/O changes are possible"));
- return TRUE;
+ MessageDialog msg (_("Not connected to JACK - no I/O changes are possible"));
+ msg.run ();
+ return true;
}
MenuList& citems = output_menu.items();
citems.clear();
if (!_session.engine().connected()) {
- ArdourMessage msg (NULL, "nojackdialog", _("Not connected to JACK - no I/O changes are possible"));
- return TRUE;
+ MessageDialog msg (_("Not connected to JACK - no I/O changes are possible"));
+ msg.run ();
+ return true;
}
#if ADVANCED_ROUTE_DISKSTREAM_CONNECTIVITY
panners.setup_pan ();
}
-void
-MixerStrip::update ()
-{
- gpm.update_meters ();
-}
-
void
MixerStrip::fast_update ()
{
- if (_session.meter_falloff() > 0.0f) {
- gpm.update_meters_falloff ();
- }
+ gpm.update_meters ();
}
gint
MixerStrip::gain_automation_state_button_event (GdkEventButton *ev)
{
- if (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_2BUTTON_PRESS) {
+ if (ev->type == GDK_BUTTON_RELEASE) {
return TRUE;
}
{
using namespace Menu_Helpers;
- if (ev->type == GDK_BUTTON_PRESS || ev->type == GDK_2BUTTON_PRESS) {
+ if (ev->type == GDK_BUTTON_RELEASE) {
return TRUE;
}
{
switch (_width) {
case Wide:
- static_cast<Gtk::Label*> (gain_automation_style_button.get_child())->set_text (astyle_string(_route.gain_automation_curve().automation_style()));
+ gain_automation_style_button.set_label (astyle_string(_route.gain_automation_curve().automation_style()));
break;
case Narrow:
- static_cast<Gtk::Label*> (gain_automation_style_button.get_child())->set_text (short_astyle_string(_route.gain_automation_curve().automation_style()));
+ gain_automation_style_button.set_label (short_astyle_string(_route.gain_automation_curve().automation_style()));
break;
}
}
switch (_width) {
case Wide:
- static_cast<Gtk::Label*> (gain_automation_state_button.get_child())->set_text (astate_string(_route.gain_automation_curve().automation_state()));
+ gain_automation_state_button.set_label (astate_string(_route.gain_automation_curve().automation_state()));
break;
case Narrow:
- static_cast<Gtk::Label*> (gain_automation_state_button.get_child())->set_text (short_astate_string(_route.gain_automation_curve().automation_state()));
+ gain_automation_state_button.set_label (short_astate_string(_route.gain_automation_curve().automation_state()));
break;
}
switch (_width) {
case Wide:
- static_cast<Gtk::Label*> (pan_automation_style_button.get_child())->set_text (astyle_string(_route.panner().automation_style()));
+ pan_automation_style_button.set_label (astyle_string(_route.panner().automation_style()));
break;
case Narrow:
- static_cast<Gtk::Label*> (pan_automation_style_button.get_child())->set_text (short_astyle_string(_route.panner().automation_style()));
+ pan_automation_style_button.set_label (short_astyle_string(_route.panner().automation_style()));
break;
}
}
switch (_width) {
case Wide:
- static_cast<Gtk::Label*> (pan_automation_state_button.get_child())->set_text (astate_string(_route.panner().automation_state()));
+ pan_automation_state_button.set_label (astate_string(_route.panner().automation_state()));
break;
case Narrow:
- static_cast<Gtk::Label*> (pan_automation_state_button.get_child())->set_text (short_astate_string(_route.panner().automation_state()));
+ pan_automation_state_button.set_label (short_astate_string(_route.panner().automation_state()));
break;
}
setup_comment_editor ();
}
+ int x, y, cw_width, cw_height;
+
if (comment_window->is_visible()) {
- comment_window->hide ();
- return;
+ string str = comment_area->get_buffer()->get_text();
+ if (_route.comment() != str) {
+ _route.set_comment (str, this);
+
+ switch (_width) {
+
+ case Wide:
+ if (! str.empty()) {
+ comment_button.set_label (_("*Comments*"));
+ } else {
+ comment_button.set_label (_("Comments"));
+ }
+ break;
+
+ case Narrow:
+ if (! str.empty()) {
+ comment_button.set_label (_("*Cmt*"));
+ } else {
+ comment_button.set_label (_("Cmt"));
+ }
+ break;
+ }
+
+ ARDOUR_UI::instance()->tooltips().set_tip (comment_button,
+ str.empty() ? _("Click to Add/Edit Comments") : str);
+ }
+ comment_window->hide ();
+ return;
}
+ comment_window->get_size (cw_width, cw_height);
+ comment_window->get_position(x, y);
+ comment_window->move(x, y - (cw_height / 2) - 45);
+ /*
+ half the dialog height minus the comments button height
+ with some window decoration fudge thrown in.
+ */
- comment_window->set_position (Gtk::WIN_POS_MOUSE);
- comment_window->show_all ();
+ comment_window->show();
comment_window->present();
-
- ResponseType response = (ResponseType) comment_window->run();
- comment_window->hide ();
-
- switch (response) {
- case RESPONSE_ACCEPT:
- break;
- default:
- return;
- }
- string str = comment_area->get_buffer()->get_text();
- _route.set_comment (str, this);
- ARDOUR_UI::instance()->tooltips().set_tip (comment_button,
- str.empty() ? _("click to add/edit comments") : str);
}
void
title += _(": comment editor");
comment_window = new ArdourDialog (title, false);
- comment_area = manage (new TextView());
+ comment_window->set_position (Gtk::WIN_POS_MOUSE);
+ comment_window->set_skip_taskbar_hint (true);
+ comment_area = manage (new TextView());
comment_area->set_name ("MixerTrackCommentArea");
+ comment_area->set_size_request (110, 178);
+ comment_area->set_wrap_mode (WRAP_WORD);
comment_area->set_editable (true);
comment_area->get_buffer()->set_text (_route.comment());
- comment_area->set_size_request (200,100);
comment_area->show ();
comment_window->get_vbox()->pack_start (*comment_area);
- comment_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
- comment_window->add_button (Stock::OK, RESPONSE_ACCEPT);
+ comment_window->get_action_area()->hide();
}
void
void
MixerStrip::set_mix_group (RouteGroup *rg)
-
{
_route.set_mix_group (rg, this);
- delete group_menu;
- group_menu = 0;
}
void
-MixerStrip::add_mix_group_to_menu (RouteGroup *rg)
+MixerStrip::add_mix_group_to_menu (RouteGroup *rg, RadioMenuItem::Group* group)
{
using namespace Menu_Helpers;
MenuList& items = group_menu->items();
- items.push_back (MenuElem (rg->name(), bind (mem_fun(*this, &MixerStrip::set_mix_group), rg)));
+
+ items.push_back (RadioMenuElem (*group, rg->name(), bind (mem_fun(*this, &MixerStrip::set_mix_group), rg)));
+
+ if (_route.mix_group() == rg) {
+ static_cast<RadioMenuItem*>(&items.back())->set_active ();
+ }
}
-gint
+bool
MixerStrip::select_mix_group (GdkEventButton *ev)
{
using namespace Menu_Helpers;
- group_menu = new Menu;
+ if (group_menu == 0) {
+ group_menu = new Menu;
+ }
group_menu->set_name ("ArdourContextMenu");
MenuList& items = group_menu->items();
+ RadioMenuItem::Group group;
+
+ items.clear ();
+ items.push_back (RadioMenuElem (group, _("no group"), bind (mem_fun(*this, &MixerStrip::set_mix_group), (RouteGroup *) 0)));
- items.push_back (MenuElem (_("no group"), bind (mem_fun(*this, &MixerStrip::set_mix_group), (RouteGroup *) 0)));
- _session.foreach_mix_group (this, &MixerStrip::add_mix_group_to_menu);
+ _session.foreach_mix_group (bind (mem_fun (*this, &MixerStrip::add_mix_group_to_menu), &group));
+
+ group_menu->popup (1, ev->time);
- group_menu->popup (ev->button, 0);
- return stop_signal (group_button, "button_press_event");
+ return true;
}
void
}
}
-void
-MixerStrip::polarity_toggled ()
-{
- bool x;
-
- if ((x = polarity_button.get_active()) != _route.phase_invert()) {
- _route.set_phase_invert (x, this);
- }
-}
-
void
MixerStrip::route_gui_changed (string what_changed, void* ignored)
void
MixerStrip::show_route_color ()
{
- name_button.ensure_style ();
- Glib::RefPtr<Gtk::Style> style = name_button.get_style()->copy();
- style->set_bg (Gtk::STATE_NORMAL, color());
- name_button.set_style (style);
-
+ name_button.modify_bg (STATE_NORMAL, color());
route_active_changed ();
}
items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteUI::route_rename)));
items.push_back (SeparatorElem());
- items.push_back (CheckMenuElem (_("Active"), mem_fun(*this, &RouteUI::toggle_route_active)));
+ items.push_back (CheckMenuElem (_("Active"), mem_fun (*this, &RouteUI::toggle_route_active)));
route_active_menu_item = dynamic_cast<CheckMenuItem *> (&items.back());
route_active_menu_item->set_active (_route.active());
+ items.push_back (SeparatorElem());
+ items.push_back (CheckMenuElem (_("Invert Polarity"), mem_fun (*this, &RouteUI::toggle_polarity)));
+ polarity_menu_item = dynamic_cast<CheckMenuItem *> (&items.back());
+ polarity_menu_item->set_active (_route.phase_invert());
build_remote_control_menu ();
}
gint
-MixerStrip::name_button_button_release (GdkEventButton* ev)
+MixerStrip::name_button_button_press (GdkEventButton* ev)
{
- if (ev->button == 3) {
+ if (ev->button == 1) {
list_route_operations ();
+ route_ops_menu->popup (1, ev->time);
}
return FALSE;
}
}
refresh_remote_control_menu();
-
- route_ops_menu->popup (1, 0);
}
RouteUI::name_changed (src);
break;
case Narrow:
- name_label.set_text (short_version (_route.name(), 5));
+ name_label.set_text (PBD::short_version (_route.name(), 5));
break;
}
}
gpm.set_fader_name ("AudioBusFader");
}
}
+
+RouteGroup*
+MixerStrip::mix_group() const
+{
+ return _route.mix_group();
+}