[pitivi] Refactore pitivi.effects



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]