From 7e2146de6c478f2771ff9ae0c9c8686b51c62d0d Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Mon, 8 Jul 2024 18:13:40 -0500 Subject: [PATCH 1/4] Prevent empty context menus from appearing on Property table view --- src/windows/views/properties_tableview.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/windows/views/properties_tableview.py b/src/windows/views/properties_tableview.py index b88f906a4..72551a831 100644 --- a/src/windows/views/properties_tableview.py +++ b/src/windows/views/properties_tableview.py @@ -779,7 +779,8 @@ def contextMenuEvent(self, event): self.menu = self.build_menu(self.choices, menu) # Show context menu (if any options present) - if self.menu.children(): + # There is always at least 1 QAction in an empty menu though + if len(self.menu.children()) > 1: self.menu.popup(event.globalPos()) def build_menu(self, data, parent_menu=None): From 8c4c76991842ed90d36f8ca1037ff1ebbc0ff060 Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Mon, 8 Jul 2024 18:15:10 -0500 Subject: [PATCH 2/4] Fixing Sentry #OPENSHOT-F2: IndexError: list index out of range when populating property model. --- src/windows/models/properties_model.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/windows/models/properties_model.py b/src/windows/models/properties_model.py index abc944f02..087b0536f 100644 --- a/src/windows/models/properties_model.py +++ b/src/windows/models/properties_model.py @@ -702,7 +702,9 @@ def set_property(self, property, filter, c, item_type, object_id=None): selected_choice = None if choices: - selected_choice = [c for c in choices if c["selected"] is True][0]["name"] + selected_choices = [c for c in choices if c.get("selected") is True] + if selected_choices: + selected_choice = selected_choices[0]["name"] # Hide filtered out properties if filter and filter.lower() not in _(label).lower(): From 10a24e53110d7998b30ab9a1f26e0d626a4b0384 Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Mon, 8 Jul 2024 18:27:01 -0500 Subject: [PATCH 3/4] Fixing Sentry #OPENSHOT-YG: IndexError: pop index out of range when moving unselected items up/down on Add to Timeline dialog. --- src/windows/add_to_timeline.py | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/windows/add_to_timeline.py b/src/windows/add_to_timeline.py index 990ef5a67..62b7c14de 100644 --- a/src/windows/add_to_timeline.py +++ b/src/windows/add_to_timeline.py @@ -61,16 +61,20 @@ def btnMoveUpClicked(self, checked): if self.treeFiles.selected: selected_index = self.treeFiles.selected.row() - # Ignore if empty files + # Ignore if empty files or no selection if not files or selected_index is None: return - # New index - new_index = max(selected_index - 1, 0) - log.info(new_index) + # Check if selected_index is within valid range + if 0 <= selected_index < len(files): + # New index + new_index = max(selected_index - 1, 0) - # Remove item and move it - files.insert(new_index, files.pop(selected_index)) + # Remove item and move it + files.insert(new_index, files.pop(selected_index)) + else: + log.warning(f"Invalid selected_index: {selected_index}, list length: {len(files)}") + return # Refresh tree self.treeFiles.refresh_view() @@ -90,16 +94,20 @@ def btnMoveDownClicked(self, checked): if self.treeFiles.selected: selected_index = self.treeFiles.selected.row() - # Ignore if empty files + # Ignore if empty files or no selection if not files or selected_index is None: return - # New index - new_index = min(selected_index + 1, len(files) - 1) - log.info(new_index) + # Check if selected_index is within valid range + if 0 <= selected_index < len(files): + # New index + new_index = min(selected_index + 1, len(files) - 1) - # Remove item and move it - files.insert(new_index, files.pop(selected_index)) + # Remove item and move it + files.insert(new_index, files.pop(selected_index)) + else: + log.warning(f"Invalid selected_index: {selected_index}, list length: {len(files)}") + return # Refresh tree self.treeFiles.refresh_view() From fddbdd0445309471f0ee6ead373b0a87ea129c1b Mon Sep 17 00:00:00 2001 From: Jonathan Thomas Date: Mon, 8 Jul 2024 21:01:31 -0500 Subject: [PATCH 4/4] Fixing Sentry #OPENSHOT-4D: Couldn't apply 'update' to update listener: . list index out of range. This was mostly caused by "load" UpdateActions, which have an empty list as a key. --- src/windows/models/properties_model.py | 2 +- src/windows/video_widget.py | 2 +- src/windows/views/timeline.py | 2 +- src/windows/views/timeline_backend/qwidget.py | 4 ++++ src/windows/views/zoom_slider.py | 4 ++++ 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/windows/models/properties_model.py b/src/windows/models/properties_model.py index 087b0536f..99b0db5dd 100644 --- a/src/windows/models/properties_model.py +++ b/src/windows/models/properties_model.py @@ -70,7 +70,7 @@ class PropertiesModel(updates.UpdateInterface): def changed(self, action): # Handle change - if action.key and action.key[0] in ["clips", "effects"] and action.type in ["update", "insert"]: + if len(action.key) >= 1 and action.key[0] in ["clips", "effects"] and action.type in ["update", "insert"]: log.debug(action.values) # Update the model data self.update_model(get_app().window.txtPropertyFilter.text()) diff --git a/src/windows/video_widget.py b/src/windows/video_widget.py index 4e30df7b1..83da93b48 100644 --- a/src/windows/video_widget.py +++ b/src/windows/video_widget.py @@ -52,7 +52,7 @@ class VideoWidget(QWidget, updates.UpdateInterface): # This method is invoked by the UpdateManager each time a change happens (i.e UpdateInterface) def changed(self, action): # Handle change - if (action.key and action.key[0] in [ + if (len(action.key) >= 1 and action.key[0] in [ "display_ratio", "pixel_ratio" ] or action.type in ["load"]): # Update display ratio (if found) diff --git a/src/windows/views/timeline.py b/src/windows/views/timeline.py index 77af21980..9a787e403 100644 --- a/src/windows/views/timeline.py +++ b/src/windows/views/timeline.py @@ -134,7 +134,7 @@ def changed(self, action): return # Bail out if change unrelated to webview - if action.key and action.key[0] not in ["clips", "effects", "duration", "layers", "markers"]: + if len(action.key) >= 1 and action.key[0] not in ["clips", "effects", "duration", "layers", "markers"]: log.debug(f"Skipping unneeded webview update for '{action.key[0]}'") return diff --git a/src/windows/views/timeline_backend/qwidget.py b/src/windows/views/timeline_backend/qwidget.py index d11483cb0..c1af2f0be 100644 --- a/src/windows/views/timeline_backend/qwidget.py +++ b/src/windows/views/timeline_backend/qwidget.py @@ -122,6 +122,10 @@ def get_html(self): # This method is invoked by the UpdateManager each time a change happens (i.e UpdateInterface) def changed(self, action): + # Ignore changes that don't affect this + if action and len(action.key) >= 1 and action.key[0].lower() in ["files", "history", "profile"]: + return + # Clear previous rects self.clip_rects.clear() self.clip_rects_selected.clear() diff --git a/src/windows/views/zoom_slider.py b/src/windows/views/zoom_slider.py index 3bdb5336c..28d5615ad 100644 --- a/src/windows/views/zoom_slider.py +++ b/src/windows/views/zoom_slider.py @@ -46,6 +46,10 @@ class ZoomSlider(QWidget, updates.UpdateInterface): # This method is invoked by the UpdateManager each time a change happens (i.e UpdateInterface) def changed(self, action): + # Ignore changes that don't affect this + if action and len(action.key) >= 1 and action.key[0].lower() in ["files", "history", "profile"]: + return + # Clear previous rects self.clip_rects.clear() self.clip_rects_selected.clear()