Skip to content

Commit 9eb1c7d

Browse files
committed
Adding new Experimental category and "Enable Experimental Timeline" option in preferences, plus a new dependency option for preferences.
1 parent 8c5cf64 commit 9eb1c7d

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

src/classes/app.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ def __init__(self, *args, **kwargs):
128128
# Init data objects
129129
self.settings = settings.SettingStore(parent=self)
130130
self.settings.load()
131+
self.apply_timeline_backend_preference()
131132
self.project = project_data.ProjectDataStore()
132133
self.updates = updates.UpdateManager()
133134
# It is important that the project is the first listener if the key gets update
@@ -201,6 +202,25 @@ def check_libopenshot_version(self, info, openshot):
201202
level="error",
202203
))
203204

205+
def apply_timeline_backend_preference(self):
206+
"""Select QWidget timeline backend if enabled and no CLI override exists."""
207+
if not hasattr(self, "settings"):
208+
return
209+
210+
# CLI flag overrides preference unless left as 'auto'
211+
if getattr(self.info, "WEB_BACKEND", "auto") != "auto":
212+
return
213+
214+
try:
215+
use_qwidget = bool(self.settings.get("qwidget-based-timeline"))
216+
except Exception:
217+
self.log.debug("Unable to read qwidget-based timeline setting", exc_info=True)
218+
return
219+
220+
if use_qwidget:
221+
self.info.WEB_BACKEND = "qwidget"
222+
self.log.info("Experimental timeline enabled via preferences; using QWidget backend.")
223+
204224
def gui(self):
205225
"""
206226
Initialize GUI and main window.
@@ -338,4 +358,3 @@ def onLogTheEnd():
338358
import logging
339359
log = logging.getLogger(".")
340360
log.debug('Failed to write session ended log', exc_info=1)
341-

src/settings/_default.settings

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,12 +431,21 @@
431431
"category": "General",
432432
"setting": "automatic_transitions"
433433
},
434+
{
435+
"value": false,
436+
"title": "Enable Experimental Timeline",
437+
"type": "bool",
438+
"restart": true,
439+
"category": "Experimental",
440+
"setting": "qwidget-based-timeline"
441+
},
434442
{
435443
"value": "start",
436444
"title": "Thumbnail Style",
437445
"type": "dropdown",
438446
"restart": false,
439447
"category": "Experimental",
448+
"dependency": "qwidget-based-timeline",
440449
"setting": "timeline-thumbnail-style",
441450
"translate_values": true,
442451
"values": [

src/windows/preferences.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ def __init__(self):
8888
if "setting" in item and "value" in item:
8989
self.params[item["setting"]] = item
9090

91+
# Track widgets and dependencies between settings
92+
self.setting_widgets = {}
93+
self.dependency_map = {}
94+
9195
# Connect signals
9296
self.txtSearch.textChanged.connect(self.txtSearch_changed)
9397
self.btnRestoreDefaults.clicked.connect(self.confirm_restore_defaults)
@@ -163,6 +167,10 @@ def Populate(self, filter=""):
163167
self.category_tabs = {}
164168
self.visible_category_names = {}
165169

170+
# Reset widget/dependency trackers each time preferences are rebuilt
171+
self.setting_widgets = {}
172+
self.dependency_map = {}
173+
166174
# Loop through settings and collect categories
167175
for item in self.settings_data:
168176
category = item.get("category")
@@ -438,16 +446,50 @@ def Populate(self, filter=""):
438446

439447
# Add widget to layout
440448
tabWidget.layout().addLayout(layout_hbox)
449+
self.register_setting_widget(param, widget, label)
441450
elif (label and filterFound):
442451
# Add widget to layout
443452
tabWidget.layout().addWidget(label)
444453

445454
# Add stretch to bottom of layout
446455
tabWidget.layout().addStretch()
447456

457+
self.apply_all_dependencies()
458+
448459
# Delete all tabs and widgets
449460
self.DeleteAllTabs(onlyInVisible=True)
450461

462+
def register_setting_widget(self, param, widget, label=None):
463+
"""Store widget references and register dependency relationships."""
464+
setting_name = param.get("setting")
465+
if not setting_name or not widget:
466+
return
467+
468+
self.setting_widgets[setting_name] = widget
469+
widget.setObjectName(setting_name)
470+
471+
dependency = param.get("dependency")
472+
if dependency:
473+
self.dependency_map.setdefault(dependency, []).append((widget, label))
474+
475+
def apply_all_dependencies(self):
476+
"""Apply dependency state to all registered widgets."""
477+
for setting_name in list(self.dependency_map.keys()):
478+
self.apply_dependency_state(setting_name)
479+
480+
def apply_dependency_state(self, setting_name):
481+
"""Enable/disable dependent widgets based on controller state."""
482+
controlled_widgets = self.dependency_map.get(setting_name, [])
483+
if not controlled_widgets:
484+
return
485+
486+
enabled = bool(self.s.get(setting_name))
487+
for widget, label in controlled_widgets:
488+
if widget:
489+
widget.setEnabled(enabled)
490+
if label:
491+
label.setEnabled(enabled)
492+
451493
def selectExecutable(self, widget, param):
452494
_ = get_app()._tr
453495

@@ -514,6 +556,10 @@ def bool_value_changed(self, widget, param, state):
514556
# Check for restart
515557
self.check_for_restart(param)
516558

559+
# Update any dependent widgets
560+
if param.get("setting"):
561+
self.apply_dependency_state(param["setting"])
562+
517563
def spinner_value_changed(self, param, value):
518564
# Save setting
519565
self.s.set(param["setting"], value)

0 commit comments

Comments
 (0)