[pitivi] Fix pylint attribute-defined-outside-init
- From: Thibault Saunier <tsaunier src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] Fix pylint attribute-defined-outside-init
- Date: Mon, 11 Nov 2019 22:05:39 +0000 (UTC)
commit 3761fdbf3a158f35bb87fb168153ccd94747cc43
Author: Alexandru Băluț <alexandru balut gmail com>
Date: Mon Oct 28 00:55:46 2019 +0100
Fix pylint attribute-defined-outside-init
pitivi/application.py | 7 +++++--
pitivi/dialogs/prefs.py | 4 ++++
pitivi/editorperspective.py | 11 +++++++----
pitivi/greeterperspective.py | 4 ++--
pitivi/mainwindow.py | 8 ++++----
pitivi/medialibrary.py | 3 +++
pitivi/preset.py | 1 +
pitivi/project.py | 20 ++++++++++----------
pitivi/render.py | 15 +++++++++------
pitivi/timeline/elements.py | 6 ++++++
pitivi/timeline/ruler.py | 2 +-
pitivi/timeline/timeline.py | 33 +++++++++++++++------------------
pitivi/utils/timeline.py | 3 ++-
pitivi/viewer/viewer.py | 10 ++++++----
tests/common.py | 1 +
tests/test_medialibrary.py | 2 ++
tests/test_undo_timeline.py | 1 +
17 files changed, 79 insertions(+), 52 deletions(-)
---
diff --git a/pitivi/application.py b/pitivi/application.py
index b26f5f0f..47beea41 100644
--- a/pitivi/application.py
+++ b/pitivi/application.py
@@ -143,6 +143,7 @@ class Pitivi(Gtk.Application, Loggable):
self._checkVersion()
def _setup(self):
+ # pylint: disable=attribute-defined-outside-init
self.settings = GlobalSettings()
self.threads = ThreadMaster()
self.effects = EffectsManager()
@@ -154,11 +155,13 @@ class Pitivi(Gtk.Application, Loggable):
self.project_manager.connect_after("project-closed", self._project_closed_cb)
self.project_manager.connect("project-saved", self.__project_saved_cb)
- self._createActions()
+ self._create_actions()
self._syncDoUndo()
- def _createActions(self):
+ def _create_actions(self):
self.shortcuts.register_group("app", _("General"), position=10)
+
+ # pylint: disable=attribute-defined-outside-init
self.undo_action = Gio.SimpleAction.new("undo", None)
self.undo_action.connect("activate", self._undoCb)
self.add_action(self.undo_action)
diff --git a/pitivi/dialogs/prefs.py b/pitivi/dialogs/prefs.py
index a05532e3..3b285719 100644
--- a/pitivi/dialogs/prefs.py
+++ b/pitivi/dialogs/prefs.py
@@ -609,6 +609,9 @@ class CustomShortcutDialog(Gtk.Dialog):
self.preferences = pref_dialog
self.customised_item = customised_item
+ # The keyboard shortcut typed by the user.
+ self.accelerator = None
+
self.set_title(_("Set Shortcut"))
# Set a minimum size.
self.set_size_request(500, 300)
@@ -697,6 +700,7 @@ class CustomShortcutDialog(Gtk.Dialog):
def do_response(self, response):
"""Handles the user's response."""
if response == Gtk.ResponseType.OK:
+ assert self.accelerator
if self.conflicting_action:
# Disable the accelerator in its previous use, set for this action.
accels = self.app.get_accels_for_action(self.conflicting_action)
diff --git a/pitivi/editorperspective.py b/pitivi/editorperspective.py
index be1c2a99..74d85f5f 100644
--- a/pitivi/editorperspective.py
+++ b/pitivi/editorperspective.py
@@ -100,7 +100,7 @@ class EditorPerspective(Perspective, Loggable):
def setup_ui(self):
"""Sets up the UI."""
self.__setup_css()
- self._createUi()
+ self._create_ui()
self.app.gui.connect("focus-in-event", self.__focus_in_event_cb)
self.app.gui.connect("destroy", self._destroyedCb)
@@ -164,7 +164,7 @@ class EditorPerspective(Perspective, Loggable):
dialog = RenderDialog(self.app, project)
dialog.window.show()
- def _createUi(self):
+ def _create_ui(self):
"""Creates the graphical interface.
The rough hierarchy is:
@@ -175,6 +175,7 @@ class EditorPerspective(Perspective, Loggable):
The full hierarchy can be admired by starting the GTK+ Inspector
with Ctrl+Shift+I.
"""
+ # pylint: disable=attribute-defined-outside-init
# Main "toolbar" (using client-side window decorations with HeaderBar)
self.headerbar = self.__create_headerbar()
@@ -234,7 +235,7 @@ class EditorPerspective(Perspective, Loggable):
self.toplevel_widget.pack2(self.timeline_ui, resize=True, shrink=False)
# Setup shortcuts for HeaderBar buttons and menu items.
- self.__set_keyboard_shortcuts()
+ self._create_actions()
# Identify widgets for AT-SPI, making our test suite easier to develop
# These will show up in sniff, accerciser, etc.
@@ -312,6 +313,7 @@ class EditorPerspective(Perspective, Loggable):
redo_button.set_action_name("app.redo")
redo_button.set_use_underline(True)
+ # pylint: disable=attribute-defined-outside-init
self.save_button = Gtk.Button.new_with_label(_("Save"))
self.save_button.set_focus_on_click(False)
@@ -342,11 +344,12 @@ class EditorPerspective(Perspective, Loggable):
return headerbar
- def __set_keyboard_shortcuts(self):
+ def _create_actions(self):
group = Gio.SimpleActionGroup()
self.toplevel_widget.insert_action_group("editor", group)
self.headerbar.insert_action_group("editor", group)
+ # pylint: disable=attribute-defined-outside-init
self.save_action = Gio.SimpleAction.new("save", None)
self.save_action.connect("activate", self.__save_project_cb)
group.add_action(self.save_action)
diff --git a/pitivi/greeterperspective.py b/pitivi/greeterperspective.py
index d18d9835..fa47d39b 100644
--- a/pitivi/greeterperspective.py
+++ b/pitivi/greeterperspective.py
@@ -159,7 +159,7 @@ class GreeterPerspective(Perspective):
self.__setup_css()
self.headerbar = self.__create_headerbar()
- self.__set_keyboard_shortcuts()
+ self._create_actions()
def refresh(self):
"""Refreshes the perspective."""
@@ -269,7 +269,7 @@ class GreeterPerspective(Perspective):
else:
self.headerbar.set_title(_("Pitivi"))
- def __set_keyboard_shortcuts(self):
+ def _create_actions(self):
group = Gio.SimpleActionGroup()
self.toplevel_widget.insert_action_group("greeter", group)
self.headerbar.insert_action_group("greeter", group)
diff --git a/pitivi/mainwindow.py b/pitivi/mainwindow.py
index aafe08a7..caf15b12 100644
--- a/pitivi/mainwindow.py
+++ b/pitivi/mainwindow.py
@@ -67,7 +67,7 @@ GlobalSettings.addConfigOption('lastCurrentVersion',
default='')
-# pylint: disable=attribute-defined-outside-init,too-many-instance-attributes
+# pylint: disable=too-many-instance-attributes
class MainWindow(Gtk.ApplicationWindow, Loggable):
"""Pitivi's main window.
@@ -112,7 +112,7 @@ class MainWindow(Gtk.ApplicationWindow, Loggable):
self.log("Setting up the perspectives.")
self.set_icon_name("pitivi")
- self.__set_keyboard_shortcuts()
+ self._create_actions()
self.greeter.setup_ui()
self.editor.setup_ui()
@@ -163,10 +163,10 @@ class MainWindow(Gtk.ApplicationWindow, Loggable):
self.debug("Screen size is %sx%s", screen_width, screen_height)
return min_size.width >= 0.9 * screen_width
- # pylint: disable=attribute-defined-outside-init
- def __set_keyboard_shortcuts(self):
+ def _create_actions(self):
self.app.shortcuts.register_group("win", _("Project"), position=20)
+ # pylint: disable=attribute-defined-outside-init
self.help_action = Gio.SimpleAction.new("help", None)
self.help_action.connect("activate", self.__user_manual_cb)
self.add_action(self.help_action)
diff --git a/pitivi/medialibrary.py b/pitivi/medialibrary.py
index 5640cf60..92a139fc 100644
--- a/pitivi/medialibrary.py
+++ b/pitivi/medialibrary.py
@@ -270,6 +270,8 @@ class AssetThumbnail(GObject.Object, Loggable):
self.__asset = asset
self.proxy_manager = proxy_manager
self.__previewer = None
+ self.small_thumb = None
+ self.large_thumb = None
self.refresh()
def refresh(self):
@@ -415,6 +417,7 @@ class AssetThumbnail(GObject.Object, Loggable):
return icon
def _set_state(self):
+ # pylint: disable=attribute-defined-outside-init
asset = self.__asset
target = asset.get_proxy_target()
target_is_valid = target and not target.get_error()
diff --git a/pitivi/preset.py b/pitivi/preset.py
index 9e058e47..b75303c8 100644
--- a/pitivi/preset.py
+++ b/pitivi/preset.py
@@ -83,6 +83,7 @@ class PresetManager(GObject.Object, Loggable):
self.system = system
def setupUi(self, combo, button):
+ # pylint: disable=attribute-defined-outside-init
self.combo = combo
self.button = button
diff --git a/pitivi/project.py b/pitivi/project.py
index 89d2e20d..bbbca375 100644
--- a/pitivi/project.py
+++ b/pitivi/project.py
@@ -132,6 +132,7 @@ class ProjectManager(GObject.Object, Loggable):
self._backup_lock = 0
self.exitcode = 0
self.__start_loading_time = 0
+ self.time_loaded = 0
def _tryUsingBackupFile(self, uri):
backup_path = self._makeBackupURI(path_from_uri(uri))
@@ -963,6 +964,7 @@ class Project(Loggable, GES.Project):
video_restrictions = self.video_profile.get_restriction().copy_nth(0)
if self._has_rendering_values != rendering:
+ # pylint: disable=attribute-defined-outside-init
if rendering:
video_restrictions_struct = video_restrictions[0]
self.__width = video_restrictions_struct["width"]
@@ -2021,15 +2023,16 @@ class ProjectSettingsDialog:
self.project = project
self.audio_presets = AudioPresetManager(app.system)
self.video_presets = VideoPresetManager(app.system)
- self._createUi()
+
+ self.sar = 0
+ self.proxy_aspect_ratio = Gst.Fraction(1, 0)
+
+ self._create_ui()
self.window.set_transient_for(parent_window)
self._setupUiConstraints()
self.updateUI()
- def __del__(self):
- self.video_presets.disconnect_by_func(self.__videoPresetLoadedCb)
-
- def _createUi(self):
+ def _create_ui(self):
"""Initializes the static parts of the UI."""
self.builder = Gtk.Builder()
self.builder.add_from_file(
@@ -2099,7 +2102,7 @@ class ProjectSettingsDialog:
self.wg.addVertex(self.scaled_proxy_width_spin, signal="value-changed")
self.wg.addVertex(self.scaled_proxy_height_spin, signal="value-changed")
- # Constrain width and height IFF the Link checkbox is checked.
+ # Constrain width and height IFF the Constrain checkbox is checked.
# Video
self.wg.addEdge(self.width_spinbutton, self.height_spinbutton,
predicate=self.widthHeightLinked,
@@ -2171,7 +2174,7 @@ class ProjectSettingsDialog:
set_combo_value(combo, fraction.getWidgetValue())
def __videoPresetLoadedCb(self, unused_mgr):
- self._updateSar()
+ self.sar = self.getSAR()
def getSAR(self):
width = int(self.width_spinbutton.get_value())
@@ -2179,9 +2182,6 @@ class ProjectSettingsDialog:
return Gst.Fraction(width, height)
def _constrainSarButtonToggledCb(self, unused_button):
- self._updateSar()
-
- def _updateSar(self):
self.sar = self.getSAR()
def _updatePresetMenuButton(self, unused_source, unused_target, mgr):
diff --git a/pitivi/render.py b/pitivi/render.py
index 44a63ae3..bac3510b 100644
--- a/pitivi/render.py
+++ b/pitivi/render.py
@@ -125,6 +125,7 @@ class Encoders(Loggable):
return cls._instance
def _load_encoders(self):
+ # pylint: disable=attribute-defined-outside-init
self.aencoders = []
self.vencoders = []
self.muxers = Gst.ElementFactory.list_get_elements(
@@ -140,6 +141,7 @@ class Encoders(Loggable):
self.aencoders.append(fact)
def _load_combinations(self):
+ # pylint: disable=attribute-defined-outside-init
self.compatible_audio_encoders = {}
self.compatible_video_encoders = {}
useless_muxers = set()
@@ -410,6 +412,7 @@ class RenderDialog(Loggable):
self._filesizeEstimateTimer = self._timeEstimateTimer = None
self._is_rendering = False
self._rendering_is_paused = False
+ self._last_timestamp_when_pausing = 0
self.current_position = None
self._time_started = 0
self._time_spent_paused = 0 # Avoids the ETA being wrong on resume
@@ -424,7 +427,9 @@ class RenderDialog(Loggable):
# Whether encoders changing are a result of changing the muxer.
self.muxer_combo_changing = False
- self._createUi()
+ self._create_ui()
+ self.progress = None
+ self.dialog = None
# Directory and Filename
self.filebutton.set_current_folder(self.app.settings.lastExportFolder)
@@ -564,7 +569,7 @@ class RenderDialog(Loggable):
set_combo_value(widget, value)
self.project.videorate = value
- def _createUi(self):
+ def _create_ui(self):
builder = Gtk.Builder()
builder.add_from_file(
os.path.join(configure.get_ui_dir(), "renderingdialog.ui"))
@@ -944,13 +949,11 @@ class RenderDialog(Loggable):
self._pipeline.set_state(Gst.State.PAUSED)
def _pauseRender(self, unused_progress):
- self._rendering_is_paused = self.progress.play_pause_button.get_active(
- )
+ self._rendering_is_paused = self.progress.play_pause_button.get_active()
if self._rendering_is_paused:
self._last_timestamp_when_pausing = time.time()
else:
- self._time_spent_paused += time.time(
- ) - self._last_timestamp_when_pausing
+ self._time_spent_paused += time.time() - self._last_timestamp_when_pausing
self.debug(
"Resuming render after %d seconds in pause", self._time_spent_paused)
self.project.pipeline.togglePlayback()
diff --git a/pitivi/timeline/elements.py b/pitivi/timeline/elements.py
index 921509a3..c9e5b686 100644
--- a/pitivi/timeline/elements.py
+++ b/pitivi/timeline/elements.py
@@ -105,6 +105,7 @@ class KeyframeCurve(FigureCanvas, Loggable):
self.__ylim_min, self.__ylim_max = KeyframeCurve.YLIM_OVERRIDES.get(
binding.pspec, (0.0, 1.0))
+ self.__ydata_drag_start = self.__ylim_min
# Curve values, basically separating source.get_values() timestamps
# and values.
@@ -630,6 +631,7 @@ class TimelineElement(Gtk.Layout, Zoomable, Loggable):
self.add(self.__background)
self.keyframe_curve = None
+ self.__controlledProperty = None
self.show_all()
# We set up the default mixing property right here, if a binding was
@@ -1083,6 +1085,9 @@ class Clip(Gtk.EventBox, Zoomable, Loggable):
self.set_name(name)
self.get_accessible().set_name(name)
+ self._elements_container = None
+ self.leftHandle = None
+ self.rightHandle = None
self.handles = []
self.z_order = -1
self.timeline = layer.timeline
@@ -1214,6 +1219,7 @@ class Clip(Gtk.EventBox, Zoomable, Loggable):
child.setSize(width, height / len(elements))
self.__force_position_update = False
+ # pylint: disable=attribute-defined-outside-init
self._current_x = x
self._current_y = y
self._current_width = width
diff --git a/pitivi/timeline/ruler.py b/pitivi/timeline/ruler.py
index 1a3d2da1..f7ff9bce 100644
--- a/pitivi/timeline/ruler.py
+++ b/pitivi/timeline/ruler.py
@@ -155,8 +155,8 @@ class ScaleRuler(Gtk.DrawingArea, Zoomable, Loggable):
# Create a new buffer
self.pixbuf = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
+ # pylint: disable=attribute-defined-outside-init
context = self.app.gui.get_style_context()
-
color_normal = gtk_style_context_get_color(context, Gtk.StateFlags.NORMAL)
color_insensitive = gtk_style_context_get_color(context, Gtk.StateFlags.BACKDROP)
self._color_normal = color_normal
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index f59b62be..9c40fb36 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -128,16 +128,14 @@ class Marquee(Gtk.Box, Loggable):
Loggable.__init__(self)
self._timeline = timeline
+ self.start_x, self.start_y = 0, 0
+ self.end_x, self.end_y = self.start_x, self.start_y
self.hide()
self.get_style_context().add_class("Marquee")
def hide(self):
"""Hides and resets the widget."""
- self.start_x = None
- self.start_y = None
- self.end_x = None
- self.end_y = None
self.props.height_request = -1
self.props.width_request = -1
self.set_visible(False)
@@ -152,6 +150,7 @@ class Marquee(Gtk.Box, Loggable):
event_widget = Gtk.get_event_widget(event)
self.start_x, self.start_y = event_widget.translate_coordinates(
self._timeline.layout.layers_vbox, event.x, event.y)
+ self.end_x, self.end_y = self.start_x, self.start_y
def move(self, event):
"""Sets the second corner of the marquee.
@@ -185,8 +184,8 @@ class Marquee(Gtk.Box, Loggable):
start_pos = max(0, self._timeline.pixelToNs(self.start_x))
end_pos = max(0, self._timeline.pixelToNs(self.end_x))
- return self._timeline.get_clips_in_between(start_layer,
- end_layer, start_pos, end_pos)
+ return self._timeline.get_clips_in_between(start_layer, end_layer,
+ start_pos, end_pos)
class LayersLayout(Gtk.Layout, Zoomable, Loggable):
@@ -736,6 +735,7 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
self._scrolling = res and button == 2
if self._scrolling:
+ # pylint: disable=attribute-defined-outside-init
self._scroll_start_x = event.x
self._scroll_start_y = event.y
@@ -1420,8 +1420,8 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
self.ges_timeline = None
self.__copied_group = None
- self._createUi()
- self._createActions()
+ self._create_ui()
+ self._create_actions()
self.timeline.connect("size-allocate", self.__timeline_size_allocate_cb)
@@ -1555,7 +1555,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
if project:
self.ruler.setPipeline(project.pipeline)
self.ruler.zoomChanged()
- self._update_ruler(project.videorate)
+ self.ruler.setProjectFrameRate(project.videorate)
self.timeline.set_best_zoom_ratio(allow_zoom_in=True)
self.timeline.update_snapping_distance()
@@ -1580,7 +1580,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
# Internal API
- def _createUi(self):
+ def _create_ui(self):
left_size_group = Gtk.SizeGroup.new(Gtk.SizeGroupMode.HORIZONTAL)
zoom_box = ZoomBox(self)
left_size_group.add_widget(zoom_box)
@@ -1641,7 +1641,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
unused_longest_time, longest_layer = max(layer_lengths)
return longest_layer
- def _createActions(self):
+ def _create_actions(self):
# The actions below are added to this action group and thus
# are accessible only to the self.timeline.layout and self.toolbar
# widgets (and their children) using the "timeline" prefix.
@@ -2081,11 +2081,12 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
self.timeline.scrollToPlayhead(align=Gtk.Align.CENTER, when_not_in_view=True)
def _seek_backward_one_frame_cb(self, unused_action, unused_parameter):
- self._project.pipeline.stepFrame(self._framerate, -1)
+ self._project.pipeline.stepFrame(self._project.videorate, -1)
self.timeline.scrollToPlayhead(align=Gtk.Align.CENTER, when_not_in_view=True)
def _seek_forward_one_frame_cb(self, unused_action, unused_parameter):
- self._project.pipeline.stepFrame(self._framerate, 1)
+
+ self._project.pipeline.stepFrame(self._project.videorate, 1)
self.timeline.scrollToPlayhead(align=Gtk.Align.CENTER, when_not_in_view=True)
def do_focus_in_event(self, unused_event):
@@ -2099,11 +2100,7 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
def _rendering_settings_changed_cb(self, project, item):
"""Handles Project metadata changes."""
if item == "videorate" or item is None:
- self._update_ruler(project.videorate)
-
- def _update_ruler(self, videorate):
- self._framerate = videorate
- self.ruler.setProjectFrameRate(self._framerate)
+ self.ruler.setProjectFrameRate(project.videorate)
def __timeline_size_allocate_cb(self, unused_widget, allocation):
fits = self.timeline.layout.props.height <= allocation.height
diff --git a/pitivi/utils/timeline.py b/pitivi/utils/timeline.py
index cd3bf525..8e033ce6 100644
--- a/pitivi/utils/timeline.py
+++ b/pitivi/utils/timeline.py
@@ -272,9 +272,10 @@ class EditingContext(GObject.Object, Loggable):
self.old_position = self.focus.get_start()
if edge == GES.Edge.EDGE_END and mode == GES.EditMode.EDIT_TRIM:
self.old_position += self.focus.get_duration()
-
self.old_priority = self.focus.get_priority()
+
self.new_position = None
+ self.new_priority = None
self.timeline = timeline
self.app = app
diff --git a/pitivi/viewer/viewer.py b/pitivi/viewer/viewer.py
index ac8e74b8..71e11f6f 100644
--- a/pitivi/viewer/viewer.py
+++ b/pitivi/viewer/viewer.py
@@ -91,8 +91,8 @@ class ViewerContainer(Gtk.Box, Loggable):
self._compactMode = False
self._haveUI = False
-
- self._createUi()
+ self.overlay_stack = None
+ self._create_ui()
if not self.settings.viewerDocked:
self.undock()
@@ -198,7 +198,7 @@ class ViewerContainer(Gtk.Box, Loggable):
self.settings.viewerX = event.x
self.settings.viewerY = event.y
- def _createUi(self):
+ def _create_ui(self):
"""Creates the Viewer GUI."""
self.set_orientation(Gtk.Orientation.VERTICAL)
@@ -547,7 +547,6 @@ class ViewerContainer(Gtk.Box, Loggable):
sink_widget.show()
self.trim_pipeline.connect("state-change", self._state_change_cb)
self.trim_pipeline.setState(Gst.State.PAUSED)
- self._last_trim_ns = 0
self.trim_pipeline.simple_seek(position)
@@ -627,6 +626,9 @@ class ViewerWidget(Gtk.AspectFrame, Loggable):
# The width and height used when snapping the child widget size.
self.videowidth = 0
self.videoheight = 0
+ # Sequence of floats representing sizes where the viewer size snaps.
+ # The project natural video size is 1, double size is 2, etc.
+ self.snaps = []
# Set the shadow to None, otherwise it will take space and the
# child widget size snapping will be a bit off.
diff --git a/tests/common.py b/tests/common.py
index 67dc7361..13620a29 100644
--- a/tests/common.py
+++ b/tests/common.py
@@ -227,6 +227,7 @@ class TestCase(unittest.TestCase, Loggable):
from pitivi.utils.timeline import Zoomable
del Zoomable._instances[:]
+ self._result = None
self._num_failures = len(getattr(self._result, 'failures', []))
self._num_errors = len(getattr(self._result, 'errors', []))
if detect_leaks:
diff --git a/tests/test_medialibrary.py b/tests/test_medialibrary.py
index c0523fe0..932f2d4e 100644
--- a/tests/test_medialibrary.py
+++ b/tests/test_medialibrary.py
@@ -16,6 +16,8 @@
# License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301, USA.
+"""Tests for the pitivi.medialibrary module."""
+# pylint: disable=attribute-defined-outside-init
import os
import tempfile
from unittest import mock
diff --git a/tests/test_undo_timeline.py b/tests/test_undo_timeline.py
index 33dc6a6e..785b60bf 100644
--- a/tests/test_undo_timeline.py
+++ b/tests/test_undo_timeline.py
@@ -47,6 +47,7 @@ class BaseTestUndoTimeline(common.TestCase):
self.timeline = self.project.ges_timeline
self.layer = self.timeline.append_layer()
self.action_log = self.app.action_log
+ self.timeline_container = None
def setup_timeline_container(self):
project = self.app.project_manager.current_project
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]