Changes of Revision 14

_service Changed
x
 
1
@@ -1,7 +1,7 @@
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,7 +2,7 @@
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
@@ -18,12 +18,14 @@
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
@@ -77,7 +79,7 @@
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
@@ -0,0 +1,559 @@
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
@@ -51,6 +51,7 @@
2
 import sys
3
 import time
4
 
5
+import animatedvalue
6
 import appconsts
7
 import audiomonitoring
8
 import audiowaveformrenderer
9
@@ -144,8 +145,6 @@
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
@@ -157,6 +156,7 @@
19
 assoc_file_path = None
20
 assoc_timeout_id = None
21
 
22
+
23
 def main(root_path):
24
     """
25
     Called at application start.
26
@@ -231,7 +231,10 @@
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
@@ -302,10 +305,6 @@
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
@@ -389,12 +388,6 @@
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
@@ -906,27 +899,6 @@
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
@@ -200,12 +200,6 @@
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
@@ -334,6 +328,7 @@
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
@@ -351,10 +346,75 @@
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
@@ -685,7 +685,7 @@
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
@@ -283,7 +283,6 @@
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
@@ -291,6 +290,47 @@
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
@@ -372,6 +412,13 @@
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
@@ -92,13 +92,8 @@
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
@@ -202,17 +197,35 @@
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
@@ -220,61 +233,29 @@
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
@@ -436,6 +417,74 @@
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
@@ -166,7 +166,13 @@
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
@@ -329,7 +335,7 @@
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
@@ -337,12 +343,38 @@
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
@@ -460,16 +460,7 @@
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
@@ -520,26 +511,8 @@
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
@@ -201,7 +201,7 @@
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
@@ -115,7 +115,7 @@
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
@@ -470,8 +470,6 @@
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
@@ -600,7 +598,7 @@
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
@@ -1276,7 +1276,7 @@
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
@@ -2729,6 +2729,48 @@
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
@@ -107,8 +107,8 @@
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
@@ -143,7 +143,8 @@
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
@@ -172,7 +173,7 @@
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
@@ -221,6 +222,7 @@
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
@@ -242,7 +244,8 @@
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
@@ -297,7 +300,8 @@
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
@@ -661,17 +665,19 @@
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
@@ -190,10 +190,10 @@
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
@@ -211,8 +211,6 @@
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
@@ -223,7 +221,6 @@
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
@@ -283,7 +280,7 @@
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
@@ -314,12 +311,9 @@
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
@@ -383,7 +377,7 @@
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
@@ -98,7 +98,7 @@
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
@@ -213,7 +213,8 @@
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
@@ -227,49 +228,16 @@
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
@@ -290,9 +258,7 @@
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
@@ -374,10 +340,6 @@
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
@@ -486,9 +448,7 @@
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
@@ -505,8 +465,32 @@
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
@@ -540,11 +524,8 @@
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
@@ -557,8 +538,12 @@
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
@@ -572,25 +557,14 @@
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
@@ -775,7 +749,7 @@
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
@@ -783,6 +757,15 @@
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
@@ -46,11 +46,10 @@
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
@@ -305,9 +304,6 @@
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
@@ -536,10 +532,6 @@
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
@@ -1658,32 +1658,18 @@
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
@@ -1874,20 +1860,17 @@
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
@@ -1908,15 +1891,6 @@
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
@@ -1939,7 +1913,7 @@
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
@@ -2186,24 +2160,24 @@
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
@@ -2213,16 +2187,7 @@
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
@@ -2607,12 +2572,8 @@
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
@@ -2627,17 +2588,15 @@
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
@@ -2729,10 +2688,6 @@
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
@@ -2757,20 +2712,12 @@
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
@@ -963,6 +963,10 @@
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
@@ -1004,9 +1008,9 @@
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
@@ -21,6 +21,7 @@
2
 
3
 import copy
4
 
5
+import animatedvalue
6
 import appconsts
7
 import callbackbridge
8
 import guipopover
9
@@ -153,12 +154,12 @@
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
@@ -805,7 +806,7 @@
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
@@ -817,7 +818,33 @@
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
@@ -29,7 +29,6 @@
2
 from gi.repository import GdkPixbuf
3
 
4
 import appconsts
5
-import editorpersistance
6
 import respaths
7
 import translations
8
 
9
@@ -159,7 +158,6 @@
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
@@ -167,84 +165,24 @@
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
@@ -46,6 +46,7 @@
2
 import movemodes
3
 import shortcuts
4
 import shortcutsquickeffects
5
+import syncsplitevent
6
 import render
7
 import targetactions
8
 import tlineaction
9
@@ -315,6 +316,14 @@
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
@@ -332,7 +341,7 @@
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
@@ -21,12 +21,15 @@
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
@@ -230,7 +233,14 @@
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
@@ -401,15 +411,29 @@
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
@@ -587,6 +611,7 @@
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
@@ -690,12 +715,8 @@
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
@@ -703,49 +724,29 @@
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
@@ -827,6 +828,250 @@
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
@@ -34,6 +34,7 @@
2
 from gi.repository import Pango, PangoCairo
3
 
4
 import appconsts
5
+import animatedvalue
6
 import cairoarea
7
 import callbackbridge
8
 import compositorfades
9
@@ -96,9 +97,13 @@
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
@@ -171,14 +176,21 @@
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
@@ -252,15 +264,25 @@
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
@@ -651,6 +673,10 @@
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
@@ -1026,16 +1052,27 @@
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
@@ -1225,52 +1262,69 @@
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
@@ -28,6 +28,7 @@
2
 import copy
3
 import math
4
 
5
+import animatedvalue
6
 import appconsts
7
 import clipeffectseditor
8
 import dialogutils
9
@@ -106,7 +107,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
@@ -114,9 +117,13 @@
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
@@ -658,13 +665,13 @@
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
@@ -683,20 +690,30 @@
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
@@ -994,7 +1011,8 @@
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
@@ -1040,6 +1058,7 @@
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
@@ -1047,7 +1066,7 @@
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
@@ -1055,6 +1074,7 @@
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
@@ -1064,6 +1084,7 @@
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
@@ -1072,7 +1093,8 @@
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
@@ -1629,24 +1651,34 @@
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
@@ -8,87 +8,87 @@
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
@@ -345,12 +345,12 @@
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
@@ -368,8 +368,8 @@
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
@@ -487,10 +487,13 @@
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
@@ -500,38 +503,38 @@
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
@@ -7,5 +7,5 @@
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
@@ -6,7 +6,7 @@
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
@@ -19,80 +19,80 @@
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
@@ -385,12 +385,12 @@
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
@@ -408,8 +408,8 @@
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
@@ -535,10 +535,14 @@
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
@@ -549,38 +553,38 @@
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
@@ -10,7 +10,7 @@
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
@@ -20,78 +20,78 @@
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
@@ -378,12 +378,12 @@
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
@@ -401,8 +401,8 @@
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
@@ -532,10 +532,14 @@
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
@@ -546,38 +550,38 @@
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
@@ -7,7 +7,7 @@
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
@@ -18,27 +18,27 @@
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
@@ -51,7 +51,7 @@
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
@@ -61,7 +61,7 @@
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
@@ -71,40 +71,40 @@
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
@@ -426,12 +426,12 @@
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
@@ -449,8 +449,8 @@
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
@@ -577,10 +577,14 @@
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
@@ -591,38 +595,38 @@
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
@@ -10,7 +10,7 @@
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
@@ -22,80 +22,80 @@
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
@@ -375,12 +375,12 @@
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
@@ -398,8 +398,8 @@
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
@@ -527,10 +527,14 @@
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
@@ -541,38 +545,38 @@
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
@@ -7,7 +7,7 @@
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
@@ -17,79 +17,79 @@
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
@@ -371,12 +371,12 @@
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
@@ -394,8 +394,8 @@
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
@@ -527,10 +527,14 @@
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
@@ -541,38 +545,38 @@
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
@@ -9,7 +9,7 @@
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
@@ -20,79 +20,79 @@
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
@@ -380,12 +380,12 @@
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
@@ -403,8 +403,8 @@
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
@@ -535,10 +535,14 @@
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
@@ -549,38 +553,38 @@
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
@@ -6,39 +6,39 @@
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
@@ -47,7 +47,7 @@
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
@@ -55,7 +55,7 @@
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
@@ -63,42 +63,42 @@
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
@@ -395,12 +395,12 @@
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
@@ -418,8 +418,8 @@
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
@@ -544,10 +544,14 @@
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
@@ -558,38 +562,38 @@
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
@@ -7,7 +7,7 @@
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
@@ -19,78 +19,78 @@
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
@@ -388,12 +388,12 @@
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
@@ -411,8 +411,8 @@
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
@@ -538,10 +538,14 @@
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
@@ -552,38 +556,38 @@
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
@@ -7,7 +7,7 @@
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
@@ -18,79 +18,79 @@
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
@@ -381,12 +381,12 @@
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
@@ -404,8 +404,8 @@
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
@@ -531,10 +531,14 @@
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
@@ -545,38 +549,38 @@
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
@@ -8,7 +8,7 @@
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
@@ -19,80 +19,80 @@
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
@@ -379,12 +379,12 @@
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
@@ -402,8 +402,8 @@
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
@@ -528,10 +528,14 @@
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
@@ -542,38 +546,38 @@
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
@@ -7,7 +7,7 @@
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
@@ -16,79 +16,79 @@
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
@@ -365,12 +365,12 @@
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
@@ -388,8 +388,8 @@
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
@@ -517,10 +517,14 @@
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
@@ -531,38 +535,38 @@
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
@@ -7,7 +7,7 @@
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
@@ -16,79 +16,79 @@
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
@@ -365,12 +365,12 @@
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
@@ -388,8 +388,8 @@
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
@@ -517,10 +517,14 @@
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
@@ -531,38 +535,38 @@
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
@@ -669,8 +669,7 @@
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
@@ -679,16 +678,13 @@
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
@@ -711,11 +707,6 @@
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
@@ -76,29 +76,18 @@
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
@@ -111,12 +100,7 @@
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
@@ -133,39 +117,6 @@
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
@@ -184,14 +135,9 @@
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
@@ -201,10 +147,6 @@
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
@@ -217,17 +159,17 @@
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
@@ -236,28 +178,28 @@
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
@@ -267,7 +209,7 @@
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
@@ -275,7 +217,7 @@
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
@@ -285,17 +227,13 @@
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
@@ -114,7 +114,7 @@
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
@@ -61,6 +61,7 @@
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
@@ -576,7 +577,7 @@
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
@@ -592,7 +593,7 @@
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
@@ -604,7 +605,7 @@
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
@@ -642,7 +643,7 @@
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
@@ -787,7 +788,7 @@
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
@@ -47,17 +47,13 @@
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
@@ -69,7 +65,7 @@
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
@@ -104,7 +100,7 @@
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
@@ -112,7 +108,7 @@
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
@@ -143,7 +139,7 @@
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
@@ -151,6 +147,7 @@
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
@@ -146,3 +146,6 @@
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
@@ -250,23 +250,12 @@
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
@@ -288,8 +277,6 @@
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
@@ -306,8 +293,6 @@
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
@@ -315,9 +300,8 @@
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
@@ -346,10 +330,6 @@
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
@@ -401,7 +381,6 @@
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
@@ -415,7 +394,6 @@
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
@@ -426,7 +404,7 @@
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
@@ -2197,7 +2197,7 @@
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
@@ -76,11 +76,11 @@
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
@@ -31,6 +31,7 @@
2
 
3
 from gi.repository import Gtk
4
 
5
+import animatedvalue
6
 import appconsts
7
 from editorstate import current_sequence
8
 import mlttransitions
9
@@ -182,6 +183,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
@@ -201,7 +205,7 @@
20
         editable_properties.append(ep)
21
     
22
     return editable_properties
23
-        
24
+
25
 # -------------------------------------------- property wrappers objs
26
 class AbstractProperty:
27
     """
28
@@ -700,12 +704,7 @@
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
@@ -730,12 +729,7 @@
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
@@ -855,7 +849,456 @@
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
@@ -76,6 +76,9 @@
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
@@ -904,6 +907,60 @@
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
@@ -1218,6 +1275,12 @@
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
@@ -26,6 +26,7 @@
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
@@ -247,17 +248,8 @@
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
@@ -272,17 +264,7 @@
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
@@ -295,17 +277,8 @@
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
@@ -322,17 +295,8 @@
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
@@ -372,17 +336,8 @@
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
@@ -405,7 +360,7 @@
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
@@ -417,10 +372,10 @@
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
@@ -430,7 +385,7 @@
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
@@ -439,6 +394,58 @@
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
@@ -450,44 +457,19 @@
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
@@ -65,11 +65,7 @@
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
@@ -28,27 +28,29 @@
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
@@ -931,12 +933,13 @@
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
@@ -1221,8 +1224,8 @@
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
@@ -1254,7 +1257,7 @@
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
@@ -57,7 +57,7 @@
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
@@ -69,8 +69,8 @@
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
@@ -80,16 +80,27 @@
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
@@ -103,7 +114,7 @@
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
@@ -116,7 +127,7 @@
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
@@ -131,10 +142,10 @@
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
@@ -144,13 +155,13 @@
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
@@ -158,7 +169,7 @@
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
@@ -183,7 +194,7 @@
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
@@ -193,7 +204,7 @@
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
@@ -205,7 +216,7 @@
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
@@ -295,7 +295,7 @@
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
@@ -98,7 +98,7 @@
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
@@ -106,5 +106,9 @@
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
@@ -99,7 +99,7 @@
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
@@ -107,5 +107,9 @@
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
@@ -121,6 +121,51 @@
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
@@ -292,6 +292,9 @@
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
@@ -421,6 +421,10 @@
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
@@ -151,12 +151,11 @@
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
@@ -165,6 +164,7 @@
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
@@ -187,6 +187,14 @@
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
@@ -269,6 +277,8 @@
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
@@ -278,10 +278,30 @@
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
@@ -299,13 +319,26 @@
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
@@ -472,7 +505,15 @@
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
@@ -181,7 +181,7 @@
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
@@ -840,7 +840,11 @@
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
@@ -909,6 +913,50 @@
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
@@ -80,11 +80,10 @@
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
@@ -94,19 +93,23 @@
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
@@ -415,23 +418,28 @@
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
@@ -440,13 +448,18 @@
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
@@ -455,10 +468,7 @@
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
@@ -2202,6 +2212,24 @@
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
@@ -2391,8 +2419,8 @@
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
@@ -2400,7 +2428,7 @@
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
@@ -2454,9 +2482,9 @@
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
@@ -2464,14 +2492,14 @@
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
@@ -2493,7 +2521,7 @@
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
@@ -581,11 +581,8 @@
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
@@ -652,13 +649,6 @@
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
@@ -688,11 +688,8 @@
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
@@ -1545,8 +1542,8 @@
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
@@ -112,7 +112,7 @@
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
@@ -127,7 +127,7 @@
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
@@ -797,9 +797,6 @@
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
@@ -817,7 +814,6 @@
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
@@ -156,7 +156,7 @@
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
@@ -22,10 +22,11 @@
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
@@ -76,12 +77,33 @@
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
@@ -351,6 +373,7 @@
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
@@ -359,22 +382,25 @@
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
@@ -384,7 +410,7 @@
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
@@ -394,24 +420,24 @@
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
@@ -421,10 +447,14 @@
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
@@ -465,7 +465,6 @@
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
@@ -524,7 +523,6 @@
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
@@ -31,7 +31,7 @@
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
@@ -1,5 +1,95 @@
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
@@ -31,7 +31,7 @@
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
@@ -24,7 +24,7 @@
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
@@ -21,6 +21,15 @@
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
@@ -50,7 +50,7 @@
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
@@ -1,4 +1,4 @@
2
 name: flowblade
3
-version: 2.20
4
-mtime: 1742851205
5
-commit: 1342c4ccd2ccdf338f775f0117f01b6cf79c3b3f
6
+version: 2.22
7
+mtime: 1749195838
8
+commit: afe12336f1e731f1269726afe77699ecabfea474
9