From 83a6ab947f981f55f5556459ad568ffdb698e57e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 29 Feb 2024 13:11:38 +0530 Subject: [PATCH] Edit book: Add a shortcut Ctrl+M to merge selected files. Fixes #2053144 [ebook-edit: Keyboard shortcut for merging files](https://bugs.launchpad.net/calibre/+bug/2053144) --- src/calibre/gui2/tweak_book/boss.py | 3 +++ src/calibre/gui2/tweak_book/file_list.py | 19 +++++++++++++++++++ src/calibre/gui2/tweak_book/ui.py | 3 +++ 3 files changed, 25 insertions(+) diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 5845643725..690d5bef5a 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -1911,6 +1911,9 @@ class Boss(QObject): from calibre.gui2.tweak_book.editor.snippets import UserSnippets UserSnippets(self.gui).exec() + def merge_files(self): + self.gui.file_list.merge_files() + # Shutdown {{{ def quit(self): diff --git a/src/calibre/gui2/tweak_book/file_list.py b/src/calibre/gui2/tweak_book/file_list.py index 15c696e54b..78f6e187ec 100644 --- a/src/calibre/gui2/tweak_book/file_list.py +++ b/src/calibre/gui2/tweak_book/file_list.py @@ -766,6 +766,22 @@ class FileList(QTreeWidget, OpenWithHandler): return (category, i) return (None, -1) + def merge_files(self): + sel = self.selectedItems() + selected_map = defaultdict(list) + for item in sel: + selected_map[str(item.data(0, CATEGORY_ROLE) or '')].append(str(item.data(0, NAME_ROLE) or '')) + + for items in selected_map.values(): + items.sort(key=self.index_of_name) + if len(selected_map['text']) > 1: + self.start_merge('text', selected_map['text']) + elif len(selected_map['styles']) > 1: + self.start_merge('styles', selected_map['styles']) + else: + error_dialog(self, _('Cannot merge'), _( + 'No files selected. Select two or more HTML files or two or more CSS files in the Files browser before trying to merge'), show=True) + def start_merge(self, category, names): d = MergeDialog(names, self) if d.exec() == QDialog.DialogCode.Accepted and d.ans: @@ -1264,6 +1280,9 @@ class FileListWidget(QWidget): def restore_temp_names(self): self.file_list.restore_temp_names() + def merge_files(self): + self.file_list.merge_files() + @property def searchable_names(self): return self.file_list.searchable_names diff --git a/src/calibre/gui2/tweak_book/ui.py b/src/calibre/gui2/tweak_book/ui.py index f0539ea578..22be04cb16 100644 --- a/src/calibre/gui2/tweak_book/ui.py +++ b/src/calibre/gui2/tweak_book/ui.py @@ -559,6 +559,9 @@ class Main(MainWindow): self.action_manage_snippets = treg( 'snippets.png', _('Manage &Snippets'), self.boss.manage_snippets, 'manage-snippets', (), _( 'Manage user created Snippets')) + self.action_merge_files = treg( + 'merge.png', _('&Merge files'), self.boss.merge_files, 'merge-files', 'Ctrl+M', _( + 'Merge two or more selected files')) self.plugin_menu_actions = []