We truncated the diff of some files because they were too big.
If you want to see the full diff for every file, click here.
Changes of Revision 4
flowblade.changes
Changed
x
1
2
-------------------------------------------------------------------
3
+Thu Jan 12 16:55:58 UTC 2017 - avvissu@yandex.by
4
+
5
+- Update to 1.10:
6
+ * see /usr/share/docpackages/flowblade/RELEASE_NOTES
7
+- Check list of dependencies
8
+
9
+-------------------------------------------------------------------
10
Sat Oct 22 17:36:13 UTC 2016 - avvissu@yandex.by
11
12
- Update to 1.8:
13
flowblade.spec
Changed
62
1
2
3
%define prjname Flowblade
4
Name: flowblade
5
-Version: 1.8
6
+Version: 1.10
7
Release: 0
8
Summary: Multitrack non-linear video editor
9
License: GPL-3.0
10
11
BuildRequires: shared-mime-info
12
BuildRequires: fdupes
13
BuildRequires: frei0r-plugins >= 1.4
14
+# Check list of dependencies:
15
+BuildRequires: pkgconfig(cairomm-1.0)
16
+BuildRequires: pkgconfig(librsvg-2.0)
17
+BuildRequires: libmlt6-modules
18
+BuildRequires: dbus-1-python
19
+BuildRequires: python-cairo
20
+BuildRequires: python-gnomevfs
21
+BuildRequires: python-gobject
22
+BuildRequires: python-imaging
23
+BuildRequires: python-mlt
24
+BuildRequires: python-numpy
25
Requires: dbus-1-python
26
Requires: ffmpeg
27
Requires: frei0r-plugins >= 1.4
28
Requires: ladspa
29
Requires: ladspa-swh-plugins
30
-Requires: libcairomm-1_0-1
31
Requires: libmlt6-modules
32
-Requires: librsvg-2-2
33
Requires: python-cairo
34
Requires: python-gnomevfs
35
Requires: python-gobject
36
37
Requires: python-mlt
38
Requires: python-numpy
39
Requires: sox
40
+Requires: %(rpm -qf $(readlink -qne %{_libdir}/libcairomm-1.0.so) --qf '%{NAME} >= %{VERSION}')
41
+Requires: %(rpm -qf $(readlink -qne %{_libdir}/librsvg-2.so) --qf '%{NAME} >= %{VERSION}')
42
BuildRoot: %{_tmppath}/%{name}-%{version}-build
43
BuildArch: noarch
44
45
46
rm -rf %{buildroot}%{_libexecdir}/mime/packages/%{name}
47
48
%fdupes -s %{buildroot}%{python_sitelib}
49
-
50
%find_lang %{name} %{name}.lang
51
52
%post
53
54
%doc AUTHORS COPYING README docs/RELEASE_NOTES*
55
%attr(0755,root,root) %{_bindir}/%{name}
56
%{_datadir}/applications/%{name}.desktop
57
-%{_mandir}/man1/%{name}.1*
58
+%{_mandir}/man?/%{name}.?%{ext_info}
59
%{_datadir}/pixmaps/%{name}.png
60
%{_datadir}/mime/packages/%{name}.xml
61
%{python_sitelib}/%{prjname}
62
flowblade-1.8.tar.gz/README.md -> flowblade-1.10.tar.gz/README.md
Changed
10
1
2
3

4
5
-**NEW VERSION 1.8 AVAILABLE. Go to [release notes](./flowblade-trunk/docs/RELEASE_NOTES.md) to see what's new. Installing information available [here](./flowblade-trunk/docs/INSTALLING.md).**
6
-
7
**Contents:**
8
1. [Introduction](https://github.com/jliljebl/flowblade#introduction)
9
1. [Features](https://github.com/jliljebl/flowblade#features)
10
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/app.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/app.py
Changed
158
1
2
import mlttransitions
3
import movemodes
4
import persistance
5
-import phantomcompositor
6
import positionbar
7
import preferenceswindow
8
import projectaction
9
10
import snapping
11
import titler
12
import tlinewidgets
13
+import toolsintegration
14
+import toolnatron
15
import trimmodes
16
import translations
17
import undo
18
19
os.mkdir(utils.get_hidden_screenshot_dir_path())
20
if not os.path.exists(user_dir + appconsts.GMIC_DIR):
21
os.mkdir(user_dir + appconsts.GMIC_DIR)
22
- """ This may be added back later
23
- if not os.path.exists(user_dir + appconsts.NODE_COMPOSITORS_DIR):
24
- os.mkdir(user_dir + appconsts.NODE_COMPOSITORS_DIR)
25
- if not os.path.exists(user_dir + appconsts.NODE_COMPOSITORS_DIR + "/" + appconsts.PHANTOM_DISK_CACHE_DIR):
26
- os.mkdir(user_dir + appconsts.NODE_COMPOSITORS_DIR + "/" + appconsts.PHANTOM_DISK_CACHE_DIR)
27
- """
28
+ if not os.path.exists(user_dir + appconsts.MATCH_FRAME_DIR):
29
+ os.mkdir(user_dir + appconsts.MATCH_FRAME_DIR)
30
+ if not os.path.exists(user_dir + appconsts.TRIM_VIEW_DIR):
31
+ os.mkdir(user_dir + appconsts.TRIM_VIEW_DIR)
32
+ if not os.path.exists(user_dir + appconsts.NATRON_DIR):
33
+ os.mkdir(user_dir + appconsts.NATRON_DIR)
34
35
# Set paths.
36
respaths.set_paths(root_path)
37
38
editorstate.SCREEN_WIDTH = scr_w
39
editorstate.SCREEN_HEIGHT = scr_h
40
41
+ print scr_w, scr_h
42
print "Small height:", editorstate.screen_size_small_height()
43
print "Small width:", editorstate.screen_size_small_width()
44
45
46
# Audiomonitoring being available needs to be known before GUI creation
47
audiomonitoring.init(editorstate.project.profile)
48
49
- # Check for tools
50
+ # Set trim view mode to current default value
51
+ editorstate.show_trim_view = editorpersistance.prefs.trim_view_default
52
+
53
+ # Check for tools and init tools integration
54
gmic.test_availablity()
55
- #phantomcompositor.test_availablity()
56
+ toolnatron.init()
57
+ toolsintegration.init()
58
59
# Create player object
60
create_player()
61
62
updater.set_clip_edit_mode_callback = editevent.set_clip_monitor_edit_mode
63
updater.load_icons()
64
65
+ # Notebook indexes are differn for 1 and 2 window layouts
66
+ if editorpersistance.prefs.global_layout != appconsts.SINGLE_WINDOW:
67
+ medialog.range_log_notebook_index = 0
68
+ compositeeditor.compositor_notebook_index = 2
69
+ clipeffectseditor.filters_notebook_index = 1
70
+
71
# Create window and all child components
72
editor_window = editorwindow.EditorWindow()
73
74
75
76
# Connect window global key listener
77
gui.editor_window.window.connect("key-press-event", keyevents.key_down)
78
-
79
+ if editorpersistance.prefs.global_layout != appconsts.SINGLE_WINDOW:
80
+ gui.editor_window.window2.connect("key-press-event", keyevents.key_down)
81
+
82
# Give undo a reference to uimanager for menuitem state changes
83
undo.set_menu_items(gui.editor_window.uimanager)
84
85
86
loaded_autosave_file = None
87
88
editorstate.update_current_proxy_paths()
89
+ editorstate.fade_length = -1
90
+ editorstate.transition_length = -1
91
+ editorstate.clear_trim_clip_cache()
92
audiomonitoring.init_for_project_load()
93
updater.window_resized()
94
95
96
gui.editor_window.window.handler_unblock(window_state_id)
97
start_autosave()
98
99
+ if new_project.update_media_lengths_on_load == True:
100
+ projectaction.update_media_lengths()
101
+
102
#editorstate.project.c_seq.print_all()
103
104
def change_current_sequence(index):
105
106
107
if editorstate.screen_size_small_height() == True:
108
appconsts.TOP_ROW_HEIGHT = 10
109
+ projectinfogui.PROJECT_INFO_PANEL_HEIGHT = 140
110
+
111
+ if editorstate.SCREEN_WIDTH < 1153 and editorstate.SCREEN_HEIGHT < 865:
112
+ editorwindow.MONITOR_AREA_WIDTH = 400
113
+ positionbar.BAR_WIDTH = 100
114
115
def _too_small_screen_exit():
116
global exit_timeout_id
117
118
return True # Signal that event is handled, otherwise it'll destroy window anyway
119
120
def get_save_time_msg():
121
- if projectaction.save_time == None:
122
- return _("Project has not been saved since it was opened.")
123
-
124
- save_ago = (time.clock() - projectaction.save_time) / 60.0
125
-
126
- if save_ago < 1:
127
- return _("Project was saved less than a minute ago.")
128
-
129
- if save_ago < 2:
130
- return _("Project was saved one minute ago.")
131
-
132
- return _("Project was saved ") + str(int(save_ago)) + _(" minutes ago.")
133
+ return projectaction.get_save_time_msg()
134
135
def _shutdown_dialog_callback(dialog, response_id):
136
dialog.destroy()
137
138
alloc = gui.editor_window.window.get_allocation()
139
x, y, w, h = alloc.x, alloc.y, alloc.width, alloc.height
140
editorpersistance.prefs.exit_allocation = (w, h)
141
+ if gui.editor_window.window2 != None:
142
+ alloc = gui.editor_window.window2.get_allocation()
143
+ pos_x, pos_y = gui.editor_window.window2.get_position()
144
+ editorpersistance.prefs.exit_allocation_window_2 = (alloc.width, alloc.height, pos_x, pos_y)
145
editorpersistance.prefs.app_v_paned_position = gui.editor_window.app_v_paned.get_position()
146
editorpersistance.prefs.top_paned_position = gui.editor_window.top_paned.get_position()
147
editorpersistance.prefs.mm_paned_position = gui.editor_window.mm_paned.get_position()
148
149
# Block reconnecting consumer before setting window not visible
150
updater.player_refresh_enabled = False
151
gui.editor_window.window.set_visible(False)
152
+ if gui.editor_window.window2 != None:
153
+ gui.editor_window.window2.set_visible(False)
154
+
155
# Close and destroy app when gtk finds time to do it after hiding window
156
GLib.idle_add(_app_destroy)
157
158
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/appconsts.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/appconsts.py
Changed
40
1
2
EXTRA_EDITOR = "extraeditor"
3
4
# Available tracks configurations for flowblade
5
-TRACK_CONFIGURATIONS = [(5,4),(4,3),(3,2),(2,1),(8,1),(1,8)]
6
+TRACK_CONFIGURATIONS = [(5,4),(4,3),(3,2),(2,1),(7,2),(2,7),(8,1),(1,8)]
7
8
# Thumbnail image dimensions
9
THUMB_WIDTH = 116
10
11
GMIC_DIR = "gmic"
12
NODE_COMPOSITORS_DIR = "node_compositors"
13
PHANTOM_DISK_CACHE_DIR = "phantom_disk_cache"
14
+MATCH_FRAME_DIR = "match_frame"
15
+MATCH_FRAME = MATCH_FRAME_DIR + "/match_frame.png"
16
+MATCH_FRAME_NEW = MATCH_FRAME_DIR + "/match_frame_new.png"
17
+TRIM_VIEW_DIR = "trim_view"
18
+NATRON_DIR = "natron"
19
20
# Luma bands
21
SHADOWS = 0
22
23
LOAD_RELATIVE_FIRST = 1
24
LOAD_ABSOLUTE_ONLY = 2
25
26
+# Trim view modes
27
+TRIM_VIEW_ON = 0
28
+TRIM_VIEW_SINGLE = 1
29
+TRIM_VIEW_OFF = 2
30
+
31
+# MIdbar layout
32
+MIDBAR_TC_LEFT = 0
33
+MIDBAR_TC_CENTER = 1
34
+MIDBAR_COMPONENTS_CENTERED = 2
35
+
36
+# Windows mode
37
+SINGLE_WINDOW = 1
38
+TWO_WINDOWS = 2
39
40
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/audiomonitoring.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/audiomonitoring.py
Changed
54
1
2
DASHES = [DASH_INK, DASH_SKIP, DASH_INK, DASH_SKIP]
3
4
METER_LIGHTS = 143 #57
5
-#METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP
6
METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP
7
METER_WIDTH = 10
8
9
10
MONITORING_AVAILABLE = False
11
editorstate.audio_monitoring_available = False
12
13
- global CONTROL_SLOT_H, METER_SLOT_H
14
+ global CONTROL_SLOT_H, METER_SLOT_H, METER_LIGHTS, METER_HEIGHT
15
if editorstate.screen_size_small_height() == True:
16
- METER_SLOT_H = 400
17
- CONTROL_SLOT_H = 220
18
-
19
+ if editorstate.SCREEN_HEIGHT > 898:
20
+ METER_SLOT_H = 400
21
+ CONTROL_SLOT_H = 240
22
+ METER_LIGHTS = 123
23
+ METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP
24
+ else:
25
+ METER_SLOT_H = 275
26
+ CONTROL_SLOT_H = 240
27
+ METER_LIGHTS = 82
28
+ METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP
29
+
30
# We want this to be always present when closing app or we'll need to handle it being missing.
31
global _update_ticker
32
_update_ticker = utils.Ticker(_audio_monitor_update, 0.04)
33
34
else:
35
name = utils.get_track_name(seq.tracks[i], seq)
36
gain = GainControl(name, seq, seq.tracks[i])
37
- #if i == 0:
38
- # tmp = gain # for bg color ?
39
- # gain = Gtk.EventBox() # for bg color ?
40
- # gain.add(tmp) # for bg color ?
41
+
42
self.gain_controls.append(gain)
43
gain_control_area.pack_start(gain, False, False, 0)
44
45
46
def __init__(self, name, seq, producer, is_master=False):
47
GObject.GObject.__init__(self)
48
49
-
50
-
51
self.seq = seq
52
self.producer = producer
53
self.is_master = is_master
54
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/clipeffectseditor.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/clipeffectseditor.py
Changed
135
1
2
"""
3
4
5
-
6
+from gi.repository import GLib
7
from gi.repository import Gtk
8
-
9
+import time
10
11
import dnd
12
import edit
13
14
# Used to update kfeditors with external tline frame position changes
15
keyframe_editor_widgets = []
16
17
+# Filter stack DND requires some state info to be maintained to make sure that it's only done when certain events
18
+# happen in a certain sequence.
19
+NOT_ON = 0
20
+MOUSE_PRESS_DONE = 1
21
+INSERT_DONE = 2
22
+stack_dnd_state = NOT_ON
23
+stack_dnd_event_time = 0.0
24
+stack_dnd_event_info = None
25
+
26
+filters_notebook_index = 2
27
28
def get_clip_effects_editor_panel(group_combo_box, effects_list_view):
29
"""
30
31
set_enabled(True)
32
update_stack_view()
33
effect_selection_changed() # This may get called twice
34
- gui.middle_notebook.set_current_page(2) # 2 == index of clipeditor page in notebook
35
+ gui.middle_notebook.set_current_page(filters_notebook_index) # 2 == index of clipeditor page in notebook
36
37
def clip_removed_during_edit(removed_clip):
38
"""
39
40
41
def _filter_stack_menu_item_selected(widget, data):
42
item_id, row, treeview = data
43
- # Toggle filter active state
44
+
45
if item_id == "toggle":
46
toggle_filter_active(row)
47
if item_id == "reset":
48
reset_filter_values()
49
-
50
+ if item_id == "moveup":
51
+ delete_row = row
52
+ insert_row = row + 2
53
+ if insert_row > len(clip.filters):
54
+ insert_row = len(clip.filters)
55
+ do_stack_move(insert_row, delete_row)
56
+ if item_id == "movedown":
57
+ delete_row = row + 1
58
+ insert_row = row - 1
59
+ if insert_row < 0:
60
+ insert_row = 0
61
+ do_stack_move(insert_row, delete_row)
62
+
63
def _quit_editing_clip_clicked(): # this is a button callback
64
clear_clip()
65
66
67
widgets.exit_button.connect("clicked", lambda w: _quit_editing_clip_clicked())
68
widgets.exit_button.set_tooltip_text(_("Quit editing Clip in editor"))
69
70
- widgets.effect_stack_view = guicomponents.FilterSwitchListView(lambda ts: effect_selection_changed(), toggle_filter_active)
71
- dnd.connect_stack_treeview(widgets.effect_stack_view)
72
+ widgets.effect_stack_view = guicomponents.FilterSwitchListView(lambda ts: effect_selection_changed(),
73
+ toggle_filter_active, dnd_row_deleted, dnd_row_inserted)
74
+
75
+ widgets.effect_stack_view.treeview.connect("button-press-event", lambda w,e, wtf: stack_view_pressed(), None)
76
gui.effect_stack_list_view = widgets.effect_stack_view
77
78
widgets.value_edit_box = Gtk.VBox()
79
80
filter_object.update_mlt_disabled_value()
81
if update_stack_view == True:
82
update_stack_view_changed_blocked()
83
+
84
+def dnd_row_deleted(model, path):
85
+ now = time.time()
86
+ global stack_dnd_state, stack_dnd_event_time, stack_dnd_event_info
87
+ if stack_dnd_state == INSERT_DONE:
88
+ if (now - stack_dnd_event_time) < 0.1:
89
+ stack_dnd_state = NOT_ON
90
+ insert_row = int(stack_dnd_event_info)
91
+ delete_row = int(path.to_string())
92
+ stack_dnd_event_info = (insert_row, delete_row)
93
+ # Because of dnd is gtk thing for some internal reason it needs to complete before we go on
94
+ # touching storemodel again with .clear() or it dies in gtktreeviewaccessible.c
95
+ GLib.idle_add(do_dnd_stack_move)
96
+ else:
97
+ stack_dnd_state = NOT_ON
98
+ else:
99
+ stack_dnd_state = NOT_ON
100
+
101
+def dnd_row_inserted(model, path, tree_iter):
102
+ global stack_dnd_state, stack_dnd_event_time, stack_dnd_event_info
103
+ if stack_dnd_state == MOUSE_PRESS_DONE:
104
+ stack_dnd_state = INSERT_DONE
105
+ stack_dnd_event_time = time.time()
106
+ stack_dnd_event_info = path.to_string()
107
+ else:
108
+ stack_dnd_state = NOT_ON
109
+
110
+def do_dnd_stack_move():
111
+ insert, delete_row = stack_dnd_event_info
112
+ do_stack_move(insert, delete_row)
113
+
114
+def do_stack_move(insert_row, delete_row):
115
+ if abs(insert_row - delete_row) < 2: # filter was dropped on its previous place or cannot moved further up or down
116
+ return
117
+
118
+ # The insert insert_row and delete_row values are rows we get when listening
119
+ # "row-deleted" and "row-inserted" events after setting treeview "reorderable"
120
+ # Dnd is detected by order and timing of these events together with mouse press event
121
+ data = {"clip":clip,
122
+ "insert_index":insert_row,
123
+ "delete_index":delete_row,
124
+ "filter_edit_done_func":filter_edit_done}
125
+ action = edit.move_filter_action(data)
126
+ action.do_edit()
127
128
+def stack_view_pressed():
129
+ global stack_dnd_state
130
+ stack_dnd_state = MOUSE_PRESS_DONE
131
+
132
def effect_selection_changed():
133
global keyframe_editor_widgets
134
135
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/clipmenuaction.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/clipmenuaction.py
Changed
138
1
2
3
from PIL import Image
4
5
+from gi.repository import GLib
6
from gi.repository import Gtk
7
8
+import mlt
9
+import os
10
+import shutil
11
+import time
12
+
13
import audiowaveform
14
import appconsts
15
import clipeffectseditor
16
17
import updater
18
import utils
19
20
+_match_frame_writer = None
21
+
22
# ---------------------------------- clip menu
23
def display_clip_menu(y, event, frame):
24
# See if we actually hit a clip
25
26
clip, track, item_id, item_data = data
27
clear_filters()
28
29
+def _select_all_after(data):
30
+ clip, track, item_id, item_data = data
31
+ movemodes._select_multiple_clips(track.id, track.clips.index(clip), len(track.clips) - 1)
32
+ updater.repaint_tline()
33
+
34
+def _select_all_before(data):
35
+ clip, track, item_id, item_data = data
36
+ movemodes._select_multiple_clips(track.id, 0, track.clips.index(clip))
37
+ updater.repaint_tline()
38
+
39
+def _match_frame_start(data):
40
+ clip, track, item_id, item_data = data
41
+ _set_match_frame(clip, clip.clip_in, track, True)
42
+
43
+def _match_frame_end(data):
44
+ clip, track, item_id, item_data = data
45
+ _set_match_frame(clip, clip.clip_out, track, False)
46
+
47
+def _match_frame_start_monitor(data):
48
+ clip, track, item_id, item_data = data
49
+ gui.monitor_widget.set_frame_match_view(clip, clip.clip_in)
50
+
51
+def _match_frame_end_monitor(data):
52
+ clip, track, item_id, item_data = data
53
+ gui.monitor_widget.set_frame_match_view(clip, clip.clip_out)
54
+
55
+def _set_match_frame(clip, frame, track, display_on_right):
56
+ global _match_frame_writer
57
+ _match_frame_writer = MatchFrameWriter(clip, frame, track, display_on_right)
58
+
59
+ GLib.idle_add(_write_match_frame)
60
+
61
+def _write_match_frame():
62
+ _match_frame_writer.write_image()
63
+
64
+def _match_frame_close(data):
65
+ tlinewidgets.set_match_frame(-1, -1, True)
66
+ gui.monitor_widget.set_default_view_force()
67
+ updater.repaint_tline()
68
+
69
+class MatchFrameWriter:
70
+ def __init__(self, clip, clip_frame, track, display_on_right):
71
+ self.clip = clip
72
+ self.clip_frame = clip_frame
73
+ self.track = track
74
+ self.display_on_right = display_on_right
75
+
76
+ def write_image(self):
77
+ """
78
+ Writes thumbnail image from file producer
79
+ """
80
+ clip_path = self.clip.path
81
+
82
+ # Create consumer
83
+ matchframe_new_path = utils.get_hidden_user_dir_path() + appconsts.MATCH_FRAME_NEW
84
+ consumer = mlt.Consumer(PROJECT().profile, "avformat", matchframe_new_path)
85
+ consumer.set("real_time", 0)
86
+ consumer.set("vcodec", "png")
87
+
88
+ # Create one frame producer
89
+ producer = mlt.Producer(PROJECT().profile, str(clip_path))
90
+ producer = producer.cut(int(self.clip_frame), int(self.clip_frame))
91
+
92
+ # Delete new match frame
93
+ try:
94
+ os.remove(matchframe_new_path)
95
+ except:
96
+ # This fails when done first time ever
97
+ pass
98
+
99
+ # Connect and write image
100
+ consumer.connect(producer)
101
+ consumer.run()
102
+
103
+ # Wait until new file exists
104
+ while os.path.isfile(matchframe_new_path) != True:
105
+ time.sleep(0.1)
106
+
107
+ # Copy to match frame
108
+ matchframe_path = utils.get_hidden_user_dir_path() + appconsts.MATCH_FRAME
109
+ shutil.copyfile(matchframe_new_path, matchframe_path)
110
+
111
+ # Update timeline data
112
+ # Get frame of clip.clip_in_in on timeline.
113
+ clip_index = self.track.clips.index(self.clip)
114
+ clip_start_in_tline = self.track.clip_start(clip_index)
115
+ tline_match_frame = clip_start_in_tline + (self.clip_frame - self.clip.clip_in)
116
+ tlinewidgets.set_match_frame(tline_match_frame, self.track.id, self.display_on_right)
117
+
118
+ # Update view
119
+ updater.repaint_tline()
120
+
121
+
122
# Functions to handle popup menu selections for strings
123
# set as activation messages in guicomponents.py
124
# activation_message -> _handler_func
125
126
"cover_with_next": _cover_blank_from_next,
127
"clone_filters_from_next": _clone_filters_from_next,
128
"clone_filters_from_prev": _clone_filters_from_prev,
129
- "clear_filters": _clear_filters}
130
+ "clear_filters": _clear_filters,
131
+ "match_frame_close":_match_frame_close,
132
+ "match_frame_start":_match_frame_start,
133
+ "match_frame_end":_match_frame_end,
134
+ "match_frame_start_monitor":_match_frame_start_monitor,
135
+ "match_frame_end_monitor":_match_frame_end_monitor,
136
+ "select_all_after": _select_all_after,
137
+ "select_all_before":_select_all_before}
138
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/compositeeditor.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/compositeeditor.py
Changed
24
1
2
# Used to update kfeditors with external tline frame position changes
3
keyframe_editor_widgets = []
4
5
+compositor_notebook_index = 3 # this is set 2 for 2 window mode
6
+
7
def create_widgets():
8
"""
9
Widgets for editing compositing properties.
10
11
12
set_enabled(True)
13
_display_compositor_edit_box()
14
- # ????? this is not used
15
+
16
if editorpersistance.prefs.default_layout == True:
17
- gui.middle_notebook.set_current_page(3)
18
- else:
19
- gui.editor_window.right_notebook.set_current_page(2)
20
+ gui.middle_notebook.set_current_page(compositor_notebook_index)
21
22
def clear_compositor():
23
global compositor
24
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/dialogs.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/dialogs.py
Changed
110
1
2
os.path.expanduser("~") + _("\' as render clips folder"),
3
gui.editor_window.window)
4
5
-def exit_confirm_dialog(callback, msg, parent_window, project_name):
6
+def exit_confirm_dialog(callback, msg, parent_window, project_name, data=None):
7
title = _("Save project '") + project_name + _("' before exiting?")
8
content = dialogutils.get_warning_message_dialog_panel(title, msg, False, Gtk.STOCK_QUIT)
9
10
11
dialog.vbox.pack_start(alignment, True, True, 0)
12
dialogutils.set_outer_margins(dialog.vbox)
13
_default_behaviour(dialog)
14
- dialog.connect('response', callback)
15
+ if data == None:
16
+ dialog.connect('response', callback)
17
+ else:
18
+ dialog.connect('response', callback, data)
19
dialog.show_all()
20
21
def close_confirm_dialog(callback, msg, parent_window, project_name):
22
23
24
img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "flowbladeappicon.png")
25
flow_label = Gtk.Label(label="Flowblade Movie Editor")
26
- ver_label = Gtk.Label(label="1.8.0")
27
+ ver_label = Gtk.Label(label="1.10.0")
28
janne_label = Gtk.Label(label="Copyright 2016 Janne Liljeblad and contributors")
29
page_label = Gtk.Label(label="Project page: https://github.com/jliljebl/flowblade")
30
flow_label.modify_font(Pango.FontDescription("sans bold 14"))
31
32
_default_behaviour(dialog)
33
dialog.connect('response', _dialog_destroy)
34
dialog.show_all()
35
-
36
+
37
def _dialog_destroy(dialog, response):
38
dialog.destroy()
39
40
41
return dialog
42
43
def recreate_icons_progress_dialog():
44
+ return _text_info_prograss_dialog(_("Recreating icons"))
45
+
46
+def update_media_lengths_progress_dialog():
47
+ return _text_info_prograss_dialog(_("Update media lengths data"))
48
+
49
+def _text_info_prograss_dialog(title):
50
dialog = Gtk.Window(Gtk.WindowType.TOPLEVEL)
51
- dialog.set_title(_("Recreating icons"))
52
+ dialog.set_title(title)
53
54
info_label = Gtk.Label(label="")
55
status_box = Gtk.HBox(False, 2)
56
57
dialog.set_position(Gtk.WindowPosition.CENTER)
58
dialog.show_all()
59
60
+ dialog.set_keep_above(True) # Perhaps configurable later
61
+
62
# Make refs available for updates
63
dialog.progress_bar = progress_bar
64
dialog.info = info_label
65
66
geom_vbox.pack_start(_get_kb_row(_("Right Arrow"), _("Move Source Video Right")), False, False, 0)
67
geom_vbox.pack_start(_get_kb_row(_("Up Arrow"), _("Move Source Video Up")), False, False, 0)
68
geom_vbox.pack_start(_get_kb_row(_("Down Arrow"), _("Move Source Video Down")), False, False, 0)
69
+ geom_vbox.pack_start(_get_kb_row(_("Shift"), _("Snap to X or Y of drag start point")), False, False, 0)
70
geom = guiutils.get_named_frame(_("Geometry Editor"), geom_vbox)
71
72
panel = Gtk.VBox()
73
74
75
def watermark_dialog(add_callback, remove_callback):
76
dialog = Gtk.Dialog(_("Sequence Watermark"), gui.editor_window.window,
77
- Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
78
+ Gtk.DialogFlags.DESTROY_WITH_PARENT,
79
(_("Close").encode('utf-8'), Gtk.ResponseType.CLOSE))
80
81
seq_label = guiutils.bold_label(_("Sequence:") + " ")
82
83
dialog.show_all()
84
85
def watermark_file_dialog(callback, parent, widgets):
86
- dialog = Gtk.FileChooserDialog(_("Select Watermark File"), gui.editor_window.window,
87
+ dialog = Gtk.FileChooserDialog(_("Select Watermark File"), None,
88
Gtk.FileChooserAction.OPEN,
89
(_("Cancel").encode('utf-8'), Gtk.ResponseType.CANCEL,
90
_("OK").encode('utf-8'), Gtk.ResponseType.ACCEPT))
91
92
dialog.connect('response', callback, widgets)
93
dialog.show()
94
95
-def media_file_dialog(text, callback, multiple_select, data=None, parent=None):
96
+def media_file_dialog(text, callback, multiple_select, data=None, parent=None, open_dir=None):
97
if parent == None:
98
parent = gui.editor_window.window
99
100
101
and (editorpersistance.prefs.last_opened_media_dir != None)):
102
file_select.set_current_folder(editorpersistance.prefs.last_opened_media_dir)
103
104
+ if open_dir != None:
105
+ file_select.set_current_folder(open_dir)
106
+
107
if data == None:
108
file_select.connect('response', callback)
109
else:
110
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/dnd.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/dnd.py
Changed
50
1
2
3
MEDIA_FILES_DND_TARGET = Gtk.TargetEntry.new('media_file', Gtk.TargetFlags.SAME_APP, 0)
4
EFFECTS_DND_TARGET = Gtk.TargetEntry.new('effect', Gtk.TargetFlags.SAME_APP, 0)
5
+#EFFECTS_STACK_DND_TARGET = Gtk.TargetEntry.new('effectstack', Gtk.TargetFlags.SAME_APP, 0)
6
CLIPS_DND_TARGET = Gtk.TargetEntry.new('clip', Gtk.TargetFlags.SAME_APP, 0)
7
RANGE_DND_TARGET = Gtk.TargetEntry.new('range', Gtk.TargetFlags.SAME_APP, 0)
8
9
10
[EFFECTS_DND_TARGET],
11
Gdk.DragAction.COPY)
12
tree_view.connect("drag_data_get", _effects_drag_data_get)
13
-
14
+
15
def connect_video_monitor(widget):
16
widget.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.DROP,
17
[MEDIA_FILES_DND_TARGET],
18
19
Gdk.DragAction.COPY)
20
widget.drag_source_set_icon_pixbuf(clip_icon)
21
22
-def connect_stack_treeview(widget):
23
- widget.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.DROP,
24
- [EFFECTS_DND_TARGET],
25
- Gdk.DragAction.COPY)
26
-
27
- widget.connect("drag_drop", _on_effect_stack_drop)
28
-
29
def connect_tline(widget, do_effect_drop_func, do_media_drop_func):
30
widget.drag_dest_set(Gtk.DestDefaults.MOTION | Gtk.DestDefaults.DROP,
31
[MEDIA_FILES_DND_TARGET, EFFECTS_DND_TARGET, CLIPS_DND_TARGET],
32
33
_save_treeview_selection(treeview)
34
global drag_source
35
drag_source = SOURCE_EFFECTS_TREE
36
-
37
+
38
def _on_monitor_drop(widget, context, x, y, timestamp):
39
context.finish(True, False, timestamp)
40
media_file = drag_data[0].media_file
41
42
for media_object in drag_data:
43
moved_rows.append(media_object.bin_index)
44
move_files_to_bin_func(max(bin_path), moved_rows)
45
-
46
+
47
def _save_treeview_selection(treeview):
48
treeselection = treeview.get_selection()
49
(model, rows) = treeselection.get_selected_rows()
50
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/edit.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/edit.py
Changed
130
1
2
import mltfilters
3
import movemodes
4
import resync
5
+import tlinewidgets
6
import trimmodes
7
import undo
8
import updater
9
10
_remove_trailing_blanks_redo(self)
11
resync.calculate_and_set_child_clip_sync_states()
12
13
+ tlinewidgets.set_match_frame(-1, -1, True)
14
+
15
# HACK, see above.
16
if self.stop_for_edit:
17
PLAYER().consumer.start()
18
19
current_sequence().update_trim_hack_blank_length() # NEEDED FOR TRIM CRASH HACK, REMOVE IF FIXED
20
PLAYER().display_inside_sequence_length(current_sequence().seq_len) # NEEDED FOR TRIM CRASH HACK, REMOVE IF FIXED
21
22
+ updater. update_seqence_info_text()
23
24
# ---------------------------------------------------- SYNC DATA
25
class SyncData:
26
27
28
self.filter_edit_done_func(self.clip, len(self.clip.filters) - 1)# updates effect stack gui
29
30
+#------------------- MOVE FILTER
31
+# "clip",""insert_index","delete_index"","filter_edit_done_func"
32
+# Moves filter in filter stack filter to clip.
33
+def move_filter_action(data):
34
+ action = EditAction(_move_filter_undo,_move_filter_redo, data)
35
+ return action
36
+
37
+def _move_filter_undo(self):
38
+ _detach_all(self.clip)
39
+
40
+ for i in range(0, len(self.filters_orig)):
41
+ self.clip.filters.pop(0)
42
+
43
+ for i in range(0, len(self.filters_orig)):
44
+ self.clip.filters.append(self.filters_orig[i])
45
+
46
+ if self.delete_index < self.insert_index:
47
+ active_index = self.delete_index
48
+ else:
49
+ active_index = self.delete_index - 1
50
+
51
+ _attach_all(self.clip)
52
+
53
+ self.filter_edit_done_func(self.clip, active_index)
54
+
55
+def _move_filter_redo(self):
56
+ _detach_all(self.clip)
57
+
58
+ # Copy filters in original order for undo
59
+ self.filters_orig = []
60
+ for i in range(0, len(self.clip.filters)):
61
+ self.filters_orig.append(self.clip.filters[i])
62
+
63
+ if self.delete_index < self.insert_index:
64
+ # d < i, moved filter can be found at d
65
+ moved_filter = self.clip.filters[self.delete_index]
66
+ _filter_move_insert(self.clip.filters, moved_filter, self.insert_index)
67
+ self.clip.filters.pop(self.delete_index)
68
+ active_index = self.insert_index - 1
69
+ else:
70
+ # d > i, moved filter can be found at d - 1
71
+ moved_filter = self.clip.filters[self.delete_index - 1]
72
+ _filter_move_insert(self.clip.filters, moved_filter, self.insert_index)
73
+ self.clip.filters.pop(self.delete_index)
74
+ active_index = self.insert_index
75
+
76
+ _attach_all(self.clip)
77
+
78
+ self.filter_edit_done_func(self.clip, active_index)
79
+
80
def _detach_all(clip):
81
mltfilters.detach_all_filters(clip)
82
83
def _attach_all(clip):
84
mltfilters.attach_all_filters(clip)
85
86
+def _filter_move_insert(filters_list, f, insert_index):
87
+ try:
88
+ filters_list.insert(insert_index, f)
89
+ except:
90
+ filters_list.append(insert_index, f)
91
+
92
#------------------- REMOVE MULTIPLE FILTERS
93
# "clips"
94
# Adds filter to clip.
95
96
self.turn_on_stop_for_edit = True
97
98
99
+#----------------- RANGE DELETE
100
+# "tracks","mark_in_frame","mark_out_frame"
101
+def range_delete_action(data):
102
+ action = EditAction(_range_delete_undo, _range_delete_redo, data)
103
+ action.stop_for_edit = True
104
+ return action
105
+
106
+def _range_delete_undo(self):
107
+ for i in range(0, len(self.tracks)): # -1 because hidden track, 1 because black track
108
+ track = self.tracks[i]
109
+ track_extract_data = self.tracks_extract_data[i]
110
+
111
+ _track_put_back_range(self.mark_in_frame,
112
+ track,
113
+ track_extract_data)
114
+
115
+def _range_delete_redo(self):
116
+ self.tracks_extract_data = []
117
+ for track in self.tracks: # -1 because hidden track, 1 because black track
118
+ track_extracted = _track_extract_range(self.mark_in_frame,
119
+ self.mark_out_frame,
120
+ track)
121
+ self.tracks_extract_data.append(track_extracted)
122
+
123
+ # HACK, see EditAction for details
124
+ self.turn_on_stop_for_edit = True
125
+
126
+
127
#------------------- ADD CENTERED TRANSITION
128
# "transition_clip","transition_index", "from_clip","to_clip","track","from_in","to_out"
129
def add_centered_transition_action(data):
130
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/editevent.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/editevent.py
Changed
15
1
2
# This shouldn't happen unless for some reason mouse release didn't hit clipenddragmode listener.
3
print "EDIT_MODE() == editorstate.CLIP_END_DRAG at mouse press!"
4
5
+ # Check if match frame close is hit
6
+ if editorstate.current_is_move_mode() and timeline_visible():
7
+ if tlinewidgets.match_frame_close_hit(event.x, event.y) == True:
8
+ tlinewidgets.set_match_frame(-1, -1, True)
9
+ updater.repaint_tline()
10
+ return
11
+
12
# Check if compositor is hit and if so handle compositor editing
13
if editorstate.current_is_move_mode() and timeline_visible():
14
hit_compositor = tlinewidgets.compositor_hit(frame, event.y, current_sequence().compositors)
15
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/editorpersistance.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/editorpersistance.py
Changed
37
1
2
auto_play_in_clip_monitor_check, auto_center_check, grfx_insert_length_spin, \
3
trim_exit_click, trim_quick_enter, remember_clip_frame, overwrite_clip_drop, cover_delete, play_pause_button = edit_prefs_widgets
4
5
- use_english, disp_splash, buttons_style, dark_theme, theme_combo, audio_levels_combo = view_prefs_widgets
6
+ use_english, disp_splash, buttons_style, dark_theme, theme_combo, audio_levels_combo, window_mode_combo = view_prefs_widgets
7
8
global prefs
9
prefs.open_in_last_opended_media_dir = open_in_last_opened_check.get_active()
10
11
prefs.dark_theme = (dark_theme.get_active() == 1)
12
prefs.theme_fallback_colors = theme_combo.get_active()
13
prefs.display_all_audio_levels = (audio_levels_combo.get_active() == 0)
14
+ prefs.global_layout = window_mode_combo.get_active() + 1 # +1 'cause values are 1 and 2
15
16
def get_graphics_default_in_out_length():
17
in_fr = int(15000/2) - int(prefs.default_grfx_length/2)
18
19
self.jack_output_type = appconsts.JACK_OUT_AUDIO # not used
20
self.media_load_order = appconsts.LOAD_ABSOLUTE_FIRST
21
self.use_english_always = False
22
- self.theme_fallback_colors = 0 # index oc gui._THEME_COLORS
23
+ self.theme_fallback_colors = 0 # index of gui._THEME_COLORS
24
self.display_all_audio_levels = True
25
self.overwrite_clip_drop = True
26
self.trans_cover_delete = True
27
# Jul-2016 - SvdB - For play/pause button
28
self.play_pause = False
29
-
30
+ self.midbar_layout = appconsts.MIDBAR_TC_LEFT
31
+ self.global_layout = appconsts.SINGLE_WINDOW
32
+ self.trim_view_default = appconsts.TRIM_VIEW_OFF
33
+ self.trim_view_message_shown = False
34
+ self.exit_allocation_window_2 = (0, 0, 0, 0)
35
+
36
+
37
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/editorstate.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/editorstate.py
Changed
57
1
2
# Flag for window being in fullscreen mode
3
fullscreen = False
4
5
+# Trim view mode
6
+show_trim_view = appconsts.TRIM_VIEW_OFF
7
+
8
+# Remember fade and transition lengths
9
+fade_length = -1
10
+transition_length = -1
11
+
12
+# Trim clips cache for quicker inits, path -> clip
13
+_trim_clips_cache = {}
14
+
15
def current_is_move_mode():
16
if ((edit_mode == INSERT_MOVE) or (edit_mode == OVERWRITE_MOVE) or (edit_mode == MULTI_MOVE)):
17
return True
18
19
return _copy_paste_objects
20
21
def screen_size_small_height():
22
- if SCREEN_HEIGHT < 865:
23
+ if SCREEN_HEIGHT < 901:
24
return True
25
else:
26
+ if SCREEN_WIDTH < 1280:
27
+ return True
28
+
29
return False
30
31
def screen_size_small_width():
32
- if SCREEN_WIDTH < 1200:
33
+ if SCREEN_WIDTH < 1368:
34
return True
35
else:
36
return False
37
-
38
+
39
+def screen_size_small():
40
+ if screen_size_small_height() == True or screen_size_small_width() == True:
41
+ return True
42
+
43
+ return False
44
+
45
+def get_cached_trim_clip(path):
46
+ try:
47
+ return _trim_clips_cache[path]
48
+ except:
49
+ return None
50
+
51
+def add_cached_trim_clip(clip):
52
+ _trim_clips_cache[clip.path] = clip
53
+
54
+def clear_trim_clip_cache():
55
+ global _trim_clips_cache
56
+ _trim_clips_cache = {}
57
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/editorwindow.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/editorwindow.py
Changed
201
1
2
import menuactions
3
import middlebar
4
import monitorevent
5
+import monitorwidget
6
import respaths
7
import render
8
import rendergui
9
import panels
10
import patternproducer
11
-import phantomcompositor
12
from positionbar import PositionBar
13
import preferenceswindow
14
import projectaction
15
16
self.window.set_icon_from_file(respaths.IMAGE_PATH + "flowbladeappicon.png")
17
self.window.set_border_width(5)
18
19
+ self.window2 = None
20
+ if editorpersistance.prefs.global_layout != appconsts.SINGLE_WINDOW:
21
+ self.window2 = Gtk.Window(Gtk.WindowType.TOPLEVEL)
22
+ self.window2.set_icon_from_file(respaths.IMAGE_PATH + "flowbladeappicon.png")
23
+ self.window2.set_border_width(5)
24
+ self.window2.connect("delete-event", lambda w, e:app.shutdown())
25
+
26
# To ask confirmation for shutdown
27
self.window.connect("delete-event", lambda w, e:app.shutdown())
28
29
30
('AddTransition', None, _('Add Single Track Transition'), None, None, lambda a:tlineaction.add_transition_menu_item_selected()),
31
('AddFade', None, _('Add Single Track Fade'), None, None, lambda a:tlineaction.add_fade_menu_item_selected()),
32
('ClearFilters', None, _('Clear Filters'), None, None, lambda a:clipmenuaction.clear_filters()),
33
+ ('Timeline', None, _('Timeline')),
34
+ ('FiltersOff', None, _('All Filters Off'), None, None, lambda a:tlineaction.all_filters_off()),
35
+ ('FiltersOn', None, _('All Filters On'), None, None, lambda a:tlineaction.all_filters_on()),
36
('SyncCompositors', None, _('Sync All Compositors'), None, None, lambda a:tlineaction.sync_all_compositors()),
37
('ChangeSequenceTracks', None, _('Change Sequence Tracks Count...'), None, None, lambda a:projectaction.change_sequence_track_count()),
38
('Watermark', None, _('Watermark...'), None, None, lambda a:menuactions.edit_watermark()),
39
40
('Titler', None, _('Titler'), None, None, lambda a:titler.show_titler()),
41
('AudioMix', None, _('Audio Mixer'), None, None, lambda a:audiomonitoring.show_audio_monitor()),
42
('GMIC', None, _("G'MIC Effects"), None, None, lambda a:gmic.launch_gmic()),
43
- ('Phantom2D', None, _("Phantom2D"), None, None, lambda a: phantomcompositor.launch_phantom()),
44
('MediaLink', None, _('Media Relinker'), None, None, lambda a:medialinker.display_linker()),
45
('HelpMenu', None, _('_Help')),
46
('QuickReference', None, _('Contents'), None, None, lambda a:menuactions.quick_reference()),
47
48
<menuitem action='SyncCompositors'/>
49
<menuitem action='ClearFilters'/>
50
<separator/>
51
+ <menu action='Timeline'>
52
+ <menuitem action='FiltersOff'/>
53
+ <menuitem action='FiltersOn'/>
54
+ </menu>
55
+ <separator/>
56
<menuitem action='AddTransition'/>
57
<menuitem action='AddFade'/>
58
<separator/>
59
60
render_panel_right = rendergui.get_render_panel_right(render.widgets,
61
lambda w,e: projectaction.do_rendering(),
62
lambda w,e: projectaction.add_to_render_queue())
63
- render_hbox = Gtk.HBox(True, 5)
64
+ if editorstate.screen_size_small_width() == False:
65
+ render_hbox = Gtk.HBox(True, 5)
66
+ else:
67
+ render_hbox = Gtk.HBox(False, 5)
68
render_hbox.pack_start(render_panel_left, True, True, 0)
69
render_hbox.pack_start(render_panel_right, True, True, 0)
70
71
72
project_vbox = Gtk.VBox()
73
project_vbox.pack_start(project_info_panel, False, True, 0)
74
project_vbox.pack_start(seq_panel, True, True, 0)
75
-
76
project_panel = guiutils.set_margins(project_vbox, 0, 2, 6, 2)
77
78
# Notebook
79
80
self.notebook.set_size_request(appconsts.NOTEBOOK_WIDTH, appconsts.TOP_ROW_HEIGHT)
81
media_label = Gtk.Label(label=_("Media"))
82
media_label.no_dark_bg = True
83
- self.notebook.append_page(mm_panel, media_label)
84
+ if editorpersistance.prefs.global_layout == appconsts.SINGLE_WINDOW:
85
+ self.notebook.append_page(mm_panel, media_label)
86
self.notebook.append_page(media_log_panel, Gtk.Label(label=_("Range Log")))
87
self.notebook.append_page(self.effects_panel, Gtk.Label(label=_("Filters")))
88
self.notebook.append_page(self.compositors_panel, Gtk.Label(label=_("Compositors")))
89
90
self.notebook.append_page(render_panel, Gtk.Label(label=_("Render")))
91
self.notebook.set_tab_pos(Gtk.PositionType.BOTTOM)
92
93
- # Right notebook, used for Widescreen and Two row layouts
94
- self.right_notebook = Gtk.Notebook()
95
- self.right_notebook.set_tab_pos(Gtk.PositionType.BOTTOM)
96
-
97
# Position bar and decorative frame for it
98
self.pos_bar = PositionBar()
99
pos_bar_frame = Gtk.Frame()
100
101
self._create_monitor_row_widgets()
102
self.player_buttons = glassbuttons.PlayerButtons()
103
self.player_buttons.widget.set_tooltip_text(_("Prev Frame - Arrow Left\nNext Frame - Arrow Right\nPlay - Space\nStop - Space\nMark In - I\nMark Out - O\nClear Marks\nTo Mark In\nTo Mark Out"))
104
- self.monitor_source.modify_font(Pango.FontDescription("sans bold 8"))
105
player_buttons_row = Gtk.HBox(False, 0)
106
-
107
player_buttons_row.pack_start(self.player_buttons.widget, False, True, 0)
108
- player_buttons_row.pack_start(self.monitor_source, True, True, 0)
109
+ player_buttons_row.pack_start(pos_bar_frame, True, True, 0)
110
player_buttons_row.set_margin_bottom(2)
111
112
# Creates monitor switch buttons
113
self._create_monitor_buttons()
114
115
+ # Monitor top info row
116
+ monitor_info_row = Gtk.HBox(False, 1)
117
+ monitor_info_row.pack_start(self.monitor_source, False, False, 0)
118
+ monitor_info_row.pack_start(Gtk.Label(), True, False, 0)
119
+ monitor_info_row.pack_start(self.info1, False, False, 0)
120
+
121
# Switch / pos bar row
122
self.view_mode_select = guicomponents.get_monitor_view_select_combo(lambda w, e: tlineaction.view_mode_menu_lauched(w, e))
123
+ self.trim_view_select = guicomponents.get_trim_view_select_combo(lambda w, e: monitorevent.trim_view_menu_launched(w, e))
124
sw_pos_hbox = Gtk.HBox(False, 1)
125
- sw_pos_hbox.pack_start(self.sequence_editor_b, False, True, 0)
126
- sw_pos_hbox.pack_start(self.clip_editor_b, False, True, 0)
127
- sw_pos_hbox.pack_start(pos_bar_frame, True, True, 0)
128
+ sw_pos_hbox.pack_start(self.sequence_editor_b, True, True, 0)
129
+ sw_pos_hbox.pack_start(self.clip_editor_b, True, True, 0)
130
+ sw_pos_hbox.pack_start(self.trim_view_select.widget, False, False, 0)
131
sw_pos_hbox.pack_start(self.view_mode_select.widget, False, False, 0)
132
sw_pos_hbox.set_margin_top(4)
133
sw_pos_hbox.set_margin_left(2)
134
135
# Video display
136
- black_box = Gtk.EventBox()
137
- black_box.add(Gtk.Label())
138
- bg_color = Gdk.Color(red=0.0, green=0.0, blue=0.0)
139
- black_box.modify_bg(Gtk.StateType.NORMAL, bg_color)
140
-
141
- self.tline_display = black_box # This could be any GTK+ widget (that is not "windowless"), only its XWindow draw rect
142
- # is used to position and scale SDL overlay that actually displays video.
143
+ monitor_widget = monitorwidget.MonitorWidget()
144
+ self.tline_display = monitor_widget.get_monitor()
145
+ self.monitor_widget = monitor_widget
146
+
147
dnd.connect_video_monitor(self.tline_display)
148
149
# Monitor
150
monitor_vbox = Gtk.VBox(False, 1)
151
- monitor_vbox.pack_start(self.tline_display, True, True, 0)
152
+ monitor_vbox.pack_start(monitor_info_row, False, True, 0)
153
+ monitor_vbox.pack_start(monitor_widget.widget, True, True, 0)
154
monitor_vbox.pack_start(sw_pos_hbox, False, True, 0)
155
monitor_vbox.pack_start(player_buttons_row, False, True, 0)
156
157
158
159
# Top row paned
160
self.top_paned = Gtk.HPaned()
161
- self.top_paned.pack1(notebook_vbox, resize=False, shrink=False)
162
- self.top_paned.pack2(monitor_frame, resize=True, shrink=False)
163
-
164
+ if editorpersistance.prefs.global_layout == appconsts.SINGLE_WINDOW:
165
+ self.top_paned.pack1(notebook_vbox, resize=False, shrink=False)
166
+ self.top_paned.pack2(monitor_frame, resize=True, shrink=False)
167
+ else:
168
+ self.top_paned.pack1(mm_panel, resize=False, shrink=False)
169
+ self.top_paned.pack2(notebook_vbox, resize=True, shrink=False)
170
+
171
# Top row
172
self.top_row_hbox = Gtk.HBox(False, 0)
173
self.top_row_hbox.pack_start(self.top_paned, True, True, 0)
174
175
if w != 0: # non-existing prefs file causes w and h to be 0
176
if (float(w) / editorstate.SCREEN_WIDTH > 0.95) and (float(h) / editorstate.SCREEN_HEIGHT > 0.95):
177
self.window.maximize()
178
- print "maximize"
179
else:
180
self.window.resize(w, h)
181
self.window.set_position(Gtk.WindowPosition.CENTER)
182
183
184
# Show window and all of its components
185
self.window.show_all()
186
-
187
+
188
+ # Show Monitor Window in two window mode
189
+ if editorpersistance.prefs.global_layout != appconsts.SINGLE_WINDOW:
190
+ pane2 = Gtk.VBox(False, 1)
191
+ pane2.pack_start(monitor_frame, True, True, 0)
192
+
193
+ # Set pane and show window
194
+ self.window2.add(pane2)
195
+ self.window2.set_title("Flowblade")
196
+
197
+ # Maximize if it seems that we exited maximized, else set size
198
+ w, h, x, y = editorpersistance.prefs.exit_allocation_window_2
199
+
200
+ if w != 0: # non-existing prefs file causes w and h to be 0
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/glassbuttons.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/glassbuttons.py
Changed
35
1
2
else:
3
self.glass_style = False
4
5
+ self.no_decorations = False
6
+
7
# Dark theme comes with flat buttons
8
self.dark_theme = False
9
if editorpersistance.prefs.dark_theme == True:
10
11
# Width of buttons group
12
buttons_width = self.button_width * len(self.icons)
13
14
+ if self.no_decorations == True:
15
+ x = self.button_x
16
+ for i in range(0, len(self.icons)):
17
+ icon = self.icons[i]
18
+ cr.set_source_surface(icon, x + self.image_x[i], self.image_y[i])
19
+ cr.paint()
20
+ if self.sensitive[i] == False:
21
+ cr.save()
22
+ self._round_rect_path(cr)
23
+ cr.set_source(grad)
24
+ cr.clip()
25
+ cr.rectangle(x, self.button_y, self.button_width, self.button_height)
26
+ cr.fill()
27
+ cr.restore()
28
+ x += self.button_width
29
+
30
+ return
31
+
32
# Line width for all strokes
33
cr.set_line_width(1.0)
34
35
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/gui.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/gui.py
Changed
29
1
2
tline_left_corner = None
3
big_tc = None
4
5
+monitor_widget = None
6
+
7
# indexes match editmode values in editorstate.py
8
notebook_buttons = None
9
10
11
global editor_window, media_list_view, bin_list_view, sequence_list_view, pos_bar, \
12
tc, tline_display, tline_scale, tline_canvas, tline_scroll, tline_v_scroll, tline_info, \
13
tline_column, play_b, clip_editor_b, sequence_editor_b, \
14
- effect_select_list_view, effect_select_combo_box, project_info_vbox, middle_notebook, big_tc, editmenu, notebook_buttons, tline_left_corner
15
+ effect_select_list_view, effect_select_combo_box, project_info_vbox, middle_notebook, big_tc, editmenu, notebook_buttons, tline_left_corner, \
16
+ monitor_widget
17
18
editor_window = new_editor_window
19
20
21
pos_bar = editor_window.pos_bar
22
tc = editor_window.tc
23
24
+ monitor_widget = editor_window.monitor_widget
25
+
26
tline_display = editor_window.tline_display
27
tline_scale = editor_window.tline_scale
28
tline_canvas = editor_window.tline_canvas
29
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/guicomponents.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/guicomponents.py
Changed
201
1
2
"""
3
4
import cairo
5
+import copy
6
import math
7
import time
8
9
10
import mltfilters
11
import mltprofiles
12
import mlttransitions
13
+import monitorwidget
14
import respaths
15
import snapping
16
+import toolsintegration
17
import translations
18
import utils
19
20
21
markers_menu = Gtk.Menu.new()
22
tracks_menu = Gtk.Menu.new()
23
monitor_menu = Gtk.Menu.new()
24
+trim_view_menu = Gtk.Menu.new()
25
tools_menu = Gtk.Menu.new()
26
file_filter_menu = Gtk.Menu()
27
column_count_menu = Gtk.Menu()
28
29
GUI component displaying list of filters applied to a clip.
30
"""
31
32
- def __init__(self, selection_cb, toggle_cb):
33
+ def __init__(self, selection_cb, toggle_cb, row_deleted, row_inserted):
34
GObject.GObject.__init__(self)
35
36
- # Datamodel: icon, text, icon
37
+ # Datamodel: icon, text, icon
38
self.storemodel = Gtk.ListStore(GdkPixbuf.Pixbuf, str, bool)
39
-
40
+ self.storemodel.connect("row-deleted", row_deleted)
41
+ self.storemodel.connect("row-inserted", row_inserted)
42
+
43
# Scroll container
44
self.scroll = Gtk.ScrolledWindow()
45
self.scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
46
47
self.treeview = Gtk.TreeView(self.storemodel)
48
self.treeview.set_property("rules_hint", True)
49
self.treeview.set_headers_visible(False)
50
+ self.treeview.set_reorderable(True)
51
+
52
+
53
tree_sel = self.treeview.get_selection()
54
tree_sel.set_mode(Gtk.SelectionMode.SINGLE)
55
56
57
self.img.press_func = self._press
58
self.img.dnd_media_widget_attr = True # this is used to identify widget at dnd drop
59
self.img.set_can_focus(True)
60
+ self.img.set_tooltip_text(media_file.name)
61
62
txt = Gtk.Label(label=media_file.name)
63
txt.modify_font(Pango.FontDescription("sans 9"))
64
txt.set_ellipsize(Pango.EllipsizeMode.END)
65
txt.set_max_width_chars(13)
66
+ txt.set_tooltip_text(media_file.name)
67
68
self.vbox.pack_start(self.img, True, True, 0)
69
self.vbox.pack_start(txt, False, False, 0)
70
71
if self.media_file == editorstate.MONITOR_MEDIA_FILE():
72
cr.set_source_surface(self.indicator_icon, 29, 22)
73
cr.paint()
74
+
75
+ cr.select_font_face ("sans-serif",
76
+ cairo.FONT_SLANT_NORMAL,
77
+ cairo.FONT_WEIGHT_NORMAL)
78
+ cr.set_font_size(9)
79
if self.media_file.mark_in != -1 and self.media_file.mark_out != -1:
80
- cr.set_source_rgb(1, 1, 1)
81
- cr.select_font_face ("sans-serif",
82
- cairo.FONT_SLANT_NORMAL,
83
- cairo.FONT_WEIGHT_NORMAL)
84
- cr.set_font_size(9)
85
- cr.move_to(23, 80)
86
+ cr.set_source_rgba(0,0,0,0.5)
87
+ cr.rectangle(21,1,72,12)
88
+ cr.fill()
89
+
90
+ cr.move_to(23, 10)
91
clip_length = utils.get_tc_string(self.media_file.mark_out - self.media_file.mark_in + 1) #+1 out incl.
92
+ cr.set_source_rgb(1, 1, 1)
93
cr.show_text("][ " + str(clip_length))
94
95
+ cr.set_source_rgba(0,0,0,0.5)
96
+ cr.rectangle(28,75,62,12)
97
+ cr.fill()
98
+
99
+ cr.move_to(30, 84)
100
+ cr.set_source_rgb(1, 1, 1)
101
+ media_length = utils.get_tc_string(self.media_file.length)
102
+ cr.show_text(str(media_length))
103
+
104
if self.media_file.type != appconsts.PATTERN_PRODUCER:
105
if self.media_file.is_proxy_file == True:
106
cr.set_source_surface(is_proxy_icon, 96, 6)
107
108
menu_launch.surface_y = 10
109
return menu_launch
110
111
+def get_trim_view_select_combo(callback):
112
+ surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "trim_view.png")
113
+ menu_launch = PressLaunch(callback, surface, w=24, h=20)
114
+ menu_launch.surface_y = 10
115
+ return menu_launch
116
+
117
def get_compositor_track_select_combo(source_track, target_track, callback):
118
tracks_combo = Gtk.ComboBoxText()
119
active_index = -1
120
121
_add_separetor(clip_menu)
122
123
if track.type == appconsts.VIDEO:
124
+ clip_menu.add(_get_tool_integration_menu_item(event, clip, track, callback))
125
+ _add_separetor(clip_menu)
126
+
127
+ if track.type == appconsts.VIDEO:
128
129
clip_menu.add(_get_menu_item(_("Split Audio"), callback,\
130
(clip, track, "split_audio", event.x), True))
131
132
clip_menu.add(_get_menu_item(_("Clip Info"), callback,\
133
(clip, track, "clip_info", event.x)))
134
135
+ _add_separetor(clip_menu)
136
+ clip_menu.add(_get_select_menu_item(event, clip, track, callback))
137
+
138
+ if track.type == appconsts.VIDEO and clip.media_type != appconsts.PATTERN_PRODUCER:
139
+ _add_separetor(clip_menu)
140
+ clip_menu.add(_get_match_frame_menu_item(event, clip, track, callback))
141
+
142
clip_menu.popup(None, None, None, None, event.button, event.time)
143
144
+
145
def display_transition_clip_popup_menu(event, clip, track, callback):
146
clip_menu = transition_clip_menu
147
guiutils.remove_children(clip_menu)
148
149
clip_menu.add(_get_menu_item(_("Clip Info"), callback,\
150
(clip, track, "clip_info", event.x)))
151
152
+ _add_separetor(clip_menu)
153
+ clip_menu.add(_get_select_menu_item(event, clip, track, callback))
154
+
155
clip_menu.popup(None, None, None, None, event.button, event.time)
156
157
def display_compositor_popup_menu(event, compositor, callback):
158
159
menu_item.show()
160
return menu_item
161
162
+def _get_match_frame_menu_item(event, clip, track, callback):
163
+ menu_item = Gtk.MenuItem(_("Show Match Frame"))
164
+ sub_menu = Gtk.Menu()
165
+ menu_item.set_submenu(sub_menu)
166
+
167
+ start_item_monitor = Gtk.MenuItem(_("First Frame in Monitor"))
168
+ sub_menu.append(start_item_monitor)
169
+ start_item_monitor.connect("activate", callback, (clip, track, "match_frame_start_monitor", None))
170
+ start_item_monitor.show()
171
+
172
+ end_item_monitor = Gtk.MenuItem(_("Last Frame in Monitor"))
173
+ sub_menu.append(end_item_monitor)
174
+ end_item_monitor.connect("activate", callback, (clip, track, "match_frame_end_monitor", None))
175
+ end_item_monitor.show()
176
+
177
+ _add_separetor(sub_menu)
178
+
179
+ start_item = Gtk.MenuItem(_("First Frame on Timeline"))
180
+ sub_menu.append(start_item)
181
+ start_item.connect("activate", callback, (clip, track, "match_frame_start", None))
182
+ start_item.show()
183
+
184
+ end_item = Gtk.MenuItem(_("Last Frame on Timeline"))
185
+ sub_menu.append(end_item)
186
+ end_item.connect("activate", callback, (clip, track, "match_frame_end", None))
187
+ end_item.show()
188
+
189
+ _add_separetor(sub_menu)
190
+
191
+ clear_item = Gtk.MenuItem(_("Clear Match Frame"))
192
+ sub_menu.append(clear_item)
193
+ clear_item.connect("activate", callback, (clip, track, "match_frame_close", None))
194
+ clear_item.show()
195
+
196
+ menu_item.set_sensitive(True)
197
+ menu_item.show()
198
+ return menu_item
199
+
200
+def _get_select_menu_item(event, clip, track, callback):
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/keyevents.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/keyevents.py
Changed
54
1
2
import monitorevent
3
import mltrefhold
4
import tlineaction
5
+import tlinewidgets
6
import trimmodes
7
import updater
8
import projectaction
9
10
if PLAYER().is_playing():
11
monitorevent.stop_pressed()
12
PLAYER().seek_frame(0)
13
+ _move_to_beginning()
14
return True
15
16
# Select all with CTRL + A in media panel
17
18
or gui.tline_scale.widget.is_focus()
19
or glassbuttons.focus_group_has_focus(glassbuttons.DEFAULT_FOCUS_GROUP)):
20
return True
21
-
22
+
23
return False
24
25
def _handle_tline_key_event(event):
26
27
if PLAYER().is_playing():
28
monitorevent.stop_pressed()
29
PLAYER().seek_frame(0)
30
+ _move_to_beginning()
31
return True
32
else:
33
# HOME
34
35
gui.editor_window.handle_insert_move_mode_button_press()
36
gui.editor_window.set_mode_selector_to_mode()
37
PLAYER().seek_frame(0)
38
+ _move_to_beginning()
39
return True
40
41
return False
42
43
if kfeditor.get_focus_child() != None:
44
return kfeditor
45
return None
46
+
47
+def _move_to_beginning():
48
+ tlinewidgets.pos = 0
49
+ updater.repaint_tline()
50
+ updater.update_tline_scrollbar()
51
+
52
+
53
+
54
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/keyframeeditor.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/keyframeeditor.py
Changed
27
1
2
delta_x = x - self.mouse_start_x
3
delta_y = y - self.mouse_start_y
4
5
+ if state & Gdk.ModifierType.SHIFT_MASK:
6
+ if abs(x - self.mouse_start_x) < abs(y - self.mouse_start_y):
7
+ delta_x = 0
8
+ else:
9
+ delta_y = 0
10
+
11
self._shape__motion_notify_event(delta_x, delta_y)
12
13
self.parent_editor.queue_draw()
14
15
delta_x = event.x - self.mouse_start_x
16
delta_y = event.y - self.mouse_start_y
17
18
+ if event.get_state() & Gdk.ModifierType.SHIFT_MASK:
19
+ if abs(event.x - self.mouse_start_x) < abs(event.y - self.mouse_start_y):
20
+ delta_x = 0
21
+ else:
22
+ delta_y = 0
23
+
24
self._shape_release_event(delta_x, delta_y)
25
26
self.parent_editor.geometry_edit_finished()
27
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/launch/flowbladegmic -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/launch/flowbladegmic
Changed
17
1
2
sys.path.insert(0, modules_path + "/vieweditor")
3
sys.path.insert(0, modules_path + "/tools")
4
5
-# Get app.py module and set info which type of installation is running
6
try:
7
import gmic
8
import editorstate # Used to decide which translations from file system are used
9
10
print "ERROR:", err
11
print "Installation was assumed to be at:", modules_path
12
sys.exit(1)
13
-
14
15
16
gmic.main(modules_path)
17
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/launch/natron_clip_export_start.sh
Added
5
1
2
+#!/bin/bash
3
+
4
+Natron $1"natronclipimportinit.py"
5
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/launch/natronclipimportinit.py
Added
71
1
2
+"""
3
+ Flowblade Movie Editor is a nonlinear video editor.
4
+ Copyright 2012 Janne Liljeblad.
5
+
6
+ This file is part of Flowblade Movie Editor <http://code.google.com/p/flowblade>.
7
+
8
+ Flowblade Movie Editor is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ (at your option) any later version.
12
+
13
+ Flowblade Movie Editor is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with Flowblade Movie Editor. If not, see <http://www.gnu.org/licenses/>.
20
+"""
21
+
22
+"""
23
+NOTE: THIS SCRIPT IS RUN BY NATRON WHEN LAUNCHING IT AND HAS NO ACCES TO
24
+OTHER PYTHON MODULES IN FLOWBLADE.
25
+"""
26
+import os
27
+import NatronEngine
28
+
29
+def createInstance(app,group):
30
+ # Get export data
31
+ natron_dir = get_hidden_user_dir_path() + "natron"
32
+ exportfile = get_latest_clip_export_file(natron_dir)
33
+ clip_path, mark_in, mark_out = get_export_data(exportfile)
34
+
35
+ # Create Natron graph
36
+ readerNode = app.createReader("")
37
+ viewerNode = app.createNode("fr.inria.built-in.Viewer")
38
+ viewerNode.connectInput(0, readerNode)
39
+ reader = app.Read1
40
+ reader.filename.set(clip_path)
41
+ reader.getParam("firstFrame").set(int(mark_in))
42
+ reader.getParam("lastFrame").set(int(mark_out) + 1)
43
+ reader.getParam("startingTime").set(0)
44
+ readerNode.setPosition(300.0, 100.0)
45
+ viewerNode.setPosition(315.0, 300.0)
46
+ app.getProjectParam("frameRange").set(1, int(mark_out) - int(mark_in) + 1)
47
+
48
+# ---------------------------------------------------- helper funcs
49
+def get_hidden_user_dir_path():
50
+ return os.getenv("HOME") + "/.flowblade/"
51
+
52
+def get_latest_clip_export_file(dirpath):
53
+ from os import listdir
54
+ from os.path import isfile, join
55
+ file_paths = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
56
+
57
+ # Get files staring with "clipexport_"
58
+ clip_export_files = []
59
+ for fpath in file_paths:
60
+ if fpath.startswith("clipexport_"):
61
+ clip_export_files.append(dirpath + "/" + fpath)
62
+
63
+ newest = max(clip_export_files, key=os.path.getctime)
64
+ return newest
65
+
66
+def get_export_data(export_file):
67
+ data_file = open(export_file)
68
+ data_text = data_file.read()
69
+ tokens = data_text.split(" ")
70
+ return (tokens[0], tokens[1], tokens[2])
71
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/Flowblade/flowblade.pot -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/Flowblade/flowblade.pot
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: PACKAGE VERSION\n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
6
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
7
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
8
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
9
"Language-Team: LANGUAGE <LL@li.org>\n"
10
11
"Content-Type: text/plain; charset=CHARSET\n"
12
"Content-Transfer-Encoding: 8bit\n"
13
14
-#: app.py:733
15
+#: app.py:758
16
msgid "Too small screen for this application."
17
msgstr ""
18
19
-#: app.py:736
20
+#: app.py:761
21
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
22
msgstr ""
23
24
-#: app.py:737
25
+#: app.py:762
26
msgid "Your screen dimensions are "
27
msgstr ""
28
29
-#: app.py:761
30
-msgid "Project has not been saved since it was opened."
31
-msgstr ""
32
-
33
-#: app.py:766
34
-msgid "Project was saved less than a minute ago."
35
-msgstr ""
36
-
37
-#: app.py:769
38
-msgid "Project was saved one minute ago."
39
-msgstr ""
40
-
41
-#: app.py:771
42
-msgid "Project was saved "
43
-msgstr ""
44
-
45
-#: app.py:771
46
-msgid " minutes ago."
47
-msgstr ""
48
-
49
-#: app.py:781 projectaction.py:327
50
+#: app.py:795 projectaction.py:366 projectaction.py:696
51
msgid "Project has not been saved previously"
52
msgstr ""
53
54
-#: app.py:782 projectaction.py:328
55
+#: app.py:796 projectaction.py:367 projectaction.py:697
56
msgid "Save project with File -> Save As before closing."
57
msgstr ""
58
59
60
msgid "Opening"
61
msgstr ""
62
63
-#: projectaction.py:238
64
+#: projectaction.py:276
65
msgid "Media files already present in project were opened!"
66
msgstr ""
67
68
-#: projectaction.py:244
69
+#: projectaction.py:282
70
msgid ""
71
"Files already present:\n"
72
"\n"
73
msgstr ""
74
75
-#: projectaction.py:442
76
+#: projectaction.py:481
77
msgid "Selected folder contains files"
78
msgstr ""
79
80
-#: projectaction.py:443
81
+#: projectaction.py:482
82
msgid ""
83
"When saving a back-up snapshot of the project, the selected folder\n"
84
"has to be empty."
85
msgstr ""
86
87
-#: projectaction.py:501
88
+#: projectaction.py:553
89
msgid "Copying project media assets"
90
msgstr ""
91
92
-#: projectaction.py:502
93
+#: projectaction.py:554
94
msgid "Saving project file"
95
msgstr ""
96
97
-#: projectaction.py:625
98
+#: projectaction.py:709
99
msgid "Project not found on disk"
100
msgstr ""
101
102
-#: projectaction.py:626
103
+#: projectaction.py:710
104
msgid "Project can't be loaded."
105
msgstr ""
106
107
-#: projectaction.py:684
108
+#: projectaction.py:718
109
+msgid "Project has not been saved since it was opened."
110
+msgstr ""
111
+
112
+#: projectaction.py:723
113
+msgid "Project was saved less than a minute ago."
114
+msgstr ""
115
+
116
+#: projectaction.py:726
117
+msgid "Project was saved one minute ago."
118
+msgstr ""
119
+
120
+#: projectaction.py:728
121
+msgid "Project was saved "
122
+msgstr ""
123
+
124
+#: projectaction.py:728
125
+msgid " minutes ago."
126
+msgstr ""
127
+
128
+#: projectaction.py:782
129
msgid "Render launch failed!"
130
msgstr ""
131
132
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
133
+#: projectaction.py:783 projectaction.py:797 tools/batchrendering.py:299
134
msgid "Error message: "
135
msgstr ""
136
137
-#: projectaction.py:698
138
+#: projectaction.py:796
139
msgid "Adding item to render queue failed!"
140
msgstr ""
141
142
-#: projectaction.py:717
143
+#: projectaction.py:815
144
msgid "Open.."
145
msgstr ""
146
147
-#: projectaction.py:747
148
+#: projectaction.py:845
149
msgid "No file was selected"
150
msgstr ""
151
152
-#: projectaction.py:747
153
+#: projectaction.py:845
154
msgid "Select a numbered file to add an Image Sequence to Project."
155
msgstr ""
156
157
-#: projectaction.py:755
158
+#: projectaction.py:853
159
msgid "Not a sequence file!"
160
msgstr ""
161
162
-#: projectaction.py:755
163
+#: projectaction.py:853
164
msgid ""
165
"Selected file does not have a number part in it,\n"
166
"so it can't be an image sequence file."
167
msgstr ""
168
169
-#: projectaction.py:806
170
+#: projectaction.py:904
171
msgid "Can't make home folder thumbnails folder"
172
msgstr ""
173
174
-#: projectaction.py:807 dialogs.py:361
175
+#: projectaction.py:905 dialogs.py:361
176
msgid "Please create and select some other folder then '"
177
msgstr ""
178
179
-#: projectaction.py:808
180
+#: projectaction.py:906
181
msgid "' as thumbnails folder"
182
msgstr ""
183
184
-#: projectaction.py:925 projectaction.py:927 projectaction.py:936
185
-#: projectaction.py:944 projectaction.py:951
186
+#: projectaction.py:1023 projectaction.py:1025 projectaction.py:1034
187
+#: projectaction.py:1042 projectaction.py:1049
188
msgid "N/A"
189
msgstr ""
190
191
-#: projectaction.py:940 guicomponents.py:1621
192
+#: projectaction.py:1038 guicomponents.py:1745
193
msgid "Yes"
194
msgstr ""
195
196
-#: projectaction.py:942 guicomponents.py:1623
197
+#: projectaction.py:1040 guicomponents.py:1747
198
msgid "No"
199
msgstr ""
200
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/create_pot -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/create_pot
Changed
7
1
2
ROOT_DIR=$(pwd)
3
4
# Creates .pot file that can be turned to .po file for each language
5
-xgettext -o locale/Flowblade/flowblade.pot app.py projectaction.py editorwindow.py clipeffectseditor.py compositeeditor.py dialogs.py editevent.py editorpersistance.py guicomponents.py movemodes.py panels.py persistance.py projectdata.py render.py syncsplitevent.py translations.py mlttransitions.py propertyeditorbuilder.py keyframeeditor.py middlebar.py medialog.py projectinfogui.py tools/titler.py rendergui.py profilesmanager.py preferenceswindow.py tools/batchrendering.py proxyediting.py tlineaction.py extraeditors.py trackaction.py medialinker.py patternproducer.py tools/gmic.py tools/gmic.py tools/toolsencoding.py
6
+xgettext -o locale/Flowblade/flowblade.pot app.py projectaction.py editorwindow.py clipeffectseditor.py compositeeditor.py dialogs.py editevent.py editorpersistance.py guicomponents.py movemodes.py panels.py persistance.py projectdata.py render.py syncsplitevent.py translations.py mlttransitions.py propertyeditorbuilder.py keyframeeditor.py middlebar.py medialog.py projectinfogui.py tools/titler.py rendergui.py profilesmanager.py preferenceswindow.py tools/batchrendering.py proxyediting.py tlineaction.py extraeditors.py trackaction.py medialinker.py patternproducer.py tools/gmic.py tools/gmic.py tools/toolsencoding.py monitorevent.py
7
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/cs/LC_MESSAGES/flowblade.mo -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/cs/LC_MESSAGES/flowblade.mo
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/cs/LC_MESSAGES/flowblade.po -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/cs/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: \n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
6
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
7
"PO-Revision-Date: 2016-03-05 13:35+0100\n"
8
"Last-Translator: Pavel Fric <pavelfric@seznam.cz>\n"
9
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
10
11
"X-Language: cs_CZ\n"
12
"X-Source-Language: C\n"
13
14
-#: app.py:733
15
+#: app.py:758
16
msgid "Too small screen for this application."
17
msgstr "Příliš malá obrazovka pro tento program."
18
19
-#: app.py:736
20
+#: app.py:761
21
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
22
msgstr "Nejmenší rozměry obrazovky pro tento program jsou 1152 x 768.\n"
23
24
-#: app.py:737
25
+#: app.py:762
26
msgid "Your screen dimensions are "
27
msgstr "Rozměry vaší obrazovky jsou "
28
29
-#: app.py:761
30
-msgid "Project has not been saved since it was opened."
31
-msgstr "Projekt nebyl od té doby, co byl otevřen, uložen."
32
-
33
-#: app.py:766
34
-msgid "Project was saved less than a minute ago."
35
-msgstr "Projekt byl uložen před méně než minutou."
36
-
37
-#: app.py:769
38
-msgid "Project was saved one minute ago."
39
-msgstr "Projekt byl uložen před jednou minutou."
40
-
41
-#: app.py:771
42
-msgid "Project was saved "
43
-msgstr "Projekt byl uložen před "
44
-
45
-#: app.py:771
46
-msgid " minutes ago."
47
-msgstr " minutami"
48
-
49
-#: app.py:781 projectaction.py:327
50
+#: app.py:795 projectaction.py:366 projectaction.py:696
51
msgid "Project has not been saved previously"
52
msgstr "Projekt předtím byl uložen"
53
54
-#: app.py:782 projectaction.py:328
55
+#: app.py:796 projectaction.py:367 projectaction.py:697
56
msgid "Save project with File -> Save As before closing."
57
msgstr "Uložte projekt před zavření pomocí Soubor -> Uložit."
58
59
60
msgid "Opening"
61
msgstr "Otevírá se"
62
63
-#: projectaction.py:238
64
+#: projectaction.py:276
65
msgid "Media files already present in project were opened!"
66
msgstr "Soubory již přítomné v projektu byly otevřeny!"
67
68
-#: projectaction.py:244
69
+#: projectaction.py:282
70
msgid ""
71
"Files already present:\n"
72
"\n"
73
74
"Soubory již přítomné:\n"
75
"\n"
76
77
-#: projectaction.py:442
78
+#: projectaction.py:481
79
msgid "Selected folder contains files"
80
msgstr "Vybraná složka obsahuje soubory"
81
82
-#: projectaction.py:443
83
+#: projectaction.py:482
84
msgid ""
85
"When saving a back-up snapshot of the project, the selected folder\n"
86
"has to be empty."
87
msgstr ""
88
"Při ukládání záložního snímku projektu musí být vybraná složka prázdná."
89
90
-#: projectaction.py:501
91
+#: projectaction.py:553
92
msgid "Copying project media assets"
93
msgstr "Kopírují se položky záznamů projektu"
94
95
-#: projectaction.py:502
96
+#: projectaction.py:554
97
msgid "Saving project file"
98
msgstr "Ukládá se soubor s projektem"
99
100
-#: projectaction.py:625
101
+#: projectaction.py:709
102
msgid "Project not found on disk"
103
msgstr "Projekt nebyl na disku nalezen"
104
105
-#: projectaction.py:626
106
+#: projectaction.py:710
107
msgid "Project can't be loaded."
108
msgstr "Projekt nelze nahrát."
109
110
-#: projectaction.py:684
111
+#: projectaction.py:718
112
+msgid "Project has not been saved since it was opened."
113
+msgstr "Projekt nebyl od té doby, co byl otevřen, uložen."
114
+
115
+#: projectaction.py:723
116
+msgid "Project was saved less than a minute ago."
117
+msgstr "Projekt byl uložen před méně než minutou."
118
+
119
+#: projectaction.py:726
120
+msgid "Project was saved one minute ago."
121
+msgstr "Projekt byl uložen před jednou minutou."
122
+
123
+#: projectaction.py:728
124
+msgid "Project was saved "
125
+msgstr "Projekt byl uložen před "
126
+
127
+#: projectaction.py:728
128
+msgid " minutes ago."
129
+msgstr " minutami"
130
+
131
+#: projectaction.py:782
132
msgid "Render launch failed!"
133
msgstr "Spuštění zpracování se nezdařilo!"
134
135
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
136
+#: projectaction.py:783 projectaction.py:797 tools/batchrendering.py:299
137
msgid "Error message: "
138
msgstr "Zpráva o chybě: "
139
140
-#: projectaction.py:698
141
+#: projectaction.py:796
142
msgid "Adding item to render queue failed!"
143
msgstr "Přidání položky do řady ke zpracování se nezdařilo!"
144
145
-#: projectaction.py:717
146
+#: projectaction.py:815
147
msgid "Open.."
148
msgstr "Otevřít..."
149
150
-#: projectaction.py:747
151
+#: projectaction.py:845
152
msgid "No file was selected"
153
msgstr "Nebyl vybrán žádný soubor"
154
155
-#: projectaction.py:747
156
+#: projectaction.py:845
157
msgid "Select a numbered file to add an Image Sequence to Project."
158
msgstr "Vyberte číslovaný soubor pro přidání obrazové řady do projektu."
159
160
-#: projectaction.py:755
161
+#: projectaction.py:853
162
msgid "Not a sequence file!"
163
msgstr "Není řadovým souborem!"
164
165
-#: projectaction.py:755
166
+#: projectaction.py:853
167
msgid ""
168
"Selected file does not have a number part in it,\n"
169
"so it can't be an image sequence file."
170
171
"Vybraný soubor nemá ve svém názvu část s číslem.\n"
172
"Nemůže to tedy být soubor obrazové řady."
173
174
-#: projectaction.py:806
175
+#: projectaction.py:904
176
msgid "Can't make home folder thumbnails folder"
177
msgstr "Nelze udělat složku pro náhledy z domovské složky"
178
179
-#: projectaction.py:807 dialogs.py:361
180
+#: projectaction.py:905 dialogs.py:361
181
msgid "Please create and select some other folder then '"
182
msgstr "Vytvořte a vyberte, prosím, nějakou jinou složku než '"
183
184
-#: projectaction.py:808
185
+#: projectaction.py:906
186
msgid "' as thumbnails folder"
187
msgstr "' jako složku pro náhledy"
188
189
-#: projectaction.py:925 projectaction.py:927 projectaction.py:936
190
-#: projectaction.py:944 projectaction.py:951
191
+#: projectaction.py:1023 projectaction.py:1025 projectaction.py:1034
192
+#: projectaction.py:1042 projectaction.py:1049
193
msgid "N/A"
194
msgstr ""
195
196
-#: projectaction.py:940 guicomponents.py:1621
197
+#: projectaction.py:1038 guicomponents.py:1745
198
msgid "Yes"
199
msgstr "Ano"
200
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/de/LC_MESSAGES/flowblade.mo -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/de/LC_MESSAGES/flowblade.mo
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/de/LC_MESSAGES/flowblade.po -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/de/LC_MESSAGES/flowblade.po
Changed
201
1
2
-# Language de translations for PACKAGE package.
3
-# Copyright (C) 2014 THE PACKAGE'S COPYRIGHT HOLDER
4
-# This file is distributed under the same license as the PACKAGE package.
5
-# Martin Wielebinski <mwdev@esc.de>, 2014.
6
-# Adaptions by Bene81 <Bene81@users.noreply.github.com>
7
-#
8
+# Language de translations for PACKAGE package.
9
+# Copyright (C) 2014 THE PACKAGE'S COPYRIGHT HOLDER
10
+# This file is distributed under the same license as the PACKAGE package.
11
+# Martin Wielebinski <mwdev@esc.de>, 2014.
12
+# Adaptions by Bene81 <Bene81@users.noreply.github.com>
13
+# Improved and expanded by Mario Dejanovic <mario.dejanovic@gmx.at>, November 2016
14
+#
15
msgid ""
16
msgstr ""
17
"Project-Id-Version: PACKAGE VERSION\n"
18
"Report-Msgid-Bugs-To: \n"
19
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
20
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
21
"PO-Revision-Date: 2014-11-23 14:22+0100\n"
22
-"Last-Translator: Martin Wielebinski <mwdev@esc.de>\n"
23
+"Last-Translator: Mario Dejanovic <mario.dejanovic@gmx.at>\n"
24
"Language-Team: German\n"
25
"Language: de\n"
26
"MIME-Version: 1.0\n"
27
28
"Content-Transfer-Encoding: 8bit\n"
29
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
30
31
-#: app.py:733
32
+#: app.py:758
33
msgid "Too small screen for this application."
34
msgstr "Zu kleiner Bildschirm für diese Applikation."
35
36
-#: app.py:736
37
+#: app.py:761
38
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
39
msgstr "Minimale Auflösung für diese Applikation ist 1152 x 768.\n"
40
41
-#: app.py:737
42
+#: app.py:762
43
msgid "Your screen dimensions are "
44
msgstr "Ihre Auflösung beträgt "
45
46
-#: app.py:761
47
-msgid "Project has not been saved since it was opened."
48
-msgstr "Projekt wurde seit dem Öffnen nicht gesichert."
49
-
50
-#: app.py:766
51
-msgid "Project was saved less than a minute ago."
52
-msgstr "Projekt wurde vor weniger als einer Minute gesichert."
53
-
54
-#: app.py:769
55
-msgid "Project was saved one minute ago."
56
-msgstr "Projekt wurde vor einer Minute gesichert."
57
-
58
-#: app.py:771
59
-msgid "Project was saved "
60
-msgstr "Projekt wurde vor "
61
-
62
-#: app.py:771
63
-msgid " minutes ago."
64
-msgstr " Minuten gesichert."
65
-
66
-#: app.py:781 projectaction.py:327
67
+#: app.py:795 projectaction.py:366 projectaction.py:696
68
msgid "Project has not been saved previously"
69
msgstr "Projekt wurde noch nicht gesichert"
70
71
-#: app.py:782 projectaction.py:328
72
+#: app.py:796 projectaction.py:367 projectaction.py:697
73
msgid "Save project with File -> Save As before closing."
74
msgstr "Projekt vor dem Schließen sichern mit 'Datei -> Sichern als...'."
75
76
77
msgstr "Um das Projekt zu laden ist einer der folgenden Schritte erforderlich:"
78
79
#: projectaction.py:115
80
-#, fuzzy
81
msgid ""
82
"Open project in 'Media Relinker' tool to relink media assets to new files, or"
83
msgstr ""
84
85
"oder"
86
87
#: projectaction.py:116
88
-#, fuzzy
89
msgid "Place a file with the same exact name and path on the hard drive"
90
msgstr "eine Ersatzdatei mit gleichem Namen und ähnlichem Inhalt anlegen"
91
92
#: projectaction.py:117
93
msgid "Open project in Media Relinker tool"
94
-msgstr ""
95
+msgstr "Öffne das Projekt im Medien-Link Werkzeug"
96
97
#: projectaction.py:136
98
-#, fuzzy
99
msgid "Profile with Description: '"
100
msgstr "Profil mit Beschreibung: '"
101
102
#: projectaction.py:136
103
-#, fuzzy
104
msgid "' was not found on load!"
105
msgstr "' wurde beim Laden nicht gefunden!"
106
107
108
"the same Description\n"
109
"as the missing profile. "
110
msgstr ""
111
-"Es ist möglich das Projekt zu laden, indem ein Nutzerprofil mit exakt der "
112
-"gleichen Beschreibung\n"
113
-"wie das fehlende Profil angelegt wird. "
114
+"Es ist möglich das Projekt zu laden, indem ein Nutzerprofil mit den selben "
115
+"Parametern\n"
116
+"wie das fehlende Profil, angelegt wird. "
117
118
#: projectaction.py:138
119
msgid "User Profiles can be created by selecting 'Edit->Profiles Manager'."
120
121
msgid "Opening"
122
msgstr "Öffnen"
123
124
-#: projectaction.py:238
125
+#: projectaction.py:276
126
msgid "Media files already present in project were opened!"
127
msgstr "Im Projekt bereits vorhandene Mediendateien wurden geöffnet!"
128
129
-#: projectaction.py:244
130
+#: projectaction.py:282
131
msgid ""
132
"Files already present:\n"
133
"\n"
134
135
"Bereits vorhandene Dateien:\n"
136
"\n"
137
138
-#: projectaction.py:442
139
-#, fuzzy
140
+#: projectaction.py:481
141
msgid "Selected folder contains files"
142
msgstr "Gewählter Ordner enthält Dateien"
143
144
-#: projectaction.py:443
145
+#: projectaction.py:482
146
msgid ""
147
"When saving a back-up snapshot of the project, the selected folder\n"
148
"has to be empty."
149
150
"Für das Sichern einer Sicherungskopie muss der gewählte Ordner\n"
151
"leer sein."
152
153
-#: projectaction.py:501
154
+#: projectaction.py:553
155
msgid "Copying project media assets"
156
msgstr "Kopiere Projektmediendaten"
157
158
-#: projectaction.py:502
159
-#, fuzzy
160
+#: projectaction.py:554
161
msgid "Saving project file"
162
msgstr "Sichere Projektdatei"
163
164
-#: projectaction.py:625
165
+#: projectaction.py:709
166
msgid "Project not found on disk"
167
msgstr "Projekt nicht gefunden"
168
169
-#: projectaction.py:626
170
+#: projectaction.py:710
171
msgid "Project can't be loaded."
172
msgstr "Projekt kann nicht geladen werden."
173
174
-#: projectaction.py:684
175
-#, fuzzy
176
+#: projectaction.py:718
177
+msgid "Project has not been saved since it was opened."
178
+msgstr "Projekt wurde seit dem Öffnen nicht gesichert."
179
+
180
+#: projectaction.py:723
181
+msgid "Project was saved less than a minute ago."
182
+msgstr "Projekt wurde vor weniger als einer Minute gesichert."
183
+
184
+#: projectaction.py:726
185
+msgid "Project was saved one minute ago."
186
+msgstr "Projekt wurde vor einer Minute gesichert."
187
+
188
+#: projectaction.py:728
189
+msgid "Project was saved "
190
+msgstr "Projekt wurde vor "
191
+
192
+#: projectaction.py:728
193
+msgid " minutes ago."
194
+msgstr " Minuten gesichert."
195
+
196
+#: projectaction.py:782
197
msgid "Render launch failed!"
198
msgstr "Renderstart fehlgeschlagen!"
199
200
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.mo -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.mo
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.po -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: PACKAGE VERSION\n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
6
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
7
"PO-Revision-Date: 2014-02-21 12:08+0200\n"
8
"Last-Translator: David Gámiz Jiménez <david.gamiz@gmail.com>\n"
9
"Language-Team: David Gamiz Jimenez\n"
10
11
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
12
"X-Generator: Virtaal 0.7.0\n"
13
14
-#: app.py:733
15
+#: app.py:758
16
msgid "Too small screen for this application."
17
msgstr "La pantalla es demasiado pequeña para esta aplicación."
18
19
-#: app.py:736
20
+#: app.py:761
21
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
22
msgstr ""
23
"La dimensión de pantalla mínima para esta aplicación es de 1152 x 768.\n"
24
25
-#: app.py:737
26
+#: app.py:762
27
msgid "Your screen dimensions are "
28
msgstr "Las dimensiones de su pantalla son "
29
30
-#: app.py:761
31
-msgid "Project has not been saved since it was opened."
32
-msgstr "El proyecto no ha sido salvado desde que se abrió."
33
-
34
-#: app.py:766
35
-msgid "Project was saved less than a minute ago."
36
-msgstr "El proyecto fue salvado hace menos de un minuto."
37
-
38
-#: app.py:769
39
-msgid "Project was saved one minute ago."
40
-msgstr "El proyecto fue salvado hace un minuto."
41
-
42
-#: app.py:771
43
-msgid "Project was saved "
44
-msgstr "El proyecto salvado "
45
-
46
-#: app.py:771
47
-msgid " minutes ago."
48
-msgstr " hace minutos."
49
-
50
-#: app.py:781 projectaction.py:327
51
+#: app.py:795 projectaction.py:366 projectaction.py:696
52
msgid "Project has not been saved previously"
53
msgstr "El proyecto no se ha salvado antes"
54
55
-#: app.py:782 projectaction.py:328
56
+#: app.py:796 projectaction.py:367 projectaction.py:697
57
msgid "Save project with File -> Save As before closing."
58
msgstr "Salvar el proyecto en un Archivo -> Salvar como antes de cerrar."
59
60
61
msgid "Opening"
62
msgstr "Abriendo"
63
64
-#: projectaction.py:238
65
+#: projectaction.py:276
66
msgid "Media files already present in project were opened!"
67
msgstr ""
68
69
-#: projectaction.py:244
70
+#: projectaction.py:282
71
#, fuzzy
72
msgid ""
73
"Files already present:\n"
74
"\n"
75
msgstr " ya existe!"
76
77
-#: projectaction.py:442
78
+#: projectaction.py:481
79
#, fuzzy
80
msgid "Selected folder contains files"
81
msgstr "Seleccionar carpeta para nuevos miniaturas."
82
83
-#: projectaction.py:443
84
+#: projectaction.py:482
85
msgid ""
86
"When saving a back-up snapshot of the project, the selected folder\n"
87
"has to be empty."
88
msgstr ""
89
90
-#: projectaction.py:501
91
+#: projectaction.py:553
92
msgid "Copying project media assets"
93
msgstr ""
94
95
-#: projectaction.py:502
96
+#: projectaction.py:554
97
#, fuzzy
98
msgid "Saving project file"
99
msgstr "¿Guardar proyecto '"
100
101
-#: projectaction.py:625
102
+#: projectaction.py:709
103
msgid "Project not found on disk"
104
msgstr "El proyecto no se encuentra en el disco"
105
106
-#: projectaction.py:626
107
+#: projectaction.py:710
108
msgid "Project can't be loaded."
109
msgstr "El proyecto no puede ser cargado."
110
111
-#: projectaction.py:684
112
+#: projectaction.py:718
113
+msgid "Project has not been saved since it was opened."
114
+msgstr "El proyecto no ha sido salvado desde que se abrió."
115
+
116
+#: projectaction.py:723
117
+msgid "Project was saved less than a minute ago."
118
+msgstr "El proyecto fue salvado hace menos de un minuto."
119
+
120
+#: projectaction.py:726
121
+msgid "Project was saved one minute ago."
122
+msgstr "El proyecto fue salvado hace un minuto."
123
+
124
+#: projectaction.py:728
125
+msgid "Project was saved "
126
+msgstr "El proyecto salvado "
127
+
128
+#: projectaction.py:728
129
+msgid " minutes ago."
130
+msgstr " hace minutos."
131
+
132
+#: projectaction.py:782
133
#, fuzzy
134
msgid "Render launch failed!"
135
msgstr "Render rango no definido!"
136
137
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
138
+#: projectaction.py:783 projectaction.py:797 tools/batchrendering.py:299
139
msgid "Error message: "
140
msgstr "Mensaje de error:"
141
142
-#: projectaction.py:698
143
+#: projectaction.py:796
144
msgid "Adding item to render queue failed!"
145
msgstr "¡Fallo al añadir un elemento a la cola de renderizado!"
146
147
-#: projectaction.py:717
148
+#: projectaction.py:815
149
msgid "Open.."
150
msgstr "Abrir…"
151
152
-#: projectaction.py:747
153
+#: projectaction.py:845
154
msgid "No file was selected"
155
msgstr "Ningún archivo seleccionado."
156
157
-#: projectaction.py:747
158
+#: projectaction.py:845
159
msgid "Select a numbered file to add an Image Sequence to Project."
160
msgstr ""
161
"Seleccione un archivo numerado para agregar una secuencia de imágenes de "
162
"Proyecto."
163
164
-#: projectaction.py:755
165
+#: projectaction.py:853
166
msgid "Not a sequence file!"
167
msgstr "¡No hay archivo de secuencia!"
168
169
-#: projectaction.py:755
170
+#: projectaction.py:853
171
msgid ""
172
"Selected file does not have a number part in it,\n"
173
"so it can't be an image sequence file."
174
175
"El archivo seleccionado no tiene un número de parte en el mismo, \n"
176
" so no puede ser un archivo de secuencia de imágenes."
177
178
-#: projectaction.py:806
179
+#: projectaction.py:904
180
msgid "Can't make home folder thumbnails folder"
181
msgstr "No se puede hacer la carpeta miniaturas de carpeta home"
182
183
-#: projectaction.py:807 dialogs.py:361
184
+#: projectaction.py:905 dialogs.py:361
185
msgid "Please create and select some other folder then '"
186
msgstr "Por favor, crear y seleccionar otra carpeta y luego '"
187
188
-#: projectaction.py:808
189
+#: projectaction.py:906
190
msgid "' as thumbnails folder"
191
msgstr "Como carpeta de miniaturas"
192
193
-#: projectaction.py:925 projectaction.py:927 projectaction.py:936
194
-#: projectaction.py:944 projectaction.py:951
195
+#: projectaction.py:1023 projectaction.py:1025 projectaction.py:1034
196
+#: projectaction.py:1042 projectaction.py:1049
197
msgid "N/A"
198
msgstr ""
199
200
-#: projectaction.py:940 guicomponents.py:1621
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/fi/LC_MESSAGES/flowblade.mo -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/fi/LC_MESSAGES/flowblade.mo
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/fi/LC_MESSAGES/flowblade.po -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/fi/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: PACKAGE VERSION\n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
6
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
7
"PO-Revision-Date: 2011-12-13 23:55+0200\n"
8
"Last-Translator: Janne Liljeblad <janne@janne-kx557aa-uuw-a6521-sc>\n"
9
"Language-Team: Finnish\n"
10
11
"Content-Transfer-Encoding: 8bit\n"
12
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
14
-#: app.py:733
15
+#: app.py:758
16
msgid "Too small screen for this application."
17
msgstr "Näyttö on liian pieni tälle ohjelmalle."
18
19
-#: app.py:736
20
+#: app.py:761
21
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
22
msgstr "Minimi näyttökoko tällle ohjelmalle on 1152 x 768.\n"
23
24
-#: app.py:737
25
+#: app.py:762
26
msgid "Your screen dimensions are "
27
msgstr "Sinun näyttösi koko on "
28
29
-#: app.py:761
30
-msgid "Project has not been saved since it was opened."
31
-msgstr "Projektia ei ole tallennettu aikaisemmin."
32
-
33
-#: app.py:766
34
-msgid "Project was saved less than a minute ago."
35
-msgstr "Projekti tallennettiin viimeksi alle minuutti sitten."
36
-
37
-#: app.py:769
38
-msgid "Project was saved one minute ago."
39
-msgstr "Projekti tallennettiin viimeksi minuutti sitten."
40
-
41
-#: app.py:771
42
-msgid "Project was saved "
43
-msgstr "Projektia ei ole tallennettu aikaisemmin"
44
-
45
-#: app.py:771
46
-msgid " minutes ago."
47
-msgstr " minuuttia sitten."
48
-
49
-#: app.py:781 projectaction.py:327
50
+#: app.py:795 projectaction.py:366 projectaction.py:696
51
msgid "Project has not been saved previously"
52
msgstr "Projektia ei ole tallennettu aikaisemmin"
53
54
-#: app.py:782 projectaction.py:328
55
+#: app.py:796 projectaction.py:367 projectaction.py:697
56
msgid "Save project with File -> Save As before closing."
57
msgstr ""
58
"Tallenna projekti valinnalla Tiedosto -> Tallenna nimellä ennen sulkemista."
59
60
#: projectaction.py:111
61
msgid "Media asset was missing!"
62
-msgstr ""
63
+msgstr "Mediaa ei löytynyt!"
64
65
#: projectaction.py:112
66
msgid "Path of missing asset:"
67
68
msgid "Opening"
69
msgstr "Avaa"
70
71
-#: projectaction.py:238
72
+#: projectaction.py:276
73
msgid "Media files already present in project were opened!"
74
msgstr "Avattiin media tiedostoja, jotka jo ovat projektissa"
75
76
-#: projectaction.py:244
77
+#: projectaction.py:282
78
msgid ""
79
"Files already present:\n"
80
"\n"
81
82
"Projektissa jo olevat tiedostot:\n"
83
"\n"
84
85
-#: projectaction.py:442
86
+#: projectaction.py:481
87
msgid "Selected folder contains files"
88
msgstr "Valitussa kansiossa on tiedostoja"
89
90
-#: projectaction.py:443
91
+#: projectaction.py:482
92
msgid ""
93
"When saving a back-up snapshot of the project, the selected folder\n"
94
"has to be empty."
95
96
"Kun tallennetaan projektia ja mediaa yhtä aikaa\n"
97
"täytyy kansion olla tyhjä."
98
99
-#: projectaction.py:501
100
+#: projectaction.py:553
101
msgid "Copying project media assets"
102
msgstr "Kopioidaan mediaa"
103
104
-#: projectaction.py:502
105
+#: projectaction.py:554
106
msgid "Saving project file"
107
msgstr "Tallennetaan projektia"
108
109
-#: projectaction.py:625
110
+#: projectaction.py:709
111
msgid "Project not found on disk"
112
msgstr "Projektia ei löytynyt kovalevyltä"
113
114
-#: projectaction.py:626
115
+#: projectaction.py:710
116
msgid "Project can't be loaded."
117
msgstr "Projektia ei voida ladata."
118
119
-#: projectaction.py:684
120
-#, fuzzy
121
+#: projectaction.py:718
122
+msgid "Project has not been saved since it was opened."
123
+msgstr "Projektia ei ole tallennettu aikaisemmin."
124
+
125
+#: projectaction.py:723
126
+msgid "Project was saved less than a minute ago."
127
+msgstr "Projekti tallennettiin viimeksi alle minuutti sitten."
128
+
129
+#: projectaction.py:726
130
+msgid "Project was saved one minute ago."
131
+msgstr "Projekti tallennettiin viimeksi minuutti sitten."
132
+
133
+#: projectaction.py:728
134
+msgid "Project was saved "
135
+msgstr "Projektia ei ole tallennettu aikaisemmin"
136
+
137
+#: projectaction.py:728
138
+msgid " minutes ago."
139
+msgstr " minuuttia sitten."
140
+
141
+#: projectaction.py:782
142
msgid "Render launch failed!"
143
-msgstr "Renderöinti alue ei ole määritelty"
144
+msgstr "Renderöinnin aloitus epäonnistui!"
145
146
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
147
+#: projectaction.py:783 projectaction.py:797 tools/batchrendering.py:299
148
msgid "Error message: "
149
msgstr "Virhe viesti"
150
151
-#: projectaction.py:698
152
+#: projectaction.py:796
153
msgid "Adding item to render queue failed!"
154
msgstr ""
155
156
-#: projectaction.py:717
157
+#: projectaction.py:815
158
msgid "Open.."
159
msgstr "Avaa"
160
161
-#: projectaction.py:747
162
+#: projectaction.py:845
163
msgid "No file was selected"
164
msgstr "Tiedostoa ei valittu"
165
166
-#: projectaction.py:747
167
+#: projectaction.py:845
168
msgid "Select a numbered file to add an Image Sequence to Project."
169
msgstr "Valitse numeroitu tiedosto lisätäksesi kuvasarjan projektiin"
170
171
-#: projectaction.py:755
172
+#: projectaction.py:853
173
msgid "Not a sequence file!"
174
msgstr "Tiedosto ei kuulu kuvasarjaan"
175
176
-#: projectaction.py:755
177
+#: projectaction.py:853
178
msgid ""
179
"Selected file does not have a number part in it,\n"
180
"so it can't be an image sequence file."
181
182
"Valitussa tiedostossa ei ole numero osuutta,\n"
183
"joten se ei voi olla osa kuvasarjaa."
184
185
-#: projectaction.py:806
186
+#: projectaction.py:904
187
msgid "Can't make home folder thumbnails folder"
188
msgstr "Et voi valita kotikansiotasi mediaikoni kansioksi"
189
190
-#: projectaction.py:807 dialogs.py:361
191
+#: projectaction.py:905 dialogs.py:361
192
msgid "Please create and select some other folder then '"
193
msgstr "Luo ja valitse joku toinen kansio kuin '"
194
195
-#: projectaction.py:808
196
+#: projectaction.py:906
197
msgid "' as thumbnails folder"
198
msgstr "' mediaikoni kansioksi."
199
200
-#: projectaction.py:925 projectaction.py:927 projectaction.py:936
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.mo -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.mo
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.po -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: PACKAGE VERSION\n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
6
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
7
"PO-Revision-Date: 2013-09-20 18:54+0200\n"
8
"Last-Translator: Loïc Vanderstichelen <lv@loicvanderstichelen.com>\n"
9
"Language-Team: French\n"
10
11
"Content-Transfer-Encoding: 8bit\n"
12
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
13
14
-#: app.py:733
15
+#: app.py:758
16
msgid "Too small screen for this application."
17
msgstr "Votre écran est trop petit pour cette application."
18
19
-#: app.py:736
20
+#: app.py:761
21
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
22
msgstr "La résolution minimum pour cet application est de 1152 x 768.\n"
23
24
-#: app.py:737
25
+#: app.py:762
26
msgid "Your screen dimensions are "
27
msgstr "Votre résolution actuelle est "
28
29
-#: app.py:761
30
-msgid "Project has not been saved since it was opened."
31
-msgstr "Ce projet n'a pas été enregistré depuis qu'il a été ouvert."
32
-
33
-#: app.py:766
34
-msgid "Project was saved less than a minute ago."
35
-msgstr "Le projet a été sauvegardé il y a moins d'une minute."
36
-
37
-#: app.py:769
38
-msgid "Project was saved one minute ago."
39
-msgstr "Le projet a été sauvegardé il y a une minute."
40
-
41
-#: app.py:771
42
-msgid "Project was saved "
43
-msgstr "Le projet a été sauvegardé il y a "
44
-
45
-#: app.py:771
46
-msgid " minutes ago."
47
-msgstr " minutes."
48
-
49
-#: app.py:781 projectaction.py:327
50
+#: app.py:795 projectaction.py:366 projectaction.py:696
51
msgid "Project has not been saved previously"
52
msgstr "Le projet n'a jamais été sauvegardé"
53
54
-#: app.py:782 projectaction.py:328
55
+#: app.py:796 projectaction.py:367 projectaction.py:697
56
msgid "Save project with File -> Save As before closing."
57
msgstr "Sauvegardez le projet avec Fichier -> Enregistrer sous."
58
59
60
msgid "Opening"
61
msgstr "Ouverture"
62
63
-#: projectaction.py:238
64
+#: projectaction.py:276
65
msgid "Media files already present in project were opened!"
66
msgstr ""
67
68
-#: projectaction.py:244
69
+#: projectaction.py:282
70
#, fuzzy
71
msgid ""
72
"Files already present:\n"
73
"\n"
74
msgstr " existe déjà!"
75
76
-#: projectaction.py:442
77
+#: projectaction.py:481
78
#, fuzzy
79
msgid "Selected folder contains files"
80
msgstr "Sélectionner un dossier pour les nouvelles miniatures"
81
82
-#: projectaction.py:443
83
+#: projectaction.py:482
84
msgid ""
85
"When saving a back-up snapshot of the project, the selected folder\n"
86
"has to be empty."
87
msgstr ""
88
89
-#: projectaction.py:501
90
+#: projectaction.py:553
91
msgid "Copying project media assets"
92
msgstr ""
93
94
-#: projectaction.py:502
95
+#: projectaction.py:554
96
#, fuzzy
97
msgid "Saving project file"
98
msgstr "Sauvegarder le projet '"
99
100
-#: projectaction.py:625
101
+#: projectaction.py:709
102
msgid "Project not found on disk"
103
msgstr "Le projet n'a pas été trouvé sur le disque"
104
105
-#: projectaction.py:626
106
+#: projectaction.py:710
107
msgid "Project can't be loaded."
108
msgstr "Le projet ne peut pas être chargé."
109
110
-#: projectaction.py:684
111
+#: projectaction.py:718
112
+msgid "Project has not been saved since it was opened."
113
+msgstr "Ce projet n'a pas été enregistré depuis qu'il a été ouvert."
114
+
115
+#: projectaction.py:723
116
+msgid "Project was saved less than a minute ago."
117
+msgstr "Le projet a été sauvegardé il y a moins d'une minute."
118
+
119
+#: projectaction.py:726
120
+msgid "Project was saved one minute ago."
121
+msgstr "Le projet a été sauvegardé il y a une minute."
122
+
123
+#: projectaction.py:728
124
+msgid "Project was saved "
125
+msgstr "Le projet a été sauvegardé il y a "
126
+
127
+#: projectaction.py:728
128
+msgid " minutes ago."
129
+msgstr " minutes."
130
+
131
+#: projectaction.py:782
132
#, fuzzy
133
msgid "Render launch failed!"
134
msgstr "Zone de rendu non définie!"
135
136
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
137
+#: projectaction.py:783 projectaction.py:797 tools/batchrendering.py:299
138
#, fuzzy
139
msgid "Error message: "
140
msgstr "Message d'erreur: "
141
142
-#: projectaction.py:698
143
+#: projectaction.py:796
144
msgid "Adding item to render queue failed!"
145
msgstr "Echec de l'ajout d'élément à la liste de rendu!"
146
147
-#: projectaction.py:717
148
+#: projectaction.py:815
149
msgid "Open.."
150
msgstr "Ouvrir..."
151
152
-#: projectaction.py:747
153
+#: projectaction.py:845
154
msgid "No file was selected"
155
msgstr "Aucun fichier sélectionné"
156
157
-#: projectaction.py:747
158
+#: projectaction.py:845
159
msgid "Select a numbered file to add an Image Sequence to Project."
160
msgstr ""
161
"Sélectionnez un fichier numéroté pour ajouter une séquence d'images au "
162
"projet."
163
164
-#: projectaction.py:755
165
+#: projectaction.py:853
166
msgid "Not a sequence file!"
167
msgstr "Ce n'est pas un fichier de séquence!"
168
169
-#: projectaction.py:755
170
+#: projectaction.py:853
171
msgid ""
172
"Selected file does not have a number part in it,\n"
173
"so it can't be an image sequence file."
174
175
"Le fichier sélectionné ne contient pas de numérotation,\n"
176
"il ne peut donc pas constituer une séquence d'images."
177
178
-#: projectaction.py:806
179
+#: projectaction.py:904
180
msgid "Can't make home folder thumbnails folder"
181
msgstr "Le dossier home ne peut pas être le dossier des miniatures"
182
183
-#: projectaction.py:807 dialogs.py:361
184
+#: projectaction.py:905 dialogs.py:361
185
msgid "Please create and select some other folder then '"
186
msgstr "Créez et sélectionnez un autre dossier '"
187
188
-#: projectaction.py:808
189
+#: projectaction.py:906
190
msgid "' as thumbnails folder"
191
msgstr "' comme dossier de miniatures"
192
193
-#: projectaction.py:925 projectaction.py:927 projectaction.py:936
194
-#: projectaction.py:944 projectaction.py:951
195
+#: projectaction.py:1023 projectaction.py:1025 projectaction.py:1034
196
+#: projectaction.py:1042 projectaction.py:1049
197
msgid "N/A"
198
msgstr ""
199
200
-#: projectaction.py:940 guicomponents.py:1621
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/hu/LC_MESSAGES/flowblade.mo -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/hu/LC_MESSAGES/flowblade.mo
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/hu/LC_MESSAGES/flowblade.po -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/hu/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: \n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
6
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
7
"PO-Revision-Date: 2016-08-04 21:35+0100\n"
8
"Last-Translator: Péter Gábor <ptrg@freemail.hu>\n"
9
"Language-Team: \n"
10
11
"Content-Transfer-Encoding: 8bit\n"
12
"X-Generator: Poedit 1.5.4\n"
13
14
-#: app.py:733
15
+#: app.py:758
16
msgid "Too small screen for this application."
17
msgstr "Túl kicsi a képernyő az alkalmazás számára."
18
19
-#: app.py:736
20
+#: app.py:761
21
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
22
msgstr "A minimális képernyőfelbontás ezen alkalmazás számára 1152 x 768.\n"
23
24
-#: app.py:737
25
+#: app.py:762
26
msgid "Your screen dimensions are "
27
msgstr "Az ön képernyőjének felbontása "
28
29
-#: app.py:761
30
-msgid "Project has not been saved since it was opened."
31
-msgstr "A projekt még nem volt mentve a megnyitás óta."
32
-
33
-#: app.py:766
34
-msgid "Project was saved less than a minute ago."
35
-msgstr "A projekt kevesebb mint egy perce volt mentve"
36
-
37
-#: app.py:769
38
-msgid "Project was saved one minute ago."
39
-msgstr "A projekt egy perce volt mentve."
40
-
41
-#: app.py:771
42
-msgid "Project was saved "
43
-msgstr "A projekt mentése "
44
-
45
-#: app.py:771
46
-msgid " minutes ago."
47
-msgstr " perce történt."
48
-
49
-#: app.py:781 projectaction.py:327
50
+#: app.py:795 projectaction.py:366 projectaction.py:696
51
msgid "Project has not been saved previously"
52
msgstr "A projekt korábban még nem volt mentve"
53
54
-#: app.py:782 projectaction.py:328
55
+#: app.py:796 projectaction.py:367 projectaction.py:697
56
msgid "Save project with File -> Save As before closing."
57
msgstr ""
58
"Mentse a projektet a Fájl -> Mentés másként menüpont használatával mielőtt "
59
60
msgid "Opening"
61
msgstr "Megnyitás"
62
63
-#: projectaction.py:238
64
+#: projectaction.py:276
65
msgid "Media files already present in project were opened!"
66
msgstr "A projektben már jelenlévő fájlok lettek megnyitva!"
67
68
-#: projectaction.py:244
69
+#: projectaction.py:282
70
msgid ""
71
"Files already present:\n"
72
"\n"
73
74
"Már jelenlévő fájlok:\n"
75
"\n"
76
77
-#: projectaction.py:442
78
+#: projectaction.py:481
79
msgid "Selected folder contains files"
80
msgstr "A választott könyvtár fájlokat tartalmaz"
81
82
-#: projectaction.py:443
83
+#: projectaction.py:482
84
msgid ""
85
"When saving a back-up snapshot of the project, the selected folder\n"
86
"has to be empty."
87
88
"Egy projekt állapotának mentésekor a választott mappának\n"
89
"üresnek kell lennie."
90
91
-#: projectaction.py:501
92
+#: projectaction.py:553
93
msgid "Copying project media assets"
94
msgstr "A projekt média összetevőinek másolása"
95
96
-#: projectaction.py:502
97
+#: projectaction.py:554
98
msgid "Saving project file"
99
msgstr "Projekt fájl mentése"
100
101
-#: projectaction.py:625
102
+#: projectaction.py:709
103
msgid "Project not found on disk"
104
msgstr "A projekt nem található a lemezen"
105
106
-#: projectaction.py:626
107
+#: projectaction.py:710
108
msgid "Project can't be loaded."
109
msgstr "A projekt nem tölthető be."
110
111
-#: projectaction.py:684
112
+#: projectaction.py:718
113
+msgid "Project has not been saved since it was opened."
114
+msgstr "A projekt még nem volt mentve a megnyitás óta."
115
+
116
+#: projectaction.py:723
117
+msgid "Project was saved less than a minute ago."
118
+msgstr "A projekt kevesebb mint egy perce volt mentve"
119
+
120
+#: projectaction.py:726
121
+msgid "Project was saved one minute ago."
122
+msgstr "A projekt egy perce volt mentve."
123
+
124
+#: projectaction.py:728
125
+msgid "Project was saved "
126
+msgstr "A projekt mentése "
127
+
128
+#: projectaction.py:728
129
+msgid " minutes ago."
130
+msgstr " perce történt."
131
+
132
+#: projectaction.py:782
133
msgid "Render launch failed!"
134
msgstr "Nem sikerült elindítani a renderelést!"
135
136
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
137
+#: projectaction.py:783 projectaction.py:797 tools/batchrendering.py:299
138
msgid "Error message: "
139
msgstr "Hibaüzenet: "
140
141
-#: projectaction.py:698
142
+#: projectaction.py:796
143
msgid "Adding item to render queue failed!"
144
msgstr "Nem sikerült hozzáadni az elemet a renderelés várólistájához!"
145
146
-#: projectaction.py:717
147
+#: projectaction.py:815
148
msgid "Open.."
149
msgstr "Megnyitás..."
150
151
-#: projectaction.py:747
152
+#: projectaction.py:845
153
msgid "No file was selected"
154
msgstr "Nem lett fájl kiválasztva"
155
156
-#: projectaction.py:747
157
+#: projectaction.py:845
158
msgid "Select a numbered file to add an Image Sequence to Project."
159
msgstr ""
160
"Válasszon egy sorszámozott fájlt, hogy képsorozatot adjon a projekthez."
161
162
-#: projectaction.py:755
163
+#: projectaction.py:853
164
msgid "Not a sequence file!"
165
msgstr "Nem jelenetfájl!"
166
167
-#: projectaction.py:755
168
+#: projectaction.py:853
169
msgid ""
170
"Selected file does not have a number part in it,\n"
171
"so it can't be an image sequence file."
172
173
"A kiválasztott fájl nem tartalmaz számot a nevében,\n"
174
"így nem is lehet képsorozat része."
175
176
-#: projectaction.py:806
177
+#: projectaction.py:904
178
msgid "Can't make home folder thumbnails folder"
179
msgstr "A \"Saját mappa\" nem állítható be a bélyegképek mappájaként"
180
181
-#: projectaction.py:807 dialogs.py:361
182
+#: projectaction.py:905 dialogs.py:361
183
msgid "Please create and select some other folder then '"
184
msgstr "Hozzon létre és válasszon egy másik mappát e helyett '"
185
186
-#: projectaction.py:808
187
+#: projectaction.py:906
188
msgid "' as thumbnails folder"
189
msgstr "' a bélyegképek számára"
190
191
-#: projectaction.py:925 projectaction.py:927 projectaction.py:936
192
-#: projectaction.py:944 projectaction.py:951
193
+#: projectaction.py:1023 projectaction.py:1025 projectaction.py:1034
194
+#: projectaction.py:1042 projectaction.py:1049
195
msgid "N/A"
196
msgstr "N/A"
197
198
-#: projectaction.py:940 guicomponents.py:1621
199
+#: projectaction.py:1038 guicomponents.py:1745
200
msgid "Yes"
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/it/LC_MESSAGES/flowblade.mo -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/it/LC_MESSAGES/flowblade.mo
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/locale/it/LC_MESSAGES/flowblade.po -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/locale/it/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: Floblade Italian Translation 0.14\n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2016-09-15 21:26+0300\n"
6
+"POT-Creation-Date: 2016-12-05 10:12+0200\n"
7
"PO-Revision-Date: 2014-09-15 23:42+0100\n"
8
"Last-Translator: Massimo Stella <info@massimostella.it>\n"
9
"Language-Team: Italiano\n"
10
11
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
12
"X-Generator: Poedit 1.5.4\n"
13
14
-#: app.py:733
15
+#: app.py:758
16
msgid "Too small screen for this application."
17
msgstr "Lo schermo è troppo piccolo per questa applicazione."
18
19
-#: app.py:736
20
+#: app.py:761
21
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
22
msgstr "La risoluzione minima per questa applicazione è 1152 x 768.\n"
23
24
-#: app.py:737
25
+#: app.py:762
26
msgid "Your screen dimensions are "
27
msgstr "La risoluzione corrente è"
28
29
-#: app.py:761
30
-msgid "Project has not been saved since it was opened."
31
-msgstr "Questo progetto non è ancora stato salvato dall'apertura."
32
-
33
-#: app.py:766
34
-msgid "Project was saved less than a minute ago."
35
-msgstr "Il progetto è stato salvato meno di un minuto fa."
36
-
37
-#: app.py:769
38
-msgid "Project was saved one minute ago."
39
-msgstr "Il progetto è stato salvato un minuto fa."
40
-
41
-#: app.py:771
42
-msgid "Project was saved "
43
-msgstr "Il progetto è stato salvato"
44
-
45
-#: app.py:771
46
-msgid " minutes ago."
47
-msgstr " minuti fa."
48
-
49
-#: app.py:781 projectaction.py:327
50
+#: app.py:795 projectaction.py:366 projectaction.py:696
51
msgid "Project has not been saved previously"
52
msgstr "Il progetto non è mai stato salvato"
53
54
-#: app.py:782 projectaction.py:328
55
+#: app.py:796 projectaction.py:367 projectaction.py:697
56
msgid "Save project with File -> Save As before closing."
57
msgstr "Salva il progetto da File -> Salva con nome"
58
59
60
msgid "Opening"
61
msgstr "Apertura"
62
63
-#: projectaction.py:238
64
+#: projectaction.py:276
65
msgid "Media files already present in project were opened!"
66
msgstr "File multimediali già presenti nel progetto sono stati aperti!"
67
68
-#: projectaction.py:244
69
+#: projectaction.py:282
70
msgid ""
71
"Files already present:\n"
72
"\n"
73
74
"File già esistenti:\n"
75
"\n"
76
77
-#: projectaction.py:442
78
+#: projectaction.py:481
79
#, fuzzy
80
msgid "Selected folder contains files"
81
msgstr "Seleziona cartella per le nuove miniature."
82
83
-#: projectaction.py:443
84
+#: projectaction.py:482
85
msgid ""
86
"When saving a back-up snapshot of the project, the selected folder\n"
87
"has to be empty."
88
msgstr ""
89
90
-#: projectaction.py:501
91
+#: projectaction.py:553
92
msgid "Copying project media assets"
93
msgstr ""
94
95
-#: projectaction.py:502
96
+#: projectaction.py:554
97
#, fuzzy
98
msgid "Saving project file"
99
msgstr "Salvo il progetto '"
100
101
-#: projectaction.py:625
102
+#: projectaction.py:709
103
msgid "Project not found on disk"
104
msgstr "Il progetto non è stato trovato sul disco"
105
106
-#: projectaction.py:626
107
+#: projectaction.py:710
108
msgid "Project can't be loaded."
109
msgstr "Il progetto non può essere caricato."
110
111
-#: projectaction.py:684
112
+#: projectaction.py:718
113
+msgid "Project has not been saved since it was opened."
114
+msgstr "Questo progetto non è ancora stato salvato dall'apertura."
115
+
116
+#: projectaction.py:723
117
+msgid "Project was saved less than a minute ago."
118
+msgstr "Il progetto è stato salvato meno di un minuto fa."
119
+
120
+#: projectaction.py:726
121
+msgid "Project was saved one minute ago."
122
+msgstr "Il progetto è stato salvato un minuto fa."
123
+
124
+#: projectaction.py:728
125
+msgid "Project was saved "
126
+msgstr "Il progetto è stato salvato"
127
+
128
+#: projectaction.py:728
129
+msgid " minutes ago."
130
+msgstr " minuti fa."
131
+
132
+#: projectaction.py:782
133
#, fuzzy
134
msgid "Render launch failed!"
135
msgstr "Area di calcolo non definita!"
136
137
-#: projectaction.py:685 projectaction.py:699 tools/batchrendering.py:296
138
+#: projectaction.py:783 projectaction.py:797 tools/batchrendering.py:299
139
msgid "Error message: "
140
msgstr "Messaggio d'errore: "
141
142
-#: projectaction.py:698
143
+#: projectaction.py:796
144
msgid "Adding item to render queue failed!"
145
msgstr "Aggiunta alla coda dei render fallita!"
146
147
-#: projectaction.py:717
148
+#: projectaction.py:815
149
msgid "Open.."
150
msgstr "Apri..."
151
152
-#: projectaction.py:747
153
+#: projectaction.py:845
154
msgid "No file was selected"
155
msgstr "Nessun file selezionato"
156
157
-#: projectaction.py:747
158
+#: projectaction.py:845
159
msgid "Select a numbered file to add an Image Sequence to Project."
160
msgstr "Selezionare un file numerato per aggiungere una sequenza di immagini"
161
162
-#: projectaction.py:755
163
+#: projectaction.py:853
164
msgid "Not a sequence file!"
165
msgstr "Questa non è una sequenza!"
166
167
-#: projectaction.py:755
168
+#: projectaction.py:853
169
msgid ""
170
"Selected file does not have a number part in it,\n"
171
"so it can't be an image sequence file."
172
173
"Il file selezionato non è numerato, \n"
174
"quindi non può essere una sequenza di immagini."
175
176
-#: projectaction.py:806
177
+#: projectaction.py:904
178
msgid "Can't make home folder thumbnails folder"
179
msgstr "Non si può usare la carella Home per le miniature"
180
181
-#: projectaction.py:807 dialogs.py:361
182
+#: projectaction.py:905 dialogs.py:361
183
msgid "Please create and select some other folder then '"
184
msgstr "Creare e selezionare una cartella differente da '"
185
186
-#: projectaction.py:808
187
+#: projectaction.py:906
188
msgid "' as thumbnails folder"
189
msgstr "' per le miniature"
190
191
-#: projectaction.py:925 projectaction.py:927 projectaction.py:936
192
-#: projectaction.py:944 projectaction.py:951
193
+#: projectaction.py:1023 projectaction.py:1025 projectaction.py:1034
194
+#: projectaction.py:1042 projectaction.py:1049
195
msgid "N/A"
196
msgstr ""
197
198
-#: projectaction.py:940 guicomponents.py:1621
199
+#: projectaction.py:1038 guicomponents.py:1745
200
msgid "Yes"
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/medialinker.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/medialinker.py
Changed
65
1
2
import sys
3
import threading
4
5
+import gi
6
+gi.require_version('Gtk', '3.0')
7
+gi.require_version('PangoCairo', '1.0')
8
from gi.repository import Gtk, Gdk, GdkPixbuf
9
from gi.repository import Pango, GObject
10
11
12
13
linker_window = None
14
target_project = None
15
+last_media_dir = None
16
media_assets = []
17
18
NO_PROJECT_AT_LAUNCH = "##&&noproject&&##"
19
20
linker_window.project_label.set_text(self.filename)
21
linker_window.set_active_state()
22
linker_window.update_files_info()
23
+ linker_window.load_button.set_sensitive(False)
24
Gdk.threads_leave()
25
26
27
28
load_button = Gtk.Button(_("Load Project For Relinking"))
29
load_button.connect("clicked",
30
lambda w: self.load_button_clicked())
31
-
32
+ self.load_button = load_button
33
project_row = Gtk.HBox(False, 2)
34
project_row.pack_start(load_button, False, False, 0)
35
project_row.pack_start(Gtk.Label(), True, True, 0)
36
37
file_name = os.path.basename(media_asset.orig_path)
38
dialogs.media_file_dialog(_("Select Media File To Relink To") + " " + file_name,
39
_select_relink_path_dialog_callback, False,
40
- media_asset, linker_window)
41
+ media_asset, linker_window, last_media_dir)
42
43
def _select_relink_path_dialog_callback(file_select, response_id, media_asset):
44
filenames = file_select.get_filenames()
45
46
return
47
48
media_asset.relink_path = filenames[0]
49
-
50
+ folder, file_name = os.path.split(filenames[0])
51
+
52
+ global last_media_dir
53
+ last_media_dir = folder
54
+
55
if media_asset.media_type == appconsts.IMAGE_SEQUENCE: # img seqs need formatted path
56
if editorstate.mlt_version_is_equal_or_greater("0.8.5"):
57
new_style = True
58
else:
59
new_style = False
60
resource_name_str = utils.get_img_seq_resource_name(filenames[0], new_style)
61
- folder, file_name = os.path.split(filenames[0])
62
media_asset.relink_path = folder + "/" + resource_name_str
63
64
linker_window.relink_list.fill_data_model()
65
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/medialog.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/medialog.py
Changed
18
1
2
3
sorting_order = TIME_SORT
4
5
+range_log_notebook_index = 1 # this is set 0 for 2 window mode
6
7
class MediaLogEvent:
8
def __init__(self, event_type, mark_in, mark_out, name, path):
9
10
def _update_list_view(log_event):
11
widgets.media_log_view.fill_data_model()
12
max_val = widgets.media_log_view.treeview.get_vadjustment().get_upper()
13
- gui.middle_notebook.set_current_page(1)
14
+ gui.middle_notebook.set_current_page(range_log_notebook_index)
15
view_group = get_current_filtered_events()
16
event_index = view_group.index(log_event)
17
widgets.media_log_view.treeview.get_selection().select_path(str(event_index))
18
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/middlebar.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/middlebar.py
Changed
191
1
2
3
from gi.repository import Gtk
4
5
+import appconsts
6
import audiomonitoring
7
import batchrendering
8
import editevent
9
10
fill_with_TC_LEFT_pattern(w.edit_buttons_row, w)
11
w.window.show_all()
12
13
- editorpersistance.prefs.midbar_tc_left = True
14
+ editorpersistance.prefs.midbar_layout = appconsts.MIDBAR_TC_LEFT
15
editorpersistance.save()
16
17
def _show_buttons_TC_MIDDLE_layout(widget):
18
19
fill_with_TC_MIDDLE_pattern(w.edit_buttons_row, w)
20
w.window.show_all()
21
22
- editorpersistance.prefs.midbar_tc_left = False
23
+ editorpersistance.prefs.midbar_layout = appconsts.MIDBAR_TC_CENTER
24
editorpersistance.save()
25
26
+def _show_buttons_COMPONETS_CENTERED_layout(widget):
27
+ global w
28
+ w = gui.editor_window
29
+ if w == None:
30
+ return
31
+ if widget.get_active() == False:
32
+ return
33
+
34
+ _clear_container(w.edit_buttons_row)
35
+ _create_buttons(w)
36
+ fill_with_COMPONETS_CENTERED_pattern(w.edit_buttons_row, w)
37
+ w.window.show_all()
38
+
39
+ editorpersistance.prefs.midbar_layout = appconsts.MIDBAR_COMPONENTS_CENTERED
40
+ editorpersistance.save()
41
+
42
def _show_monitor_info_toggled(widget):
43
editorpersistance.prefs.show_sequence_profile = widget.get_active()
44
editorpersistance.save()
45
46
editor_window.zoom_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "zoom_out.png"), updater.zoom_out)
47
editor_window.zoom_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "zoom_length.png"), updater.zoom_project_length)
48
editor_window.zoom_buttons.widget.set_tooltip_text(_("Zoom In - Mouse Middle Scroll\n Zoom Out - Mouse Middle Scroll\n Zoom Length - Mouse Middle Click"))
49
-
50
+
51
editor_window.edit_buttons = glassbuttons.GlassButtonsGroup(46, 23, 2, 4, 5)
52
editor_window.edit_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "dissolve.png"), tlineaction.add_transition_pressed)
53
editor_window.edit_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "cut.png"), tlineaction.cut_pressed)
54
editor_window.edit_buttons.widget.set_tooltip_text(_("Add Rendered Transition - 2 clips selected\nAdd Rendered Fade - 1 clip selected\nCut - X"))
55
+
56
+ editor_window.edit_buttons_3 = glassbuttons.GlassButtonsGroup(46, 23, 2, 4, 5)
57
+ editor_window.edit_buttons_3.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "splice_out.png"), tlineaction.splice_out_button_pressed)
58
+ editor_window.edit_buttons_3.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "lift.png"), tlineaction.lift_button_pressed)
59
+ editor_window.edit_buttons_3.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "delete_range.png"), tlineaction.delete_range_button_pressed)
60
+ editor_window.edit_buttons_3.widget.set_tooltip_text(_("Splice Out - Delete\nLift\nDelete Range"))
61
62
editor_window.edit_buttons_2 = glassbuttons.GlassButtonsGroup(46, 23, 2, 4, 5)
63
- editor_window.edit_buttons_2.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "splice_out.png"), tlineaction.splice_out_button_pressed)
64
- editor_window.edit_buttons_2.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "lift.png"), tlineaction.lift_button_pressed)
65
- #editor_window.edit_buttons_2.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "delete_range.png"), tlineaction.append_button_pressed)
66
editor_window.edit_buttons_2.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "resync.png"), tlineaction.resync_button_pressed)
67
editor_window.edit_buttons_2.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "split_audio.png"), tlineaction.split_audio_button_pressed)
68
- editor_window.edit_buttons_2.widget.set_tooltip_text(_("Splice Out - Delete\nLift\nResync Selected\nSplit Audio"))
69
-
70
+ editor_window.edit_buttons_2.widget.set_tooltip_text(_("Resync Selected\nSplit Audio"))
71
+
72
editor_window.monitor_insert_buttons = glassbuttons.GlassButtonsGroup(46, 23, 2, 4, 5)
73
editor_window.monitor_insert_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "overwrite_range.png"), tlineaction.range_overwrite_pressed)
74
editor_window.monitor_insert_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "overwrite_clip.png"), tlineaction.three_point_overwrite_pressed)
75
editor_window.monitor_insert_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "insert_clip.png"), tlineaction.insert_button_pressed)
76
editor_window.monitor_insert_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "append_clip.png"), tlineaction.append_button_pressed)
77
editor_window.monitor_insert_buttons.widget.set_tooltip_text(_("Overwrite Range\nOverwrite Clip - T\nInsert Clip - Y\nAppend Clip - U"))
78
-
79
+
80
editor_window.undo_redo = glassbuttons.GlassButtonsGroup(28, 23, 2, 2, 7)
81
editor_window.undo_redo.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "undo.png"), undo.do_undo_and_repaint)
82
editor_window.undo_redo.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "redo.png"), undo.do_redo_and_repaint)
83
editor_window.undo_redo.widget.set_tooltip_text(_("Undo - Ctrl + Z\nRedo - Ctrl + Y"))
84
-
85
- editor_window.tools_buttons = glassbuttons.GlassButtonsGroup(46, 23, 2, 14, 7)
86
+
87
+ editor_window.tools_buttons = glassbuttons.GlassButtonsGroup(30, 23, 2, 14, 7)
88
editor_window.tools_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "open_mixer.png"), audiomonitoring.show_audio_monitor)
89
editor_window.tools_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "open_titler.png"), titler.show_titler)
90
editor_window.tools_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "open_gmic.png"), gmic.launch_gmic)
91
editor_window.tools_buttons.add_button(cairo.ImageSurface.create_from_png(IMG_PATH + "open_renderqueue.png"), lambda :batchrendering.launch_batch_rendering())
92
editor_window.tools_buttons.widget.set_tooltip_text(_("Audio Mixer\nTitler\nG'Mic Effects\nBatch Render Queue"))
93
+ editor_window.tools_buttons.no_decorations = True
94
+
95
if editorstate.audio_monitoring_available == False:
96
editor_window.tools_buttons.sensitive[0] = False
97
editor_window.tools_buttons.widget.set_tooltip_text(_("Audio Mixer(not available)\nTitler"))
98
99
buttons_row.pack_start(w.big_TC.widget, False, True, 0)
100
buttons_row.pack_start(guiutils.get_pad_label(7, MIDDLE_ROW_HEIGHT), False, True, 0) #### NOTE!!!!!! THIS DETERMINES THE HEIGHT OF MIDDLE ROW
101
buttons_row.pack_start(w.modes_selector.widget, False, True, 0)
102
- buttons_row.pack_start(Gtk.Label(), True, True, 0)
103
if editorstate.SCREEN_WIDTH > 1279:
104
+ buttons_row.pack_start(guiutils.get_pad_label(10, 10), False, True, 0)
105
buttons_row.pack_start(_get_tools_buttons(), False, True, 0)
106
- buttons_row.pack_start(Gtk.Label(), True, True, 0)
107
+ buttons_row.pack_start(guiutils.get_pad_label(120, 10), False, True, 0)
108
+ else:
109
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
110
+
111
buttons_row.pack_start(_get_undo_buttons_panel(), False, True, 0)
112
buttons_row.pack_start(Gtk.Label(), True, True, 0)
113
+
114
buttons_row.pack_start(_get_zoom_buttons_panel(),False, True, 0)
115
buttons_row.pack_start(Gtk.Label(), True, True, 0)
116
+
117
buttons_row.pack_start(_get_edit_buttons_panel(),False, True, 0)
118
buttons_row.pack_start(Gtk.Label(), True, True, 0)
119
+
120
buttons_row.pack_start(_get_edit_buttons_2_panel(),False, True, 0)
121
buttons_row.pack_start(Gtk.Label(), True, True, 0)
122
+
123
+ buttons_row.pack_start(_get_edit_buttons_3_panel(),False, True, 0)
124
+ buttons_row.pack_start(Gtk.Label(), True, True, 0)
125
+
126
buttons_row.pack_start(_get_monitor_insert_buttons(), False, True, 0)
127
-
128
+
129
def fill_with_TC_MIDDLE_pattern(buttons_row, window):
130
global w
131
w = window
132
133
right_panel.pack_start(Gtk.Label(), True, True, 0)
134
right_panel.pack_start(_get_edit_buttons_panel(), False, True, 0)
135
right_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0)
136
+ right_panel.pack_start(_get_edit_buttons_3_panel(),False, True, 0)
137
+ right_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0)
138
right_panel.pack_start(_get_edit_buttons_2_panel(),False, True, 0)
139
right_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0)
140
right_panel.pack_start(_get_monitor_insert_buttons(), False, True, 0)
141
142
buttons_row.pack_start(middle_panel, False, False, 0)
143
buttons_row.pack_start(right_panel, True, True, 0)
144
145
+def fill_with_COMPONETS_CENTERED_pattern(buttons_row, window):
146
+ global w
147
+ w = window
148
+ buttons_row.pack_start(Gtk.Label(), True, True, 0)
149
+ buttons_row.pack_start(w.big_TC.widget, False, True, 0)
150
+ buttons_row.pack_start(guiutils.get_pad_label(7, MIDDLE_ROW_HEIGHT), False, True, 0) #### NOTE!!!!!! THIS DETERMINES THE HEIGHT OF MIDDLE ROW
151
+ buttons_row.pack_start(w.modes_selector.widget, False, True, 0)
152
+ if editorstate.SCREEN_WIDTH > 1279:
153
+ buttons_row.pack_start(guiutils.get_pad_label(10, 10), False, True, 0)
154
+ buttons_row.pack_start(_get_tools_buttons(), False, True, 0)
155
+ #buttons_row.pack_start(guiutils.get_pad_label(120, 10), False, True, 0)
156
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
157
+ else:
158
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
159
+
160
+ buttons_row.pack_start(_get_undo_buttons_panel(), False, True, 0)
161
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
162
+
163
+ buttons_row.pack_start(_get_zoom_buttons_panel(),False, True, 0)
164
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
165
+
166
+ buttons_row.pack_start(_get_edit_buttons_panel(),False, True, 0)
167
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
168
+
169
+ buttons_row.pack_start(_get_edit_buttons_2_panel(),False, True, 0)
170
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
171
+
172
+ buttons_row.pack_start(_get_edit_buttons_3_panel(),False, True, 0)
173
+ buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0)
174
+
175
+ buttons_row.pack_start(_get_monitor_insert_buttons(), False, True, 0)
176
+ buttons_row.pack_start(Gtk.Label(), True, True, 0)
177
+
178
def _get_zoom_buttons_panel():
179
return w.zoom_buttons.widget
180
181
182
183
def _get_edit_buttons_2_panel():
184
return w.edit_buttons_2.widget
185
+
186
+def _get_edit_buttons_3_panel():
187
+ return w.edit_buttons_3.widget
188
189
def _get_monitor_insert_buttons():
190
return w.monitor_insert_buttons.widget
191
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/monitorevent.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/monitorevent.py
Changed
101
1
2
Module handles button presses from monitor control buttons row.
3
"""
4
5
+import appconsts
6
+import dialogutils
7
+import editorpersistance
8
import editorstate
9
from editorstate import PLAYER
10
from editorstate import current_sequence
11
12
from editorstate import current_is_move_mode
13
from editorstate import MONITOR_MEDIA_FILE
14
import gui
15
+import guicomponents
16
import movemodes
17
import trimmodes
18
import updater
19
20
def next_pressed():
21
if current_is_move_mode():
22
movemodes.next_pressed()
23
- """ This is highly fucking suspect, it does an edit immediately
24
- commented out at 6-1-16 and lets see if anyone complains
25
- elif EDIT_MODE() == editorstate.ONE_ROLL_TRIM:
26
- trimmodes.oneroll_next_pressed()
27
- elif EDIT_MODE() == editorstate.TWO_ROLL_TRIM:
28
- trimmodes.tworoll_next_pressed()
29
- elif EDIT_MODE() == editorstate.SLIDE_TRIM:
30
- trimmodes.slide_next_pressed()
31
- """
32
+
33
def prev_pressed():
34
if current_is_move_mode():
35
movemodes.prev_pressed()
36
- """
37
- elif EDIT_MODE() == editorstate.ONE_ROLL_TRIM:
38
- trimmodes.oneroll_prev_pressed()
39
- elif EDIT_MODE() == editorstate.TWO_ROLL_TRIM:
40
- trimmodes.tworoll_prev_pressed()
41
- elif EDIT_MODE() == editorstate.SLIDE_TRIM:
42
- trimmodes.slide_prev_pressed()
43
- """
44
+
45
def j_pressed():
46
if timeline_visible():
47
trimmodes.set_no_edit_trim_mode()
48
49
50
PLAYER().seek_frame(0)
51
52
+# -------------------------------------------------- monitor playback interpolation
53
def set_monitor_playback_interpolation(new_interpolation):
54
PLAYER().consumer.set("rescale", str(new_interpolation)) # MLT options "nearest", "bilinear", "bicubic", "hyper" hardcoded into menu items
55
+
56
+# --------------------------------------------------------- trim view
57
+def trim_view_menu_launched(launcher, event):
58
+ guicomponents.get_trim_view_popupmenu(launcher, event, _trim_view_menu_item_activated)
59
+
60
+def _trim_view_menu_item_activated(widget, msg):
61
+ if msg == "matchclear":
62
+ gui.monitor_widget.set_default_view_force()
63
+ return
64
+ if msg == "clipframematch":
65
+ import tlineaction # if this is on top level gmic tool get circular import
66
+ clip = tlineaction._get_new_clip_from_clip_monitor()
67
+ if clip == None:
68
+ return
69
+ frame = PLAYER().current_frame()
70
+ gui.monitor_widget.set_frame_match_view(clip, frame)
71
+ return
72
+
73
+ if widget.get_active() == False:
74
+ return
75
76
+ if msg == "trimon":
77
+ editorstate.show_trim_view = appconsts.TRIM_VIEW_ON
78
+ editorpersistance.prefs.trim_view_default = appconsts.TRIM_VIEW_ON
79
+ editorpersistance.save()
80
+ if editorpersistance.prefs.trim_view_message_shown == False:
81
+ _show_trimview_info()
82
+ if msg == "trimsingle":
83
+ editorstate.show_trim_view = appconsts.TRIM_VIEW_SINGLE
84
+ editorpersistance.prefs.trim_view_default = appconsts.TRIM_VIEW_SINGLE
85
+ editorpersistance.save()
86
+ if editorpersistance.prefs.trim_view_message_shown == False:
87
+ _show_trimview_info()
88
+ if msg == "trimoff":
89
+ editorstate.show_trim_view = appconsts.TRIM_VIEW_OFF
90
+ editorpersistance.prefs.trim_view_default = appconsts.TRIM_VIEW_OFF
91
+ editorpersistance.save()
92
+
93
+def _show_trimview_info():
94
+ editorpersistance.prefs.trim_view_message_shown = True
95
+ editorpersistance.save()
96
+ primary_txt = _("On some systems Trim View may update slowly")
97
+ secondary_txt = _("<b>Trim View</b> works best with SSDs and relatively powerful processors.\n\n") + \
98
+ _("Select <b>'Trim View Off'</b> or<b>'Trim View Single Side Edits Only'</b> options\nif performance is not satisfactory.")
99
+ dialogutils.info_message(primary_txt, secondary_txt, gui.editor_window.window)
100
101
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/monitorwidget.py
Added
201
1
2
+"""
3
+ Flowblade Movie Editor is a nonlinear video editor.
4
+ Copyright 2012 Janne Liljeblad.
5
+
6
+ This file is part of Flowblade Movie Editor <http://code.google.com/p/flowblade>.
7
+
8
+ Flowblade Movie Editor is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ (at your option) any later version.
12
+
13
+ Flowblade Movie Editor is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with Flowblade Movie Editor. If not, see <http://www.gnu.org/licenses/>.
20
+"""
21
+from gi.repository import Gdk
22
+from gi.repository import Gtk, GLib
23
+
24
+import cairo
25
+import mlt
26
+import numpy as np
27
+import os
28
+import threading
29
+import time
30
+import utils
31
+
32
+import appconsts
33
+import cairoarea
34
+import editorstate
35
+from editorstate import PLAYER
36
+from editorstate import PROJECT
37
+import respaths
38
+import utils
39
+
40
+"""
41
+Module is used to display trim views for Trim, Roll and Slip tools and selected match frames.
42
+"""
43
+
44
+DEFAULT_VIEW = 0
45
+START_TRIM_VIEW = 1
46
+END_TRIM_VIEW = 2
47
+ROLL_TRIM_RIGHT_ACTIVE_VIEW = 3
48
+ROLL_TRIM_LEFT_ACTIVE_VIEW = 4
49
+SLIP_TRIM_RIGHT_ACTIVE_VIEW = 5
50
+SLIP_TRIM_LEFT_ACTIVE_VIEW = 6
51
+FRAME_MATCH_VIEW = 7
52
+
53
+TC_LEFT_SIDE_PAD = 172
54
+TC_RIGHT_SIDE_PAD = 28
55
+TC_HEIGHT = 27
56
+
57
+MATCH_FRAME = "match_frame.png"
58
+
59
+MONITOR_INDICATOR_COLOR = utils.get_cairo_color_tuple_255_rgb(71, 131, 169)
60
+MONITOR_INDICATOR_COLOR_MATCH = utils.get_cairo_color_tuple_255_rgb(21, 71, 105)
61
+
62
+FRAME_MATCH_VIEW_COLOR = (0.3, 0.3, 0.3)
63
+
64
+# Continuos match frame update
65
+CONTINUOS_UPDATE_PAUSE = 0.2
66
+_last_render_time = 0.0
67
+_producer = None
68
+_consumer = None
69
+_frame_write_on = False
70
+
71
+_widget = None
72
+
73
+def _get_match_frame_path():
74
+ return utils.get_hidden_user_dir_path() + appconsts.TRIM_VIEW_DIR + "/" + MATCH_FRAME
75
+
76
+class MonitorWidget:
77
+
78
+ def __init__(self):
79
+ self.widget = Gtk.VBox()
80
+
81
+ self.view = DEFAULT_VIEW
82
+ self.match_frame_surface = None
83
+ self.match_frame = -1
84
+ self.edit_tline_frame = -1
85
+ self.edit_delta = None
86
+ self.edit_clip_start_on_tline = -1
87
+
88
+ self.slip_clip_media_length = -1
89
+ self.slip_clip_length = -1
90
+
91
+ self.clip_name = "clip name"
92
+
93
+ self.match_is_pattern_producer = False # Roll and Slip need this flag to know if surface updates needed
94
+
95
+ # top row
96
+ self.top_row = Gtk.HBox()
97
+
98
+ self.top_edge_panel = cairoarea.CairoDrawableArea2(1, 1, self._draw_top_panel, use_widget_bg=False)
99
+ self.top_edge_panel.press_func = self._press_event
100
+ self.top_row.pack_start(self.top_edge_panel, True, True,0)
101
+
102
+ # mid row
103
+ self.mid_row = Gtk.HBox()
104
+
105
+ self.left_display = cairoarea.CairoDrawableArea2(1, 1, self._draw_match_frame_left, use_widget_bg=False)
106
+
107
+ black_box = Gtk.EventBox()
108
+ black_box.add(Gtk.Label())
109
+ bg_color = Gdk.Color(red=0.0, green=0.0, blue=0.0)
110
+ black_box.modify_bg(Gtk.StateType.NORMAL, bg_color)
111
+ self.monitor = black_box
112
+
113
+ self.right_display = cairoarea.CairoDrawableArea2(1, 1, self._draw_match_frame_right, use_widget_bg=False)
114
+
115
+ self.mid_row.pack_start(self.left_display, False, False,0)
116
+ self.mid_row.pack_start(self.monitor, True, True,0)
117
+ self.mid_row.pack_start(self.right_display, False, False,0)
118
+
119
+ # bottom row
120
+ self.bottom_edge_panel = cairoarea.CairoDrawableArea2(1, 1, self._draw_bottom_panel, use_widget_bg=False)
121
+ self.bottom_row = Gtk.HBox()
122
+ self.bottom_row.pack_start(self.bottom_edge_panel, True, True,0)
123
+
124
+ # build pane
125
+ self.widget.pack_start(self.top_row, False, False,0)
126
+ self.widget.pack_start(self.mid_row , True, True,0)
127
+ self.widget.pack_start(self.bottom_row, False, False,0)
128
+
129
+ self.CLOSE_MATCH_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "close_match.png")
130
+ self.PATTERN_PRODUCER_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "pattern_producer_trim_view.png")
131
+
132
+ global _widget
133
+ _widget = self
134
+
135
+ # ------------------------------------------------------------------ INTERFACE
136
+ def get_monitor(self):
137
+ return self.monitor
138
+
139
+ def is_active(self, attempting_trim=False):
140
+ if editorstate.show_trim_view == appconsts.TRIM_VIEW_ON:
141
+ return True
142
+
143
+ if editorstate.show_trim_view == appconsts.TRIM_VIEW_OFF:
144
+ return False
145
+
146
+ if editorstate.show_trim_view == appconsts.TRIM_VIEW_SINGLE and attempting_trim:
147
+ return True
148
+
149
+ if (editorstate.show_trim_view == appconsts.TRIM_VIEW_SINGLE and
150
+ (self.view == START_TRIM_VIEW or self.view == END_TRIM_VIEW)):
151
+ return True
152
+
153
+ return False
154
+
155
+ # ------------------------------------------------------------------ SET VIEW TYPE
156
+ def set_default_view_force(self):
157
+ self.set_default_view(True)
158
+
159
+ def set_default_view(self, force_default_mode=False):
160
+ if self.view == DEFAULT_VIEW:
161
+ return
162
+
163
+ if self.view == FRAME_MATCH_VIEW and force_default_mode==False:
164
+ return
165
+
166
+ # Refreshing while rendering overwrites file on disk and loses
167
+ # previous rendered data.
168
+ if PLAYER().is_rendering:
169
+ return
170
+
171
+ # Delete match frame
172
+ try:
173
+ os.remove(_get_match_frame_path())
174
+ except:
175
+ # This fails when done first time ever
176
+ pass
177
+
178
+ self.match_frame_surface = None
179
+
180
+ self.view = DEFAULT_VIEW
181
+
182
+ self.left_display.set_pref_size(1, 1)
183
+ self.right_display.set_pref_size(1, 1)
184
+
185
+ self.top_edge_panel.set_pref_size(1, 1)
186
+ self.bottom_edge_panel.set_pref_size(1, 1)
187
+
188
+ self.widget.queue_draw()
189
+ PLAYER().refresh()
190
+
191
+ def set_frame_match_view(self, match_clip, frame):
192
+ # Refreshing while rendering overwrites file on disk and loses
193
+ # previous rendered data.
194
+ if PLAYER().is_rendering:
195
+ return
196
+
197
+ # Delete match frame
198
+ try:
199
+ os.remove(_get_match_frame_path())
200
+ except:
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/multimovemode.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/multimovemode.py
Changed
52
1
2
self._build_move_data()
3
4
def _build_move_data(self):
5
- # Look at all tracks exept
6
tracks = current_sequence().tracks
7
8
+ # Look at all tracks exept hidden and black
9
# Get per track:
10
# * maximum length edit can be done backwards before an overwrite happens
11
# * indexes of blanks that are trimmed and/or added/removed,
12
13
track_max_deltas.append(0)
14
trim_blank_indexes.append(clip_index)
15
else:
16
- blank_clip_start_frame = track.clip_start(clip_index + 1)
17
- moved_clip_start_frame = track.clip_start(clip_index + 2)
18
+ blank_clip_start_frame = track.clip_start(clip_index - 1)
19
+ moved_clip_start_frame = track.clip_start(clip_index)
20
track_max_deltas.append(moved_clip_start_frame - blank_clip_start_frame)
21
trim_blank_indexes.append(clip_index - 1)
22
continue
23
24
25
track_max_deltas[self.pressed_track_id - 1] = max_d
26
self.trim_blank_indexes[self.pressed_track_id - 1] = trim_index
27
-
28
+
29
# Smallest track delta is the max number of frames
30
- # the edit can be done backwards
31
- smallest_max_delta = MAX_DELTA
32
- for i in range(1, len(tracks) - 1):
33
- d = track_max_deltas[i - 1]
34
- if d < smallest_max_delta:
35
- smallest_max_delta = d
36
- self.max_backwards = smallest_max_delta
37
-
38
+ # the edit can be done backwards
39
+ if self.move_all_tracks:
40
+ smallest_max_delta = MAX_DELTA
41
+ for i in range(1, len(tracks) - 1):
42
+ d = track_max_deltas[i - 1]
43
+ if d < smallest_max_delta:
44
+ smallest_max_delta = d
45
+ self.max_backwards = smallest_max_delta
46
+ else: # Single track moved with CTRL
47
+ self.max_backwards = track_max_deltas[self.pressed_track_id - 1] # - 1 because black track
48
+
49
# Track have different ways the edit will need to be applied
50
# make a list of those
51
track_edit_ops = []
52
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/panels.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/panels.py
Changed
33
1
2
import guicomponents
3
import guiutils
4
import editorpersistance
5
+import editorstate
6
import mlttransitions
7
import renderconsumer
8
import respaths
9
10
None)
11
12
length_entry = Gtk.Entry()
13
- length_entry.set_text(str(30))
14
+ trans_length = 30
15
+ if editorstate.transition_length > 0: # use last invocation length if available
16
+ trans_length = editorstate.transition_length
17
+ length_entry.set_text(str(trans_length))
18
length_row = get_two_column_box(Gtk.Label(label=_("Length:")),
19
length_entry)
20
21
22
color_row = get_two_column_box(color_label, color_button_box)
23
24
length_entry = Gtk.Entry()
25
- length_entry.set_text(str(30))
26
+ fade_length = 30
27
+ if editorstate.fade_length > 0: # use last invocation length if available
28
+ fade_length = editorstate.fade_length
29
+ length_entry.set_text(str(fade_length))
30
length_row = get_two_column_box(Gtk.Label(label=_("Length:")),
31
length_entry)
32
33
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/persistance.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/persistance.py
Changed
14
1
2
# This attr was added for 1.8. It is not computed for older projects.
3
if (not hasattr(media_file, "info")):
4
media_file.info = None
5
-
6
+
7
+ if(not hasattr(project, "update_media_lengths_on_load")):
8
+ project.update_media_lengths_on_load = True # old projects < 1.10 had wrong media length data which just was never used.
9
+ # 1.10 needed that data for the first time and required recreating it correctly for older projects
10
+
11
if icons_and_thumnails == True:
12
_show_msg(_("Loading icons"))
13
for k, media_file in project.media_files.iteritems():
14
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/positionbar.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/positionbar.py
Changed
13
1
2
import editorstate
3
import gui
4
import guiutils
5
-trimmodes_set_no_edit_trim_mode = None # This monkey patched in app.py to avoid unncessary dependencies in gmic.py
6
-
7
-#import trimmodes
8
9
+trimmodes_set_no_edit_trim_mode = None # This monkey patched in app.py to avoid unncessary dependencies in gmic.py
10
11
12
# Draw params
13
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/preferenceswindow.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/preferenceswindow.py
Changed
45
1
2
3
from gi.repository import Gtk
4
5
+import appconsts
6
import dialogs
7
import dialogutils
8
import editorpersistance
9
10
else:
11
audio_levels_combo.set_active(1)
12
13
+ window_mode_combo = Gtk.ComboBoxText()
14
+ window_mode_combo.append_text(_("Single Window"))
15
+ window_mode_combo.append_text(_("Two Windows"))
16
+ if prefs.global_layout == appconsts.SINGLE_WINDOW:
17
+ window_mode_combo.set_active(0)
18
+ else:
19
+ window_mode_combo.set_active(1)
20
+
21
# Layout
22
+ row00 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Application window mode:")), window_mode_combo, PREFERENCES_LEFT))
23
row0 = _row(guiutils.get_checkbox_row_box(force_english_check, Gtk.Label(label=_("Use English texts on localized OS"))))
24
row1 = _row(guiutils.get_checkbox_row_box(display_splash_check, Gtk.Label(label=_("Display splash screen"))))
25
row2 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Buttons style:")), buttons_combo, PREFERENCES_LEFT))
26
- row3 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Icons and color optimized for:")), dark_combo, PREFERENCES_LEFT))
27
+ row3 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Theme request, icons and colors:")), dark_combo, PREFERENCES_LEFT))
28
row4 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Theme detection fail fallback colors:")), theme_combo, PREFERENCES_LEFT))
29
row5 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Default audio levels display:")), audio_levels_combo, PREFERENCES_LEFT))
30
31
vbox = Gtk.VBox(False, 2)
32
+ vbox.pack_start(row00, False, False, 0)
33
vbox.pack_start(row0, False, False, 0)
34
vbox.pack_start(row1, False, False, 0)
35
vbox.pack_start(row2, False, False, 0)
36
37
38
guiutils.set_margins(vbox, 12, 0, 12, 12)
39
40
- return vbox, (force_english_check, display_splash_check, buttons_combo, dark_combo, theme_combo, audio_levels_combo)
41
+ return vbox, (force_english_check, display_splash_check, buttons_combo, dark_combo, theme_combo, audio_levels_combo, window_mode_combo)
42
43
def _row(row_cont):
44
row_cont.set_size_request(10, 26)
45
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/profilesmanager.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/profilesmanager.py
Changed
10
1
2
import utils
3
4
PROFILES_WIDTH = 480
5
-PROFILES_HEIGHT = 690
6
+PROFILES_HEIGHT = 600
7
PROFILE_MANAGER_LEFT = 265 # label column of profile manager panel
8
9
def profiles_manager_dialog():
10
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/projectaction.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/projectaction.py
Changed
201
1
2
import datetime
3
import glob
4
import md5
5
+import mlt
6
import os
7
from os import listdir
8
from os.path import isfile, join
9
10
save_time = None
11
save_icon_remove_event_id = None
12
13
-
14
#--------------------------------------- worker threads
15
class LoadThread(threading.Thread):
16
17
18
Gdk.threads_leave()
19
ticker.stop_ticker()
20
21
-
22
def _missing_file_dialog_callback(self, dialog, response_id):
23
if self.open_check.get_active() == True:
24
medialinker.display_linker(self.filename)
25
dialog.destroy()
26
else:
27
dialog.destroy()
28
-
29
+
30
+
31
class AddMediaFilesThread(threading.Thread):
32
33
def __init__(self, filenames):
34
35
36
audiowaveformrenderer.launch_audio_levels_rendering(filenames)
37
38
+
39
+class UpdateMediaLengthsThread(threading.Thread):
40
+
41
+ def __init__(self):
42
+ threading.Thread.__init__(self)
43
+
44
+ def run(self):
45
+ print "Updating media lengths:"
46
+
47
+ Gdk.threads_enter()
48
+ dialog = dialogs.update_media_lengths_progress_dialog()
49
+ time.sleep(0.1)
50
+ Gdk.threads_leave()
51
+
52
+ for key, media_file in PROJECT().media_files.iteritems():
53
+ print media_file.name
54
+ if media_file.type == appconsts.VIDEO or media_file.type == appconsts.IMAGE_SEQUENCE:
55
+ print media_file.name
56
+ Gdk.threads_enter()
57
+ dialog.info.set_text(media_file.name)
58
+ Gdk.threads_leave()
59
+
60
+ producer = mlt.Producer(PROJECT().profile, str(media_file.path))
61
+ if producer.is_valid() == False:
62
+ print "not valid producer"
63
+ continue
64
+
65
+ length = producer.get_length()
66
+ media_file.length = length
67
+
68
+ PROJECT().update_media_lengths_on_load = False
69
+
70
+ Gdk.threads_enter()
71
+ dialog.destroy()
72
+ Gdk.threads_leave()
73
+
74
+ print "Updating media lengths done."
75
+
76
def _duplicates_info(duplicates):
77
primary_txt = _("Media files already present in project were opened!")
78
MAX_DISPLAYED_ITEMS = 3
79
80
profile = mltprofiles.get_profile_for_index(match_profile_index)
81
82
path = utils.get_hidden_user_dir_path() + "/" + PROJECT().name
83
-
84
+ PROJECT().update_media_lengths_on_load = True
85
+
86
persistance.save_project(PROJECT(), path, profile.description()) #<----- HERE
87
88
actually_load_project(path)
89
90
save_thread = SnaphotSaveThread(root_folder_path, project_name)
91
save_thread.start()
92
93
+def update_media_lengths():
94
+ update_thread = UpdateMediaLengthsThread()
95
+ update_thread.start()
96
+
97
def change_project_profile():
98
dialogs.change_profile_project_dialog(PROJECT(), _change_project_profile_callback)
99
100
101
name = project_name_entry.get_text()
102
profile = mltprofiles.get_profile_for_index(profile_combo.get_active())
103
path = folder + "/" + name
104
+
105
+ PROJECT().update_media_lengths_on_load = True # saved version needs to do this
106
107
persistance.save_project(PROJECT(), path, profile.description()) #<----- HERE
108
109
+ PROJECT().update_media_lengths_on_load = False
110
+
111
dialog.destroy()
112
else:
113
dialog.destroy()
114
-
115
+
116
+""" Feature disabled, maybe reactivated later
117
def change_profile_to_match_media(media_file):
118
dialogs.change_profile_project_to_match_media_dialog(PROJECT(), media_file, _change_project_profile_to_match_media_callback)
119
120
121
name = project_name_entry.get_text()
122
profile = mltprofiles.get_profile_for_index(match_profile_index)
123
path = folder + "/" + name
124
-
125
+
126
+ PROJECT().update_media_lengths_on_load = True # saved version needs to do this
127
+
128
persistance.save_project(PROJECT(), path, profile.description()) #<----- HERE
129
130
+ PROJECT().update_media_lengths_on_load = False
131
+
132
dialog.destroy()
133
else:
134
dialog.destroy()
135
-
136
+"""
137
138
class SnaphotSaveThread(threading.Thread):
139
140
141
142
def open_recent_project(widget, index):
143
path = editorpersistance.recent_projects.projects[index]
144
+ if _project_empty() == True:
145
+ _actually_open_recent(path)
146
+ else:
147
+ dialogs.exit_confirm_dialog(_open_recent_shutdown_dialog_callback, get_save_time_msg(), gui.editor_window.window, editorstate.PROJECT().name, path)
148
+
149
+def _project_empty():
150
+ for seq in PROJECT().sequences:
151
+ if not seq.is_empty():
152
+ return False
153
+
154
+ return True
155
+
156
+def _open_recent_shutdown_dialog_callback(dialog, response_id, path):
157
+ dialog.destroy()
158
+
159
+ # Handle poroject close responses
160
+ if response_id == Gtk.ResponseType.CLOSE:# "Don't Save"
161
+ pass
162
+ elif response_id == Gtk.ResponseType.YES:# "Save"
163
+ if editorstate.PROJECT().last_save_path != None:
164
+ persistance.save_project(editorstate.PROJECT(), editorstate.PROJECT().last_save_path)
165
+ else:
166
+ dialogutils.warning_message(_("Project has not been saved previously"),
167
+ _("Save project with File -> Save As before closing."),
168
+ gui.editor_window.window)
169
+ return
170
+ else: # "Cancel"
171
+ return
172
+
173
+ _actually_open_recent(path)
174
+
175
+def _actually_open_recent(path):
176
if not os.path.exists(path):
177
editorpersistance.recent_projects.projects.pop(index)
178
editorpersistance.fill_recents_menu_widget(gui.editor_window.uimanager.get_widget('/MenuBar/FileMenu/OpenRecent'), open_recent_project)
179
180
181
actually_load_project(path)
182
183
+def get_save_time_msg():
184
+ if save_time == None:
185
+ return _("Project has not been saved since it was opened.")
186
+
187
+ save_ago = (time.clock() - save_time) / 60.0
188
+
189
+ if save_ago < 1:
190
+ return _("Project was saved less than a minute ago.")
191
+
192
+ if save_ago < 2:
193
+ return _("Project was saved one minute ago.")
194
+
195
+ return _("Project was saved ") + str(int(save_ago)) + _(" minutes ago.")
196
+
197
# ---------------------------------- rendering
198
def do_rendering():
199
success = _write_out_render_item(True)
200
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/projectdata.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/projectdata.py
Changed
32
1
2
self.media_log = []
3
self.media_log_groups = []
4
self.proxy_data = miscdataobjects.ProjectProxyEditingData()
5
+ self.update_media_lengths_on_load = False # old projects < 1.10 had wrong media length data which just was never used.
6
+ # 1.10 needed that data for the first time and required recreating it correctly for older projects
7
+
8
self.SAVEFILE_VERSION = SAVEFILE_VERSION
9
10
# c_seq is the currently edited Sequence
11
12
13
def init_thumbnailer(self):
14
global thumbnailer
15
- if thumbnailer == None:
16
- thumbnailer = Thumbnailer()
17
- thumbnailer.set_context(self.profile)
18
+ thumbnailer = Thumbnailer()
19
+ thumbnailer.set_context(self.profile)
20
21
def add_image_sequence_media_object(self, resource_path, name, length):
22
media_object = self.add_media_file(resource_path)
23
24
icon = cairo.ImageSurface.create_from_png(self.icon_path)
25
scaled_icon = cairo.ImageSurface(cairo.FORMAT_ARGB32, appconsts.THUMB_WIDTH, appconsts.THUMB_HEIGHT)
26
cr = cairo.Context(scaled_icon)
27
- cr.scale( float(appconsts.THUMB_WIDTH) / float(icon.get_width()), float(appconsts.THUMB_HEIGHT) / float(icon.get_height()))
28
+ cr.scale(float(appconsts.THUMB_WIDTH) / float(icon.get_width()), float(appconsts.THUMB_HEIGHT) / float(icon.get_height()))
29
cr.set_source_surface(icon, 0, 0)
30
cr.paint()
31
32
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/projectinfogui.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/projectinfogui.py
Changed
18
1
2
3
widgets = utils.EmptyClass()
4
5
+PROJECT_INFO_PANEL_HEIGHT = 200
6
7
def get_project_info_panel():
8
project_name_label = Gtk.Label(label=PROJECT().name)
9
10
project_info_vbox = Gtk.VBox()
11
project_info_vbox.pack_start(name_panel, False, True, 0)
12
project_info_vbox.pack_start(profile_panel, False, True, 0)
13
- project_info_vbox.set_size_request(250, 200)
14
+ project_info_vbox.set_size_request(250, PROJECT_INFO_PANEL_HEIGHT)
15
16
project_info_hbox = Gtk.HBox()
17
project_info_hbox.pack_start(project_info_vbox, False, False, 0)
18
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/render.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/render.py
Changed
59
1
2
import threading
3
4
import dialogutils
5
+import editorstate
6
from editorstate import current_sequence
7
from editorstate import PROJECT
8
from editorstate import PLAYER
9
10
quality_option_index)
11
args_vals_list.append(("ar", str(widgets.encoding_panel.sample_rate_selector.get_selected_rate())))
12
else: # Manual args encodings
13
- buf = widgets.args_panel.opts_view.get_buffer()
14
+ if widgets.args_panel.text_buffer == None:
15
+ # Normal height args panel
16
+ buf = widgets.args_panel.opts_view.get_buffer()
17
+ else:
18
+ # Small heights with dialog for setting args
19
+ buf = widgets.args_panel.text_buffer
20
args_vals_list, error = renderconsumer.get_ffmpeg_opts_args_vals_tuples_list(buf)
21
22
if error != None:
23
24
if widgets.args_panel.use_args_check.get_active() == False:
25
extension = widgets.file_panel.extension_label.get_text()
26
else:
27
- extension = "." + widgets.args_panel.ext_entry.get_text()
28
-
29
+ if widgets.args_panel.text_buffer == None:
30
+ extension = "." + widgets.args_panel.ext_entry.get_text()
31
+ else:
32
+ # Small height with dialog args setting
33
+ ext_str = widgets.args_panel.args_edit_window.ext_entry.get_text()
34
+ if ext_str == "":
35
+ # dialog is closed
36
+ print "yyyyyyyyy"
37
+ ext_str = widgets.args_panel.ext
38
+ extension = "." + ext_str
39
return folder + "/" + filename + extension
40
41
42
43
widgets.render_type_panel = rendergui.RenderTypePanel(_render_type_changed, _preset_selection_changed)
44
widgets.profile_panel = rendergui.RenderProfilePanel(_out_profile_changed)
45
widgets.encoding_panel = rendergui.RenderEncodingPanel(widgets.file_panel.extension_label)
46
- widgets.args_panel = rendergui.RenderArgsPanel(_save_opts_pressed, _load_opts_pressed,
47
- _display_selection_in_opts_view)
48
-
49
+ if (editorstate.SCREEN_HEIGHT > 898):
50
+ widgets.args_panel = rendergui.RenderArgsPanel(_save_opts_pressed, _load_opts_pressed,
51
+ _display_selection_in_opts_view)
52
+ else:
53
+ widgets.args_panel = rendergui.RenderArgsPanelSmall(_save_opts_pressed, _load_opts_pressed,
54
+ _display_selection_in_opts_view)
55
+
56
# Range, Render, Reset, Render Queue
57
widgets.render_button = guiutils.get_render_button()
58
widgets.range_cb = rendergui.get_range_selection_combo()
59
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/rendergui.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/rendergui.py
Changed
201
1
2
3
from gi.repository import Gtk
4
from gi.repository import GObject
5
+from gi.repository import Pango
6
7
import math
8
import os
9
10
11
destroy_window_event_id = -1
12
13
-FFMPEG_VIEW_SIZE = (200, 20) # Text edit area height for render opts. Width 200 seems to be ignored in current layout?
14
+FFMPEG_VIEW_SIZE = (20, 20) # Text edit area height for render opts. Width 200 seems to be ignored in current layout?
15
16
17
# ----------------------------------------------------------- dialogs
18
19
20
# ------------------------------------------------------------ panels
21
def get_render_panel_left(render_widgets):
22
- small_height = editorstate.screen_size_small_height()
23
+ small_height = (editorstate.SCREEN_HEIGHT < 898)
24
25
file_opts_panel = guiutils.get_named_frame(_("File"), render_widgets.file_panel.vbox, 4)
26
profile_panel = guiutils.get_named_frame(_("Render Profile"), render_widgets.profile_panel.vbox, 4)
27
28
if small_height == False:
29
encoding_panel = guiutils.get_named_frame(_("Encoding Format"), render_widgets.encoding_panel.vbox, 4)
30
- render_type_panel = guiutils.get_named_frame(_("Render Type"), render_widgets.render_type_panel.vbox, 4)
31
+
32
+ render_type_panel = guiutils.get_named_frame(_("Render Type"), render_widgets.render_type_panel.vbox, 4)
33
34
render_panel = Gtk.VBox()
35
render_panel.pack_start(file_opts_panel, False, False, 0)
36
- if small_height == False:
37
- render_panel.pack_start(render_type_panel, False, False, 0)
38
+ render_panel.pack_start(render_type_panel, False, False, 0)
39
render_panel.pack_start(profile_panel, False, False, 0)
40
if small_height == False:
41
render_panel.pack_start(encoding_panel, False, False, 0)
42
43
return render_panel
44
45
def get_render_panel_right(render_widgets, render_clicked_cb, to_queue_clicked_cb):
46
- small_height = editorstate.screen_size_small_height()
47
+ small_height = (editorstate.SCREEN_HEIGHT < 898)
48
49
if small_height:
50
encoding_panel = guiutils.get_named_frame(_("Encoding Format"), render_widgets.encoding_panel.vbox, 4)
51
- render_type_panel = guiutils.get_named_frame(_("Render Type"), render_widgets.render_type_panel.vbox, 4)
52
-
53
+
54
opts_panel = guiutils.get_named_frame(_("Render Args"), render_widgets.args_panel.vbox, 4)
55
56
bin_row = Gtk.HBox()
57
58
59
range_row = Gtk.HBox()
60
range_row.pack_start(guiutils.get_pad_label(10, 8), False, False, 0)
61
- range_row.pack_start(Gtk.Label(label=_("Render Range:")), False, False, 0)
62
- range_row.pack_start(guiutils.get_pad_label(10, 2), False, False, 0)
63
+ if not editorstate.screen_size_small_width():
64
+ range_row.pack_start(Gtk.Label(label=_("Render Range:")), False, False, 0)
65
+ range_row.pack_start(guiutils.get_pad_label(10, 2), False, False, 0)
66
range_row.pack_start(render_widgets.range_cb, True, True, 0)
67
68
buttons_panel = Gtk.HBox()
69
buttons_panel.pack_start(guiutils.get_pad_label(10, 8), False, False, 0)
70
buttons_panel.pack_start(render_widgets.reset_button, False, False, 0)
71
- buttons_panel.pack_start(Gtk.Label(), True, True, 0)
72
- buttons_panel.pack_start(render_widgets.queue_button, False, False, 0)
73
+ if not editorstate.screen_size_small_width():
74
+ buttons_panel.pack_start(Gtk.Label(), True, True, 0)
75
+ buttons_panel.pack_start(render_widgets.queue_button, False, False, 0)
76
buttons_panel.pack_start(Gtk.Label(), True, True, 0)
77
buttons_panel.pack_start(render_widgets.render_button, False, False, 0)
78
79
80
81
render_panel = Gtk.VBox()
82
if small_height:
83
- render_panel.pack_start(render_type_panel, False, False, 0)
84
render_panel.pack_start(encoding_panel, False, False, 0)
85
- render_panel.pack_start(Gtk.Label(), True, True, 0)
86
+ render_panel.pack_start(opts_panel, True, True, 0)
87
+ #render_panel.pack_start(Gtk.Label(), True, True, 0)
88
else:
89
render_panel.pack_start(opts_panel, True, True, 0)
90
if small_height == False:
91
render_panel.pack_start(guiutils.get_pad_label(10, 22), False, False, 0)
92
render_panel.pack_start(bin_row, False, False, 0)
93
+ else:
94
+ render_panel.pack_start(Gtk.Label(), True, True, 0)
95
+
96
render_panel.pack_start(range_row, False, False, 0)
97
if small_height == False:
98
render_panel.pack_start(guiutils.get_pad_label(10, 12), False, False, 0)
99
+ else:
100
+ render_panel.pack_start(guiutils.get_pad_label(10, 4), False, False, 0)
101
render_panel.pack_start(buttons_panel, False, False, 0)
102
103
return render_panel
104
105
self.vbox = Gtk.VBox(False, 2)
106
self.vbox.pack_start(use_project_profile_row, False, False, 0)
107
self.vbox.pack_start(self.out_profile_combo.widget, False, False, 0)
108
- self.vbox.pack_start(self.out_profile_info_box, False, False, 0)
109
+ if editorstate.screen_size_small_height() == False:
110
+ self.vbox.pack_start(self.out_profile_info_box, False, False, 0)
111
112
def set_sensitive(self, value):
113
self.use_project_profile_check.set_sensitive(value)
114
115
116
self.use_project_label = Gtk.Label(label=_("Use Project Profile:"))
117
self.use_args_label = Gtk.Label(label=_("Render using args:"))
118
-
119
+ self.text_buffer = None # only used for small screen heights with dialog for setting agrs, but this value is tested to determine where to get agrs if set
120
+
121
self.use_args_check = Gtk.CheckButton()
122
self.use_args_check.connect("toggled", self.use_args_toggled)
123
124
125
self.ext_entry.set_text("")
126
127
128
+class RenderArgsPanelSmall():
129
+
130
+ def __init__(self, save_args_callback,
131
+ load_args_callback, display_selection_callback):
132
+ self.display_selection_callback = display_selection_callback
133
+
134
+ self.args_edit_window = None
135
+ self.text_buffer = None # only used here for small screen heights with dialog for setting agrs, but this value is always tested to determine where to get agrs if set
136
+ self.ext = ""
137
+
138
+ self.use_project_label = Gtk.Label(label=_("Use Project Profile:"))
139
+ self.use_args_label = Gtk.Label(label=_("Render using args:"))
140
+
141
+ self.use_args_check = Gtk.CheckButton()
142
+ self.use_args_check.connect("toggled", self.use_args_toggled)
143
+
144
+ self.opts_save_button = Gtk.Button()
145
+ icon = Gtk.Image.new_from_stock(Gtk.STOCK_SAVE, Gtk.IconSize.MENU)
146
+ self.opts_save_button.set_image(icon)
147
+ self.opts_save_button.connect("clicked", lambda w: save_args_callback())
148
+ self.opts_save_button.set_sensitive(False)
149
+
150
+ self.opts_load_button = Gtk.Button()
151
+ icon = Gtk.Image.new_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.MENU)
152
+ self.opts_load_button.set_image(icon)
153
+ self.opts_load_button.connect("clicked", lambda w: load_args_callback())
154
+
155
+ self.open_in_bin = Gtk.CheckButton()
156
+
157
+ self.open_args_editor_button = Gtk.Button(_("Edit Args:"))
158
+ self.open_args_editor_button.connect("clicked", lambda w: self.open_edit_window())
159
+ self.open_args_editor_button.set_sensitive(False)
160
+
161
+ self.args_info = Gtk.Label()
162
+ self.args_info.set_sensitive(False)
163
+ self.args_info.set_ellipsize(Pango.EllipsizeMode.END)
164
+
165
+ use_opts_row = Gtk.HBox()
166
+ use_opts_row.pack_start(self.use_args_label, False, False, 0)
167
+ use_opts_row.pack_start(self.use_args_check, False, False, 0)
168
+ use_opts_row.pack_start(Gtk.Label(), True, True, 0)
169
+ use_opts_row.pack_start(self.opts_load_button, False, False, 0)
170
+ use_opts_row.pack_start(self.opts_save_button, False, False, 0)
171
+
172
+ args_edit_row = Gtk.HBox(False)
173
+ args_edit_row.pack_start(self.open_args_editor_button, False, False, 0)
174
+ args_edit_row.pack_start(guiutils.get_pad_label(4, 2), False, False, 0)
175
+ args_edit_row.pack_start(self.args_info, True, True, 0)
176
+
177
+ self.use_args_check.set_tooltip_text(_("Render using key=value rendering options"))
178
+
179
+ self.opts_save_button.set_tooltip_text(_("Save Render Args into a text file"))
180
+ self.opts_load_button.set_tooltip_text(_("Load Render Args from a text file"))
181
+
182
+ self.vbox = Gtk.VBox(False, 2)
183
+ self.vbox.pack_start(use_opts_row , False, False, 0)
184
+ self.vbox.pack_start(args_edit_row, False, False, 0)
185
+
186
+ def set_sensitive(self, value):
187
+ self.use_args_check.set_sensitive(value)
188
+ self.use_args_label.set_sensitive(value)
189
+
190
+ def display_encoding_args(self, profile, enc_index, qual_index):
191
+ encoding_option = renderconsumer.encoding_options[enc_index]
192
+ quality_option = encoding_option.quality_options[qual_index]
193
+ args_vals_list = encoding_option.get_args_vals_tuples_list(profile, quality_option)
194
+ text = ""
195
+ info_text = ""
196
+ for arg_val in args_vals_list:
197
+ k, v = arg_val
198
+ line = str(k) + "=" + str(v)
199
+ text = text + line + "\n"
200
+ info_text = info_text + line + ", "
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/append_clip.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/append_clip.png
Changed
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/close_match.png
Added
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/cut.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/cut.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/delete_range.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/delete_range.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/flowblade_splash_black_small.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/flowblade_splash_black_small.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/full_lock.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/full_lock.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/insert_clip.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/insert_clip.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/lift.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/lift.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/overwrite_clip.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/overwrite_clip.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/overwrite_range.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/overwrite_range.png
Changed
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/pattern_producer_trim_view.png
Added
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/resync.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/resync.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/darktheme/splice_out.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/splice_out.png
Changed
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/darktheme/trim_view.png
Added
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/help/translations -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/help/translations
Changed
10
1
2
cs - Pavel Fric
3
fi - jl
4
fr - Loïc Vanderstichelen
5
- de - Martin A. Wielebinski
6
+ de - Martin A. Wielebinski, Mario Dejanovic
7
es - David Gamiz Jimenez
8
it - Massimo Stella
9
hu - Péter Gábor
10
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/img/close_match.png
Added
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/img/delete_range.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/img/delete_range.png
Changed
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/res/img/flowblade_splash_black_small.png -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/img/flowblade_splash_black_small.png
Changed
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/img/pattern_producer_trim_view.png
Added
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/res/img/trim_view.png
Added
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/sequence.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/sequence.py
Changed
60
1
2
return False
3
return True
4
5
+ def is_empty(self):
6
+ for i in range (1, len(self.tracks) - 1):
7
+ track = self.tracks[i]
8
+ if len(track.clips) > 0:
9
+ return False
10
+
11
+ return True
12
+
13
# -------------------------------------------------- clips
14
- def create_file_producer_clip(self, path, new_clip_name=None):
15
+ def create_file_producer_clip(self, path, new_clip_name=None, novalidate=False):
16
"""
17
Creates MLT Producer and adds attributes to it, but does
18
not add it to track/playlist object.
19
"""
20
producer = mlt.Producer(self.profile, str(path)) # this runs 0.5s+ on some clips
21
+ if novalidate == True:
22
+ producer.set("mlt_service", "avformat-novalidate")
23
mltrefhold.hold_ref(producer)
24
producer.path = path
25
producer.filters = []
26
27
filter_object.create_mlt_filters(self.profile, clip)
28
return filter_object
29
30
+ def set_all_filters_active_state(self, is_active):
31
+ for i in range(1, len(self.tracks)):
32
+ track = self.tracks[i]
33
+ for clip in track.clips:
34
+ if clip.is_blanck_clip == False:
35
+ for f in clip.filters:
36
+ f.active = is_active
37
+ f.update_mlt_disabled_value()
38
+
39
# ------------------------------------------------------ compositors
40
def create_compositor(self, compositor_type):
41
compositor = mlttransitions.create_compositor(compositor_type)
42
43
track = self.tracks[-1] # Always last track
44
track.clear() # # TRIM INIT CRASH HACK, see clear_hidden_track there may be blank clip here
45
track.clips = []
46
-
47
+
48
# Display trimmmed clip on hidden track by creating copy of it.
49
# File producer
50
if path != None:
51
- clip = self.create_file_producer_clip(path)
52
+ clip = editorstate.get_cached_trim_clip(path)
53
+ if clip == None:
54
+ clip = self.create_file_producer_clip(path, None, True)
55
+ editorstate.add_cached_trim_clip(clip)
56
+
57
if clip_start_pos > 0:
58
edit._insert_blank(track, 0, clip_start_pos)
59
edit._insert_clip(track, clip, 1, 0, clip.get_length() - 1)
60
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/snapping.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/snapping.py
Changed
37
1
2
from editorstate import current_sequence
3
from editorstate import EDIT_MODE
4
5
-# These are monkeypatched to haev acces to tlinewidgets.py state
6
+# These are monkeypatched to have access to tlinewidgets.py state
7
_get_frame_for_x_func = None
8
_get_x_for_frame_func = None
9
10
11
first_clip_frame = first_clip_start + (frame - press_frame)
12
first_clip_x = _get_x_for_frame_func(first_clip_frame)
13
14
- snapped_x = -1 # if value stys same till end, no snapping has happened
15
+ snapped_x = -1 # if value stays same till end, no snapping has happened
16
snapped_x = _three_track_snap(track, x, first_clip_frame, first_clip_x)
17
18
# Return either original x or snapped x
19
20
21
frame_x = _get_x_for_frame_func(frame)
22
23
- snapped_x = -1 # if value stays same till end no snapping happened.
24
+ snapped_x = -1 # if value stays same till end, no snapping happened.
25
snapped_x = _three_track_snap(track, x, frame, frame_x)
26
27
# Return either original or snapped x
28
29
if edit_data == None:
30
return x
31
32
- snapped_x = -1 # if value stays same till end no snapping happened.
33
+ snapped_x = -1 # if value stays same till end, no snapping happened.
34
35
comp_in_frame = edit_data["clip_in"] + (frame - edit_data["press_frame"])
36
comp_in_x = _get_x_for_frame_func(comp_in_frame)
37
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/tlineaction.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/tlineaction.py
Changed
126
1
2
from operator import itemgetter
3
4
import appconsts
5
+import clipeffectseditor
6
import compositormodes
7
import dialogs
8
import dialogutils
9
10
"""
11
if MONITOR_MEDIA_FILE() == None:
12
# Info window here
13
- return
14
+ return None
15
16
if MONITOR_MEDIA_FILE().type != appconsts.PATTERN_PRODUCER:
17
new_clip = current_sequence().create_file_producer_clip(MONITOR_MEDIA_FILE().path)
18
19
action = edit.three_point_overwrite_action(data)
20
action.do_edit()
21
22
+ if not editorstate.timeline_visible():
23
+ updater.display_sequence_in_monitor()
24
+
25
updater.display_tline_cut_frame(track, range_in)
26
27
def range_overwrite_pressed():
28
29
30
updater.display_tline_cut_frame(track, track.get_clip_index_at(mark_in_frame))
31
32
+def delete_range_button_pressed():
33
+ # Get data
34
+ #track = current_sequence().get_first_active_track()
35
+ #if editevent.track_lock_check_and_user_info(track, range_overwrite_pressed, "range overwrite"):
36
+ # return
37
+ tracks = []
38
+ for i in range(1, len(current_sequence().tracks) - 1):
39
+ track = current_sequence().tracks[i]
40
+ if track.edit_freedom != appconsts.LOCKED:
41
+ tracks.append(track)
42
+
43
+ if len(tracks) == 0:
44
+ # all tracks are locked!
45
+ return
46
+
47
+ # tractor is has mark in and mark
48
+ mark_in_frame = current_sequence().tractor.mark_in
49
+ mark_out_frame = current_sequence().tractor.mark_out
50
+ range_length = mark_out_frame - mark_in_frame + 1 # end is incl.
51
+ if mark_in_frame == -1 or mark_out_frame == -1:
52
+ primary_txt = _("Timeline Range not set!")
53
+ secondary_txt = _("You need to set Timeline Range using Mark In and Mark Out buttons\nto perform this edit.")
54
+ dialogutils.info_message(primary_txt, secondary_txt, gui.editor_window.window)
55
+ return
56
+
57
+ movemodes.clear_selected_clips() # edit consumes selection
58
+
59
+ updater.save_monitor_frame = False # hack to not get wrong value saved in MediaFile.current_frame
60
+
61
+ data = {"tracks":tracks,
62
+ "mark_in_frame":mark_in_frame,
63
+ "mark_out_frame":mark_out_frame + 1} # +1 because mark is displayed and end of frame end this
64
+ # confirms to user expectation of
65
+ # of how this should work
66
+ action = edit.range_delete_action(data)
67
+ action.do_edit()
68
+
69
+ PLAYER().seek_frame(mark_in_frame)
70
+
71
def resync_button_pressed():
72
if movemodes.selected_track != -1:
73
syncsplitevent.resync_selected()
74
75
for i in range(movemodes.selected_range_in, movemodes.selected_range_out + 1):
76
77
clip = track.clips[i]
78
- print i, clip
79
if clip.is_blanck_clip == False:
80
clips.append(clip)
81
82
83
length) == False:
84
return
85
86
+ editorstate.transition_length = length
87
+
88
# Get from in and out frames
89
from_in = from_clip.clip_out - from_part + add_thingy
90
from_out = from_in + length # or transition will include one frame too many
91
92
window_text)
93
94
def _transition_render_complete(clip_path):
95
- print "render complete"
96
+ print "Render complete"
97
98
global transition_render_data
99
transition_index, from_clip, to_clip, track, from_in, to_out, transition_type = transition_render_data
100
101
gui.editor_window.window)
102
return
103
104
+
105
+ editorstate.fade_length = length
106
+
107
# Edit clears selection, get track index before selection is cleared
108
clip_index = movemodes.selected_range_in
109
movemodes.clear_selected_clips()
110
111
current_sequence().markers.append((name, current_frame))
112
current_sequence().markers = sorted(current_sequence().markers, key=itemgetter(1))
113
updater.repaint_tline()
114
+
115
+
116
+# ---------------------------------------- timeline edits
117
+def all_filters_off():
118
+ current_sequence().set_all_filters_active_state(False)
119
+ clipeffectseditor.update_stack_view()
120
+
121
+def all_filters_on():
122
+ current_sequence().set_all_filters_active_state(True)
123
+ clipeffectseditor.update_stack_view()
124
+
125
+
126
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/tlinewidgets.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/tlinewidgets.py
Changed
170
1
2
LEVELS_RENDER_ICON = None
3
SNAP_ICON = None
4
KEYBOARD_ICON = None
5
+CLOSE_MATCH_ICON = None
6
7
# tc scale
8
TC_POINTER_HEAD = None
9
10
POINTER_TRIANGLE_COLOR = (0.6, 0.7, 0.8, 0.7)
11
SHADOW_POINTER_COLOR = (0.5, 0.5, 0.5)
12
13
+MATCH_FRAME_LINES_COLOR = (0.78, 0.31, 0.31)
14
+
15
BLANK_SELECTED = (0.68, 0.68, 0.74)
16
17
TRACK_GRAD_STOP1 = (1, 0.68, 0.68, 0.68, 1) #0.93, 0.93, 0.93, 1)
18
19
# Dict for clip thumbnails path -> image
20
clip_thumbnails = {}
21
22
+# Timeline match image
23
+match_frame = -1
24
+match_frame_track_index = -1
25
+image_on_right = True
26
+match_frame_image = None
27
+match_frame_width = 1
28
+match_frame_height = 1
29
+
30
+
31
# ------------------------------------------------------------------- module functions
32
def load_icons():
33
global FULL_LOCK_ICON, FILTER_CLIP_ICON, VIEW_SIDE_ICON,\
34
COMPOSITOR_CLIP_ICON, INSERT_ARROW_ICON, AUDIO_MUTE_ICON, MARKER_ICON, \
35
VIDEO_MUTE_ICON, ALL_MUTE_ICON, TRACK_BG_ICON, MUTE_AUDIO_ICON, MUTE_VIDEO_ICON, MUTE_ALL_ICON, \
36
TRACK_ALL_ON_V_ICON, TRACK_ALL_ON_A_ICON, MUTE_AUDIO_A_ICON, TC_POINTER_HEAD, EDIT_INDICATOR, \
37
- LEVELS_RENDER_ICON, SNAP_ICON, KEYBOARD_ICON
38
+ LEVELS_RENDER_ICON, SNAP_ICON, KEYBOARD_ICON, CLOSE_MATCH_ICON
39
40
FULL_LOCK_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "full_lock.png")
41
FILTER_CLIP_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "filter_clip_icon_sharp.png")
42
43
LEVELS_RENDER_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "audio_levels_render.png")
44
SNAP_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "snap_magnet.png")
45
KEYBOARD_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "keyb_trim.png")
46
+ CLOSE_MATCH_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "close_match.png")
47
48
MARKER_ICON = _load_pixbuf("marker.png")
49
TRACK_ALL_ON_V_ICON = _load_pixbuf("track_all_on_V.png")
50
51
global BG_COLOR
52
BG_COLOR = get_multiplied_color((r, g, b), 1.25)
53
54
+def set_match_frame(tline_match_frame, track_index, display_on_right):
55
+ global match_frame, match_frame_track_index, image_on_right, match_frame_image
56
+ match_frame = tline_match_frame
57
+ match_frame_track_index = track_index
58
+ image_on_right = display_on_right
59
+ match_frame_image = None
60
+
61
+def match_frame_close_hit(x, y):
62
+ if match_frame == -1:
63
+ return False
64
+
65
+ if image_on_right == True:
66
+ frame_adj = 0
67
+ img_pos_adj = 0
68
+ else:
69
+ frame_adj = 1
70
+ img_pos_adj = int(match_frame_width)
71
+
72
+ scale_in = (match_frame + frame_adj - pos) * pix_per_frame
73
+
74
+ test_x = scale_in - img_pos_adj + 4
75
+ test_y = 24
76
+ if (x >= test_x and x <= test_x + 12) and (y >= test_y and y <= test_y + 12):
77
+ return True
78
+
79
+ return False
80
+
81
def _load_pixbuf(icon_file):
82
return cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + icon_file)
83
84
85
if EDIT_MODE() != editorstate.SLIDE_TRIM and fake_current_frame != None:
86
PLAYER().seek_frame(fake_current_frame)
87
fake_current_frame = None
88
+
89
+ # Draw match frame
90
+ self.draw_match_frame(cr)
91
92
# Draw frame pointer
93
if EDIT_MODE() != editorstate.SLIDE_TRIM or PLAYER().looping():
94
95
cr.arc(parent_x + pad, parent_y + pad, small_radius, 0.0 * degrees, 360.0 * degrees)
96
cr.fill()
97
98
+ def draw_match_frame(self, cr):
99
+ if match_frame == -1:
100
+ return
101
+
102
+ global match_frame_image
103
+ if match_frame_image == None:
104
+ self.create_match_frame_image_surface()
105
+
106
+ if image_on_right == True:
107
+ dir_mult = 1
108
+ frame_adj = 0
109
+ img_pos_adj = 0
110
+ else:
111
+ dir_mult = -1
112
+ frame_adj = 1
113
+ img_pos_adj = int(match_frame_width)
114
+
115
+ scale_in = (match_frame + frame_adj - pos) * pix_per_frame
116
+
117
+ cr.set_source_surface(match_frame_image, scale_in - img_pos_adj, 20)
118
+ cr.paint_with_alpha(0.7)
119
+
120
+ cr.set_source_surface(CLOSE_MATCH_ICON, scale_in - img_pos_adj + 4, 24)
121
+ cr.paint()
122
+
123
+ cr.set_source_rgb(*MATCH_FRAME_LINES_COLOR)
124
+ cr.set_line_width(2.0)
125
+ cr.rectangle(int(scale_in) - img_pos_adj, 20, int(match_frame_width), int(match_frame_height))
126
+ cr.stroke()
127
+
128
+ cr.move_to(int(scale_in), 0, )
129
+ cr.line_to(int(scale_in), int(match_frame_height) + 42)
130
+ cr.stroke()
131
+
132
+ start_y = _get_track_y(match_frame_track_index)
133
+ end_y = _get_track_y(match_frame_track_index - 1)
134
+
135
+ cr.move_to (int(scale_in) + 8 * dir_mult, start_y)
136
+ cr.line_to (int(scale_in), start_y)
137
+ cr.line_to (int(scale_in), end_y + 1)
138
+ cr.line_to (int(scale_in) + 8 * dir_mult, end_y + 1)
139
+ cr.set_source_rgb(0.2, 0.2, 0.2)
140
+ cr.set_line_width(4.0)
141
+ cr.stroke()
142
+
143
+ def create_match_frame_image_surface(self):
144
+ # Create non-scaled icon
145
+ matchframe_path = utils.get_hidden_user_dir_path() + appconsts.MATCH_FRAME
146
+ icon = cairo.ImageSurface.create_from_png(matchframe_path)
147
+
148
+ # Create and return scaled icon
149
+ allocation = canvas_widget.widget.get_allocation()
150
+ x, y, w, h = allocation.x, allocation.y, allocation.width, allocation.height
151
+ profile_screen_ratio = float(PROJECT().profile.width()) / float(PROJECT().profile.height())
152
+
153
+ global match_frame_width, match_frame_height
154
+ match_frame_height = h - 40
155
+ match_frame_width = match_frame_height * profile_screen_ratio
156
+
157
+ scaled_icon = cairo.ImageSurface(cairo.FORMAT_ARGB32, int(match_frame_width), int(match_frame_height))
158
+ cr = cairo.Context(scaled_icon)
159
+ cr.scale(float(match_frame_width) / float(icon.get_width()), float(match_frame_height) / float(icon.get_height()))
160
161
+ cr.set_source_surface(icon, 0, 0)
162
+ cr.paint()
163
+
164
+ global match_frame_image
165
+ match_frame_image = scaled_icon
166
+
167
class TimeLineColumn:
168
"""
169
GUI component for displaying and editing track parameters.
170
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/tools/batchrendering.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/tools/batchrendering.py
Changed
11
1
2
3
import datetime
4
5
+import gi
6
+gi.require_version('Gtk', '3.0')
7
+
8
from gi.repository import GObject, GLib
9
from gi.repository import Gtk, Gdk, GdkPixbuf
10
11
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/tools/gmic.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/tools/gmic.py
Changed
130
1
2
along with Flowblade Movie Editor. If not, see <http://www.gnu.org/licenses/>.
3
"""
4
5
+import gi
6
+gi.require_version('Gtk', '3.0')
7
+gi.require_version('PangoCairo', '1.0')
8
+
9
from gi.repository import GObject, GLib
10
from gi.repository import Gtk, Gdk, GdkPixbuf
11
from gi.repository import GdkX11
12
13
_current_profile_index = None
14
_render_data = None
15
_last_load_file = None
16
-
17
+
18
+_startup_data = None
19
+
20
_encoding_panel = None
21
22
# GTK3 requires this to be created outside of callback
23
24
_gmic_found = True
25
else:
26
print "G'MIC NOT found"
27
-
28
-def launch_gmic():
29
+
30
+def gmic_available():
31
+ return _gmic_found
32
+
33
+def launch_gmic(launch_data=None):
34
if _gmic_found == False:
35
primary_txt = _("G'Mic not found!")
36
secondary_txt = _("G'Mic binary was not present at <b>/usr/bin/gmic</b>.\nInstall G'MIC to use this tool.")
37
dialogutils.info_message(primary_txt, secondary_txt, gui.editor_window.window)
38
return
39
40
- print "Launch gmic..."
41
gui.save_current_colors()
42
-
43
- FLOG = open(utils.get_hidden_user_dir_path() + "log_gmic", 'w')
44
- subprocess.Popen([sys.executable, respaths.LAUNCH_DIR + "flowbladegmic"], stdin=FLOG, stdout=FLOG, stderr=FLOG)
45
-
46
47
+ # Handle launching with clip data
48
+ args = None
49
+ if launch_data != None:
50
+ clip, track = launch_data # from guicomponwnts._get_tool_integration_menu_item()
51
+ args = ("path:" + str(clip.path), "clip_in:" + str(clip.clip_in), "clip_out:" + str(clip.clip_out))
52
+
53
+ print "Launch gmic..."
54
+ FLOG = open(utils.get_hidden_user_dir_path() + "log_gmic", 'w')
55
+ if args == None:
56
+ subprocess.Popen([sys.executable, respaths.LAUNCH_DIR + "flowbladegmic"], stdin=FLOG, stdout=FLOG, stderr=FLOG)
57
+ else:
58
+ subprocess.Popen([sys.executable, respaths.LAUNCH_DIR + "flowbladegmic", args[0], args[1], args[2]], stdin=FLOG, stdout=FLOG, stderr=FLOG)
59
+
60
+def _get_arg_value(args, key_str):
61
+ for arg in sys.argv:
62
+ parts = arg.split(":")
63
+ if len(parts) > 1:
64
+ if parts[0] == key_str:
65
+ return parts[1]
66
+
67
+ return None
68
+
69
def main(root_path, force_launch=False):
70
71
gtk_version = "%s.%s.%s" % (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version())
72
73
74
os.putenv('SDL_WINDOWID', str(_window.monitor.get_window().get_xid()))
75
Gdk.flush()
76
+
77
+ # Start with a clip loaded if data provided
78
+ if len(sys.argv) > 1:
79
+ path = _get_arg_value(sys.argv, "path")
80
+ mark_in = int(_get_arg_value(sys.argv, "clip_in"))
81
+ mark_out = int(_get_arg_value(sys.argv, "clip_out"))
82
+ global _startup_data
83
+ _startup_data = (path, mark_in, mark_out)
84
+ GLib.idle_add(_load_startup_data)
85
86
Gtk.main()
87
Gdk.threads_leave()
88
89
+def _load_startup_data():
90
+ path, mark_in, mark_out = _startup_data
91
+ _do_file_load(path)
92
+ GLib.idle_add(_finish_load_startup_data)
93
+
94
+def _finish_load_startup_data():
95
+ path, mark_in, mark_out = _startup_data
96
+ _player.producer.mark_in = mark_in
97
+ _player.producer.mark_out = mark_out
98
+
99
+ _window.update_marks_display()
100
+ _window.pos_bar.update_display_from_producer(_player.producer)
101
+ _window.update_render_status_info()
102
+
103
def init_frames_dirs():
104
os.mkdir(get_clip_frames_dir())
105
os.mkdir(get_render_frames_dir())
106
107
if utils.get_file_type(filenames[0]) != "video":
108
return
109
110
- global _last_load_file
111
- _last_load_file = filenames[0]
112
+ _do_file_load(filenames[0])
113
114
+def _do_file_load(file_path):
115
+ global _last_load_file
116
+ _last_load_file = file_path
117
+
118
global _current_path, _render_data
119
120
# if another clip has already been opened then we need to shutdown players.
121
122
if _effect_renderer != None:
123
_effect_renderer.shutdown()
124
125
- _current_path = filenames[0]
126
+ _current_path = file_path
127
128
# Finish clip open when dialog has been destroyed
129
GLib.idle_add(_finish_clip_open)
130
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/tools/toolnatron.py
Added
59
1
2
+"""
3
+ Flowblade Movie Editor is a nonlinear video editor.
4
+ Copyright 2014 Janne Liljeblad.
5
+
6
+ This file is part of Flowblade Movie Editor <http://code.google.com/p/flowblade>.
7
+
8
+ Flowblade Movie Editor is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ (at your option) any later version.
12
+
13
+ Flowblade Movie Editor is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with Flowblade Movie Editor. If not, see <http://www.gnu.org/licenses/>.
20
+"""
21
+
22
+import md5
23
+import os
24
+import subprocess
25
+import sys
26
+
27
+import appconsts
28
+import respaths
29
+import utils
30
+
31
+_natron_found = False
32
+
33
+def init():
34
+ global _natron_found
35
+ if utils.program_is_installed("Natron"):
36
+ _natron_found = True
37
+ print "Natron found"
38
+ else:
39
+ _natron_found = False
40
+ print "Natron not found"
41
+
42
+def natron_available():
43
+ return _natron_found
44
+
45
+def export_clip(clip):
46
+ # Write export data file
47
+ natron_dir = utils.get_hidden_user_dir_path() + appconsts.NATRON_DIR + "/"
48
+ file_path = natron_dir + "clipexport_" + md5.new(str(os.urandom(32))).hexdigest()
49
+ data_text = clip.path + " " + str(clip.clip_in) + " " + str(clip.clip_out + 1)
50
+
51
+ export_data_file = open(file_path, "w")
52
+ export_data_file.write(data_text)
53
+ export_data_file.close()
54
+
55
+ # Launch Natron
56
+ print "Launch Natron..."
57
+ args = [str(respaths.LAUNCH_DIR + "natron_clip_export_start.sh"), str(respaths.LAUNCH_DIR)]
58
+ subprocess.Popen(args)
59
flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/toolsintegration.py
Added
113
1
2
+"""
3
+ Flowblade Movie Editor is a nonlinear video editor.
4
+ Copyright 2012 Janne Liljeblad.
5
+
6
+ This file is part of Flowblade Movie Editor <http://code.google.com/p/flowblade>.
7
+
8
+ Flowblade Movie Editor is free software: you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation, either version 3 of the License, or
11
+ (at your option) any later version.
12
+
13
+ Flowblade Movie Editor is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with Flowblade Movie Editor. If not, see <http://www.gnu.org/licenses/>.
20
+"""
21
+import copy
22
+
23
+import appconsts
24
+from editorstate import PROJECT
25
+import gmic
26
+import toolnatron
27
+import render
28
+
29
+_tools = []
30
+_active_integrators = []
31
+
32
+# --------------------------------------------------- interface
33
+def init():
34
+
35
+ if gmic.gmic_available():
36
+ _tools.append(GMICIntegrator())
37
+
38
+ if toolnatron.natron_available():
39
+ _tools.append(NatronIntegrator())
40
+
41
+ _tools.append(SlowMoIntegrator())
42
+
43
+def get_export_integrators():
44
+ export_integrators = []
45
+ for tool_integrator in _tools:
46
+ if tool_integrator.is_export_target == True:
47
+ export_integrators.append(tool_integrator)
48
+
49
+ return export_integrators
50
+
51
+# --------------------------------------------------- integrator classes
52
+class ToolIntegrator:
53
+
54
+ def __init__(self, tool_name, supported_media_types,is_export_target):
55
+ self.tool_name = tool_name
56
+ self.is_export_target = is_export_target
57
+ self.supported_media_types = supported_media_types
58
+ self.data = None # Used at call sites to give needed info for exports
59
+
60
+ def activate(self):
61
+ _active_integrators.append(self)
62
+
63
+ def deactivate(self):
64
+ _active_integrators.remove(self)
65
+
66
+ def supports_clip_media(self, clip):
67
+ if clip.media_type in self.supported_media_types:
68
+ return True
69
+ else:
70
+ return False
71
+
72
+ def export_callback(self, widget, data):
73
+ new_instance = copy.deepcopy(self)
74
+ new_instance.data = data
75
+ new_instance.activate()
76
+ new_instance.do_export()
77
+
78
+ def do_export(self):
79
+ print self.__class__.__name__ + " does not implement do_export()"
80
+
81
+
82
+
83
+class GMICIntegrator(ToolIntegrator):
84
+
85
+ def __init__(self):
86
+ ToolIntegrator.__init__(self, _("G'MIC Effects"), [appconsts.VIDEO], True)
87
+
88
+ def do_export(self):
89
+ gmic.launch_gmic(self.data) # tuple (clip, track)
90
+
91
+
92
+class NatronIntegrator(ToolIntegrator):
93
+ def __init__(self):
94
+ ToolIntegrator.__init__(self, _("Natron"), [appconsts.VIDEO], True)
95
+
96
+ def do_export(self):
97
+ clip, track = self.data
98
+ toolnatron.export_clip(clip)
99
+
100
+
101
+class SlowMoIntegrator(ToolIntegrator):
102
+
103
+ def __init__(self):
104
+ ToolIntegrator.__init__(self, _("Slow/Fast Motion"), [appconsts.VIDEO], True)
105
+
106
+ def do_export(self):
107
+ clip, track = self.data
108
+ media_file = PROJECT().get_media_file_for_path(clip.path)
109
+ media_file.mark_in = clip.clip_in
110
+ media_file.mark_out = clip.clip_out
111
+ render.render_frame_buffer_clip(media_file, True)
112
+
113
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/trackaction.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/trackaction.py
Changed
35
1
2
current_sequence().maximize_audio_tracks_height(gui.tline_canvas.widget.get_allocation())
3
_tracks_resize_update()
4
5
+ if msg == "allactive":
6
+ _activate_all_tracks()
7
+
8
+ if msg == "topactiveonly":
9
+ _activate_only_current_top_active()
10
+
11
def _tracks_resize_update():
12
tlinewidgets.set_ref_line_y(gui.tline_canvas.widget.get_allocation())
13
gui.tline_column.init_listeners()
14
updater.repaint_tline()
15
gui.tline_column.widget.queue_draw()
16
17
+def _activate_all_tracks():
18
+ for i in range(0, len(current_sequence().tracks) - 1):
19
+ current_sequence().tracks[i].active = True
20
+
21
+ gui.tline_column.widget.queue_draw()
22
+
23
+def _activate_only_current_top_active():
24
+ for i in range(0, len(current_sequence().tracks) - 1):
25
+ if i == current_sequence().get_first_active_track().id:
26
+ current_sequence().tracks[i].active = True
27
+ else:
28
+ current_sequence().tracks[i].active = False
29
+
30
+ gui.tline_column.widget.queue_draw()
31
+
32
def audio_levels_menu_launch_pressed(widget, event):
33
guicomponents.get_audio_levels_popup_menu(event, _audio_levels_item_activated)
34
35
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/translations.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/translations.py
Changed
10
1
2
print "Use OS locale language."
3
lang = gettext.translation(APP_NAME, locale_path, languages=langs, fallback=True)
4
5
- # Un-comment for translations test
6
+ # Un-comment for translations tests
7
#lang = gettext.translation(APP_NAME, locale_path, languages=["fi"], fallback=True)
8
9
lang.install(APP_NAME) # makes _() a build-in available in all modules without imports
10
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/trimmodes.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/trimmodes.py
Changed
201
1
2
Module handles user edit events for trim, roll and slip trim modes.
3
"""
4
5
+import traceback
6
+
7
import appconsts
8
import dialogutils
9
import edit
10
11
import gui
12
import tlinewidgets
13
import updater
14
+import utils
15
16
# Default value for pre- and post roll in loop playback
17
DEFAULT_LOOP_HALF_LENGTH = 25
18
19
frame = edit_data["selected_frame"] - delta
20
frame = _legalize_one_roll_trim(frame, edit_data["trim_limits"])
21
edit_data["selected_frame"] = frame
22
+ gui.monitor_widget.set_edit_tline_frame(frame, frame - edit_data["edit_frame"])
23
24
PLAYER().seek_frame(frame)
25
26
27
frame = edit_data["selected_frame"] + delta
28
frame = _legalize_one_roll_trim(frame, edit_data["trim_limits"])
29
edit_data["selected_frame"] = frame
30
+ gui.monitor_widget.set_edit_tline_frame(frame, frame - edit_data["edit_frame"])
31
32
PLAYER().seek_frame(frame)
33
34
35
frame = _legalize_two_roll_trim(frame, edit_data["trim_limits"])
36
edit_data["selected_frame"] = frame
37
38
+ gui.monitor_widget.set_edit_tline_frame(frame, frame - edit_data["edit_frame"])
39
+ gui.monitor_widget.update_roll_match_frame()
40
+
41
PLAYER().seek_frame(frame)
42
43
def _tworoll_trim_right(delta):
44
45
frame = _legalize_two_roll_trim(frame, edit_data["trim_limits"])
46
edit_data["selected_frame"] = frame
47
48
+ gui.monitor_widget.set_edit_tline_frame(frame, frame - edit_data["edit_frame"])
49
+ gui.monitor_widget.update_roll_match_frame()
50
+
51
PLAYER().seek_frame(frame)
52
53
def _tworoll_enter_edit():
54
55
trim_limits = edit_data["trim_limits"]
56
edit_data["press_start"] = trim_limits["clip_start"] + 1 # this can be anything the relevant thing here is mouse delta
57
edit_data["keyboard_selected_frame"] = edit_data["press_start"] - delta
58
-
59
+
60
+ total_delta = edit_data["press_start"] - edit_data["keyboard_selected_frame"]
61
+ gui.monitor_widget.set_slip_edit_tline_frame(edit_data["clip"], total_delta)
62
+
63
display_frame = _update_slide_trim_for_mouse_frame(edit_data["keyboard_selected_frame"])
64
PLAYER().seek_frame(display_frame)
65
66
67
edit_data["press_start"] = trim_limits["clip_start"] + 1 # this can be anything the relevant thing here is mouse delta
68
edit_data["keyboard_selected_frame"] = edit_data["press_start"] + delta
69
70
+ total_delta = edit_data["press_start"] - edit_data["keyboard_selected_frame"]
71
+ gui.monitor_widget.set_slip_edit_tline_frame(edit_data["clip"], total_delta)
72
+
73
display_frame = _update_slide_trim_for_mouse_frame(edit_data["keyboard_selected_frame"])
74
PLAYER().seek_frame(display_frame)
75
76
77
clip = edit_data["from_clip"]
78
clip_start = trim_limits["from_start"]
79
80
- # Display trim clip
81
+ # Init trim view layout
82
+ if track.type == appconsts.VIDEO and clip.media_type != appconsts.PATTERN_PRODUCER:
83
+ if edit_data["to_side_being_edited"]:
84
+ gui.monitor_widget.set_start_trim_view(edit_data["from_clip"], clip_start)
85
+ else:
86
+ gui.monitor_widget.set_end_trim_view(edit_data["to_clip"], clip_start)
87
+ gui.monitor_widget.set_edit_tline_frame(current_frame, current_frame - edit_frame)
88
+ else:
89
+ gui.monitor_widget.set_default_view()
90
+
91
+ # Set interactive trimview on hidden track
92
if clip.media_type != appconsts.PATTERN_PRODUCER:
93
current_sequence().display_trim_clip(clip.path, clip_start) # file producer
94
else:
95
96
global edit_data
97
frame = _legalize_one_roll_trim(frame, edit_data["trim_limits"])
98
edit_data["selected_frame"] = frame
99
-
100
+ gui.monitor_widget.set_edit_tline_frame(frame, frame - edit_data["edit_frame"])
101
+
102
PLAYER().seek_frame(frame)
103
104
def oneroll_trim_release(x, y, frame, state):
105
106
tlinewidgets.trim_mode_in_non_active_state = False
107
gui.tline_canvas.widget.queue_draw()
108
return
109
-
110
+
111
+ gui.monitor_widget.one_roll_mouse_release(edit_data["edit_frame"], frame - edit_data["edit_frame"])
112
+
113
_do_one_roll_trim_edit(frame)
114
115
def _do_one_roll_trim_edit(frame):
116
117
def set_tworoll_mode(track, current_frame = -1):
118
"""
119
Sets two roll mode
120
- """
121
+ """
122
if track == None:
123
return False
124
125
+ current_frame_trim_view_fix = 0
126
if current_frame == -1:
127
current_frame = PLAYER().producer.frame() + 1 # +1 because cut frame selects previous clip
128
+ current_frame_trim_view_fix = -1 # when initing trim view the +1 for current frame needs to be undone
129
130
if current_frame >= track.get_length():
131
return False
132
133
else:
134
clip = edit_data["from_clip"]
135
clip_start = trim_limits["from_start"]
136
+
137
+ # Init two roll trim view layout
138
+ if track.type == appconsts.VIDEO and clip.media_type != appconsts.PATTERN_PRODUCER:
139
+ if edit_data["to_side_being_edited"]:
140
+ gui.monitor_widget.set_roll_trim_right_active_view(edit_data["from_clip"], clip_start)
141
+ else:
142
+ gui.monitor_widget.set_roll_trim_left_active_view(edit_data["to_clip"], clip_start)
143
+ gui.monitor_widget.set_edit_tline_frame(current_frame + current_frame_trim_view_fix,
144
+ current_frame + current_frame_trim_view_fix - edit_frame)
145
+ else:
146
+ gui.monitor_widget.set_default_view()
147
+
148
+ # Set interactive trim view clip on hidden track
149
if clip.media_type != appconsts.PATTERN_PRODUCER:
150
current_sequence().display_trim_clip(clip.path, clip_start) # File producer
151
else:
152
153
frame = _legalize_two_roll_trim(frame, edit_data["trim_limits"])
154
edit_data["selected_frame"] = frame
155
156
+ gui.monitor_widget.set_edit_tline_frame(frame, frame - edit_data["edit_frame"])
157
+ gui.monitor_widget.update_roll_match_frame()
158
+
159
PLAYER().seek_frame(frame)
160
161
def tworoll_trim_release(x, y, frame, state):
162
163
164
frame = _legalize_two_roll_trim(frame, edit_data["trim_limits"])
165
edit_data["selected_frame"] = frame
166
+
167
+ gui.monitor_widget.set_edit_tline_frame(frame, frame - edit_data["edit_frame"])
168
+ gui.monitor_widget.update_roll_match_frame()
169
+
170
_do_two_roll_edit(frame)
171
172
def tworoll_play_pressed():
173
174
# Calculated frame always reinits in to side, so we need to
175
# step one back to reinit on from side if we did the edit from that side
176
if to_side_being_edited != True:
177
- frame = frame - 1
178
+ frame = frame - 2
179
if frame < 0:
180
frame = 0
181
182
183
184
return (first, last)
185
186
-#---------------------------------------- SLIDE ROLL TRIM EVENTS
187
-def set_slide_mode(track, current_frame):
188
+#---------------------------------------- SLIP ROLL TRIM EVENTS
189
+def set_slide_mode(track, current_frame): # we need to change to to correct one some time
190
"""
191
- Sets two roll mode
192
+ Sets SLIP tool mode
193
"""
194
if track == None:
195
return None
196
197
clip = edit_data["clip"]
198
clip_start = 0 # we'll calculate the offset from actual position of clip on timeline to display the frame displayed after sliding
199
200
+ # Init two roll trim view layout
201
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/updater.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/updater.py
Changed
108
1
2
MONITOR_MEDIA_FILE().mark_in = mark_in
3
MONITOR_MEDIA_FILE().mark_out = mark_out
4
5
- display_monitor_clip_name()
6
-
7
# Display frame, marks and pos
8
gui.pos_bar.update_display_from_producer(clip_producer)
9
+
10
+ display_monitor_clip_name()
11
12
if MONITOR_MEDIA_FILE().type == appconsts.IMAGE or \
13
MONITOR_MEDIA_FILE().type == appconsts.PATTERN_PRODUCER:
14
15
16
repaint_tline()
17
18
-def display_monitor_clip_name():
19
- # Display clip name
20
+def display_monitor_clip_name():#we're displaying length and range length also
21
+ tc_info = utils.get_tc_string(gui.pos_bar.producer.get_length())
22
if MONITOR_MEDIA_FILE().mark_in != -1 and MONITOR_MEDIA_FILE().mark_out != -1:
23
clip_length = utils.get_tc_string(MONITOR_MEDIA_FILE().mark_out - MONITOR_MEDIA_FILE().mark_in + 1) #+1 out incl.
24
- range_text = " / ][ " + str(clip_length)
25
+ tc_info = tc_info + " ][ " + str(clip_length)
26
else:
27
- range_text = ""
28
+ tc_info = tc_info + " ][ --:--:--:--"
29
30
- gui.editor_window.monitor_source.set_text(MONITOR_MEDIA_FILE().name + range_text)
31
+ gui.editor_window.monitor_source.set_text(MONITOR_MEDIA_FILE().name)
32
+ gui.editor_window.info1.set_text(tc_info)
33
34
def display_sequence_in_monitor():
35
"""
36
37
PLAYER().seek_frame(saved_timeline_pos)
38
saved_timeline_pos = -1
39
40
- # Display sequence name
41
- name = editorstate.current_sequence().name
42
- profile_desc = editorstate.current_sequence().profile.description()
43
- if editorpersistance.prefs.show_sequence_profile:
44
- gui.editor_window.monitor_source.set_text(name + " / " + profile_desc)
45
- else:
46
- gui.editor_window.monitor_source.set_text(name)
47
+ update_seqence_info_text()
48
49
# Display marks and pos
50
gui.pos_bar.update_display_from_producer(PLAYER().producer)
51
52
53
repaint_tline()
54
55
+def update_seqence_info_text():
56
+ name = editorstate.current_sequence().name
57
+ profile_desc = editorstate.current_sequence().profile.description()
58
+
59
+ if editorpersistance.prefs.show_sequence_profile:
60
+ gui.editor_window.monitor_source.set_text(name + " - " + profile_desc)
61
+ else:
62
+ gui.editor_window.monitor_source.set_text(name)
63
+
64
+ prog_len = PLAYER().producer.get_length()
65
+ if prog_len < 2: # # to 'fix' the single frame black frame at start, will bug for actual 1 frame sequences
66
+ prog_len = 0
67
+
68
+ range_len = PLAYER().producer.mark_out - PLAYER().producer.mark_in + 1 # +1, out incl.
69
+ tc_info = utils.get_tc_string(prog_len)
70
+ if PLAYER().producer.mark_in != -1 and PLAYER().producer.mark_out != -1:
71
+ tc_info = tc_info + " ][ " + utils.get_tc_string(range_len)
72
+ else:
73
+ tc_info = tc_info + " ][ --:--:--:--"
74
+
75
+ gui.editor_window.info1.set_text(tc_info)
76
+
77
def switch_monitor_display():
78
monitorevent.stop_pressed()
79
if editorstate.MONITOR_MEDIA_FILE() == None:
80
81
def display_marks_tc():
82
if not timeline_visible():
83
display_monitor_clip_name()
84
+ else:
85
+ update_seqence_info_text()
86
87
# ----------------------------------------------- clip editors
88
def clip_removed_during_edit(clip):
89
90
Called when user selects move mode
91
"""
92
display_sequence_in_monitor()
93
+ gui.monitor_widget.set_default_view()
94
95
def set_transition_render_edit_menu_items_sensitive(range_start, range_end):
96
if not editorstate.current_is_move_mode():
97
98
render_transition.set_sensitive(False)
99
render_fade.set_sensitive(False)
100
101
+"""
102
# ------------------------------------------------ notebook
103
def switch_notebook_panel(index):
104
gui.middle_notebook.set_current_page(index)
105
106
-
107
+"""
108
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/utils.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/utils.py
Changed
64
1
2
"""
3
Helper functions and data
4
"""
5
-
6
+import time
7
8
from gi.repository import Gtk
9
10
11
import appconsts
12
import editorstate
13
14
+_start_time = 0.0
15
+
16
# ---------------------------------- CLASSES
17
class EmptyClass:
18
pass
19
20
else:
21
return True
22
23
+def program_is_installed(program):
24
+ def is_exe(fpath):
25
+ return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
26
+
27
+ fpath, fname = os.path.split(program)
28
+ if fpath:
29
+ if is_exe(program):
30
+ return True
31
+ else:
32
+ for path in os.environ["PATH"].split(os.pathsep):
33
+ path = path.strip('"')
34
+ exe_file = os.path.join(path, program)
35
+ if is_exe(exe_file):
36
+ return True
37
+
38
+ return False
39
+
40
# File exntension lists
41
_audio_file_extensions = [ "act",
42
"aif",
43
44
"xvid",
45
"y4m",
46
"yuv"]
47
+
48
+
49
+def start_timing(msg="start timing"):
50
+ global _start_time
51
+ _start_time = time.time()
52
+ print msg
53
+
54
+def elapsed_time(msg="elapsed: ", show_in_millis=True):
55
+ elapsed_time = time.time() - _start_time
56
+ if show_in_millis:
57
+ elapsed_time = round(elapsed_time * 1000.0, 1)
58
+ unit = "ms"
59
+ else:
60
+ unit = "s"
61
+
62
+ print msg + " " + str(elapsed_time) + " " + unit
63
+
64
flowblade-1.8.tar.gz/flowblade-trunk/Flowblade/vieweditor/vieweditor.py -> flowblade-1.10.tar.gz/flowblade-trunk/Flowblade/vieweditor/vieweditor.py
Changed
11
1
2
self.origo = (0.0, 0.0)
3
img_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.profile_w, self.profile_h)
4
cr = cairo.Context(img_surface)
5
- #cr.translate(-1.0 /ox, 0.0)
6
7
-
8
for editorlayer in self.edit_layers:
9
if editorlayer.visible:
10
editorlayer.draw(cr, self.write_out_layers, self.draw_overlays)
11
flowblade-1.10.tar.gz/flowblade-trunk/docs/1-10-timeline_match_frame.jpg
Added
flowblade-1.10.tar.gz/flowblade-trunk/docs/1-10_dual_monitor.jpg
Added
flowblade-1.10.tar.gz/flowblade-trunk/docs/1-10_monitor_match_frame.jpg
Added
flowblade-1.10.tar.gz/flowblade-trunk/docs/1-10_trimview.jpg
Added
flowblade-1.8.tar.gz/flowblade-trunk/docs/KNOWN_ISSUES.md -> flowblade-1.10.tar.gz/flowblade-trunk/docs/KNOWN_ISSUES.md
Changed
18
1
2
3
**Status:** No work on a fix is planned.
4
5
+#### 5. Using Affine filter on .png file may result in image errors
6
+Image describing issue here: http://i.xomf.com/rfncv.png
7
+
8
+**Status:** No work on a fix is planned. *Affine* filter is not part rodamap on improving Flowblade's motion graphics capabilities and will not be worked on.
9
+
10
+
11
+#### 6. Title causes distortion in mixed aspect ratio project
12
+
13
+Problem is described in Issue #258.
14
+
15
+**Status:** Some fix may be attempted later.
16
+
17
18
flowblade-1.8.tar.gz/flowblade-trunk/docs/RELEASE_NOTES.md -> flowblade-1.10.tar.gz/flowblade-trunk/docs/RELEASE_NOTES.md
Changed
19
1
2
3
## Flowblade 1.8 ##
4
5
-**Date: September 2, 2016**
6
+**Date: September 19, 2016**
7
8
**Flowblade 1.8** is the twelth release of Flowblade.
9
10
11
12
### Flowblade Main Features ###
13
14
-* **Keybord trimming with arrow keys** Trim positions can now be moved using arrow keys and trim edit confirmed with pressing Enter key. This is often more convenient and previse then always working with a mouse
15
+* **Keybord trimming with arrow keys** Trim positions can now be moved using arrow keys and trim edit confirmed with pressing Enter key. This is often more convenient and precise then always working with a mouse
16
* **Clip Snapping** Clips and compositors will now snap to clip ends on adjacent tracks when clips or compositors are moved or their ends dragged.
17
* **Clips display media thumbnails** This helps differentiating clips from each other on timeline.
18
* **EDL export** is now available. Thanks to Github user *tin2tin* for extensive testing on software not available on my system. Unfortunately it became clear that Blender EDL import is buggy.
19
flowblade-1.8.tar.gz/flowblade-trunk/flowblade -> flowblade-1.10.tar.gz/flowblade-trunk/flowblade
Changed
12
1
2
import os
3
import sys
4
5
-print "FLOWBLADE MOVIE EDITOR repository 1.8"
6
-print "-------------------------------------"
7
+print "FLOWBLADE MOVIE EDITOR 1.10"
8
+print "---------------------------"
9
10
11
# Get launch script dir
12
flowblade-1.8.tar.gz/flowblade-trunk/setup.py -> flowblade-1.10.tar.gz/flowblade-trunk/setup.py
Changed
10
1
2
locale_files.append(filepath)
3
4
setup( name='flowblade',
5
- version='1.8.0',
6
+ version='1.10.0',
7
author='Janne Liljeblad',
8
author_email='janne.liljeblad at gmail dot com',
9
description='Non-linear video editor',
10