frame for fader belt; better focus behaviour for gain display text entry (generalized)
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 30 Nov 2006 04:21:32 +0000 (04:21 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 30 Nov 2006 04:21:32 +0000 (04:21 +0000)
git-svn-id: svn://localhost/ardour2/trunk@1171 d708f5d6-7413-0410-9779-e7cbd77b26cf

12 files changed:
gtk2_ardour/ardour2_ui.rc
gtk2_ardour/ardour_ui.cc
gtk2_ardour/editor.cc
gtk2_ardour/gain_meter.cc
gtk2_ardour/gain_meter.h
gtk2_ardour/icons/fader_belt.png
gtk2_ardour/utils.cc
gtk2_ardour/utils.h
libs/gtkmm2ext/SConscript
libs/gtkmm2ext/focus_entry.cc [new file with mode: 0644]
libs/gtkmm2ext/gtkmm2ext/focus_entry.h [new file with mode: 0644]
libs/gtkmm2ext/pixfader.cc

index 047b896631b824d1bcf628d1ab33b4abbbac816f..642a2e83826a5c3b96f5b2f74fcd8b7b8bd09e8d 100644 (file)
@@ -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"
index 00acc7d5d6318dd473deee0db4d1dc6c0b885259..efd9fe92bae7a4cc322a0ceaf226ad671e4dd55e 100644 (file)
@@ -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;
index c15950d97db03f6a5bffec0f436f2c733c62e832..45cb912934f1b19c87765ef8f3ad6adddbf8d06a 100644 (file)
@@ -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 ();
 
 
index 5e98b831a000451611b6aaf969337e831edeb929..bcd5bd034475546dea900df6323b8043a5cb8fb1 100644 (file)
@@ -82,7 +82,8 @@ GainMeter::GainMeter (boost::shared_ptr<IO> 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> 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> 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> 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> 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;
 
index 8d80e3678144b0c93a24a5f4348c0ce8a20e8a56..88105ce846afdd99ede76101053e4523c93d52b3 100644 (file)
@@ -35,6 +35,7 @@
 #include <ardour/types.h>
 
 #include <gtkmm2ext/click_box.h>
+#include <gtkmm2ext/focus_entry.h>
 #include <gtkmm2ext/slider_controller.h>
 
 #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;
index bc61b4a0fcedba35ca6a56b970f776b1d56e4d73..eefed15c76c0aaf1f0e0ffb9d764c8a0d1f5d6e4 100644 (file)
Binary files a/gtk2_ardour/icons/fader_belt.png and b/gtk2_ardour/icons/fader_belt.png differ
index 4d7c133770b1103a52c20e6192970908fc296421..303c4a4c53c8114d3d8bbf797a073a8ce1ba35be 100644 (file)
@@ -544,3 +544,52 @@ longest (vector<string>& 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;
+}
+
index bb2a21d6c3655e55382202c524c0a9569a52590b..0e6f3e61b132113dbdc72e7bc496dc531565a03d 100644 (file)
@@ -81,5 +81,6 @@ Glib::RefPtr<Gdk::Pixbuf> get_icon (const char*);
 static std::map<std::string, Glib::RefPtr<Gdk::Pixbuf> > xpm_map;
 const char* const *get_xpm_data (std::string path);
 std::string longest (std::vector<std::string>&);
+bool key_is_legal_for_numeric_entry (guint keyval);
 
 #endif /* __ardour_gtk_utils_h__ */
index 1a7ab75264d706abf0d3693876fa72269dbdf8f1..fa69755d93d51501105648fcfe014b94a6cf59e1 100644 (file)
@@ -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 (file)
index 0000000..dbe833d
--- /dev/null
@@ -0,0 +1,31 @@
+#include <gtkmm2ext/focus_entry.h>
+
+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 (file)
index 0000000..5d9d7fd
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef __gtkmm2ext_focus_entry_h__
+#define __gtkmm2ext_focus_entry_h__
+
+#include <gtkmm/entry.h>
+
+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__ */
index 53bc893e09734fc5e65f4b3242563e1363072377..f3a40ffc69eaaa0f6ee82da8296b11017b51bcee 100644 (file)
@@ -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<Gdk::GC> 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;