[pitivi] dialogs: Add missing asset dialog



commit c08007a81678fb2312e4dfe3d68d6a17192cd2d1
Author: HarishFulara07 <harish14143 iiitd ac in>
Date:   Wed Jun 20 15:57:00 2018 +0530

    dialogs: Add missing asset dialog

 pitivi/dialogs/missingasset.py  | 131 ++++++++++++++++++++++++++++++++++++++++
 pitivi/editorperspective.py     |  92 ++--------------------------
 po/POTFILES.in                  |   1 +
 tests/test_editorperspective.py |  13 ++--
 4 files changed, 144 insertions(+), 93 deletions(-)
---
diff --git a/pitivi/dialogs/missingasset.py b/pitivi/dialogs/missingasset.py
new file mode 100644
index 00000000..93bed0cd
--- /dev/null
+++ b/pitivi/dialogs/missingasset.py
@@ -0,0 +1,131 @@
+# -*- coding: utf-8 -*-
+# Pitivi video editor
+# Copyright (c) 2009, Brandon Lewis <brandon_lewis berkeley edu>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the
+# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+"""Dialog for locating a missing asset."""
+import os
+from gettext import gettext as _
+
+from gi.repository import Gtk
+
+from pitivi.mediafilespreviewer import PreviewWidget
+from pitivi.medialibrary import AssetThumbnail
+from pitivi.utils.loggable import Loggable
+from pitivi.utils.ui import beautify_missing_asset
+from pitivi.utils.ui import PADDING
+from pitivi.utils.ui import SPACING
+
+
+# pylint: disable=too-few-public-methods
+class MissingAssetDialog(Gtk.Dialog, Loggable):
+    """Dialog for locating a missing asset using Gtk.FileChooserWidget.
+
+    Attributes:
+        app (Pitivi): The app.
+        asset (GES.UriClipAsset): The missing asset.
+        uri (str): Last known URI of the missing asset.
+    """
+
+    def __init__(self, app, asset, uri):
+        Gtk.Dialog.__init__(self)
+        Loggable.__init__(self)
+
+        self.set_title(_("Locate missing file..."))
+        self.set_modal(True)
+        self.add_buttons(_("Cancel"), Gtk.ResponseType.CANCEL,
+                         _("Open"), Gtk.ResponseType.OK)
+        self.set_border_width(SPACING * 2)
+        self.get_content_area().set_spacing(SPACING)
+        self.set_transient_for(app.gui)
+        self.set_default_response(Gtk.ResponseType.OK)
+
+        # This box will contain widgets with details about the missing file.
+        vbox = Gtk.Box()
+        vbox.set_orientation(Gtk.Orientation.VERTICAL)
+
+        label_start = Gtk.Label()
+        label_start.set_markup(_("The following file could not be found:"))
+        label_start.set_xalign(0)
+        vbox.pack_start(label_start, False, False, 0)
+
+        hbox = Gtk.Box()
+        hbox.set_orientation(Gtk.Orientation.HORIZONTAL)
+        hbox.set_margin_top(PADDING)
+        hbox.set_spacing(PADDING * 2)
+
+        label_asset_info = Gtk.Label()
+        label_asset_info.set_markup(beautify_missing_asset(asset))
+        label_asset_info.set_xalign(0)
+        label_asset_info.set_yalign(0)
+        hbox.pack_start(label_asset_info, False, False, 0)
+
+        unused_small_thumb, large_thumb = AssetThumbnail.get_thumbnails_from_xdg_cache(uri)
+        if large_thumb:
+            self.debug("A thumbnail file was found for %s", uri)
+            thumbnail = Gtk.Image.new_from_pixbuf(large_thumb)
+            hbox.pack_end(thumbnail, False, False, 0)
+
+        vbox.pack_start(hbox, False, False, 0)
+
+        label_end = Gtk.Label()
+        label_end.set_markup(_("Please specify its new location:"))
+        label_end.set_xalign(0)
+        label_end.set_margin_top(PADDING)
+        vbox.pack_start(label_end, False, False, 0)
+
+        self.get_content_area().pack_start(vbox, False, False, 0)
+        vbox.show_all()
+
+        self.__chooser = self.__setup_file_chooser(uri, app.settings)
+        self.get_content_area().pack_start(self.__chooser, True, True, 0)
+        self.__chooser.show()
+
+        # If the window is too big, the window manager will resize it so that
+        # it fits on the screen.
+        self.set_default_size(1024, 1000)
+
+    @staticmethod
+    def __setup_file_chooser(uri, settings):
+        chooser = Gtk.FileChooserWidget(action=Gtk.FileChooserAction.OPEN)
+        chooser.set_select_multiple(False)
+        previewer = PreviewWidget(settings, discover_sync=True)
+        chooser.set_preview_widget(previewer)
+        chooser.set_use_preview_label(False)
+        chooser.connect("update-preview", previewer.update_preview_cb)
+        chooser.set_current_folder(settings.lastProjectFolder)
+        # Use a Gtk FileFilter to only show files with the same extension
+        # Note that splitext gives us the extension with the ".", no need to
+        # add it inside the filter string.
+        unused_filename, extension = os.path.splitext(uri)
+        filter_ = Gtk.FileFilter()
+        # Translators: this is a format filter in a filechooser. Ex: "AVI files"
+        filter_.set_name(_("%s files") % extension)
+        filter_.add_pattern("*%s" % extension.lower())
+        filter_.add_pattern("*%s" % extension.upper())
+        default = Gtk.FileFilter()
+        default.set_name(_("All files"))
+        default.add_pattern("*")
+        chooser.add_filter(filter_)
+        chooser.add_filter(default)
+        return chooser
+
+    def get_new_uri(self):
+        """Returns new URI of the missing asset, if provided by the user."""
+        response = self.run()
+        if response == Gtk.ResponseType.OK:
+            self.log("User chose a new URI for the missing file")
+        return self.__chooser.get_uri()
diff --git a/pitivi/editorperspective.py b/pitivi/editorperspective.py
index b263e7c4..5104b163 100644
--- a/pitivi/editorperspective.py
+++ b/pitivi/editorperspective.py
@@ -30,10 +30,10 @@ from gi.repository import Gtk
 from pitivi.clipproperties import ClipProperties
 from pitivi.configure import APPNAME
 from pitivi.configure import get_ui_dir
+from pitivi.dialogs.missingasset import MissingAssetDialog
 from pitivi.dialogs.prefs import PreferencesDialog
 from pitivi.effects import EffectListWidget
 from pitivi.mediafilespreviewer import PreviewWidget
-from pitivi.medialibrary import AssetThumbnail
 from pitivi.medialibrary import MediaLibraryWidget
 from pitivi.perspective import Perspective
 from pitivi.project import ProjectSettingsDialog
@@ -44,7 +44,6 @@ from pitivi.titleeditor import TitleEditor
 from pitivi.transitions import TransitionsListWidget
 from pitivi.utils.loggable import Loggable
 from pitivi.utils.misc import path_from_uri
-from pitivi.utils.ui import beautify_missing_asset
 from pitivi.utils.ui import beautify_time_delta
 from pitivi.utils.ui import clear_styles
 from pitivi.utils.ui import info_name
@@ -638,99 +637,20 @@ class EditorPerspective(Perspective, Loggable):
             uri = self.app.proxy_manager.getTargetUri(asset)
         else:
             uri = asset.get_id()
-        dialog = Gtk.Dialog(title=_("Locate missing file..."),
-                            transient_for=self.app.gui,
-                            modal=True)
-
-        dialog.add_buttons(_("Cancel"), Gtk.ResponseType.CANCEL,
-                           _("Open"), Gtk.ResponseType.OK)
-        dialog.set_border_width(SPACING * 2)
-        dialog.get_content_area().set_spacing(SPACING)
-        dialog.set_transient_for(self.app.gui)
-        dialog.set_default_response(Gtk.ResponseType.OK)
-
-        # This box will contain widgets with details about the missing file.
-        vbox = Gtk.Box()
-        vbox.set_orientation(Gtk.Orientation.VERTICAL)
-
-        label_start = Gtk.Label()
-        label_start.set_markup(_("The following file could not be found:"))
-        label_start.set_xalign(0)
-        vbox.pack_start(label_start, False, False, 0)
-
-        hbox = Gtk.Box()
-        hbox.set_orientation(Gtk.Orientation.HORIZONTAL)
-        hbox.set_margin_top(PADDING)
-        hbox.set_spacing(PADDING * 2)
 
-        label_asset_info = Gtk.Label()
-        label_asset_info.set_markup(beautify_missing_asset(asset))
-        label_asset_info.set_xalign(0)
-        label_asset_info.set_yalign(0)
-        hbox.pack_start(label_asset_info, False, False, 0)
+        dialog = MissingAssetDialog(self.app, asset, uri)
+        new_uri = dialog.get_new_uri()
 
-        small_thumb, large_thumb = AssetThumbnail.get_thumbnails_from_xdg_cache(uri)
-        if large_thumb:
-            self.debug("A thumbnail file was found for %s", uri)
-            thumbnail = Gtk.Image.new_from_pixbuf(large_thumb)
-            hbox.pack_end(thumbnail, False, False, 0)
-
-        vbox.pack_start(hbox, False, False, 0)
-
-        label_end = Gtk.Label()
-        label_end.set_markup(_("Please specify its new location:"))
-        label_end.set_xalign(0)
-        label_end.set_margin_top(PADDING)
-        vbox.pack_start(label_end, False, False, 0)
-
-        dialog.get_content_area().pack_start(vbox, False, False, 0)
-        vbox.show_all()
-
-        chooser = Gtk.FileChooserWidget(action=Gtk.FileChooserAction.OPEN)
-        chooser.set_select_multiple(False)
-        previewer = PreviewWidget(self.settings, discover_sync=True)
-        chooser.set_preview_widget(previewer)
-        chooser.set_use_preview_label(False)
-        chooser.connect('update-preview', previewer.update_preview_cb)
-        chooser.set_current_folder(self.settings.lastProjectFolder)
-        # Use a Gtk FileFilter to only show files with the same extension
-        # Note that splitext gives us the extension with the ".", no need to
-        # add it inside the filter string.
-        unused_filename, extension = os.path.splitext(uri)
-        filter_ = Gtk.FileFilter()
-        # Translators: this is a format filter in a filechooser. Ex: "AVI
-        # files"
-        filter_.set_name(_("%s files") % extension)
-        filter_.add_pattern("*%s" % extension.lower())
-        filter_.add_pattern("*%s" % extension.upper())
-        default = Gtk.FileFilter()
-        default.set_name(_("All files"))
-        default.add_pattern("*")
-        chooser.add_filter(filter_)
-        chooser.add_filter(default)
-        dialog.get_content_area().pack_start(chooser, True, True, 0)
-        chooser.show()
-
-        # If the window is too big, the window manager will resize it so that
-        # it fits on the screen.
-        dialog.set_default_size(1024, 1000)
-        response = dialog.run()
-
-        new_uri = None
-        if response == Gtk.ResponseType.OK:
-            self.log("User chose a new URI for the missing file")
-            new_uri = chooser.get_uri()
-        else:
+        if not new_uri:
             dialog.hide()
-
             if not self.app.proxy_manager.checkProxyLoadingSucceeded(asset):
                 # Reset the project manager and disconnect all the signals.
                 project_manager.closeRunningProject()
                 # Signal the project loading failure.
                 # You have to do this *after* successfully creating a blank project,
                 # or the startupwizard will still be connected to that signal too.
-                reason = _('No replacement file was provided for "<i>%s</i>".\n\n'
-                           'Pitivi does not currently support partial projects.') % \
+                reason = _("No replacement file was provided for \"<i>%s</i>\".\n\n"
+                           "Pitivi does not currently support partial projects.") % \
                     info_name(asset)
                 project_manager.emit("new-project-failed", project.uri, reason)
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index c97013bf..e9ec1dfe 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -50,6 +50,7 @@ pitivi/dialogs/about.py
 pitivi/dialogs/browseprojects.py
 pitivi/dialogs/clipmediaprops.py
 pitivi/dialogs/filelisterrordialog.py
+pitivi/dialogs/missingasset.py
 pitivi/dialogs/prefs.py
 
 pitivi/utils/misc.py
diff --git a/tests/test_editorperspective.py b/tests/test_editorperspective.py
index ca641a3f..239ae9b3 100644
--- a/tests/test_editorperspective.py
+++ b/tests/test_editorperspective.py
@@ -20,8 +20,8 @@
 from unittest import mock
 
 from gi.repository import GES
-from gi.repository import Gtk
 
+from pitivi.dialogs.missingasset import MissingAssetDialog
 from pitivi.editorperspective import EditorPerspective
 from pitivi.project import ProjectManager
 from pitivi.utils.misc import disconnectAllByFunc
@@ -67,13 +67,12 @@ class TestEditorPerspective(common.TestCase):
             nonlocal app
             nonlocal has_proxy
 
-            with mock.patch('gi.repository.Gtk.Dialog') as dialog:
+            with mock.patch.object(MissingAssetDialog, "__new__") as constructor:
                 failed_cb = mock.MagicMock()
                 app.project_manager.connect("new-project-failed", failed_cb)
 
-                dialog.return_value = mock.MagicMock()
-                dialog.return_value.run = mock.MagicMock(
-                    return_value=Gtk.ResponseType.CLOSE)
+                dialog = constructor.return_value
+                dialog.get_new_uri.return_value = None
 
                 # Call the actual callback
                 # pylint: disable=protected-access
@@ -83,8 +82,8 @@ class TestEditorPerspective(common.TestCase):
                 editorperspective._projectManagerMissingUriCb(
                     project_manager, project, error, asset)
 
-                self.assertTrue(dialog.called)
-                self.assertTrue(dialog.return_value.run.called)
+                self.assertTrue(constructor.called)
+                self.assertTrue(dialog.get_new_uri.called)
                 self.assertEqual(failed_cb.called, not has_proxy)
 
             # pylint: disable=protected-access


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]