remove varispeed control; shuttle controller now has a context menu with max speed options; rearrange and optimize meter metric displays

git-svn-id: svn://localhost/trunk/ardour2@382 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2006-03-12 18:21:48 +00:00
parent fd9d6433a1
commit a505e1469d
8 changed files with 174 additions and 65 deletions

View File

@ -480,8 +480,8 @@ style "editor_time_ruler" = "small_text"
style "audio_track_base" = "default_base"
{
font_name = "sans medium 8"
fg[NORMAL] = { 0.80, 0.80, 0.80 }
font_name = "sans 6"
fg[NORMAL] = { 0.77, 0.77, 0.72 }
bg[NORMAL] = { 0.18, 0.18, 0.22 }
bg[ACTIVE] = { 0.20, 0.20, 0.20 }
bg[PRELIGHT] = { 0.20, 0.20, 0.20 }
@ -491,7 +491,8 @@ style "audio_track_base" = "default_base"
style "audio_bus_base"
{
font_name = "sans medium 8"
font_name = "sans 6"
fg[NORMAL] = { 0.77, 0.77, 0.72 }
fg[NORMAL] = { 0.7, 0.8, 0.2 }
bg[NORMAL] = {0, 0.36, 0.40 }
}
@ -778,8 +779,8 @@ style "tearoff_arrow" = "medium_bold_entry"
style "meter_metrics_strip" = "default_base"
{
font = "sans medium 10"
fg[NORMAL] = { 0.7, 0.8, 0.2 }
font_name = "sans 4"
fg[NORMAL] = { 1.0, 0.8, 0.2 }
}
style "location_row_button" = "default_buttons_menus"

View File

@ -177,6 +177,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
shuttle_grabbed = false;
shuttle_fract = 0.0;
shuttle_max_speed = 8.0f;
set_shuttle_units (Percentage);
set_shuttle_behaviour (Sprung);

View File

@ -388,11 +388,16 @@ class ARDOUR_UI : public Gtkmm2ext::UI
Gtk::Menu* shuttle_style_menu;
ShuttleBehaviour shuttle_behaviour;
ShuttleUnits shuttle_units;
float shuttle_max_speed;
Gtk::Menu* shuttle_context_menu;
void build_shuttle_context_menu ();
void show_shuttle_context_menu ();
void shuttle_style_changed();
void shuttle_unit_clicked ();
void set_shuttle_behaviour (ShuttleBehaviour);
void set_shuttle_units (ShuttleUnits);
void set_shuttle_max_speed (float);
void update_speed_display ();
float last_speed_displayed;

View File

@ -56,8 +56,6 @@ using namespace sigc;
int
ARDOUR_UI::setup_windows ()
{
using namespace Menu_Helpers;
if (create_editor ()) {
error << _("UI: cannot setup editor") << endmsg;
return -1;
@ -556,12 +554,73 @@ ARDOUR_UI::audition_blink (bool onoff)
}
}
void
ARDOUR_UI::build_shuttle_context_menu ()
{
using namespace Menu_Helpers;
shuttle_context_menu = new Menu();
MenuList& items = shuttle_context_menu->items();
Menu* speed_menu = manage (new Menu());
MenuList& speed_items = speed_menu->items();
RadioMenuItem::Group group;
speed_items.push_back (RadioMenuElem (group, "8", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 8.0f)));
if (shuttle_max_speed == 8.0) {
static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
}
speed_items.push_back (RadioMenuElem (group, "6", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 6.0f)));
if (shuttle_max_speed == 6.0) {
static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
}
speed_items.push_back (RadioMenuElem (group, "4", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 4.0f)));
if (shuttle_max_speed == 4.0) {
static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
}
speed_items.push_back (RadioMenuElem (group, "3", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 3.0f)));
if (shuttle_max_speed == 3.0) {
static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
}
speed_items.push_back (RadioMenuElem (group, "2", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 2.0f)));
if (shuttle_max_speed == 2.0) {
static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
}
speed_items.push_back (RadioMenuElem (group, "1.5", bind (mem_fun (*this, &ARDOUR_UI::set_shuttle_max_speed), 1.5f)));
if (shuttle_max_speed == 1.5) {
static_cast<RadioMenuItem*>(&speed_items.back())->set_active ();
}
items.push_back (MenuElem (_("Maximum speed"), *speed_menu));
}
void
ARDOUR_UI::show_shuttle_context_menu ()
{
if (shuttle_context_menu == 0) {
build_shuttle_context_menu ();
}
shuttle_context_menu->popup (1, 0);
}
void
ARDOUR_UI::set_shuttle_max_speed (float speed)
{
shuttle_max_speed = speed;
}
gint
ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev)
{
if (!session) {
return TRUE;
return true;
}
if (Keyboard::is_context_menu_event (ev)) {
show_shuttle_context_menu ();
return true;
}
switch (ev->button) {
@ -573,20 +632,20 @@ ARDOUR_UI::shuttle_box_button_press (GdkEventButton* ev)
case 2:
case 3:
return TRUE;
return true;
break;
}
return TRUE;
return true;
}
gint
ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
{
if (!session) {
return TRUE;
return true;
}
switch (ev->button) {
case 1:
mouse_shuttle (ev->x, true);
@ -597,7 +656,7 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
session->request_transport_speed (1.0);
shuttle_box.queue_draw ();
}
return TRUE;
return true;
case 2:
if (session->transport_rolling()) {
@ -607,10 +666,10 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
shuttle_fract = 0;
}
shuttle_box.queue_draw ();
return TRUE;
return true;
case 3:
return TRUE;
return true;
case 4:
shuttle_fract += 0.005;
@ -622,14 +681,14 @@ ARDOUR_UI::shuttle_box_button_release (GdkEventButton* ev)
use_shuttle_fract (true);
return TRUE;
return true;
}
gint
ARDOUR_UI::shuttle_box_motion (GdkEventMotion* ev)
{
if (!session || !shuttle_grabbed) {
return TRUE;
return true;
}
return mouse_shuttle (ev->x, false);
@ -649,7 +708,7 @@ ARDOUR_UI::mouse_shuttle (double x, bool force)
shuttle_fract = distance / half_width;
use_shuttle_fract (force);
return TRUE;
return true;
}
void
@ -679,7 +738,7 @@ ARDOUR_UI::use_shuttle_fract (bool force)
fract = -fract;
}
session->request_transport_speed (8.0 * fract); // Formula A2
session->request_transport_speed (shuttle_max_speed * fract); // Formula A2
shuttle_box.queue_draw ();
}
@ -706,7 +765,7 @@ ARDOUR_UI::shuttle_box_expose (GdkEventExpose* event)
0,
x,
shuttle_box.get_height());
return TRUE;
return true;
}
void

View File

@ -52,10 +52,12 @@ using namespace ARDOUR;
using namespace Gtkmm2ext;
using namespace Gtk;
using namespace sigc;
using namespace std;
sigc::signal<void> GainMeter::ResetAllPeakDisplays;
sigc::signal<void,RouteGroup*> GainMeter::ResetGroupPeakDisplays;
Pix* GainMeter::slider_pix = 0;
map<string,Glib::RefPtr<Gdk::Pixmap> > GainMeter::metric_pixmaps;
int
GainMeter::setup_slider_pix ()
@ -74,6 +76,12 @@ GainMeter::setup_slider_pix ()
return 0;
}
void
was_pressed ()
{
cerr << "was pressed\n";
}
GainMeter::GainMeter (IO& io, Session& s)
: _io (io),
_session (s),
@ -113,6 +121,8 @@ GainMeter::GainMeter (IO& io, Session& s)
gain_unit_button.set_name ("MixerStripGainUnitButton");
gain_unit_label.set_name ("MixerStripGainUnitButton");
gain_unit_button.signal_clicked().connect (ptr_fun (was_pressed));
top_table.set_col_spacings (2);
top_table.set_homogeneous (true);
top_table.attach (gain_unit_button, 0, 1, 0, 1);
@ -120,6 +130,7 @@ GainMeter::GainMeter (IO& io, Session& s)
Route* r;
if ((r = dynamic_cast<Route*> (&_io)) != 0) {
r->meter_change.connect (mem_fun(*this, &GainMeter::meter_changed));
meter_point_button.add (meter_point_label);
meter_point_button.set_name ("MixerStripMeterPreButton");
@ -168,17 +179,14 @@ GainMeter::GainMeter (IO& io, Session& s)
gain_display_box.pack_end (peak_display_frame, Gtk::PACK_SHRINK);
meter_metric_area.set_size_request (18, -1);
meter_metric_area.set_size_request (25, -1);
meter_metric_area.set_name ("MeterMetricsStrip");
meter_packer.set_spacing (2);
fader_box.set_spacing (2);
fader_box.pack_start (*gain_slider, Gtk::PACK_SHRINK);
hbox.set_spacing (4);
hbox.pack_start (fader_box, Gtk::PACK_SHRINK);
hbox.pack_start (meter_packer, Gtk::PACK_SHRINK);
hbox.pack_start (*gain_slider, false, false, 2);
hbox.pack_start (meter_packer, true, false);
set_spacing (4);
@ -217,24 +225,54 @@ GainMeter::set_width (Width w)
setup_meters ();
}
Glib::RefPtr<Gdk::Pixmap>
GainMeter::render_metrics (Gtk::Widget& w)
{
Glib::RefPtr<Gdk::Window> win (w.get_window());
Glib::RefPtr<Gdk::GC> fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
Glib::RefPtr<Gdk::GC> bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
gint x, y, width, height, depth;
int db_points[] = { -50, -40, -20, -30, -10, -3, 0, 4 };
char buf[32];
int theight;
int twidth;
win->get_geometry (x, y, width, height, depth);
Glib::RefPtr<Gdk::Pixmap> pixmap = Gdk::Pixmap::create (win, width, height);
metric_pixmaps[w.get_name()] = pixmap;
pixmap->draw_rectangle (bg_gc, true, 0, 0, width, height);
Glib::RefPtr<Pango::Layout> layout = w.create_pango_layout("");
for (uint32_t i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) {
float fraction = log_meter (db_points[i]);
gint pos = height - (gint) floor (height * fraction);
snprintf (buf, sizeof (buf), "%d", abs (db_points[i]));
layout->set_text (buf);
layout->get_pixel_size (twidth, theight);
pixmap->draw_line (fg_gc, 0, pos, 4, pos);
pixmap->draw_layout (fg_gc, 6, pos - (theight/2), layout);
}
return pixmap;
}
gint
GainMeter::meter_metrics_expose (GdkEventExpose *ev)
{
/* XXX optimize this so that it doesn't do it all everytime */
double fraction;
Glib::RefPtr<Gdk::Window> win (meter_metric_area.get_window());
Glib::RefPtr<Gdk::GC> fg_gc (meter_metric_area.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
Glib::RefPtr<Gdk::GC> bg_gc (meter_metric_area.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
gint x, y, width, height, depth;
gint pos;
int db_points[] = { -50, -10, -3, 0, 6 };
uint32_t i;
char buf[32];
GdkRectangle base_rect;
GdkRectangle draw_rect;
int theight;
int twidth;
gint x, y, width, height, depth;
win->get_geometry (x, y, width, height, depth);
@ -243,30 +281,24 @@ GainMeter::meter_metrics_expose (GdkEventExpose *ev)
base_rect.x = 0;
base_rect.y = 0;
gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect);
win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
Glib::RefPtr<Gdk::Pixmap> pixmap;
std::map<string,Glib::RefPtr<Gdk::Pixmap> >::iterator i = metric_pixmaps.find (meter_metric_area.get_name());
Glib::RefPtr<Pango::Layout> layout = meter_metric_area.create_pango_layout("");
for (i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) {
fraction = log_meter (db_points[i]);
pos = height - (gint) floor (height * fraction);
snprintf (buf, sizeof (buf), "%d", db_points[i]);
layout->set_text (buf);
layout->get_pixel_size (twidth, theight);
win->draw_layout (fg_gc, width - twidth, pos + theight, layout);
if (i == metric_pixmaps.end()) {
pixmap = render_metrics (meter_metric_area);
} else {
pixmap = i->second;
}
gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect);
win->draw_rectangle (bg_gc, true, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
win->draw_drawable (bg_gc, pixmap, draw_rect.x, draw_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
return true;
}
GainMeter::~GainMeter ()
{
if (meter_menu) {
delete meter_menu;
}
@ -398,11 +430,6 @@ GainMeter::setup_meters ()
return;
}
if (_width == Wide) {
meter_packer.pack_start (meter_metric_area, Gtk::PACK_SHRINK);
meter_metric_area.show_all ();
}
if (nmeters <= 2) {
width = regular_meter_width;
} else {
@ -427,6 +454,11 @@ GainMeter::setup_meters ()
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 ();
}
}
gint
@ -596,6 +628,8 @@ GainMeter::meter_press(GdkEventButton* ev)
wait_for_release = false;
cerr << "meter point button press\n";
if ((_route = dynamic_cast<Route*>(&_io)) == 0) {
return FALSE;
}
@ -647,21 +681,22 @@ GainMeter::meter_press(GdkEventButton* ev)
}
}
return stop_signal (meter_point_button, "button-press-event");
return true;
}
gint
GainMeter::meter_release(GdkEventButton* ev)
{
cerr << "meter point button release\n";
if(!ignore_toggle){
if (wait_for_release){
wait_for_release = false;
set_meter_point (*(dynamic_cast<Route*>(&_io)), old_meter_point);
stop_signal (meter_point_button, "button-release-event");
}
}
return TRUE;
return true;
}
void

View File

@ -22,6 +22,7 @@
#define __ardour_gtk_gain_meter_h__
#include <vector>
#include <map>
#include <gtkmm/box.h>
#include <gtkmm/adjustment.h>
@ -96,6 +97,9 @@ class GainMeter : public Gtk::VBox
Gtk::Table top_table;
Width _width;
static std::map<std::string,Glib::RefPtr<Gdk::Pixmap> > metric_pixmaps;
static Glib::RefPtr<Gdk::Pixmap> render_metrics (Gtk::Widget&);
gint meter_metrics_expose (GdkEventExpose *);
static void _gain_printer (char buf[32], Gtk::Adjustment&, void *);

View File

@ -65,6 +65,7 @@ using namespace ARDOUR;
using namespace Gtk;
using namespace Gtkmm2ext;
#ifdef VARISPEED_IN_MIXER_STRIP
static void
speed_printer (char buf[32], Gtk::Adjustment& adj, void* arg)
{
@ -76,6 +77,7 @@ 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),
@ -85,7 +87,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
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 (7, 2),
gain_automation_style_button (""),
gain_automation_state_button (""),
pan_automation_style_button (""),
@ -157,6 +159,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
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);
@ -214,6 +217,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
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");
@ -225,7 +229,9 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
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);
#endif /* VARISPEED_IN_MIXER_STRIP */
button_table.attach (*rec_enable_button, 0, 2, 6, 7);
}
name_button.add (name_label);
@ -264,7 +270,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session& sess, Route& rt, bool in_mixer)
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);

View File

@ -894,7 +894,6 @@ TempoMap::bbt_duration_at_unlocked (const BBT_Time& when, const BBT_Time& bbt, i
jack_nframes_t
TempoMap::round_to_bar (jack_nframes_t fr, int dir)
{
LockMonitor lm (lock, __LINE__, __FILE__);
@ -903,7 +902,6 @@ TempoMap::round_to_bar (jack_nframes_t fr, int dir)
jack_nframes_t
TempoMap::round_to_beat (jack_nframes_t fr, int dir)
{
LockMonitor lm (lock, __LINE__, __FILE__);