[pitivi] titleeditor: Initial round of refactoring
- From: Jean-FranÃois Fortin Tam <jfft src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] titleeditor: Initial round of refactoring
- Date: Mon, 10 Sep 2012 20:46:39 +0000 (UTC)
commit 1e0bbb237aea45dfbe5c57bb6e755ca9c9253791
Author: Jean-FranÃois Fortin Tam <nekohayo gmail com>
Date: Mon Sep 3 00:36:52 2012 -0400
titleeditor: Initial round of refactoring
Rename methods to make them easier to understand
Split signals handling from pipeline flushing
data/ui/titleeditor.ui | 23 ++-----
pitivi/timeline/track.py | 6 +-
pitivi/titleeditor.py | 163 ++++++++++++++++++++++++---------------------
3 files changed, 95 insertions(+), 97 deletions(-)
---
diff --git a/data/ui/titleeditor.ui b/data/ui/titleeditor.ui
index 37428f7..fce96bd 100644
--- a/data/ui/titleeditor.ui
+++ b/data/ui/titleeditor.ui
@@ -158,7 +158,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
- <property name="title" translatable="yes">Pick a Font color</property>
+ <property name="title" translatable="yes">Pick a font color</property>
<signal name="color-set" handler="_frontTextColorButtonCb" swapped="no"/>
</object>
</child>
@@ -184,7 +184,7 @@
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_alpha">True</property>
- <property name="title" translatable="yes">Pick a Background Color</property>
+ <property name="title" translatable="yes">Pick a background color</property>
<property name="color">#ffffffffffff</property>
<signal name="color-set" handler="_backgroundColorButtonCb" swapped="no"/>
</object>
@@ -195,18 +195,6 @@
</packing>
</child>
<child>
- <object class="GtkSeparatorToolItem" id="toolbutton2">
- <property name="use_action_appearance">False</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="use_action_appearance">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
<object class="GtkToggleToolButton" id="markupToggle">
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
@@ -215,7 +203,6 @@
<property name="tooltip_markup" translatable="yes">Convert to markup</property>
<property name="tooltip_text" translatable="yes">Convert to markup</property>
<property name="use_action_appearance">False</property>
- <property name="label" translatable="yes"><></property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-convert</property>
<signal name="toggled" handler="_markupToggleCb" swapped="no"/>
@@ -233,7 +220,7 @@
</packing>
</child>
<child>
- <object class="GtkTextView" id="textview1">
+ <object class="GtkTextView" id="textview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="margin_left">12</property>
@@ -241,8 +228,8 @@
<property name="margin_top">12</property>
<property name="margin_bottom">12</property>
<property name="wrap_mode">word</property>
- <signal name="focus-in-event" handler="_focusedTextView" swapped="no"/>
- <signal name="focus-out-event" handler="_unfocusedTextView" swapped="no"/>
+ <signal name="focus-in-event" handler="_textviewFocusedCb" swapped="no"/>
+ <signal name="focus-out-event" handler="_textviewUnfocusedCb" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
diff --git a/pitivi/timeline/track.py b/pitivi/timeline/track.py
index d15d689..e6a1875 100644
--- a/pitivi/timeline/track.py
+++ b/pitivi/timeline/track.py
@@ -619,14 +619,14 @@ class TrackObject(View, GooCanvas.CanvasGroup, Zoomable, Loggable):
self.app.gui.title_editor.set_source(self.element.get_timeline_object())
else:
if self.element.get_track().get_property("track_type") == GES.TrackType.VIDEO:
- has = False
+ has_text_overlay = False
tlobj = self.element.get_timeline_object()
trackobjs = tlobj.get_track_objects()
for trackobj in trackobjs:
if isinstance(trackobj, GES.TrackTextOverlay):
- has = True
+ has_text_overlay = True
title = trackobj
- if not has:
+ if not has_text_overlay:
title = GES.TrackTextOverlay()
title.set_text("")
title.set_start(self.element.get_start())
diff --git a/pitivi/titleeditor.py b/pitivi/titleeditor.py
index b428f27..0cf686b 100644
--- a/pitivi/titleeditor.py
+++ b/pitivi/titleeditor.py
@@ -19,9 +19,6 @@
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301, USA.
-"""
-Shows title editor
-"""
import os
from gi.repository import Gtk
@@ -586,16 +583,13 @@ class TitleEditor(Loggable):
#Drag attributes
self._drag_events = []
- self._drag_connected = False
- self._tab_opened = False
+ self._signals_connected = False
- #Creat UI
self._createUI()
self.textbuffer = Gtk.TextBuffer()
self.pangobuffer = InteractivePangoBuffer()
self.textarea.set_buffer(self.pangobuffer)
- #Conect updates
self.textbuffer.connect("changed", self._updateSourceText)
self.pangobuffer.connect("changed", self._updateSourceText)
@@ -610,7 +604,7 @@ class TitleEditor(Loggable):
self.widget = builder.get_object("box1") # To be used by tabsmanager
self.infobar = builder.get_object("infobar")
self.editing_box = builder.get_object("editing_box")
- self.textarea = builder.get_object("textview1")
+ self.textarea = builder.get_object("textview")
self.markup_button = builder.get_object("markupToggle")
toolbar = builder.get_object("toolbar")
toolbar.get_style_context().add_class("inline-toolbar")
@@ -618,8 +612,8 @@ class TitleEditor(Loggable):
buttons = ["bold", "italic", "font", "font_fore_color", "back_color"]
for button in buttons:
self.bt[button] = builder.get_object(button)
- settings = ["valignment", "halignment", "xpos", "ypos"]
+ settings = ["valignment", "halignment", "xpos", "ypos"]
for setting in settings:
self.settings[setting] = builder.get_object(setting)
@@ -635,15 +629,13 @@ class TitleEditor(Loggable):
_("Center"): "center",
_("Right"): "right"}.items():
self.settings["halignment"].append(en, n)
- self.set_sensitive(False)
+ self._deactivate()
- def _focusedTextView(self, widget, notused_event):
- self.app.gui.timeline_ui.playhead_actions.set_sensitive(False)
- self.app.gui.timeline_ui.selection_actions.set_sensitive(False)
+ def _textviewFocusedCb(self, unused_widget, unused_event):
+ self.app.gui.setActionsSensitive(False)
- def _unfocusedTextView(self, widget, notused_event):
- self.app.gui.timeline_ui.playhead_actions.set_sensitive(True)
- self.app.gui.timeline_ui.selection_actions.set_sensitive(True)
+ def _textviewUnfocusedCb(self, unused_widget, unused_event):
+ self.app.gui.setActionsSensitive(True)
def _backgroundColorButtonCb(self, widget):
self.textarea.modify_base(self.textarea.get_state(), widget.get_color())
@@ -676,34 +668,44 @@ class TitleEditor(Loggable):
self.pangobuffer.apply_tag_to_selection(tag)
def _markupToggleCb(self, markup_button):
+ # FIXME: either make this feature rock-solid or replace it by a
+ # Clear markup" button. Currently it is possible for the user to create
+ # invalid markup (causing errors) or to get our textbuffer confused
self.textbuffer.disconnect_by_func(self._updateSourceText)
self.pangobuffer.disconnect_by_func(self._updateSourceText)
if markup_button.get_active():
- for name in self.bt:
- self.bt[name].set_sensitive(False)
self.textbuffer.set_text(self.pangobuffer.get_text())
self.textarea.set_buffer(self.textbuffer)
+ for name in self.bt:
+ self.bt[name].set_sensitive(False)
else:
+ txt = self.textbuffer.get_text(self.textbuffer.get_start_iter(),
+ self.textbuffer.get_end_iter(), True)
+ self.pangobuffer.set_text(txt)
+ self.textarea.set_buffer(self.pangobuffer)
for name in self.bt:
self.bt[name].set_sensitive(True)
- self.pangobuffer.set_text(
- self.textbuffer.get_text(self.textbuffer.get_start_iter(),
- self.textbuffer.get_end_iter(), True))
- self.textarea.set_buffer(self.pangobuffer)
+
self.textbuffer.connect("changed", self._updateSourceText)
self.pangobuffer.connect("changed", self._updateSourceText)
- def set_sensitive(self, sensitive):
- if sensitive:
- self.infobar.hide()
- self.textarea.show()
- self.editing_box.show()
- else:
- self.infobar.show()
- self.textarea.hide()
- self.editing_box.hide()
+ def _activate(self):
+ """
+ Show the title editing UI widgets and hide the infobar
+ """
+ self.infobar.hide()
+ self.textarea.show()
+ self.editing_box.show()
+ self._connect_signals()
- self.preview(sensitive)
+ def _deactivate(self):
+ """
+ Reset the title editor interface to its default look
+ """
+ self.infobar.show()
+ self.textarea.hide()
+ self.editing_box.hide()
+ self._disconnect_signals()
def _updateFromSource(self):
if self.source is not None:
@@ -736,26 +738,30 @@ class TitleEditor(Loggable):
text = self.pangobuffer.get_text()
self.log("Source text updated to %s", text)
self.source.set_text(text)
- self.preview()
+ self.seeker.flush()
def _updateSource(self, updated_obj):
- if self.source is not None:
- for name, obj in self.settings.items():
- if obj == updated_obj:
- if name == "valignment":
- self.source.set_valignment(getattr(GES.TextVAlign, obj.get_active_id().upper()))
- self.settings["ypos"].set_visible(obj.get_active_id() == "position")
- elif name == "halignment":
- self.source.set_halignment(getattr(GES.TextHAlign, obj.get_active_id().upper()))
- self.settings["xpos"].set_visible(obj.get_active_id() == "position")
- elif name == "xpos":
- self.settings["halignment"].set_active_id("position")
- self.source.set_xpos(obj.get_value())
- elif name == "ypos":
- self.settings["valignment"].set_active_id("position")
- self.source.set_ypos(obj.get_value())
- self.preview()
- return
+ """
+ Handle changes in one of the advanced property widgets at the bottom
+ """
+ if self.source is None:
+ return
+ for name, obj in self.settings.items():
+ if obj == updated_obj:
+ if name == "valignment":
+ self.source.set_valignment(getattr(GES.TextVAlign, obj.get_active_id().upper()))
+ self.settings["ypos"].set_visible(obj.get_active_id() == "position")
+ elif name == "halignment":
+ self.source.set_halignment(getattr(GES.TextHAlign, obj.get_active_id().upper()))
+ self.settings["xpos"].set_visible(obj.get_active_id() == "position")
+ elif name == "xpos":
+ self.settings["halignment"].set_active_id("position")
+ self.source.set_xpos(obj.get_value())
+ elif name == "ypos":
+ self.settings["valignment"].set_active_id("position")
+ self.source.set_ypos(obj.get_value())
+ self.seeker.flush()
+ return
def _reset(self):
#TODO: reset not only text
@@ -766,18 +772,27 @@ class TitleEditor(Loggable):
self._markupToggleCb(self.markup_button)
def set_source(self, source, created=False):
+ """
+ Set the GESTimelineTitleSource to be used with the title editor.
+ This can be called either from the title editor in _createCb, or by
+ track.py to set the source to None.
+ """
self.debug("Source set to %s", str(source))
- self.source = None
+ self.source = source
self._reset()
self.created = created
+ # We can't just assert source is not None... because track.py may ask us
+ # to reset the source to None
if source is None:
- self.set_sensitive(False)
+ self._deactivate()
else:
- self.source = source
self._updateFromSource()
- self.set_sensitive(True)
+ self._activate()
def _createCb(self, unused_button):
+ """
+ The user clicked the "Create and insert" button, initialize the UI
+ """
source = GES.TimelineTitleSource()
source.set_text("")
source.set_duration(long(Gst.SECOND * 5))
@@ -789,22 +804,20 @@ class TitleEditor(Loggable):
#After insertion consider as not created
self.created = False
- def preview(self, show=True):
- if not show:
- #Disconect
- if self._drag_connected:
- self.app.gui.viewer.target.disconnect_by_func(self.drag_notify_event)
- self.app.gui.viewer.target.disconnect_by_func(self.drag_press_event)
- self.app.gui.viewer.target.disconnect_by_func(self.drag_release_event)
- self._drag_connected = False
- elif self.source is not None and not self.created:
- self.seeker.flush()
- if not self._drag_connected and self._tab_opened:
- #If source is in timeline and title tab opened enable title drag
- self._drag_connected = True
- self.app.gui.viewer.target.connect("motion-notify-event", self.drag_notify_event)
- self.app.gui.viewer.target.connect("button-press-event", self.drag_press_event)
- self.app.gui.viewer.target.connect("button-release-event", self.drag_release_event)
+ def _connect_signals(self):
+ if not self._signals_connected:
+ self.app.gui.viewer.target.connect("motion-notify-event", self.drag_notify_event)
+ self.app.gui.viewer.target.connect("button-press-event", self.drag_press_event)
+ self.app.gui.viewer.target.connect("button-release-event", self.drag_release_event)
+ self._signals_connected = True
+
+ def _disconnect_signals(self):
+ if not self._signals_connected:
+ return
+ self.app.gui.viewer.target.disconnect_by_func(self.drag_notify_event)
+ self.app.gui.viewer.target.disconnect_by_func(self.drag_press_event)
+ self.app.gui.viewer.target.disconnect_by_func(self.drag_release_event)
+ self._signals_connected = False
def drag_press_event(self, widget, event):
if event.button == 1:
@@ -813,9 +826,9 @@ class TitleEditor(Loggable):
self.timeout = GObject.timeout_add(100, self.drag_update_event)
#If drag goes out for 0.3 second, and do not come back, consider drag end
self._drag_updated = True
- self.timeout = GObject.timeout_add(1000, self.drag_posible_end_event)
+ self.timeout = GObject.timeout_add(1000, self.drag_possible_end_event)
- def drag_posible_end_event(self):
+ def drag_possible_end_event(self):
if self._drag_updated:
#Updated during last timeout, wait more
self._drag_updated = False
@@ -856,8 +869,6 @@ class TitleEditor(Loggable):
def tab_switched(self, unused_notebook, arg1, arg2):
if arg2 == 2:
- self._tab_opened = True
- self.preview(True)
+ self._connect_signals()
else:
- self._tab_opened = False
- self.preview(False)
+ self._disconnect_signals()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]