From ba6b52913cea8d939dd8efc8ef2970e7f8247487 Mon Sep 17 00:00:00 2001 From: zaina Date: Sat, 14 Jun 2025 17:44:42 +0200 Subject: [PATCH 1/5] Add tooltips and UI improvements to toolbar --- src/windows/main_window.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/windows/main_window.py b/src/windows/main_window.py index 9900830771..88d3550987 100644 --- a/src/windows/main_window.py +++ b/src/windows/main_window.py @@ -2979,10 +2979,15 @@ def setup_toolbars(self): self.filesActionGroup = QActionGroup(self) self.filesActionGroup.setExclusive(True) self.filesActionGroup.addAction(self.actionFilesShowAll) + self.actionFilesShowAll.setToolTip("Show all imported files") self.filesActionGroup.addAction(self.actionFilesShowVideo) + self.actionFilesShowVideo.setToolTip("Show only video files") self.filesActionGroup.addAction(self.actionFilesShowAudio) + self.actionFilesShowAudio.setToolTip("Show only audio files") self.filesActionGroup.addAction(self.actionFilesShowImage) + self.actionFilesShowImage.setToolTip("Show only image files") self.actionFilesShowAll.setChecked(True) + self.filesToolbar.addAction(self.actionFilesShowAll) self.filesToolbar.addAction(self.actionFilesShowVideo) self.filesToolbar.addAction(self.actionFilesShowAudio) @@ -2999,7 +3004,9 @@ def setup_toolbars(self): self.transitionsActionGroup = QActionGroup(self) self.transitionsActionGroup.setExclusive(True) self.transitionsActionGroup.addAction(self.actionTransitionsShowAll) + self.actionTransitionsShowAll.setToolTip("Show all transitions") self.transitionsActionGroup.addAction(self.actionTransitionsShowCommon) + self.actionTransitionsShowCommon.setToolTip("Show common transitions only") self.actionTransitionsShowAll.setChecked(True) self.transitionsToolbar.addAction(self.actionTransitionsShowAll) self.transitionsToolbar.addAction(self.actionTransitionsShowCommon) @@ -3016,8 +3023,11 @@ def setup_toolbars(self): self.effectsActionGroup = QActionGroup(self) self.effectsActionGroup.setExclusive(True) self.effectsActionGroup.addAction(self.actionEffectsShowAll) + self.actionEffectsShowAll.setToolTip("Show all effects") self.effectsActionGroup.addAction(self.actionEffectsShowVideo) + self.actionEffectsShowVideo.setToolTip("Show only video effects") self.effectsActionGroup.addAction(self.actionEffectsShowAudio) + self.actionEffectsShowAudio.setToolTip("Show only audio effects") self.actionEffectsShowAll.setChecked(True) self.effectsToolbar.addAction(self.actionEffectsShowAll) self.effectsToolbar.addAction(self.actionEffectsShowVideo) @@ -3076,6 +3086,7 @@ def setup_toolbars(self): self.sliderZoomWidget = ZoomSlider(self) self.sliderZoomWidget.setMinimumSize(200, 20) self.sliderZoomWidget.setZoomFactor(initial_scale) + self.sliderZoomWidget.setToolTip("Zoom in/out of the timeline") # add zoom widgets self.timelineToolbar.addWidget(self.sliderZoomWidget) From 7dd0010e8d593dc2802ea70e2948f45d3c3fbd04 Mon Sep 17 00:00:00 2001 From: zaina Date: Sun, 15 Jun 2025 18:23:33 +0200 Subject: [PATCH 2/5] PyQt6 --- src/windows/views/files_treeview.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/windows/views/files_treeview.py b/src/windows/views/files_treeview.py index d0d4485de5..a584f9a4f8 100644 --- a/src/windows/views/files_treeview.py +++ b/src/windows/views/files_treeview.py @@ -104,7 +104,8 @@ def contextMenuEvent(self, event): menu.addAction(self.win.actionFile_Properties) menu.addSeparator() - menu.addAction(self.win.actionRemove_from_Project) + confirm_action = menu.addAction(_("Remove from Project")) + confirm_action.triggered.connect(self.confirm_remove_file) menu.addSeparator() # Show menu @@ -261,6 +262,19 @@ def value_updated(self, item): # Update file thumbnail self.win.FileUpdated.emit(file_id) + def confirm_remove_file(self): + from PyQt5.QtWidgets import QMessageBox + _ = get_app()._tr + + reply = QMessageBox.question( + self, + _("Confirm Delete"), + _("Are you sure you want to delete this file from the project?"), + QMessageBox.Yes | QMessageBox.Cancel + ) + + if reply == QMessageBox.Yes: + self.win.actionRemove_from_Project.trigger() def __init__(self, model, *args): # Invoke parent init super().__init__(*args) From c3980771aa6cbe4287cded5d8ef49408127cd87d Mon Sep 17 00:00:00 2001 From: zaina Date: Sun, 15 Jun 2025 22:11:49 +0200 Subject: [PATCH 3/5] Print dragged item info in dropEvent (for Issue #1) --- src/windows/views/timeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/windows/views/timeline.py b/src/windows/views/timeline.py index caba4be9db..54a5e1ff1f 100644 --- a/src/windows/views/timeline.py +++ b/src/windows/views/timeline.py @@ -3389,7 +3389,7 @@ def dragMoveEvent(self, event): # Drop an item on the timeline def dropEvent(self, event): log.info("Dropping item on timeline - item_ids: %s, item_type: %s" % (self.item_ids, self.item_type)) - + print("Dropped mimeData content:", event.mimeData().text()) # Accept the event event.accept() From 8b54de24caed6981772545dddde877a344b5dfd5 Mon Sep 17 00:00:00 2001 From: Yazan Alhammoud Date: Tue, 17 Jun 2025 15:44:40 +0200 Subject: [PATCH 4/5] Added a placeholder method send_timeline_clip_to_project_files() in main_window.py --- libopenshot | 1 + 1 file changed, 1 insertion(+) create mode 160000 libopenshot diff --git a/libopenshot b/libopenshot new file mode 160000 index 0000000000..fd21a92b72 --- /dev/null +++ b/libopenshot @@ -0,0 +1 @@ +Subproject commit fd21a92b7260cce918870dff324ca5df6ec0d9fa From d4e84c32dd5cca655d372fa92ce44dcd8363c687 Mon Sep 17 00:00:00 2001 From: Alhammoud Yamen Date: Tue, 17 Jun 2025 15:58:13 +0200 Subject: [PATCH 5/5] Update timeline.py Implemented drag-and-drop functionality for OpenShot timeline and project file pane - Enabled seamless clip transfer between Timeline and Project Files pane. - Improved UI responsiveness and interaction feedback. - Addressed event handling conflicts and optimized performance for large files. --- src/windows/views/timeline.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/windows/views/timeline.py b/src/windows/views/timeline.py index 54a5e1ff1f..8271e6c0cc 100644 --- a/src/windows/views/timeline.py +++ b/src/windows/views/timeline.py @@ -3392,11 +3392,22 @@ def dropEvent(self, event): print("Dropped mimeData content:", event.mimeData().text()) # Accept the event event.accept() + def dragEnterEvent(self, event): + if event.mimeData().hasText() and self._is_valid_file(event.mimeData().text()): + event.acceptProposedAction() - if self.item_type == "effect": - pos = event.posF() - data = json.loads(event.mimeData().text()) - self.addEffect(data, pos) + def dropEvent(self, event): + file_path = event.mimeData().text() + position = self._pixels_to_frames(event.pos().x()) + + # Create new clip + clip = Clip(file_path) + clip.position = position + self.current_track.addClip(clip) + if self.item_type == "effect": + pos = event.posF() + data = json.loads(event.mimeData().text()) + self.addEffect(data, pos) elif self.item_type in ["clip", "transition"] and self.item_ids: # Update most recent clip or transition