X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Ftime_axis_view_item.cc;h=a008e2af1a97bf54ef254a1f8eff2eaaf7a23c0c;hb=76c25a4a4459b8e550c3c687458d04db0beaee77;hp=7e52c5f4dd8e75c4bdc3af71244e62bfadfbfc9e;hpb=54a80321064aa543023cd0b224ba9d433520983f;p=ardour.git diff --git a/gtk2_ardour/time_axis_view_item.cc b/gtk2_ardour/time_axis_view_item.cc index 7e52c5f4dd..a008e2af1a 100644 --- a/gtk2_ardour/time_axis_view_item.cc +++ b/gtk2_ardour/time_axis_view_item.cc @@ -23,11 +23,14 @@ #include #include +#include + #include "public_editor.h" #include "time_axis_view_item.h" #include "time_axis_view.h" #include "simplerect.h" #include "utils.h" +#include "canvas_impl.h" #include "rgb_macros.h" #include "i18n.h" @@ -35,17 +38,20 @@ using namespace std; using namespace Editing; using namespace Glib; +using namespace PBD; //------------------------------------------------------------------------------ -/** Initialize static memeber data */ +/** Initialize const static memeber data */ + Pango::FontDescription TimeAxisViewItem::NAME_FONT; bool TimeAxisViewItem::have_name_font = false; const double TimeAxisViewItem::NAME_X_OFFSET = 15.0; -const double TimeAxisViewItem::NAME_Y_OFFSET = 15.0 ; /* XXX depends a lot on the font size, sigh. */ -const double TimeAxisViewItem::NAME_HIGHLIGHT_SIZE = 15.0 ; /* ditto */ -const double TimeAxisViewItem::NAME_HIGHLIGHT_THRESH = 32.0 ; /* ditto */ const double TimeAxisViewItem::GRAB_HANDLE_LENGTH = 6 ; +double TimeAxisViewItem::NAME_Y_OFFSET; +double TimeAxisViewItem::NAME_HIGHLIGHT_SIZE; +double TimeAxisViewItem::NAME_HIGHLIGHT_THRESH; + //---------------------------------------------------------------------------------------// // Constructor / Desctructor @@ -61,13 +67,32 @@ const double TimeAxisViewItem::GRAB_HANDLE_LENGTH = 6 ; * @param start the start point of this item * @param duration the duration of this item */ -TimeAxisViewItem::TimeAxisViewItem(std::string it_name, ArdourCanvas::Group& parent, TimeAxisView& tv, double spu, Gdk::Color& base_color, - jack_nframes_t start, jack_nframes_t duration, - Visibility visibility) +TimeAxisViewItem::TimeAxisViewItem(const string & it_name, ArdourCanvas::Group& parent, TimeAxisView& tv, double spu, Gdk::Color& base_color, + nframes_t start, nframes_t duration, + Visibility vis) : trackview (tv) { 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; + + layout->set_font_description (NAME_FONT); + Gtkmm2ext::get_ink_pixel_size (layout, width, height); + + NAME_Y_OFFSET = height + 4; + NAME_HIGHLIGHT_SIZE = height + 6; + NAME_HIGHLIGHT_THRESH = NAME_HIGHLIGHT_SIZE * 2; + have_name_font = true; } @@ -77,11 +102,12 @@ TimeAxisViewItem::TimeAxisViewItem(std::string it_name, ArdourCanvas::Group& par frame_position = start ; item_duration = duration ; name_connected = false; - fill_opacity = 50; + fill_opacity = 130; position_locked = false ; max_item_duration = ARDOUR::max_frames; min_item_duration = 0 ; show_vestigial = true; + visibility = vis; if (duration == 0) { warning << "Time Axis Item Duration == 0" << endl ; @@ -90,35 +116,58 @@ TimeAxisViewItem::TimeAxisViewItem(std::string it_name, ArdourCanvas::Group& par group = new ArdourCanvas::Group (parent); vestigial_frame = new ArdourCanvas::SimpleRect (*group); - vestigial_frame->set_property ("x1", (double) 0.0); - vestigial_frame->set_property ("y1", (double) 1.0); - vestigial_frame->set_property ("x2", 2.0); - vestigial_frame->set_property ("y2", (double) trackview.height); - vestigial_frame->set_property ("outline_color_rgba", color_map[cVestigialFrameOutline]); - vestigial_frame->set_property ("fill_color_rgba", color_map[cVestigialFrameFill]); + 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->property_outline_color_rgba() = color_map[cVestigialFrameOutline]; + vestigial_frame->property_fill_color_rgba() = color_map[cVestigialFrameFill]; vestigial_frame->hide (); if (visibility & ShowFrame) { frame = new ArdourCanvas::SimpleRect (*group); - frame->set_property ("x1", (double) 0.0); - frame->set_property ("y1", (double) 1.0); - frame->set_property ("x2", (double) trackview.editor.frame_to_pixel(duration)); - frame->set_property ("y2", (double) trackview.height); - frame->set_property ("outline_color_rgba", color_map[cTimeAxisFrameOutline]); - frame->set_property ("fill_color_rgba", color_map[cTimeAxisFrameFill]); + 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->property_outline_color_rgba() = color_map[cTimeAxisFrameOutline]; + frame->property_fill_color_rgba() = color_map[cTimeAxisFrameFill]; + + /* by default draw all 4 edges */ + + uint32_t outline_what = 0x1|0x2|0x4|0x8; + + if (visibility & HideFrameLeft) { + outline_what &= ~(0x1); + } + + if (visibility & HideFrameRight) { + outline_what &= ~(0x2); + } + if (visibility & HideFrameTB) { + outline_what &= ~(0x4 | 0x8); + } + + frame->property_outline_what() = outline_what; + } else { frame = 0; } if (visibility & ShowNameHighlight) { name_highlight = new ArdourCanvas::SimpleRect (*group); - name_highlight->set_property ("x1", (double) 1.0); - name_highlight->set_property ("x2", (double) (trackview.editor.frame_to_pixel(item_duration)) - 1); - name_highlight->set_property ("y1", (double) (trackview.height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE)); - name_highlight->set_property ("y2", (double) (trackview.height - 1)); - name_highlight->set_property ("outline_color_rgba", color_map[cNameHighlightFill]); - name_highlight->set_property ("fill_color_rgba", color_map[cNameHighlightOutline]); + if (visibility & FullWidthNameHighlight) { + name_highlight->property_x1() = (double) 0.0; + name_highlight->property_x2() = (double) (trackview.editor.frame_to_pixel(item_duration)); + } else { + name_highlight->property_x1() = (double) 1.0; + name_highlight->property_x2() = (double) (trackview.editor.frame_to_pixel(item_duration)) - 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() = color_map[cNameHighlightFill]; + name_highlight->property_fill_color_rgba() = color_map[cNameHighlightOutline]; name_highlight->set_data ("timeaxisviewitem", this); @@ -128,10 +177,13 @@ TimeAxisViewItem::TimeAxisViewItem(std::string it_name, ArdourCanvas::Group& par if (visibility & ShowNameText) { name_text = new ArdourCanvas::Text (*group); - name_text->set_property ("x", (double) TimeAxisViewItem::NAME_X_OFFSET); - name_text->set_property ("y", (double) trackview.height + 1.0 - TimeAxisViewItem::NAME_Y_OFFSET); - name_text->set_property ("font", NAME_FONT); - name_text->set_property ("anchor", GTK_ANCHOR_NW); + 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_text->set_data ("timeaxisviewitem", this); @@ -143,20 +195,20 @@ TimeAxisViewItem::TimeAxisViewItem(std::string it_name, ArdourCanvas::Group& par if (visibility & ShowHandles) { frame_handle_start = new ArdourCanvas::SimpleRect (*group); - frame_handle_start->set_property ("x1", (double) 0.0); - frame_handle_start->set_property ("x2", (double) TimeAxisViewItem::GRAB_HANDLE_LENGTH); - frame_handle_start->set_property ("y1", (double) 1.0); - frame_handle_start->set_property ("y2", (double) TimeAxisViewItem::GRAB_HANDLE_LENGTH+1); - frame_handle_start->set_property ("outline_color_rgba", color_map[cFrameHandleStartOutline]); - frame_handle_start->set_property ("fill_color_rgba", color_map[cFrameHandleStartFill]); + 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() = color_map[cFrameHandleStartOutline]; + frame_handle_start->property_fill_color_rgba() = color_map[cFrameHandleStartFill]; frame_handle_end = new ArdourCanvas::SimpleRect (*group); - frame_handle_end->set_property ("x1", (double) (trackview.editor.frame_to_pixel(get_duration())) - (TimeAxisViewItem::GRAB_HANDLE_LENGTH)); - frame_handle_end->set_property ("x2", (double) trackview.editor.frame_to_pixel(get_duration())); - frame_handle_end->set_property ("y1", (double) 1); - frame_handle_end->set_property ("y2", (double) TimeAxisViewItem::GRAB_HANDLE_LENGTH + 1); - frame_handle_end->set_property ("outline_color_rgba", color_map[cFrameHandleEndOutline]); - frame_handle_end->set_property ("fill_color_rgba", color_map[cFrameHandleEndFill]); + 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() = color_map[cFrameHandleEndOutline]; + frame_handle_end->property_fill_color_rgba() = color_map[cFrameHandleEndFill]; } else { frame_handle_start = 0; @@ -190,7 +242,7 @@ TimeAxisViewItem::~TimeAxisViewItem() * @return true if the position change was a success, false otherwise */ bool -TimeAxisViewItem::set_position(jack_nframes_t pos, void* src, double* delta) +TimeAxisViewItem::set_position(nframes_t pos, void* src, double* delta) { if (position_locked) { return false; @@ -230,7 +282,7 @@ TimeAxisViewItem::set_position(jack_nframes_t pos, void* src, double* delta) * * @return the position of this item */ -jack_nframes_t +nframes_t TimeAxisViewItem::get_position() const { return frame_position; @@ -244,7 +296,7 @@ TimeAxisViewItem::get_position() const * @return true if the duration change was succesful, false otherwise */ bool -TimeAxisViewItem::set_duration (jack_nframes_t dur, void* src) +TimeAxisViewItem::set_duration (nframes_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) @@ -258,9 +310,7 @@ TimeAxisViewItem::set_duration (jack_nframes_t dur, void* src) item_duration = dur; - double pixel_width = trackview.editor.frame_to_pixel (dur); - - reset_width_dependent_items (pixel_width); + reset_width_dependent_items (trackview.editor.frame_to_pixel (dur)); DurationChanged (dur, src) ; /* EMIT_SIGNAL */ return true; @@ -270,7 +320,7 @@ TimeAxisViewItem::set_duration (jack_nframes_t dur, void* src) * Returns the duration of this item * */ -jack_nframes_t +nframes_t TimeAxisViewItem::get_duration() const { return (item_duration); @@ -283,7 +333,7 @@ TimeAxisViewItem::get_duration() const * @param src the identity of the object that initiated the change */ void -TimeAxisViewItem::set_max_duration(jack_nframes_t dur, void* src) +TimeAxisViewItem::set_max_duration(nframes_t dur, void* src) { max_item_duration = dur ; MaxDurationChanged(max_item_duration, src) ; /* EMIT_SIGNAL */ @@ -294,7 +344,7 @@ TimeAxisViewItem::set_max_duration(jack_nframes_t dur, void* src) * * @return the maximum duration that this item may be set to */ -jack_nframes_t +nframes_t TimeAxisViewItem::get_max_duration() const { return (max_item_duration) ; @@ -307,7 +357,7 @@ TimeAxisViewItem::get_max_duration() const * @param src the identity of the object that initiated the change */ void -TimeAxisViewItem::set_min_duration(jack_nframes_t dur, void* src) +TimeAxisViewItem::set_min_duration(nframes_t dur, void* src) { min_item_duration = dur ; MinDurationChanged(max_item_duration, src) ; /* EMIT_SIGNAL */ @@ -318,7 +368,7 @@ TimeAxisViewItem::set_min_duration(jack_nframes_t dur, void* src) * * @return the nimum duration that this item mey be set to */ -jack_nframes_t +nframes_t TimeAxisViewItem::get_min_duration() const { return(min_item_duration) ; @@ -437,26 +487,14 @@ TimeAxisViewItem::get_item_name() const * @param src the identity of the object that initiated the change */ void -TimeAxisViewItem::set_selected(bool yn, void* src) +TimeAxisViewItem::set_selected(bool yn) { if (_selected != yn) { - _selected = yn ; + Selectable::set_selected (yn); set_frame_color (); - Selected (_selected) ; /* EMIT_SIGNAL */ } } -/** - * Returns whether this item is currently selected. - * - * @return true if this item is currently selected, false otherwise - */ -bool -TimeAxisViewItem::get_selected() const -{ - return (_selected) ; -} - void TimeAxisViewItem::set_should_show_selection (bool yn) { @@ -492,7 +530,7 @@ void TimeAxisViewItem::set_name_text(std::string new_name) { if (name_text) { - name_text->set_property ("text", new_name.c_str()); + name_text->property_text() = new_name.c_str(); } } @@ -507,38 +545,42 @@ TimeAxisViewItem::set_height(double height) if (name_highlight) { if (height < NAME_HIGHLIGHT_THRESH) { name_highlight->hide(); - name_text->hide(); + if (name_text) { + name_text->hide(); + } } else { name_highlight->show(); - name_text->show(); + if (name_text) { + name_text->show(); + } } if (height > NAME_HIGHLIGHT_SIZE) { - name_highlight->set_property ("y1", (double) height+1 - NAME_HIGHLIGHT_SIZE); - name_highlight->set_property ("y2", (double) height); + name_highlight->property_y1() = (double) height+1 - NAME_HIGHLIGHT_SIZE; + name_highlight->property_y2() = (double) height; } else { /* it gets hidden now anyway */ - name_highlight->set_property ("y1", (double) 1.0); - name_highlight->set_property ("y2", (double) height); + name_highlight->property_y1() = (double) 1.0; + name_highlight->property_y2() = (double) height; } } if (name_text) { - name_text->set_property ("y", height+1 - NAME_Y_OFFSET); + name_text->property_y() = height+1 - NAME_Y_OFFSET; if (height < NAME_HIGHLIGHT_THRESH) { - name_text->set_property ("fill_color_rgba", fill_color) ; + name_text->property_fill_color_rgba() = fill_color; } else { - name_text->set_property ("fill_color_rgba", label_color) ; + name_text->property_fill_color_rgba() = label_color; } } if (frame) { - frame->set_property ("y2", height+1) ; + frame->property_y2() = height+1; } - vestigial_frame->set_property ("y2", height+1) ; + vestigial_frame->property_y2() = height+1; } /** @@ -566,7 +608,7 @@ TimeAxisViewItem::get_canvas_frame() ArdourCanvas::Item* TimeAxisViewItem::get_canvas_group() { - return(group) ; + return (group) ; } /** @@ -575,7 +617,7 @@ TimeAxisViewItem::get_canvas_group() ArdourCanvas::Item* TimeAxisViewItem::get_name_highlight() { - return(name_highlight) ; + return (name_highlight) ; } /** @@ -584,7 +626,7 @@ TimeAxisViewItem::get_name_highlight() ArdourCanvas::Text* TimeAxisViewItem::get_name_text() { - return(name_text) ; + return (name_text) ; } /** @@ -696,16 +738,16 @@ TimeAxisViewItem::set_colors() } if (height < NAME_HIGHLIGHT_THRESH) { - name_text->set_property ("fill_color_rgba", fill_color); + name_text->property_fill_color_rgba() = fill_color; } else { - name_text->set_property ("fill_color_rgba", label_color); + name_text->property_fill_color_rgba() = label_color; } } if (name_highlight) { - name_highlight->set_property ("fill_color_rgba", fill_color); - name_highlight->set_property ("outline_color_rgba", fill_color); + name_highlight->property_fill_color_rgba() = fill_color; + name_highlight->property_outline_color_rgba() = fill_color; } set_trim_handle_colors() ; } @@ -721,10 +763,10 @@ TimeAxisViewItem::set_frame_color() if (_selected && should_show_selection) { UINT_TO_RGBA(color_map[cSelectedFrameBase], &r, &g, &b, &a); - frame->set_property ("fill_color_rgba", RGBA_TO_UINT(r, g, b, fill_opacity)); + frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, fill_opacity); } else { UINT_TO_RGBA(color_map[cFrameBase], &r, &g, &b, &a); - frame->set_property ("fill_color_rgba", RGBA_TO_UINT(r, g, b, fill_opacity)); + frame->property_fill_color_rgba() = RGBA_TO_UINT(r, g, b, fill_opacity); } } } @@ -738,11 +780,11 @@ TimeAxisViewItem::set_trim_handle_colors() { if (frame_handle_start) { if (position_locked) { - frame_handle_start->set_property ("fill_color_rgba", color_map[cTrimHandleLockedStart]); - frame_handle_end->set_property ("fill_color_rgba", color_map[cTrimHandleLockedEnd]); + frame_handle_start->property_fill_color_rgba() = color_map[cTrimHandleLockedStart]; + frame_handle_end->property_fill_color_rgba() = color_map[cTrimHandleLockedEnd]; } else { - frame_handle_start->set_property ("fill_color_rgba", color_map[cTrimHandleStart]); - frame_handle_end->set_property ("fill_color_rgba", color_map[cTrimHandleEnd]); + frame_handle_start->property_fill_color_rgba() = color_map[cTrimHandleStart]; + frame_handle_end->property_fill_color_rgba() = color_map[cTrimHandleEnd]; } } } @@ -779,7 +821,9 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) if (name_highlight) { name_highlight->hide(); - name_text->hide(); + if (name_text) { + name_text->hide(); + } } if (frame) { @@ -800,19 +844,28 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) if (height < NAME_HIGHLIGHT_THRESH) { name_highlight->hide(); - name_text->hide(); + if (name_text) { + name_text->hide(); + } } else { name_highlight->show(); - name_text->show(); - reset_name_width (pixel_width); + if (name_text && !get_item_name().empty()) { + name_text->show(); + reset_name_width (pixel_width); + } + } + + if (visibility & FullWidthNameHighlight) { + name_highlight->property_x2() = pixel_width; + } else { + name_highlight->property_x2() = pixel_width - 1.0; } - name_highlight->set_property ("x2", pixel_width - 1.0); } if (frame) { frame->show(); - frame->set_property ("x2", pixel_width); + frame->property_x2() = pixel_width; } if (frame_handle_start) { @@ -821,9 +874,9 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) frame_handle_end->hide(); } frame_handle_start->show(); - frame_handle_end->set_property ("x1", pixel_width - (TimeAxisViewItem::GRAB_HANDLE_LENGTH)); + frame_handle_end->property_x1() = pixel_width - (TimeAxisViewItem::GRAB_HANDLE_LENGTH); frame_handle_end->show(); - frame_handle_end->set_property ("x2", pixel_width); + frame_handle_end->property_x2() = pixel_width; } } } @@ -831,35 +884,15 @@ TimeAxisViewItem::reset_width_dependent_items (double pixel_width) void TimeAxisViewItem::reset_name_width (double pixel_width) { - int width; - int height; - ustring ustr; - Pango::FontDescription fd (NAME_FONT); - if (name_text == 0) { return; } - ustr = item_name; - int namelen = ustr.length(); - - Glib::RefPtr layout = group->get_canvas()->create_pango_layout (ustr); - layout->set_font_description (fd); - - while (namelen) { - - layout->set_text (ustr); - layout->get_pixel_size (width, height); - - if (width < (pixel_width - NAME_X_OFFSET)) { - break; - } - - --namelen; - ustr = ustr.substr (0, namelen); - } + int width; + + ustring ustr = fit_to_pixels (item_name, (int) floor (pixel_width - NAME_X_OFFSET), NAME_FONT, width); - if (namelen == 0) { + if (ustr.empty()) { name_text->hide (); @@ -919,8 +952,8 @@ TimeAxisViewItem::remove_this_item(void* src) gint TimeAxisViewItem::idle_remove_this_item(TimeAxisViewItem* item, void* src) { - item->ItemRemoved(item->get_item_name(), src) ; /* EMIT_SIGNAL */ - delete item ; - item = 0 ; - return(false) ; + item->ItemRemoved (item->get_item_name(), src) ; /* EMIT_SIGNAL */ + delete item; + item = 0; + return false; }