def update_background(adj): pos = self.get_background_position() i = image_from_position(self.controller, position=pos, media=self.parent.media) self.view.set_background(i) return True
def set_begin(self, t): try: media = self.parent.media except AttributeError: media = None self.view.set_background( image_from_position(self.controller, position=t, media=media)) return True
def set_begin(self, t): try: media = self.parent.media except AttributeError: media = None self.view.set_background(image_from_position(self.controller, position=t, media=media)) return True
def snapshot_update_cb(context, target): if context.globals['media'] != self.parent.media: return True pos = self.get_background_position() if context.globals['position'] == pos: # Refresh image i = image_from_position(self.controller, position=pos, media=self.parent.media) self.view.set_background(i) return True
def get_view(self, compact=False): """Generate a view widget for editing zone attributes.""" vbox = Gtk.VBox() if self.parent is not None and hasattr(self.parent, 'fragment'): # We are editing the content of an annotation. Use its snapshot as background. i = image_from_position(self.controller, position=self.parent.fragment.begin, media=self.parent.media, height=160) self.view = ShapeDrawer(callback=self.callback, background=i.get_pixbuf()) else: self.view = ShapeDrawer(callback=self.callback) if self.element.data: d = self.element.parsed() if isinstance(d, dict): try: x = int(float(d['x']) * self.view.canvaswidth / 100) y = int(float(d['y']) * self.view.canvasheight / 100) width = int( float(d['width']) * self.view.canvaswidth / 100) height = int( float(d['height']) * self.view.canvasheight / 100) self.callback(((x, y), (x + width, y + height))) self.shape.name = d['name'] except KeyError: self.callback(((0.0, 0.0), (10.0, 10.0))) self.shape.name = self.element.data # Name edition hb = Gtk.HBox() hb.pack_start(Gtk.Label(_("Label")), False, False, 0) self.nameentry = Gtk.Entry() if self.shape is not None: self.nameentry.set_text(self.shape.name) hb.pack_start(self.nameentry, True, True, 0) vbox.pack_start(hb, False, True, 0) vbox.add(self.view.widget) return vbox
def get_view (self, compact=False): """Generate a view widget for editing zone attributes.""" vbox=Gtk.VBox() if self.parent is not None and hasattr(self.parent, 'fragment'): # We are editing the content of an annotation. Use its snapshot as background. i = image_from_position(self.controller, position=self.parent.fragment.begin, media=self.parent.media, height=160) self.view = ShapeDrawer(callback=self.callback, background=i.get_pixbuf()) else: self.view = ShapeDrawer(callback=self.callback) if self.element.data: d=self.element.parsed() if isinstance(d, dict): try: x = int(float(d['x']) * self.view.canvaswidth / 100) y = int(float(d['y']) * self.view.canvasheight / 100) width = int(float(d['width']) * self.view.canvaswidth / 100) height = int(float(d['height']) * self.view.canvasheight / 100) self.callback( ( (x, y), (x+width, y+height) ) ) self.shape.name = d['name'] except KeyError: self.callback( ( (0.0, 0.0), (10.0, 10.0) ) ) self.shape.name = self.element.data # Name edition hb=Gtk.HBox() hb.pack_start(Gtk.Label(_("Label")), False, False, 0) self.nameentry=Gtk.Entry() if self.shape is not None: self.nameentry.set_text(self.shape.name) hb.pack_start(self.nameentry, True, True, 0) vbox.pack_start(hb, False, True, 0) vbox.add(self.view.widget) return vbox
def snapshot_update_cb(context, target): if context.globals['position'] == self.parent.begin: # Refresh image i=image_from_position(self.controller, self.parent.begin) self.view.set_background(i) return True
def get_view (self, compact=False): """Generate a view widget for editing SVG.""" vbox=gtk.VBox() if self.parent is not None and hasattr(self.parent, 'begin'): i=image_from_position(self.controller, self.parent.begin) self.view = ShapeEditor(background=i, pixmap_dir=config.data.advenefile('pixmaps')) def snapshot_update_cb(context, target): if context.globals['position'] == self.parent.begin: # Refresh image i=image_from_position(self.controller, self.parent.begin) self.view.set_background(i) return True self.rules.append(self.controller.event_handler.internal_rule (event='SnapshotUpdate', method=snapshot_update_cb)) def annotation_update_cb(context, target): i=image_from_position(self.controller, self.parent.begin) self.view.set_background(i) return True self.rules.append(self.controller.event_handler.internal_rule (event='AnnotationEditEnd', method=annotation_update_cb)) else: self.view = ShapeEditor(pixmap_dir=config.data.advenefile('pixmaps')) self.parse_svg() self.view.drawer.widget.connect('drag-data-received', self.drawer_drag_received) self.view.drawer.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION | gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_ALL, config.data.drag_type['view'] + config.data.drag_type['annotation'] + config.data.drag_type['uri-list'], gtk.gdk.ACTION_COPY | gtk.gdk.ACTION_LINK) def edit_svg(b): vbox.foreach(vbox.remove) vbox.add(self.view.widget) b=gtk.Button(_("Edit XML")) b.connect('clicked', edit_xml) vbox.pack_start(b, expand=False) self.editing_source=False vbox.show_all() return True def edit_xml(b): if self.sourceview is None: self.sourceview=TextContentHandler(element=self.element, controller=self.controller, parent=self.parent) self.sourceview.widget=self.sourceview.get_view() vbox.foreach(vbox.remove) vbox.add(self.sourceview.widget) b=gtk.Button(_("Graphical editor")) b.connect('clicked', edit_svg) vbox.pack_start(b, expand=False) self.editing_source=True vbox.show_all() return True edit_svg(None) return vbox
def set_begin(self, t): i=image_from_position(self.controller, t) self.view.set_background(i) return True
def make_annotation_menu(self, element, menu): def add_item(*p, **kw): self.add_menuitem(menu, *p, **kw) def loop_on_annotation(menu, ann): self.controller.gui.loop_on_annotation_gui(ann, goto=True) return True def save_snapshot(menu, ann): self.controller.gui.save_snapshot_as(ann.fragment.begin) return True add_item(_("Go to..."), self.goto_annotation, element) add_item(_("Loop"), loop_on_annotation, element) add_item(_("Duplicate"), self.duplicate_annotation, element) item = gtk.MenuItem(_("Highlight"), use_underline=False) item.set_submenu(self.activate_submenu(element)) menu.append(item) add_item(_("Save snapshot..."), save_snapshot, element) if 'montagerenderer' in self.controller.generic_features: add_item(_("Extract video fragment"), self.extract_fragment, element) def build_submenu(submenu, el, items): """Build the submenu for the given element. """ if submenu.get_children(): # The submenu was already populated. return False if len(items) == 1: # Only 1 elements, do not use an intermediary menu m=Menu(element=items[0], controller=self.controller) for c in m.menu.get_children(): m.menu.remove(c) submenu.append(c) else: for i in items: item=gtk.MenuItem(self.get_title(i), use_underline=False) m=Menu(element=i, controller=self.controller) item.set_submenu(m.menu) submenu.append(item) submenu.show_all() return False def build_related(submenu, el): """Build the related annotations submenu for the given element. """ if submenu.get_children(): # The submenu was already populated. return False if el.incomingRelations: i=gtk.MenuItem(_("Incoming")) submenu.append(i) i=gtk.SeparatorMenuItem() submenu.append(i) for t, l in el.typedRelatedIn.iteritems(): at=self.controller.package.get_element_by_id(t) m=gtk.MenuItem(self.get_title(at), use_underline=False) amenu=gtk.Menu() m.set_submenu(amenu) amenu.connect('map', build_submenu, at, l) submenu.append(m) if submenu.get_children(): # There were incoming annotations. Use a separator i=gtk.SeparatorMenuItem() submenu.append(i) if el.outgoingRelations: i=gtk.MenuItem(_("Outgoing")) submenu.append(i) i=gtk.SeparatorMenuItem() submenu.append(i) for t, l in el.typedRelatedOut.iteritems(): at=self.controller.package.get_element_by_id(t) m=gtk.MenuItem(self.get_title(at), use_underline=False) amenu=gtk.Menu() m.set_submenu(amenu) amenu.connect('map', build_submenu, at, l) submenu.append(m) submenu.show_all() return False if element.relations: i=gtk.MenuItem(_("Related annotations"), use_underline=False) submenu=gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_related, element) menu.append(i) if element.incomingRelations: i=gtk.MenuItem(_("Incoming relations"), use_underline=False) submenu=gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_submenu, element, element.incomingRelations) menu.append(i) if element.outgoingRelations: i=gtk.MenuItem(_("Outgoing relations"), use_underline=False) submenu=gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_submenu, element, element.outgoingRelations) menu.append(i) add_item("") item = gtk.MenuItem() item.add(image_from_position(self.controller, position=element.fragment.begin, height=60)) item.connect('activate', self.goto_annotation, element) menu.append(item) #add_item(element.content.data[:40]) add_item(_('Begin: %s') % helper.format_time (element.fragment.begin), lambda i: self.controller.gui.adjust_annotation_bound(element, 'begin')) add_item(_('End: %s') % helper.format_time (element.fragment.end), lambda i: self.controller.gui.adjust_annotation_bound(element, 'end')) add_item(_('Duration: %s') % helper.format_time (element.fragment.duration)) return
def get_view (self, compact=False): """Generate a view widget for editing SVG.""" vbox=Gtk.VBox() if self.parent is not None and hasattr(self.parent, 'fragment'): i = image_from_position(self.controller, position=self.parent.fragment.begin, media=self.parent.media) vi = self.controller.package.imagecache.video_info self.view = ShapeEditor(background=i, icon_dir=config.data.advenefile('pixmaps'), default_size=(vi.get('width', 320), vi.get('height', 200))) def snapshot_update_cb(context, target): if context.globals['media'] != self.parent.media: return True pos = self.get_background_position() if context.globals['position'] == pos: # Refresh image i = image_from_position(self.controller, position=pos, media=self.parent.media) self.view.set_background(i) return True self.rules.append(self.controller.event_handler.internal_rule (event='SnapshotUpdate', method=snapshot_update_cb)) def annotation_update_cb(context, target): self.view.background_adj.set_value(0) return True self.rules.append(self.controller.event_handler.internal_rule (event='AnnotationEditEnd', method=annotation_update_cb)) else: self.view = ShapeEditor(icon_dir=config.data.advenefile('pixmaps')) self.parse_svg() self.view.drawer.widget.connect('drag-data-received', self.drawer_drag_received) self.view.drawer.widget.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.ALL, config.data.get_target_types('view', 'annotation', 'uri-list'), Gdk.DragAction.COPY | Gdk.DragAction.LINK) def edit_svg(b=None): vbox.foreach(vbox.remove) vbox.add(self.view.widget) self.editing_source=False vbox.show_all() return True def edit_xml(b=None): if self.sourceview is None: self.sourceview=TextContentHandler(element=self.element, controller=self.controller, parent=self.parent) self.sourceview.widget=self.sourceview.get_view() b = get_pixmap_toolbutton('xml.png', edit_svg) b.set_tooltip_text(_("Graphical editor")) self.sourceview.toolbar.insert(b, 0) vbox.foreach(vbox.remove) vbox.add(self.sourceview.widget) self.editing_source=True vbox.show_all() return True # Insert "View source" button in Shapewidget toolbar b = get_pixmap_toolbutton('xml.png', edit_xml) b.set_tooltip_text(_("Edit XML")) self.view.toolbar.insert(b, 0) def update_background(adj): pos = self.get_background_position() i = image_from_position(self.controller, position=pos, media=self.parent.media) self.view.set_background(i) return True self.view.background_adj = Gtk.Adjustment.new(value=0, lower=0, upper=1.0, step_increment=0.1, page_increment=0.2, page_size=0.2) slider = Gtk.HScale.new(self.view.background_adj) slider.connect("format-value", lambda s, v: helper.format_time(self.parent.fragment.begin + int(v * self.parent.fragment.duration))) ti = Gtk.ToolItem() ti.add(slider) ti.set_expand(True) self.view.toolbar.insert(ti, -1) self.view.background_adj.connect('value-changed', update_background) if config.data.preferences['prefer-wysiwyg']: edit_svg() else: edit_xml() return vbox
def annotation_update_cb(context, target): i=image_from_position(self.controller, self.parent.begin) self.view.set_background(i) return True
def get_view(self, compact=False): """Generate a view widget for editing SVG.""" vbox = Gtk.VBox() if self.parent is not None and hasattr(self.parent, 'fragment'): i = image_from_position(self.controller, position=self.parent.fragment.begin, media=self.parent.media) vi = self.controller.package.imagecache.video_info self.view = ShapeEditor(background=i, icon_dir=config.data.advenefile('pixmaps'), default_size=(vi.get('width', 320), vi.get('height', 200))) def snapshot_update_cb(context, target): if context.globals['media'] != self.parent.media: return True pos = self.get_background_position() if context.globals['position'] == pos: # Refresh image i = image_from_position(self.controller, position=pos, media=self.parent.media) self.view.set_background(i) return True self.rules.append( self.controller.event_handler.internal_rule( event='SnapshotUpdate', method=snapshot_update_cb)) def annotation_update_cb(context, target): self.view.background_adj.set_value(0) return True self.rules.append( self.controller.event_handler.internal_rule( event='AnnotationEditEnd', method=annotation_update_cb)) else: self.view = ShapeEditor(icon_dir=config.data.advenefile('pixmaps')) self.parse_svg() self.view.drawer.widget.connect('drag-data-received', self.drawer_drag_received) self.view.drawer.widget.drag_dest_set( Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.ALL, config.data.get_target_types('view', 'annotation', 'uri-list'), Gdk.DragAction.COPY | Gdk.DragAction.LINK) def edit_svg(b=None): vbox.foreach(vbox.remove) vbox.add(self.view.widget) self.editing_source = False vbox.show_all() return True def edit_xml(b=None): if self.sourceview is None: self.sourceview = TextContentHandler( element=self.element, controller=self.controller, parent=self.parent) self.sourceview.widget = self.sourceview.get_view() b = get_pixmap_toolbutton('xml.png', edit_svg) b.set_tooltip_text(_("Graphical editor")) self.sourceview.toolbar.insert(b, 0) vbox.foreach(vbox.remove) vbox.add(self.sourceview.widget) self.editing_source = True vbox.show_all() return True # Insert "View source" button in Shapewidget toolbar b = get_pixmap_toolbutton('xml.png', edit_xml) b.set_tooltip_text(_("Edit XML")) self.view.toolbar.insert(b, 0) def update_background(adj): pos = self.get_background_position() i = image_from_position(self.controller, position=pos, media=self.parent.media) self.view.set_background(i) return True self.view.background_adj = Gtk.Adjustment.new(value=0, lower=0, upper=1.0, step_increment=0.1, page_increment=0.2, page_size=0.2) slider = Gtk.HScale.new(self.view.background_adj) slider.connect( "format-value", lambda s, v: helper.format_time(self.parent.fragment.begin + int( v * self.parent.fragment.duration))) ti = Gtk.ToolItem() ti.add(slider) ti.set_expand(True) self.view.toolbar.insert(ti, -1) self.view.background_adj.connect('value-changed', update_background) if config.data.preferences['prefer-wysiwyg']: edit_svg() else: edit_xml() return vbox
def make_annotation_menu(self, element, menu): def add_item(*p, **kw): self.add_menuitem(menu, *p, **kw) def loop_on_annotation(menu, ann): self.controller.gui.loop_on_annotation_gui(ann, goto=True) return True def save_snapshot(menu, ann): self.controller.gui.save_snapshot_as(ann.fragment.begin) return True add_item(_("Go to..."), self.goto_annotation, element) add_item(_("Loop"), loop_on_annotation, element) add_item(_("Duplicate"), self.duplicate_annotation, element) item = gtk.MenuItem(_("Highlight"), use_underline=False) item.set_submenu(self.activate_submenu(element)) menu.append(item) add_item(_("Save snapshot..."), save_snapshot, element) if 'montagerenderer' in self.controller.generic_features: add_item(_("Extract video fragment"), self.extract_fragment, element) def build_submenu(submenu, el, items): """Build the submenu for the given element. """ if submenu.get_children(): # The submenu was already populated. return False if len(items) == 1: # Only 1 elements, do not use an intermediary menu m = Menu(element=items[0], controller=self.controller) for c in m.menu.get_children(): m.menu.remove(c) submenu.append(c) else: for i in items: item = gtk.MenuItem(self.get_title(i), use_underline=False) m = Menu(element=i, controller=self.controller) item.set_submenu(m.menu) submenu.append(item) submenu.show_all() return False def build_related(submenu, el): """Build the related annotations submenu for the given element. """ if submenu.get_children(): # The submenu was already populated. return False if el.incomingRelations: i = gtk.MenuItem(_("Incoming")) submenu.append(i) i = gtk.SeparatorMenuItem() submenu.append(i) for t, l in el.typedRelatedIn.iteritems(): at = self.controller.package.get_element_by_id(t) m = gtk.MenuItem(self.get_title(at), use_underline=False) amenu = gtk.Menu() m.set_submenu(amenu) amenu.connect('map', build_submenu, at, l) submenu.append(m) if submenu.get_children(): # There were incoming annotations. Use a separator i = gtk.SeparatorMenuItem() submenu.append(i) if el.outgoingRelations: i = gtk.MenuItem(_("Outgoing")) submenu.append(i) i = gtk.SeparatorMenuItem() submenu.append(i) for t, l in el.typedRelatedOut.iteritems(): at = self.controller.package.get_element_by_id(t) m = gtk.MenuItem(self.get_title(at), use_underline=False) amenu = gtk.Menu() m.set_submenu(amenu) amenu.connect('map', build_submenu, at, l) submenu.append(m) submenu.show_all() return False if element.relations: i = gtk.MenuItem(_("Related annotations"), use_underline=False) submenu = gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_related, element) menu.append(i) if element.incomingRelations: i = gtk.MenuItem(_("Incoming relations"), use_underline=False) submenu = gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_submenu, element, element.incomingRelations) menu.append(i) if element.outgoingRelations: i = gtk.MenuItem(_("Outgoing relations"), use_underline=False) submenu = gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_submenu, element, element.outgoingRelations) menu.append(i) add_item("") item = gtk.MenuItem() item.add( image_from_position(self.controller, position=element.fragment.begin, height=60)) item.connect('activate', self.goto_annotation, element) menu.append(item) #add_item(element.content.data[:40]) add_item( _('Begin: %s') % helper.format_time(element.fragment.begin), lambda i: self.controller.gui.adjust_annotation_bound( element, 'begin')) add_item( _('End: %s') % helper.format_time(element.fragment.end), lambda i: self.controller.gui.adjust_annotation_bound( element, 'end')) add_item( _('Duration: %s') % helper.format_time(element.fragment.duration)) return
def make_annotation_menu(self, element, menu): def add_item(*p, **kw): self.add_menuitem(menu, *p, **kw) def loop_on_annotation(menu, ann): self.controller.gui.loop_on_annotation_gui(ann, goto=True) return True add_item(_("Go to..."), self.goto_annotation, element) add_item(_("Loop"), loop_on_annotation, element) add_item(_("Duplicate"), self.duplicate_annotation, element) item = gtk.MenuItem(_("Highlight"), use_underline=False) item.set_submenu(self.activate_submenu(element)) menu.append(item) def build_submenu(submenu, el, items): """Build the submenu for the given element. """ if submenu.get_children(): # The submenu was already populated. return False if len(items) == 1: # Only 1 elements, do not use an intermediary menu m=Menu(element=items[0], controller=self.controller) for c in m.menu.get_children(): m.menu.remove(c) submenu.append(c) else: for i in items: item=gtk.MenuItem(self.get_title(i), use_underline=False) m=Menu(element=i, controller=self.controller) item.set_submenu(m.menu) submenu.append(item) submenu.show_all() return False def build_related(submenu, el): """Build the related annotations submenu for the given element. """ if submenu.get_children(): # The submenu was already populated. return False if el.incoming_relations: i=gtk.MenuItem(_("Incoming")) submenu.append(i) i=gtk.SeparatorMenuItem() submenu.append(i) for at, l in el.typed_related_in: m=gtk.MenuItem(self.controller.get_title(at), use_underline=False) amenu=gtk.Menu() m.set_submenu(amenu) amenu.connect('map', build_submenu, at, list(l)) submenu.append(m) if submenu.get_children(): # There were incoming annotations. Use a separator i=gtk.SeparatorMenuItem() submenu.append(i) if el.outgoing_relations: i=gtk.MenuItem(_("Outgoing")) submenu.append(i) i=gtk.SeparatorMenuItem() submenu.append(i) for at, l in el.typed_related_out: m=gtk.MenuItem(self.controller.get_title(at), use_underline=False) amenu=gtk.Menu() m.set_submenu(amenu) amenu.connect('map', build_submenu, at, list(l)) submenu.append(m) submenu.show_all() return False if element.relations: i=gtk.MenuItem(_("Related annotations"), use_underline=False) submenu=gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_related, element) menu.append(i) if element.incoming_relations: i=gtk.MenuItem(_("Incoming relations"), use_underline=False) submenu=gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_submenu, element, element.incoming_relations) menu.append(i) if element.outgoing_relations: i=gtk.MenuItem(_("Outgoing relations"), use_underline=False) submenu=gtk.Menu() i.set_submenu(submenu) submenu.connect('map', build_submenu, element, element.outgoing_relations) menu.append(i) add_item("") item = gtk.MenuItem() item.add(image_from_position(self.controller, position=element.begin, height=60)) item.connect('activate', self.goto_annotation, element) menu.append(item) #add_item(element.content.data[:40]) add_item(_('Begin: %s') % helper.format_time (element.begin)) add_item(_('End: %s') % helper.format_time (element.end)) return