diff options
Diffstat (limited to 'gtk2_ardour/imageframe_view.cc')
-rw-r--r-- | gtk2_ardour/imageframe_view.cc | 370 |
1 files changed, 0 insertions, 370 deletions
diff --git a/gtk2_ardour/imageframe_view.cc b/gtk2_ardour/imageframe_view.cc deleted file mode 100644 index 4956779af8..0000000000 --- a/gtk2_ardour/imageframe_view.cc +++ /dev/null @@ -1,370 +0,0 @@ -/* - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#include <algorithm> -#include <cmath> - -#include <gtkmm.h> -#include <gtkmm2ext/gtk_ui.h> - -#include "imageframe_time_axis.h" -#include "imageframe_time_axis_group.h" -#include "marker_time_axis.h" -#include "marker_time_axis_view.h" -#include "public_editor.h" -#include "utils.h" -#include "imageframe_view.h" -#include "imageframe.h" -#include "gui_thread.h" - -using namespace ARDOUR; -using namespace Gtk; - -sigc::signal<void,ImageFrameView*> ImageFrameView::GoingAway; - -/** - * Constructs a new ImageFrameView upon the canvas - * - * @param item_id unique id of this item - * @param parent the parent canvas item - * @param tv the time axis view that this item is to be placed upon - * @param group the ImageFrameGroup that this item is a member of - * @param spu the current samples per canvas unit - * @param start the start frame ogf this item - * @param duration the duration of this item - * @param rgb_data the rgb data of the image - * @param width the width of the original rgb_data image data - * @param height the width of the origianl rgb_data image data - * @param num_channels the number of color channels within rgb_data - */ -ImageFrameView::ImageFrameView(const string & item_id, - ArdourCanvas::Group *parent, - ImageFrameTimeAxis* tv, - ImageFrameTimeAxisGroup* item_group, - double spu, - Gdk::Color& basic_color, - framepos_t start, - framecnt_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::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; - - //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)); - - ArtPixBuf* pbuf; - pbuf = art_pixbuf_new_rgba(the_rgb_data, width, height, (num_channels * width)); - imageframe = 0; - - //calculate our image width based on the track height - 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, boost::bind (&ImageFrameView::remove_marker_view_item, this, _1), gui_context()); -} - -/** - * Destructor - * Reposible for removing and destroying all marker items associated with this item - */ -ImageFrameView::~ImageFrameView() -{ - 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++; - - // 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); - - // remove the item from the marker time axis - MarkerTimeAxisView* mtav = dynamic_cast<MarkerTimeAxis*>(&mv->get_time_axis_view())->get_view(); - if(mtav) - { - 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; - } - - // 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); - } - } - - delete imageframe; - imageframe = 0; -} - - -//---------------------------------------------------------------------------------------// -// Position and duration Accessors/Mutators - -/** - * Set the position of this item to the specified value - * - * @param pos the new position - * @param src the identity of the object that initiated the change - * @return true if the position change was a success, false otherwise - */ -bool -ImageFrameView::set_position(framepos_t pos, void* src, double* delta) -{ - framepos_t old_pos = frame_position; - - // do the standard stuff - bool ret = TimeAxisViewItem::set_position(pos, src, delta); - - // everything went ok with the standard stuff? - 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; - framepos_t marker_old_pos = mv->get_position(); - - mv->set_position(pos + (marker_old_pos - old_pos), src); - } - } - - return(ret); -} - -/** - * Sets the duration of this item - * - * @param dur the new duration of this item - * @param src the identity of the object that initiated the change - * @return true if the duration change was succesful, false otherwise - */ -bool -ImageFrameView::set_duration(framepos_t dur, void* src) -{ - /* do the standard stuff */ - 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 */ - imageframe->property_drawwidth() = trackview.editor.sample_to_pixel(get_duration()); - } - - 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 - * - * @param group the new parent group - */ -void -ImageFrameView::set_time_axis_group(ImageFrameTimeAxisGroup* group) -{ - the_parent_group = group; -} - -/** - * Returns the parent group of this item - * - * @return the parent group of this item - */ -ImageFrameTimeAxisGroup* -ImageFrameView::get_time_axis_group() -{ - return(the_parent_group); -} - - -//---------------------------------------------------------------------------------------// -// ui methods - -/** - * Set the height of this item - * - * @param h the new height - */ -void -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; - - 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_text->raise_to_top(); - frame_handle_start->raise_to_top(); - frame_handle_end->raise_to_top(); - - name_text->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; -} - - -//---------------------------------------------------------------------------------------// -// MarkerView methods - -/** - * Adds a markerView to the list of marker views associated with this item - * - * @param item the marker item to add - * @param src the identity of the object that initiated the change - */ -void -ImageFrameView::add_marker_view_item(MarkerView* item, void* src) -{ - 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 - * - * @param markId the id/name of the item to remove - * @param src the identity of the object that initiated the change - * @return the removed marker item - */ -MarkerView* -ImageFrameView::remove_named_marker_view_item(const string & markerId, void* src) -{ - 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); - - 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; - } - i++; - } - - 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 - * - * @param item the item to remove - * @param src the identity of the object that initiated the change - */ -void -ImageFrameView::remove_marker_view_item (MarkerView* mv) -{ - 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 */ - } -} - -/** - * 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(const string & mname) -{ - 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; - - // found the item, so we can break the for loop - break; - } - } - - return(result); -} |