X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Faudio_clock.cc;h=d7fb3766888751236ba6b3727f318ee4f4dc891e;hb=fc5c247aa152235a749180bd0e86efe0ce32a20a;hp=4eb8a2e8aa0040a0e2e2a2055b54a3a1cba5f56d;hpb=815a8b09e4fdb40eb209d1f1eb2349206ce82200;p=ardour.git diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 4eb8a2e8aa..d7fb376688 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -31,17 +31,17 @@ #include "gtkmm2ext/rgb_macros.h" #include "ardour/profile.h" +#include "ardour/lmath.h" #include "ardour/session.h" #include "ardour/slave.h" #include "ardour/tempo.h" #include "ardour/types.h" -#include "ardour_ui.h" #include "audio_clock.h" -#include "global_signals.h" #include "utils.h" #include "keyboard.h" #include "gui_thread.h" +#include "ui_config.h" #include "i18n.h" using namespace ARDOUR; @@ -54,7 +54,7 @@ using Gtkmm2ext::Keyboard; sigc::signal AudioClock::ModeChanged; vector AudioClock::clocks; -const double AudioClock::info_font_scale_factor = 0.60; +const double AudioClock::info_font_scale_factor = 0.68; const double AudioClock::separator_height = 0.0; const double AudioClock::x_leading_padding = 6.0; @@ -64,13 +64,15 @@ const double AudioClock::x_leading_padding = 6.0; #define TXTSPAN "" AudioClock::AudioClock (const string& clock_name, bool transient, const string& widget_name, - bool allow_edit, bool follows_playhead, bool duration, bool with_info) + bool allow_edit, bool follows_playhead, bool duration, bool with_info, + bool accept_on_focus_out) : ops_menu (0) , _name (clock_name) , is_transient (transient) , is_duration (duration) , editable (allow_edit) , _follows_playhead (follows_playhead) + , _accept_on_focus_out (accept_on_focus_out) , _off (false) , em_width (0) , _edit_by_click_field (false) @@ -95,6 +97,8 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string& , last_sdelta (0) , dragging (false) , drag_field (Field (0)) + , xscale (1.0) + , yscale (1.0) { set_flags (CAN_FOCUS); @@ -116,8 +120,8 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string& clocks.push_back (this); } - ColorsChanged.connect (sigc::mem_fun (*this, &AudioClock::set_colors)); - DPIReset.connect (sigc::mem_fun (*this, &AudioClock::dpi_reset)); + UIConfiguration::instance().ColorsChanged.connect (sigc::mem_fun (*this, &AudioClock::set_colors)); + UIConfiguration::instance().DPIReset.connect (sigc::mem_fun (*this, &AudioClock::dpi_reset)); } AudioClock::~AudioClock () @@ -147,7 +151,7 @@ AudioClock::on_realize () Gtk::Requisition req; CairoWidget::on_realize (); - + set_clock_dimensions (req); first_width = req.width; @@ -216,15 +220,15 @@ AudioClock::set_colors () uint32_t cursor_color; if (active_state()) { - bg_color = ARDOUR_UI::config()->color (string_compose ("%1 active: background", get_name())); - text_color = ARDOUR_UI::config()->color (string_compose ("%1 active: text", get_name())); - editing_color = ARDOUR_UI::config()->color (string_compose ("%1 active: edited text", get_name())); - cursor_color = ARDOUR_UI::config()->color (string_compose ("%1 active: cursor", get_name())); + bg_color = UIConfiguration::instance().color (string_compose ("%1 active: background", get_name())); + text_color = UIConfiguration::instance().color (string_compose ("%1 active: text", get_name())); + editing_color = UIConfiguration::instance().color (string_compose ("%1 active: edited text", get_name())); + cursor_color = UIConfiguration::instance().color (string_compose ("%1 active: cursor", get_name())); } else { - bg_color = ARDOUR_UI::config()->color (string_compose ("%1: background", get_name())); - text_color = ARDOUR_UI::config()->color (string_compose ("%1: text", get_name())); - editing_color = ARDOUR_UI::config()->color (string_compose ("%1: edited text", get_name())); - cursor_color = ARDOUR_UI::config()->color (string_compose ("%1: cursor", get_name())); + bg_color = UIConfiguration::instance().color (string_compose ("%1: background", get_name())); + text_color = UIConfiguration::instance().color (string_compose ("%1: text", get_name())); + editing_color = UIConfiguration::instance().color (string_compose ("%1: edited text", get_name())); + cursor_color = UIConfiguration::instance().color (string_compose ("%1: cursor", get_name())); } /* store for bg and cursor in render() */ @@ -277,6 +281,15 @@ AudioClock::set_colors () queue_draw (); } +void +AudioClock::set_scale (double x, double y) +{ + xscale = x; + yscale = y; + + queue_draw (); +} + void AudioClock::render (cairo_t* cr, cairo_rectangle_t*) { @@ -296,10 +309,22 @@ AudioClock::render (cairo_t* cr, cairo_rectangle_t*) cairo_fill (cr); } - cairo_move_to (cr, (get_width() - layout_width) / 2.0, (upper_height - layout_height) / 2.0); + double lw = layout_width * xscale; + double lh = layout_height * yscale; + + cairo_move_to (cr, (get_width() - lw) / 2.0, (upper_height - lh) / 2.0); + + if (xscale != 1.0 || yscale != 1.0) { + cairo_save (cr); + cairo_scale (cr, xscale, yscale); + } pango_cairo_show_layout (cr, _layout->gobj()); + if (xscale != 1.0 || yscale != 1.0) { + cairo_restore (cr); + } + if (_left_layout) { double h = get_height() - upper_height - separator_height; @@ -310,7 +335,7 @@ AudioClock::render (cairo_t* cr, cairo_rectangle_t*) if (mode_based_info_ratio != 1.0) { - double left_rect_width = round (((get_width() - separator_height) * mode_based_info_ratio) + 0.5); + double left_rect_width = get_left_rect_width(); if (_need_bg) { if (corner_radius) { @@ -446,7 +471,10 @@ AudioClock::set_clock_dimensions (Gtk::Requisition& req) tmp->set_font_description (font); /* this string is the longest thing we will ever display */ - tmp->set_text (" 88:88:88,888"); + if (_mode == MinSec) + tmp->set_text (" 88:88:88,888 "); + else + tmp->set_text (" 88:88:88,88 "); tmp->get_pixel_size (req.width, req.height); layout_height = req.height; @@ -479,15 +507,15 @@ AudioClock::on_size_request (Gtk::Requisition* req) Glib::RefPtr style = get_style (); Pango::FontDescription font; int w; - + tmp = Pango::Layout::create (get_pango_context()); - + if (!is_realized()) { font = get_font_for_style (get_name()); } else { font = style->get_font(); } - + tmp->set_font_description (font); font.set_size (INFO_FONT_SIZE); @@ -533,17 +561,17 @@ AudioClock::start_edit (Field f) edit_string.clear (); _layout->set_text (""); } - + input_string.clear (); editing = true; edit_is_negative = false; - + if (f) { input_string = get_field (f); show_edit_status (merge_input_and_edit_string ()); _layout->set_text (edit_string); } - + queue_draw (); Keyboard::magic_widget_grab_focus (); @@ -1391,7 +1419,10 @@ AudioClock::on_key_press_event (GdkEventKey* ev) goto use_input_string; default: - return false; + /* do not allow other keys to passthru to the rest of the GUI + when editing. + */ + return true; } if (!insert_map.empty() && (input_string.length() >= insert_map.size())) { @@ -1661,7 +1692,7 @@ AudioClock::on_focus_out_event (GdkEventFocus* ev) bool ret = CairoWidget::on_focus_out_event (ev); if (editing) { - end_edit (false); + end_edit (_accept_on_focus_out); } return ret; @@ -2055,6 +2086,24 @@ AudioClock::frames_from_audioframes_string (const string& str) const return f; } +void +AudioClock::copy_text_to_clipboard () const +{ + string val; + if (editing) { + val = pre_edit_string; + } else { + val = _layout->get_text (); + } + const size_t trim = val.find_first_not_of(" "); + if (trim == string::npos) { + assert(0); // empty clock, can't be right. + return; + } + Glib::RefPtr cl = Gtk::Clipboard::get(); + cl->set_text (val.substr(trim)); +} + void AudioClock::build_ops_menu () { @@ -2072,9 +2121,11 @@ AudioClock::build_ops_menu () if (editable && !_off && !is_duration && !_follows_playhead) { ops_items.push_back (SeparatorElem()); - ops_items.push_back (MenuElem (_("Set From Playhead"), sigc::mem_fun(*this, &AudioClock::set_from_playhead))); + ops_items.push_back (MenuElem (_("Set from Playhead"), sigc::mem_fun(*this, &AudioClock::set_from_playhead))); ops_items.push_back (MenuElem (_("Locate to This Time"), sigc::mem_fun(*this, &AudioClock::locate))); } + ops_items.push_back (SeparatorElem()); + ops_items.push_back (MenuElem (_("Copy to clipboard"), sigc::mem_fun(*this, &AudioClock::copy_text_to_clipboard))); } void @@ -2111,6 +2162,9 @@ AudioClock::set_mode (Mode m) _layout->set_text (""); + Gtk::Requisition req; + set_clock_dimensions (req); + if (_left_layout) { _left_layout->set_attributes (info_attributes);