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 14
_service
Changed
x
1
2
<services>
3
<service name="obs_scm">
4
<param name="filename">flowblade</param>
5
- <param name="revision">1342c4ccd2ccdf338f775f0117f01b6cf79c3b3f</param>
6
+ <param name="revision">afe12336f1e731f1269726afe77699ecabfea474</param>
7
<param name="scm">git</param>
8
<param name="submodules">disable</param>
9
<param name="url">https://github.com/jliljebl/flowblade.git</param>
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/add_fade_in@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/add_fade_out@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/append_media_log@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/audio_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/audio_levels_menu_launch@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/clip_button@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/clip_button_active@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/columns@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/compositor_icon@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/cut@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/cut_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/delete_kf@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/delete_log_range@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/delete_range@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/dissolve@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filter_add@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filter_add_not_active@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filter_delete@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filter_load@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filter_reset@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filter_save@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filters_all_toggle@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filters_mask_add@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filters_mask_add_not_active@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filters_move_bottom@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filters_move_down@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filters_move_top@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/filters_move_up@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/full_track_auto@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/fullscreen@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/fullscreen_exit@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/generator_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/gmic_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/graphics_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/hamburger_not_active@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/has_proxy_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/hide_bad@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/imgseq_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/insert_clip@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/insert_media_log@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/insertmove_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/is_proxy_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_active@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_edit_kf_to_next_frame@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_edit_kf_to_prev_frame@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_edit_next_frame@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_edit_prev_frame@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_not_active_tool@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/kftool_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/layout@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/lift@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/log_range@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/marker@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/media_panel_empty@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/monitor_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/multimove_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/multitrim_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/next_frame_s@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/next_kf@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/oneroll_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/oneroll_cursor_ripple@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/oneroll_noedit_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/oneroll_tool@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/open_fluxity@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/open_gmic@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/open_mixer@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/open_renderqueue@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/open_titler@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/overwrite_clip@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/overwrite_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/overwrite_cursor_box@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/overwrite_range@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/overwrite_tool@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/pattern_producer_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/play_2_s@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/play_pause_s@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/prev_frame_s@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/prev_kf@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/profile_warning@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/program_view_2@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/redo@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/resync@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/resync_track@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/rgbparade@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/ripple_delete@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/selection_indicator@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_all_files@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_all_ratings@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_audio_files@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_favorites@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_graphics_files@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_imgseq_files@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_pattern_producers@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/show_video_files@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/slide_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/slide_noedit_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/splice_out@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/split_audio@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/standard_auto@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/star@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/star_not_active@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/stop_s@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/timeline_button@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/timeline_button_active@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/to_end@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/to_mark_in_s@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/to_mark_out_s@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/to_start@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/top_down@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/top_down_auto@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_menu_launch@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/trim_view@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/tworoll_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/tworoll_noedit_cursor@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/undo@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/vectorscope@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/workflow@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/zoom_in@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/zoom_length@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/zoom_out@2.png
Deleted
_service:obs_scm:flowblade-2.20.obscpio/README.md -> _service:obs_scm:flowblade-2.22.obscpio/README.md
Changed
36
1
2
3
!Flowblade(flowblade-trunk/Flowblade/res/darktheme/header_text.png "Flowblade")
4
5
-**New release 2.18 available. See release notes here,(./flowblade-trunk/docs/RELEASE_NOTES.md)**
6
+**New release 2.20 available. See release notes here,(./flowblade-trunk/docs/RELEASE_NOTES.md)**
7
8
1. Introduction(https://github.com/jliljebl/flowblade#introduction)
9
2. Features(https://github.com/jliljebl/flowblade#features)
10
11
12
**--- FIX FOR NON_WORKING VIDEO PREVIEW ISSUE ---**
13
14
-**Start application from terminal with command:**
15
+**Fix is to update to the latest version 2.20.**
16
+
17
+**If not possible, or start application from terminal with command below:**
18
19
```
20
SDL12COMPAT_NO_QUIT_VIDEO=1 GDK_BACKEND=x11 SDL_VIDEODRIVER=x11 /usr/bin/flowblade
21
```
22
-**More info on Issue here: Issue #1134(https://github.com/jliljebl/flowblade/issues/1134)**
23
+**Current Fedora 42 package is also broken and the command above needs to used to run the application.**
24
25
**--- FIX FOR NON_WORKING VIDEO PREVIEW ISSUE ---**
26
27
28
29
# Releases
30
31
-**Latest release:** Flowblade Movie Editor 2.16 was released in May 2024.
32
+**Latest release:** Flowblade Movie Editor 2.20 was released in March 2025.
33
34
# Installing Flowblade
35
36
_service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/animatedvalue.py
Added
201
1
2
+"""
3
+ Flowblade Movie Editor is a nonlinear video editor.
4
+ Copyright 2025 Janne Liljeblad.
5
+
6
+ This file is part of Flowblade Movie Editor <https://github.com/jliljebl/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
+from gi.repository import Gtk
23
+
24
+import math
25
+
26
+import appconsts
27
+import dialogutils
28
+
29
+
30
+M_PI = math.pi
31
+M_PI_2 = math.pi * 2.0
32
+
33
+ease_in = 0
34
+ease_out = 1
35
+ease_inout = 2
36
+
37
+
38
+KEYFRAME_TYPES = \
39
+ appconsts.KEYFRAME_LINEAR,
40
+ appconsts.KEYFRAME_SMOOTH,
41
+ appconsts.KEYFRAME_DISCRETE,
42
+ appconsts.KEYFRAME_SMOOTH_NATURAL,
43
+ appconsts.KEYFRAME_SMOOTH_TIGHT,
44
+ appconsts.KEYFRAME_SINUSOIDAL_IN,
45
+ appconsts.KEYFRAME_SINUSOIDAL_OUT,
46
+ appconsts.KEYFRAME_SINUSOIDAL_IN_OUT,
47
+ appconsts.KEYFRAME_QUADRATIC_IN,
48
+ appconsts.KEYFRAME_QUADRATIC_OUT,
49
+ appconsts.KEYFRAME_QUADRATIC_IN_OUT,
50
+ appconsts.KEYFRAME_CUBIC_IN,
51
+ appconsts.KEYFRAME_CUBIC_OUT,
52
+ appconsts.KEYFRAME_CUBIC_IN_OUT,
53
+ appconsts.KEYFRAME_QUARTIC_IN,
54
+ appconsts.KEYFRAME_QUARTIC_OUT,
55
+ appconsts.KEYFRAME_QUARTIC_IN_OUT,
56
+ appconsts.KEYFRAME_QUINTIC_IN,
57
+ appconsts.KEYFRAME_QUINTIC_OUT,
58
+ appconsts.KEYFRAME_QUINTIC_IN_OUT,
59
+ appconsts.KEYFRAME_EXPONENTIAL_IN,
60
+ appconsts.KEYFRAME_EXPONENTIAL_OUT,
61
+ appconsts.KEYFRAME_EXPONENTIAL_IN_OUT,
62
+ appconsts.KEYFRAME_CIRCULAR_IN,
63
+ appconsts.KEYFRAME_CIRCULAR_OUT,
64
+ appconsts.KEYFRAME_CIRCULAR_IN_OUT,
65
+ appconsts.KEYFRAME_BACK_IN,
66
+ appconsts.KEYFRAME_BACK_OUT,
67
+ appconsts.KEYFRAME_BACK_IN_OUT,
68
+ appconsts.KEYFRAME_ELASTIC_IN,
69
+ appconsts.KEYFRAME_ELASTIC_OUT,
70
+ appconsts.KEYFRAME_ELASTIC_IN_OUT,
71
+ appconsts.KEYFRAME_BOUNCE_IN,
72
+ appconsts.KEYFRAME_BOUNCE_OUT,
73
+ appconsts.KEYFRAME_BOUNCE_IN_OUT
74
+
75
+KEYFRAME_EQ_STRS = \
76
+ appconsts.KEYFRAME_LINEAR_EQUALS_STR,
77
+ appconsts.KEYFRAME_SMOOTH_EQUALS_STR,
78
+ appconsts.KEYFRAME_DISCRETE_EQUALS_STR,
79
+ appconsts.KEYFRAME_SMOOTH_NATURAL_EQUALS_STR,
80
+ appconsts.KEYFRAME_SMOOTH_TIGHT_EQUALS_STR,
81
+ appconsts.KEYFRAME_SINUSOIDAL_IN_EQUALS_STR,
82
+ appconsts.KEYFRAME_SINUSOIDAL_OUT_EQUALS_STR,
83
+ appconsts.KEYFRAME_SINUSOIDAL_IN_OUT_EQUALS_STR,
84
+ appconsts.KEYFRAME_QUADRATIC_IN_EQUALS_STR,
85
+ appconsts.KEYFRAME_QUADRATIC_OUT_EQUALS_STR,
86
+ appconsts.KEYFRAME_QUADRATIC_IN_OUT_EQUALS_STR,
87
+ appconsts.KEYFRAME_CUBIC_IN_EQUALS_STR,
88
+ appconsts.KEYFRAME_CUBIC_OUT_EQUALS_STR,
89
+ appconsts.KEYFRAME_CUBIC_IN_OUT_EQUALS_STR,
90
+ appconsts.KEYFRAME_QUARTIC_IN_EQUALS_STR,
91
+ appconsts.KEYFRAME_QUARTIC_OUT_EQUALS_STR,
92
+ appconsts.KEYFRAME_QUARTIC_IN_OUT_EQUALS_STR,
93
+ appconsts.KEYFRAME_QUINTIC_IN_EQUALS_STR,
94
+ appconsts.KEYFRAME_QUINTIC_OUT_EQUALS_STR,
95
+ appconsts.KEYFRAME_QUINTIC_IN_OUT_EQUALS_STR,
96
+ appconsts.KEYFRAME_EXPONENTIAL_IN_EQUALS_STR,
97
+ appconsts.KEYFRAME_EXPONENTIAL_OUT_EQUALS_STR,
98
+ appconsts.KEYFRAME_EXPONENTIAL_IN_OUT_EQUALS_STR,
99
+ appconsts.KEYFRAME_CIRCULAR_IN_EQUALS_STR,
100
+ appconsts.KEYFRAME_CIRCULAR_OUT_EQUALS_STR,
101
+ appconsts.KEYFRAME_CIRCULAR_IN_OUT_EQUALS_STR,
102
+ appconsts.KEYFRAME_BACK_IN_EQUALS_STR,
103
+ appconsts.KEYFRAME_BACK_OUT_EQUALS_STR,
104
+ appconsts.KEYFRAME_BACK_IN_OUT_EQUALS_STR,
105
+ appconsts.KEYFRAME_ELASTIC_IN_EQUALS_STR,
106
+ appconsts.KEYFRAME_ELASTIC_OUT_EQUALS_STR,
107
+ appconsts.KEYFRAME_ELASTIC_IN_OUT_EQUALS_STR,
108
+ appconsts.KEYFRAME_BOUNCE_IN_EQUALS_STR,
109
+ appconsts.KEYFRAME_BOUNCE_OUT_EQUALS_STR,
110
+ appconsts.KEYFRAME_BOUNCE_IN_OUT_EQUALS_STR
111
+
112
+EFFECT_KEYFRAME_TYPES = \
113
+ appconsts.KEYFRAME_BACK_IN,
114
+ appconsts.KEYFRAME_BACK_OUT,
115
+ appconsts.KEYFRAME_BACK_IN_OUT,
116
+ appconsts.KEYFRAME_ELASTIC_IN,
117
+ appconsts.KEYFRAME_ELASTIC_OUT,
118
+ appconsts.KEYFRAME_ELASTIC_IN_OUT,
119
+ appconsts.KEYFRAME_BOUNCE_IN,
120
+ appconsts.KEYFRAME_BOUNCE_OUT,
121
+ appconsts.KEYFRAME_BOUNCE_IN_OUT,
122
+ appconsts.KEYFRAME_SINUSOIDAL_IN,
123
+ appconsts.KEYFRAME_SINUSOIDAL_OUT,
124
+ appconsts.KEYFRAME_SINUSOIDAL_IN_OUT,
125
+
126
+SMOOTH_EXTENDED_KEYFRAME_TYPES = \
127
+ appconsts.KEYFRAME_SMOOTH_NATURAL,
128
+ appconsts.KEYFRAME_SMOOTH_TIGHT,
129
+ appconsts.KEYFRAME_QUADRATIC_IN,
130
+ appconsts.KEYFRAME_QUADRATIC_OUT,
131
+ appconsts.KEYFRAME_QUADRATIC_IN_OUT,
132
+ appconsts.KEYFRAME_CUBIC_IN,
133
+ appconsts.KEYFRAME_CUBIC_OUT,
134
+ appconsts.KEYFRAME_CUBIC_IN_OUT,
135
+ appconsts.KEYFRAME_QUARTIC_IN,
136
+ appconsts.KEYFRAME_QUARTIC_OUT,
137
+ appconsts.KEYFRAME_QUARTIC_IN_OUT,
138
+ appconsts.KEYFRAME_QUINTIC_IN,
139
+ appconsts.KEYFRAME_QUINTIC_OUT,
140
+ appconsts.KEYFRAME_QUINTIC_IN_OUT,
141
+ appconsts.KEYFRAME_EXPONENTIAL_IN,
142
+ appconsts.KEYFRAME_EXPONENTIAL_OUT,
143
+ appconsts.KEYFRAME_EXPONENTIAL_IN_OUT,
144
+ appconsts.KEYFRAME_CIRCULAR_IN,
145
+ appconsts.KEYFRAME_CIRCULAR_OUT,
146
+ appconsts.KEYFRAME_CIRCULAR_IN_OUT
147
+
148
+CATMILL_ROM_TYPES = \
149
+ appconsts.KEYFRAME_SMOOTH,
150
+ appconsts.KEYFRAME_DISCRETE,
151
+ appconsts.KEYFRAME_SMOOTH_NATURAL,
152
+ appconsts.KEYFRAME_SMOOTH_TIGHT
153
+
154
+POWER_TYPES = \
155
+ appconsts.KEYFRAME_QUADRATIC_IN,
156
+ appconsts.KEYFRAME_QUADRATIC_OUT,
157
+ appconsts.KEYFRAME_QUADRATIC_IN_OUT,
158
+ appconsts.KEYFRAME_CUBIC_IN,
159
+ appconsts.KEYFRAME_CUBIC_OUT,
160
+ appconsts.KEYFRAME_CUBIC_IN_OUT,
161
+ appconsts.KEYFRAME_QUARTIC_IN,
162
+ appconsts.KEYFRAME_QUARTIC_OUT,
163
+ appconsts.KEYFRAME_QUARTIC_IN_OUT,
164
+ appconsts.KEYFRAME_QUINTIC_IN,
165
+ appconsts.KEYFRAME_QUINTIC_OUT,
166
+ appconsts.KEYFRAME_QUINTIC_IN_OUT
167
+
168
+# Keyframe type -> eq str
169
+TYPE_TO_EQ_STRING = None # filled on init
170
+# Keyframe type -> eq str
171
+EQ_STRING_TO_TYPE = None # filled on init
172
+# Keyframe type -> translated name
173
+TYPE_TO_NAME = None # filled on init
174
+
175
+
176
+# ------------------------------------------------------- interface
177
+def init():
178
+ global TYPE_TO_EQ_STRING, EQ_STRING_TO_TYPE, TYPE_TO_NAME
179
+
180
+ TYPE_TO_EQ_STRING = {}
181
+ for type_id, eq_str in zip(KEYFRAME_TYPES, KEYFRAME_EQ_STRS):
182
+ TYPE_TO_EQ_STRINGtype_id = eq_str
183
+
184
+ EQ_STRING_TO_TYPE = {}
185
+ for type_id, eq_str in zip(KEYFRAME_TYPES, KEYFRAME_EQ_STRS):
186
+ EQ_STRING_TO_TYPEeq_str = type_id
187
+
188
+
189
+ names = \
190
+ _("Linear"),
191
+ _("Smooth"),
192
+ _("Discrete"),
193
+ _("Smooth Natural"),
194
+ _("Smooth Tight"),
195
+ _("Sinusoidal In"),
196
+ _("Sinusoidal Out"),
197
+ _("Sinusoidal In Out"),
198
+ _("Quadratic In"),
199
+ _("Quadratic Out"),
200
+ _("Quadratic In Out"),
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/app.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/app.py
Changed
90
1
2
import sys
3
import time
4
5
+import animatedvalue
6
import appconsts
7
import audiomonitoring
8
import audiowaveformrenderer
9
10
loaded_autosave_file = None
11
recovery_in_progress = False
12
13
-splash_screen = None
14
-splash_timeout_id = -1
15
exit_timeout_id = -1
16
window_resize_id = -1
17
window_state_id = -1
18
19
assoc_file_path = None
20
assoc_timeout_id = None
21
22
+
23
def main(root_path):
24
"""
25
Called at application start.
26
27
shortcuts.load_shortcut_files()
28
shortcuts.load_shortcuts()
29
shortcutsquickeffects.load_shortcuts()
30
-
31
+
32
+ # We have translations in data structs and need some initing.
33
+ animatedvalue.init()
34
+
35
# The test for len != 4 is to make sure that if we change the number of values below the prefs are reset to the correct list
36
# So when we add or remove a value, make sure we also change the len test
37
# Only use positive numbers.
38
39
# We need to test which GPU render options work after profiles are inited because
40
# we do the test by doing test renders.
41
rendergputest.test_gpu_rendering_options(render.update_encoding_selector)
42
-
43
- # Splash screen
44
- if editorpersistance.prefs.display_splash_screen == True:
45
- show_splash_screen()
46
47
# Save assoc file path if found in arguments.
48
global assoc_file_path
49
50
# Get existing autosave files
51
autosave_files = get_autosave_files()
52
53
- # Show splash
54
- if ((editorpersistance.prefs.display_splash_screen == True) and len(autosave_files) == 0):
55
- global splash_timeout_id
56
- splash_timeout_id = GLib.timeout_add(2600, destroy_splash_screen)
57
- splash_screen.show_all()
58
-
59
appconsts.SAVEFILE_VERSION = projectdata.SAVEFILE_VERSION # THIS IS A QUESTIONABLE IDEA TO SIMPLIFY IMPORTS, NOT DRY. WHEN DOING TOOLS THAT RUN IN ANOTHER PROCESSES AND SAVE PROJECTS, THIS LINE NEEDS TO BE THERE ALSO.
60
61
# Every running instance has unique autosave file which is deleted at exit
62
63
persistance.save_project(editorstate.PROJECT(), autosave_file)
64
return True
65
66
-# ------------------------------------------------- splash screen
67
-def show_splash_screen():
68
- global splash_screen
69
- splash_screen = Gtk.Window(Gtk.WindowType.TOPLEVEL)
70
- splash_screen.set_border_width(0)
71
- splash_screen.set_decorated(False)
72
- splash_screen.set_position(Gtk.WindowPosition.CENTER)
73
- img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "flowblade_splash_black_small.png")
74
-
75
- splash_screen.add(img)
76
- splash_screen.set_size_request(598, 258) # Smaller then img.
77
-
78
- splash_screen.set_resizable(False)
79
-
80
- while(GLib.MainContext.default ().pending()):
81
- GLib.MainContext.default().iteration(False) # GLib.MainContext to replace this
82
-
83
-def destroy_splash_screen():
84
- splash_screen.destroy()
85
- GLib.source_remove(splash_timeout_id)
86
-
87
# ------------------------------------------------------- disk cache size check
88
def check_disk_cache_size():
89
GLib.source_remove(disk_cache_timeout_id)
90
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/appconsts.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/appconsts.py
Changed
99
1
2
TRIM_VIEW_SINGLE = 1
3
TRIM_VIEW_OFF = 2
4
5
-# Midbar layout
6
-MIDBAR_TC_LEFT = 0
7
-MIDBAR_TC_CENTER = 1
8
-MIDBAR_COMPONENTS_CENTERED = 2
9
-MIDBAR_TC_FREE = 3 # DEPRECATED, all layouts now have configurable buttons.
10
-
11
# Windows mode
12
SINGLE_WINDOW = 1
13
TWO_WINDOWS = 2
14
15
PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT = 5
16
PANEL_PLACEMENT_NOT_VISIBLE = 6
17
PANEL_PLACEMENT_TWO_WINDOWS_MEDIA_PANEL_POS = 7
18
+PANEL_PLACEMENT_RIGHT_COLUMN = 8
19
20
# Panels
21
PANEL_MEDIA = 0
22
23
KEYFRAME_LINEAR = 0
24
KEYFRAME_SMOOTH = 1
25
KEYFRAME_DISCRETE = 2
26
-
27
+KEYFRAME_SMOOTH_NATURAL = 3
28
+KEYFRAME_SMOOTH_TIGHT = 4
29
+KEYFRAME_SINUSOIDAL_IN = 5
30
+KEYFRAME_SINUSOIDAL_OUT = 6
31
+KEYFRAME_SINUSOIDAL_IN_OUT = 7
32
+KEYFRAME_QUADRATIC_IN = 8
33
+KEYFRAME_QUADRATIC_OUT = 9
34
+KEYFRAME_QUADRATIC_IN_OUT = 10
35
+KEYFRAME_CUBIC_IN = 11
36
+KEYFRAME_CUBIC_OUT = 12
37
+KEYFRAME_CUBIC_IN_OUT = 13
38
+KEYFRAME_QUARTIC_IN = 14
39
+KEYFRAME_QUARTIC_OUT = 15
40
+KEYFRAME_QUARTIC_IN_OUT = 16
41
+KEYFRAME_QUINTIC_IN = 17
42
+KEYFRAME_QUINTIC_OUT = 18
43
+KEYFRAME_QUINTIC_IN_OUT = 19
44
+KEYFRAME_EXPONENTIAL_IN = 20
45
+KEYFRAME_EXPONENTIAL_OUT = 21
46
+KEYFRAME_EXPONENTIAL_IN_OUT = 22
47
+KEYFRAME_CIRCULAR_IN = 23
48
+KEYFRAME_CIRCULAR_OUT = 24
49
+KEYFRAME_CIRCULAR_IN_OUT = 25
50
+KEYFRAME_BACK_IN = 26
51
+KEYFRAME_BACK_OUT = 27
52
+KEYFRAME_BACK_IN_OUT = 28
53
+KEYFRAME_ELASTIC_IN = 29
54
+KEYFRAME_ELASTIC_OUT = 30
55
+KEYFRAME_ELASTIC_IN_OUT = 31
56
+KEYFRAME_BOUNCE_IN = 32
57
+KEYFRAME_BOUNCE_OUT = 33
58
+KEYFRAME_BOUNCE_IN_OUT = 34
59
+
60
+# MLT Keyframe type identifiers in equals signs"
61
KEYFRAME_LINEAR_EQUALS_STR = "="
62
KEYFRAME_SMOOTH_EQUALS_STR = "~="
63
KEYFRAME_DISCRETE_EQUALS_STR = "|="
64
+KEYFRAME_SMOOTH_NATURAL_EQUALS_STR = "$="
65
+KEYFRAME_SMOOTH_TIGHT_EQUALS_STR = "-="
66
+KEYFRAME_SINUSOIDAL_IN_EQUALS_STR = "a="
67
+KEYFRAME_SINUSOIDAL_OUT_EQUALS_STR = "b="
68
+KEYFRAME_SINUSOIDAL_IN_OUT_EQUALS_STR = "c="
69
+KEYFRAME_QUADRATIC_IN_EQUALS_STR = "d="
70
+KEYFRAME_QUADRATIC_OUT_EQUALS_STR = "e="
71
+KEYFRAME_QUADRATIC_IN_OUT_EQUALS_STR = "f="
72
+KEYFRAME_CUBIC_IN_EQUALS_STR = "g="
73
+KEYFRAME_CUBIC_OUT_EQUALS_STR = "h="
74
+KEYFRAME_CUBIC_IN_OUT_EQUALS_STR = "i="
75
+KEYFRAME_QUARTIC_IN_EQUALS_STR = "j="
76
+KEYFRAME_QUARTIC_OUT_EQUALS_STR = "k="
77
+KEYFRAME_QUARTIC_IN_OUT_EQUALS_STR = "l="
78
+KEYFRAME_QUINTIC_IN_EQUALS_STR = "m="
79
+KEYFRAME_QUINTIC_OUT_EQUALS_STR = "n="
80
+KEYFRAME_QUINTIC_IN_OUT_EQUALS_STR = "o="
81
+KEYFRAME_EXPONENTIAL_IN_EQUALS_STR = "p="
82
+KEYFRAME_EXPONENTIAL_OUT_EQUALS_STR = "q="
83
+KEYFRAME_EXPONENTIAL_IN_OUT_EQUALS_STR = "r="
84
+KEYFRAME_CIRCULAR_IN_EQUALS_STR = "s="
85
+KEYFRAME_CIRCULAR_OUT_EQUALS_STR = "t="
86
+KEYFRAME_CIRCULAR_IN_OUT_EQUALS_STR = "u="
87
+KEYFRAME_BACK_IN_EQUALS_STR = "v="
88
+KEYFRAME_BACK_OUT_EQUALS_STR = "w="
89
+KEYFRAME_BACK_IN_OUT_EQUALS_STR = "x="
90
+KEYFRAME_ELASTIC_IN_EQUALS_STR = "y="
91
+KEYFRAME_ELASTIC_OUT_EQUALS_STR = "z="
92
+KEYFRAME_ELASTIC_IN_OUT_EQUALS_STR = "A="
93
+KEYFRAME_BOUNCE_IN_EQUALS_STR = "B="
94
+KEYFRAME_BOUNCE_OUT_EQUALS_STR = "C="
95
+KEYFRAME_BOUNCE_IN_OUT_EQUALS_STR = "D="
96
97
# Multi edit panel display options.
98
EDIT_MULTI_EMPTY = "edit_multi_empty"
99
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/audiomonitoring.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/audiomonitoring.py
Changed
10
1
2
3
self.meter.set_height(h - self.H_CUT)
4
5
- cr.set_source_rgb(0.0, 0.0, 0.0)
6
+ cr.set_source_rgb(0.15, 0.15, 0.15)
7
cr.fill_preserve()
8
cr.rectangle(0, 0, w, h)
9
cr.fill()
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/boxmove.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/boxmove.py
Changed
71
1
2
3
return False
4
5
-
6
def get_possible_locked_track(self):
7
for selection in self.track_selections:
8
if current_sequence().tracksselection.track_id.edit_freedom == appconsts.LOCKED:
9
10
11
return None
12
13
+ def get_center_most_sync_track(self):
14
+ center_most = -1
15
+ old_center_most = -1
16
+ center_track_selection = None
17
+ for track_selection in self.track_selections:
18
+ center_most = self.get_more_sync_center_most_track(center_most, track_selection.track_id)
19
+ if center_most != old_center_most:
20
+ center_track_selection = track_selection
21
+ old_center_most = center_most
22
+ return (current_sequence().trackscenter_most, center_track_selection)
23
+
24
+ def get_more_sync_center_most_track(self, current_track, test_track):
25
+ """
26
+ Video tracks ore considered more center then audio,
27
+ and otherwise we pick the track closest to V1 in GUI.
28
+ """
29
+ if current_track == -1:
30
+ return test_track
31
+
32
+ current_track_object = current_sequence().trackscurrent_track
33
+ test_track_object = current_sequence().trackstest_track
34
+
35
+ if test_track_object.type == appconsts.VIDEO:
36
+ if current_track_object.type == appconsts.AUDIO:
37
+ return test_track
38
+
39
+ if test_track < current_track:
40
+ return test_track
41
+ else:
42
+ return current_track
43
+ else:
44
+ if current_track_object.type == appconsts.VIDEO:
45
+ return current_track
46
+
47
+ if test_track > current_track:
48
+ return test_track
49
+ else:
50
+ return current_track
51
+
52
+
53
+
54
class BoxTrackSelection:
55
"""
56
This class collects data on track's Box selected clips.
57
58
59
return False
60
61
+ def clip_in_selection(self, clip):
62
+ clip_index = current_sequence().tracksself.track_id.clips.index(clip)
63
+ if clip_index >= self.selected_range_in and clip_index <= self.selected_range_out:
64
+ return True
65
+
66
+ return False
67
+
68
def box_selection_splice_out():
69
global box_selection_data, edit_data
70
71
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/clipeffectseditor.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/clipeffectseditor.py
Changed
200
1
2
self.filter_object = filter_object
3
self.filter_stack = filter_stack
4
5
- if editorpersistance.prefs.icons_scale == appconsts.ICONS_SCALE_DEFAULT:
6
- w=22
7
- h=22
8
- else:
9
- w=44
10
- h=44
11
-
12
+ w=22
13
+ h=22
14
surface = guiutils.get_cairo_image("filter_save")
15
save_button = guicomponents.PressLaunch(self.save_pressed, surface, w, h)
16
save_button.widget.set_tooltip_markup(_("Save effect values"))
17
18
19
class FilterHeaderRow:
20
21
- def __init__(self, filter_object):
22
+ def __init__(self, filter_object, stack_item):
23
name = translations.get_filter_name(filter_object.info.name)
24
self.filter_name_label = Gtk.Label(label= "<b>" + name + "</b>")
25
self.filter_name_label.set_use_markup(True)
26
self.icon = Gtk.Image.new_from_pixbuf(filter_object.info.get_icon())
27
28
+ surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "trash.png")
29
+ trash_button = guicomponents.PressLaunch(stack_item.trash_pressed, surface, w=22, h=22)
30
+
31
+ surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "filters_up_arrow.png")
32
+ up_button = guicomponents.PressLaunch(stack_item.up_pressed, surface, w=10, h=22)
33
+ up_button.surface_x = 0
34
+ up_button.widget.set_margin_right(2)
35
+
36
+ surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "filters_down_arrow.png")
37
+ down_button = guicomponents.PressLaunch(stack_item.down_pressed, surface, w=10, h=22)
38
+ down_button.surface_x = 0
39
+ down_button.surface_y = 10
40
+
41
+
42
hbox = Gtk.HBox(False, 0)
43
+ hbox.pack_start(stack_item.active_check, False, False, 0)
44
hbox.pack_start(guiutils.pad_label(4,5), False, False, 0)
45
hbox.pack_start(self.icon, False, False, 0)
46
hbox.pack_start(self.filter_name_label, False, False, 0)
47
hbox.pack_start(Gtk.Label(), True, True, 0)
48
+ hbox.pack_start(up_button.widget, False, False, 0)
49
+ hbox.pack_start(down_button.widget, False, False, 0)
50
+ hbox.pack_start(trash_button.widget, False, False, 0)
51
self.widget = hbox
52
53
54
55
56
def __init__(self, filter_object, edit_panel, filter_stack):
57
self.filter_object = filter_object
58
- self.filter_header_row = FilterHeaderRow(filter_object)
59
+
60
+ self.active_check = Gtk.CheckButton()
61
+ self.active_check.set_active(self.filter_object.active)
62
+ self.active_check.connect("toggled", self.toggle_filter_active)
63
+
64
+ self.active_check.set_margin_left(2)
65
+ self.filter_header_row = FilterHeaderRow(filter_object, self)
66
67
self.edit_panel = edit_panel
68
self.edit_panel_frame = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
69
self.edit_panel_frame.add(edit_panel)
70
71
self.filter_stack = filter_stack
72
- self.expander = Gtk.Expander()
73
+ self.expander = Expander()
74
self.expander.set_label_widget(self.filter_header_row.widget)
75
self.expander.add(self.edit_panel_frame)
76
- self.expander.set_label_fill(True)
77
78
self.expander_frame = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
79
- self.expander_frame.add(self.expander)
80
+ self.expander_frame.add(self.expander.widget)
81
guiutils.set_margins(self.expander_frame, 2, 0, 0, 0)
82
83
- self.active_check = Gtk.CheckButton()
84
- self.active_check.set_active(self.filter_object.active)
85
- self.active_check.connect("toggled", self.toggle_filter_active)
86
- guiutils.set_margins(self.active_check, 4, 0, 0, 0)
87
-
88
- self.active_check_vbox = Gtk.VBox(False, 0)
89
- self.active_check_vbox.pack_start(self.active_check, False, False, 0)
90
- self.active_check_vbox.pack_start(Gtk.Label(), True, True, 0)
91
-
92
- surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "trash.png")
93
- trash_button = guicomponents.PressLaunch(self.trash_pressed, surface, w=22, h=22)
94
-
95
- surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "filters_up_arrow.png")
96
- up_button = guicomponents.PressLaunch(self.up_pressed, surface, w=10, h=22)
97
- up_button.surface_x = 0
98
-
99
- surface = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "filters_down_arrow.png")
100
- down_button = guicomponents.PressLaunch(self.down_pressed, surface, w=10, h=22)
101
- down_button.surface_x = 0
102
- down_button.surface_y = 10
103
-
104
- self.trash_vbox = Gtk.VBox(False, 0)
105
- self.trash_vbox.pack_start(trash_button.widget, False, False, 0)
106
- self.trash_vbox.pack_start(Gtk.Label(), True, True, 0)
107
-
108
- self.up_vbox = Gtk.VBox(False, 0)
109
- self.up_vbox.pack_start(up_button.widget, False, False, 0)
110
- self.up_vbox.pack_start(Gtk.Label(), True, True, 0)
111
-
112
- self.down_vbox = Gtk.VBox(False, 0)
113
- self.down_vbox.pack_start(down_button.widget, False, False, 0)
114
- self.down_vbox.pack_start(Gtk.Label(), True, True, 0)
115
-
116
self.widget = Gtk.HBox(False, 0)
117
- self.widget.pack_start(self.active_check_vbox, False, False, 0)
118
self.widget.pack_start(self.expander_frame, True, True, 0)
119
- self.widget.pack_start(self.trash_vbox, False, False, 0)
120
- self.widget.pack_start(self.up_vbox, False, False, 0)
121
- self.widget.pack_start(self.down_vbox, False, False, 0)
122
self.widget.pack_start(guiutils.pad_label(10,2), False, False, 0)
123
124
self.widget.show_all()
125
126
stack_item = self.filter_stackexpanded_index
127
stack_item.expander.set_expanded(True)
128
129
+class Expander:
130
+
131
+ def __init__(self):
132
+ self.widget = Gtk.VBox(False, 0)
133
+ self.label = None
134
+ self.child = None
135
+ self.expanded = True
136
+
137
+ self.label_box = Gtk.HBox(False, 0)
138
+ self.child_box = Gtk.VBox(False, 0)
139
+
140
+ self.arrow_box = Gtk.EventBox()
141
+ self.arrow_box.connect('button-release-event', self._toggle_expand)
142
+
143
+ self.img_unexpanded = Gtk.Image.new_from_icon_name("pan-end-symbolic", Gtk.IconSize.BUTTON)
144
+ self.img_expanded = Gtk.Image.new_from_icon_name("pan-down-symbolic", Gtk.IconSize.BUTTON)
145
+ self.arrow_box.add(self.img_expanded)
146
+
147
+ self.widget.pack_start(self.label_box, False, False, 0)
148
+ self.widget.pack_start(self.child_box, True, True, 0)
149
+
150
+ def set_label_widget(self, label_widget):
151
+ self.label = label_widget
152
+ self._update_label_row()
153
+ self.widget.queue_draw()
154
+
155
+ def _update_label_row(self):
156
+ # Remove panels from box
157
+ children = self.label_box.get_children()
158
+ for child in children:
159
+ self.label_box.remove(child)
160
+ self.arrow_box.remove(self.arrow_box.get_child())
161
+ if self.expanded == True:
162
+ self.arrow_box.add(self.img_expanded)
163
+ else:
164
+ self.arrow_box.add(self.img_unexpanded)
165
+ self.arrow_box.show_all()
166
+
167
+ self.label_box.pack_start(self.arrow_box, False, False, 0)
168
+ self.label_box.pack_start(self.label, True, True, 0)
169
+
170
+ def add(self, child_widget):
171
+ self.child = child_widget
172
+ self._update_child_row()
173
+ self.widget.queue_draw()
174
+
175
+ def _update_child_row(self):
176
+ children = self.child_box.get_children()
177
+ for child in children:
178
+ self.child_box.remove(child)
179
+
180
+ if self.expanded == True:
181
+ self.child_box.pack_start(self.child, False, False, 0)
182
+
183
+ def set_expanded(self, expanded):
184
+ self.expanded = expanded
185
+ self._update_label_row()
186
+ self._update_child_row()
187
+
188
+ def get_expanded(self):
189
+ return self.expanded
190
+
191
+ def _toggle_expand(self, widget, event):
192
+ self.expanded = not self.expanded
193
+ self._update_label_row()
194
+ self._update_child_row()
195
+
196
+
197
# -------------------------------------------------------------- GUI INIT
198
def get_clip_effects_editor_info_row():
199
_create_widgets()
200
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/clipenddragmode.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/clipenddragmode.py
Changed
64
1
2
bound_end = from_clip_end
3
else:
4
bound_end = to_clip_end
5
-
6
+
7
+ if editing_clip_end == True and bound_end > to_clip_end:
8
+ bound_end = to_clip_end
9
+
10
+ if editing_clip_end == False and bound_start < from_clip_start:
11
+ bound_start = from_clip_start
12
+
13
global _enter_mode, _enter_draw_func, _edit_data
14
15
_enter_mode = editorstate.edit_mode
16
17
clip_index = _edit_data"clip_index"
18
editing_clip_end = _edit_data"editing_clip_end"
19
20
- from_clip, to_clip = _get_from_clip_and_to_clip(editing_clip_end, track, clip_index)
21
+ from_clip, to_clip = _get_from_clip_and_to_clip(editing_clip_end, track, clip_index)
22
23
non_edit_side_blank = False
24
if (_edit_data"editing_clip_end" == False) and (track.clipsclip_index - 1.is_blanck_clip == True):
25
26
elif (_edit_data"editing_clip_end" == True) and (track.clipsclip_index + 1.is_blanck_clip == True):
27
non_edit_side_blank = True
28
29
+ # If drag covers adjacent clip fully we need to use different edit actions.
30
+ if editing_clip_end == True and frame == _edit_data"bound_end":
31
+ data = {"track":track,
32
+ "clip":to_clip,
33
+ "index":clip_index + 1}
34
+
35
+ action = edit.cover_delete_fade_out(data) # action was created for another edit but works here too.
36
+ action.do_edit()
37
+
38
+ _exit_clip_end_drag()
39
+ updater.repaint_tline()
40
+ return
41
+ elif editing_clip_end == False and frame == _edit_data"bound_start":
42
+ data = {"track":track,
43
+ "clip":from_clip,
44
+ "index":clip_index - 1}
45
+
46
+ action = edit.cover_delete_fade_in(data) # action was created for another edit but works here too.
47
+ action.do_edit()
48
+
49
+ _exit_clip_end_drag()
50
+ updater.repaint_tline()
51
+ return
52
+
53
# Code here thinks "clip_index" is always index of trimmed clip,
54
# but we are using existing edit.tworoll_trim_action() code to do the edit, and
55
# that assumes index to be between clips.
56
if editing_clip_end == True:
57
clip_index += 1
58
59
+
60
+
61
# Get edit data
62
delta = frame - _edit_data"edit_frame"
63
data = {"track":track,
64
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/clipmenuaction.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/clipmenuaction.py
Changed
47
1
2
3
def _mute_clip(data):
4
clip, track, item_id, item_data = data
5
- set_clip_muted = item_data
6
-
7
- if set_clip_muted == True:
8
- data = {"clip":clip}
9
- action = edit.mute_clip(data)
10
- action.do_edit()
11
- else:# then we're sitting clip unmuted
12
- data = {"clip":clip}
13
- action = edit.unmute_clip(data)
14
- action.do_edit()
15
+ tlineaction.do_mute_clip(clip, item_data)
16
17
def _delete_clip(data):
18
tlineaction.splice_out_button_pressed()
19
20
21
def _set_length(data):
22
clip, track, item_id, item_data = data
23
- dialogs.clip_length_change_dialog(_change_clip_length_dialog_callback, clip, track)
24
-
25
-def _change_clip_length_dialog_callback(dialog, response_id, clip, track, length_changer):
26
- if response_id != Gtk.ResponseType.ACCEPT:
27
- dialog.destroy()
28
- return
29
+ tlineaction.set_length(clip, track)
30
31
- length = length_changer.get_length()
32
- index = track.clips.index(clip)
33
-
34
- dialog.destroy()
35
-
36
- data = {"track":track,
37
- "clip":clip,
38
- "index":index,
39
- "length":length}
40
-
41
- action = edit.set_clip_length_action(data)
42
- action.do_edit()
43
-
44
def _stretch_next(data):
45
clip, track, item_id, item_data = data
46
try:
47
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/compositorfades.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/compositorfades.py
Changed
10
1
2
# Remove all but first keyframe
3
for i in range(0, len(keyframes) - 1):
4
keyframes.pop(1)
5
- # Now this the same action as addin default keyframe on creation
6
+ # Now this the same action as adding default keyframe on creation
7
keyframes = _add_default_fade_in(keyframe_property, property_klass, keyframes, fade_in_length)
8
# Case keyframes exists after fade in length
9
else:
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/containerclip.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/containerclip.py
Changed
10
1
2
3
def render_tline_generator_clip(clip, callback):
4
action_object = containeractions.get_action_object(clip.container_data)
5
- action_object.set_video_endoding(None, callback, True) # All generator tline rendering goes via render settins and continues from given callback.
6
+ action_object.set_video_endoding(None, callback, True) # All generator tline rendering goes via render settings and continues from given callback.
7
8
def render_full_media(data):
9
clip, track, item_id, item_data = data
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/dialogs.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/dialogs.py
Changed
19
1
2
dialog.connect('response', callback, data, length_spin, name_entry)
3
dialog.show_all()
4
5
-
6
-
7
def export_xml_dialog(callback, project_name):
8
_export_file_name_dialog(callback, project_name, _("Export Project as XML to"))
9
10
11
# Application tab
12
img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "flowbladeappicon.png")
13
flow_label = Gtk.Label(label="Flowblade Movie Editor")
14
- ver_label = Gtk.Label(label="2.20")
15
+ ver_label = Gtk.Label(label="2.22")
16
janne_label = Gtk.Label(label="Copyright 2024 Janne Liljeblad and contributors.")
17
page_label = Gtk.Label(label=_("Project page:") + " " + "<a href=\"https://github.com/jliljebl/flowblade\">https://github.com/jliljebl/flowblade</a>")
18
page_label.set_use_markup(True)
19
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/edit.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/edit.py
Changed
59
1
2
comp.move(-self.delta)
3
4
5
-# This exists to avoid hitting object being mappingproxy when doing __dict__.update
6
+# This exists to avoid hitting object being mapping proxy when doing __dict__.update
7
class DummyOverWriteMove:
8
def __init__(self, move_data):
9
# Grabs data as object members.
10
11
12
resync.clip_added_to_timeline(child_clip, self.child_track)
13
14
+# -------------------------------------------- SET BOX SELECTION SYNC
15
+"orig_sync_data", "new_sync_data"
16
+def set_box_selection_sync_action(data):
17
+ return EditAction(_set_box_selection_sync_undo, _set_box_selection_sync_redo, data)
18
+
19
+def _set_box_selection_sync_undo(self):
20
+ for track_orig_sync_data in self.orig_sync_data:
21
+ track_selection, track_sync_data = track_orig_sync_data
22
+ child_track = current_sequence().trackstrack_selection.track_id
23
+
24
+ for clip in track_sync_data.keys():
25
+ resync.clip_removed_from_timeline(clip)
26
+ try:
27
+ # "orig_sync_data" created in resync.get_track_all_resync_action_data()
28
+ sync_data = track_sync_dataclip
29
+ clip.sync_data = sync_data
30
+ except:
31
+ pass
32
+
33
+ resync.clip_added_to_timeline(clip, child_track)
34
+
35
+def _set_box_selection_sync_redo(self):
36
+ for track_new_sync_data in self.new_sync_data:
37
+ track_selection, sync_data = track_new_sync_data
38
+ child_track = current_sequence().trackstrack_selection.track_id
39
+
40
+ for clip in sync_data.keys():
41
+ resync.clip_removed_from_timeline(clip)
42
+ try:
43
+ # "new_sync_data" created in resync.get_track_all_resync_action_data()
44
+ pos_offset, parent_clip, parent_track = sync_dataclip
45
+
46
+ clip.sync_data = SyncData()
47
+ clip.sync_data.pos_offset = pos_offset
48
+ clip.sync_data.master_clip = parent_clip
49
+ clip.sync_data.master_clip_track = parent_track
50
+ clip.sync_data.sync_state = appconsts.SYNC_CORRECT
51
+ except:
52
+ pass
53
+
54
+ resync.clip_added_to_timeline(clip, child_track)
55
+
56
# -------------------------------------------- CLEAR TRACK SYNC
57
"child_track", "orig_sync_data"
58
def clear_track_sync_action(data):
59
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/editorlayout.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/editorlayout.py
Changed
83
1
2
}
3
4
AVAILABLE_PANEL_POSITIONS_OPTIONS = { \
5
- appconsts.PANEL_MEDIA: appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT, appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT, appconsts.PANEL_PLACEMENT_LEFT_COLUMN, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT,
6
- appconsts.PANEL_MULTI_EDIT: appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT, appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT, appconsts.PANEL_PLACEMENT_LEFT_COLUMN, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT,
7
+ appconsts.PANEL_MEDIA: appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT, appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT, appconsts.PANEL_PLACEMENT_LEFT_COLUMN, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT, appconsts.PANEL_PLACEMENT_RIGHT_COLUMN,
8
+ appconsts.PANEL_MULTI_EDIT: appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT, appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT, appconsts.PANEL_PLACEMENT_LEFT_COLUMN, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT, appconsts.PANEL_PLACEMENT_RIGHT_COLUMN,
9
appconsts.PANEL_RANGE_LOG: appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT, appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT,
10
appconsts.PANEL_RENDERING: appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT, appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT,
11
appconsts.PANEL_JOBS: appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT, appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT, appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT,
12
13
appconsts.PANEL_PLACEMENT_LEFT_COLUMN: DOWN,
14
appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT: UP,
15
appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT: UP,
16
- appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT: DOWN
17
+ appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT: DOWN,
18
+ appconsts.PANEL_PLACEMENT_RIGHT_COLUMN: DOWN
19
}
20
21
# Saved data struct holding panel positions information.
22
23
if panel_positioning_available() == False or _panel_positions == None \
24
or not (appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT in _panel_positions.values()):
25
_panel_positions = copy.deepcopy(DEFAULT_PANEL_POSITIONS)
26
- if editorstate.SCREEN_WIDTH < 1439:
27
+ if editorstate.SCREEN_WIDTH < 1500:
28
# App window may become invsible if all buttons shown in midbar and window too wide for screen.
29
_panel_positionsappconsts.PANEL_FILTER_SELECT = appconsts.PANEL_PLACEMENT_NOT_VISIBLE
30
editorpersistance.prefs.panel_positions = _panel_positions
31
32
appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT: _("Bottom Row Right"),
33
appconsts.PANEL_PLACEMENT_NOT_VISIBLE: _("Not Visible"),
34
appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT: _("Top Row Project Panel Default"),
35
+ appconsts.PANEL_PLACEMENT_RIGHT_COLUMN: _("Right Column")
36
}
37
38
_panels_names = { \
39
40
appconsts.PANEL_PLACEMENT_LEFT_COLUMN: None,
41
appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT: None,
42
appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT: None,
43
- appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT: None
44
+ appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT: None,
45
+ appconsts.PANEL_PLACEMENT_RIGHT_COLUMN: None
46
}
47
48
def show_panel(panel_id):
49
50
appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT: editor_window.bottom_left_frame,
51
appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT: editor_window.bottom_right_frame,
52
appconsts.PANEL_PLACEMENT_LEFT_COLUMN: editor_window.left_column_frame,
53
- appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT: editor_window.top_project_panel_frame
54
+ appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT: editor_window.top_project_panel_frame,
55
+ appconsts.PANEL_PLACEMENT_RIGHT_COLUMN: editor_window.right_column_frame
56
}
57
58
return position_frames
59
60
player_buttons_w, h = gui.editor_window.player_buttons_row.get_preferred_width()
61
top_default_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_TOP_ROW_DEFAULT.get_preferred_width()
62
top_right_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_TOP_ROW_RIGHT.get_preferred_width()
63
- left_column_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_LEFT_COLUMN.get_preferred_width()
64
+ left_column_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_LEFT_COLUMN.get_preferred_width()
65
+ right_column_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_RIGHT_COLUMN.get_preferred_width()
66
top_left_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_TOP_ROW_PROJECT_DEFAULT.get_preferred_width()
67
- combined = top_default_w + top_right_w + left_column_w + top_left_w + player_buttons_w
68
+ combined = top_default_w + top_right_w + left_column_w + top_left_w + player_buttons_w + right_column_w
69
return combined
70
71
def get_bottom_row_minimum_width():
72
middle_bar_w, h = gui.editor_window.edit_buttons_row.get_preferred_width()
73
bottom_left_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_BOTTOM_ROW_LEFT.get_preferred_width()
74
bottom_right_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_BOTTOM_ROW_RIGHT.get_preferred_width()
75
- left_column_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_LEFT_COLUMN.get_preferred_width()
76
- combined = middle_bar_w + bottom_left_w + bottom_right_w + left_column_w
77
+ left_column_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_LEFT_COLUMN.get_preferred_width()
78
+ right_column_w, h = _get_position_frames_dict()appconsts.PANEL_PLACEMENT_RIGHT_COLUMN.get_preferred_width()
79
+ combined = middle_bar_w + bottom_left_w + bottom_right_w + left_column_w + right_column_w
80
return combined
81
82
def _remove_panel(panel_id):
83
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/editorpersistance.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/editorpersistance.py
Changed
65
1
2
gfx_length_spin, cover_delete, mouse_scroll_action, hide_file_ext_button, \
3
hor_scroll_dir, effects_editor_clip_load, auto_render_plugins, dnd_action = edit_prefs_widgets
4
5
- auto_center_check, play_pause_button, timeline_start_end_button, auto_center_on_updown, \
6
+ auto_center_check, auto_center_on_updown, \
7
ffwd_rev_shift_spin, ffwd_rev_caps_spin, follow_move_range, loop_clips = playback_prefs_widgets
8
9
- force_language_combo, disp_splash, window_mode_combo, full_names, tracks_combo, project_panel_width_spin, \
10
+ force_language_combo, window_mode_combo, full_names, tracks_combo, project_panel_width_spin, \
11
edit_panel_width_spin, media_panel_width_spin, layout_monitor, filter_select_width_spin = view_prefs_widgets
12
13
perf_render_threads, perf_drop_frames = performance_widgets
14
15
prefs.default_grfx_length = int(gfx_length_spin.get_adjustment().get_value())
16
prefs.trans_cover_delete = cover_delete.get_active()
17
18
- prefs.play_pause = play_pause_button.get_active()
19
- prefs.timeline_start_end = timeline_start_end_button.get_active()
20
prefs.hide_file_ext = hide_file_ext_button.get_active()
21
prefs.mouse_scroll_action_is_zoom = (mouse_scroll_action.get_active() == 0)
22
prefs.scroll_horizontal_dir_up_forward = (hor_scroll_dir.get_active() == 0)
23
24
25
prefs.use_english_always = False # DEPRECATED, "force_language" used instead
26
prefs.force_language = force_language_combo.lang_codesforce_language_combo.get_active()
27
- prefs.display_splash_screen = disp_splash.get_active()
28
29
prefs.global_layout = window_mode_combo.get_active() + 1 # +1 'cause values are 1 and 2
30
prefs.perf_render_threads = int(perf_render_threads.get_adjustment().get_value())
31
32
self.auto_center_on_play_stop = True
33
self.thumbnail_folder = None # DEPRECATED, this is set by XDG variables now.
34
self.hidden_profile_names =
35
- self.display_splash_screen = True
36
+ self.display_splash_screen = True # DEPRECATED
37
self.auto_move_after_edit = False # DEPRECATED
38
self.default_grfx_length = 250 # value is in frames
39
self.track_configuration = 0 # DEPRECATED
40
41
self.display_all_audio_levels = True
42
self.overwrite_clip_drop = True # DEPRECATED, "dnd_action" used instead.
43
self.trans_cover_delete = True
44
- # Jul-2016 - SvdB - For play/pause button
45
- self.play_pause = False
46
- # ------------------------------ timeline_start_end_button
47
- self.timeline_start_end = False
48
- # ------------------------------End of timeline_start_end_button.
49
- self.midbar_layout = appconsts.MIDBAR_TC_LEFT
50
+ self.play_pause = False # DEPRECATED
51
+ self.timeline_start_end = False # DEPRECATED
52
+ self.midbar_layout = 0 # DEPRECATED, TC widget no longer in middlebar.
53
self.global_layout = appconsts.SINGLE_WINDOW
54
self.trim_view_default = appconsts.TRIM_VIEW_OFF
55
self.trim_view_message_shown = False
56
57
self.zoom_to_playhead = True
58
self.filter_select_width = 220
59
self.tracks_scale = appconsts.TRACKS_SCALE_DEFAULT
60
- self.icons_scale = appconsts.ICONS_SCALE_DEFAULT # DEPRECATED, we are not ever getting useful results with this.
61
+ self.icons_scale = appconsts.ICONS_SCALE_DEFAULT # DEPRECATED, we are not ever getting useful results with this.
62
self.project_panel_width = PROJECT_PANEL_WIDTH_MIN
63
self.editor_panel_width = EDIT_PANEL_WIDTH_MIN
64
self.media_panel_width = MEDIA_PANEL_WIDTH_MIN
65
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/editorstate.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/editorstate.py
Changed
10
1
2
# Runtime environment data
3
gtk_version = None
4
mlt_version = None
5
-appversion = "2.20"
6
+appversion = "2.22"
7
RUNNING_FROM_INSTALLATION = 0
8
RUNNING_FROM_DEV_VERSION = 1
9
RUNNING_FROM_FLATPAK = 2
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/editorwindow.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/editorwindow.py
Changed
201
1
2
self.app_h_box = Gtk.HBox(False, 0)
3
self.app_h_box.pack_start(self.left_column_frame, False, False, 0)
4
self.app_h_box.pack_start(self.app_v_paned, True, True, 0)
5
-
6
+ self.app_h_box.pack_start(self.right_column_frame, False, False, 0)
7
+
8
# Menu box
9
self.menubar.set_margin_bottom(4)
10
self.menubar.set_name("lighter-bg-widget")
11
12
13
monitor_source_box = Gtk.HBox(False, 0)
14
monitor_source_box.pack_start(Gtk.Label(), True, True, 0)
15
- monitor_source_box.pack_start(self.monitor_tc_info.monitor_source, False, False, 0)
16
- monitor_source_box.pack_start(self.monitor_tc_info.monitor_tc, False, False, 0)
17
monitor_desc_panel = projectinfogui.get_top_level_project_info_panel()
18
self.monitor_desc_label = projectinfogui.widgets.monitor_desc_label
19
monitor_source_box.pack_start(monitor_desc_panel, False, False, 0)
20
monitor_source_box.pack_start(Gtk.Label(), True, True, 0)
21
22
- fullscreen_icon = guiutils.get_cairo_image("fullscreen")
23
- fullscreen_exit_icon = guiutils.get_cairo_image("fullscreen_exit")
24
- if guiutils.double_icon_size() == False:
25
- self.fullscreen_press = guicomponents.PressLaunch(menuactions.toggle_fullscreen, fullscreen_icon, 20, 12)
26
- else:
27
- self.fullscreen_press = guicomponents.PressLaunch(menuactions.toggle_fullscreen, fullscreen_icon, 40, 24)
28
- self.fullscreen_press.surface_x = 12
29
- self.fullscreen_press.surface_y = 13
30
-
31
- self.fullscreen_press.widget.set_margin_top(1)
32
- self.fullscreen_press.widget.set_tooltip_text(_("Fullscreen - F11"))
33
- # Used in menuactions.toggle_fullscreen to switch image
34
- self.fullscreen_press.fullscreen_icon = fullscreen_icon
35
- self.fullscreen_press.fullscreen_exit_icon = fullscreen_exit_icon
36
-
37
- icon_2 = guiutils.get_cairo_image("layout")
38
- if guiutils.double_icon_size() == False:
39
- layout_press = guicomponents.PressLaunchPopover(editorlayout.show_layout_press_menu, icon_2, 24, 12)
40
- else:
41
- layout_press = guicomponents.PressLaunchPopover(editorlayout.show_layout_press_menu, icon_2, 48, 24)
42
- layout_press.surface_y = 13
43
-
44
- layout_press.widget.set_margin_top(1)
45
- layout_press.widget.set_tooltip_text(_("Layouts"))
46
-
47
- tline_info_box = Gtk.HBox(False, 0)
48
- if editorpersistance.prefs.global_layout == appconsts.SINGLE_WINDOW:
49
- tline_info_box.pack_start(self.tools_buttons.widget, False, False, 0)
50
- tline_info_box.pack_start(guiutils.pad_label(24,2), False, False, 0)
51
- tline_info_box.pack_start(self.fullscreen_press.widget, False, False, 0)
52
- if editorstate.SCREEN_WIDTH > 1678:
53
- tline_info_box.pack_start(guiutils.pad_label(6,2), False, False, 0)
54
- tline_info_box.pack_start(layout_press.widget, False, False, 0)
55
- tline_info_box.pack_start(guiutils.pad_label(6,2), False, False, 0)
56
-
57
+ tline_info_box = Gtk.HBox(False, 0)
58
tline_info_box.pack_start(Gtk.Label(), True, True, 0)
59
+ tline_info_box.pack_start(self.monitor_tc_info.monitor_source, False, False, 0)
60
+ tline_info_box.pack_start(self.monitor_tc_info.monitor_tc, False, False, 0)
61
+ tline_info_box.pack_start(guiutils.pad_label(12, 2), False, False, 0)
62
tline_info_box.pack_start(self.monitor_tc_info.widget, False, False, 0)
63
guiutils.set_margins(tline_info_box, 0, 0, 0, 10)
64
65
66
menu_vbox.pack_start(tline_info_box, True, True, 0)
67
menu_vbox.override_background_color(Gtk.StateFlags.NORMAL, gui.get_mid_neutral_color())
68
else:
69
- menubar_box.pack_start(self.tools_buttons.widget, False, False, 0)
70
menubar_box.pack_start(guiutils.pad_label(8, 2), False, False, 0)
71
- menubar_box.pack_start(self.fullscreen_press.widget, False, False, 0)
72
73
self.top_row_window_2 = Gtk.HBox(False, 0)
74
self.top_row_window_2.pack_start(monitor_source_box, False, False, 0)
75
76
77
# Effects select panel
78
effect_select_panel, effect_select_list_view, effect_select_combo_box = panels.get_effect_selection_panel(clipeffectseditor.effect_select_row_double_clicked)
79
- # example code for using widget css from deleted test dev branch
80
- #gui.apply_widget_css_class(effect_select_list_view.treeview, "bold-text", "bold-text-class.css")
81
- #effect_select_list_view.treeview.set_name("light-text")
82
- #gui.apply_widget_css(effect_select_list_view.treeview, "light-text", "light-text-id.css")
83
self.effect_select_panel = effect_select_panel
84
self.effect_select_list_view = effect_select_list_view
85
self.effect_select_combo_box = effect_select_combo_box
86
87
# Project panel
88
if editorlayout.top_level_project_panel() == True:
89
# Project info
90
- #project_info_panel = projectinfogui.get_top_level_project_info_panel()
91
top_project_vbox = Gtk.VBox()
92
- #top_project_vbox.pack_start(project_info_panel, False, False, 0)
93
top_project_vbox.pack_start(self.bins_panel, True, True, 0)
94
top_project_vbox.pack_start(seq_panel, True, True, 0)
95
96
97
project_vbox.pack_start(seq_panel, True, True, 0)
98
self.project_panel = guiutils.set_margins(project_vbox, 0, 2, 6, 2)
99
self.top_project_panel = None
100
+
101
+ # Middlebar
102
+ # Fullscreen and layout buttons are created here but adda to middlebar in middlebar.py
103
+ fullscreen_icon = guiutils.get_cairo_image("fullscreen")
104
+ fullscreen_exit_icon = guiutils.get_cairo_image("fullscreen_exit")
105
+ self.fullscreen_press = guicomponents.PressLaunch(menuactions.toggle_fullscreen, fullscreen_icon, 20, 12)
106
+ self.fullscreen_press.widget.set_margin_top(1)
107
+ self.fullscreen_press.widget.set_tooltip_text(_("Fullscreen - F11"))
108
+ # Used in menuactions.toggle_fullscreen to switch image
109
+ self.fullscreen_press.fullscreen_icon = fullscreen_icon
110
+ self.fullscreen_press.fullscreen_exit_icon = fullscreen_exit_icon
111
+
112
+ icon_2 = guiutils.get_cairo_image("layout")
113
+ self.layout_press = guicomponents.PressLaunchPopover(editorlayout.show_layout_press_menu, icon_2, 24, 12)
114
+ self.layout_press.widget.set_margin_top(1)
115
+ self.layout_press.widget.set_tooltip_text(_("Layouts"))
116
117
- # Position bar and decorative frame for it
118
+ self.edit_buttons_row = self._get_edit_buttons_row()
119
+
120
+ self.edit_buttons_frame = Gtk.Frame()
121
+ self.edit_buttons_frame.add(self.edit_buttons_row)
122
+ guiutils.set_margins(self.edit_buttons_frame, 1, 0, 0, 0)
123
+
124
+ self.edit_buttons_frame.override_background_color(Gtk.StateFlags.NORMAL, gui.get_mid_neutral_color())
125
+
126
+ # Position bar and decorative frame for it
127
self.pos_bar = PositionBar()
128
pos_bar_frame = Gtk.HBox()
129
pos_bar_frame.add(self.pos_bar.widget)
130
131
player_buttons_row = Gtk.HBox(False, 0)
132
player_buttons_row.pack_start(self.monitor_switch.widget, False, False, 0)
133
player_buttons_row.pack_start(Gtk.Label(), True, True, 0)
134
- #player_buttons_row.pack_start(self.monitor_clip_type.widget, False, False, 0)
135
- #player_buttons_row.pack_start(Gtk.Label(), True, True, 0)
136
player_buttons_row.pack_start(self.player_buttons.widget, False, False, 0)
137
player_buttons_row.pack_start(Gtk.Label(), True, True, 0)
138
- #player_buttons_row.pack_start(Gtk.Label(), True, True, 0)
139
player_buttons_row.pack_start(markbuttons.widget, False, False, 0)
140
player_buttons_row.pack_start(self.trim_view_select.widget, False, False, 0)
141
player_buttons_row.pack_start(self.view_mode_select.widget, False, False, 0)
142
143
gui.apply_widget_css(player_buttons_row, "player-bar", "player-bar-id.css")
144
145
self.player_buttons_row = player_buttons_row
146
+
147
+ tc_player_row = Gtk.HBox(False, 0)
148
+ tc_player_row.pack_start(self.big_TC, False, False, 0)
149
+ tc_player_row.pack_start(player_buttons_row, True, True, 0)
150
151
- # Switch / pos bar row
152
+ # pos bar row
153
sw_pos_hbox = Gtk.HBox(False, 1)
154
sw_pos_hbox.pack_start(pos_bar_frame, True, True, 0)
155
156
157
# Monitor
158
monitor_vbox = Gtk.VBox(False, 0)
159
monitor_vbox.pack_start(monitor_widget.widget, True, True, 0)
160
- monitor_vbox.pack_start(player_buttons_row, False, True, 0)
161
+ monitor_vbox.pack_start(tc_player_row, False, True, 0)
162
monitor_vbox.pack_start(sw_pos_hbox, False, True, 0)
163
monitor_align = guiutils.set_margins(monitor_vbox, 0, 0, 0, 0)
164
165
self.monitor_frame = Gtk.Frame()
166
self.monitor_frame.add(monitor_align)
167
self.monitor_frame.set_size_request(MONITOR_AREA_WIDTH, appconsts.TOP_ROW_HEIGHT)
168
-
169
- # Middlebar
170
- self.edit_buttons_row = self._get_edit_buttons_row()
171
172
- self.edit_buttons_frame = Gtk.Frame()
173
- self.edit_buttons_frame.add(self.edit_buttons_row)
174
- guiutils.set_margins(self.edit_buttons_frame, 1, 0, 0, 0)
175
-
176
- self.edit_buttons_frame.override_background_color(Gtk.StateFlags.NORMAL, gui.get_mid_neutral_color())
177
- #self.edit_buttons_frame.set_name("middlebar")
178
- #gui.apply_widget_css(player_buttons_row, "middlebar", "middlebar-id.css")
179
-
180
def _init_tline(self):
181
self.tline_scale = tlinewidgets.TimeLineFrameScale(modesetting.set_default_edit_mode,
182
updater.mouse_scroll_zoom)
183
184
185
186
# ---------------------------------------------------------------- LEFT COLUMN
187
- self.left_column_panel, widget_is_notebook = editorlayout.create_position_widget(self, appconsts.PANEL_PLACEMENT_LEFT_COLUMN)
188
+ self.left_column_panel, widget_is_notebook = editorlayout.create_position_widget(self, appconsts.PANEL_PLACEMENT_LEFT_COLUMN)
189
if self.left_column_panel != None:
190
self.left_column_frame = guiutils.get_panel_etched_frame(self.left_column_panel)
191
guiutils.set_margins(self.left_column_frame, 0, 0, 0, 1)
192
193
else:
194
self.left_column_frame = guiutils.get_empty_panel_etched_frame() # to be filled later if panels are added into this position.
195
196
+ # ---------------------------------------------------------------- RIGHT COLUMN
197
+ self.right_column_panel, widget_is_notebook = editorlayout.create_position_widget(self, appconsts.PANEL_PLACEMENT_RIGHT_COLUMN)
198
+ if self.right_column_panel != None:
199
+ self.right_column_frame = guiutils.get_panel_etched_frame(self.right_column_panel)
200
+ guiutils.set_margins(self.right_column_frame, 0, 0, 0, 1)
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/glassbuttons.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/glassbuttons.py
Changed
38
1
2
3
CORNER_DIVIDER = 5
4
5
-# Aug-2019 - SvdB - BB
6
-MB_BUTTONS_WIDTH = 317,634
7
-MB_BUTTONS_HEIGHT = 23,60
8
-MB_BUTTON_HEIGHT = 22,44
9
-MB_BUTTON_WIDTH = 30,60
10
+MB_BUTTONS_WIDTH = 200
11
+MB_BUTTONS_HEIGHT = 23
12
+MB_BUTTON_HEIGHT = 22
13
+MB_BUTTON_WIDTH = 30
14
MB_BUTTON_Y = 4
15
MB_BUTTON_IMAGE_Y = 6
16
17
18
size_adj = 1
19
prefs = editorpersistance.prefs
20
21
- if guiutils.double_icon_size():
22
- size_ind = 1
23
- size_adj = 2
24
AbstractGlassButtons.__init__(self, MB_BUTTON_WIDTHsize_ind, MB_BUTTON_HEIGHTsize_ind, MB_BUTTON_Y, MB_BUTTONS_WIDTHsize_ind, MB_BUTTONS_HEIGHTsize_ind - 2)
25
26
# Force no decorations for player buttons, this cannot be made to work.
27
28
size_adj = 1
29
prefs = editorpersistance.prefs
30
31
- # NOT IMPLEMENTED
32
- if guiutils.double_icon_size():
33
- size_ind = 1
34
- size_adj = 2
35
AbstractGlassButtons.__init__(self, MB_BUTTON_WIDTHsize_ind, MB_BUTTON_HEIGHTsize_ind, MB_BUTTON_Y, MB_BUTTONS_WIDTHsize_ind, MB_BUTTONS_HEIGHTsize_ind - 2)
36
37
next_icon = guiutils.get_cairo_image("next_frame_s")
38
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/guicomponents.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/guicomponents.py
Changed
201
1
2
# ---------------------------------------------- MISC WIDGETS
3
def get_monitor_view_select_launcher(callback):
4
prefs = editorpersistance.prefs
5
- size_adj = 1
6
- if guiutils.double_icon_size():
7
- size_adj = 2
8
surface = guiutils.get_cairo_image("program_view_2")
9
- menu_launch = PressLaunchPopover(callback, surface, w=24*size_adj, h=16*size_adj)
10
- if guiutils.double_icon_size():
11
- menu_launch.surface_y = 8*size_adj
12
- else:
13
- menu_launch.surface_y = 3
14
+ menu_launch = PressLaunchPopover(callback, surface, w=24, h=16)
15
+ menu_launch.surface_y = 3
16
17
menu_launch.widget.set_margin_top(2)
18
return menu_launch
19
20
def get_trim_view_select_launcher(callback):
21
- # not a combo
22
- # Aug-2019 - SvdB - BB
23
prefs = editorpersistance.prefs
24
- size_adj = 1
25
- if guiutils.double_icon_size():
26
- size_adj = 2
27
surface = guiutils.get_cairo_image("trim_view")
28
- menu_launch = PressLaunchPopover(callback, surface, w=24*size_adj, h=16*size_adj)
29
- if guiutils.double_icon_size():
30
- menu_launch.surface_y = 8*size_adj
31
- else:
32
- menu_launch.surface_y = 3
33
+ menu_launch = PressLaunchPopover(callback, surface, w=24, h=16)
34
+ menu_launch.surface_y = 3
35
36
menu_launch.widget.set_margin_top(2)
37
return menu_launch
38
39
def __init__(self):
40
# Aug-2019 - SvdB -BB
41
prefs = editorpersistance.prefs
42
- size_adj = 1
43
- if guiutils.double_icon_size():
44
- size_adj = 2
45
46
- self.widget = cairoarea.CairoDrawableArea2( 170*size_adj,
47
- 22*size_adj,
48
+ self.widget = cairoarea.CairoDrawableArea2( 140,
49
+ 22,
50
self._draw)
51
- self.font_desc = Pango.FontDescription("Bitstream Vera Sans Mono Condensed "+str(15*size_adj))
52
+ self.font_desc = Pango.FontDescription("Bitstream Vera Sans Mono Condensed "+ str(15))
53
54
# Draw consts
55
x = 2
56
y = 2
57
- width = 166*size_adj
58
- height = 22*size_adj
59
+ width = 140
60
+ height = 22
61
aspect = 1.0
62
corner_radius = height / 3.5
63
radius = corner_radius / aspect
64
65
"""
66
x, y, w, h = allocation
67
68
- # Draw round rect with gradient and stroke around for thin bezel
69
- self._round_rect_path(cr)
70
- cr.set_source_rgb(0.1, 0.1, 0.1)
71
- cr.fill_preserve()
72
-
73
- cr.set_source_rgb(0.0, 0.0, 0.0)
74
- cr.set_line_width(1)
75
- cr.stroke()
76
-
77
# Get current TIMELINE frame str
78
try:
79
frame = PLAYER().tracktor_producer.frame()
80
81
frame = PLAYER().tracktor_producer.frame()
82
frame_str = utils.get_tc_zeros_overlay_fine_grained(frame)
83
except:
84
- print("execpt")
85
+ print("except")
86
frame_str = "00:00:00:00"
87
88
layout = PangoCairo.create_layout(cr)
89
90
91
if mark_in != -1:
92
mark_in_info = utils.get_tc_string(mark_in)
93
- self.in_zeros_overlay = utils.get_tc_zeros_overlay(mark_in)
94
+ self.in_zeros_overlay = utils.get_tc_zeros_overlay_fine_grained(mark_in)
95
else:
96
- mark_in_info = ""
97
+ mark_in_info = " - - : - - : - - : - - "
98
self.in_str = mark_in_info
99
100
if mark_out != -1:
101
mark_out_info = utils.get_tc_string(mark_out)
102
- self.out_zeros_overlay = utils.get_tc_zeros_overlay(mark_out)
103
+ self.out_zeros_overlay = utils.get_tc_zeros_overlay_fine_grained(mark_out)
104
else:
105
- mark_out_info = ""
106
+ mark_out_info = " - - : - - : - - : - - "
107
self.out_str = mark_out_info
108
109
range_len = mark_out - mark_in + 1 # +1, out incl.
110
if mark_in != -1 and mark_out != -1:
111
range_info = utils.get_tc_string(range_len)
112
- self.len_zeros_overlay = utils.get_tc_zeros_overlay(range_len)
113
+ self.len_zeros_overlay = utils.get_tc_zeros_overlay_fine_grained(range_len)
114
else:
115
- range_info = ""
116
+ range_info = " - - : - - : - - : - - "
117
self.len_str = range_info
118
119
def _draw(self, event, cr, allocation):
120
121
"""
122
x, y, w, h = allocation
123
124
- # Draw round rect with gradient and stroke around for thin bezel
125
- self._round_rect_path(cr)
126
- cr.set_source_rgb(0.1, 0.1, 0.1)
127
- cr.fill_preserve()
128
-
129
- cr.set_source_rgb(0.0, 0.0, 0.0)
130
-
131
- cr.set_line_width(1)
132
- cr.stroke()
133
-
134
+ # Draw round rect with gradient and stroke around for thin bezel
135
cr.set_source_surface(self.mark_in_img, 12, 5)
136
cr.paint()
137
cr.set_source_surface(self.mark_out_img, 110, 5)
138
139
def _draw(self, event, cr, allocation):
140
PressLaunch._draw(self, event, cr, allocation)
141
142
- if guiutils.double_icon_size():
143
- x_pos = 40,45,50
144
- y_pos = 10,20,10
145
- else:
146
- x_pos = 27,32,37
147
- y_pos = 13,18,13
148
+ x_pos = 27,32,37
149
+ y_pos = 13,18,13
150
cr.move_to(x_pos0, y_pos0)
151
cr.line_to(x_pos1, y_pos1)
152
cr.line_to(x_pos2, y_pos2)
153
154
prefs = editorpersistance.prefs
155
size_adj = 1
156
y_adj = 0
157
- if guiutils.double_icon_size():
158
- size_adj = 2
159
- y_adj = -2
160
+
161
162
if width == -1:
163
x_size = 18
164
else:
165
x_size = width
166
167
- self.x_size_pref = x_size * size_adj
168
- self.y_size_pref = 18 * size_adj
169
+ self.x_size_pref = x_size
170
+ self.y_size_pref = 18
171
self.widget = cairoarea.CairoDrawableArea2( self.x_size_pref,
172
self.y_size_pref,
173
self._draw)
174
175
176
# Aug-2019 - SvdB - BB - Set the appropriate values based on button size. Use guiutils functions
177
prefs = editorpersistance.prefs
178
- if guiutils.double_icon_size():
179
- self.WIDTH = self.WIDTH * 2
180
- self.HEIGHT = self.HEIGHT * 2
181
- self.press_fix = 8
182
183
self.widget = cairoarea.CairoDrawableArea2( self.WIDTH ,
184
self.HEIGHT,
185
186
tline_draw_surface = self.tline_surface
187
clip_draw_surface = self.clip_active_surface
188
189
- # Aug-2019 - SvdB - BB - set default offset
190
- prefs = editorpersistance.prefs
191
def_off = 10
192
y_off_tline = 3
193
y_off_clip = 4
194
mid_gap = 10
195
- if guiutils.double_icon_size():
196
- def_off = def_off * 2
197
- y_off_tline = y_off_tline * 2
198
- y_off_clip = y_off_clip * 2
199
- mid_gap = mid_gap * 2
200
- else:
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/guipopover.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/guipopover.py
Changed
24
1
2
add_menu_action(lock_section, _("Unlock Track"), "trackcolumn.unlock", (track,"unlock", None), callback, False)
3
_tracks_column_menu.append_section(None, lock_section)
4
5
+ info_label_section = Gio.Menu.new()
6
+ add_menu_action(info_label_section, _("Edit Track Info Label"), "trackcolumn.sync.infolabel", (track,"infolabel", None), callback)
7
+ _tracks_column_menu.append_section(None, info_label_section)
8
+
9
height_section = Gio.Menu.new()
10
items_data =(_("High Height"), "highheight"), (_("Large Height"), "normalheight"), (_("Normal Height"), "smallheight")
11
if track_obj.height == appconsts.TRACK_HEIGHT_HIGH:
12
13
active = True
14
15
sync_set_section = Gio.Menu.new()
16
- add_menu_action(sync_set_section, _("Sync All Clips to Track..."), "trackcolumn.sync.setsync", (track,"setsync", None), callback, active)
17
+ add_menu_action(sync_set_section, _("Sync All Clips to Track..."), "trackcolumn.sync.setsync", (track,"setsyncfrompopover", None), callback, active)
18
reset_active = track_obj.parent_track != None
19
- add_menu_action(sync_set_section, _("Update Sync to Clips' Current Positions"), "trackcolumn.sync.resetsync", (track,"ressetsync", None), callback, reset_active)
20
+ add_menu_action(sync_set_section, _("Update Sync to Clips' Current Positions"), "trackcolumn.sync.resetsync", (track,"resetsync", None), callback, reset_active)
21
add_menu_action(sync_set_section, _("Clear Sync"), "trackcolumn.sync.clearsync", (track,"clearsync", None), callback, active)
22
_tracks_column_menu.append_section(None, sync_set_section)
23
24
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/guipopoverclip.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/guipopoverclip.py
Changed
68
1
2
3
import copy
4
5
+import animatedvalue
6
import appconsts
7
import callbackbridge
8
import guipopover
9
10
_clip_menu.append_section(None, _reload_section)
11
12
edit_section = Gio.Menu.new()
13
- select_menu = Gio.Menu.new()
14
- _fill_select_menu(select_menu, callback)
15
- edit_section.append_submenu(_("Select"), select_menu)
16
_edit_actions_menu = Gio.Menu.new()
17
_fill_edit_actions_menu(_edit_actions_menu, clip, track, callback)
18
edit_section.append_submenu(_("Edit"), _edit_actions_menu)
19
+ select_menu = Gio.Menu.new()
20
+ _fill_select_menu(select_menu, callback)
21
+ edit_section.append_submenu(_("Select"), select_menu)
22
_tools_submenu = Gio.Menu.new()
23
_fill_tool_integration_menu(_tools_submenu, clip, callback)
24
edit_section.append_submenu(_("Slow Motion"), _tools_submenu)
25
26
global _kf_select_popover, _kf_select_menu
27
28
_kf_select_menu = guipopover.menu_clear_or_create(_kf_select_menu)
29
-
30
+ """
31
items_data = ( _("Linear"), "linear"), ( _("Smooth"), "smooth"), ( _("Discrete"), "discrete")
32
if kf_type == appconsts.KEYFRAME_LINEAR:
33
active_index = 0
34
35
kftype_section = Gio.Menu.new()
36
guipopover.add_menu_action_all_items_radio(kftype_section, items_data, "kftoolkftypemenu.selecttype", active_index, callback)
37
_kf_select_menu.append_section(None, kftype_section)
38
+ """
39
40
+ text_smooth = ""
41
+ text_effect = ""
42
+ if kf_type == appconsts.KEYFRAME_LINEAR:
43
+ active_index = 0
44
+ elif kf_type == appconsts.KEYFRAME_SMOOTH:
45
+ active_index = 1
46
+ elif kf_type == appconsts.KEYFRAME_DISCRETE:
47
+ active_index = 2
48
+ elif kf_type in animatedvalue.SMOOTH_EXTENDED_KEYFRAME_TYPES:
49
+ active_index = 3
50
+ text_smooth = animatedvalue.TYPE_TO_NAMEkf_type + " - "
51
+ else:
52
+ active_index = 4
53
+ text_effect = animatedvalue.TYPE_TO_NAMEkf_type + " - "
54
+
55
+ items_data = ( _("Linear"), str(appconsts.KEYFRAME_LINEAR)),
56
+ ( _("Smooth"), str(appconsts.KEYFRAME_SMOOTH)),
57
+ ( _("Discrete"), str(appconsts.KEYFRAME_DISCRETE)),
58
+ ( text_smooth + _("Smooth Extended") + "...", "smoothkfs"),
59
+ ( text_effect + _("Effect") + "...", "effectkfs")
60
+
61
+ kftype_section = Gio.Menu.new()
62
+ guipopover.add_menu_action_all_items_radio(kftype_section, items_data, "kftoolkftypemenu.selecttype", active_index, callback)
63
+ _kf_select_menu.append_section(None, kftype_section)
64
+
65
kfcopy_section = Gio.Menu.new()
66
add_menu_action(kfcopy_section,_("Copy Keyframe Value"), "kftoolkftypemenu.copykf", ("copykf", None), callback)
67
add_menu_action(kfcopy_section,_("Paste Keyframe Value"), "kftoolkftypemenu.pastekf", ("pastekf", None), callback)
68
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/guiutils.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/guiutils.py
Changed
105
1
2
from gi.repository import GdkPixbuf
3
4
import appconsts
5
-import editorpersistance
6
import respaths
7
import translations
8
9
10
hbox.pack_start(widget2, True, True, 0)
11
return hbox
12
13
-# Aug-2019 - SvdB - BB
14
def get_image_name(img_name, suffix = ".png", double_height = False):
15
button_size_text = ""
16
if double_height:
17
18
img_name = img_name+button_size_text+suffix
19
return img_name
20
21
-# Aug-2019 - SvdB - BB
22
def get_image(img_name, suffix = ".png", force = None):
23
- # Use parameter force as True or False to force the track height no matter what the preferences setting
24
- if force == None:
25
- force = (editorpersistance.prefs.icons_scale == appconsts.ICONS_SCALE_DOUBLE)
26
- if force:
27
- new_name = img_name + "@2"
28
- else:
29
- new_name = img_name
30
- try:
31
- img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + new_name + suffix)
32
- except:
33
- img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + img_name + suffix)
34
+ img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + img_name + suffix)
35
return img
36
-
37
38
-# Aug-2019 - SvdB - BB
39
def get_cairo_image(img_name, suffix = ".png", force = None):
40
- # Apr-2020 - SvdB - Make it sturdier in case a @2 image is missing. Just display the original image.
41
- # Use parameter force as True or False to force the track height no matter what the preferences setting
42
- if force == None:
43
- force = (editorpersistance.prefs.icons_scale == appconsts.ICONS_SCALE_DOUBLE)
44
- if force:
45
- new_name = img_name + "@2"
46
- else:
47
- new_name = img_name
48
-
49
- try:
50
- img = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + new_name + suffix)
51
- except:
52
- # Colorized icons
53
- if img_name-6: == "_color": #editorpersistance.prefs.colorized_icons is True:
54
- try:
55
- img = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + img_name + "_color" + suffix)
56
- except:
57
- img = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + img_name:-6 + suffix)
58
- else:
59
- img = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + img_name + suffix)
60
- # End of Colorized icons
61
+ img = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + img_name + suffix)
62
return img
63
64
-def get_double_scaled_cairo_image(icon_name):
65
- img_path = respaths.IMAGE_PATH + icon_name
66
-
67
- icon = cairo.ImageSurface.create_from_png(img_path)
68
- if (editorpersistance.prefs.icons_scale != appconsts.ICONS_SCALE_DOUBLE):
69
- return icon
70
-
71
- surface_pattern = cairo.SurfacePattern(icon)
72
- surface_pattern.set_filter(cairo.Filter.NEAREST)
73
-
74
- scaled_icon = cairo.ImageSurface(cairo.FORMAT_ARGB32, icon.get_width() * 2, icon.get_height() * 2)
75
- cr = cairo.Context(scaled_icon)
76
- cr.scale(2.0, 2.0)
77
- cr.set_source(surface_pattern)
78
- cr.paint()
79
-
80
- return scaled_icon
81
-
82
-# Aug-2019 - SvdB - BB
83
def get_image_button(img_file_name, width, height):
84
button = Gtk.Button()
85
icon = get_image(img_file_name)
86
size_adj = 1
87
- if (editorpersistance.prefs.icons_scale == appconsts.ICONS_SCALE_DOUBLE):
88
- size_adj = 2
89
button_box = Gtk.HBox()
90
button_box.pack_start(icon, False, False, 0)
91
button.add(button_box)
92
- button.set_size_request(width*size_adj, height*size_adj)
93
+ button.set_size_request(width, height)
94
return button
95
96
-def double_icon_size():
97
- if (editorpersistance.prefs.icons_scale == appconsts.ICONS_SCALE_DOUBLE):
98
- return True
99
- else:
100
- return False
101
-
102
def get_pad_label(w, h):
103
label = Gtk.Label()
104
label.set_size_request(w, h)
105
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/keyevents.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/keyevents.py
Changed
33
1
2
import movemodes
3
import shortcuts
4
import shortcutsquickeffects
5
+import syncsplitevent
6
import render
7
import targetactions
8
import tlineaction
9
10
if action == 'monitor_show_rgb':
11
tlineaction.set_monitor_display_mode(appconsts.RGB_PARADE_MODE)
12
return True
13
+ if action == 'set_length':
14
+ tlineaction.set_length_from_keyevent()
15
+ if action == 'clear_sync_relation':
16
+ syncsplitevent.clear_sync_relation_from_keyevent()
17
+ if action == 'toggle_audio_mute':
18
+ tlineaction.mute_clip_from_keyevent()
19
+ if action == 'set_sync_relation':
20
+ syncsplitevent.init_select_master_clip_from_keyevent()
21
22
# Key bindings for keyboard trimming
23
if action == 'toggle_track_output':
24
25
trimmodes.enter_pressed()
26
return True
27
28
- if editorstate.EDIT_MODE() == editorstate.OVERWRITE_MOVE:
29
+ if editorstate.EDIT_MODE() == editorstate.OVERWRITE_MOVE: # is this what want, only in OVERWRITE_MOVE mode?
30
if action == 'nudge_back':
31
movemodes.nudge_selection(-1)
32
return True
33
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/keyframeeditcanvas.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/keyframeeditcanvas.py
Changed
201
1
2
"""
3
Module contains GUI widgets used to edit geometries on canvas with a mouse.
4
"""
5
+import traceback
6
+
7
8
import copy
9
import math
10
11
from gi.repository import Gdk
12
13
+import animatedvalue
14
import appconsts
15
import cairoarea
16
import utils
17
18
"""
19
frame, shape, opacity, type = kf
20
return frame
21
-
22
+
23
+def _gradient_kf_sort(kf):
24
+ """
25
+ Function is used to sort keyframes by frame number.
26
+ """
27
+ frame, values, type = kf
28
+ return frame
29
+
30
31
class AbstractEditCanvas:
32
"""
33
34
self.keyframes = self.keyframe_parser(keyframes_str, out_to_in_func)
35
36
def set_keyframe_frame(self, active_kf_index, frame):
37
- old_frame, shape, opacity, kf_type = self.keyframesactive_kf_index
38
- self.keyframes.pop(active_kf_index)
39
- self.keyframes.insert(active_kf_index, (frame, shape, opacity, kf_type))
40
-
41
+ try:
42
+ # 4 values in kf tuple
43
+ old_frame, shape, opacity, kf_type = self.keyframesactive_kf_index
44
+ self.keyframes.pop(active_kf_index)
45
+ self.keyframes.insert(active_kf_index, (frame, shape, opacity, kf_type))
46
+ except:
47
+ # 3 values in kf tuple
48
+ old_frame, value, kf_type = self.keyframesactive_kf_index
49
+ self.keyframes.pop(active_kf_index)
50
+ self.keyframes.insert(active_kf_index, (frame, value, kf_type))
51
+
52
def set_active_kf_type(self, active_kf_index, kf_type):
53
- old_frame, shape, opacity, old_kf_type = self.keyframesactive_kf_index
54
- self.keyframes.pop(active_kf_index)
55
- self.keyframes.insert(active_kf_index, (old_frame, shape, opacity, kf_type))
56
-
57
+ try:
58
+ # 4 values in kf tuple
59
+ old_frame, shape, opacity, old_kf_type = self.keyframesactive_kf_index
60
+ self.keyframes.pop(active_kf_index)
61
+ self.keyframes.insert(active_kf_index, (old_frame, shape, opacity, kf_type))
62
+ except:
63
+ # 3 values in kf tuple
64
+ old_frame, value, old_kf_type = self.keyframesactive_kf_index
65
+ self.keyframes.pop(active_kf_index)
66
+ self.keyframes.insert(active_kf_index, (old_frame, value, kf_type))
67
+
68
def get_keyframe(self, kf_index):
69
return self.keyframeskf_index
70
71
72
print("_draw_edit_shape not impl.")
73
74
def print_keyframes(self):
75
+ print("Keyframes:")
76
for i in range(0, len(self.keyframes)):
77
print(self.keyframesi)
78
79
80
if kf_type == appconsts.KEYFRAME_DISCRETE:
81
self.set_geom(*rect)
82
return
83
- elif kf_type == appconsts.KEYFRAME_SMOOTH:
84
- frame_rect = self._get_interpolated_rect_smooth(time_fract, i, self.keyframes)
85
- self.source_edit_rect.set_geom(*self._get_screen_to_panel_rect(frame_rect))
86
- return
87
- else: # LINEAR
88
- frame_rect = self._get_interpolated_rect(rect, rect_n, time_fract)
89
+ else: # interpolated values
90
+ frame_rect = self._get_interpolated_rect(time_fract, i)
91
self.source_edit_rect.set_geom(*self._get_screen_to_panel_rect(frame_rect))
92
return
93
except: # past last frame, use its value
94
95
return
96
97
print("reached end of _update_source_rect, this should be unreachable")
98
-
99
- def _get_interpolated_rect(self, rect_1, rect_2, fract):
100
- x1, y1, w1, h1 = rect_1
101
- x2, y2, w2, h2 = rect_2
102
- x = x1 + (x2 - x1) * fract
103
- y = y1 + (y2 - y1) * fract
104
- w = w1 + (w2 - w1) * fract
105
- h = h1 + (h2 - h1) * fract
106
+
107
+ def _get_interpolated_rect(self, fract, i):
108
+ anim_value_x = self._create_anim_value(0)
109
+ x = anim_value_x.get_interpolated_value_internal_kf_type(i, fract)
110
+ anim_value_y = self._create_anim_value(1)
111
+ y = anim_value_y.get_interpolated_value_internal_kf_type(i, fract)
112
+ anim_value_w = self._create_anim_value(2)
113
+ w = anim_value_w.get_interpolated_value_internal_kf_type(i, fract)
114
+ anim_value_h = self._create_anim_value(3)
115
+ h = anim_value_h.get_interpolated_value_internal_kf_type(i, fract)
116
+
117
return (x, y, w, h)
118
119
- def _get_interpolated_rect_smooth(self, fract, i, keyframes):
120
- prev = i
121
- if i == 0:
122
- prev_prev = 0
123
- else:
124
- prev_prev = i - 1
125
-
126
- next = i + 1
127
- if next >= len(keyframes):
128
- next = len(keyframes) - 1
129
+ def _create_anim_value(self, value_index):
130
131
- next_next = next + 1
132
- if next_next >= len(keyframes):
133
- next_next = len(keyframes) - 1
134
-
135
- frame, rect, opacity, kf_type = keyframesprev_prev
136
- x0, y0, w0, h0 = rect
137
-
138
- frame, rect, opacity, kf_type = keyframesprev
139
- x1, y1, w1, h1 = rect
140
-
141
- frame, rect, opacity, kf_type = keyframesnext
142
- x2, y2, w2, h2 = rect
143
-
144
- frame, rect, opacity, kf_type = keyframesnext_next
145
- x3, y3, w3, h3 = rect
146
-
147
- x = self.catmull_rom_interpolate(x0, x1, x2, x3, fract)
148
- y = self.catmull_rom_interpolate(y0, y1, y2, y3, fract)
149
- w = self.catmull_rom_interpolate(w0, w1, w2, w3, fract)
150
- h = self.catmull_rom_interpolate(h0, h1, h2, h3, fract)
151
+ value_keyframes =
152
+
153
+ for kf in self.keyframes:
154
+ frame, rect, opacity, kf_type = kf
155
+ value = rectvalue_index # x, y, w, h
156
+ value_keyframes.append((frame, value, kf_type))
157
158
- return (x, y, w, h)
159
+ return animatedvalue.AnimatedValue(value_keyframes)
160
161
def _get_screen_to_panel_rect(self, rect):
162
x, y, w, h = rect
163
164
165
166
167
+class GradientEditCanvas(AbstractEditCanvas):
168
+ """
169
+ GUI component for editing position and scale values of keyframes
170
+ of source image in compositors.
171
+
172
+ Component is used as a part of e.g GeometryEditor, which handles
173
+ also keyframe creation and deletion and opacity, and
174
+ writing out the keyframes with combined information.
175
+
176
+ Required parent_editor callback interface:
177
+ mouse_scroll_up()
178
+ mouse_scroll_down()
179
+ geometry_edit_started()
180
+ update_request_from_geom_editor()
181
+ queue_draw()
182
+ geometry_edit_finished()
183
+ """
184
+ def __init__(self, editable_property, parent_editor):
185
+ AbstractEditCanvas.__init__(self, editable_property, parent_editor)
186
+ self.edit_points =
187
+
188
+ def create_edit_points_and_values(self):
189
+ # creates untransformed edit shape to init array, values will be overridden shortly
190
+ self.edit_points.append((self.source_width / 2, self.source_height / 2 + self.source_height / 4)) # center
191
+ self.edit_points.append((self.source_width / 2, self.source_height / 2 - self.source_height / 4)) # center
192
+
193
+ self.untrans_points = copy.deepcopy(self.edit_points)
194
+
195
+ def _frame_has_keyframe(self, frame):
196
+ for i in range(0, len(self.keyframes)):
197
+ kf = self.keyframesi
198
+ kf_frame, values, kf_type = kf
199
+ if frame == kf_frame:
200
+ return True
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/keyframeeditor.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/keyframeeditor.py
Changed
201
1
2
from gi.repository import Pango, PangoCairo
3
4
import appconsts
5
+import animatedvalue
6
import cairoarea
7
import callbackbridge
8
import compositorfades
9
10
ACTIVE_KF_ICON = None
11
ACTIVE_KF_ICON_SMOOTH = None
12
ACTIVE_KF_ICON_DISCRETE = None
13
+ACTIVE_KF_ICON_EFFECT = None
14
+ACTIVE_KF_ICON_SMOOTH_EXTENDED = None
15
NON_ACTIVE_KF_ICON = None
16
NON_ACTIVE_KF_ICON_SMOOTH = None
17
NON_ACTIVE_KF_ICON_DISCRETE = None
18
+NON_ACTIVE_KF_ICON_EFFECT = None
19
+NON_ACTIVE_KF_ICON_SMOOTH_EXTENDED = None
20
21
# Magic value to signify disconnected signal handler .
22
DISCONNECTED_SIGNAL_HANDLER = -9999999
23
24
self.mouse_listener = None #This is special service for RotoMaskKeyFrameEditor, not used by other editors
25
26
# init icons if needed
27
- global ACTIVE_KF_ICON, ACTIVE_KF_ICON_SMOOTH, ACTIVE_KF_ICON_DISCRETE, NON_ACTIVE_KF_ICON, NON_ACTIVE_KF_ICON_SMOOTH, NON_ACTIVE_KF_ICON_DISCRETE
28
+ global ACTIVE_KF_ICON, ACTIVE_KF_ICON_SMOOTH, ACTIVE_KF_ICON_DISCRETE, NON_ACTIVE_KF_ICON, \
29
+ NON_ACTIVE_KF_ICON_SMOOTH, NON_ACTIVE_KF_ICON_DISCRETE, ACTIVE_KF_ICON_EFFECT, NON_ACTIVE_KF_ICON_EFFECT, \
30
+ ACTIVE_KF_ICON_SMOOTH_EXTENDED, NON_ACTIVE_KF_ICON_SMOOTH_EXTENDED
31
+
32
if ACTIVE_KF_ICON == None:
33
ACTIVE_KF_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active.png")
34
ACTIVE_KF_ICON_SMOOTH = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_smooth.png")
35
ACTIVE_KF_ICON_DISCRETE = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_discrete.png")
36
+ ACTIVE_KF_ICON_EFFECT = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_effect.png")
37
+ ACTIVE_KF_ICON_SMOOTH_EXTENDED = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_smooth_extended.png")
38
NON_ACTIVE_KF_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active.png")
39
NON_ACTIVE_KF_ICON_SMOOTH = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_smooth.png")
40
NON_ACTIVE_KF_ICON_DISCRETE = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_discrete.png")
41
+ NON_ACTIVE_KF_ICON_EFFECT = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_effect.png")
42
+ NON_ACTIVE_KF_ICON_SMOOTH_EXTENDED = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_smooth_extended.png")
43
44
def set_keyframes(self, keyframes_str, out_to_in_func):
45
self.keyframes = self.keyframe_parser(keyframes_str, out_to_in_func)
46
47
icon = ACTIVE_KF_ICON
48
elif kf_type == appconsts.KEYFRAME_SMOOTH:
49
icon = ACTIVE_KF_ICON_SMOOTH
50
- else:
51
+ elif kf_type == appconsts.KEYFRAME_DISCRETE:
52
icon = ACTIVE_KF_ICON_DISCRETE
53
+ else:
54
+ if kf_type in animatedvalue.EFFECT_KEYFRAME_TYPES:
55
+ icon = ACTIVE_KF_ICON_EFFECT
56
+ else:
57
+ icon = ACTIVE_KF_ICON_SMOOTH_EXTENDED
58
else:
59
if kf_type == appconsts.KEYFRAME_LINEAR:
60
icon = NON_ACTIVE_KF_ICON
61
elif kf_type == appconsts.KEYFRAME_SMOOTH:
62
icon = NON_ACTIVE_KF_ICON_SMOOTH
63
- else:
64
+ elif kf_type == appconsts.KEYFRAME_DISCRETE:
65
icon = NON_ACTIVE_KF_ICON_DISCRETE
66
+ else:
67
+ if kf_type in animatedvalue.EFFECT_KEYFRAME_TYPES:
68
+ icon = NON_ACTIVE_KF_ICON_EFFECT
69
+ else:
70
+ icon = NON_ACTIVE_KF_ICON_SMOOTH_EXTENDED
71
try:
72
kf_pos = self._get_panel_pos_for_frame(frame)
73
except ZeroDivisionError: # math fails for 1 frame clip
74
75
frame, val, kf_type = self.keyframesself.active_kf_index
76
return val
77
78
+ def get_active_kf_type(self):
79
+ frame, val, kf_type = self.keyframesself.active_kf_index
80
+ return kf_type
81
+
82
def set_active_kf_value(self, new_value):
83
frame, val, kf_type = self.keyframes.pop(self.active_kf_index)
84
self.keyframes.insert(self.active_kf_index,(frame, new_value, kf_type))
85
86
print(type(self), "get_copy_kf_value not implemented")
87
88
def _create_keyframe_type_submenu(self, kf_type, menu, action_id, callback):
89
-
90
- items_data = ( _("Linear"), "linear"), ( _("Smooth"), "smooth"), ( _("Discrete"), "discrete")
91
+ text_smooth = ""
92
+ text_effect = ""
93
if kf_type == appconsts.KEYFRAME_LINEAR:
94
active_index = 0
95
- elif kf_type == appconsts.KEYFRAME_SMOOTH:
96
+ elif kf_type == appconsts.KEYFRAME_SMOOTH:
97
active_index = 1
98
- else:
99
+ elif kf_type == appconsts.KEYFRAME_DISCRETE:
100
active_index = 2
101
-
102
-
103
+ elif kf_type in animatedvalue.SMOOTH_EXTENDED_KEYFRAME_TYPES:
104
+ active_index = 3
105
+ text_smooth = animatedvalue.TYPE_TO_NAMEkf_type + " - "
106
+ else:
107
+ active_index = 4
108
+ text_effect = animatedvalue.TYPE_TO_NAMEkf_type + " - "
109
+
110
+ items_data = ( _("Linear"), str(appconsts.KEYFRAME_LINEAR)),
111
+ ( _("Smooth"), str(appconsts.KEYFRAME_SMOOTH)),
112
+ ( _("Discrete"), str(appconsts.KEYFRAME_DISCRETE)),
113
+ ( text_smooth + _("Smooth Extended") + "...", "smoothkfs"),
114
+ ( text_effect + _("Effect") + "...", "effectkfs")
115
+
116
kftype_section = Gio.Menu.new()
117
guipopover.add_menu_action_all_items_radio(kftype_section, items_data, action_id, active_index, callback)
118
menu.append_section(None, kftype_section)
119
120
except:
121
msg = data
122
123
- if msg == "linear":
124
- self.clip_editor.set_active_kf_type(appconsts.KEYFRAME_LINEAR)
125
- elif msg == "smooth":
126
- self.clip_editor.set_active_kf_type(appconsts.KEYFRAME_SMOOTH)
127
- elif msg == "discrete":
128
- self.clip_editor.set_active_kf_type(appconsts.KEYFRAME_DISCRETE)
129
- elif msg == "copy_kf":
130
- keyevents.copy_action()
131
- elif msg == "paste_kf":
132
- keyevents.paste_action()
133
- elif msg == "clonekfnext":
134
- self.clip_editor.clone_value_from_next()
135
- elif msg == "clonekfprev":
136
- self.clip_editor.clone_value_from_prev()
137
- elif msg == "openinkftool":
138
- track = self.editable_property.track
139
- clip = self.editable_property.clip
140
- displayname = self.editable_property.args"displayname".replace("!", " ")
141
- filter_index = self.editable_property.filter_index
142
- filter = clip.filtersfilter_index
143
- prop = filter.propertiesself.editable_property.property_index
144
- param_name, val, type = prop
145
- callbackbridge.modesetting_kftool_mode_from_kf_editor(clip, track, param_name, filter, filter_index, displayname)
146
+ try:
147
+ kf_type = int(msg)
148
+ self.clip_editor.set_active_kf_type(kf_type)
149
+ except:
150
+ if msg == "copykf":
151
+ keyevents.copy_action()
152
+ elif msg == "pastekf":
153
+ keyevents.paste_action()
154
+ elif msg == "clonekfnext":
155
+ self.clip_editor.clone_value_from_next()
156
+ elif msg == "clonekfprev":
157
+ self.clip_editor.clone_value_from_prev()
158
+ elif msg == "openinkftool":
159
+ track = self.editable_property.track
160
+ clip = self.editable_property.clip
161
+ displayname = self.editable_property.args"displayname".replace("!", " ")
162
+ filter_index = self.editable_property.filter_index
163
+ filter = clip.filtersfilter_index
164
+ prop = filter.propertiesself.editable_property.property_index
165
+ param_name, val, type = prop
166
+ callbackbridge.modesetting_kftool_mode_from_kf_editor(clip, track, param_name, filter, filter_index, displayname)
167
168
- return
169
-
170
+ return
171
+ elif data == "effectkfs":
172
+ animatedvalue.set_effect_keyframe_type(current_kf_type, self.extended_kf_type_set)
173
+ return
174
+ elif data == "effectkfs":
175
+ animatedvalue.set_smooth_extended_keyframe_type(current_kf_type, self.extended_kf_type_set)
176
+ return
177
+
178
self.queue_draw()
179
self.update_property_value()
180
181
def _kf_type_menu_item_activated(self, action, new_value_variant):
182
data = new_value_variant.get_string()
183
-
184
- if data == "linear":
185
- self.clip_editor.set_active_kf_type(appconsts.KEYFRAME_LINEAR)
186
- elif data == "smooth":
187
- self.clip_editor.set_active_kf_type(appconsts.KEYFRAME_SMOOTH)
188
- elif data == "discrete":
189
- self.clip_editor.set_active_kf_type(appconsts.KEYFRAME_DISCRETE)
190
-
191
- action.set_state(new_value_variant)
192
-
193
+
194
try:
195
_kf_popover.hide()
196
except:
197
# This called from the other one.
198
_kf_right_mouse_popover.hide()
199
+
200
+ # NOTE: We are not setting 'action.set_state(new_value_variant)'
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/kftoolmode.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/kftoolmode.py
Changed
187
1
2
import copy
3
import math
4
5
+import animatedvalue
6
import appconsts
7
import clipeffectseditor
8
import dialogutils
9
10
# -------------------------------------------------- init
11
def load_icons():
12
global HAMBURGER_ICON, ACTIVE_KF_ICON, NON_ACTIVE_KF_ICON, ACTIVE_KF_ICON_SMOOTH, \
13
- ACTIVE_KF_ICON_DISCRETE, NON_ACTIVE_KF_ICON_SMOOTH, NON_ACTIVE_KF_ICON_DISCRETE
14
+ ACTIVE_KF_ICON_DISCRETE, NON_ACTIVE_KF_ICON_SMOOTH, NON_ACTIVE_KF_ICON_DISCRETE, \
15
+ ACTIVE_KF_ICON_EFFECT, ACTIVE_KF_ICON_SMOOTH_EXTENDED, NON_ACTIVE_KF_ICON_EFFECT, \
16
+ NON_ACTIVE_KF_ICON_SMOOTH_EXTENDED
17
18
# Aug-2019 - SvdB - BB
19
HAMBURGER_ICON = guiutils.get_cairo_image("hamburger")
20
21
ACTIVE_KF_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active.png")
22
ACTIVE_KF_ICON_SMOOTH = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_smooth.png")
23
ACTIVE_KF_ICON_DISCRETE = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_discrete.png")
24
+ ACTIVE_KF_ICON_EFFECT = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_effect.png")
25
+ ACTIVE_KF_ICON_SMOOTH_EXTENDED = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_active_smooth_extended.png")
26
NON_ACTIVE_KF_ICON = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active.png")
27
NON_ACTIVE_KF_ICON_SMOOTH = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_smooth.png")
28
NON_ACTIVE_KF_ICON_DISCRETE = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_discrete.png")
29
+ NON_ACTIVE_KF_ICON_EFFECT = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_effect.png")
30
+ NON_ACTIVE_KF_ICON_SMOOTH_EXTENDED = cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + "kf_not_active_smooth_extended.png")
31
32
def init_tool_for_clip(clip, track, edit_type=VOLUME_KF_EDIT, param_data=None):
33
# These can produce data for same objects and we are not (currently) updating
34
35
cr.move_to(kf_pos_x_prev, kf_pos_y_prev)
36
cr.line_to(kf_pos_x, kf_pos_y_prev)
37
cr.stroke()
38
- elif kf_type_prev == appconsts.KEYFRAME_SMOOTH:
39
- self._draw_smooth_value_curve(cr, i - 1, self.keyframes)
40
- else: # LINEAR
41
+ elif kf_type_prev == appconsts.KEYFRAME_LINEAR:
42
cr.move_to(kf_pos_x_prev, kf_pos_y_prev)
43
cr.line_to(kf_pos_x, kf_pos_y)
44
cr.stroke()
45
-
46
+ else: #kf_type_prev == appconsts.KEYFRAME_SMOOTH:
47
+ self._draw_smooth_value_curve(cr, i - 1, self.keyframes, kf_type_prev)
48
+
49
# If last kf before clip end, continue value curve to end.
50
kf, frame, kf_index, kf_type, kf_pos_x, kf_pos_y = kf_positions-1
51
if kf_pos_x < ex + ew:
52
53
if frame > self.clip_in + self.clip_length:
54
continue
55
56
- if kf_index == self.active_kf_index:
57
+ if kf_index == self.active_kf_index:
58
if kf_type == appconsts.KEYFRAME_LINEAR:
59
icon = ACTIVE_KF_ICON
60
elif kf_type == appconsts.KEYFRAME_SMOOTH:
61
icon = ACTIVE_KF_ICON_SMOOTH
62
- else:
63
+ elif kf_type == appconsts.KEYFRAME_DISCRETE:
64
icon = ACTIVE_KF_ICON_DISCRETE
65
+ else:
66
+ if kf_type in animatedvalue.EFFECT_KEYFRAME_TYPES:
67
+ icon = ACTIVE_KF_ICON_EFFECT
68
+ else:
69
+ icon = ACTIVE_KF_ICON_SMOOTH_EXTENDED
70
else:
71
if kf_type == appconsts.KEYFRAME_LINEAR:
72
icon = NON_ACTIVE_KF_ICON
73
elif kf_type == appconsts.KEYFRAME_SMOOTH:
74
icon = NON_ACTIVE_KF_ICON_SMOOTH
75
- else:
76
+ elif kf_type == appconsts.KEYFRAME_DISCRETE:
77
icon = NON_ACTIVE_KF_ICON_DISCRETE
78
+ else:
79
+ if kf_type in animatedvalue.EFFECT_KEYFRAME_TYPES:
80
+ icon = NON_ACTIVE_KF_ICON_EFFECT
81
+ else:
82
+ icon = NON_ACTIVE_KF_ICON_SMOOTH_EXTENDED
83
84
cr.set_source_surface(icon, kf_pos_x - 6, kf_pos_y - 6) # -6 to get kf bitmap center on calculated pixel
85
cr.paint()
86
87
cr.set_source_rgb(0.8, 0.8, 0.8)
88
cr.show_text(text)
89
90
- def _draw_smooth_value_curve(self, cr, i, keyframes):
91
+ def _draw_smooth_value_curve(self, cr, i, keyframes, interpolated_kf_type):
92
+
93
# Get indexes of the four keyframes that affect the drawn curve.
94
prev = i
95
if i == 0:
96
97
# Draw curve using 5 pixel line segments from
98
# prev keyframe x position to next keyframe
99
# x position.
100
+ anim_value = animatedvalue.AnimatedValue(keyframes)
101
while(more_segments == True):
102
end_x = start_x + SEG_LEN_IN_PIX
103
if end_x >= kf_pos_next:
104
105
end_x = kf_pos_next
106
107
fract = (end_x - kf_pos_prev) / curve_length
108
- end_y_val = self._get_smooth_fract_value(prev_prev, prev, next, next_next, fract, keyframes)
109
+ end_y_val = anim_value.get_smooth_fract_value(prev_prev, prev, next, next_next, fract, interpolated_kf_type)
110
end_y = self._get_panel_y_for_value(end_y_val)
111
cr.line_to(end_x, end_y)
112
113
114
115
cr.stroke()
116
117
+ """
118
def _get_smooth_fract_value(self, prev_prev, prev, next, next_next, fract, keyframes):
119
frame, val0, kf_type = keyframesprev_prev
120
frame, val1, kf_type = keyframesprev
121
122
smooth_val = self._catmull_rom_interpolate(val0, val1, val2, val3, fract)
123
return smooth_val
124
125
+
126
# These all need to be doubles.
127
def _catmull_rom_interpolate(self, y0, y1, y2, y3, t):
128
t2 = t * t
129
130
a2 = -0.5 * y0 + 0.5 * y2
131
a3 = y1
132
return a0 * t * t2 + a1 * t2 + a2 * t + a3
133
-
134
+ """
135
+
136
def create_round_rect_path(self, cr, x, y, width, height, radius=4.0):
137
degrees = math.pi / 180.0
138
139
140
# ------------------------------------------------------------ menus
141
def _show_kf_menu(self, event):
142
guipopoverclip.kftype_select_popover_menu_show(gui.tline_canvas.widget, self.get_active_kf_type(), event.x, event.y, self._kf_popover_callback)
143
-
144
- def _kf_popover_callback2(self, action, variant):
145
- print(action, variant)
146
147
def _kf_popover_callback(self, action, variant):
148
data = variant.get_string()
149
-
150
- if data == "linear":
151
- self.set_active_kf_type(appconsts.KEYFRAME_LINEAR)
152
- elif data == "smooth":
153
- self.set_active_kf_type(appconsts.KEYFRAME_SMOOTH)
154
- elif data == "discrete":
155
- self.set_active_kf_type(appconsts.KEYFRAME_DISCRETE)
156
-
157
- action.set_state(variant)
158
+
159
guipopoverclip._kf_select_popover.hide()
160
- updater.repaint_tline()
161
162
+ # NOTE: We are not setting 'action.set_state(new_value_variant)'
163
+ # because we are not using it as state, instead menu in always recreated
164
+ # on show to active keyframe type.
165
+
166
+ try:
167
+ kf_type = int(data)
168
+ self.set_active_kf_type(kf_type)
169
+ self.update_property_value()
170
+ updater.repaint_tline()
171
+ except:
172
+ current_kf_type = self.get_active_kf_type()
173
+ if data == "effectkfs":
174
+ animatedvalue.set_effect_keyframe_type(current_kf_type, self.extended_kf_type_set)
175
+ else:
176
+ animatedvalue.set_smooth_extended_keyframe_type(current_kf_type, self.extended_kf_type_set)
177
+ return
178
+
179
+ def extended_kf_type_set(self, selected_kf_type):
180
+ self.set_active_kf_type(selected_kf_type)
181
+ self.update_property_value()
182
+ updater.repaint_tline()
183
+
184
def _show_hamburger_popover(self, widget, event):
185
guipopoverclip.kftool_popover_menu_show(widget, self, event.x, event.y, self._popover_callback, self._snapping_menu_item_item_activated)
186
187
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/Flowblade/flowblade.pot -> _service:obs_scm:flowblade-2.22.obscpio/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: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\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
"Language: \n"
11
"MIME-Version: 1.0\n"
12
-"Content-Type: text/plain; charset=CHARSET\n"
13
+"Content-Type: text/plain; charset=UTF-8\n"
14
"Content-Transfer-Encoding: 8bit\n"
15
16
-#: app.py:240
17
+#: app.py:243
18
msgid "No Autosave"
19
msgstr ""
20
21
-#: app.py:240
22
+#: app.py:243
23
msgid "1 min"
24
msgstr ""
25
26
-#: app.py:240
27
+#: app.py:243
28
msgid "2 min"
29
msgstr ""
30
31
-#: app.py:240
32
+#: app.py:243
33
msgid "5 min"
34
msgstr ""
35
36
-#: app.py:945
37
+#: app.py:917
38
msgid "XDG Data folder location has changed!"
39
msgstr ""
40
41
-#: app.py:946
42
+#: app.py:918
43
msgid ""
44
"Location of <b>Default XDG Data Store</b> has changed because value of "
45
"<b>XDG Data Home</b> variable has changed.\n"
46
"\n"
47
msgstr ""
48
49
-#: app.py:947
50
+#: app.py:919
51
msgid ""
52
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
53
"will continue to work,\n"
54
msgstr ""
55
56
-#: app.py:948
57
+#: app.py:920
58
msgid ""
59
"but new projects will have data saved in the location specified by the new "
60
"value <b>XDG Data Home</b> variable ."
61
msgstr ""
62
63
-#: app.py:1033
64
+#: app.py:1005
65
msgid "Too small screen for this application."
66
msgstr ""
67
68
-#: app.py:1035
69
+#: app.py:1007
70
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
71
msgstr ""
72
73
-#: app.py:1036
74
+#: app.py:1008
75
msgid "Your screen dimensions are "
76
msgstr ""
77
78
-#: app.py:1047
79
+#: app.py:1019
80
msgid "Cannot launch application because XDG folders init error."
81
msgstr ""
82
83
-#: app.py:1058
84
+#: app.py:1030
85
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
86
msgstr ""
87
88
-#: app.py:1059
89
+#: app.py:1031
90
msgid "Your MLT version is: "
91
msgstr ""
92
93
-#: app.py:1059
94
+#: app.py:1031
95
msgid "Install MLT 6.18 or higher to run Flowblade."
96
msgstr ""
97
98
-#: app.py:1133 projectaction.py:559 projectaction.py:761
99
+#: app.py:1105 projectaction.py:559 projectaction.py:761
100
msgid "Project has not been saved previously"
101
msgstr ""
102
103
-#: app.py:1134 projectaction.py:560 projectaction.py:762
104
+#: app.py:1106 projectaction.py:560 projectaction.py:762
105
msgid "Save project with File -> Save As before closing."
106
msgstr ""
107
108
109
msgid "N/A"
110
msgstr ""
111
112
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
113
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
114
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
115
msgid "Yes"
116
msgstr ""
117
118
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
119
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
120
#: projectdatavaultgui.py:482
121
msgid "No"
122
msgstr ""
123
124
msgid ""
125
"You attempted to import %s Generator/s.\n"
126
"\n"
127
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
128
-"feature\n"
129
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
130
+"-feature\n"
131
"to create reusable Generators."
132
msgstr ""
133
134
135
msgstr ""
136
137
#: projectaction.py:2200
138
-#, python-format
139
+msgid "Duplicate sequence <b>"
140
+msgstr ""
141
+
142
+#: projectaction.py:2200
143
msgid ""
144
-"Duplicate sequence <b>%s</b> was created\n"
145
-"from sequence <b>%s</b> ."
146
+"</b> was created\n"
147
+"from sequence <b>"
148
msgstr ""
149
150
#: projectaction.py:2498
151
152
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
153
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
154
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
155
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
156
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
157
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
158
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
159
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
160
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
161
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
162
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
163
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
164
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
165
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
166
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
167
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
168
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
169
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
170
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
171
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
172
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
173
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
174
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
175
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
176
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
177
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
178
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
179
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
180
#: tools/scripttool.py:624 singletracktransition.py:554
181
-#: singletracktransition.py:733 mediaplugin.py:735
182
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
183
msgid "Cancel"
184
msgstr ""
185
186
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
187
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
188
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
189
-#: tools/scripttool.py:920
190
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
191
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
192
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
193
+#: tools/scripttool.py:917
194
msgid "Render"
195
msgstr ""
196
197
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
198
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
199
msgid "Source Media File: "
200
msgstr ""
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/create_pot -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/create_pot
Changed
8
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 monitorevent.py compositorfades.py audiosync.py diskcachemanagement.py toolsintegration.py projectmediaimport.py shortcuts.py clipmenuaction.py dialogutils.py trimmodes.py menuactions.py exporting.py workflow.py kftoolmode.py tools/rotomask.py tools/simpleeditors.py jobs.py containeractions.py containerclip.py editorlayout.py tools/scripttool.py singletracktransition.py guipopover.py projectdatavaultgui.py guipopoverclip.py tlinewidgets.py utilsgtk.py mediaplugin.py projectaddmediafolder.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 compositorfades.py audiosync.py diskcachemanagement.py toolsintegration.py projectmediaimport.py shortcuts.py clipmenuaction.py dialogutils.py trimmodes.py menuactions.py exporting.py workflow.py kftoolmode.py tools/rotomask.py tools/simpleeditors.py jobs.py containeractions.py containerclip.py editorlayout.py tools/scripttool.py singletracktransition.py guipopover.py projectdatavaultgui.py guipopoverclip.py tlinewidgets.py utilsgtk.py mediaplugin.py projectaddmediafolder.py animatedvalue.py gtkbuilder.py
7
8
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/cs/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/cs/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/cs/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/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: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2021-02-28 16:18+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:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Žádné automatické ukládání"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 minutu"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 minuty"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 minut"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Příliš malá obrazovka pro tento program."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "Nejmenší rozměry obrazovky pro tento program jsou 1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "Rozměry vaší obrazovky jsou "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr "Program nelze spustit z důvodu chyby v inicializaci složky XDG."
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr ""
85
"Flowblade ve verzi 2.6 (nebo novější) vyžaduje ke svému běhu MLT ve verzi "
86
"6.18"
87
88
-#: app.py:1059
89
+#: app.py:1031
90
msgid "Your MLT version is: "
91
msgstr "Verze MLT: "
92
93
-#: app.py:1059
94
+#: app.py:1031
95
msgid "Install MLT 6.18 or higher to run Flowblade."
96
msgstr "Pro běh Flowblade nainstalujte MLT 6.18 nebo novější."
97
98
-#: app.py:1133 projectaction.py:559 projectaction.py:761
99
+#: app.py:1105 projectaction.py:559 projectaction.py:761
100
msgid "Project has not been saved previously"
101
msgstr "Projekt předtím byl uložen"
102
103
-#: app.py:1134 projectaction.py:560 projectaction.py:762
104
+#: app.py:1106 projectaction.py:560 projectaction.py:762
105
msgid "Save project with File -> Save As before closing."
106
msgstr "Uložte projekt před zavřením pomocí Soubor → Uložit."
107
108
109
msgid "N/A"
110
msgstr "Nedostupné"
111
112
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
113
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
114
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
115
msgid "Yes"
116
msgstr "Ano"
117
118
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
119
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
120
#: projectdatavaultgui.py:482
121
msgid "No"
122
msgstr "Ne"
123
124
msgid ""
125
"You attempted to import %s Generator/s.\n"
126
"\n"
127
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
128
-"feature\n"
129
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
130
+"-feature\n"
131
"to create reusable Generators."
132
msgstr ""
133
134
135
msgstr "Smazat úryvek z projektu"
136
137
#: projectaction.py:2200
138
-#, python-format
139
+#, fuzzy
140
+msgid "Duplicate sequence <b>"
141
+msgstr "Vytvořit úryvek"
142
+
143
+#: projectaction.py:2200
144
msgid ""
145
-"Duplicate sequence <b>%s</b> was created\n"
146
-"from sequence <b>%s</b> ."
147
+"</b> was created\n"
148
+"from sequence <b>"
149
msgstr ""
150
151
#: projectaction.py:2498
152
153
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
154
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
155
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
156
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
157
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
158
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
159
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
160
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
161
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
162
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
163
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
164
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
165
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
166
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
167
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
168
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
169
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
170
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
171
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
172
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
173
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
174
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
175
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
176
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
177
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
178
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
179
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
180
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
181
#: tools/scripttool.py:624 singletracktransition.py:554
182
-#: singletracktransition.py:733 mediaplugin.py:735
183
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
184
msgid "Cancel"
185
msgstr "Zrušit"
186
187
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
188
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
189
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
190
-#: tools/scripttool.py:920
191
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
192
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
193
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
194
+#: tools/scripttool.py:917
195
msgid "Render"
196
msgstr "Zpracování"
197
198
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
199
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
200
msgid "Source Media File: "
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/de/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/de/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/de/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/de/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: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2014-11-23 14:22+0100\n"
8
"Last-Translator: Martin Wielebinski <blueray.mw@gmail.com>\n"
9
"Language-Team: German\n"
10
11
"Content-Transfer-Encoding: 8bit\n"
12
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Kein Auto-Save"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr ""
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr ""
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr ""
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Zu kleiner Bildschirm für diese Applikation."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "Minimale Auflösung für diese Applikation ist 1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "Ihre Auflösung beträgt "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr "Kann Applikation wegen XDG-Ordner-Fehler nicht starten."
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr "Flowblade Version 2.6 (und folgende) benötigt MLT ab Version 6.18"
85
86
-#: app.py:1059
87
+#: app.py:1031
88
msgid "Your MLT version is: "
89
msgstr "Ihre MLT-Version ist: "
90
91
-#: app.py:1059
92
+#: app.py:1031
93
msgid "Install MLT 6.18 or higher to run Flowblade."
94
msgstr "Installieren Sie MLT 6.18 oder höher, um Flowblade zu nutzen."
95
96
-#: app.py:1133 projectaction.py:559 projectaction.py:761
97
+#: app.py:1105 projectaction.py:559 projectaction.py:761
98
msgid "Project has not been saved previously"
99
msgstr "Projekt wurde noch nicht gesichert"
100
101
-#: app.py:1134 projectaction.py:560 projectaction.py:762
102
+#: app.py:1106 projectaction.py:560 projectaction.py:762
103
msgid "Save project with File -> Save As before closing."
104
msgstr "Projekt vor dem Schließen sichern mit 'Datei -> Sichern als...'."
105
106
107
msgid "N/A"
108
msgstr "N/A"
109
110
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
111
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
112
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
113
msgid "Yes"
114
msgstr "Ja"
115
116
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
117
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
118
#: projectdatavaultgui.py:482
119
msgid "No"
120
msgstr "Nein"
121
122
msgid ""
123
"You attempted to import %s Generator/s.\n"
124
"\n"
125
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
126
-"feature\n"
127
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
128
+"-feature\n"
129
"to create reusable Generators."
130
msgstr ""
131
132
133
msgstr "Sequenz aus Projekt entfernen"
134
135
#: projectaction.py:2200
136
-#, python-format
137
+#, fuzzy
138
+msgid "Duplicate sequence <b>"
139
+msgstr "Sequenz erzeugen"
140
+
141
+#: projectaction.py:2200
142
msgid ""
143
-"Duplicate sequence <b>%s</b> was created\n"
144
-"from sequence <b>%s</b> ."
145
+"</b> was created\n"
146
+"from sequence <b>"
147
msgstr ""
148
149
#: projectaction.py:2498
150
151
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
152
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
153
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
154
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
155
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
156
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
157
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
158
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
159
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
160
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
161
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
162
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
163
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
164
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
165
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
166
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
167
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
168
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
169
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
170
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
171
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
172
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
173
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
174
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
175
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
176
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
177
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
178
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
179
#: tools/scripttool.py:624 singletracktransition.py:554
180
-#: singletracktransition.py:733 mediaplugin.py:735
181
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
182
msgid "Cancel"
183
msgstr "Abbruch"
184
185
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
186
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
187
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
188
-#: tools/scripttool.py:920
189
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
190
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
191
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
192
+#: tools/scripttool.py:917
193
msgid "Render"
194
msgstr "Rendern"
195
196
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
197
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
198
msgid "Source Media File: "
199
msgstr "Quell-Medien-Datei: "
200
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/es/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: \n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2024-08-12 13:54+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: Poedit 3.4.3\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Sin guardado automático"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 min"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 minutos"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 minutos"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr "¡La ubicación de la carpeta de datos XDG ha cambiado!"
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
45
"porque el valor de la variable <b>Inicio de datos XDG</b> ha cambiado.\n"
46
"\n"
47
48
-#: app.py:947
49
+#: app.py:919
50
msgid ""
51
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
52
"will continue to work,\n"
53
54
"Los proyectos existentes con datos de proyecto guardados en el <b>Almacén de "
55
"datos XDG predeterminado</b> seguirán funcionando.\n"
56
57
-#: app.py:948
58
+#: app.py:920
59
msgid ""
60
"but new projects will have data saved in the location specified by the new "
61
"value <b>XDG Data Home</b> variable ."
62
63
"proyectos tendrán datos guardados en la ubicación especificada por la nueva "
64
"variable de valor <b>XDG Data Home</b>."
65
66
-#: app.py:1033
67
+#: app.py:1005
68
msgid "Too small screen for this application."
69
msgstr "La pantalla es demasiado pequeña para esta aplicación."
70
71
-#: app.py:1035
72
+#: app.py:1007
73
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
74
msgstr ""
75
"La dimensión de pantalla mínima para esta aplicación es de 1152 x 768.\n"
76
77
-#: app.py:1036
78
+#: app.py:1008
79
msgid "Your screen dimensions are "
80
msgstr "Las dimensiones de su pantalla son "
81
82
-#: app.py:1047
83
+#: app.py:1019
84
msgid "Cannot launch application because XDG folders init error."
85
msgstr "Cannot launch application because XDG folders init error."
86
87
-#: app.py:1058
88
+#: app.py:1030
89
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
90
msgstr "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
91
92
-#: app.py:1059
93
+#: app.py:1031
94
msgid "Your MLT version is: "
95
msgstr "Versión de MLT: "
96
97
-#: app.py:1059
98
+#: app.py:1031
99
msgid "Install MLT 6.18 or higher to run Flowblade."
100
msgstr "Install MLT 6.18 or higher to run Flowblade."
101
102
-#: app.py:1133 projectaction.py:559 projectaction.py:761
103
+#: app.py:1105 projectaction.py:559 projectaction.py:761
104
msgid "Project has not been saved previously"
105
msgstr "El proyecto no se ha salvado antes"
106
107
-#: app.py:1134 projectaction.py:560 projectaction.py:762
108
+#: app.py:1106 projectaction.py:560 projectaction.py:762
109
msgid "Save project with File -> Save As before closing."
110
msgstr "Salvar el proyecto en un Archivo -> Salvar como antes de cerrar."
111
112
113
msgid "N/A"
114
msgstr "No Aplica"
115
116
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
117
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
118
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
119
msgid "Yes"
120
msgstr "Si"
121
122
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
123
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
124
#: projectdatavaultgui.py:482
125
msgid "No"
126
msgstr "No"
127
128
msgid ""
129
"You attempted to import %s Generator/s.\n"
130
"\n"
131
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
132
-"feature\n"
133
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
134
+"-feature\n"
135
"to create reusable Generators."
136
msgstr ""
137
138
139
msgstr "Eliminar Secuencia del Proyecto"
140
141
#: projectaction.py:2200
142
-#, python-format
143
+#, fuzzy
144
+msgid "Duplicate sequence <b>"
145
+msgstr "Crear secuencia"
146
+
147
+#: projectaction.py:2200
148
msgid ""
149
-"Duplicate sequence <b>%s</b> was created\n"
150
-"from sequence <b>%s</b> ."
151
+"</b> was created\n"
152
+"from sequence <b>"
153
msgstr ""
154
155
#: projectaction.py:2498
156
157
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
158
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
159
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
160
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
161
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
162
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
163
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
164
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
165
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
166
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
167
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
168
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
169
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
170
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
171
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
172
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
173
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
174
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
175
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
176
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
177
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
178
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
179
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
180
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
181
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
182
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
183
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
184
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
185
#: tools/scripttool.py:624 singletracktransition.py:554
186
-#: singletracktransition.py:733 mediaplugin.py:735
187
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
188
msgid "Cancel"
189
msgstr "Cancelar"
190
191
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
192
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
193
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
194
-#: tools/scripttool.py:920
195
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
196
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
197
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
198
+#: tools/scripttool.py:917
199
msgid "Render"
200
msgstr "Renderizar"
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/fr/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: \n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2020-12-14 14:52+0100\n"
8
"Last-Translator: Jean-Paul Favier <favijep@laposte.net>\n"
9
"Language-Team: French\n"
10
11
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
12
"X-Generator: Poedit 2.3\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Pas de sauvegarde automatique"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr ""
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr ""
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr ""
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Votre écran est trop petit pour cette application."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "La résolution minimum pour cet application est de 1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "Votre résolution actuelle est "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr ""
80
"Ne peut pas lancer l'application à cause d'une erreur d'initialisation des "
81
"dossiers XDG."
82
83
-#: app.py:1058
84
+#: app.py:1030
85
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
86
msgstr "Flowblade version 2.6 ou supérieure demande MLT version 6.18"
87
88
-#: app.py:1059
89
+#: app.py:1031
90
msgid "Your MLT version is: "
91
msgstr "Version MLT : "
92
93
-#: app.py:1059
94
+#: app.py:1031
95
msgid "Install MLT 6.18 or higher to run Flowblade."
96
msgstr "Installez MLT 6.18 ou supérieure pour lancer Flowblade."
97
98
-#: app.py:1133 projectaction.py:559 projectaction.py:761
99
+#: app.py:1105 projectaction.py:559 projectaction.py:761
100
msgid "Project has not been saved previously"
101
msgstr "Le projet n'a jamais été sauvegardé"
102
103
-#: app.py:1134 projectaction.py:560 projectaction.py:762
104
+#: app.py:1106 projectaction.py:560 projectaction.py:762
105
msgid "Save project with File -> Save As before closing."
106
msgstr ""
107
"Avant de fermer, sauvegardez le projet avec <u>Menu Fichier</u> -> "
108
109
msgid "N/A"
110
msgstr ""
111
112
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
113
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
114
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
115
msgid "Yes"
116
msgstr "Oui"
117
118
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
119
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
120
#: projectdatavaultgui.py:482
121
msgid "No"
122
msgstr "Non"
123
124
msgid ""
125
"You attempted to import %s Generator/s.\n"
126
"\n"
127
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
128
-"feature\n"
129
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
130
+"-feature\n"
131
"to create reusable Generators."
132
msgstr ""
133
134
135
msgstr "Supprimer une séquence du projet"
136
137
#: projectaction.py:2200
138
-#, python-format
139
+#, fuzzy
140
+msgid "Duplicate sequence <b>"
141
+msgstr "Créer une séquence"
142
+
143
+#: projectaction.py:2200
144
msgid ""
145
-"Duplicate sequence <b>%s</b> was created\n"
146
-"from sequence <b>%s</b> ."
147
+"</b> was created\n"
148
+"from sequence <b>"
149
msgstr ""
150
151
#: projectaction.py:2498
152
153
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
154
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
155
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
156
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
157
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
158
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
159
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
160
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
161
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
162
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
163
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
164
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
165
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
166
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
167
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
168
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
169
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
170
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
171
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
172
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
173
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
174
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
175
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
176
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
177
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
178
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
179
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
180
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
181
#: tools/scripttool.py:624 singletracktransition.py:554
182
-#: singletracktransition.py:733 mediaplugin.py:735
183
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
184
msgid "Cancel"
185
msgstr "Annuler"
186
187
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
188
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
189
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
190
-#: tools/scripttool.py:920
191
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
192
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
193
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
194
+#: tools/scripttool.py:917
195
msgid "Render"
196
msgstr "Rendu"
197
198
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
199
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
200
msgid "Source Media File: "
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/hu/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/hu/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/hu/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/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: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2017-03-24 08:40+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:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Nincs automatikus mentés"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 perc"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 perc"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 perc"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Túl kicsi a képernyő az alkalmazás számára."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "A minimális képernyőfelbontás ezen alkalmazás számára 1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "Az ön képernyőjének felbontása "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr ""
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr ""
85
86
-#: app.py:1059
87
+#: app.py:1031
88
#, fuzzy
89
msgid "Your MLT version is: "
90
msgstr "MLT változat: "
91
92
-#: app.py:1059
93
+#: app.py:1031
94
msgid "Install MLT 6.18 or higher to run Flowblade."
95
msgstr ""
96
97
-#: app.py:1133 projectaction.py:559 projectaction.py:761
98
+#: app.py:1105 projectaction.py:559 projectaction.py:761
99
msgid "Project has not been saved previously"
100
msgstr "A projekt korábban még nem volt mentve"
101
102
-#: app.py:1134 projectaction.py:560 projectaction.py:762
103
+#: app.py:1106 projectaction.py:560 projectaction.py:762
104
msgid "Save project with File -> Save As before closing."
105
msgstr ""
106
"Mentse a projektet a Fájl -> Mentés másként menüpont használatával mielőtt "
107
108
msgid "N/A"
109
msgstr "N/A"
110
111
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
112
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
113
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
114
msgid "Yes"
115
msgstr "Igen"
116
117
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
118
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
119
#: projectdatavaultgui.py:482
120
msgid "No"
121
msgstr "Nem"
122
123
msgid ""
124
"You attempted to import %s Generator/s.\n"
125
"\n"
126
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
127
-"feature\n"
128
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
129
+"-feature\n"
130
"to create reusable Generators."
131
msgstr ""
132
133
134
msgstr "Jelenet törlése a projektből"
135
136
#: projectaction.py:2200
137
-#, python-format
138
+#, fuzzy
139
+msgid "Duplicate sequence <b>"
140
+msgstr "Jelenet létrehozása"
141
+
142
+#: projectaction.py:2200
143
msgid ""
144
-"Duplicate sequence <b>%s</b> was created\n"
145
-"from sequence <b>%s</b> ."
146
+"</b> was created\n"
147
+"from sequence <b>"
148
msgstr ""
149
150
#: projectaction.py:2498
151
152
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
153
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
154
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
155
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
156
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
157
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
158
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
159
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
160
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
161
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
162
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
163
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
164
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
165
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
166
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
167
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
168
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
169
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
170
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
171
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
172
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
173
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
174
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
175
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
176
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
177
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
178
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
179
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
180
#: tools/scripttool.py:624 singletracktransition.py:554
181
-#: singletracktransition.py:733 mediaplugin.py:735
182
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
183
msgid "Cancel"
184
msgstr "Mégsem"
185
186
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
187
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
188
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
189
-#: tools/scripttool.py:920
190
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
191
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
192
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
193
+#: tools/scripttool.py:917
194
msgid "Render"
195
msgstr "Renderelés"
196
197
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
198
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
199
msgid "Source Media File: "
200
msgstr "Forrás médiafájl: "
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/it/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/it/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/it/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/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: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2020-29-02 21:24+0200\n"
8
"Last-Translator: Albano Battistella <albano_battistella@hotmail.com>\n"
9
"Language-Team: Italiano\n"
10
11
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
12
"X-Generator: Poedit 2.2.1\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Nessuno salvataggio automatico"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 min"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 min"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 min"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Lo schermo è troppo piccolo per questa applicazione."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "La risoluzione minima per questa applicazione è 1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "La risoluzione corrente è "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr ""
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr ""
85
86
-#: app.py:1059
87
+#: app.py:1031
88
#, fuzzy
89
msgid "Your MLT version is: "
90
msgstr "Versione MLT: "
91
92
-#: app.py:1059
93
+#: app.py:1031
94
msgid "Install MLT 6.18 or higher to run Flowblade."
95
msgstr ""
96
97
-#: app.py:1133 projectaction.py:559 projectaction.py:761
98
+#: app.py:1105 projectaction.py:559 projectaction.py:761
99
msgid "Project has not been saved previously"
100
msgstr "Il progetto non è mai stato salvato"
101
102
-#: app.py:1134 projectaction.py:560 projectaction.py:762
103
+#: app.py:1106 projectaction.py:560 projectaction.py:762
104
msgid "Save project with File -> Save As before closing."
105
msgstr "Salva il progetto da File -> Salva con nome prima di chiudere."
106
107
108
msgid "N/A"
109
msgstr "N/D"
110
111
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
112
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
113
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
114
msgid "Yes"
115
msgstr "Si"
116
117
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
118
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
119
#: projectdatavaultgui.py:482
120
msgid "No"
121
msgstr "No"
122
123
msgid ""
124
"You attempted to import %s Generator/s.\n"
125
"\n"
126
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
127
-"feature\n"
128
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
129
+"-feature\n"
130
"to create reusable Generators."
131
msgstr ""
132
133
134
msgstr "Elimina sequenza dal progetto"
135
136
#: projectaction.py:2200
137
-#, python-format
138
+#, fuzzy
139
+msgid "Duplicate sequence <b>"
140
+msgstr "Crea una Sequenza"
141
+
142
+#: projectaction.py:2200
143
msgid ""
144
-"Duplicate sequence <b>%s</b> was created\n"
145
-"from sequence <b>%s</b> ."
146
+"</b> was created\n"
147
+"from sequence <b>"
148
msgstr ""
149
150
#: projectaction.py:2498
151
152
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
153
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
154
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
155
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
156
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
157
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
158
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
159
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
160
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
161
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
162
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
163
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
164
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
165
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
166
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
167
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
168
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
169
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
170
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
171
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
172
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
173
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
174
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
175
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
176
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
177
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
178
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
179
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
180
#: tools/scripttool.py:624 singletracktransition.py:554
181
-#: singletracktransition.py:733 mediaplugin.py:735
182
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
183
msgid "Cancel"
184
msgstr "Annulla"
185
186
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
187
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
188
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
189
-#: tools/scripttool.py:920
190
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
191
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
192
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
193
+#: tools/scripttool.py:917
194
msgid "Render"
195
msgstr "Esporta"
196
197
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
198
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
199
msgid "Source Media File: "
200
msgstr "Sorgente: "
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/pl/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/pl/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/pl/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/pl/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: \n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2024-08-27 10:29+0200\n"
8
"Last-Translator: Stanislaw Polak <polak@agh.edu.pl>\n"
9
"Language-Team: Polish\n"
10
"Language: pl\n"
11
"MIME-Version: 1.0\n"
12
-"Content-Type: text/plain; charset=utf-8\n"
13
+"Content-Type: text/plain; charset=UTF-8\n"
14
"Content-Transfer-Encoding: 8bit\n"
15
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
16
"|| n%100>=20) ? 1 : 2);\n"
17
"X-Generator: Poedit 3.4.4\n"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "No Autosave"
22
msgstr "Brak autozapisu"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "1 min"
27
msgstr ""
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "2 min"
32
msgstr ""
33
34
-#: app.py:240
35
+#: app.py:243
36
msgid "5 min"
37
msgstr ""
38
39
-#: app.py:945
40
+#: app.py:917
41
msgid "XDG Data folder location has changed!"
42
msgstr "Zmieniła się lokalizacja folderu danych XDG!"
43
44
-#: app.py:946
45
+#: app.py:918
46
msgid ""
47
"Location of <b>Default XDG Data Store</b> has changed because value of "
48
"<b>XDG Data Home</b> variable has changed.\n"
49
50
"Lokalizacja <b>Domyślnego magazynu danych XDG</b> uległa zmianie, ponieważ "
51
"zmieniła się wartość zmiennej <b>XDG Data Home</b>.\n"
52
53
-#: app.py:947
54
+#: app.py:919
55
msgid ""
56
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
57
"will continue to work,\n"
58
59
"Istniejące projekty z danymi projektu zapisanymi w <b>Domyślnym magazynie "
60
"danych XDG</b> będą nadal działać,\n"
61
62
-#: app.py:948
63
+#: app.py:920
64
msgid ""
65
"but new projects will have data saved in the location specified by the new "
66
"value <b>XDG Data Home</b> variable ."
67
68
"ale nowe projekty będą miały dane zapisane w lokalizacji określonej przez "
69
"nową wartość zmiennej <b>XDG Data Home</b>."
70
71
-#: app.py:1033
72
+#: app.py:1005
73
msgid "Too small screen for this application."
74
msgstr "Zbyt mały ekran dla tej aplikacji."
75
76
-#: app.py:1035
77
+#: app.py:1007
78
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
79
msgstr "Minimalne wymiary ekranu dla tej aplikacji to 1152 x 768.\n"
80
81
-#: app.py:1036
82
+#: app.py:1008
83
msgid "Your screen dimensions are "
84
msgstr "Wymiary twojego ekranu to "
85
86
-#: app.py:1047
87
+#: app.py:1019
88
msgid "Cannot launch application because XDG folders init error."
89
msgstr ""
90
"Nie można uruchomić aplikacji, ponieważ wystąpił błąd inicjalizacji folderów "
91
"XDG."
92
93
-#: app.py:1058
94
+#: app.py:1030
95
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
96
msgstr ""
97
"Flowblade w wersji 2.6 (lub nowszej) wymaga do działania MLT w wersji 6.18"
98
99
-#: app.py:1059
100
+#: app.py:1031
101
msgid "Your MLT version is: "
102
msgstr "Twoja wersja MLT to: "
103
104
-#: app.py:1059
105
+#: app.py:1031
106
msgid "Install MLT 6.18 or higher to run Flowblade."
107
msgstr "Zainstaluj MLT 6.18 lub nowszy, aby uruchomić Flowblade."
108
109
-#: app.py:1133 projectaction.py:559 projectaction.py:761
110
+#: app.py:1105 projectaction.py:559 projectaction.py:761
111
msgid "Project has not been saved previously"
112
msgstr "Projekt nie został wcześniej zapisany"
113
114
-#: app.py:1134 projectaction.py:560 projectaction.py:762
115
+#: app.py:1106 projectaction.py:560 projectaction.py:762
116
msgid "Save project with File -> Save As before closing."
117
msgstr "Przed zamknięciem, zapisz projekt za pomocą Plik -> Zapisz jako."
118
119
120
msgid "N/A"
121
msgstr "Niedostępny"
122
123
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
124
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
125
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
126
msgid "Yes"
127
msgstr "Tak"
128
129
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
130
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
131
#: projectdatavaultgui.py:482
132
msgid "No"
133
msgstr "Nie"
134
135
msgid ""
136
"You attempted to import %s Generator/s.\n"
137
"\n"
138
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
139
-"feature\n"
140
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
141
+"-feature\n"
142
"to create reusable Generators."
143
msgstr ""
144
145
146
msgstr "Usuń sekwencję z projektu"
147
148
#: projectaction.py:2200
149
-#, python-format
150
+#, fuzzy
151
+msgid "Duplicate sequence <b>"
152
+msgstr "Utwórz sekwencję"
153
+
154
+#: projectaction.py:2200
155
msgid ""
156
-"Duplicate sequence <b>%s</b> was created\n"
157
-"from sequence <b>%s</b> ."
158
+"</b> was created\n"
159
+"from sequence <b>"
160
msgstr ""
161
162
#: projectaction.py:2498
163
164
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
165
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
166
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
167
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
168
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
169
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
170
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
171
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
172
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
173
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
174
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
175
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
176
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
177
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
178
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
179
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
180
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
181
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
182
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
183
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
184
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
185
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
186
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
187
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
188
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
189
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
190
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
191
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
192
#: tools/scripttool.py:624 singletracktransition.py:554
193
-#: singletracktransition.py:733 mediaplugin.py:735
194
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
195
msgid "Cancel"
196
msgstr "Anuluj"
197
198
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
199
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
200
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/ru/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/ru/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/ru/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/ru/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: Flowblade\n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2023-06-20 15:06+0300\n"
8
"Last-Translator: Смольянинов Николай <smolianinow.colya2016@yandex.ru>\n"
9
"Language-Team: ru\n"
10
11
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
12
"X-Generator: Poedit 3.2.2\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Без автосохранения"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "каждую минуту"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "каждые 2 минуты"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "каждые 5 минут"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Недостаточное разрешение экрана."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "Минимальное разрешение экрана должно быть не ниже 1152 х 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "Разрешение вашего экрана "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr "Не удалось запустить приложение из-за ошибки инициализации папок XDG."
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr "Для запуска Flowblade 2.6 (или выше) требуется версия MLT не ниже 6.18"
85
86
-#: app.py:1059
87
+#: app.py:1031
88
msgid "Your MLT version is: "
89
msgstr "Ваша версия MLT: "
90
91
-#: app.py:1059
92
+#: app.py:1031
93
msgid "Install MLT 6.18 or higher to run Flowblade."
94
msgstr "Установите MLT 6.18 или выше для запуска Flowblade."
95
96
-#: app.py:1133 projectaction.py:559 projectaction.py:761
97
+#: app.py:1105 projectaction.py:559 projectaction.py:761
98
msgid "Project has not been saved previously"
99
msgstr "Проект не был сохранён"
100
101
-#: app.py:1134 projectaction.py:560 projectaction.py:762
102
+#: app.py:1106 projectaction.py:560 projectaction.py:762
103
msgid "Save project with File -> Save As before closing."
104
msgstr "Сохраните проект перед закрытием (Файл ⇨ Сохранить как...)."
105
106
107
msgid "N/A"
108
msgstr "Н/Д"
109
110
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
111
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
112
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
113
msgid "Yes"
114
msgstr "Да"
115
116
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
117
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
118
#: projectdatavaultgui.py:482
119
msgid "No"
120
msgstr "Нет"
121
122
msgid ""
123
"You attempted to import %s Generator/s.\n"
124
"\n"
125
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
126
-"feature\n"
127
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
128
+"-feature\n"
129
"to create reusable Generators."
130
msgstr ""
131
132
133
msgstr "Удалить последовательность из проекта"
134
135
#: projectaction.py:2200
136
-#, python-format
137
+#, fuzzy
138
+msgid "Duplicate sequence <b>"
139
+msgstr "Создать видеоряд"
140
+
141
+#: projectaction.py:2200
142
msgid ""
143
-"Duplicate sequence <b>%s</b> was created\n"
144
-"from sequence <b>%s</b> ."
145
+"</b> was created\n"
146
+"from sequence <b>"
147
msgstr ""
148
149
#: projectaction.py:2498
150
151
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
152
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
153
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
154
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
155
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
156
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
157
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
158
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
159
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
160
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
161
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
162
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
163
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
164
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
165
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
166
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
167
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
168
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
169
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
170
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
171
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
172
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
173
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
174
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
175
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
176
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
177
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
178
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
179
#: tools/scripttool.py:624 singletracktransition.py:554
180
-#: singletracktransition.py:733 mediaplugin.py:735
181
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
182
msgid "Cancel"
183
msgstr "Отменить"
184
185
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
186
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
187
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
188
-#: tools/scripttool.py:920
189
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
190
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
191
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
192
+#: tools/scripttool.py:917
193
msgid "Render"
194
msgstr "Сборка"
195
196
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
197
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
198
msgid "Source Media File: "
199
msgstr "Исходный клип: "
200
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/tr/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/tr/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/tr/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/tr/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: \n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2021-04-04 15:07+0300\n"
8
"Last-Translator: \n"
9
"Language-Team: Türkçe\n"
10
11
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
12
"X-Generator: Poedit 2.4.2\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Otomatik Kaydetme Yok"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 dakika"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 dakika"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 dakika"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Bu uygulama için çok küçük bir ekran."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "Bu uygulama için Minimum ekran boyutları şunlardır 1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "Ekran boyutlarınız aşağıdaki gibidir "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr "XDG klasörleri başlangıç hatası nedeniyle uygulama başlatılamıyor."
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr ""
85
"Flowblade sürüm 2.6 (veya üstü) çalıştırmak için MLT sürüm 6.18 gerektirir"
86
87
-#: app.py:1059
88
+#: app.py:1031
89
msgid "Your MLT version is: "
90
msgstr "MLT sürümünüz şu şekildedir: "
91
92
-#: app.py:1059
93
+#: app.py:1031
94
msgid "Install MLT 6.18 or higher to run Flowblade."
95
msgstr "Flowblade çalıştırmak için MLT 6.18 veya daha yükseğini yükleyin."
96
97
-#: app.py:1133 projectaction.py:559 projectaction.py:761
98
+#: app.py:1105 projectaction.py:559 projectaction.py:761
99
msgid "Project has not been saved previously"
100
msgstr "Proje daha önce kaydedilmedi"
101
102
-#: app.py:1134 projectaction.py:560 projectaction.py:762
103
+#: app.py:1106 projectaction.py:560 projectaction.py:762
104
msgid "Save project with File -> Save As before closing."
105
msgstr "Projeyi dosyaya kaydedin -> kapatmadan önce Farklı Kaydet."
106
107
108
msgid "N/A"
109
msgstr "YOK"
110
111
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
112
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
113
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
114
msgid "Yes"
115
msgstr "Evet"
116
117
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
118
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
119
#: projectdatavaultgui.py:482
120
msgid "No"
121
msgstr "Hayır"
122
123
msgid ""
124
"You attempted to import %s Generator/s.\n"
125
"\n"
126
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
127
-"feature\n"
128
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
129
+"-feature\n"
130
"to create reusable Generators."
131
msgstr ""
132
133
134
msgstr "Sırayı projeden sil"
135
136
#: projectaction.py:2200
137
-#, python-format
138
+#, fuzzy
139
+msgid "Duplicate sequence <b>"
140
+msgstr "Sıra Oluştur"
141
+
142
+#: projectaction.py:2200
143
msgid ""
144
-"Duplicate sequence <b>%s</b> was created\n"
145
-"from sequence <b>%s</b> ."
146
+"</b> was created\n"
147
+"from sequence <b>"
148
msgstr ""
149
150
#: projectaction.py:2498
151
152
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
153
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
154
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
155
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
156
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
157
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
158
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
159
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
160
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
161
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
162
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
163
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
164
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
165
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
166
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
167
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
168
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
169
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
170
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
171
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
172
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
173
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
174
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
175
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
176
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
177
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
178
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
179
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
180
#: tools/scripttool.py:624 singletracktransition.py:554
181
-#: singletracktransition.py:733 mediaplugin.py:735
182
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
183
msgid "Cancel"
184
msgstr "İptal"
185
186
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
187
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
188
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
189
-#: tools/scripttool.py:920
190
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
191
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
192
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
193
+#: tools/scripttool.py:917
194
msgid "Render"
195
msgstr "İşleme"
196
197
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
198
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
199
msgid "Source Media File: "
200
msgstr "Kaynak Ortam Dosyası: "
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/uk/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/uk/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/uk/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/uk/LC_MESSAGES/flowblade.po
Changed
201
1
2
msgstr ""
3
"Project-Id-Version: \n"
4
"Report-Msgid-Bugs-To: \n"
5
-"POT-Creation-Date: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2021-01-15 21:19+0300\n"
8
"Last-Translator: Микита Бесчастний <micitabesh1992@rambler.ua>\n"
9
"Language-Team: \n"
10
11
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
12
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "Без автозбереження"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 мін"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 мін"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 мін"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "Занадто маленький екран для цього додатка."
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "Мінімальні розміри екрана для цієї програми - 1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "Ваші розміри екрана "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr ""
80
"Програму не можна запустити, оскільки сталася помилка ініціалізації папки "
81
"XDG."
82
83
-#: app.py:1058
84
+#: app.py:1030
85
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
86
msgstr "Flowblade версії 2.6 (або пізнішої) вимагає запуску MLT версії 6.18"
87
88
-#: app.py:1059
89
+#: app.py:1031
90
msgid "Your MLT version is: "
91
msgstr "Ваша версія MLT: "
92
93
-#: app.py:1059
94
+#: app.py:1031
95
msgid "Install MLT 6.18 or higher to run Flowblade."
96
msgstr "Встановіть MLT 6.18 або вище для запуску Flowblade."
97
98
-#: app.py:1133 projectaction.py:559 projectaction.py:761
99
+#: app.py:1105 projectaction.py:559 projectaction.py:761
100
msgid "Project has not been saved previously"
101
msgstr "Проект раніше не зберігався"
102
103
-#: app.py:1134 projectaction.py:560 projectaction.py:762
104
+#: app.py:1106 projectaction.py:560 projectaction.py:762
105
msgid "Save project with File -> Save As before closing."
106
msgstr "Перед закриттям збережіть проект через Файл -> Зберегти як."
107
108
109
msgid "N/A"
110
msgstr "N/A"
111
112
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
113
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
114
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
115
msgid "Yes"
116
msgstr "Так"
117
118
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
119
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
120
#: projectdatavaultgui.py:482
121
msgid "No"
122
msgstr "Ні"
123
124
msgid ""
125
"You attempted to import %s Generator/s.\n"
126
"\n"
127
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
128
-"feature\n"
129
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
130
+"-feature\n"
131
"to create reusable Generators."
132
msgstr ""
133
134
135
msgstr "Вилучити послідовність"
136
137
#: projectaction.py:2200
138
-#, python-format
139
+#, fuzzy
140
+msgid "Duplicate sequence <b>"
141
+msgstr "Створити послідовність"
142
+
143
+#: projectaction.py:2200
144
msgid ""
145
-"Duplicate sequence <b>%s</b> was created\n"
146
-"from sequence <b>%s</b> ."
147
+"</b> was created\n"
148
+"from sequence <b>"
149
msgstr ""
150
151
#: projectaction.py:2498
152
153
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
154
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
155
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
156
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
157
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
158
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
159
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
160
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
161
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
162
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
163
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
164
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
165
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
166
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
167
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
168
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
169
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
170
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
171
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
172
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
173
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
174
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
175
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
176
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
177
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
178
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
179
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
180
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
181
#: tools/scripttool.py:624 singletracktransition.py:554
182
-#: singletracktransition.py:733 mediaplugin.py:735
183
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
184
msgid "Cancel"
185
msgstr "Скасувати"
186
187
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
188
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
189
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
190
-#: tools/scripttool.py:920
191
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
192
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
193
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
194
+#: tools/scripttool.py:917
195
msgid "Render"
196
msgstr "Візуалізація"
197
198
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
199
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
200
msgid "Source Media File: "
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/zh_CN/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/zh_CN/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/zh_CN/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/zh_CN/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: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2017-04-15 18:47+0800\n"
8
"Last-Translator: wu <laowudebox@126.com>\n"
9
"Language-Team: Language LANGUAGE\n"
10
11
"Content-Type: text/plain; charset=UTF-8\n"
12
"Content-Transfer-Encoding: 8bit\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "无自动保存"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 min"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 min"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 min"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "对于这个应用,画面太小。"
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "对于这个应用,最小画面尺寸是1152 x 768.\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "你的画面尺寸是 "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr ""
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr ""
85
86
-#: app.py:1059
87
+#: app.py:1031
88
#, fuzzy
89
msgid "Your MLT version is: "
90
msgstr "MLT 版本 "
91
92
-#: app.py:1059
93
+#: app.py:1031
94
msgid "Install MLT 6.18 or higher to run Flowblade."
95
msgstr ""
96
97
-#: app.py:1133 projectaction.py:559 projectaction.py:761
98
+#: app.py:1105 projectaction.py:559 projectaction.py:761
99
msgid "Project has not been saved previously"
100
msgstr "项目还未被保存过"
101
102
-#: app.py:1134 projectaction.py:560 projectaction.py:762
103
+#: app.py:1106 projectaction.py:560 projectaction.py:762
104
msgid "Save project with File -> Save As before closing."
105
msgstr "在关闭之前通过菜单 文件 -> 另存为 保存项目"
106
107
108
msgid "N/A"
109
msgstr "N/A"
110
111
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
112
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
113
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
114
msgid "Yes"
115
msgstr "是(确定)"
116
117
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
118
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
119
#: projectdatavaultgui.py:482
120
msgid "No"
121
msgstr "不(同意)"
122
123
msgid ""
124
"You attempted to import %s Generator/s.\n"
125
"\n"
126
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
127
-"feature\n"
128
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
129
+"-feature\n"
130
"to create reusable Generators."
131
msgstr ""
132
133
134
msgstr "从项目中删除序列"
135
136
#: projectaction.py:2200
137
-#, python-format
138
+#, fuzzy
139
+msgid "Duplicate sequence <b>"
140
+msgstr "创建序列"
141
+
142
+#: projectaction.py:2200
143
msgid ""
144
-"Duplicate sequence <b>%s</b> was created\n"
145
-"from sequence <b>%s</b> ."
146
+"</b> was created\n"
147
+"from sequence <b>"
148
msgstr ""
149
150
#: projectaction.py:2498
151
152
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
153
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
154
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
155
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
156
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
157
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
158
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
159
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
160
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
161
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
162
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
163
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
164
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
165
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
166
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
167
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
168
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
169
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
170
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
171
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
172
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
173
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
174
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
175
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
176
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
177
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
178
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
179
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
180
#: tools/scripttool.py:624 singletracktransition.py:554
181
-#: singletracktransition.py:733 mediaplugin.py:735
182
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
183
msgid "Cancel"
184
msgstr "取消"
185
186
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
187
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
188
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
189
-#: tools/scripttool.py:920
190
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
191
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
192
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
193
+#: tools/scripttool.py:917
194
msgid "Render"
195
msgstr "渲染"
196
197
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
198
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
199
msgid "Source Media File: "
200
msgstr "源媒体文件: "
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/zh_TW/LC_MESSAGES/flowblade.mo -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/zh_TW/LC_MESSAGES/flowblade.mo
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/locale/zh_TW/LC_MESSAGES/flowblade.po -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/locale/zh_TW/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: 2025-03-24 15:26+0200\n"
6
+"POT-Creation-Date: 2025-06-06 10:43+0300\n"
7
"PO-Revision-Date: 2018-12-31 10:20+0800\n"
8
"Last-Translator: Steve Nian <sdnian@gmail.com>\n"
9
"Language-Team: Chinese (traditional)\n"
10
11
"Content-Type: text/plain; charset=UTF-8\n"
12
"Content-Transfer-Encoding: 8bit\n"
13
14
-#: app.py:240
15
+#: app.py:243
16
msgid "No Autosave"
17
msgstr "不要自動保存"
18
19
-#: app.py:240
20
+#: app.py:243
21
msgid "1 min"
22
msgstr "1 分鐘"
23
24
-#: app.py:240
25
+#: app.py:243
26
msgid "2 min"
27
msgstr "2 分鐘"
28
29
-#: app.py:240
30
+#: app.py:243
31
msgid "5 min"
32
msgstr "5 分鐘"
33
34
-#: app.py:945
35
+#: app.py:917
36
msgid "XDG Data folder location has changed!"
37
msgstr ""
38
39
-#: app.py:946
40
+#: app.py:918
41
msgid ""
42
"Location of <b>Default XDG Data Store</b> has changed because value of "
43
"<b>XDG Data Home</b> variable has changed.\n"
44
"\n"
45
msgstr ""
46
47
-#: app.py:947
48
+#: app.py:919
49
msgid ""
50
"Existing Projects with project data saved in <b>Default XDG Data Store</b> "
51
"will continue to work,\n"
52
msgstr ""
53
54
-#: app.py:948
55
+#: app.py:920
56
msgid ""
57
"but new projects will have data saved in the location specified by the new "
58
"value <b>XDG Data Home</b> variable ."
59
msgstr ""
60
61
-#: app.py:1033
62
+#: app.py:1005
63
msgid "Too small screen for this application."
64
msgstr "畫面太小無法執行此應用程式"
65
66
-#: app.py:1035
67
+#: app.py:1007
68
msgid "Minimum screen dimensions for this application are 1152 x 768.\n"
69
msgstr "此應用程式的最小螢幕解析度為 1152 x 768。\n"
70
71
-#: app.py:1036
72
+#: app.py:1008
73
msgid "Your screen dimensions are "
74
msgstr "你的螢幕解析度是 "
75
76
-#: app.py:1047
77
+#: app.py:1019
78
msgid "Cannot launch application because XDG folders init error."
79
msgstr ""
80
81
-#: app.py:1058
82
+#: app.py:1030
83
msgid "Flowblade version 2.6 (or later) requires MLT version 6.18 to run"
84
msgstr ""
85
86
-#: app.py:1059
87
+#: app.py:1031
88
#, fuzzy
89
msgid "Your MLT version is: "
90
msgstr "MLT 版本: "
91
92
-#: app.py:1059
93
+#: app.py:1031
94
msgid "Install MLT 6.18 or higher to run Flowblade."
95
msgstr ""
96
97
-#: app.py:1133 projectaction.py:559 projectaction.py:761
98
+#: app.py:1105 projectaction.py:559 projectaction.py:761
99
msgid "Project has not been saved previously"
100
msgstr "先前的專案尚未儲存"
101
102
-#: app.py:1134 projectaction.py:560 projectaction.py:762
103
+#: app.py:1106 projectaction.py:560 projectaction.py:762
104
msgid "Save project with File -> Save As before closing."
105
msgstr "在結束之前,從 檔案 -> 另存新檔 來儲存專案。"
106
107
108
msgid "N/A"
109
msgstr "N/A"
110
111
-#: projectaction.py:1414 guicomponents.py:1828 guicomponents.py:1863
112
+#: projectaction.py:1414 guicomponents.py:1814 guicomponents.py:1849
113
#: projectdatavaultgui.py:327 projectdatavaultgui.py:480
114
msgid "Yes"
115
msgstr "是"
116
117
-#: projectaction.py:1416 guicomponents.py:1830 guicomponents.py:1865
118
+#: projectaction.py:1416 guicomponents.py:1816 guicomponents.py:1851
119
#: projectdatavaultgui.py:482
120
msgid "No"
121
msgstr "否"
122
123
msgid ""
124
"You attempted to import %s Generator/s.\n"
125
"\n"
126
-"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> -"
127
-"feature\n"
128
+"Please use <b>Project/Add Generator.../Save/Load Generator Template</b> "
129
+"-feature\n"
130
"to create reusable Generators."
131
msgstr ""
132
133
134
msgstr "從專案刪除序列"
135
136
#: projectaction.py:2200
137
-#, python-format
138
+#, fuzzy
139
+msgid "Duplicate sequence <b>"
140
+msgstr "建立序列"
141
+
142
+#: projectaction.py:2200
143
msgid ""
144
-"Duplicate sequence <b>%s</b> was created\n"
145
-"from sequence <b>%s</b> ."
146
+"</b> was created\n"
147
+"from sequence <b>"
148
msgstr ""
149
150
#: projectaction.py:2498
151
152
#: projectaction.py:2501 dialogs.py:91 dialogs.py:155 dialogs.py:209
153
#: dialogs.py:248 dialogs.py:265 dialogs.py:293 dialogs.py:323 dialogs.py:342
154
#: dialogs.py:361 dialogs.py:377 dialogs.py:396 dialogs.py:410 dialogs.py:428
155
-#: dialogs.py:442 dialogs.py:481 dialogs.py:496 dialogs.py:527 dialogs.py:543
156
-#: dialogs.py:564 dialogs.py:586 dialogs.py:973 dialogs.py:1086 dialogs.py:1113
157
-#: dialogs.py:1170 dialogs.py:1196 dialogs.py:1221 dialogs.py:1242
158
-#: dialogs.py:1283 dialogs.py:1311 dialogs.py:1339 dialogs.py:1480
159
-#: dialogs.py:1520 dialogs.py:1534 dialogs.py:1548 dialogs.py:1608
160
-#: dialogs.py:1725 dialogs.py:1772 dialogs.py:1810 dialogs.py:1828
161
-#: dialogs.py:1879 propertyeditorbuilder.py:693 middlebar.py:474
162
-#: rendergui.py:48 rendergui.py:107 rendergui.py:121 rendergui.py:139
163
-#: rendergui.py:1176 rendergui.py:1441 preferenceswindow.py:45
164
+#: dialogs.py:442 dialogs.py:479 dialogs.py:494 dialogs.py:525 dialogs.py:541
165
+#: dialogs.py:562 dialogs.py:584 dialogs.py:971 dialogs.py:1084 dialogs.py:1111
166
+#: dialogs.py:1168 dialogs.py:1194 dialogs.py:1219 dialogs.py:1240
167
+#: dialogs.py:1281 dialogs.py:1309 dialogs.py:1337 dialogs.py:1478
168
+#: dialogs.py:1518 dialogs.py:1532 dialogs.py:1546 dialogs.py:1606
169
+#: dialogs.py:1723 dialogs.py:1770 dialogs.py:1808 dialogs.py:1826
170
+#: dialogs.py:1877 propertyeditorbuilder.py:696 middlebar.py:341
171
+#: rendergui.py:48 rendergui.py:103 rendergui.py:117 rendergui.py:135
172
+#: rendergui.py:1172 rendergui.py:1437 preferenceswindow.py:45
173
#: tools/batchrendering.py:1057 tools/batchrendering.py:1130
174
#: proxyediting.py:322 patternproducer.py:337 patternproducer.py:370
175
#: patternproducer.py:401 tools/gmic.py:378 tools/gmic.py:402 tools/gmic.py:544
176
#: dialogutils.py:57 dialogutils.py:129 dialogutils.py:189 exporting.py:445
177
-#: containeractions.py:423 containeractions.py:459 containerclip.py:176
178
+#: containeractions.py:422 containeractions.py:458 containerclip.py:176
179
#: tools/scripttool.py:320 tools/scripttool.py:356 tools/scripttool.py:604
180
#: tools/scripttool.py:624 singletracktransition.py:554
181
-#: singletracktransition.py:733 mediaplugin.py:735
182
+#: singletracktransition.py:733 mediaplugin.py:735 gtkbuilder.py:109
183
msgid "Cancel"
184
msgstr "取消"
185
186
-#: projectaction.py:2502 editorwindow.py:896 rendergui.py:181 rendergui.py:309
187
-#: rendergui.py:401 rendergui.py:513 tools/batchrendering.py:957
188
-#: tools/gmic.py:817 containeractions.py:415 editorlayout.py:230
189
-#: tools/scripttool.py:920
190
+#: projectaction.py:2502 editorwindow.py:879 rendergui.py:177 rendergui.py:305
191
+#: rendergui.py:397 rendergui.py:509 tools/batchrendering.py:957
192
+#: tools/gmic.py:807 containeractions.py:414 editorlayout.py:232
193
+#: tools/scripttool.py:917
194
msgid "Render"
195
msgstr "渲染"
196
197
-#: projectaction.py:2510 rendergui.py:183 rendergui.py:515
198
+#: projectaction.py:2510 rendergui.py:179 rendergui.py:511
199
msgid "Source Media File: "
200
msgstr "來源媒體檔案:"
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/medialog.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/medialog.py
Changed
41
1
2
widgets.star_check = star_check
3
4
star_label = Gtk.Image()
5
- # Aug-2019 - SvdB - BB
6
- star_label.set_from_file(respaths.IMAGE_PATH + guiutils.get_image_name("star", double_height=guiutils.double_icon_size()))
7
+ star_label.set_from_file(respaths.IMAGE_PATH + guiutils.get_image_name("star"))
8
9
star_not_active_check = Gtk.CheckButton()
10
star_not_active_check.set_active(True)
11
12
widgets.star_not_active_check = star_not_active_check
13
14
star_not_active_label = Gtk.Image()
15
- # Aug-2019 - SvdB - BB
16
- star_not_active_label.set_from_file(respaths.IMAGE_PATH + guiutils.get_image_name("star_not_active", double_height=guiutils.double_icon_size()))
17
+ star_not_active_label.set_from_file(respaths.IMAGE_PATH + guiutils.get_image_name("star_not_active"))
18
19
star_button = Gtk.Button()
20
- # Aug-2019 - SvdB - BB
21
star_button.set_image(guiutils.get_image("star"))
22
star_button.connect("clicked", lambda w: media_log_star_button_pressed())
23
24
no_star_button = Gtk.Button()
25
- # Aug-2019 - SvdB - BB
26
no_star_button.set_image(guiutils.get_image("star_not_active"))
27
no_star_button.connect("clicked", lambda w: media_log_no_star_button_pressed())
28
29
30
row1.pack_start(no_star_button, False, True, 0)
31
row1.pack_start(Gtk.Label(), True, True, 0)
32
33
- # Aug-2019 - SvdB - BB
34
- prefs = editorpersistance.prefs
35
- size_adj = 1
36
- if guiutils.double_icon_size():
37
- size_adj = 2
38
widgets.log_range = Gtk.Button()
39
widgets.log_range.set_image(guiutils.get_image("log_range"))
40
widgets.log_range.set_size_request(80, 30)
41
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/middlebar.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/middlebar.py
Changed
201
1
2
3
4
# Version 2.10 changed middlebar layout data and we need to create it for all first launches of that app version.
5
+# KILL in future should not be needed
6
def _init_buttons_data():
7
if editorpersistance.prefs.midbar_layout_buttons == None: # No data, first launch.
8
print("Creating midbar data for 2.10...")
9
10
editorpersistance.prefs.cbutton = True, True, True, True, True, True
11
+ editorpersistance.prefs.midbar_layout_buttons = copy.deepcopy(DEFAULT_BUTTONS_TIMECODE_LEFT)
12
13
- # appconsts.MIDBAR_TC_FREE is deprecated.appconsts.MIDBAR_COMPONENTS_CENTERED is mostly same.
14
- if editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_TC_FREE:
15
- editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_COMPONENTS_CENTERED
16
-
17
- if editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_TC_LEFT:
18
- editorpersistance.prefs.midbar_layout_buttons = copy.deepcopy(DEFAULT_BUTTONS_TIMECODE_LEFT)
19
- elif editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_TC_CENTER:
20
- editorpersistance.prefs.midbar_layout_buttons = copy.deepcopy(DEFAULT_BUTTONS_TIMECODE_CENTER)
21
- elif editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_COMPONENTS_CENTERED:
22
- editorpersistance.prefs.midbar_layout_buttons = copy.deepcopy(DEFAULT_BUTTONS_COMPONENTS_CENTERED)
23
-
24
- editorpersistance.prefs.midbar_layout = appconsts.MIDBAR_TC_LEFT
25
editorpersistance.save()
26
27
def _load_layout_data():
28
- global current_layout, current_buttons_list, current_active_flags
29
- current_layout = editorpersistance.prefs.midbar_layout
30
+ global current_buttons_list, current_active_flags
31
current_buttons_list = editorpersistance.prefs.midbar_layout_buttons
32
current_active_flags = editorpersistance.prefs.cbutton
33
34
35
original_active_flags = current_active_flags
36
37
def redo_layout(w):
38
- if editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_TC_LEFT:
39
- _do_TC_LEFT_layout(w)
40
- elif editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_TC_CENTER:
41
- _do_TC_MIDDLE_layout(w)
42
- elif editorpersistance.prefs.midbar_layout == appconsts.MIDBAR_COMPONENTS_CENTERED:
43
- _do_COMPONENTS_CENTERED_layout(w)
44
+ _do_TC_LEFT_layout(w)
45
46
def _show_buttons_TC_LEFT_layout(widget):
47
global w
48
49
_create_buttons(w)
50
fill_with_TC_LEFT_pattern(w.edit_buttons_row, w)
51
w.window.show_all()
52
-
53
-def _show_buttons_TC_MIDDLE_layout(widget):
54
- global w
55
- w = gui.editor_window
56
- if w == None:
57
- return
58
- if widget.get_active() == False:
59
- return
60
-
61
- _do_TC_MIDDLE_layout(w)
62
-
63
-def _do_TC_MIDDLE_layout(w):
64
- _clear_container(w.edit_buttons_row)
65
- _create_buttons(w)
66
- fill_with_TC_MIDDLE_pattern(w.edit_buttons_row, w)
67
- w.window.show_all()
68
-
69
-def _show_buttons_COMPONENTS_CENTERED_layout(widget):
70
- global w
71
- w = gui.editor_window
72
- if w == None:
73
- return
74
- if widget.get_active() == False:
75
- return
76
-
77
- _do_COMPONENTS_CENTERED_layout(w)
78
-
79
-def _do_COMPONENTS_CENTERED_layout(w):
80
-
81
- _clear_container(w.edit_buttons_row)
82
- _create_buttons(w)
83
- fill_with_COMPONENTS_CENTERED_pattern(w.edit_buttons_row, w)
84
- w.window.show_all()
85
86
def create_edit_buttons_row_buttons(editor_window, modes_pixbufs):
87
_init_buttons_data()
88
89
_create_buttons(editor_window)
90
91
def _create_buttons(editor_window):
92
-
93
- # Aug-2019 - SvdB - BB
94
- prefs = editorpersistance.prefs
95
- size_adj = 1
96
- if guiutils.double_icon_size():
97
- size_adj = 2
98
99
editor_window.big_TC = Gtk.Stack()
100
+ editor_window.big_TC.set_margin_top(5)
101
tc_disp = guicomponents.BigTCDisplay()
102
tc_entry = guicomponents.BigTCEntry()
103
tc_disp.widget.show()
104
105
editor_window.big_TC.set_visible_child_name("BigTCDisplay")
106
gui.big_tc = editor_window.big_TC
107
108
- #surface = guiutils.get_cairo_image("workflow")
109
- #editor_window.worflow_launch = guicomponents.PressLaunch(workflow.workflow_menu_launched, surface, w=22*size_adj, h=22*size_adj)
110
- #editor_window.worflow_launch.connect_launched_menu(workflow._workflow_menu)
111
-
112
if editorpersistance.prefs.tools_selection == appconsts.TOOL_SELECTOR_IS_MENU:
113
editor_window.tool_selector = create_tool_selector(editor_window)
114
editor_window.tline_cursor_manager.set_tool_selector_to_mode(editor_window.tool_selector)
115
116
no_decorations = False
117
118
# Zoom buttons
119
- editor_window.zoom_buttons = glassbuttons.GlassButtonsGroup(38*size_adj, 23*size_adj, 2*size_adj, 8*size_adj, 5*size_adj)
120
+ editor_window.zoom_buttons = glassbuttons.GlassButtonsGroup(38, 23, 2, 8, 5)
121
editor_window.zoom_buttons.add_button(guiutils.get_cairo_image("zoom_in"), updater.zoom_in)
122
- editor_window.zoom_buttons.add_button(guiutils.get_cairo_image("zoom_out"), updater.zoom_out, 8*size_adj)
123
- editor_window.zoom_buttons.add_button(guiutils.get_cairo_image("zoom_length"), updater.zoom_project_length, 6*size_adj - 1)
124
+ editor_window.zoom_buttons.add_button(guiutils.get_cairo_image("zoom_out"), updater.zoom_out, 8)
125
+ editor_window.zoom_buttons.add_button(guiutils.get_cairo_image("zoom_length"), updater.zoom_project_length, 6 - 1)
126
tooltips = _("Zoom In - Mouse Middle Scroll"), _("Zoom Out - Mouse Middle Scroll"), _("Zoom Length - Mouse Middle Click")
127
tooltip_runner = glassbuttons.TooltipRunner(editor_window.zoom_buttons, tooltips)
128
editor_window.zoom_buttons.no_decorations = no_decorations
129
editor_window.zoom_buttons.show_prelight_icons()
130
131
# Cut and dissolve
132
- editor_window.edit_buttons = glassbuttons.GlassButtonsGroup(32*size_adj, 23*size_adj, 2*size_adj, 5*size_adj, 5*size_adj)
133
+ editor_window.edit_buttons = glassbuttons.GlassButtonsGroup(32, 23, 2, 5, 5)
134
editor_window.edit_buttons.add_button(guiutils.get_cairo_image("dissolve"), singletracktransition.add_transition_pressed)
135
editor_window.edit_buttons.add_button(guiutils.get_cairo_image("cut"), tlineaction.cut_pressed)
136
tooltips = _("Add Rendered Transition - 2 clips selected"), _("Cut Active Tracks - X\nCut All Tracks - Shift + X")
137
138
editor_window.edit_buttons.show_prelight_icons()
139
140
# Delete buttons
141
- editor_window.edit_buttons_3 = glassbuttons.GlassButtonsGroup(46*size_adj, 23*size_adj, 2*size_adj, 3*size_adj, 5*size_adj)
142
- editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("splice_out"), tlineaction.splice_out_button_pressed, 10*size_adj)
143
- editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("lift"), tlineaction.lift_button_pressed, 9*size_adj)
144
- editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("ripple_delete"), tlineaction.ripple_delete_button_pressed, 4*size_adj)
145
- editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("delete_range"), tlineaction.delete_range_button_pressed, 4*size_adj)
146
+ editor_window.edit_buttons_3 = glassbuttons.GlassButtonsGroup(46, 23, 2, 3, 5)
147
+ editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("splice_out"), tlineaction.splice_out_button_pressed, 10)
148
+ editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("lift"), tlineaction.lift_button_pressed, 9)
149
+ editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("ripple_delete"), tlineaction.ripple_delete_button_pressed, 4)
150
+ editor_window.edit_buttons_3.add_button(guiutils.get_cairo_image("delete_range"), tlineaction.delete_range_button_pressed, 4)
151
tooltips = _("Splice Out - Delete"), _("Lift - Control + Delete"), _("Ripple Delete"), _("Range Delete")
152
tooltip_runner = glassbuttons.TooltipRunner(editor_window.edit_buttons_3, tooltips)
153
editor_window.edit_buttons_3.no_decorations = no_decorations
154
editor_window.edit_buttons_3.show_prelight_icons()
155
156
# Resync and split audio
157
- editor_window.edit_buttons_2 = glassbuttons.GlassButtonsGroup(44*size_adj, 23*size_adj, 2*size_adj, 3*size_adj, 5*size_adj)
158
+ editor_window.edit_buttons_2 = glassbuttons.GlassButtonsGroup(44, 23, 2, 3, 5)
159
editor_window.edit_buttons_2.add_button(guiutils.get_cairo_image("split_audio"), tlineaction.split_audio_synched_button_pressed)
160
editor_window.edit_buttons_2.add_button(guiutils.get_cairo_image("set_track_sync"), tlineaction.set_track_sync_button_pressed)
161
editor_window.edit_buttons_2.add_button(guiutils.get_cairo_image("resync_track"), tlineaction.resync_track_button_pressed)
162
editor_window.edit_buttons_2.add_button(guiutils.get_cairo_image("resync"), tlineaction.resync_button_pressed)
163
- tooltips = _("Split Audio Synched"), _("Set Sync for All Clips on Track Containing Selected Clip/s"), _("Resync Track Containing Selected Clip/s"), _("Resync Selected Clips")
164
+ tooltips = _("Split Audio Synched"), _("If <b>single</b> or <b>multi</b> selection set Sync for all Clips on Track Containing Selected Clip/s.\n\nIf <b>box selection</b> set Sync for all selected Clips to first Clip on center most Track."), _("Resync Track Containing Selected Clip/s"), _("Resync Selected Clips")
165
tooltip_runner = glassbuttons.TooltipRunner(editor_window.edit_buttons_2, tooltips)
166
editor_window.edit_buttons_2.no_decorations = no_decorations
167
editor_window.edit_buttons_2.show_prelight_icons()
168
169
- editor_window.monitor_insert_buttons = glassbuttons.GlassButtonsGroup(44*size_adj, 23*size_adj, 2*size_adj, 3*size_adj, 5*size_adj)
170
+ editor_window.monitor_insert_buttons = glassbuttons.GlassButtonsGroup(44, 23, 2, 3, 5)
171
editor_window.monitor_insert_buttons.add_button(guiutils.get_cairo_image("overwrite_range"), tlineaction.range_overwrite_pressed)
172
editor_window.monitor_insert_buttons.add_button(guiutils.get_cairo_image("overwrite_clip"), tlineaction.three_point_overwrite_pressed)
173
editor_window.monitor_insert_buttons.add_button(guiutils.get_cairo_image("insert_clip"), tlineaction.insert_button_pressed)
174
175
editor_window.monitor_insert_buttons.no_decorations = no_decorations
176
editor_window.monitor_insert_buttons.show_prelight_icons()
177
178
- editor_window.undo_redo = glassbuttons.GlassButtonsGroup(28*size_adj, 23*size_adj, 2*size_adj, 2*size_adj, 7*size_adj)
179
+ editor_window.undo_redo = glassbuttons.GlassButtonsGroup(28, 23, 2, 2, 7)
180
editor_window.undo_redo.add_button(guiutils.get_cairo_image("undo"), undo.do_undo_and_repaint)
181
editor_window.undo_redo.add_button(guiutils.get_cairo_image("redo"), undo.do_redo_and_repaint)
182
tooltips = _("Undo - Ctrl + Z"), _("Redo - Ctrl + Y")
183
184
editor_window.undo_redo.no_decorations = no_decorations
185
editor_window.undo_redo.show_prelight_icons()
186
187
- editor_window.tools_buttons = glassbuttons.GlassButtonsGroup(30*size_adj, 23*size_adj, 2*size_adj, 14*size_adj, 7*size_adj)
188
+ editor_window.tools_buttons = glassbuttons.GlassButtonsGroup(30, 23, 2, 14, 7)
189
editor_window.tools_buttons.add_button(guiutils.get_cairo_image("open_mixer"), audiomonitoring.show_audio_monitor)
190
editor_window.tools_buttons.add_button(guiutils.get_cairo_image("open_titler"), titler.show_titler)
191
editor_window.tools_buttons.add_button(guiutils.get_cairo_image("open_gmic"), gmic.launch_gmic)
192
193
tooltip_runner = glassbuttons.TooltipRunner(editor_window.tools_buttons, tooltips)
194
editor_window.tools_buttons.no_decorations = True
195
editor_window.tools_buttons.show_prelight_icons()
196
-
197
+
198
if editorstate.audio_monitoring_available == False:
199
editor_window.tools_buttons.sensitive0 = False
200
editor_window.tools_buttons.widget.set_tooltip_text(_("Audio Mixer(not available)\nTitler"))
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/mltfilters.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/mltfilters.py
Changed
10
1
2
3
class FilterInfo:
4
"""
5
- Info of a filter (mlt.Service) that is is available to the user.
6
+ Info of a filter (mlt.Service) that is available to the user.
7
Constructor input is a dom node object.
8
This is used to create FilterObject objects.
9
"""
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/monitorwidget.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/monitorwidget.py
Changed
54
1
2
MONITOR_INDICATOR_COLOR_MATCH = utils.get_cairo_color_tuple_255_rgb(21, 71, 105)
3
4
FRAME_MATCH_VIEW_COLOR = (0.3, 0.3, 0.3)
5
+FILL_COLOR = (0.15, 0.15, 0.15)
6
7
# Continuous match frame update
8
CONTINUOS_UPDATE_PAUSE = 0.2
9
10
11
if self.match_frame_surface == None:
12
# Draw black
13
- cr.set_source_rgb(0.0, 0.0, 0.0)
14
+ cr.set_source_rgb(*FILL_COLOR)
15
cr.rectangle(0, 0, w, h)
16
cr.fill()
17
else:
18
19
20
if self.match_frame_surface == None:
21
# Draw black
22
- cr.set_source_rgb(0.0, 0.0, 0.0)
23
+ cr.set_source_rgb(*FILL_COLOR)
24
cr.rectangle(0, 0, w, h)
25
cr.fill()
26
else:
27
28
x, y, w, h = allocation
29
30
# Draw bg
31
- cr.set_source_rgb(0.0, 0.0, 0.0)
32
+ cr.set_source_rgb(*FILL_COLOR)
33
if self.view == FRAME_MATCH_VIEW:
34
cr.set_source_rgb(*FRAME_MATCH_VIEW_COLOR)
35
cr.rectangle(0, 0, w, h)
36
37
x, y, w, h = allocation
38
39
# Draw bg
40
- cr.set_source_rgb(0.0, 0.0, 0.0)
41
+ cr.set_source_rgb(*FILL_COLOR)
42
if self.view == FRAME_MATCH_VIEW:
43
cr.set_source_rgb(*FRAME_MATCH_VIEW_COLOR)
44
cr.rectangle(0, 0, w, h)
45
46
x, y, w, h = allocation
47
48
# Draw bg
49
- cr.set_source_rgb(0.0, 0.0, 0.0)
50
+ cr.set_source_rgb(*FILL_COLOR)
51
cr.rectangle(0, 0, w, h)
52
cr.fill()
53
54
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/panels.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/panels.py
Changed
65
1
2
3
4
def get_media_files_panel(media_list_view, add_cb, del_cb, col_changed_cb, hamburger_launch_pressed, filtering_cb):
5
- # Aug-2019 - SvdB - BB
6
- size_adj = 1
7
- prefs = editorpersistance.prefs
8
- if guiutils.double_icon_size():
9
- size_adj = 2
10
+
11
hamburger_launcher = guicomponents.HamburgerPressLaunch(hamburger_launch_pressed)
12
hamburger_launcher.do_popover_callback = True
13
guiutils.set_margins(hamburger_launcher.widget, 2, 0, 4, 12)
14
15
columns_img = guiutils.get_cairo_image("columns")
16
- columns_launcher = guicomponents.PressLaunchPopover(col_changed_cb, columns_img, w=22*size_adj, h=22*size_adj)
17
+ columns_launcher = guicomponents.PressLaunchPopover(col_changed_cb, columns_img, w=22, h=22)
18
columns_launcher.surface_y = 6
19
columns_launcher.widget.set_tooltip_text(_("Number of Media File columns."))
20
21
22
pattern_pixbuf = guiutils.get_cairo_image("show_pattern_producers")
23
unused_pixbuf = guiutils.get_cairo_image("show_unused_files")
24
25
- files_filter_launcher = guicomponents.ImageMenuLaunchPopover(filtering_cb, all_pixbuf, video_pixbuf, audio_pixbuf, graphics_pixbuf, imgseq_pixbuf, pattern_pixbuf, unused_pixbuf, 24*size_adj, 22*size_adj)
26
+ files_filter_launcher = guicomponents.ImageMenuLaunchPopover(filtering_cb, all_pixbuf, video_pixbuf, audio_pixbuf, graphics_pixbuf, imgseq_pixbuf, pattern_pixbuf, unused_pixbuf, 24, 22)
27
files_filter_launcher.surface_x = 3
28
files_filter_launcher.surface_y = 4
29
files_filter_launcher.widget.set_tooltip_text(_("Visible Media File types."))
30
31
hamburger = guicomponents.HamburgerPressLaunch(callback)
32
hamburger.do_popover_callback = True
33
34
- return get_named_frame_with_hamburger(_("Bins"), panel, 0, 0, 0, _("A <b>Bin</b> is a named collection of media."), hamburger.widget)
35
+ return get_named_frame_with_hamburger(_("Bins"), panel, 0, 0, 0, 4, _("A <b>Bin</b> is a named collection of media."), hamburger.widget)
36
37
def get_sequences_panel(sequence_list_view, callback):
38
panel = Gtk.VBox()
39
40
41
hamburger = guicomponents.HamburgerPressLaunch(callback)
42
43
- return get_named_frame_with_hamburger(_("Sequences"), panel, 0, 0, 0, _("A <b>Sequence</b> is the full contents of the timeline creating a program, a movie."), hamburger.widget)
44
+ return get_named_frame_with_hamburger(_("Sequences"), panel, 0, 0, 0, 4, _("A <b>Sequence</b> is the full contents of the timeline creating a program, a movie."), hamburger.widget)
45
46
def _set_sensive_widgets(sensitive, list):
47
for widget in list:
48
49
50
return frame
51
52
-def get_named_frame_with_hamburger(name, widget, left_padding=12, right_padding=6, right_out_padding=4, tooltip_txt=None, hamburger_widget=None):
53
+def get_named_frame_with_hamburger(name, widget, left_padding=12, right_padding=6, right_out_padding=4, name_bottom_badding=2, tooltip_txt=None, hamburger_widget=None):
54
"""
55
Gnome style named panel
56
"""
57
58
label = guiutils.bold_label(name)
59
label.set_justify(Gtk.Justification.LEFT)
60
label.set_margin_start(4)
61
+ label.set_margin_bottom(name_bottom_badding)
62
label_box = Gtk.HBox()
63
label_box.pack_start(label, False, False, 0)
64
label_box.pack_start(Gtk.Label(), True, True, 0)
65
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/persistancecompat.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/persistancecompat.py
Changed
8
1
2
def FIX_MISSING_TRACK_ATTRS(track):
3
if(not hasattr(track, "parent_track")):
4
track.parent_track = None
5
+
6
+ if(not hasattr(track, "info_label")):
7
+ track.info_label = ""
8
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/preferenceswindow.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/preferenceswindow.py
Changed
91
1
2
auto_center_on_stop = Gtk.CheckButton()
3
auto_center_on_stop.set_active(prefs.auto_center_on_play_stop)
4
5
- # Jul-2016 - SvdB - For play_pause button
6
- play_pause_button = Gtk.CheckButton()
7
- # The following test is to make sure play_pause can be used for the initial value. If not found, then leave uninitialized
8
- if hasattr(prefs, 'play_pause'):
9
- play_pause_button.set_active(prefs.play_pause)
10
-
11
- timeline_start_end_button = Gtk.CheckButton()
12
- if hasattr(prefs, 'timeline_start_end'):
13
- timeline_start_end_button.set_active(prefs.timeline_start_end)
14
-
15
auto_center_on_updown = Gtk.CheckButton()
16
auto_center_on_updown.set_active(prefs.center_on_arrow_move)
17
18
follow_move_range = Gtk.CheckButton()
19
follow_move_range.set_active(prefs.playback_follow_move_tline_range)
20
21
- # Apr-2017 - SvdB - For FF/Rev speed options
22
if hasattr(prefs, 'ffwd_rev_shift'):
23
spin_adj = Gtk.Adjustment(value=prefs.ffwd_rev_shift, lower=1, upper=10, step_increment=1)
24
else:
25
26
27
row2 = _row(guiutils.get_checkbox_row_box(auto_center_on_stop, Gtk.Label(label=_("Center Current Frame on Playback Stop"))))
28
row13 = _row(guiutils.get_checkbox_row_box(auto_center_on_updown, Gtk.Label(label=_("Center Current Frame after Up/Down Arrow"))))
29
- row10 = _row(guiutils.get_checkbox_row_box(play_pause_button, Gtk.Label(label=_("Enable single Play/Pause button"))))
30
- row11 = _row(guiutils.get_checkbox_row_box(timeline_start_end_button, Gtk.Label(label=_("Enable To Start and To End buttons"))))
31
row14 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Fast Forward / Reverse Speed for Shift Key:")), ffwd_rev_shift_spin, PREFERENCES_LEFT))
32
row14.set_tooltip_text(_("Speed of Forward / Reverse will be multiplied by this value if Shift Key is held (Only using KEYS).\n" \
33
"Enabling multiple modifier keys will multiply the set values.\n" \
34
35
vbox.pack_start(row18, False, False, 0)
36
vbox.pack_start(row2, False, False, 0)
37
vbox.pack_start(row13, False, False, 0)
38
- vbox.pack_start(row10, False, False, 0)
39
- vbox.pack_start(row11, False, False, 0)
40
vbox.pack_start(row14, False, False, 0)
41
vbox.pack_start(row16, False, False, 0)
42
43
44
45
guiutils.set_margins(vbox, 12, 0, 12, 12)
46
47
- return vbox, (auto_center_on_stop,
48
- play_pause_button, timeline_start_end_button, auto_center_on_updown,
49
- ffwd_rev_shift_spin, ffwd_rev_caps_spin, follow_move_range, loop_clips)
50
+ return vbox, (auto_center_on_stop, auto_center_on_updown, ffwd_rev_shift_spin,
51
+ ffwd_rev_caps_spin, follow_move_range, loop_clips)
52
53
def _view_prefs_panel():
54
prefs = editorpersistance.prefs
55
56
force_language_combo.set_active(active_index)
57
force_language_combo.lang_codes = lang_list
58
59
- display_splash_check = Gtk.CheckButton()
60
- display_splash_check.set_active(prefs.display_splash_screen)
61
-
62
- # Feb-2017 - SvdB - For full file names
63
show_full_file_names = Gtk.CheckButton()
64
show_full_file_names.set_active(prefs.show_full_file_names)
65
66
67
68
row00 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Application window mode:")), window_mode_combo, PREFERENCES_LEFT))
69
row9 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Force Language:")), force_language_combo, PREFERENCES_LEFT))
70
- row1 = _row(guiutils.get_checkbox_row_box(display_splash_check, Gtk.Label(label=_("Display splash screen"))))
71
row6 = _row(guiutils.get_checkbox_row_box(show_full_file_names, Gtk.Label(label=_("Show Full File names"))))
72
row7 = _row(guiutils.get_two_column_box(Gtk.Label(label=_("Tracks Heights:")), tracks_combo, PREFERENCES_LEFT))
73
74
75
vbox.pack_start(row00, False, False, 0)
76
vbox.pack_start(row10, False, False, 0)
77
vbox.pack_start(row9, False, False, 0)
78
- vbox.pack_start(row1, False, False, 0)
79
vbox.pack_start(row6, False, False, 0)
80
vbox.pack_start(row7, False, False, 0)
81
vbox.pack_start(row14, False, False, 0)
82
83
84
guiutils.set_margins(vbox, 12, 0, 12, 12)
85
86
- return vbox, (force_language_combo, display_splash_check, window_mode_combo, show_full_file_names,
87
+ return vbox, (force_language_combo, window_mode_combo, show_full_file_names,
88
tracks_combo, project_panel_width_spin, edit_panel_width_spin, media_panel_width_spin,
89
layout_monitor, filter_select_width_spin)
90
91
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/projectaction.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/projectaction.py
Changed
10
1
2
undo.clear_undos()
3
4
primary_txt = _("Duplicate Sequence created")
5
- secondary_txt = _("Duplicate sequence <b>%s</b> was created\nfrom sequence <b>%s</b> .")%(name,import_seq.name)
6
+ secondary_txt = _("Duplicate sequence <b>") + name + _("</b> was created\nfrom sequence <b>") + import_seq.name + ("</b>.") #%(name,import_seq.name)
7
8
dialogutils.info_message(primary_txt, secondary_txt, gui.editor_window.window)
9
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/projectinfogui.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/projectinfogui.py
Changed
18
1
2
desc_row.set_margin_start(4)
3
4
project_info_vbox = Gtk.HBox()
5
- dash_label = Gtk.Label()
6
- dash_label.set_text("-")
7
- dash_label.modify_font(Pango.FontDescription(font_desc))
8
- dash_label.set_sensitive(False)
9
- project_info_vbox.pack_start(dash_label, False, False, 0)
10
+ #dash_label = Gtk.Label()
11
+ #dash_label.set_text("-")
12
+ #dash_label.modify_font(Pango.FontDescription(font_desc))
13
+ #dash_label.set_sensitive(False)
14
+ #project_info_vbox.pack_start(dash_label, False, False, 0)
15
project_info_vbox.pack_start(desc_row, False, False, 0)
16
guiutils.set_margins(project_info_vbox, 2,0,4,0)
17
18
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/propertyedit.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/propertyedit.py
Changed
201
1
2
3
from gi.repository import Gtk
4
5
+import animatedvalue
6
import appconsts
7
from editorstate import current_sequence
8
import mlttransitions
9
10
return editable_properties
11
12
def get_non_mlt_editable_properties(clip, filter_object, filter_index, track, clip_index):
13
+ # Creates editable properties that do not write their values to MLT properties.
14
+ # Sometimes these are just simply not used, sometiemes data is saved in these
15
+ # encodes info that gets written into MLT properties.
16
editable_properties =
17
for i in range(0, len(filter_object.non_mlt_properties)):
18
prop = filter_object.non_mlt_propertiesi
19
20
editable_properties.append(ep)
21
22
return editable_properties
23
-
24
+
25
# -------------------------------------------- property wrappers objs
26
class AbstractProperty:
27
"""
28
29
for kf in keyframes:
30
frame, rect, opac, kf_type = kf
31
32
- if kf_type == appconsts.KEYFRAME_LINEAR:
33
- eq_str = appconsts.KEYFRAME_LINEAR_EQUALS_STR
34
- elif kf_type == appconsts.KEYFRAME_SMOOTH:
35
- eq_str = appconsts.KEYFRAME_SMOOTH_EQUALS_STR
36
- else:
37
- eq_str = appconsts.KEYFRAME_DISCRETE_EQUALS_STR
38
+ eq_str = animatedvalue.TYPE_TO_EQ_STRINGkf_type
39
40
val_str += str(int(frame)) + eq_str # frame
41
val_str += str(int(rect0)) + "/" + str(int(rect1)) + ":" # pos
42
43
for kf in keyframes:
44
frame, rect, opac, kf_type = kf
45
46
- if kf_type == appconsts.KEYFRAME_LINEAR:
47
- eq_str = appconsts.KEYFRAME_LINEAR_EQUALS_STR
48
- elif kf_type == appconsts.KEYFRAME_SMOOTH:
49
- eq_str = appconsts.KEYFRAME_SMOOTH_EQUALS_STR
50
- else:
51
- eq_str = appconsts.KEYFRAME_DISCRETE_EQUALS_STR
52
+ eq_str = animatedvalue.TYPE_TO_EQ_STRINGkf_type
53
54
val_str += str(int(frame)) + eq_str # frame
55
val_str += str(int(rect0)) + " " + str(int(rect1)) + " " # pos
56
57
58
def update_clip_index(self):
59
self.clip_index = self.track.clips.index(self.clip)
60
+
61
+# dummytypes as a propertyedit.EditableProperty object.
62
+class GradientTintExtraEditorProperty:
63
+
64
+ def __init__(self, create_params, editable_properties, track, clip_index):
65
+
66
+ # Pick up the editable properties that actually have their values being written to on user edits
67
+ # and affect to filter output.
68
+ # Relevant filter definition in filters.xml
69
+ # <property name="2" args="editor=slider range_in=0,100 displayname=Start!Opacity">0.5</property>
70
+ # <property name="4" args="editor=slider range_in=0,100 displayname=End!Opacity">0.5</property>
71
+ # <property name="5" args="editor=slider range_in=0,100 displayname=Start!X">0.5</property>
72
+ # <property name="6" args="editor=slider range_in=0,100 displayname=Start!Y">0.8</property>
73
+ self.start_x = ep for ep in editable_properties if ep.name == "5"0
74
+ self.start_y = ep for ep in editable_properties if ep.name == "6"0
75
+ self.end_x = ep for ep in editable_properties if ep.name == "7"0
76
+ self.end_y = ep for ep in editable_properties if ep.name == "8"0
77
+
78
+
79
+ # Get create data
80
+ clip, filter_index, p, i, args_str = create_params
81
+ p_name, p_value, p_type = p
82
+
83
+ # We need a lot stuff to ba able to edit this with keyframe editor as
84
+ # propertyedit.EditableProperty.
85
+ self.clip = clip
86
+ self.value = "this is set below"
87
+ self.is_compositor_filter = False
88
+ self.track = track
89
+ self.clip_index = clip_index
90
+ self.get_input_range_adjustment = lambda : Gtk.Adjustment(value=float(100), lower=float(0), upper=float(100), step_increment=float(1))
91
+ self.get_display_name = lambda : "Opacity"
92
+
93
+ # We also need these to be able to edit this in keyframeeditcanvas.RotatingEditCanvas
94
+ self.get_pixel_aspect_ratio = lambda : (float(current_sequence().profile.sample_aspect_num()) / current_sequence().profile.sample_aspect_den())
95
+ self.get_in_value = lambda out_value : out_value # hard coded for opacity 100 -> 100 range
96
+
97
+ # This value is parsed to keyframes by keyframecanvas.GradientEditCanvas
98
+ # using method propertyparse.gradient_tint_geom_keyframes_value_string_to_geom_kf_array(),
99
+ # and is only used to the initialize the editor. The original design was that editor is given
100
+ # property value strings, and they then call keyframe_parser() method that is set when editor is
101
+ # build for particular type of property string. Here we need to write out keyframes
102
+ # to multiple different properties, so this "dummy" editable property is created to act as the
103
+ # property being edited, and it converts editor output to property values of the properties
104
+ # in method write_out_keyframes() below.
105
+ self.value = self.get_value_keyframes_str()
106
+
107
+ def get_clip_length(self):
108
+ return self.clip.clip_out - self.clip.clip_in + 1
109
+
110
+ def get_clip_tline_pos(self):
111
+ return self.track.clip_start(self.clip_index)
112
+
113
+ def get_value_keyframes_str(self):
114
+ # Create input string for keyframecanvas.RotatingEditCanvas editor.
115
+ start_x_tokens = self.start_x.value.split(";")
116
+ start_y_tokens = self.start_y.value.split(";")
117
+ end_x_tokens = self.end_x.value.split(";")
118
+ end_y_tokens = self.end_y.value.split(";")
119
+
120
+ value = ""
121
+ for i in range(0, len(start_x_tokens)): # these all have the asme amount of keyframes always
122
+ start_x_token = start_x_tokens0
123
+ start_y_token = start_y_tokens0
124
+ end_x_token = end_x_tokens0
125
+ end_y_token = end_y_tokens0
126
+
127
+ frame, start_x, kf_type = propertyparse.get_token_frame_value_type(start_x_token)
128
+ frame, start_y, kf_type = propertyparse.get_token_frame_value_type(start_y_token)
129
+ frame, end_x, kf_type = propertyparse.get_token_frame_value_type(end_x_token)
130
+ frame, end_y, kf_type = propertyparse.get_token_frame_value_type(end_y_token)
131
+
132
+ eq_str = propertyparse._get_eq_str(kf_type)
133
+
134
+ frame_str = str(frame) + eq_str + str(start_x) + ":" + str(start_y) + ":" + str(end_x) + ":" + str(end_y)
135
+ value += frame_str + ";"
136
+
137
+ # This value is parsed as keyframes in propertyparse.gradient_tint_geom_keyframes_value_string_to_geom_kf_array()
138
+ value = value.strip(";")
139
+
140
+ return value
141
+
142
+ def get_input_range_adjustment(self):
143
+ # Returns DUMMY noop Adjustment that needs to exist because AbstrackKeyframeEditor assumes a slider always exists,
144
+ # but this not the case for this editor/property pair.
145
+
146
+ return Gtk.Adjustment(value=float(1.0), lower=float(0.0), upper=float(1.0), step_increment=float(0.01)) # Value set later to first kf value
147
+
148
+ def write_out_keyframes(self, keyframes):
149
+
150
+ start_x_val = ""
151
+ start_y_val = ""
152
+ end_x_val = ""
153
+ end_y_val = ""
154
+
155
+ profile_width = float(current_sequence().profile.width())
156
+ profile_height = float(current_sequence().profile.height())
157
+
158
+ for kf in keyframes:
159
+
160
+ frame, values, kf_type = kf
161
+ start_x, start_y, end_x, end_y = values
162
+
163
+ eq_str = propertyparse._get_eq_str(kf_type)
164
+
165
+ # Editor keyframes are in pixel coords, filter wants normalised coods.
166
+ start_x_tr = start_x / profile_width
167
+ start_y_tr = start_y / profile_height
168
+ end_x_tr = end_x / profile_width
169
+ end_y_tr = end_y / profile_height
170
+
171
+ # Build kf value strings
172
+ start_x_val += str(frame) + eq_str + str(start_x_tr) + ";"
173
+ start_y_val += str(frame) + eq_str + str(start_y_tr) + ";"
174
+ end_x_val += str(frame) + eq_str + str(end_x_tr) + ";"
175
+ end_y_val += str(frame) + eq_str + str(end_y_tr) + ";"
176
+
177
+ start_x_val.strip(";")
178
+ start_y_val.strip(";")
179
+ end_x_val.strip(";")
180
+ end_y_val.strip(";")
181
+
182
+ self.start_x.write_value(start_x_val)
183
+ self.start_y.write_value(start_y_val)
184
+ self.end_x.write_value(end_x_val)
185
+ self.end_y.write_value(end_y_val)
186
+
187
+ def write_value(self, str_value):
188
+ pass
189
+
190
+ def write_mlt_property_str_value(self, str_value):
191
+ pass
192
+
193
+ def write_filter_object_property(self, str_value):
194
+ pass
195
+
196
+ def update_clip_index(self):
197
+ self.clip_index = self.track.clips.index(self.clip)
198
+
199
+
200
+# dummytypes as a propertyedit.EditableProperty object.
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/propertyeditorbuilder.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/propertyeditorbuilder.py
Changed
86
1
2
TEXT_ENTRY = "text_entry" # Text editor
3
ROTOMASK = "rotomask" # Displays info and launches rotomask window
4
NO_KF_RECT = "no_keyframes_rect" # keyframeeditor.GeometryNoKeyframes, no keyframes here, machinery for creating this type GUI editors just assumes keyframes
5
+GRADIENT_TINT = "gradient_tint_editor" # editor for Gradient Tint, "frei0r.cairogradient" MLT filter
6
+CROP_EDITOR = "crop_editor" # editor for Crop filter
7
+ALPHA_SHAPE_EDITOR = "alpha_shape_editor" # editor for Alpha Shape filter
8
NO_EDITOR = "no_editor" # No editor displayed for property
9
10
COMPOSITE_EDITOR_BUILDER = "composite_properties" # Creates a single row editor for multiple properties of composite transition
11
12
vbox.kf_edit_geom_editor = kf_edit_geom_editor
13
return vbox
14
15
+def _create_gradient_tint_editor(filt, editable_properties, editor_name, track, clip_index):
16
+ clip, filter_index, prop, property_index, args_str = editable_properties0.used_create_params
17
+
18
+ kf_editable_property = propertyedit.GradientTintExtraEditorProperty(
19
+ editable_properties0.used_create_params,
20
+ editable_properties,
21
+ track,
22
+ clip_index)
23
+
24
+ kf_edit_geom_editor = keyframeeditor.GradientTintGeometryEditor(kf_editable_property)
25
+ kf_edit_geom_editor.set_margin_bottom(4)
26
+
27
+ vbox = Gtk.VBox(False, 4)
28
+ vbox.pack_start(kf_edit_geom_editor, False, False, 0)
29
+ vbox.no_separator = True
30
+ vbox.kf_edit_geom_editor = kf_edit_geom_editor
31
+ return vbox
32
+
33
+def _create_crop_editor(filt, editable_properties, editor_name, track, clip_index):
34
+ clip, filter_index, prop, property_index, args_str = editable_properties0.used_create_params
35
+
36
+ kf_editable_property = propertyedit.CropEditorProperty(
37
+ editable_properties0.used_create_params,
38
+ editable_properties,
39
+ track,
40
+ clip_index)
41
+
42
+ kf_edit_geom_editor = keyframeeditor.CropGeometryEditor(kf_editable_property)
43
+ kf_edit_geom_editor.set_margin_bottom(4)
44
+
45
+ vbox = Gtk.VBox(False, 4)
46
+ vbox.pack_start(kf_edit_geom_editor, False, False, 0)
47
+ vbox.no_separator = True
48
+ vbox.kf_edit_geom_editor = kf_edit_geom_editor
49
+ return vbox
50
+
51
+def _create_alpha_shape_editor(filt, editable_properties, editor_name, track, clip_index):
52
+ clip, filter_index, prop, property_index, args_str = editable_properties0.used_create_params
53
+
54
+ kf_editable_property = propertyedit.AlphaShapeRotatingGeometryProperty(
55
+ editable_properties0.used_create_params,
56
+ editable_properties,
57
+ track,
58
+ clip_index)
59
+
60
+ kf_edit_geom_editor = keyframeeditor.AlphaShapeGeometryEditor(kf_editable_property)
61
+ kf_edit_geom_editor.set_margin_bottom(4)
62
+
63
+ vbox = Gtk.VBox(False, 4)
64
+ vbox.pack_start(kf_edit_geom_editor, False, False, 0)
65
+ vbox.no_separator = True
66
+ vbox.kf_edit_geom_editor = kf_edit_geom_editor
67
+ return vbox
68
+
69
def _create_colorbox_editor(filt, editable_properties, editor_name, track, clip_index):
70
colorbox_editor = extraeditors.ColorBoxFilterEditor(editable_properties)
71
72
73
_create_apply_filter_mask_motion_editor(filt, editable_properties, editor_name, track, clip_index),
74
TEXT_ENTRY: lambda ep: _get_text_entry(ep),
75
NO_KF_RECT: lambda ep : _get_no_kf_rect_geom_editor(ep),
76
- FILTER_RECT_GEOM_EDITOR: lambda ep : _get_filter_rect_geom_editor(ep)
77
+ FILTER_RECT_GEOM_EDITOR: lambda ep : _get_filter_rect_geom_editor(ep),
78
+ GRADIENT_TINT: lambda filt, editable_properties, editor_name, track, clip_index: \
79
+ _create_gradient_tint_editor(filt, editable_properties, editor_name, track, clip_index),
80
+ CROP_EDITOR: lambda filt, editable_properties, editor_name, track, clip_index: \
81
+ _create_crop_editor(filt, editable_properties, editor_name, track, clip_index),
82
+ ALPHA_SHAPE_EDITOR: lambda filt, editable_properties, editor_name, track, clip_index: \
83
+ _create_alpha_shape_editor(filt, editable_properties, editor_name, track, clip_index)
84
}
85
86
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/propertyparse.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/propertyparse.py
Changed
201
1
2
import json
3
4
import appconsts
5
+import animatedvalue
6
from editorstate import current_sequence
7
from editorstate import PROJECT
8
import respaths
9
10
keyframes_str = keyframes_str.strip('"') # expressions have sometimes quotes that need to go away
11
kf_tokens = keyframes_str.split(";")
12
for token in kf_tokens:
13
- sides = token.split(appconsts.KEYFRAME_DISCRETE_EQUALS_STR)
14
- if len(sides) == 2:
15
- kf_type = appconsts.KEYFRAME_DISCRETE
16
- else:
17
- sides = token.split(appconsts.KEYFRAME_SMOOTH_EQUALS_STR)
18
- if len(sides) == 2:
19
- kf_type = appconsts.KEYFRAME_SMOOTH
20
- else:
21
- sides = token.split(appconsts.KEYFRAME_LINEAR_EQUALS_STR)
22
- kf_type = appconsts.KEYFRAME_LINEAR
23
-
24
+ kf_type, sides = animatedvalue.parse_kf_token(token)
25
+
26
# Find out saved keyframe type here.
27
add_kf = (int(sides0), out_to_in_func(float(sides1)), kf_type) # kf = (frame, value, type)
28
new_keyframes.append(add_kf)
29
30
keyframes_str = keyframes_str.strip('"') # expression have sometimes quotes that need to go away
31
kf_tokens = keyframes_str.split(";")
32
for token in kf_tokens:
33
- sides = token.split(appconsts.KEYFRAME_DISCRETE_EQUALS_STR)
34
- if len(sides) == 2:
35
- kf_type = appconsts.KEYFRAME_DISCRETE
36
- else:
37
- sides = token.split(appconsts.KEYFRAME_SMOOTH_EQUALS_STR)
38
- if len(sides) == 2:
39
- kf_type = appconsts.KEYFRAME_SMOOTH
40
- else:
41
- sides = token.split(appconsts.KEYFRAME_LINEAR_EQUALS_STR)
42
- kf_type = appconsts.KEYFRAME_LINEAR
43
-
44
+ kf_type, sides = animatedvalue.parse_kf_token(token)
45
values = sides1.split(':')
46
47
add_kf = (int(sides0), out_to_in_func(float(values2)), kf_type) # kf = (frame, opacity, type)
48
49
keyframes_str = keyframes_str.strip('"') # expression have sometimes quotes that need to go away
50
kf_tokens = keyframes_str.split(';')
51
for token in kf_tokens:
52
- sides = token.split(appconsts.KEYFRAME_DISCRETE_EQUALS_STR)
53
- if len(sides) == 2:
54
- kf_type = appconsts.KEYFRAME_DISCRETE
55
- else:
56
- sides = token.split(appconsts.KEYFRAME_SMOOTH_EQUALS_STR)
57
- if len(sides) == 2:
58
- kf_type = appconsts.KEYFRAME_SMOOTH
59
- else:
60
- sides = token.split(appconsts.KEYFRAME_LINEAR_EQUALS_STR)
61
- kf_type = appconsts.KEYFRAME_LINEAR
62
-
63
+ kf_type, sides = animatedvalue.parse_kf_token(token)
64
+
65
values = sides1.split(':')
66
pos = values0.split('/')
67
size = values1.split('x')
68
69
keyframes_str = keyframes_str.strip('"') # expression have sometimes quotes that need to go away
70
kf_tokens = keyframes_str.split(';')
71
for token in kf_tokens:
72
- sides = token.split(appconsts.KEYFRAME_DISCRETE_EQUALS_STR)
73
- if len(sides) == 2:
74
- kf_type = appconsts.KEYFRAME_DISCRETE
75
- else:
76
- sides = token.split(appconsts.KEYFRAME_SMOOTH_EQUALS_STR)
77
- if len(sides) == 2:
78
- kf_type = appconsts.KEYFRAME_SMOOTH
79
- else:
80
- sides = token.split(appconsts.KEYFRAME_LINEAR_EQUALS_STR)
81
- kf_type = appconsts.KEYFRAME_LINEAR
82
-
83
+ kf_type, sides = animatedvalue.parse_kf_token(token)
84
+
85
values = sides1.split(' ')
86
x = values0
87
y = values1
88
89
keyframes_str = keyframes_str.strip('"') # expression have sometimes quotes that need to go away
90
kf_tokens = keyframes_str.split(';')
91
for token in kf_tokens:
92
- sides = token.split(appconsts.KEYFRAME_DISCRETE_EQUALS_STR)
93
- if len(sides) == 2:
94
- kf_type = appconsts.KEYFRAME_DISCRETE
95
- else:
96
- sides = token.split(appconsts.KEYFRAME_SMOOTH_EQUALS_STR)
97
- if len(sides) == 2:
98
- kf_type = appconsts.KEYFRAME_SMOOTH
99
- else:
100
- sides = token.split(appconsts.KEYFRAME_LINEAR_EQUALS_STR)
101
- kf_type = appconsts.KEYFRAME_LINEAR
102
-
103
+ kf_type, sides = animatedvalue.parse_kf_token(token)
104
+
105
values = sides1.split(':')
106
frame = int(sides0)
107
# Get values and convert "frei0r.cairoaffineblend" values to editor values
108
109
110
new_keyframes =
111
112
- keyframes_str = keyframes_str.strip('"') # expression have sometimes quotes that need to go away
113
+ keyframes_str = keyframes_str.strip('"') # expressions have sometimes quotes that need to go away
114
kf_tokens = keyframes_str.split(';')
115
for token in kf_tokens:
116
frame, value, kf_type = get_token_frame_value_type(token)
117
118
y_scale = float(values3) / float(screen_height)
119
120
# keyframecanvas.RotatingEditCanvas editor considers x anf y values position of
121
- # anchor point around whicth image is rotated.
122
+ # anchor point around which image is rotated.
123
#
124
- # MLT porprty "affine.transition.rect" considers x anf y values amount translation
125
- # and rotate image automatically around its tramslated center point.
126
+ # MLT property "affine.transition.rect" considers x and y values amount translation
127
+ # and rotate image automatically around its translated center point.
128
#
129
# So the we need to add half of width and height to mlt values AND
130
# additional linear correction based on applied scaling when creating
131
132
y = float(values1) + float(screen_height) / 2.0 + \
133
((y_scale * screen_height) - screen_height) / 2.0
134
135
- rotation = float(values4) # degrees al arund
136
+ rotation = float(values4) # degrees all around
137
opacity = 100 # not edited
138
139
source_rect = x,y,x_scale,y_scale,rotation
140
141
142
return new_keyframes
143
144
+def gradient_tint_geom_keyframes_value_string_to_geom_kf_array(keyframes_str, out_to_in_func):
145
+ screen_width = current_sequence().profile.width()
146
+ screen_height = current_sequence().profile.height()
147
+
148
+ new_keyframes =
149
+
150
+ keyframes_str = keyframes_str.strip('"') # expressions have sometimes quotes that need to go away
151
+ kf_tokens = keyframes_str.split(';')
152
+
153
+ for token in kf_tokens:
154
+ frame, value, kf_type = get_token_frame_value_type(token)
155
+ values = value.split(':')
156
+ values_floats = float(x) for x in values
157
+ start_x = values_floats0 * screen_width
158
+ start_y = values_floats1 * screen_height
159
+ end_x = values_floats2 * screen_width
160
+ end_y = values_floats3 * screen_height
161
+ add_kf = (int(frame), (start_x, start_y, end_x, end_y), kf_type)
162
+
163
+ new_keyframes.append(add_kf)
164
+
165
+ return new_keyframes
166
+
167
+def crop_geom_keyframes_value_string_to_geom_kf_array(keyframes_str, out_to_in_func):
168
+ screen_width = current_sequence().profile.width()
169
+ screen_height = current_sequence().profile.height()
170
+
171
+ new_keyframes =
172
+
173
+ keyframes_str = keyframes_str.strip('"') # expressions have sometimes quotes that need to go away
174
+ kf_tokens = keyframes_str.split(';')
175
+
176
+ for token in kf_tokens:
177
+ frame, value, kf_type = get_token_frame_value_type(token)
178
+ values = value.split(':')
179
+ values_floats = float(x) for x in values
180
+ left = values_floats0 * screen_width
181
+ right = (1.0 - values_floats1) * screen_width
182
+ top = values_floats2 * screen_height
183
+ bottom = (1.0 - values_floats3) * screen_height
184
+ x = left
185
+ y = top
186
+ w = right - left
187
+ h = bottom - top
188
+ dummy_opacity = 1.0 # historical artifat that has not been refactored out, used geom editor
189
+ # keyframeditcanvas.BoxEditCanvas assumes opacity to be there.
190
+ add_kf = (int(frame), x, y, w, h, dummy_opacity, kf_type)
191
+
192
+ new_keyframes.append(add_kf)
193
+
194
+ return new_keyframes
195
+
196
def rotomask_json_value_string_to_kf_array(keyframes_str, out_to_in_func):
197
new_keyframes =
198
json_obj = json.loads(keyframes_str)
199
200
return sorted(new_keyframes, key=lambda kf_tuple: kf_tuple0)
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/rendergui.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/rendergui.py
Changed
14
1
2
passed_box.pack_start(Gtk.Label(), True, True, 0)
3
4
if frame_rates_match == False:
5
- # Aug-2019 - SvdB - BB
6
- if guiutils.double_icon_size():
7
- warning_icon = Gtk.Image.new_from_icon_name("dialog-warning", Gtk.IconSize.DND)
8
- else:
9
- warning_icon = Gtk.Image.new_from_icon_name("dialog-warning", Gtk.IconSize.MENU)
10
+ warning_icon = Gtk.Image.new_from_icon_name("dialog-warning", Gtk.IconSize.MENU)
11
warning_text = Gtk.Label(label=_("Project and Render Profile FPS values are not same. Rendered file may have A/V sync issues."))
12
warning_box = Gtk.HBox(False, 2)
13
warning_box.pack_start(warning_icon,False, False, 0)
14
_service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_active_effect.png
Added
_service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_active_smooth_extended.png
Added
_service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_not_active_effect.png
Added
_service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/kf_not_active_smooth_extended.png
Added
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_all_mute_fb.png -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_all_mute_fb.png
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_all_on_A_fb.png -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_all_on_A_fb.png
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_all_on_V_fb.png -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_all_on_V_fb.png
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_audio_mute_A_fb.png -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_audio_mute_A_fb.png
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_audio_mute_fb.png -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_audio_mute_fb.png
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_sync_icon.png -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_sync_icon.png
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_video_mute_fb.png -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/darktheme/track_video_mute_fb.png
Changed
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/filters/filters.xml -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/filters/filters.xml
Changed
78
1
2
</filter>
3
<filter id="frei0r.mask0mate">
4
<name>Crop</name>
5
- <group>Alpha</group>
6
- <property name="Left" args="range_in=0.0,100.0 editor=slider step=0.1 scale_digits=1">0</property>
7
- <property name="Right" args="range_in=0.0,100.0 editor=slider step=0.1 scale_digits=1">0</property>
8
- <property name="Top" args="range_in=0.0,100.0 editor=slider step=0.1 scale_digits=1">0</property>
9
- <property name="Bottom" args="range_in=0.0,100.0 editor=slider step=0.1 scale_digits=1">0</property>
10
+ <group>Alpha</group>
11
+ <property name="Right" args="editor=no_editor">0=0</property>
12
+ <property name="Left" args="editor=no_editor">0=0</property>
13
+ <property name="Top" args="editor=no_editor">0=0</property>
14
+ <property name="Bottom" args="editor=no_editor">0=0</property>
15
<property name="Blur" args="range_in=0.0,100.0 editor=slider step=0.1 scale_digits=1">0</property>
16
<property name="Invert" args="editor=booleancheckbox displayname=Invert">1</property>
17
+ <extraeditor name="crop_editor"></extraeditor>
18
</filter>
19
<filter id="frei0r.alphaspot">
20
<name>Alpha Shape</name>
21
<group>Alpha</group>
22
<property name="Shape" args="editor=combobox exptype=default cbopts=Rectangle:0.0,Ellipse:0.32,Triangle:0.68,Diamond:1.0">0.0</property>
23
- <property name="Position X" args="range_in=0,100 editor=keyframe_editor exptype=keyframe_hcs displayname=Pos!X">0=0.5</property>
24
- <property name="Position Y" args="range_in=0,100 editor=keyframe_editor exptype=keyframe_hcs displayname=Pos!Y">0=0.5</property>
25
- <property name="Size X" args="range_in=0,100 editor=keyframe_editor exptype=keyframe_hcs displayname=Size!X">0=0.5</property>
26
- <property name="Size Y" args="range_in=0,100 editor=keyframe_editor exptype=keyframe_hcs displayname=Size!Y">0=0.5</property>
27
- <property name="Tilt" args="range_in=0,100 editor=keyframe_editor exptype=keyframe_hcs displayname=Tilt">0=0.5</property>
28
+ <property name="Position X" args="editor=no_editor">0=0.5</property>
29
+ <property name="Position Y" args="editor=no_editor">0=0.5</property>
30
+ <property name="Size X" args="editor=no_editor">0=0.5</property>
31
+ <property name="Size Y" args="editor=no_editor">0=0.5</property>
32
+ <property name="Tilt" args="editor=no_editor">0=0.5</property>
33
<property name="Transition width" args="range_in=0,100 editor=keyframe_editor exptype=keyframe_hcs displayname=Trans.!Width">0=0.2</property>
34
<property name="Min" args="editor=no_editor exptype=keyframe_hcs">0=0</property>
35
<property name="Max" args="editor=no_editor exptype=keyframe_hcs">0=1</property>
36
<property name="Operation" args="editor=combobox exptype=default cbopts=Overwrite:0.0,Add:0.7,Subtract:1.0">0.0</property>
37
+ <extraeditor name="alpha_shape_editor"></extraeditor>
38
</filter>
39
<filter id="frei0r.alpha0ps_alphaspot">
40
<name>Alpha Shape</name>
41
42
<property name="10" args="editor=combobox displayname=Blend!Mode exptype=default cbopts=Normal:normal,Add:add,Saturate:saturate,Multiply:multiply,Screen:screen,Overlay:overlay,Darken:darken,Lighten:lighten,ColorDodge:colordodge,Colorburn:colorburn,Hardlight:hardlight,Softlight:softlight,Difference:difference,Exclusion:exclusion,HSLHue:hslhue,HSLSaturation:hslsaturation,HSLColor:hslcolor,HSLLuminosity:hslluminosity">normal</property>
43
<property name="2" args="editor=slider range_in=0,100 displayname=Start!Opacity">0.5</property>
44
<property name="4" args="editor=slider range_in=0,100 displayname=End!Opacity">0.5</property>
45
- <property name="5" args="editor=slider range_in=0,100 displayname=Start!X">0.5</property>
46
- <property name="6" args="editor=slider range_in=0,100 displayname=Start!Y">0.8</property>
47
- <property name="7" args="editor=slider range_in=0,100 displayname=End!X">0.5</property>
48
- <property name="8" args="editor=slider range_in=0,100 displayname=End!Y">0.2</property>
49
+ <property name="5" args="editor=no_editor">0=0.5</property>
50
+ <property name="6" args="editor=no_editor">0=0.8</property>
51
+ <property name="7" args="editor=no_editor">0=0.5</property>
52
+ <property name="8" args="editor=no_editor">0=0.2</property>
53
<property name="0" args="editor=combobox displayname=Gradient!Type exptype=default cbopts=Linear:gradient_linear,Radial:gradient_radial">gradient_linear</property>
54
<property name="9" args="editor=slider range_in=0,100 displayname=Radial!Offset">0.0</property>
55
+ <extraeditor name="gradient_tint_editor"></extraeditor>
56
</filter>
57
<filter id="frei0r.cluster">
58
<name>Color Clustering</name>
59
60
<name>Position Scale</name>
61
<group>Transform</group>
62
<property name="transition.fill" args="editor=no_editor">1</property>
63
- <property name="transition.distort" args="editor=no_editor">1</property>
64
<property name="transition.rect" args="editor=filter_rect_geometry_editor range_in=0,100 range_out=0,100 exptype=geom_filt_rect_kf">0=0 0 Screensize2 1</property>
65
+ <property name="transition.distort" args="editor=booleancheckbox displayname=Distort">1</property>
66
<property name="transition.valign" args="editor=no_editor exptype=not_parsed">top</property>
67
<property name="transition.halign" args="editor=no_editor exptype=not_parsed">left</property>
68
<property name="transition.threads" args="editor=no_editor">0</property>
69
70
<name>Position Scale Rotate</name>
71
<group>Transform</group>
72
<property name="transition.fill" args="editor=no_editor">1</property>
73
- <property name="transition.distort" args="editor=no_editor">0</property>
74
+ <property name="transition.distort" args="editor=booleancheckbox displayname=Distort">1</property>
75
<property name="transition.rect" args="editor=no_editor exptype=not_parsed">0=0 0 Screensize2 1</property>
76
<property name="transition.valign" args="editor=no_editor exptype=not_parsed">middle</property>
77
<property name="transition.halign" args="editor=no_editor exptype=not_parsed">center</property>
78
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/help/advanced.html -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/help/advanced.html
Changed
136
1
2
3
<ul>
4
<li> Click <b>Right Mouse</b> on clip and select <b>Edit->Select Sync Parent Clip...</b>.</li>
5
-<li> Or Click <b>Right Mouse</b> on clip that is part of a multiclip selection and and select <b>Select Sync Parent Clip...</b>.</li>
6
+<li> Or Click <b>Right Mouse</b> on clip that is part of a multiclip selection and select <b>Select Sync Parent Clip...</b>.</li>
7
<li> Cursor turns into a Target Cross. Click on a clip to select it as <b>Sync Parent Clip</b>.</li>
8
</ul>
9
10
11
12
<ul>
13
<li> Click <b>Right Mouse</b> on clip and select <b>Audio Edit->Split Audio Synched</b>.
14
-<li> When multple Clips are selected click <b>Right Mouse</b> on clip and select <b>Split Audio Synched</b>.
15
-<li>A new synched Audio Clip/s is placed on audio Track, either on V1 or mirrored track based on current preference.</li>
16
+<li> When multiple Clips are selected click <b>Right Mouse</b> on clip and select <b>Split Audio Synched</b>.
17
+<li>A new synched Audio Clip/s is placed on audio track, either on V1 or mirrored track based on current preference.</li>
18
<li> If you select from <b>Sync Properties</b> menu property <b>Auto Sync Split Video Clips on Add</b> video clips will be split automatically when added to certain tracks.
19
</li>
20
</ul>
21
22
Set all clips on track as <b>Sync Child Clips</b> to closest clips on the selected Track as <b>Sync Parent Clips</b>.
23
</p>
24
<ul>
25
-<li> Click <b>Right Mouse</b> on a Track in the left side Tracks Column area and select <b>Sync All Clips To Track... </b>.</li>
26
+<li> Click <b>Right Mouse</b> on a track in the left side tracks Column area and select <b>Sync All Clips To Track... </b>.</li>
27
<ul>
28
-<li>Select sync parenting target Track using the dialog window.</li>
29
+<li>Select sync parenting target track using the dialog window.</li>
30
<li>A sync relation is created for all Clips on Track.</li>
31
-<li>An icon appers on Track Head in in the Tracks Column to indicate that updating sync is now posibble.</li>
32
+<li>An icon appears on Track Head in in the Tracks Column to indicate that updating sync is now possible.</li>
33
</ul>
34
-<li>Once a Track has been auto parented it remembers the target Track and parenting can be updated by clicking <b>Right Mouse</b> on a Track Head and selecting <b>Update Sync to Clips' Current Positions</b>.</li>
35
+<li>Once a Track has been auto parented it remembers the target track and parenting can be updated by clicking <b>Right Mouse</b> on a Track Head and selecting <b>Update Sync to Clips' Current Positions</b>.</li>
36
<li> Click <b>Right Mouse</b> on a Track Head and select <b>Clear Sync</b> to clear all sync relations on a Track and info on parenting target Track.</li>
37
</ul>
38
39
+<h4>Box Selection Parenting</h4>
40
+
41
+<p>
42
+Parent selected clips to the first clip on track closest to track <b>V1</b>.
43
+</p>
44
+
45
+<ul>
46
+<li> Drag <b>Left Mouse</b> to select clips on multiple tracks.</li>
47
+<li> Press button <b>Set Sync for All Clips on Track or Box Selection.</b></li>
48
+<li> All selected clips on other tracks are parented to the first clip in selection on track closest to track <b>V1</b>. Clips on track closest to track <b>V1</b> are not parented.
49
+</ul>
50
51
<h3>Resyncing</h3>
52
53
54
<h4>Multiple Clips</h4>
55
<ul>
56
<li> Press <b>Resync Selected Clips</b> Button to resync selected clips clip.</li>
57
-<li> Click <b>Right Mouse</b> on <b>Sync Child Clip</b> that is part of a multiclip selection and and select <b>Resync</b> from popup menu to resync single clip.</li>
58
+<li> Click <b>Right Mouse</b> on <b>Sync Child Clip</b> that is part of a multiclip selection and select <b>Resync</b> from popup menu to resync single clip.</li>
59
</li>
60
</ul>
61
62
63
<h3>Clearing Sync Parent Relations </h3>
64
<ul>
65
<li> Click <b>Right Mouse</b> on Sync Child Clip and select <b>Edit->Clear Sync Relation</b>.</li>
66
-<li> Or Click <b>Right Mouse</b> on clip that is part of a multiclip selection and and select <b>>Clear Sync Relations</b>.</li>
67
+<li> Or Click <b>Right Mouse</b> on clip that is part of a multiclip selection and select <b>>Clear Sync Relations</b>.</li>
68
</ul>
69
70
<h3>Workflows</h3>
71
72
<ul>
73
<li> It is often useful to treat track <b>V1</b> as a master track, and have all other tracks relate positions to track <b>V1</b>.</li>
74
<li> Set sync relations for individual or multiple selected clips.</li>
75
-<li> If there exists many clips of similar type that require synching, dedicate a track to that type of clips and use track syncing features to keep that track in sync.</li>
76
+<li> If there exists many clips of similar type that require syncing, dedicate a track to that type of clips and use track syncing features to keep that track in sync.</li>
77
<li> If program features multiple clearly defined complex scenes one approach is to:
78
<ul>
79
- <li> Parent first clip of the scene on each track to the first clip of scene on track <b>V1</b>.</li>
80
+ <li> Parent first clip of the scene on each track to the first clip of scene on track <b>V1</b>. <i>Box Selection Parenting</i> can be a useful action to get this done quikly.</li>
81
<li> Use <b>Spacer</b> tool with <b>Control</b> modifier to sync tracks manually at scene start when needed.</li>
82
<li> Or use track syncing.</li>
83
</ul>
84
85
86
<h4>Editing to audio</h4>
87
<p>
88
-When creating music videos or voice over driven programs it is useful to use a single audio track as sync target track for most ar all other element in the sequence.</li>
89
+When creating music videos or voice over driven programs it is useful to use a single audio track as sync target track for most are all other elements in the sequence.</li>
90
</p>
91
92
<ul>
93
<li> Place the program defining audio of track <b>A1</b> and treat that as a master track.</li>
94
<li> Have all other tracks and clips relate their positions to track <b>A1</b>.</li>
95
-<li> With music videos it is useful to use a large number of track dedicated to invidual types of visual elements, and use excusively track syncing featues instead of setting sync to individual clips.</li>
96
+<li> With music videos it is useful to use a large number of track dedicated to individual types of visual elements, and use exclusively track syncing features instead of setting sync to individual clips.</li>
97
</ul>
98
99
<h4> Dialogue editing</h4>
100
101
Editing dialogue scenes frequently require actor's voice to start before or end after the image of the character speaking. These types of edit are knowns as J- and L-cuts.
102
</p>
103
<ul>
104
-<li> Dedicate tracks <b>V1</b>, <b>V2</b>, <b>A1</b> and <b>A2</b> to dialoque video and audio.</li>
105
+<li> Dedicate tracks <b>V1</b>, <b>V2</b>, <b>A1</b> and <b>A2</b> to dialogue video and audio.</li>
106
<li> Select from <b>Sync Properties</b> menu on the left behaviour that suits your preferences.
107
<ul>
108
<li> <b>Auto Sync Split Video Clips on Add</b> has multiple options to select which tracks do this.</li>
109
110
</p>
111
<ul>
112
<li><b>Split Audio Synched</b></li>
113
- <li><b>Set Sync for All Clips on Track Containing Selected Clip/s</b></li>
114
+ <li><b>Set Sync for All Clips on Track or Box Selection.</b> If a box selection is active then <i>Box Selection Parenting</i> is done, othrewise a <i>Track Auto Parenting</i> action is performed</li>
115
<li><b>Resync Track Containing Selected Clip/s</b></li>
116
<li><b>Resync Selected Clips</b></li>
117
</ul>
118
119
</p>
120
<ul>
121
<li><b>Sync Properties Menu</b> above <b>Tracks Column</b> allows for setting sync editing properties.</li>
122
- <li><b>Track Menu</b> available in <b>Tracks Column</b> provides Track sync actions.</li>
123
+ <li><b>Track Menu</b> available in <b>Tracks Column</b> provides track sync actions.</li>
124
<li><b>Clip Menu</b> provides sync actions applied to single clips.</li>
125
<li><b>Multi Clip Selection Menu</b> provides sync actions applied to multiple clips.</li>
126
</ul>
127
128
<ul>
129
<li> Red box with a number means that clip is not in sync with parent.</li>
130
<li> Displayed number gives info on how many frames a clip's position is away from being synched.</li>
131
-<li> Optinally a line is drawn between parent and child clip.</li>
132
+<li> Optionally a line is drawn between parent and child clip.</li>
133
</ul>
134
135
136
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/help/basic_editing.html -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/help/basic_editing.html
Changed
10
1
2
<p><b>Splice Out</b>: Select clip(s) and press <b>Delete</b> key or use the <b>Splice Out</b> button on middle bar. All the clips in the track after the deleted clip(s) are moved to left to cover the created empty space.</p>
3
<p><b>Lift</b>: Select clip(s) and press the <b>Lift</b> button on the middle bar. Clip is replaced with a blank if it is in middle of track. Other clips on the track are not moved.
4
<p><b>Ripple Delete</b>: Select clip(s) and press the <b>Ripple Delete</b> button on middle bar. All the clips on <b>all tracks</b> are moved forward to cover the created empty space. If moving clips backwards would cause an overwrite to happen on timeline, edit is not allowed.</p>
5
-<p><b>Range Delete</b>: Set <b>Mark In</b> and <b>Mark out</b> on timeline and and press the <b>Range Delete</b> button on middle bar. All the clips and blanks on <b>all tracks</b> are deleted between marks and everything after deleted range is moved forward the length of the deleted range.</p>
6
+<p><b>Range Delete</b>: Set <b>Mark In</b> and <b>Mark out</b> on timeline and press the <b>Range Delete</b> button on middle bar. All the clips and blanks on <b>all tracks</b> are deleted between marks and everything after deleted range is moved forward the length of the deleted range.</p>
7
8
<div class="note">
9
<p><b>Fade/Transition cover delete</b>: Select a single rendered fade or transition clip and press <b>Delete</b> key or button. If clips before and after of the deleted clip have frames available, then the space left by the deleted clip will covered using material from adjacent clips. If material is not available a splice out will be performed. A preference exists to always perform splice out on fades and transitions.
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/shortcuts/flowblade.xml -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/shortcuts/flowblade.xml
Changed
20
1
2
<event code='play_pause_loop_marks' name='Play / Pause Mark In to Mark Out Loop' modifiers='CTRL'>space</event>
3
<event code='trim_start' name='Trim Clip Start To Playhead'>q</event>
4
<event code='trim_end' name='Trim Clip End To Playhead'>w</event>
5
- <event code='tline_render_request' name='Render Timeline Range' modifiers='ALT'>t</event>
6
+ <event code='tline_render_request' name='Render Timeline Range' modifiers='ALT'>f</event>
7
<event code='toggle_track_output' name='Selected Clip Track Out Enabled/Disabled' modifiers='CTRL'>d</event>
8
<event code='tline_page_up' name='Timeline Vertical Page Up'>page_up</event>
9
<event code='tline_page_down' name='Timeline Vertical Page Down'>page_down</event>
10
11
<event code='monitor_show_video' name='Monitor Show Video' modifiers='ALT'>1</event>
12
<event code='monitor_show_scope' name='Monitor Show Vectorscope' modifiers='ALT'>2</event>
13
<event code='monitor_show_rgb' name='Monitor Show RGB Parade' modifiers='ALT'>3</event>
14
+ <event code='set_length' name='Set Clip Length' modifiers='ALT'>l</event>
15
+ <event code='clear_sync_relation' name='Clear Clip Sync Relation' modifiers='CTRL+ALT'>c</event>
16
+ <event code='toggle_audio_mute' name='Toggle Clip Audio Mute' modifiers='ALT'>t</event>
17
+ <event code='set_sync_relation' name='Set Clip Sync Relation' modifiers='CTRL+ALT'>r</event>
18
</shortcuts>
19
</flowblade>
20
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/res/shortcuts/premiere.xml -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/res/shortcuts/premiere.xml
Changed
20
1
2
<event code='play_pause_loop_marks' name='Play / Pause Mark In to Mark Out Loop' modifiers='CTRL'>space</event>
3
<event code='trim_start' name='Trim Clip Start To Playhead'>q</event>
4
<event code='trim_end' name='Trim Clip End To Playhead'>w</event>
5
- <event code='tline_render_request' name='Render Timeline Range' modifiers='ALT'>t</event>
6
+ <event code='tline_render_request' name='Render Timeline Range' modifiers='ALT'>f</event>
7
<event code='toggle_track_output' name='Toggle Track Output Enabled/Disabled' modifiers='CTRL'>d</event>
8
<event code='tline_page_up' name='Timeline Vertical Page Up'>page_up</event>
9
<event code='tline_page_down' name='Timeline Vertical Page Down'>page_down</event>
10
11
<event code='monitor_show_video' name='Monitor Show Video' modifiers='ALT'>1</event>
12
<event code='monitor_show_scope' name='Monitor Show Vectorscope' modifiers='ALT'>2</event>
13
<event code='monitor_show_rgb' name='Monitor Show RGB Parade' modifiers='ALT'>3</event>
14
+ <event code='set_length' name='Set Clip Length' modifiers='ALT'>l</event>
15
+ <event code='clear_sync_relation' name='Clear Clip Sync Relation' modifiers='CTRL+ALT'>c</event>
16
+ <event code='toggle_audio_mute' name='Toggle Clip Audio Mute' modifiers='ALT'>t</event>
17
+ <event code='set_sync_relation' name='Set Clip Sync Relation' modifiers='CTRL+ALT'>r</event>
18
</shortcuts>
19
</flowblade>
20
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/resync.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/resync.py
Changed
53
1
2
3
return clips_data
4
5
+def get_box_selection_resync_action_data(box_selection, parent_track, parent_clip):
6
+ tracks_orig_sync_data =
7
+ tracks_new_sync_data =
8
+ for track_selection in box_selection.track_selections:
9
+
10
+ if track_selection.track_id == parent_track.id:
11
+ continue
12
+
13
+ orig_sync_data, new_sync_data = _get_box_resync_action_data_for_track(track_selection, parent_track, parent_clip)
14
+
15
+ tracks_orig_sync_data.append((track_selection, orig_sync_data))
16
+ tracks_new_sync_data.append((track_selection, new_sync_data))
17
+
18
+ return (tracks_orig_sync_data, tracks_new_sync_data)
19
+
20
+def _get_box_resync_action_data_for_track(track_selection, parent_track, parent_clip):
21
+
22
+ child_track = current_sequence().trackstrack_selection.track_id
23
+
24
+ orig_sync_data = {}
25
+ for i in range(track_selection.selected_range_in, track_selection.selected_range_out + 1):
26
+ clip = child_track.clipsi
27
+ if clip.is_blanck_clip == True:
28
+ continue
29
+ orig_sync_dataclip = clip.sync_data
30
+
31
+ new_sync_data = {}
32
+ for i in range(track_selection.selected_range_in, track_selection.selected_range_out + 1):
33
+ clip = child_track.clipsi
34
+ if clip.is_blanck_clip == True:
35
+ continue
36
+ clip_start_frame = child_track.clip_start(i)
37
+
38
+ parent_index = parent_track.clips.index(parent_clip)
39
+
40
+ # Get offset
41
+ child_clip_start = clip_start_frame - clip.clip_in
42
+ parent_clip_start = parent_track.clip_start(parent_index) - parent_clip.clip_in
43
+ pos_offset = child_clip_start - parent_clip_start
44
+ sync_data = (pos_offset, parent_clip, parent_track)
45
+
46
+ new_sync_dataclip = sync_data
47
+
48
+ return (orig_sync_data, new_sync_data)
49
+
50
def get_track_all_resync_action_data(child_track, parent_track):
51
orig_sync_data = {}
52
for clip in child_track.clips:
53
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/sequence.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/sequence.py
Changed
11
1
2
# Tracks may be FREE or LOCKED
3
track.edit_freedom = FREE
4
5
+ # User can define info labels that are shown as overlays on timeline.
6
+ track.info_label = ""
7
+
8
def get_track_counts(self):
9
"""returns (video track count, audio track count)"""
10
nv = len(self.tracks) - self.first_video_index - 1
11
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/shortcuts.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/shortcuts.py
Changed
12
1
2
_keyboard_action_names'monitor_show_video' = _('Show Video')
3
_keyboard_action_names'monitor_show_scope' = _('Show Vectorscope')
4
_keyboard_action_names'monitor_show_rgb' = _('Show RGB Parade')
5
+ _keyboard_action_names'set_length' = _('Set Clip Length')
6
+ _keyboard_action_names'clear_sync_relation' = _('Clear Clip Sync Relation')
7
+ _keyboard_action_names'toggle_audio_mute' = _('Toggle Clip Audio Mute')
8
+ _keyboard_action_names'set_sync_relation' = _('Set Clip Sync Relation')
9
10
def _set_key_names():
11
global _key_names, _mod_names, _gtk_mod_names
12
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/shortcutsdialog.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/shortcutsdialog.py
Changed
48
1
2
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "cut_all"), False, False, 0)
3
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "trim_start"), False, False, 0)
4
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "trim_end"), False, False, 0)
5
+ tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "set_length"), False, False, 0)
6
tline_vbox.pack_start(_get_kb_row(_("DELETE"), _("Splice Out")), False, False, 0)
7
tline_vbox.pack_start(_get_kb_row(_("Control + DELETE"), _("Lift")), False, False, 0)
8
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "clear_filters"), False, False, 0)
9
- tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "split_selected"), False, False, 0)
10
- tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "resync"), False, False, 0)
11
- tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "sync_all"), False, False, 0)
12
+
13
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "insert"), False, False, 0)
14
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "append"), False, False, 0)
15
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "append_from_bin"), False, False, 0)
16
17
tline_vbox.pack_start(_get_kb_row(_("Control + C"), _("Copy Clips")), False, False, 0)
18
tline_vbox.pack_start(_get_kb_row(_("Control + V"), _("Paste Clips")), False, False, 0)
19
tline_vbox.pack_start(_get_kb_row(_("Shift + Control + V"), _("Paste Filters/Properties")), False, False, 0)
20
+ tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "toggle_audio_mute"), False, False, 0)
21
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "nudge_back"), False, False, 0)
22
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "nudge_forward"), False, False, 0)
23
tline_vbox.pack_start(_get_dynamic_kb_row(root_node, "nudge_back_10"), False, False, 0)
24
25
trimming_box.pack_start(_get_kb_row(_("ENTER"), _("Complete Keyboard Trim Edit")), False, False, 0) # _get_dynamic_kb_row(root_node, "enter_edit"), False, False, 0)
26
trimming = guiutils.get_named_frame(_("Trimming"), trimming_box)
27
28
+ sync_box = Gtk.VBox()
29
+ sync_box.pack_start(_get_dynamic_kb_row(root_node, "split_selected"), False, False, 0)
30
+ sync_box.pack_start(_get_dynamic_kb_row(root_node, "resync"), False, False, 0)
31
+ sync_box.pack_start(_get_dynamic_kb_row(root_node, "set_sync_relation"), False, False, 0)
32
+ sync_box.pack_start(_get_dynamic_kb_row(root_node, "clear_sync_relation"), False, False, 0)
33
+ sync_box.pack_start(_get_dynamic_kb_row(root_node, "sync_all"), False, False, 0)
34
+ sync = guiutils.get_named_frame(_("Sync"), sync_box)
35
+
36
marks_box = Gtk.VBox()
37
marks_box.pack_start(_get_dynamic_kb_row(root_node, "mark_in"), False, False, 0)
38
marks_box.pack_start(_get_dynamic_kb_row(root_node, "mark_out"), False, False, 0)
39
40
panel.pack_start(guiutils.pad_label(12,12), False, False, 0)
41
panel.pack_start(trimming, False, False, 0)
42
panel.pack_start(guiutils.pad_label(12,12), False, False, 0)
43
+ panel.pack_start(sync, False, False, 0)
44
+ panel.pack_start(guiutils.pad_label(12,12), False, False, 0)
45
panel.pack_start(marks, False, False, 0)
46
panel.pack_start(guiutils.pad_label(12,12), False, False, 0)
47
panel.pack_start(track_head, False, False, 0)
48
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/syncsplitevent.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/syncsplitevent.py
Changed
77
1
2
3
data = {"child_track":child_track,
4
"orig_sync_data":orig_sync_data}
5
-
6
+
7
action = edit.clear_track_sync_action(data)
8
action.do_edit()
9
10
+def set_box_clips_sync(box_selection):
11
+ parent_track, parent_track_selection = box_selection.get_center_most_sync_track()
12
+
13
+ # Get parent clip. No edit actions for missing parent clip on parent track on blank clips.
14
+ # TODO: Add info window.
15
+ try:
16
+ parent_clip = parent_track.clipsparent_track_selection.selected_range_in
17
+ except:
18
+ return
19
+ if parent_clip.is_blanck_clip == True:
20
+ return
21
+
22
+ parent_clip = parent_track.clipsparent_track_selection.selected_range_in
23
+ tracks_orig_sync_data, tracks_new_sync_data = resync.get_box_selection_resync_action_data(box_selection, parent_track, parent_clip)
24
+
25
+ data = {"orig_sync_data":tracks_orig_sync_data,
26
+ "new_sync_data":tracks_new_sync_data}
27
+
28
+ action = edit.set_box_selection_sync_action(data)
29
+ action.do_edit()
30
31
# ---------------------------------------------- sync parent clips
32
def init_select_master_clip(popup_data):
33
34
35
parent_selection_data = (CHILD_SELECTION_SINGLE, clip, child_index, track)
36
except TypeError:
37
- # This is from multi selection that does not porvide same data as single selection.
38
+ # This is from multi selection that does not provide same data as single selection.
39
parent_selection_data = (CHILD_SELECTION_MULTIPLE, movemodes.selected_range_in, movemodes.selected_range_out, track)
40
41
gdk_window = gui.tline_display.get_parent_window()
42
gdk_window.set_cursor(Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.TCROSS))
43
editorstate.edit_mode = editorstate.SELECT_PARENT_CLIP
44
45
+def init_select_master_clip_from_keyevent():
46
+ global parent_selection_data
47
+ if movemodes.selected_track != -1:
48
+ child_index = movemodes.selected_range_in
49
+ track = current_sequence().tracksmovemodes.selected_track
50
+ clip = track.clipschild_index
51
+
52
+ parent_selection_data = (CHILD_SELECTION_MULTIPLE, movemodes.selected_range_in, movemodes.selected_range_out, track)
53
+ gdk_window = gui.tline_display.get_parent_window()
54
+ gdk_window.set_cursor(Gdk.Cursor.new_for_display(Gdk.Display.get_default(), Gdk.CursorType.TCROSS))
55
+ editorstate.edit_mode = editorstate.SELECT_PARENT_CLIP
56
+ gui.editor_window.tline_cursor_manager.tline_cursor_enter(None)
57
+
58
def select_sync_parent_mouse_pressed(event, frame):
59
60
global parent_selection_data
61
62
63
def clear_sync_relation(popup_data):
64
clip, track, item_id, x = popup_data
65
+ do_clear_sync_relation(clip, track)
66
+
67
+def clear_sync_relation_from_keyevent():
68
+ if movemodes.selected_track != -1:
69
+ track = current_sequence().tracksmovemodes.selected_track
70
+ clip = track.clipsmovemodes.selected_range_in
71
+ do_clear_sync_relation(clip, track)
72
73
+def do_clear_sync_relation(clip, track):
74
data = {"child_clip":clip,
75
"child_track":track}
76
action = edit.clear_sync_action(data)
77
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/tlineaction.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/tlineaction.py
Changed
74
1
2
def sequence_split_pressed():
3
"""
4
Intention of this method is to split a sequence at the current position,
5
- reduce it to the the clips on the left side of the cut and move the remains
6
+ reduce it to the clips on the left side of the cut and move the remains
7
on the right side of the cut to a newly created sequence that is then
8
opened.
9
"""
10
11
syncsplitevent.resync_track()
12
13
def set_track_sync_button_pressed():
14
- if movemodes.selected_track != -1:
15
+ if boxmove.box_selection_data != None:
16
+ print("haloo")
17
+ syncsplitevent.set_box_clips_sync(boxmove.box_selection_data)
18
+ boxmove._exit_to_overwrite()
19
+ elif movemodes.selected_track != -1:
20
child_track = current_sequence().tracksmovemodes.selected_track
21
syncsplitevent.set_track_clips_sync(child_track)
22
23
24
action = edit.move_compositor_action(data)
25
action.do_edit()
26
27
+def set_length_from_keyevent():
28
+ if movemodes.selected_track != -1:
29
+ track = current_sequence().tracksmovemodes.selected_track
30
+ clip = track.clipsmovemodes.selected_range_in
31
+ set_length(clip, track)
32
+
33
+def set_length(clip, track):
34
+ dialogs.clip_length_change_dialog(_change_clip_length_dialog_callback, clip, track)
35
+
36
+def _change_clip_length_dialog_callback(dialog, response_id, clip, track, length_changer):
37
+ if response_id != Gtk.ResponseType.ACCEPT:
38
+ dialog.destroy()
39
+ return
40
+
41
+ length = length_changer.get_length()
42
+ index = track.clips.index(clip)
43
+
44
+ dialog.destroy()
45
+
46
+ data = {"track":track,
47
+ "clip":clip,
48
+ "index":index,
49
+ "length":length}
50
+
51
+ action = edit.set_clip_length_action(data)
52
+ action.do_edit()
53
+
54
+def mute_clip_from_keyevent():
55
+ if movemodes.selected_track != -1:
56
+ track = current_sequence().tracksmovemodes.selected_track
57
+ clip = track.clipsmovemodes.selected_range_in
58
+ audio_on = (clip.mute_filter==None)
59
+ do_mute_clip(clip, audio_on)
60
+
61
+def do_mute_clip(clip, audio_on):
62
+ if audio_on == True:
63
+ data = {"clip":clip}
64
+ action = edit.mute_clip(data)
65
+ action.do_edit()
66
+ else:# then we're sitting clip unmuted
67
+ data = {"clip":clip}
68
+ action = edit.unmute_clip(data)
69
+ action.do_edit()
70
+
71
72
# --------------------------------------------------------- view move setting
73
def view_mode_menu_lauched(launcher, widget, event):
74
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/tlinewidgets.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/tlinewidgets.py
Changed
201
1
2
MARK_LINE_WIDTH = 5
3
4
# tracks column consts
5
-COLUMN_WIDTH = 124 # column area width
6
+COLUMN_WIDTH = 150 # column area width
7
SCALE_HEIGHT = 25
8
SCROLL_HEIGHT = 20
9
Y_SCROLL_WIDTH = 19
10
-COLUMN_LEFT_PAD = 0 # as mute switch no longer exists this is now essentially left pad width
11
ACTIVE_SWITCH_WIDTH = 18
12
COMPOSITOR_HEIGHT_OFF = 10
13
COMPOSITOR_HEIGHT = 20
14
15
COMPOSITOR_TRACK_ARROW_WIDTH = 6
16
COMPOSITOR_TRACK_ARROW_HEAD_WIDTH = 10
17
COMPOSITOR_TRACK_ARROW_HEAD_WIDTH_HEIGHT = 5
18
-ID_PAD_X = 48 # track id text pos
19
+ID_PAD_X = 66 # track id text pos
20
ID_PAD_Y_HIGH = 30 # track id text pos for high track
21
ID_PAD_Y = 16 # track id text pos
22
ID_PAD_Y_SMALL = 4 # track id text pos for small track
23
MUTE_ICON_POS = (5, 4)
24
MUTE_ICON_POS_NORMAL = (5, 14)
25
MUTE_ICON_POS_HIGH = (5, 30)
26
-LOCK_POS = (26, 5)
27
-INSRT_ICON_POS_HIGH = (108, 32)
28
-INSRT_ICON_POS = (108, 18)
29
-INSRT_ICON_POS_SMALL = (108, 6)
30
-SYNC_ICON_POS_HIGH = (88, 12)
31
-
32
+LOCK_POS = (34, 19)
33
+LOCK_POS_HIGH = (34, 35)
34
+LOCK_POS_SMALL = (34, 9)
35
+INSRT_ICON_POS_HIGH = (134, 32)
36
+INSRT_ICON_POS = (134, 18)
37
+INSRT_ICON_POS_SMALL = (134, 6)
38
+SYNC_ICON_POS_HIGH = (116, 34)
39
+SYNC_ICON_POS = (116, 21)
40
+SYNC_ICON_POS_SMALL = (116, 8)
41
+
42
# tracks column icons
43
FULL_LOCK_ICON = None
44
TRACK_BG_ICON = None
45
46
47
def set_tracks_height_consts():
48
global ID_PAD_Y_HIGH, ID_PAD_Y, ID_PAD_Y_SMALL, MUTE_ICON_POS, MUTE_ICON_POS_NORMAL, \
49
- MUTE_ICON_POS_HIGH, LOCK_POS, INSRT_ICON_POS, INSRT_ICON_POS_SMALL, INSRT_ICON_POS_HIGH, \
50
- WAVEFORM_PAD_LARGE, WAVEFORM_PAD_SMALL, HEIGHT, WAVEFORM_PAD_HIGH
51
+ MUTE_ICON_POS_HIGH, LOCK_POS, LOCK_POS_HIGH, LOCK_POS_SMALL, INSRT_ICON_POS, INSRT_ICON_POS_SMALL, INSRT_ICON_POS_HIGH, \
52
+ WAVEFORM_PAD_LARGE, WAVEFORM_PAD_SMALL, HEIGHT, WAVEFORM_PAD_HIGH, SYNC_ICON_POS_HIGH, SYNC_ICON_POS, SYNC_ICON_POS_SMALL
53
54
if editorpersistance.prefs.tracks_scale == appconsts.TRACKS_SCALE_DOUBLE:
55
HEIGHT = appconsts.TLINE_HEIGHT
56
ID_PAD_Y_HIGH = 66
57
ID_PAD_Y = 41
58
ID_PAD_Y_SMALL = 16
59
- MUTE_ICON_POS = (5, 7)
60
- MUTE_ICON_POS_NORMAL = (5, 31)
61
- MUTE_ICON_POS_HIGH = (5, 55)
62
- LOCK_POS = (25, 2)
63
- INSRT_ICON_POS_HIGH = (108, 66)
64
- INSRT_ICON_POS = (108, 43)
65
- INSRT_ICON_POS_SMALL = (108, 18)
66
+ MUTE_ICON_POS = (5, 16)
67
+ MUTE_ICON_POS_NORMAL = (5, 40)
68
+ MUTE_ICON_POS_HIGH = (5, 64)
69
+ LOCK_POS = (34, 45)
70
+ LOCK_POS_HIGH = (34, 69)
71
+ LOCK_POS_SMALL = (34, 21)
72
+ INSRT_ICON_POS_HIGH = (134, 66)
73
+ INSRT_ICON_POS = (134, 43)
74
+ INSRT_ICON_POS_SMALL = (134, 18)
75
WAVEFORM_PAD_LARGE = 77
76
WAVEFORM_PAD_SMALL = 33
77
+ SYNC_ICON_POS_HIGH = (116, 70)
78
+ SYNC_ICON_POS = (116, 45)
79
+ SYNC_ICON_POS_SMALL = (116, 20)
80
elif editorpersistance.prefs.tracks_scale == appconsts.TRACKS_SCALE_ONE_AND_HALF:
81
HEIGHT = appconsts.TLINE_HEIGHT
82
ID_PAD_Y_HIGH = 48
83
84
MUTE_ICON_POS = (5, 10)
85
MUTE_ICON_POS_NORMAL = (5, 30)
86
MUTE_ICON_POS_HIGH = (5, 49)
87
- LOCK_POS = (25, 2)
88
- INSRT_ICON_POS_HIGH = (108, 51)
89
- INSRT_ICON_POS = (108, 32)
90
- INSRT_ICON_POS_SMALL = (108, 12)
91
+ LOCK_POS = (34, 35)
92
+ LOCK_POS_HIGH = (34, 54)
93
+ LOCK_POS_SMALL = (34, 15)
94
+ INSRT_ICON_POS_HIGH = (134, 51)
95
+ INSRT_ICON_POS = (134, 32)
96
+ INSRT_ICON_POS_SMALL = (134, 12)
97
WAVEFORM_PAD_LARGE = 47
98
WAVEFORM_PAD_SMALL = 20
99
WAVEFORM_PAD_HIGH = 77
100
+ SYNC_ICON_POS_HIGH = (116, 53)
101
+ SYNC_ICON_POS = (116, 34)
102
+ SYNC_ICON_POS_SMALL = (116, 14)
103
104
def set_dark_bg_color():
105
global BG_COLOR
106
107
BG_COLOR = (35.0/255.0, 35.0/255.0, 35.0/255.0)
108
109
def _load_pixbuf(icon_name, double_for_double_track_heights=False):
110
- if double_for_double_track_heights == True:
111
- return guiutils.get_double_scaled_cairo_image(icon_name)
112
- else:
113
- return cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + icon_name)
114
+ return cairo.ImageSurface.create_from_png(respaths.IMAGE_PATH + icon_name)
115
116
def set_ref_line_y(allocation):
117
"""
118
119
cr.set_source_rgb(*BG_COLOR)
120
cr.fill()
121
122
+ # Draw track label.
123
+ if track.info_label != "":
124
+ layout = PangoCairo.create_layout(cr)
125
+ text = track.info_label
126
+ desc = Pango.FontDescription("Sans Bold 10")
127
+ layout.set_text(text, -1)
128
+ layout.set_font_description(desc)
129
+ w, h = layout.get_size()
130
+ width = w / Pango.SCALE
131
+ self.create_round_rect_path(cr, 6, y + 4, width + 8, 16, radius=4.0)
132
+ cr.set_source_rgba(0.9, 0.9, 0.9, 0.6)
133
+ cr.fill()
134
+ cr.move_to(11, y + 2)
135
+ cr.set_source_rgba(0.2, 0.2, 0.2, 0.8)
136
+ PangoCairo.update_layout(cr, layout)
137
+ PangoCairo.show_layout(cr, layout)
138
+
139
+
140
def draw_compositors(self, cr):
141
if current_sequence().compositing_mode == appconsts.COMPOSITING_MODE_STANDARD_FULL_TRACK:
142
return
143
144
self.switch_testers =
145
146
# Active area tester
147
- center_width = COLUMN_WIDTH - COLUMN_LEFT_PAD - ACTIVE_SWITCH_WIDTH
148
- tester = ValueTester(COLUMN_LEFT_PAD + center_width, COLUMN_WIDTH,
149
+ center_width = COLUMN_WIDTH - ACTIVE_SWITCH_WIDTH
150
+ tester = ValueTester(center_width, COLUMN_WIDTH,
151
self.active_listener)
152
self.switch_testers.append(tester)
153
154
155
# NOTE: There was a left column of active areas similar to active switch
156
# so this is still called 'center' even when it is the left side of two active
157
# areas.
158
- tester = ValueTester(COLUMN_LEFT_PAD, COLUMN_WIDTH - ACTIVE_SWITCH_WIDTH,
159
+ tester = ValueTester(0, COLUMN_WIDTH - ACTIVE_SWITCH_WIDTH,
160
self.center_listener)
161
self.switch_testers.append(tester)
162
163
164
165
def draw_track(self, cr, track, y, is_insert_track):
166
# Draw track info area.
167
- center_width = COLUMN_WIDTH - COLUMN_LEFT_PAD - ACTIVE_SWITCH_WIDTH
168
- rect = (COLUMN_LEFT_PAD - 1, y, center_width + 1, track.height)
169
- grad = cairo.LinearGradient (COLUMN_LEFT_PAD, y, COLUMN_LEFT_PAD, y + track.height)
170
+ center_width = COLUMN_WIDTH - ACTIVE_SWITCH_WIDTH
171
+ rect = (1, y, center_width + 1, track.height)
172
+ grad = cairo.LinearGradient (0, y, 0, y + track.height)
173
self._add_gradient_color_stops(grad, track)
174
cr.rectangle(*rect)
175
cr.set_source(grad)
176
177
self.draw_edge(cr, rect)
178
179
# Draw active switch bg end edge.
180
- rect = (COLUMN_LEFT_PAD + center_width - 1, y, ACTIVE_SWITCH_WIDTH + 1, track.height)
181
+ rect = (center_width - 1, y, ACTIVE_SWITCH_WIDTH + 1, track.height)
182
cr.rectangle(*rect)
183
if track.active:
184
if track == current_sequence().get_first_active_track():
185
cr.set_source_rgb(*COLUMN_ACTIVE_COLOR)
186
else:
187
- grad = cairo.LinearGradient(COLUMN_LEFT_PAD + center_width, y,
188
- COLUMN_LEFT_PAD + center_width, y + track.height)
189
+ grad = cairo.LinearGradient(center_width, y,
190
+ center_width, y + track.height)
191
self._add_gradient_color_stops(grad, track)
192
cr.set_source(grad)
193
else:
194
195
text_y = ID_PAD_Y
196
elif track.height == appconsts.TRACK_HEIGHT_SMALL:
197
text_y = ID_PAD_Y_SMALL
198
- cr.move_to(COLUMN_LEFT_PAD + ID_PAD_X, y + text_y)
199
+ cr.move_to(ID_PAD_X, y + text_y)
200
PangoCairo.update_layout(cr, layout)
201
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/tools/gmic.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/tools/gmic.py
Changed
29
1
2
3
app_icon = GdkPixbuf.Pixbuf.new_from_file(respaths.IMAGE_PATH + "flowbladetoolicon.png")
4
self.set_icon(app_icon)
5
- hamburger_launcher_surface = guiutils.get_double_scaled_cairo_image("hamburger.png")
6
- if guiutils.double_icon_size() == False:
7
- psize = 22
8
- else:
9
- psize = 44
10
+ hamburger_launcher_surface = guiutils.get_cairo_image("hamburger")
11
+ psize = 22
12
self.hamburger_launcher = toolguicomponents.PressLaunchSurface(self.hamburger_launch_pressed, hamburger_launcher_surface, psize, psize)
13
#self.hamburger_launcher.connect_launched_menu(_hamburger_menu)
14
15
16
pos_bar_frame.set_margin_bottom(9)
17
pos_bar_frame.set_margin_start(6)
18
pos_bar_frame.set_margin_end(2)
19
-
20
- if guiutils.double_icon_size():
21
- pos_bar_frame_temp = Gtk.VBox(False, 0)
22
- pos_bar_frame_temp.pack_start(Gtk.Label(), True, True, 0)
23
- pos_bar_frame_temp.pack_start(pos_bar_frame, False, False, 0)
24
- pos_bar_frame_temp.pack_start(Gtk.Label(), True, True, 0)
25
- pos_bar_frame = pos_bar_frame_temp
26
27
self.control_buttons = glassbuttons.GmicButtons()
28
pressed_callback_funcs = prev_pressed,
29
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/tools/scripttool.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/tools/scripttool.py
Changed
26
1
2
# ---------------------------------------------------------------------- TOP ROW
3
app_icon = GdkPixbuf.Pixbuf.new_from_file(respaths.IMAGE_PATH + "flowbladetoolicon.png")
4
self.set_icon(app_icon)
5
- hamburger_launcher_surface = guiutils.get_double_scaled_cairo_image("hamburger.png")
6
- if guiutils.double_icon_size():
7
- psize = 22
8
- else:
9
- psize = 44
10
+ hamburger_launcher_surface = guiutils.get_cairo_image("hamburger")
11
+ psize = 22
12
self.hamburger_launcher = toolguicomponents.PressLaunchSurface(self.hamburger_launch_pressed_popover, hamburger_launcher_surface, psize, psize)
13
self.hamburger_launcher.widget.set_margin_bottom(7)
14
15
16
_window.render_percentage.set_markup("<small>" + _("Render stopped!") + "</small>")
17
self.set_render_stopped_gui_state()
18
19
- def show_progress(self, persentage, fraction, set_stopped):
20
- _window.render_percentage.set_markup(persentage)
21
+ def show_progress(self, percentage, fraction, set_stopped):
22
+ _window.render_percentage.set_markup(percentage)
23
_window.render_progress_bar.set_fraction(fraction)
24
if set_stopped:
25
self.set_render_stopped_gui_state()
26
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/tools/stabilizedvideoheadless.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/tools/stabilizedvideoheadless.py
Changed
19
1
2
3
if self.abort == True:
4
self.render_player.shutdown()
5
- os._exit(0) # We are having some issues with causing prosessor usage even after reaching here.
6
+ os._exit(0) # We are having some issues with causing processor usage even after reaching here.
7
return
8
9
fraction = self.render_player.get_render_fraction()
10
11
_render_thread = None
12
13
self.render_player.shutdown()
14
- os._exit(0) # We are having some issues with causing prosessor usage even after reaching here.
15
+ os._exit(0) # We are having some issues with causing processor usage even after reaching here.
16
17
def check_abort_requested(self):
18
self.abort = ccrutils.abort_requested()
19
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/tools/titler.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/tools/titler.py
Changed
19
1
2
title_data_shallow = copy.copy(_titler_data)
3
title_data_shallow.destroy_pango_layouts()
4
title_data = copy.deepcopy(title_data_shallow)
5
-
6
- print("show_info 1")
7
- #self.show_info(_("Saved Title") + " '" + name + "'.")
8
9
open_title_item_thread = OpenTitlerItemThread(name, save_path, title_data, self.view_editor)
10
open_title_item_thread.start()
11
12
global _titler_lastdir
13
_titler_lastdir = dirname
14
15
- print("show_info 2")
16
#self.show_info(_("Saved Graphic."))
17
18
open_file_thread = OpenFileThread(save_path, self.view_editor)
19
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/tools/trackingheadless.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/tools/trackingheadless.py
Changed
10
1
2
ccrutils.write_completed_message()
3
4
_render_thread = None
5
- os._exit(0) # We are having some issues with causing prosessor usage even after reaching here.
6
+ os._exit(0) # We are having some issues with causing processor usage even after reaching here.
7
8
def check_abort_requested(self):
9
self.abort = ccrutils.abort_requested()
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/trackaction.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/trackaction.py
Changed
166
1
2
This module handles track actions; mute, change active state, size change.
3
"""
4
5
-from gi.repository import GLib
6
+from gi.repository import GLib, Gtk
7
8
import appconsts
9
import audiomonitoring
10
+import dialogutils
11
import gui
12
import guipopover
13
import editorstate
14
15
track.edit_freedom = appconsts.FREE
16
updater.repaint_tline()
17
18
+def edit_info_label(track_index):
19
+ track = get_track(track_index)
20
+ dialog, entry = dialogutils.get_single_line_text_input_dialog(30, 130,
21
+ _("Set Track Info Text"),
22
+ _("Set"),
23
+ _("Track Info Text:"),
24
+ track.info_label)
25
+ dialog.connect('response', _set_track_info_text_callback, entry, track)
26
+ dialog.show_all()
27
+
28
+def _set_track_info_text_callback(dialog, response_id, entry, track):
29
+ if response_id == Gtk.ResponseType.ACCEPT:
30
+ track.info_label = entry.get_text()
31
+ updater.repaint_tline()
32
+
33
+ dialog.destroy()
34
35
def set_track_sync(track_index):
36
child_track = get_track(track_index)
37
syncsplitevent.set_track_clips_sync(child_track)
38
39
-def reset_treack_sync(track_index):
40
+def set_track_sync_from_popover(track_index):
41
+
42
+ child_track = get_track(track_index)
43
+ syncsplitevent.set_track_clips_sync(child_track)
44
+
45
+def reset_track_sync(track_index):
46
child_track = get_track(track_index)
47
parent_track = child_track.parent_track
48
syncsplitevent.do_set_track_clips_sync(child_track, parent_track)
49
50
set_track_normal_height(track_id)
51
52
def track_center_pressed(data):
53
+
54
if data.event.button == 1:
55
# handle possible mute icon presses
56
press_x = data.event.x
57
58
if track == None:
59
return
60
y_off = press_y - tlinewidgets._get_track_y(track.id)
61
- ICON_WIDTH = 14
62
- ICON_HEIGHT = 10
63
-
64
- X_CORR_OFF = 4 # icon edge not on image left edge
65
- if press_x > tlinewidgets.COLUMN_LEFT_PAD + X_CORR_OFF and press_x < tlinewidgets.COLUMN_LEFT_PAD + ICON_WIDTH + X_CORR_OFF:
66
- # Mute icon x area hit
67
- ix, iy = tlinewidgets.MUTE_ICON_POS
68
- if track.height == appconsts.TRACK_HEIGHT_HIGH:
69
- ix, iy = tlinewidgets.MUTE_ICON_POS_HIGH
70
- elif track.height == appconsts.TRACK_HEIGHT_NORMAL:
71
- ix, iy = tlinewidgets.MUTE_ICON_POS_NORMAL
72
-
73
- if track.id >= current_sequence().first_video_index:
74
- # Video tracks
75
- # Test mute switches
76
- if y_off > iy and y_off < iy + ICON_HEIGHT:
77
+ AUDIO_ICON_WIDTH = 12
78
+ VIDEO_ICON_WIDTH = 14
79
+ AUDIO_ICON_X = 7
80
+ VIDEO_ICON_X = AUDIO_ICON_X + AUDIO_ICON_WIDTH
81
+ ICON_HEIGHT = 22
82
+
83
+ ix, iy = tlinewidgets.MUTE_ICON_POS
84
+ if track.height == appconsts.TRACK_HEIGHT_HIGH:
85
+ ix, iy = tlinewidgets.MUTE_ICON_POS_HIGH
86
+ elif track.height == appconsts.TRACK_HEIGHT_NORMAL:
87
+ ix, iy = tlinewidgets.MUTE_ICON_POS_NORMAL
88
+
89
+ new_mute_state = track.mute_state
90
+
91
+ if track.id >= current_sequence().first_video_index:
92
+ # Video tracks
93
+ # Test mute switches
94
+ if y_off > iy and y_off < iy + ICON_HEIGHT:
95
+ if press_x > VIDEO_ICON_X and press_x < VIDEO_ICON_X + VIDEO_ICON_WIDTH:
96
# Video mute icon hit
97
if track.mute_state == appconsts.TRACK_MUTE_NOTHING:
98
new_mute_state = appconsts.TRACK_MUTE_VIDEO
99
100
new_mute_state = appconsts.TRACK_MUTE_ALL
101
elif track.mute_state == appconsts.TRACK_MUTE_ALL:
102
new_mute_state = appconsts.TRACK_MUTE_AUDIO
103
- elif y_off > iy + ICON_HEIGHT and y_off < iy + ICON_HEIGHT * 2:
104
+ elif press_x > AUDIO_ICON_X and press_x < AUDIO_ICON_X + AUDIO_ICON_WIDTH:
105
# Audio mute icon hit
106
if track.mute_state == appconsts.TRACK_MUTE_NOTHING:
107
new_mute_state = appconsts.TRACK_MUTE_AUDIO
108
109
new_mute_state = appconsts.TRACK_MUTE_NOTHING
110
elif track.mute_state == appconsts.TRACK_MUTE_ALL:
111
new_mute_state = appconsts.TRACK_MUTE_VIDEO
112
+ else:
113
+ # Audio tracks
114
+ # Test mute switches
115
+ if y_off > iy and y_off < iy + ICON_HEIGHT \
116
+ and press_x > AUDIO_ICON_X and press_x < AUDIO_ICON_X + AUDIO_ICON_WIDTH:
117
+ if track.mute_state == appconsts.TRACK_MUTE_VIDEO:
118
+ new_mute_state = appconsts.TRACK_MUTE_ALL
119
else:
120
- return
121
- else:
122
- # Audio tracks
123
- # Test mute switches
124
- iy = iy + 6 # Mute icon is lower on audio tracks
125
- if y_off > iy and y_off < iy + ICON_HEIGHT:
126
- if track.mute_state == appconsts.TRACK_MUTE_VIDEO:
127
- new_mute_state = appconsts.TRACK_MUTE_ALL
128
- else:
129
- new_mute_state = appconsts.TRACK_MUTE_VIDEO
130
- else:
131
- return
132
- # Update track mute state
133
- current_sequence().set_track_mute_state(track.id, new_mute_state)
134
-
135
- audiomonitoring.update_mute_states()
136
- gui.tline_column.widget.queue_draw()
137
+ new_mute_state = appconsts.TRACK_MUTE_VIDEO
138
+
139
+ if new_mute_state == track.mute_state:
140
+ return # Don't update if nothing hit.
141
+
142
+ # Update track mute state
143
+ current_sequence().set_track_mute_state(track.id, new_mute_state)
144
+
145
+ audiomonitoring.update_mute_states()
146
+ gui.tline_column.widget.queue_draw()
147
148
if data.event.button == 3:
149
global _menu_track_index # popover + gio.actions just wont allow easily packing track to go, so we're going global
150
151
_track_menu_item_activated,
152
_track_menu_height_activated)
153
154
+
155
+
156
POPUP_HANDLERS = {"lock":lock_track,
157
"unlock":unlock_track,
158
"mute_track":mute_track,
159
"clearsync":clear_track_sync,
160
"resync":resync_track,
161
"setsync":set_track_sync,
162
- "ressetsync":reset_treack_sync}
163
+ "setsyncfrompopover":set_track_sync_from_popover,
164
+ "resetsync":reset_track_sync,
165
+ "infolabel":edit_info_label}
166
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/Flowblade/updater.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/Flowblade/updater.py
Changed
17
1
2
3
css_str = "#player-bar { background-color: #464646; border-radius: 10px;}"
4
gui.apply_widget_css_class_style_from_string(gui.editor_window.player_buttons_row, css_str)
5
- gui.editor_window.monitor_clip_type.widget.queue_draw()
6
7
gui.pos_bar.widget.grab_focus()
8
gui.media_list_view.widget.queue_draw()
9
10
11
css_str = "#player-bar { background-color: #363636; border-radius: 10px;}"
12
gui.apply_widget_css_class_style_from_string(gui.editor_window.player_buttons_row, css_str)
13
- gui.editor_window.monitor_clip_type.widget.queue_draw()
14
15
gui.monitor_switch.widget.queue_draw()
16
repaint_tline()
17
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/docs/CREATING_TRANSLATION.md -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/docs/CREATING_TRANSLATION.md
Changed
10
1
2
* A folder named with the LANGUAGE_CODE for your language can be found in the ``/locale`` folder
3
* Inside that folder is a ``/LC_MESSAGES`` folder in which there is a file called ``flowblade.po``. This is the file used to create the translation.
4
* You can use program **Poedit** (or **Poedit2**) to edit the ``flowblade.po`` file. These applications often compile the translation on save too, and if not, use the compile command below.
5
- * **or** you can open the file ``flowblade.po`` in a text editor. Translations are given by writing the the translations inside quotes on lines staring with text ``msgstr``. To translate the menu item *Open...* you would need to fill the ``msgstr`` in example below:
6
+ * **or** you can open the file ``flowblade.po`` in a text editor. Translations are given by writing the translations inside quotes on lines staring with text ``msgstr``. To translate the menu item *Open...* you would need to fill the ``msgstr`` in example below:
7
```bash
8
#: useraction.py:489
9
msgid "Open.."
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/docs/RELEASE_NOTES.md -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/docs/RELEASE_NOTES.md
Changed
97
1
2
# Release Notes
3
4
+## FLOWBLADE 2.20
5
+Date: March 25, 2025
6
+
7
+We have now moved to SDL2 video playback for Flatpak and all systems with MLT 7.30 or higher.
8
+
9
+Video playback for native Wayland without XWayland or for Gtk 4 (that does not support the per widget Xwindow paradigm) does not currently seem possible with SDL. Moving forward we will develop some alternative video display approach.
10
+
11
+### Sync editing improvements
12
+
13
+A large number of changes were made to improve Flowblade sync editing worflow:
14
+
15
+* New track sync actions:
16
+
17
+ * **Sync All Clips Action...** sets all clips in Track to be parented to closest clip on target Track. Target Track is remembered to enable single action update feature, see below.
18
+ * **Update Sync to Clips' Positions** updates parenting sync to current positions to relative to Track that was previous selected as parenting target Track.
19
+
20
+* Sync parent clips can now be on any track, not just V1. Track V1 can now also contain child clips.
21
+
22
+* Clips can now be automatically audio sync split when added to user defined set of Tracks.
23
+
24
+* Audio splits can be set to go on mirrored tracks instead of always going on track A1
25
+
26
+* Clip multiselection popup offers now *Resync*, *Clear Sync* or *Set Parent Clip* actions.
27
+
28
+* New delete edits:
29
+
30
+ * Box selection delete and lift.
31
+ * Single and multiselection Ripple Delete Range action.
32
+
33
+* Clip end trims can now be done in *overwrite* mode which help maintaining sync between tracks.
34
+
35
+### Sequence Link Container Clips
36
+
37
+New **Sequence Link Container Clips** feature streamlines workflow where *Sequences* are used as parts of another *Sequence*. **Sequence Link Container Clips** can be updated to display changed contents of another *Sequence* without having to manually create a new clip and replace old clip on *Timeline*.
38
+
39
+### Preset keyframe animations
40
+
41
+Filters **Position Scale** and **Position Scale Rotate** have a new feature making it possible to add some frequently needed animations such as slide-ins and zooms in a single action.
42
+
43
+Feature is available in keyframe editor hamburger menu when selecting item **Add Preset Keyframed Movement...**.
44
+
45
+#### Monitor player buttons Row UX update
46
+
47
+Though perfectly functional, the monitor player buttons row was always visually a bit rough. We did a visual and functional update in this area, switched to a using single centered Play/Stop button, moved marks buttons to the side and made larger the visual difference between displaying Timeline and Clips in the monitor.
48
+
49
+In a related update the timecode displays were made to display the active part of timecode in a brighter color to improve readability.
50
+
51
+### New features
52
+
53
+* Rendered **Stabilized Media Item** creation is now possible.
54
+* **Duplicate Sequence** feature allows creating copies of *Sequences*.
55
+* **Generator Templates** feature makes possible to create **Generators** with user set properties to avoid having to set properties multiple times when creating **Generators**.
56
+
57
+### Double sized icons deprecated
58
+
59
+Double sized icons preference was removed. The results were always visually unsatisfactory. Tracks scaling preference remains, and when used in combination with scaling options provided by desktop environments it be possible to always achieve good results.
60
+
61
+### Contributions
62
+
63
+* **luzpaz** contributed a patch fixing large number of typos.
64
+
65
+### New small features and bug fixes
66
+
67
+* Zoom and shakiness parameters were activated for Stabilization filter.
68
+* Add multi-item popup menu to Media Panel.
69
+* Add 'Delete' item to Media Panel hamburger menu.
70
+* Add feature to open keyframe editor params parameter in Keyframe Tool.
71
+* Add Open in Edit Panel feature to Keyframe Tool.
72
+* Add disable clip end drags when selected feature to improve targeting small clips.
73
+* Add wide Slip trim activation area preference.
74
+* Feature to delete motion tracking data to make motion tracking more manageable.
75
+* Fix off by one issue with track syncs.
76
+* Make Media Items grab keyboard focus when selected with hamburger menu.
77
+* Add pixel format and colorspace info to file properties dialog.
78
+* Clone sync data for cut clip clones.
79
+* Fix Credit Scroll typo.
80
+* Drop cyan color from box selection display.
81
+* Updated create bindings documentation.
82
+* Make second window part of applica too to fix non-working menu actions.
83
+* Replace Pattern Producer file filering item with Container option.
84
+* Process shutdown fixes.
85
+* Show consumer type in env dialog.
86
+* Delete consumer start/stop hack.
87
+* Fix media item gmic icon bug.
88
+* Fix paste append off by one and multitrack bugs.
89
+* Add Filter Stack move arrows.
90
+* Fix Filter editing file select button replacement.
91
+* Add default container encoding options feature.
92
+* Fix Container Clips losing sync on render.
93
+
94
## FLOWBLADE 2.18.1
95
Date: February 17, 2025
96
97
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/docs/creating_user_folder_bindings.md -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/docs/creating_user_folder_bindings.md
Changed
10
1
2
#### Configure and build
3
With terminal still open in **\<ROOT_DIR\>**.
4
```bash
5
-cmake -DCMAKE_BUILD_TYPE=Release -DSWIG_PYTHON=ON -DMOD_GLAXNIMATE_QT6=OFF -DMOD_GLAXNIMATE=OFF -DMOD_QT=OFF -DMOD_QT6=OFF -DMOD_MOVIT=OFF -DMOD_OPENCV=ON -S ./mlt -B ./build
6
+cmake -DCMAKE_BUILD_TYPE=Release -DSWIG_PYTHON=ON -DMOD_GLAXNIMATE_QT6=OFF -DMOD_GLAXNIMATE=OFF -DMOD_QT=OFF -DMOD_QT6=OFF -DMOD_MOVIT=ON -DMOD_OPENCV=ON -S ./mlt -B ./build
7
8
cmake --build ./build --config Release
9
```
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/flowblade -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/flowblade
Changed
10
1
2
import sys
3
4
5
-print ("FLOWBLADE MOVIE EDITOR 2.20")
6
+print ("FLOWBLADE MOVIE EDITOR 2.22")
7
print ("---------------------------")
8
9
# Get launch script dir
10
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/installdata/io.github.jliljebl.Flowblade.appdata.xml -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/installdata/io.github.jliljebl.Flowblade.appdata.xml
Changed
17
1
2
</screenshots>
3
<content_rating type="oars-1.1" />
4
<releases>
5
+ <release version="2.22" date="2025-6-6">
6
+ <description>
7
+ <p>Features:</p>
8
+ <ul>
9
+ <li>New Keyframe types</li>
10
+ <li>New GUI editors for filters</li>
11
+ </ul>
12
+ </description>
13
+ </release>
14
<release version="2.20" date="2025-3-24">
15
<description>
16
<p>New features:</p>
17
_service:obs_scm:flowblade-2.20.obscpio/flowblade-trunk/setup.py -> _service:obs_scm:flowblade-2.22.obscpio/flowblade-trunk/setup.py
Changed
10
1
2
locale_files.append(filepath)
3
4
setup( name='flowblade',
5
- version='2.20',
6
+ version='2.22',
7
author='Janne Liljeblad',
8
author_email='janne.liljeblad at gmail dot com',
9
description='Non-linear video editor',
10
_service:obs_scm:flowblade.obsinfo
Changed
9
1
2
name: flowblade
3
-version: 2.20
4
-mtime: 1742851205
5
-commit: 1342c4ccd2ccdf338f775f0117f01b6cf79c3b3f
6
+version: 2.22
7
+mtime: 1749195838
8
+commit: afe12336f1e731f1269726afe77699ecabfea474
9