From 411b4445c69a7ade62e7358e9889d6b127cdb693 Mon Sep 17 00:00:00 2001 From: BasioMeusPuga Date: Thu, 8 Mar 2018 09:56:07 +0530 Subject: [PATCH] Definitions dialog functional --- TODO | 2 +- __main__.py | 3 +-- definitionsdialog.py | 52 ++++++++++++++++++++++++++++++++++---------- widgets.py | 25 +++++++++++++++++++++ 4 files changed, 68 insertions(+), 14 deletions(-) diff --git a/TODO b/TODO index 704592e..91398a9 100644 --- a/TODO +++ b/TODO @@ -48,7 +48,7 @@ TODO ✓ Editing: Name ✓ Deletion ✓ Cache next and previous images - Set context menu for definitions and the like + ✓ Set context menu for definitions and the like Search document using QTextCursor? Comic view keyboard shortcuts Filetypes: diff --git a/__main__.py b/__main__.py index 50982d8..2175807 100755 --- a/__main__.py +++ b/__main__.py @@ -392,8 +392,7 @@ class MainUI(QtWidgets.QMainWindow, mainwindow.Ui_MainWindow): self.tabWidget.widget(self.tabWidget.currentIndex()).add_bookmark() def test_function(self): - # print('Caesar si viveret, ad remum dareris') - self.definitionDialog.find_definition('draft') + print('Caesar si viveret, ad remum dareris') def resizeEvent(self, event=None): if event: diff --git a/definitionsdialog.py b/definitionsdialog.py index 3045a7f..c662e10 100644 --- a/definitionsdialog.py +++ b/definitionsdialog.py @@ -17,7 +17,7 @@ # along with this program. If not, see . import requests -from PyQt5 import QtWidgets, QtCore, QtGui +from PyQt5 import QtWidgets, QtCore, QtGui, QtMultimedia from resources import definitions @@ -56,6 +56,11 @@ class DefinitionsUI(QtWidgets.QDialog, definitions.Ui_Dialog): self.root_url += self.language + '/' self.define_url += self.language + '/' + self.pronunciation_mp3 = None + + self.okButton.clicked.connect(self.hide) + self.pronounceButton.clicked.connect(self.play_pronunciation) + def api_call(self, url, word): url = url + word.lower() @@ -72,17 +77,27 @@ class DefinitionsUI(QtWidgets.QDialog, definitions.Ui_Dialog): def find_definition(self, word): word_root_json = self.api_call(self.root_url, word) if not word_root_json: + self.set_text(word, None, None, True) return + word_root = word_root_json['results'][0]['lexicalEntries'][0]['inflectionOf'][0]['id'] + self.pronounceButton.setToolTip(f'Pronounce "{word_root}"') definition_json = self.api_call(self.define_url, word_root) + if not definition_json: + return definitions = {} for i in definition_json['results'][0]['lexicalEntries']: category = i['lexicalCategory'] + + try: + self.pronunciation_mp3 = i['pronunciations'][0]['audioFile'] + except KeyError: + self.pronounceButton.setEnabled(False) + this_sense = i['entries'][0]['senses'] for j in this_sense: - try: this_definition = j['definitions'][0].capitalize() except KeyError: @@ -97,23 +112,38 @@ class DefinitionsUI(QtWidgets.QDialog, definitions.Ui_Dialog): self.set_text(word, word_root, definitions) - def set_text(self, word, word_root, definitions): + def set_text(self, word, word_root, definitions, nothing_found=False): html_string = '' # Word heading html_string += f'

{word}

\n' - # Word root - html_string += f'

Word root: {word_root}

\n' + if nothing_found: + html_string += f'

No definitions found

\n' + else: + # Word root + html_string += f'

Word root: {word_root}

\n' - for i in definitions.items(): - category = i[0] - html_string += f'

{category}:

\n
    \n' + # Definitions per category as an ordered list + for i in definitions.items(): + category = i[0] + html_string += f'

    {category}:

    \n
      \n' - for j in i[1]: - html_string += f'
    1. {j}
    2. \n' + for j in i[1]: + html_string += f'
    3. {j}
    4. \n' - html_string += '
    \n' + html_string += '
\n' self.definitionView.setHtml(html_string) self.show() + + def play_pronunciation(self): + if not self.pronunciation_mp3: + return + + media_content = QtMultimedia.QMediaContent( + QtCore.QUrl(self.pronunciation_mp3)) + + player = QtMultimedia.QMediaPlayer(self) + player.setMedia(media_content) + player.play() diff --git a/widgets.py b/widgets.py index a1de063..16d9186 100644 --- a/widgets.py +++ b/widgets.py @@ -579,6 +579,9 @@ class PliantQTextBrowser(QtWidgets.QTextBrowser): self, self.main_window) self.verticalScrollBar().sliderMoved.connect(self.record_scroll_position) self.setMouseTracking(True) + self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.customContextMenuRequested.connect( + self.generate_textbrowser_context_menu) def wheelEvent(self, event): self.record_scroll_position() @@ -620,6 +623,28 @@ class PliantQTextBrowser(QtWidgets.QTextBrowser): else: self.parent.metadata['position']['last_visible_text'] = visible_text + def generate_textbrowser_context_menu(self, position): + selected_word = self.textCursor().selection() + selected_word = selected_word.toPlainText() + + context_menu = QtWidgets.QMenu() + + defineAction = 'Caesar si viveret, ad remum dareris' + if selected_word and selected_word != '': + selected_word = selected_word.split()[0] + defineAction = context_menu.addAction( + QtGui.QIcon.fromTheme('view-readermode'), f'Define "{selected_word}"') + + searchAction = context_menu.addAction( + QtGui.QIcon.fromTheme('search'), 'Search') + + action = context_menu.exec_(self.sender().mapToGlobal(position)) + + if action == defineAction: + self.window().definitionDialog.find_definition(selected_word) + if action == searchAction: + self.window().bookToolBar.searchBar.setFocus() + def closeEvent(self, *args): self.main_window.closeEvent()