X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fimageframe_view.cc;h=366c56e5e512b912ad9231bc2fa56734cd4d7272;hb=696837ec7a86046ce43dc61fedd4b6de560fc06d;hp=1b13f5d145d418a645b4c568954a4fdd3e0a92be;hpb=14d43ca9fe28a8309b4a52fa85e2b0c64a92248b;p=ardour.git diff --git a/gtk2_ardour/imageframe_view.cc b/gtk2_ardour/imageframe_view.cc index 1b13f5d145..366c56e5e5 100644 --- a/gtk2_ardour/imageframe_view.cc +++ b/gtk2_ardour/imageframe_view.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 @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -28,15 +27,15 @@ #include "imageframe_time_axis_group.h" #include "marker_time_axis.h" #include "marker_time_axis_view.h" -#include "canvas-simplerect.h" #include "public_editor.h" #include "utils.h" #include "imageframe_view.h" -#include "canvas-imageframe.h" +#include "imageframe.h" +#include "canvas_impl.h" #include "gui_thread.h" -using namespace sigc ; -using namespace ARDOUR ; +using namespace ARDOUR; +using namespace Gtk; sigc::signal ImageFrameView::GoingAway; @@ -55,73 +54,57 @@ sigc::signal ImageFrameView::GoingAway; * @param height the width of the origianl rgb_data image data * @param num_channels the number of color channels within rgb_data */ -ImageFrameView::ImageFrameView(std::string item_id, - GnomeCanvasGroup *parent, +ImageFrameView::ImageFrameView(const string & item_id, + ArdourCanvas::Group *parent, ImageFrameTimeAxis* tv, ImageFrameTimeAxisGroup* item_group, double spu, - GdkColor& basic_color, - jack_nframes_t start, - jack_nframes_t duration, + Gdk::Color& basic_color, + nframes_t start, + nframes_t duration, unsigned char* rgb_data, uint32_t width, uint32_t height, uint32_t num_channels) - : TimeAxisViewItem(item_id, parent, *tv, spu, basic_color, start, duration, + : TimeAxisViewItem(item_id, *parent, *tv, spu, basic_color, start, duration, TimeAxisViewItem::Visibility (TimeAxisViewItem::ShowNameText| TimeAxisViewItem::ShowNameHighlight| TimeAxisViewItem::ShowFrame| TimeAxisViewItem::ShowHandles)) { - the_parent_group = item_group ; - set_name_text(item_id) ; - - image_data_width = width ; - image_data_height = height ; - image_data_num_channels = num_channels ; - + the_parent_group = item_group; + set_name_text(item_id); + + image_data_width = width; + image_data_height = height; + image_data_num_channels = num_channels; + //This should be art_free'd once the ArtPixBuf is destroyed - this should happen when we destroy the imageframe canvas item - unsigned char* the_rgb_data = (unsigned char*) art_alloc(width*height*num_channels) ; - memcpy(the_rgb_data, rgb_data, (width*height*num_channels)) ; + unsigned char* the_rgb_data = (unsigned char*) art_alloc(width*height*num_channels); + memcpy(the_rgb_data, rgb_data, (width*height*num_channels)); - ArtPixBuf* pbuf ; + ArtPixBuf* pbuf; pbuf = art_pixbuf_new_rgba(the_rgb_data, width, height, (num_channels * width)); - imageframe = 0 ; - + imageframe = 0; + //calculate our image width based on the track height - double im_ratio = (double)width/(double)height ; - int im_width = (int)((double)(trackview.height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE) * im_ratio) ; - - imageframe = gnome_canvas_item_new(GNOME_CANVAS_GROUP(group), - gnome_canvas_imageframe_get_type(), - "pixbuf", pbuf, - "x", (gdouble) 1.0, - "y", (gdouble) 1.0, - "anchor", GTK_ANCHOR_NW, - "width", (gdouble) im_width, - "height", (gdouble) (trackview.height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE), - NULL) ; - - - gtk_signal_connect (GTK_OBJECT(frame_handle_start), "event", - (GtkSignalFunc) PublicEditor::canvas_imageframe_start_handle_event, - this); - - gtk_signal_connect (GTK_OBJECT(frame_handle_end), "event", - (GtkSignalFunc) PublicEditor::canvas_imageframe_end_handle_event, - this); - - gtk_signal_connect (GTK_OBJECT(group), "event", - (GtkSignalFunc) PublicEditor::canvas_imageframe_item_view_event, this); - - /* handle any specific details required by the initial start end duration values */ - - gnome_canvas_item_raise_to_top(frame_handle_start) ; - gnome_canvas_item_raise_to_top(frame_handle_end) ; - - set_position(start, this) ; - set_duration(duration, this) ; + double im_ratio = (double)width/(double)height; + double im_width = ((double)(trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE) * im_ratio); + + imageframe = new ImageFrame (*group, pbuf, 1.0, 1.0, ANCHOR_NW, im_width, (trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE)); + + frame_handle_start->signal_event().connect (sigc::bind (sigc::mem_fun (trackview.editor, &PublicEditor::canvas_imageframe_start_handle_event), frame_handle_start, this)); + frame_handle_end->signal_event().connect (sigc::bind (sigc::mem_fun (trackview.editor, &PublicEditor::canvas_imageframe_end_handle_event), frame_handle_end, this)); + group->signal_event().connect (sigc::bind (sigc::mem_fun (trackview.editor, &PublicEditor::canvas_imageframe_item_view_event), imageframe, this)); + + frame_handle_start->raise_to_top(); + frame_handle_end->raise_to_top(); + + set_position(start, this); + set_duration(duration, this); + + MarkerView::CatchDeletion.connect (*this, ui_bind (&ImageFrameView::remove_marker_view_item, this, _1), gui_context()); } /** @@ -130,51 +113,48 @@ ImageFrameView::ImageFrameView(std::string item_id, */ ImageFrameView::~ImageFrameView() { - GoingAway (this); + CatchDeletion (this); // destroy any marker items we have associated with this item - + for(MarkerViewList::iterator iter = marker_view_list.begin(); iter != marker_view_list.end(); ++iter) { - MarkerView* mv = (*iter) ; - - MarkerViewList::iterator next = iter ; - next++ ; + MarkerView* mv = (*iter); + + MarkerViewList::iterator next = iter; + next++; // remove the item from our marker list // the current iterator becomes invalid after this point, so we cannot call next upon it // luckily enough, we already have next - marker_view_list.erase(iter) ; + marker_view_list.erase(iter); // remove the item from the marker time axis - MarkerTimeAxisView* mtav = dynamic_cast(&mv->get_time_axis_view())->get_view() ; + MarkerTimeAxisView* mtav = dynamic_cast(&mv->get_time_axis_view())->get_view(); if(mtav) { - mtav->remove_marker_view(mv, this) ; + mtav->remove_marker_view(mv, this); } - mv->set_marked_item(0) ; - delete mv ; - mv = 0 ; - - // set our iterator to next, as we have invalided the current iterator with the call to erase - iter = next ; + mv->set_marked_item(0); + delete mv; + mv = 0; + + // set our iterator to next, as we have invalided the current iterator with the call to erase + iter = next; } - + // if we are the currently selected item withi the parent track, we need to se-select if(the_parent_group) { if(the_parent_group->get_view().get_selected_imageframe_view() == this) { - the_parent_group->get_view().clear_selected_imageframe_item(false) ; + the_parent_group->get_view().clear_selected_imageframe_item(false); } } - if(imageframe) - { - gtk_object_destroy(GTK_OBJECT(imageframe)) ; - imageframe = 0 ; - } + delete imageframe; + imageframe = 0; } @@ -189,30 +169,29 @@ ImageFrameView::~ImageFrameView() * @return true if the position change was a success, false otherwise */ bool -ImageFrameView::set_position(jack_nframes_t pos, void* src) +ImageFrameView::set_position(nframes64_t pos, void* src, double* delta) { - jack_nframes_t old_pos = frame_position ; - + nframes64_t old_pos = frame_position; + // do the standard stuff - bool ret = TimeAxisViewItem::set_position(pos, src) ; + bool ret = TimeAxisViewItem::set_position(pos, src, delta); // everything went ok with the standard stuff? - if(ret) - { + if (ret) { /* move each of our associated markers with this ImageFrameView */ for (MarkerViewList::iterator i = marker_view_list.begin(); i != marker_view_list.end(); ++i) { // calculate the offset of the marker - MarkerView* mv = (MarkerView*)*i ; - jack_nframes_t marker_old_pos = mv->get_position() ; - - mv->set_position(pos + (marker_old_pos - old_pos), src) ; + MarkerView* mv = (MarkerView*)*i; + nframes64_t marker_old_pos = mv->get_position(); + + mv->set_position(pos + (marker_old_pos - old_pos), src); } } - - return(ret) ; + + return(ret); } - + /** * Sets the duration of this item * @@ -221,24 +200,24 @@ ImageFrameView::set_position(jack_nframes_t pos, void* src) * @return true if the duration change was succesful, false otherwise */ bool -ImageFrameView::set_duration(jack_nframes_t dur, void* src) +ImageFrameView::set_duration(nframes64_t dur, void* src) { /* do the standard stuff */ - bool ret = TimeAxisViewItem::set_duration(dur, src) ; - + bool ret = TimeAxisViewItem::set_duration(dur, src); + // eveything went ok with the standard stuff? if(ret) { /* handle setting the sizes of our canvas itesm based on the new duration */ - gnome_canvas_item_set(imageframe, "drawwidth", (gdouble) trackview.editor.frame_to_pixel(get_duration()), NULL) ; + imageframe->property_drawwidth() = trackview.editor.frame_to_pixel(get_duration()); } - - return(ret) ; + + return(ret); } //---------------------------------------------------------------------------------------// // Parent Component Methods - + /** * Sets the parent ImageFrameTimeAxisGroup of thie item * each Item must be part of exactly one group (or 'scene') upon the timeline @@ -248,9 +227,9 @@ ImageFrameView::set_duration(jack_nframes_t dur, void* src) void ImageFrameView::set_time_axis_group(ImageFrameTimeAxisGroup* group) { - the_parent_group = group ; + the_parent_group = group; } - + /** * Returns the parent group of this item * @@ -259,13 +238,13 @@ ImageFrameView::set_time_axis_group(ImageFrameTimeAxisGroup* group) ImageFrameTimeAxisGroup* ImageFrameView::get_time_axis_group() { - return(the_parent_group) ; + return(the_parent_group); } //---------------------------------------------------------------------------------------// // ui methods - + /** * Set the height of this item * @@ -276,23 +255,23 @@ ImageFrameView::set_height (gdouble h) { // set the image size // @todo might have to re-get the image data, for a large height...hmmm. - double im_ratio = (double)image_data_width/(double)image_data_height ; - int im_width = (int)((double)(h - TimeAxisViewItem::NAME_Y_OFFSET) * im_ratio) ; - gnome_canvas_item_set(imageframe, "width", (gdouble)im_width, NULL) ; - gnome_canvas_item_set(imageframe, "height",(gdouble) (h - TimeAxisViewItem::NAME_Y_OFFSET), NULL) ; - - - gnome_canvas_item_raise_to_top(frame) ; - gnome_canvas_item_raise_to_top(imageframe) ; - gnome_canvas_item_raise_to_top(name_highlight) ; - gnome_canvas_item_raise_to_top(name_text) ; - gnome_canvas_item_raise_to_top(frame_handle_start) ; - gnome_canvas_item_raise_to_top(frame_handle_end) ; - - gnome_canvas_item_set (name_text, "y", h - TimeAxisViewItem::NAME_Y_OFFSET, NULL); - gnome_canvas_item_set (frame, "y2", h, NULL); - - gnome_canvas_item_set (name_highlight, "y1", (gdouble) h - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE, "y2", (gdouble) h - 1.0, NULL); + double im_ratio = (double)image_data_width/(double)image_data_height; + + imageframe->property_width() = (h - TimeAxisViewItem::NAME_Y_OFFSET) * im_ratio; + imageframe->property_height() = h - TimeAxisViewItem::NAME_Y_OFFSET; + + frame->raise_to_top(); + imageframe->raise_to_top(); + name_highlight->raise_to_top(); + name_pixbuf->raise_to_top(); + frame_handle_start->raise_to_top(); + frame_handle_end->raise_to_top(); + + name_pixbuf->property_y() = h - TimeAxisViewItem::NAME_Y_OFFSET; + frame->property_y2() = h; + + name_highlight->property_y1() = (gdouble) h - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE; + name_highlight->property_y2() = (gdouble) h - 1.0; } @@ -308,13 +287,10 @@ ImageFrameView::set_height (gdouble h) void ImageFrameView::add_marker_view_item(MarkerView* item, void* src) { - marker_view_list.push_back(item) ; - - item->GoingAway.connect(bind(mem_fun(*this, &ImageFrameView::remove_marker_view_item), (void*)this)); - - MarkerViewAdded(item, src) ; /* EMIT_SIGNAL */ + marker_view_list.push_back(item); + MarkerViewAdded(item, src); /* EMIT_SIGNAL */ } - + /** * Removes the named marker view from the list of marker view associated with this item * The Marker view is not destroyed on removal, so the caller must handle the item themself @@ -324,32 +300,32 @@ ImageFrameView::add_marker_view_item(MarkerView* item, void* src) * @return the removed marker item */ MarkerView* -ImageFrameView::remove_named_marker_view_item(std::string markerId, void* src) +ImageFrameView::remove_named_marker_view_item(const string & markerId, void* src) { - MarkerView* mv = 0 ; - MarkerViewList::iterator i = marker_view_list.begin() ; - + MarkerView* mv = 0; + MarkerViewList::iterator i = marker_view_list.begin(); + while(i != marker_view_list.end()) { if (((MarkerView*)*i)->get_item_name() == markerId) { - mv = (*i) ; + mv = (*i); + + marker_view_list.erase(i); + + MarkerViewRemoved(mv,src); /* EMIT_SIGNAL */ - marker_view_list.erase(i) ; - - MarkerViewRemoved(mv,src) ; /* EMIT_SIGNAL */ - // iterator is now invalid, but since we should only ever have // one item with the specified name, things are ok, and we can // break from the while loop - break ; + break; } - i++ ; + i++; } - - return(mv) ; + + return(mv); } - + /** * Removes item from the list of marker views assocaited with this item * This method will do nothing if item if not assiciated with this item @@ -358,38 +334,38 @@ ImageFrameView::remove_named_marker_view_item(std::string markerId, void* src) * @param src the identity of the object that initiated the change */ void -ImageFrameView::remove_marker_view_item(MarkerView* mv, void* src) +ImageFrameView::remove_marker_view_item (MarkerView* mv) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &ImageFrameView::remove_marker_view_item), mv, src)); + ENSURE_GUI_THREAD (*this, &ImageFrameView::remove_marker_view_item, mv, src) - MarkerViewList::iterator i ; - - if((i = find (marker_view_list.begin(), marker_view_list.end(), mv)) != marker_view_list.end()) { - marker_view_list.erase(i) ; - MarkerViewRemoved (mv, src) ; /* EMIT_SIGNAL */ + MarkerViewList::iterator i; + + if ((i = find (marker_view_list.begin(), marker_view_list.end(), mv)) != marker_view_list.end()) { + marker_view_list.erase(i); + MarkerViewRemoved (mv, src); /* EMIT_SIGNAL */ } } - + /** * Determines if the named marker is one of those associated with this item * * @param markId the id/name of the item to search for */ bool -ImageFrameView::has_marker_view_item(std::string mname) +ImageFrameView::has_marker_view_item(const string & mname) { - bool result = false ; - - for (MarkerViewList::iterator ci = marker_view_list.begin(); ci != marker_view_list.end(); ++ci) + bool result = false; + + for (MarkerViewList::const_iterator ci = marker_view_list.begin(); ci != marker_view_list.end(); ++ci) { if (((MarkerView*)*ci)->get_item_name() == mname) { - result = true ; - + result = true; + // found the item, so we can break the for loop - break ; + break; } } - - return(result) ; + + return(result); }