X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Ftime_axis_view_item.cc;h=1d8fc2aca7f6bd6defa2349217519b3441b80fb1;hb=1e8f2693f7837fce868e0e4e710c6e8aeffb7662;hp=2ba90e1e6350aebf0cc7e7de9e31aab4c02e0ae0;hpb=cfe29a14ee4495e5d4c1b6d8301bd858f48a7d4c;p=ardour.git diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc index 2ba90e1e63..1d8fc2aca7 100644 --- a/gtk2_ardour/time_axis_view_item.cc +++ b/gtk2_ardour/time_axis_view_item.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2003 Paul Davis + Copyright (C) 2003 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,14 +17,21 @@ */ -#include -#include +#include "pbd/error.h" +#include "pbd/stacktrace.h" -#include -#include +#include "ardour/types.h" +#include "ardour/ardour.h" #include +#include "ardour_ui.h" +/* + * ardour_ui.h was moved up in the include list + * due to a conflicting definition of 'Rect' between + * Apple's MacTypes.h file and GTK + */ + #include "public_editor.h" #include "time_axis_view_item.h" #include "time_axis_view.h" @@ -32,7 +39,6 @@ #include "utils.h" #include "canvas_impl.h" #include "rgb_macros.h" -#include "ardour_ui.h" #include "i18n.h" @@ -50,11 +56,11 @@ bool TimeAxisViewItem::have_name_font = false; const double TimeAxisViewItem::NAME_X_OFFSET = 15.0; const double TimeAxisViewItem::GRAB_HANDLE_LENGTH = 6 ; +int TimeAxisViewItem::NAME_HEIGHT; double TimeAxisViewItem::NAME_Y_OFFSET; double TimeAxisViewItem::NAME_HIGHLIGHT_SIZE; double TimeAxisViewItem::NAME_HIGHLIGHT_THRESH; - //---------------------------------------------------------------------------------------// // Constructor / Desctructor @@ -69,43 +75,45 @@ double TimeAxisViewItem::NAME_HIGHLIGHT_THRESH; * @param start the start point of this item * @param duration the duration of this item */ -TimeAxisViewItem::TimeAxisViewItem(const string & it_name, ArdourCanvas::Group& parent, TimeAxisView& tv, double spu, Gdk::Color& base_color, - nframes_t start, nframes_t duration, +TimeAxisViewItem::TimeAxisViewItem(const string & it_name, ArdourCanvas::Group& parent, TimeAxisView& tv, double spu, Gdk::Color const & base_color, + nframes64_t start, nframes64_t duration, bool recording, Visibility vis) - : trackview (tv) + : trackview (tv), _recregion(recording) { if (!have_name_font) { /* first constructed item sets up font info */ NAME_FONT = get_font_for_style (N_("TimeAxisViewItemName")); - + Gtk::Window win; Gtk::Label foo; win.add (foo); Glib::RefPtr layout = foo.create_pango_layout (X_("Hg")); /* ascender + descender */ - int width; - int height; + int width = 0; + int height = 0; layout->set_font_description (*NAME_FONT); Gtkmm2ext::get_ink_pixel_size (layout, width, height); - NAME_Y_OFFSET = height + 5; - NAME_HIGHLIGHT_SIZE = height + 6; - NAME_HIGHLIGHT_THRESH = NAME_HIGHLIGHT_SIZE * 2; + NAME_HEIGHT = height; + NAME_Y_OFFSET = height + 3; + NAME_HIGHLIGHT_SIZE = height + 2; + NAME_HIGHLIGHT_THRESH = NAME_HIGHLIGHT_SIZE * 3; have_name_font = true; } group = new ArdourCanvas::Group (parent); - + init (it_name, spu, base_color, start, duration, vis); } TimeAxisViewItem::TimeAxisViewItem (const TimeAxisViewItem& other) - : trackview (other.trackview) + : sigc::trackable(other) + , trackview (other.trackview) { Gdk::Color c; @@ -117,53 +125,46 @@ TimeAxisViewItem::TimeAxisViewItem (const TimeAxisViewItem& other) /* share the other's parent, but still create a new group */ Gnome::Canvas::Group* parent = other.group->property_parent(); - + group = new ArdourCanvas::Group (*parent); init (other.item_name, other.samples_per_unit, c, other.frame_position, other.item_duration, other.visibility); } - void -TimeAxisViewItem::init (const string& it_name, double spu, Gdk::Color& base_color, nframes_t start, nframes_t duration, Visibility vis) +TimeAxisViewItem::init (const string& it_name, double spu, Gdk::Color const & base_color, nframes64_t start, nframes64_t duration, Visibility vis) { item_name = it_name ; - name_text_width = ::pixel_width (it_name, *NAME_FONT); - last_name_text_width = 0; samples_per_unit = spu ; should_show_selection = true; frame_position = start ; item_duration = duration ; name_connected = false; - // why? fill_opacity = 60; + fill_opacity = 60; position_locked = false ; max_item_duration = ARDOUR::max_frames; min_item_duration = 0 ; show_vestigial = true; visibility = vis; _sensitive = true; + name_pixbuf_width = 0; + last_item_width = 0; if (duration == 0) { warning << "Time Axis Item Duration == 0" << endl ; } - vestigial_frame = new ArdourCanvas::SimpleRect (*group); - vestigial_frame->property_x1() = (double) 0.0; - vestigial_frame->property_y1() = (double) 1.0; - vestigial_frame->property_x2() = 2.0; - vestigial_frame->property_y2() = (double) trackview.height; + vestigial_frame = new ArdourCanvas::SimpleRect (*group, 0.0, 1.0, 2.0, trackview.current_height()); + vestigial_frame->hide (); + vestigial_frame->property_outline_what() = 0xF; vestigial_frame->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_VestigialFrame.get(); vestigial_frame->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_VestigialFrame.get(); - vestigial_frame->hide (); if (visibility & ShowFrame) { - frame = new ArdourCanvas::SimpleRect (*group); - frame->property_x1() = (double) 0.0; - frame->property_y1() = (double) 1.0; - frame->property_x2() = (double) trackview.editor.frame_to_pixel(duration); - frame->property_y2() = (double) trackview.height; + frame = new ArdourCanvas::SimpleRect (*group, 0.0, 1.0, trackview.editor().frame_to_pixel(duration), trackview.current_height()); + frame->property_outline_pixels() = 1; + frame->property_outline_what() = 0xF; frame->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeAxisFrame.get(); - frame->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeAxisFrame.get(); /* by default draw all 4 edges */ @@ -182,25 +183,17 @@ TimeAxisViewItem::init (const string& it_name, double spu, Gdk::Color& base_colo } frame->property_outline_what() = outline_what; - + } else { frame = 0; } if (visibility & ShowNameHighlight) { - name_highlight = new ArdourCanvas::SimpleRect (*group); if (visibility & FullWidthNameHighlight) { - name_highlight->property_x1() = (double) 0.0; - name_highlight->property_x2() = (double) (trackview.editor.frame_to_pixel(item_duration)); + name_highlight = new ArdourCanvas::SimpleRect (*group, 0.0, trackview.editor().frame_to_pixel(item_duration), trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE, trackview.current_height() - 1); } else { - name_highlight->property_x1() = (double) 1.0; - name_highlight->property_x2() = (double) (trackview.editor.frame_to_pixel(item_duration)) - 1; + name_highlight = new ArdourCanvas::SimpleRect (*group, 1.0, trackview.editor().frame_to_pixel(item_duration) - 1, trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE, trackview.current_height() - 1); } - name_highlight->property_y1() = (double) (trackview.height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE); - name_highlight->property_y2() = (double) (trackview.height - 1); - name_highlight->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_NameHighlightFill.get(); - name_highlight->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_NameHighlightOutline.get(); - name_highlight->set_data ("timeaxisviewitem", this); } else { @@ -208,44 +201,20 @@ TimeAxisViewItem::init (const string& it_name, double spu, Gdk::Color& base_colo } if (visibility & ShowNameText) { - name_text = new ArdourCanvas::Text (*group); - name_text->property_x() = (double) TimeAxisViewItem::NAME_X_OFFSET; - /* trackview.height is the bottom of the trackview. subtract 1 to get back to the bottom of the highlight, - then NAME_Y_OFFSET to position the text in the vertical center of the highlight - */ - name_text->property_y() = (double) trackview.height - 1.0 - TimeAxisViewItem::NAME_Y_OFFSET; - name_text->property_font_desc() = *NAME_FONT; - name_text->property_anchor() = Gtk::ANCHOR_NW; + name_pixbuf = new ArdourCanvas::Pixbuf(*group); + name_pixbuf->property_x() = NAME_X_OFFSET; + name_pixbuf->property_y() = trackview.current_height() - 1.0 - NAME_Y_OFFSET; - name_text->set_data ("timeaxisviewitem", this); - } else { - name_text = 0; + name_pixbuf = 0; } /* create our grab handles used for trimming/duration etc */ + frame_handle_start = new ArdourCanvas::SimpleRect (*group, 0.0, TimeAxisViewItem::GRAB_HANDLE_LENGTH, 5.0, trackview.current_height()); + frame_handle_start->property_outline_what() = 0x0; - if (visibility & ShowHandles) { - frame_handle_start = new ArdourCanvas::SimpleRect (*group); - frame_handle_start->property_x1() = (double) 0.0; - frame_handle_start->property_x2() = (double) TimeAxisViewItem::GRAB_HANDLE_LENGTH; - frame_handle_start->property_y1() = (double) 1.0; - frame_handle_start->property_y2() = (double) TimeAxisViewItem::GRAB_HANDLE_LENGTH+1; - frame_handle_start->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_FrameHandle.get(); - frame_handle_start->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_FrameHandle.get(); - - frame_handle_end = new ArdourCanvas::SimpleRect (*group); - frame_handle_end->property_x1() = (double) (trackview.editor.frame_to_pixel(get_duration())) - (TimeAxisViewItem::GRAB_HANDLE_LENGTH); - frame_handle_end->property_x2() = (double) trackview.editor.frame_to_pixel(get_duration()); - frame_handle_end->property_y1() = (double) 1; - frame_handle_end->property_y2() = (double) TimeAxisViewItem::GRAB_HANDLE_LENGTH + 1; - frame_handle_end->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_FrameHandle.get(); - frame_handle_end->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_FrameHandle.get(); - - } else { - frame_handle_start = 0; - frame_handle_end = 0; - } + frame_handle_end = new ArdourCanvas::SimpleRect (*group, 0.0, TimeAxisViewItem::GRAB_HANDLE_LENGTH, 5.0, trackview.current_height()); + frame_handle_end->property_outline_what() = 0x0; set_color (base_color) ; @@ -273,14 +242,14 @@ TimeAxisViewItem::~TimeAxisViewItem() * @return true if the position change was a success, false otherwise */ bool -TimeAxisViewItem::set_position(nframes_t pos, void* src, double* delta) +TimeAxisViewItem::set_position(nframes64_t pos, void* src, double* delta) { if (position_locked) { return false; } frame_position = pos; - + /* This sucks. The GnomeCanvas version I am using doesn't correctly implement gnome_canvas_group_set_arg(), so that simply setting the "x" arg of the group @@ -289,7 +258,7 @@ TimeAxisViewItem::set_position(nframes_t pos, void* src, double* delta) thing. I see that in GNOME CVS, the current (Sept 2001) version of GNOME Canvas rectifies this issue cleanly. */ - + double old_unit_pos ; double new_unit_pos = pos / samples_per_unit ; @@ -298,11 +267,11 @@ TimeAxisViewItem::set_position(nframes_t pos, void* src, double* delta) if (new_unit_pos != old_unit_pos) { group->move (new_unit_pos - old_unit_pos, 0.0); } - + if (delta) { (*delta) = new_unit_pos - old_unit_pos; } - + PositionChanged (frame_position, src) ; /* EMIT_SIGNAL */ return true; @@ -313,7 +282,7 @@ TimeAxisViewItem::set_position(nframes_t pos, void* src, double* delta) * * @return the position of this item */ -nframes_t +nframes64_t TimeAxisViewItem::get_position() const { return frame_position; @@ -327,7 +296,7 @@ TimeAxisViewItem::get_position() const * @return true if the duration change was succesful, false otherwise */ bool -TimeAxisViewItem::set_duration (nframes_t dur, void* src) +TimeAxisViewItem::set_duration (nframes64_t dur, void* src) { if ((dur > max_item_duration) || (dur < min_item_duration)) { warning << string_compose (_("new duration %1 frames is out of bounds for %2"), get_item_name(), dur) @@ -340,9 +309,9 @@ TimeAxisViewItem::set_duration (nframes_t dur, void* src) } item_duration = dur; - - reset_width_dependent_items (trackview.editor.frame_to_pixel (dur)); - + + reset_width_dependent_items (trackview.editor().frame_to_pixel (dur)); + DurationChanged (dur, src) ; /* EMIT_SIGNAL */ return true; } @@ -351,7 +320,7 @@ TimeAxisViewItem::set_duration (nframes_t dur, void* src) * Returns the duration of this item * */ -nframes_t +nframes64_t TimeAxisViewItem::get_duration() const { return (item_duration); @@ -364,18 +333,18 @@ TimeAxisViewItem::get_duration() const * @param src the identity of the object that initiated the change */ void -TimeAxisViewItem::set_max_duration(nframes_t dur, void* src) +TimeAxisViewItem::set_max_duration(nframes64_t dur, void* src) { max_item_duration = dur ; MaxDurationChanged(max_item_duration, src) ; /* EMIT_SIGNAL */ } - + /** * Returns the maxmimum duration that this item may be set to * * @return the maximum duration that this item may be set to */ -nframes_t +nframes64_t TimeAxisViewItem::get_max_duration() const { return (max_item_duration) ; @@ -388,18 +357,18 @@ TimeAxisViewItem::get_max_duration() const * @param src the identity of the object that initiated the change */ void -TimeAxisViewItem::set_min_duration(nframes_t dur, void* src) +TimeAxisViewItem::set_min_duration(nframes64_t dur, void* src) { min_item_duration = dur ; MinDurationChanged(max_item_duration, src) ; /* EMIT_SIGNAL */ } - + /** * Returns the minimum duration that this item mey be set to * * @return the nimum duration that this item mey be set to */ -nframes_t +nframes64_t TimeAxisViewItem::get_min_duration() const { return(min_item_duration) ; @@ -439,11 +408,11 @@ TimeAxisViewItem::get_position_locked() const * @param src the identity of the object that initiated the change */ void -TimeAxisViewItem::set_max_duration_active(bool active, void* src) +TimeAxisViewItem::set_max_duration_active (bool active, void* /*src*/) { - max_duration_active = active ; + max_duration_active = active; } - + /** * Returns whether the Maximum Duration constraint is active and should be enforced * @@ -454,7 +423,7 @@ TimeAxisViewItem::get_max_duration_active() const { return(max_duration_active) ; } - + /** * Sets whether the Minimum Duration constraint is active and should be enforced * @@ -462,11 +431,11 @@ TimeAxisViewItem::get_max_duration_active() const * @param src the identity of the object that initiated the change */ void -TimeAxisViewItem::set_min_duration_active(bool active, void* src) +TimeAxisViewItem::set_min_duration_active (bool active, void* /*src*/) { min_duration_active = active ; } - + /** * Returns whether the Maximum Duration constraint is active and should be enforced * @@ -493,7 +462,6 @@ TimeAxisViewItem::set_item_name(std::string new_name, void* src) if (new_name != item_name) { std::string temp_name = item_name ; item_name = new_name ; - name_text_width = ::pixel_width (new_name, *NAME_FONT); NameChanged (item_name, temp_name, src) ; /* EMIT_SIGNAL */ } } @@ -527,7 +495,7 @@ TimeAxisViewItem::set_selected(bool yn) } } -void +void TimeAxisViewItem::set_should_show_selection (bool yn) { if (should_show_selection != yn) { @@ -548,7 +516,7 @@ TimeAxisView& TimeAxisViewItem::get_time_axis_view() { return trackview; -} +} //---------------------------------------------------------------------------------------// // ui methods & data @@ -561,77 +529,71 @@ TimeAxisViewItem::get_time_axis_view() void TimeAxisViewItem::set_name_text(const ustring& new_name) { - if (name_text) { - name_text->property_text() = new_name; - name_text_width = pixel_width (new_name, *NAME_FONT); - name_text_size_cache.clear (); + if (!name_pixbuf) { + return; } + + last_item_width = trackview.editor().frame_to_pixel(item_duration); + name_pixbuf_width = pixel_width (new_name, *NAME_FONT) + 2; + name_pixbuf->property_pixbuf() = pixbuf_from_ustring(new_name, NAME_FONT, name_pixbuf_width, NAME_HEIGHT); } + /** - * Set the y position and height of this item. + * Set the height of this item * - * @param y the new y position * @param h the new height - */ + */ void -TimeAxisViewItem::set_y_position_and_height (double y, double h) +TimeAxisViewItem::set_height (double height) { if (name_highlight) { - if (h < NAME_HIGHLIGHT_THRESH) { + if (height < NAME_HIGHLIGHT_THRESH) { name_highlight->hide(); - if (name_text) { - name_text->hide(); - } + name_pixbuf->hide(); + } else { name_highlight->show(); - if (name_text) { - name_text->show(); - } + name_pixbuf->show(); + } - if (h > NAME_HIGHLIGHT_SIZE) { - name_highlight->property_y1() = (double) y + h + 1 - NAME_HIGHLIGHT_SIZE; - name_highlight->property_y2() = (double) y + h; + if (height > NAME_HIGHLIGHT_SIZE) { + name_highlight->property_y1() = (double) height - 1 - NAME_HIGHLIGHT_SIZE; + name_highlight->property_y2() = (double) height - 2; } else { /* it gets hidden now anyway */ - name_highlight->property_y1() = (double) y; - name_highlight->property_y2() = (double) y + h; + name_highlight->property_y1() = (double) 1.0; + name_highlight->property_y2() = (double) height; } } - if (name_text) { - name_text->property_y() = y + h + 1 - NAME_Y_OFFSET; - if (h < NAME_HIGHLIGHT_THRESH) { - name_text->property_fill_color_rgba() = fill_color; - } - else { - name_text->property_fill_color_rgba() = label_color; - } + if (visibility & ShowNameText) { + name_pixbuf->property_y() = height - 1 - NAME_Y_OFFSET; } if (frame) { - frame->property_y1() = y; - frame->property_y2() = y + h + 1; + frame->property_y2() = height - 1; + frame_handle_start->property_y2() = height - 1; + frame_handle_end->property_y2() = height - 1; } - vestigial_frame->property_y1() = y; - vestigial_frame->property_y2() = y + h + 1; + vestigial_frame->property_y2() = height - 1; } /** - * + * */ void -TimeAxisViewItem::set_color(Gdk::Color& base_color) +TimeAxisViewItem::set_color (Gdk::Color const & base_color) { compute_colors (base_color); set_colors (); } /** - * + * */ ArdourCanvas::Item* TimeAxisViewItem::get_canvas_frame() @@ -640,16 +602,16 @@ TimeAxisViewItem::get_canvas_frame() } /** - * + * */ -ArdourCanvas::Item* +ArdourCanvas::Group* TimeAxisViewItem::get_canvas_group() { return (group) ; } /** - * + * */ ArdourCanvas::Item* TimeAxisViewItem::get_name_highlight() @@ -658,12 +620,12 @@ TimeAxisViewItem::get_name_highlight() } /** - * + * */ -ArdourCanvas::Text* -TimeAxisViewItem::get_name_text() +ArdourCanvas::Pixbuf* +TimeAxisViewItem::get_name_pixbuf() { - return (name_text) ; + return (name_pixbuf) ; } /** @@ -672,11 +634,11 @@ TimeAxisViewItem::get_name_text() * @param color the base color of the item */ void -TimeAxisViewItem::compute_colors(Gdk::Color& base_color) +TimeAxisViewItem::compute_colors (Gdk::Color const & base_color) { unsigned char radius ; char minor_shift ; - + unsigned char r,g,b ; /* FILL: this is simple */ @@ -688,7 +650,7 @@ TimeAxisViewItem::compute_colors(Gdk::Color& base_color) /* for minor colors: if the overall saturation is strong, make the minor colors light. if its weak, make them dark. - + we do this by moving an equal distance to the other side of the central circle in the color wheel from where we started. */ @@ -701,7 +663,7 @@ TimeAxisViewItem::compute_colors(Gdk::Color& base_color) r = base_color.get_red()/256; g = base_color.get_green()/256; b = base_color.get_blue()/256; - + if (r > b) { if (r > g) @@ -713,7 +675,7 @@ TimeAxisViewItem::compute_colors(Gdk::Color& base_color) { /* green sector => blue */ swap (g,b); - } + } } else { @@ -732,26 +694,26 @@ TimeAxisViewItem::compute_colors(Gdk::Color& base_color) r += minor_shift; b += minor_shift; g += minor_shift; - + label_color = RGBA_TO_UINT(r,g,b,255); r = (base_color.get_red()/256) + 127 ; g = (base_color.get_green()/256) + 127 ; b = (base_color.get_blue()/256) + 127 ; - + label_color = RGBA_TO_UINT(r,g,b,255); /* XXX can we do better than this ? */ /* We're trying ;) */ /* NUKECOLORS */ - + //frame_color_r = 192; //frame_color_g = 192; //frame_color_b = 194; - + //selected_frame_color_r = 182; //selected_frame_color_g = 145; //selected_frame_color_b = 168; - + //handle_color_r = 25 ; //handle_color_g = 0 ; //handle_color_b = 255 ; @@ -767,20 +729,6 @@ void TimeAxisViewItem::set_colors() { set_frame_color() ; - if (name_text) { - double height = NAME_HIGHLIGHT_THRESH; - - if (frame) { - height = frame->property_y2(); - } - - if (height < NAME_HIGHLIGHT_THRESH) { - name_text->property_fill_color_rgba() = fill_color; - } - else { - name_text->property_fill_color_rgba() = label_color; - } - } if (name_highlight) { name_highlight->property_fill_color_rgba() = fill_color; @@ -797,13 +745,18 @@ TimeAxisViewItem::set_frame_color() { if (frame) { uint32_t r,g,b,a; - + if (_selected && should_show_selection) { UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_SelectedFrameBase.get(), &r, &g, &b, &a); frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, a); } else { - UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_FrameBase.get(), &r, &g, &b, &a); - frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, a); + if (_recregion) { + UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_RecordingRect.get(), &r, &g, &b, &a); + frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, a); + } else { + UINT_TO_RGBA(ARDOUR_UI::config()->canvasvar_FrameBase.get(), &r, &g, &b, &a); + frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, fill_opacity ? fill_opacity : a); + } } } } @@ -818,10 +771,10 @@ TimeAxisViewItem::set_trim_handle_colors() if (frame_handle_start) { if (position_locked) { frame_handle_start->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TrimHandleLocked.get(); - frame_handle_end->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TrimHandleLocked.get(); + frame_handle_end->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TrimHandleLocked.get(); } else { - frame_handle_start->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TrimHandle.get(); - frame_handle_end->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TrimHandle.get(); + frame_handle_start->property_fill_color_rgba() = RGBA_TO_UINT(1, 1, 1, 0); //ARDOUR_UI::config()->canvasvar_TrimHandle.get(); + frame_handle_end->property_fill_color_rgba() = RGBA_TO_UINT(1, 1, 1, 0); //ARDOUR_UI::config()->canvasvar_TrimHandle.get(); } } } @@ -858,9 +811,7 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) if (name_highlight) { name_highlight->hide(); - if (name_text) { - name_text->hide(); - } + name_pixbuf->hide(); } if (frame) { @@ -871,7 +822,7 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) frame_handle_start->hide(); frame_handle_end->hide(); } - + } else { vestigial_frame->hide(); @@ -881,13 +832,10 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) if (height < NAME_HIGHLIGHT_THRESH) { name_highlight->hide(); - if (name_text) { - name_text->hide(); - } + name_pixbuf->hide(); } else { name_highlight->show(); - if (name_text && !get_item_name().empty()) { - name_text->show(); + if (!get_item_name().empty()) { reset_name_width (pixel_width); } } @@ -919,92 +867,42 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) } void -TimeAxisViewItem::reset_name_width (double pixel_width) +TimeAxisViewItem::reset_name_width (double /*pixel_width*/) { - if (name_text == 0) { - return; - } + uint32_t it_width; + int pb_width; + bool pixbuf_holds_full_name; - int limit = (int) floor (pixel_width - NAME_X_OFFSET); - bool shrinking = (last_name_text_width > pixel_width); - int actual_width; - ustring ustr; - ustring::size_type n; - - if ((last_name_text_width && // we did this once - shrinking && // we're getting smaller - (name_text_width <= limit) && // fits the new size - (name_text_width <= last_name_text_width - NAME_X_OFFSET))) { // fit into the old size too - last_name_text_width = pixel_width; + if (!name_pixbuf) { return; } - /* now check the cache of existing truncations */ - - Gtk::Label foo; - Glib::RefPtr layout = foo.create_pango_layout (""); - - for (n = item_name.length(); n > 0; --n) { - - map::iterator i; + it_width = trackview.editor().frame_to_pixel(item_duration); + pb_width = name_pixbuf_width; - if ((i = name_text_size_cache.find (n)) != name_text_size_cache.end()) { + pixbuf_holds_full_name = last_item_width > pb_width + NAME_X_OFFSET; + last_item_width = it_width; - /* we know the length of this substring already */ - - if ((actual_width = (*i).second) < limit) { - - /* it fits, use it */ - - ustr = item_name.substr (0, n); - break; - } - - } else { - - /* we don't know the length of this substring already, so compute - it and put it into the cache. - */ - - layout->set_text (item_name.substr (0, n)); - - int width, height; - Gtkmm2ext::get_ink_pixel_size (layout, width, height); - - name_text_size_cache[n] = width; - - if ((actual_width = width) < limit) { - ustr = item_name.substr (0, n); - break; - } - } - } - - if (n == 0) { - name_text->property_text() = ""; - last_name_text_width = pixel_width; + if (pixbuf_holds_full_name && (it_width >= pb_width + NAME_X_OFFSET)) { + /* + we've previously had the full name length showing + and its still showing. + */ return; - } - - /* don't use name for event handling if it leaves no room - for trimming to work. - */ + } - if (pixel_width - actual_width < (NAME_X_OFFSET * 2.0)) { - if (name_connected) { - name_connected = false; - } - } else { - if (!name_connected) { - name_connected = true; - } + if (pb_width > it_width - NAME_X_OFFSET) { + pb_width = it_width - NAME_X_OFFSET; } - name_text->property_text() = ustr; - name_text_width = actual_width; - name_text->show(); - last_name_text_width = pixel_width; + if (pb_width <= 0 || it_width <= NAME_X_OFFSET) { + name_pixbuf->hide(); + return; + } else { + name_pixbuf->show(); + } + name_pixbuf->property_pixbuf() = pixbuf_from_ustring(item_name, NAME_FONT, pb_width, NAME_HEIGHT); } @@ -1047,3 +945,15 @@ TimeAxisViewItem::idle_remove_this_item(TimeAxisViewItem* item, void* src) item = 0; return false; } + +void +TimeAxisViewItem::set_y (double y) +{ + double const old = group->property_y (); + if (y != old) { + group->move (0, y - old); + } +} + + +