summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-11-30 04:21:32 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-11-30 04:21:32 +0000
commite002eea388f9850cc5d416c70a87ffae1929b1f7 (patch)
tree22896b5e69b24f6a9d7d4f24935a09c9c717948a
parentf987091756dc2229636ba49e344d1e8ba534169c (diff)
frame for fader belt; better focus behaviour for gain display text entry (generalized)
git-svn-id: svn://localhost/ardour2/trunk@1171 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/ardour2_ui.rc27
-rw-r--r--gtk2_ardour/ardour_ui.cc2
-rw-r--r--gtk2_ardour/editor.cc2
-rw-r--r--gtk2_ardour/gain_meter.cc104
-rw-r--r--gtk2_ardour/gain_meter.h7
-rw-r--r--gtk2_ardour/icons/fader_belt.pngbin778 -> 3854 bytes
-rw-r--r--gtk2_ardour/utils.cc49
-rw-r--r--gtk2_ardour/utils.h1
-rw-r--r--libs/gtkmm2ext/SConscript1
-rw-r--r--libs/gtkmm2ext/focus_entry.cc31
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/focus_entry.h22
-rw-r--r--libs/gtkmm2ext/pixfader.cc18
12 files changed, 187 insertions, 77 deletions
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> 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;
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 <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;
diff --git a/gtk2_ardour/icons/fader_belt.png b/gtk2_ardour/icons/fader_belt.png
index bc61b4a0fc..eefed15c76 100644
--- a/gtk2_ardour/icons/fader_belt.png
+++ b/gtk2_ardour/icons/fader_belt.png
Binary files 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<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;
+}
+
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<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__ */
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 <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
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 <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__ */
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<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;