[pitivi] Refactore pitivi.effects
- From: Edward Hervey <edwardrv src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] Refactore pitivi.effects
- Date: Wed, 22 Sep 2010 13:38:09 +0000 (UTC)
commit ffc03e2dd73e14e652e868caf0517fe1ee209a91
Author: Thibault Saunier <tsaunier gnome org>
Date: Sun Jul 4 15:54:50 2010 -0400
Refactore pitivi.effects
pitivi/application.py | 4 +-
pitivi/effects.py | 227 +++++++++++++++++++++++++----------------
pitivi/factories/operation.py | 17 +++-
pitivi/ui/clipproperties.py | 18 ++--
pitivi/ui/effectlist.py | 80 ++++++--------
pitivi/ui/timeline.py | 2 +-
6 files changed, 197 insertions(+), 151 deletions(-)
---
diff --git a/pitivi/application.py b/pitivi/application.py
index 9d54a4e..77697e3 100644
--- a/pitivi/application.py
+++ b/pitivi/application.py
@@ -40,7 +40,7 @@ import pitivi.instance as instance
from pitivi.check import initial_checks
from pitivi.device import get_probe
-from pitivi.effects import Magician
+from pitivi.effects import effectsHandler
from pitivi.configure import APPNAME
from pitivi.settings import GlobalSettings
from pitivi.threads import ThreadMaster
@@ -136,7 +136,7 @@ class Pitivi(Loggable, Signallable):
self.plugin_manager = PluginManager(
self.settings.get_local_plugin_path(),
self.settings.get_plugin_settings_path())
- self.effects = Magician()
+ self.effects = effectsHandler()
self.deviceprobe = get_probe()
self.projectManager = ProjectManager()
diff --git a/pitivi/effects.py b/pitivi/effects.py
index 9a1d6a7..d6d207b 100644
--- a/pitivi/effects.py
+++ b/pitivi/effects.py
@@ -3,6 +3,7 @@
#
# effects.py
#
+# Copyright (c) 2010, Thibault Saunier <tsaunier gnome org>
# Copyright (c) 2005, Edward Hervey <bilboed bilboed com>
#
# This program is free software; you can redistribute it and/or
@@ -23,14 +24,19 @@
"""
Effects global handling
"""
-
import gst
+import gtk
import re
+import os
from xml.sax.saxutils import escape
+from gettext import gettext as _
from pitivi.factories.operation import EffectFactory
from pitivi.stream import get_stream_for_pad
+from pitivi.configure import get_pixmap_dir
+
+from xdg import IconTheme
# Note: Some effects are available through the frei0r library and the libavfilter0 library
@@ -47,116 +53,84 @@ from pitivi.stream import get_stream_for_pad
USELESS_EFFECTS = ["colorconvert", "coglogoinsert", "festival",]
-video_categories = (
- ("All video effects", ("")),
- ("Colors", ("cogcolorspace", "alphacolor", "videobalance", "gamma", "alpha",\
- "frei0r-filter-color-distance", "frei0r-filter-contrast0r", \
- "frei0r-filter-invert0r", "frei0r-filter-saturat0r", "frei0r-filter-r",\
- "frei0r-filter-white-balance", "frei0r-filter-brightness", "frei0r-filter-b",\
- "frei0r-filter-gamma", "frei0r-filter-hueshift0r", "frei0r-filter-transparency",\
- "frei0r-filter-equaliz0r", "frei0r-filter-glow ", "frei0r-filter-g", "frei0r-filter-bw0r"\
- )
- ),
- ("Noise", ("videorate", "frei0r-filter-edgeglow" )),
- ("Analysis", ("videoanalyse", "videodetect", "videomark", "revtv", "navigationtest",\
- "frei0r-filter-rgb-parade", "frei0r-filter-vectorscope", "frei0r-filter-luminance",\
- )),
- ("Blur", ("frei0r-filter-squareblur", )),
- ("Geometry", ("cogscale", "aspectratiocrop", "cogdownsample", "videocrop", "videoflip",\
- "videobox", "gdkpixbufscale", "frei0r-filter-letterb0xed" \
- "frei0r-filter-k-means-clustering", "videoscale", "frei0r-filter-lens-correction",
- "frei0r-filter-perspective", "frei0r-filter-scale0tilt", "frei0r-filter-pixeliz0r",\
- "frei0r-filter-flippo", "frei0r-filter-3dflippo"
- )
- ),
- ("Fancy",("rippletv", "streaktv", "radioactv", "optv", "quarktv", "vertigotv",\
- "shagadelictv", "warptv", "dicetv", "agingtv", "edgetv", "frei0r-filter-cartoon",\
- "frei0r-filter-water", "frei0r-filter-nosync0r"
- )
- ),
- ("Time", ("frei0r-filter-delay0r")),
- ("Uncategorized", (""))
-)
-
-audio_categories = (("All audio effects", ("")),)
-
-def get_categories(effect, effectType):
-
- effectName = effect.get_name()
- categories = []
-
- if effectType is AUDIO_EFFECT:
- categories.append(audio_categories[0][0])
- for categorie in audio_categories:
- for name in categorie[1]:
- if name == effectName:
- categories.append(categorie[0])
- return categories
-
- for categorie in video_categories:
- for name in categorie[1]:
- if name == effectName:
- categories.append(categorie[0])
-
- if categories == []:
- categories.append("Uncategorized")
-
- categories.append(video_categories[0][0])
- return categories
-
-#Convenience function for better effect properties lisibility
-def getNiceEffectName(effect):
- uselessWords = re.compile('(Video |effect |Audio )')
- return uselessWords.sub("", (escape(effect.get_longname()))).title()
-
-def getNiceEffectDescription(effect):
- return (escape(effect.get_description()))
-
-class Magician:
+class effectsHandler:
"""
Handles all the effects
"""
-
def __init__(self):
- self.simple_video = []
- self.simple_audio = []
+ self._audio_categories_effects = (("All effects", ("")),)
+ self._video_categories_effects = (
+ (_("All effects"), ("")),
+ (_("Colors"), ("cogcolorspace", "alphacolor", "videobalance", "gamma", "alpha",\
+ "frei0r-filter-color-distance", "frei0r-filter-contrast0r", \
+ "frei0r-filter-invert0r", "frei0r-filter-saturat0r", "frei0r-filter-r",\
+ "frei0r-filter-white-balance", "frei0r-filter-brightness", "frei0r-filter-b",\
+ "frei0r-filter-gamma", "frei0r-filter-hueshift0r", "frei0r-filter-transparency",\
+ "frei0r-filter-equaliz0r", "frei0r-filter-glow", "frei0r-filter-g", "frei0r-filter-bw0r")
+ ),
+ (_("Noise"), ("videorate", "frei0r-filter-edgeglow" )),
+ (_("Analysis"), ("videoanalyse", "videodetect", "videomark", "revtv", "navigationtest",\
+ "frei0r-filter-rgb-parade", "frei0r-filter-vectorscope", "frei0r-filter-luminance",\
+ )),
+ (_("Blur"), ("frei0r-filter-squareblur", )),
+ (_("Geometry"), ("cogscale", "aspectratiocrop", "cogdownsample", "videocrop", "videoflip",\
+ "videobox", "gdkpixbufscale", "frei0r-filter-letterb0xed" \
+ "frei0r-filter-k-means-clustering", "videoscale", "frei0r-filter-lens-correction",
+ "frei0r-filter-perspective", "frei0r-filter-scale0tilt", "frei0r-filter-pixeliz0r",\
+ "frei0r-filter-flippo", "frei0r-filter-3dflippo", "frei0r-filter-letterb0xed",
+ )
+ ),
+ (_("Fancy"),("rippletv", "streaktv", "radioactv", "optv", "quarktv", "vertigotv",\
+ "shagadelictv", "warptv", "dicetv", "agingtv", "edgetv", "frei0r-filter-cartoon",\
+ "frei0r-filter-water", "frei0r-filter-nosync0r", "frei0r-filter-k-means-clustering",
+ "frei0r-filter-delay0r",
+ )
+ ),
+ (_("Time"), ("frei0r-filter-delay0r",)),
+ (_("Uncategorized"), ("",))
+ )
+ self._audio_categories = []
+ self._video_categories = []
+ self.video_effects = []
+ self.audio_effects = []
self.effect_factories_dict = {}
- self.transitions = []
- self._getAllEffects()
+ self._setAllEffects()
- def _getAllEffects(self):
+ def _setAllEffects(self):
# go trough the list of element factories and
# add them to the correct list filtering if necessary
factlist = gst.registry_get_default().get_feature_list(gst.ElementFactory)
for element_factory in factlist:
klass = element_factory.get_klass()
if "Effect" in klass and element_factory.get_name() not in USELESS_EFFECTS:
- factory = EffectFactory(element_factory.get_name(), element_factory.get_name())
- added = self.addStreams(element_factory, factory)
+ name = element_factory.get_name()
+ effect = EffectFactory(name, name,
+ self._getEffectCategories(name),
+ self._getEffectName(element_factory),
+ self._getEffectDescripton(element_factory),
+ self._getEffectIcon(name))
+ added = self.addStreams(element_factory, effect)
+
if added is True:
if 'Audio' in klass:
- self.simple_audio.append(element_factory)
+ self.audio_effects.append(element_factory)
elif 'Video' in klass:
- self.simple_video.append(element_factory)
- self.addFactory(element_factory.get_name(), factory)
+ self.video_effects.append(element_factory)
+ self._addEffectToDic(name, effect)
+
+ def getAllAudioEffects(self):
+ return self.audio_effects
+
+ def getAllVideoEffects(self):
+ return self.video_effects
- def addFactory(self, name, factory):
+ def _addEffectToDic(self, name, factory):
self.effect_factories_dict[name]=factory
- def getFactory(self, name):
+ def getEffect(self, name):
return self.effect_factories_dict.get(name)
- def getElementFromFactoryName(self, name, effectType):
- if effectType == VIDEO_EFFECT:
- for element_factory in self.simple_video:
- if element_factory.get_name() == name:
- return element_factory
- elif effectType == AUDIO_EFFECT:
- for element_factory in self.simple_audio:
- if element_factory.get_name() == name:
- return element_factory
-
def addStreams(self, element, factory):
pads = element.get_static_pad_templates()
@@ -175,3 +149,76 @@ class Magician:
stream = get_stream_for_pad(pad)
factory.addOutputStream(stream)
return True
+
+ def _getEffectDescripton(self, element_factory):
+ return (escape(element_factory.get_description()))
+
+ def _getEffectCategories(self, effect_name):
+ categories = []
+
+ for categorie in self._audio_categories_effects:
+ for name in categorie[1]:
+ if name == effect_name:
+ categories.append(categorie[0])
+
+ for categorie in self._video_categories_effects:
+ for name in categorie[1]:
+ if name == effect_name:
+ categories.append(categorie[0])
+
+ if not categories:
+ categories.append(_("Uncategorized"))
+
+ categories.append(self._video_categories_effects[0][0])
+
+ return categories
+
+ def _getEffectName(self, element_factory):
+ """ Better name for humans"""
+ #TODO check if it is the good way to make it translatable
+ #And to filter actually!
+ video = _("Video")
+ audio = _("Audio |audio")
+ effect = _("effect")
+ pipe = " |"
+ uselessWords = re.compile(video + pipe + audio + pipe + effect)
+ return uselessWords.sub("", (escape(element_factory.get_longname()))).title()
+
+ def getVideoCategories(self):
+ """ Returns all video effect categories"""
+ if not self._video_categories:
+ for categorie in self._video_categories_effects:
+ self._video_categories.append(categorie[0])
+ return self._video_categories
+
+ video_categories = property(getVideoCategories)
+
+ def getAudioCategories(self):
+ if not self._audio_categories:
+ for categorie in self._audio_categories_effects:
+ self._audio_categories.append(categorie[0])
+ return self._audio_categories
+
+ audio_categories = property(getAudioCategories)
+
+ def getAllCategories(self):
+ effects_categories = []
+ return effects_categories.extended(self.video_categories).extended(self.audio_categories)
+
+ def _getEffectIcon(self, effect_name):
+ #Shouldn't we use pyxdg to make things cleaner and more optimized?
+ icontheme = gtk.icon_theme_get_default()
+ pixdir = get_pixmap_dir()
+ icon = None
+ try:
+ icon = icontheme.load_icon(effect_name, 32, 0)
+ except:
+ # empty except clause is bad but load_icon raises gio.Error.
+ ## Right, *gio*.
+ if not icon:
+ effect_name = effect_name + ".png"
+ try:
+ icon = gtk.gdk.pixbuf_new_from_file(os.path.join(pixdir, effect_name))
+ except:
+ return None
+ return icon
diff --git a/pitivi/factories/operation.py b/pitivi/factories/operation.py
index 7cea640..4da77e0 100644
--- a/pitivi/factories/operation.py
+++ b/pitivi/factories/operation.py
@@ -24,6 +24,8 @@ import gst
from pitivi.factories.base import OperationFactory
from pitivi.stream import AudioStream, VideoStream
+from gettext import gettext as _
+
# FIXME: define a proper hierarchy
class OperationFactoryError(Exception):
pass
@@ -58,9 +60,22 @@ class EffectFactory (TransformFactory):
"""
Factories that applies an effect on a stream
"""
- def __init__ (self, effect, name=''):
+ def __init__ (self, effect, name='', categories=[_("Uncategorized")], human_name="", description="", icon=None):
TransformFactory.__init__(self, name)
self._effect = effect
+ self.categories = categories
+ self.description = description
+ self.human_name = human_name
+ self._setIcon(icon)
+
+ def getHumanName(self):
+ return self.human_name
+
+ def getDescription(self):
+ return self.description
+
+ def getCategories(self):
+ return self.categories
def _makeBin (self, *args):
bin = gst.Bin()
diff --git a/pitivi/ui/clipproperties.py b/pitivi/ui/clipproperties.py
index 487deb4..9ccd3b5 100644
--- a/pitivi/ui/clipproperties.py
+++ b/pitivi/ui/clipproperties.py
@@ -34,7 +34,6 @@ from pitivi.effects import AUDIO_EFFECT, VIDEO_EFFECT
from pitivi.receiver import receiver, handler
from pitivi.timeline.track import TrackEffect
from pitivi.stream import AudioStream, VideoStream
-from pitivi.effects import getNiceEffectName, getNiceEffectDescription
(COL_ACTIVATED,
COL_TYPE,
@@ -78,6 +77,7 @@ class EffectProperties(gtk.Expander):
self.selected_effects = []
self.timeline_object = None
self.app = instance
+ self.effectsHandler = self.app.effects
self.VContent = gtk.VBox()
self.add(self.VContent)
@@ -195,7 +195,6 @@ class EffectProperties(gtk.Expander):
self.timeline_object = list(timeline.selection.selected)[0]
else:
self.timeline_object = None
- print self.timeline_object
self._updateAll()
timeline_object = receiver()
@@ -204,7 +203,6 @@ class EffectProperties(gtk.Expander):
def trackAddedCb(self, unused_timeline_object, track_object):
if isinstance (track_object, TrackEffect):
self.selected_effects = self.timeline.selection.getSelectedTrackEffects()
- print self.timeline.selection.getSelectedTrackEffects()
self._updateAll()
@handler(timeline_object, "track-object-removed")
@@ -225,6 +223,7 @@ class EffectProperties(gtk.Expander):
self.timeline_object.removeTrackObject(effect)
def _dragDataReceivedCb(self, unused, context, x, y, timestamp):
+ # I am waiting for effects to work again before implementing DND here
print "Receive"
def _dragDropCb(self, unused, context, x, y, timestamp):
@@ -257,7 +256,6 @@ class EffectProperties(gtk.Expander):
return True
def _updateAll(self):
- print "Updating"
if self.get_expanded():
if self.timeline_object:
self.table.show_all()
@@ -273,18 +271,16 @@ class EffectProperties(gtk.Expander):
def _updateTreeview(self):
self.storemodel.clear()
- for effect in self.selected_effects:
+ for track_effect in self.selected_effects:
to_append = [True] #TODO Implement that
- if isinstance(effect.factory.getInputStreams()[0], VideoStream):
+ if isinstance(track_effect.factory.getInputStreams()[0], VideoStream):
to_append.append("Video")
- elem = self.app.effects.getElementFromFactoryName(effect.factory.name, VIDEO_EFFECT)
else:
to_append.append("Audio")
- elem = self.app.effects.getElementFromFactoryName(effect.factory.name, AUDIO_EFFECT)
- to_append.append(getNiceEffectName(elem))
- to_append.append(getNiceEffectDescription(elem))
- to_append.append(effect)
+ to_append.append(track_effect.factory.getHumanName())
+ to_append.append(track_effect.factory.getDescription())
+ to_append.append(track_effect)
self.storemodel.append(to_append)
diff --git a/pitivi/ui/effectlist.py b/pitivi/ui/effectlist.py
index ea49f16..08092c0 100644
--- a/pitivi/ui/effectlist.py
+++ b/pitivi/ui/effectlist.py
@@ -37,20 +37,16 @@ from pitivi.settings import GlobalSettings
from pitivi.utils import beautify_length
from pitivi.log.loggable import Loggable
-from pitivi.effects import AUDIO_EFFECT, VIDEO_EFFECT,\
- audio_categories, video_categories, get_categories,\
- getNiceEffectName, getNiceEffectDescription
+from pitivi.effects import AUDIO_EFFECT, VIDEO_EFFECT
from pitivi.ui.common import SPACING, PADDING
(COL_ICON,
- COL_ICON_LARGE,
COL_NAME_TEXT,
COL_DESC_TEXT,
COL_EFFECT_TYPE,
- COL_EFFECT_CATEGORIE,
+ COL_EFFECT_CATEGORIES,
COL_FACTORY,
- COL_SEARCH_TEXT,
- COL_SHORT_TEXT) = range(9)
+ COL_ELEMENT_NAME) = range(7)
INVISIBLE = gtk.gdk.pixbuf_new_from_file(os.path.join(get_pixmap_dir(),
"invisible.png"))
@@ -99,8 +95,7 @@ class EffectList(gtk.VBox, Loggable):
# Store
# icon, icon, infotext, objectfactory
- self.storemodel = gtk.ListStore(gtk.gdk.Pixbuf, gtk.gdk.Pixbuf,
- str, str, int, object, object, str, str)
+ self.storemodel = gtk.ListStore(gtk.gdk.Pixbuf, str, str, int, object, object, str)
# Scrolled Windows
self.treeview_scrollwin = gtk.ScrolledWindow()
@@ -112,7 +107,6 @@ class EffectList(gtk.VBox, Loggable):
self.treeview = gtk.TreeView(self.storemodel)
self.treeview_scrollwin.add(self.treeview)
self.treeview.set_property("rules_hint", True)
- self.treeview.set_property("search_column", COL_SEARCH_TEXT)
self.treeview.set_property("has_tooltip", True)
tsel = self.treeview.get_selection()
tsel.set_mode(gtk.SELECTION_SINGLE)
@@ -149,16 +143,11 @@ class EffectList(gtk.VBox, Loggable):
self.searchEntry.connect ("changed", self.searchEntryChangedCb)
self.searchEntry.connect ("icon-press", self.searchEntryIconClickedCb)
- self.treeview.connect("button-press-event",
- self._treeViewButtonPressEventCb)
- self.treeview.connect("motion-notify-event",
- self._treeViewMotionNotifyEventCb)
- self.treeview.connect("query-tooltip",
- self._treeViewQueryTooltipCb)
- self.treeview.connect("button-release-event",
- self._treeViewButtonReleaseCb)
- self.treeview.connect("drag_begin",
- self._dndDragBeginCb)
+ self.treeview.connect("button-press-event", self._treeViewButtonPressEventCb)
+ self.treeview.connect("motion-notify-event", self._treeViewMotionNotifyEventCb)
+ self.treeview.connect("query-tooltip", self._treeViewQueryTooltipCb)
+ self.treeview.connect("button-release-event", self._treeViewButtonReleaseCb)
+ self.treeview.connect("drag_begin", self._dndDragBeginCb)
self.treeview.connect("drag_data_get", self._dndDataGetCb)
self.pack_start(Hfilters, expand=False)
@@ -171,27 +160,19 @@ class EffectList(gtk.VBox, Loggable):
self.treeview.set_model(self.modelFilter)
#Add factories
- self._addFactories(self.app.effects.simple_video, VIDEO_EFFECT)
- self._addFactories(self.app.effects.simple_audio, AUDIO_EFFECT)
+ self._addFactories(self.app.effects.getAllVideoEffects(), VIDEO_EFFECT)
+ self._addFactories(self.app.effects.getAllAudioEffects(), AUDIO_EFFECT)
self.treeview_scrollwin.show_all()
Hfilters.show_all()
Hsearch.show_all()
- def _addFactories(self, effects, effectType):
- #TODO find a way to associate an icon/thumbnail to each effect
- thumbnail_file = os.path.join (os.getcwd(), "icons", "24x24", "pitivi.png")
- pixbuf = gtk.gdk.pixbuf_new_from_file(thumbnail_file)
-
- for effect in effects:
- name = getNiceEffectName(effect)
- description = getNiceEffectDescription(effect)
- categories = get_categories(effect, effectType)
-
- factory = self.app.effects.getFactory(effect.get_name())
- self.storemodel.append ([pixbuf, pixbuf, name, description, effectType, categories,
- factory, effect.get_description(),
- factory.name])
+ def _addFactories(self, elements, effectType):
+ for element in elements:
+ effect = self.app.effects.getEffect(element.get_name())
+ self.storemodel.append ([effect.icon, effect.getHumanName(),\
+ effect.getDescription(), effectType, effect.getCategories(),\
+ effect, element.get_name()])
self.storemodel.set_sort_column_id(COL_NAME_TEXT, gtk.SORT_ASCENDING)
@@ -199,12 +180,12 @@ class EffectList(gtk.VBox, Loggable):
self.effectCategory.get_model().clear()
if effectType is VIDEO_EFFECT:
- for categorie in video_categories:
- self.effectCategory.append_text(categorie[0])
+ for categorie in self.app.effects.video_categories:
+ self.effectCategory.append_text(categorie)
if effectType is AUDIO_EFFECT:
- for categorie in audio_categories:
- self.effectCategory.append_text(categorie[0])
+ for categorie in self.app.effects.audio_categories:
+ self.effectCategory.append_text(categorie)
self.effectCategory.set_active(0)
@@ -216,14 +197,21 @@ class EffectList(gtk.VBox, Loggable):
context.drag_abort(int(time.time()))
else:
row = self.storemodel[path[0]]
- context.set_icon_pixbuf(row[COL_ICON], 0, 0)
+ if row[COL_ICON]:
+ context.set_icon_pixbuf(row[COL_ICON], 0, 0)
def _rowUnderMouseSelected(self, view, event):
result = view.get_path_at_pos(int(event.x), int(event.y))
if result:
path = result[0]
- selection = view.get_selection()
- return selection.path_is_selected(path) and selection.count_selected_rows() > 0
+ if isinstance(view, gtk.TreeView):
+ selection = view.get_selection()
+ return selection.path_is_selected(path) and selection.count_selected_rows() > 0
+ elif isinstance(view, gtk.IconView):
+ selection = view.get_selected_items()
+ return view.path_is_selected(path) and len(selection)
+ else:
+ assert False
return False
@@ -309,7 +297,7 @@ class EffectList(gtk.VBox, Loggable):
def getSelectedItems(self):
model, rows = self.treeview.get_selection().get_selected_rows()
path = self.modelFilter.convert_path_to_child_path(rows[0])
- return self.storemodel[path][COL_SHORT_TEXT]
+ return self.storemodel[path][COL_ELEMENT_NAME]
def _dndDataGetCb(self, unused_widget, context, selection,
targettype, unused_eventtime):
@@ -337,9 +325,9 @@ class EffectList(gtk.VBox, Loggable):
def _setRowVisible(self, model, iter, data):
if self.effectType.get_active() == model.get_value(iter, COL_EFFECT_TYPE):
- if model.get_value(iter, COL_EFFECT_CATEGORIE) is None:
+ if model.get_value(iter, COL_EFFECT_CATEGORIES) is None:
return False
- if self.effectCategory.get_active_text() in model.get_value(iter, COL_EFFECT_CATEGORIE):
+ if self.effectCategory.get_active_text() in model.get_value(iter, COL_EFFECT_CATEGORIES):
text = self.searchEntry.get_text().lower()
return text in model.get_value(iter, COL_DESC_TEXT).lower() or\
text in model.get_value(iter, COL_NAME_TEXT).lower()
diff --git a/pitivi/ui/timeline.py b/pitivi/ui/timeline.py
index 31b54c9..aa351d3 100644
--- a/pitivi/ui/timeline.py
+++ b/pitivi/ui/timeline.py
@@ -513,7 +513,7 @@ class Timeline(gtk.Table, Loggable, Zoomable):
uris = selection.data.split("\n")
self._factories = [self.project.sources.getUri(uri) for uri in uris]
else:
- self._factories = [self.app.effects.getFactory(selection.data)]
+ self._factories = [self.app.effects.getEffect(selection.data)]
context.drag_status(gtk.gdk.ACTION_COPY, timestamp)
return True
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]