diff --git a/gtk2_ardour/ardour2_ui.rc b/gtk2_ardour/ardour2_ui.rc index 047b896631..642a2e8382 100644 --- a/gtk2_ardour/ardour2_ui.rc +++ b/gtk2_ardour/ardour2_ui.rc @@ -127,6 +127,13 @@ style "base_frame" bg[NORMAL] = { 0.35, 0.35, 0.40 } } + +style "red_frame" +{ + fg[NORMAL] = { 1.0, 0.0, 0.0 } + bg[NORMAL] = { 1.0, 0.0, 0.0 } +} + style "transport_base" = "medium_bold_text" { bg[NORMAL] = { 0.10, 0.10, 0.10 } @@ -189,6 +196,12 @@ style "track_rec_enable_button" = "small_button" bg[PRELIGHT] = { 1.0, 0.0, 0.0 } } +style "gain_fader" +{ + bg[NORMAL] = { 0.269, 0.269, 0.300} + bg[ACTIVE] = { 0.152, 0.152, 0.168 } +} + style "mixer_rec_enable_button" = "track_rec_enable_button" { font_name = "sans 7" @@ -441,12 +454,17 @@ style "medium_bold_entry" = "medium_bold_text" base[SELECTED] = { 0, 0, 0 } } - style "small_entry" = "small_text" { fg[NORMAL] = { 0.70, 0.70, 0.70 } - fg[ACTIVE] = { 0.70, 0.70, 0.70 } + fg[ACTIVE] = { 0, 1.0, 0 } + fg[SELECTED] = { 0, 1.0, 0 } + text[NORMAL] = { 0.70, 0.70, 0.70 } + text[ACTIVE] = { 0, 1.0, 0 } + text[SELECTED] = { 0, 1.0, 0 } bg[NORMAL] = { 0.0, 0.0, 0.0 } + bg[SELECTED] = { 0.0, 0.0, 0.0 } + bg[SELECTED] = { 0.0, 0.0, 0.0 } base[NORMAL] = { 0, 0, 0 } base[ACTIVE] = { 0, 0, 0 } base[SELECTED] = { 0, 0, 0 } @@ -1092,13 +1110,14 @@ widget "*BBTRuler" style "editor_time_ruler" widget "*FramesRuler" style "editor_time_ruler" widget "*MinSecRuler" style "editor_time_ruler" widget "*BaseFrame" style "base_frame" +widget "*RedFrame" style "red_frame" widget "*AudioTrackStripBase" style "audio_track_base" widget "*TimeAxisViewControlsBaseUnselected" style "audio_track_base" widget "*AudioTrackControlsBaseUnselected" style "audio_track_base" -widget "*AudioTrackFader" style "audio_track_base" +widget "*AudioTrackFader" style "gain_fader" widget "*AudioBusStripBase" style "audio_bus_base" widget "*BusControlsBaseUnselected" style "audio_bus_base" -widget "*AudioBusFader" style "audio_bus_base" +widget "*AudioBusFader" style "gain_fader" widget "*TrackSeparator" style "track_separator" widget "*TrackEditIndicator0*" style "edit_group_0" widget "*TrackEditIndicator1*" style "edit_group_1" diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 00acc7d5d6..efd9fe92ba 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -141,7 +141,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) color_manager = new ColorManager(); std::string color_file = ARDOUR::find_config_file("ardour.colors"); - + color_manager->load (color_file); editor = 0; diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index c15950d97d..45cb912934 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -3346,7 +3346,7 @@ Editor::duplicate_dialog (bool dup_region) entry.set_text ("1"); set_size_request_to_display_given_text (entry, X_("12345678"), 20, 15); - entry.select_region (0, entry.get_text_length()); + entry.select_region (0, -1); entry.grab_focus (); diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 5e98b831a0..bcd5bd0344 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -82,7 +82,8 @@ GainMeter::GainMeter (boost::shared_ptr io, Session& s) ignore_toggle = false; meter_menu = 0; - + next_release_selects = false; + gain_slider = manage (new VSliderController (slider, &gain_adjustment, _io->gain_control(), @@ -90,24 +91,29 @@ GainMeter::GainMeter (boost::shared_ptr io, Session& s) gain_slider->signal_button_press_event().connect (mem_fun(*this, &GainMeter::start_gain_touch)); gain_slider->signal_button_release_event().connect (mem_fun(*this, &GainMeter::end_gain_touch)); - gain_slider->set_name ("MixerGainMeter"); + gain_slider->set_name ("GainFader"); gain_display.set_name ("MixerStripGainDisplay"); - set_size_request_to_display_given_text (gain_display, "-86.g", 2, 6); /* note the descender */ - gain_display.signal_activate().connect (mem_fun (*this, &GainMeter::gain_entered)); + gain_display.set_has_frame (false); + set_size_request_to_display_given_text (gain_display, "-80.g", 2, 6); /* note the descender */ + gain_display.signal_activate().connect (mem_fun (*this, &GainMeter::gain_activated)); + gain_display.signal_focus_in_event().connect (mem_fun (*this, &GainMeter::gain_focused), false); + gain_display.signal_focus_out_event().connect (mem_fun (*this, &GainMeter::gain_focused), false); gain_display_box.set_homogeneous (true); + gain_display_box.set_spacing (2); gain_display_box.pack_start (gain_display, true, true); peak_display.set_name ("MixerStripPeakDisplay"); + peak_display.set_has_frame (false); peak_display.set_editable (false); - set_size_request_to_display_given_text (peak_display, "-86.g", 2, 6); /* note the descender */ + set_size_request_to_display_given_text (peak_display, "-80.g", 2, 6); /* note the descender */ max_peak = minus_infinity(); peak_display.set_text (_("-inf")); peak_display.unset_flags (Gtk::CAN_FOCUS); - meter_metric_area.set_size_request (25, -1); meter_metric_area.set_name ("MeterMetricsStrip"); + set_size_request_to_display_given_text (meter_metric_area, "-50", 0, 0); meter_packer.set_spacing (2); @@ -124,14 +130,14 @@ GainMeter::GainMeter (boost::shared_ptr io, Session& s) gain_automation_style_button.set_size_request(15, 15); HBox* fader_centering_box = manage (new HBox); - fader_centering_box->pack_start (*gain_slider, false, true); + fader_centering_box->pack_start (*gain_slider, true, false); fader_vbox = manage (new Gtk::VBox()); fader_vbox->set_spacing (0); fader_vbox->pack_start (*fader_centering_box, false, false, 0); hbox.set_spacing (2); - hbox.pack_start (*fader_vbox, true, true, 7); + hbox.pack_start (*fader_vbox, true, true); set_width(Narrow); @@ -146,7 +152,7 @@ GainMeter::GainMeter (boost::shared_ptr io, Session& s) gain_display_box.pack_end (peak_display, true, true); - hbox.pack_start (meter_packer, true, false); + hbox.pack_end (meter_packer, true, true); using namespace Menu_Helpers; @@ -175,11 +181,10 @@ GainMeter::GainMeter (boost::shared_ptr io, Session& s) gain_automation_state_changed (); } - set_spacing (2); - pack_start (gain_display_box, Gtk::PACK_SHRINK); - pack_start (hbox, Gtk::PACK_SHRINK); + pack_start (gain_display_box, Gtk::PACK_SHRINK); + pack_start (hbox, Gtk::PACK_SHRINK); _io->gain_changed.connect (mem_fun(*this, &GainMeter::gain_changed)); @@ -417,7 +422,14 @@ GainMeter::setup_meters () meters.push_back (MeterInfo()); } - for (uint32_t n = 0; n < nmeters; ++n) { + /* pack them backwards */ + + if (_width == Wide) { + meter_packer.pack_end (meter_metric_area, false, false); + meter_metric_area.show_all (); + } + + for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) { if (meters[n].width != width) { delete meters[n].meter; meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical); @@ -427,65 +439,20 @@ GainMeter::setup_meters () meters[n].meter->signal_button_release_event().connect (bind (mem_fun(*this, &GainMeter::meter_button_release), n)); } - meter_packer.pack_start (*meters[n].meter, Gtk::PACK_SHRINK); + meter_packer.pack_end (*meters[n].meter, false, false); meters[n].meter->show_all (); meters[n].packed = true; } - - if (_width == Wide) { - meter_packer.pack_start (meter_metric_area, Gtk::PACK_SHRINK); - meter_metric_area.show_all (); - } } bool GainMeter::gain_key_press (GdkEventKey* ev) { - cerr << "kp " << ev->keyval << endl; - - switch (ev->keyval) { - case GDK_minus: - case GDK_plus: - case GDK_period: - case GDK_comma: - case GDK_0: - case GDK_1: - case GDK_2: - case GDK_3: - case GDK_4: - case GDK_5: - case GDK_6: - case GDK_7: - case GDK_8: - case GDK_9: - case GDK_KP_Add: - case GDK_KP_Subtract: - case GDK_KP_Decimal: - case GDK_KP_0: - case GDK_KP_1: - case GDK_KP_2: - case GDK_KP_3: - case GDK_KP_4: - case GDK_KP_5: - case GDK_KP_6: - case GDK_KP_7: - case GDK_KP_8: - case GDK_KP_9: - case GDK_Return: - case GDK_BackSpace: - case GDK_Delete: - case GDK_KP_Enter: - case GDK_Home: - case GDK_End: - case GDK_Left: - case GDK_Right: - cerr << "allow " << ev->keyval << " to drop through\n"; + if (key_is_legal_for_numeric_entry (ev->keyval)) { + /* drop through to normal handling */ return false; - - default: - break; } - + /* illegal key for gain entry */ return true; } @@ -567,8 +534,19 @@ GainMeter::popup_meter_menu (GdkEventButton *ev) meter_menu->popup (1, ev->time); } +bool +GainMeter::gain_focused (GdkEventFocus* ev) +{ + if (ev->in) { + gain_display.select_region (0, -1); + } else { + gain_display.select_region (0, 0); + } + return false; +} + void -GainMeter::gain_entered () +GainMeter::gain_activated () { float f; diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 8d80e36781..88105ce846 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -35,6 +35,7 @@ #include #include +#include #include #include "enums.h" @@ -79,10 +80,11 @@ class GainMeter : public Gtk::VBox ARDOUR::Session& _session; bool ignore_toggle; + bool next_release_selects; Gtkmm2ext::VSliderController *gain_slider; Gtk::Adjustment gain_adjustment; - Gtk::Entry gain_display; + Gtkmm2ext::FocusEntry gain_display; Gtk::Entry peak_display; Gtk::HBox gain_display_box; Gtk::HBox fader_box; @@ -120,7 +122,8 @@ class GainMeter : public Gtk::VBox gint meter_metrics_expose (GdkEventExpose *); void show_gain (); - void gain_entered (); + void gain_activated (); + bool gain_focused (GdkEventFocus*); struct MeterInfo { Gtkmm2ext::FastMeter *meter; diff --git a/gtk2_ardour/icons/fader_belt.png b/gtk2_ardour/icons/fader_belt.png index bc61b4a0fc..eefed15c76 100644 Binary files a/gtk2_ardour/icons/fader_belt.png and b/gtk2_ardour/icons/fader_belt.png differ diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 4d7c133770..303c4a4c53 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -544,3 +544,52 @@ longest (vector& strings) return *longest; } + +bool +key_is_legal_for_numeric_entry (guint keyval) +{ + switch (keyval) { + case GDK_minus: + case GDK_plus: + case GDK_period: + case GDK_comma: + case GDK_0: + case GDK_1: + case GDK_2: + case GDK_3: + case GDK_4: + case GDK_5: + case GDK_6: + case GDK_7: + case GDK_8: + case GDK_9: + case GDK_KP_Add: + case GDK_KP_Subtract: + case GDK_KP_Decimal: + case GDK_KP_0: + case GDK_KP_1: + case GDK_KP_2: + case GDK_KP_3: + case GDK_KP_4: + case GDK_KP_5: + case GDK_KP_6: + case GDK_KP_7: + case GDK_KP_8: + case GDK_KP_9: + case GDK_Return: + case GDK_BackSpace: + case GDK_Delete: + case GDK_KP_Enter: + case GDK_Home: + case GDK_End: + case GDK_Left: + case GDK_Right: + return true; + + default: + break; + } + + return false; +} + diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index bb2a21d6c3..0e6f3e61b1 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -81,5 +81,6 @@ Glib::RefPtr get_icon (const char*); static std::map > xpm_map; const char* const *get_xpm_data (std::string path); std::string longest (std::vector&); +bool key_is_legal_for_numeric_entry (guint keyval); #endif /* __ardour_gtk_utils_h__ */ diff --git a/libs/gtkmm2ext/SConscript b/libs/gtkmm2ext/SConscript index 1a7ab75264..fa69755d93 100644 --- a/libs/gtkmm2ext/SConscript +++ b/libs/gtkmm2ext/SConscript @@ -39,6 +39,7 @@ choice.cc click_box.cc dndtreeview.cc fastmeter.cc +focus_entry.cc gtk_ui.cc hexentry.cc idle_adjustment.cc diff --git a/libs/gtkmm2ext/focus_entry.cc b/libs/gtkmm2ext/focus_entry.cc new file mode 100644 index 0000000000..dbe833d06b --- /dev/null +++ b/libs/gtkmm2ext/focus_entry.cc @@ -0,0 +1,31 @@ +#include + +using namespace Gtkmm2ext; + +FocusEntry::FocusEntry () +{ + next_release_selects = false; +} + +bool +FocusEntry::on_button_press_event (GdkEventButton* ev) +{ + if (!has_focus()) { + next_release_selects = true; + } + return Entry::on_button_press_event (ev); +} + +bool +FocusEntry::on_button_release_event (GdkEventButton* ev) +{ + if (next_release_selects) { + bool ret = Entry::on_button_release_event (ev); + select_region (0, -1); + next_release_selects = false; + return ret; + } + + return Entry::on_button_release_event (ev); +} + diff --git a/libs/gtkmm2ext/gtkmm2ext/focus_entry.h b/libs/gtkmm2ext/gtkmm2ext/focus_entry.h new file mode 100644 index 0000000000..5d9d7fdac7 --- /dev/null +++ b/libs/gtkmm2ext/gtkmm2ext/focus_entry.h @@ -0,0 +1,22 @@ +#ifndef __gtkmm2ext_focus_entry_h__ +#define __gtkmm2ext_focus_entry_h__ + +#include + +namespace Gtkmm2ext { + +class FocusEntry : public Gtk::Entry +{ + public: + FocusEntry (); + + protected: + bool on_button_press_event (GdkEventButton*); + bool on_button_release_event (GdkEventButton*); + private: + bool next_release_selects; +}; + +} + +#endif /* __gtkmm2ext_focus_entry_h__ */ diff --git a/libs/gtkmm2ext/pixfader.cc b/libs/gtkmm2ext/pixfader.cc index 53bc893e09..f3a40ffc69 100644 --- a/libs/gtkmm2ext/pixfader.cc +++ b/libs/gtkmm2ext/pixfader.cc @@ -59,18 +59,24 @@ PixFader::on_expose_event (GdkEventExpose* ev) GdkRectangle intersection; int dh = display_height (); int offset_into_pixbuf = (int) floor (view.height / ((float) view.height / dh)); + Glib::RefPtr fg_gc (get_style()->get_fg_gc(get_state())); if (gdk_rectangle_intersect (&view, &ev->area, &intersection)) { - get_window()->draw_pixbuf(get_style()->get_fg_gc(get_state()), pixbuf, - intersection.x, offset_into_pixbuf + intersection.y, - intersection.x, intersection.y, - intersection.width, intersection.height, - Gdk::RGB_DITHER_NONE, 0, 0); + get_window()->draw_pixbuf (fg_gc, pixbuf, + intersection.x, offset_into_pixbuf + intersection.y, + intersection.x, intersection.y, + intersection.width, intersection.height, + Gdk::RGB_DITHER_NONE, 0, 0); + + get_window()->draw_line (get_style()->get_bg_gc(STATE_ACTIVE), 0, 0, view.width - 1, 0); /* top */ + get_window()->draw_line (get_style()->get_bg_gc(STATE_ACTIVE), 0, 0, 0, view.height - 1); /* left */ + get_window()->draw_line (get_style()->get_bg_gc(STATE_NORMAL), view.width - 1, 0, view.width - 1, view.height - 1); /* right */ + get_window()->draw_line (get_style()->get_bg_gc(STATE_NORMAL), 0, view.height - 1, view.width - 1, view.height - 1); /* bottom */ } /* always draw the line */ - get_window()->draw_line (get_style()->get_fg_gc(get_state()), 0, unity_y, view.width - 2, unity_y); + get_window()->draw_line (fg_gc, 1, unity_y, view.width - 2, unity_y); last_drawn = dh; return true;