dictwidget.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*****************************************************************************
  2. * dictwidget.cpp - QStarDict, a dictionary for learning foreign languages *
  3. * Copyright (C) 2007-2023 Alexander Rodin *
  4. * *
  5. * This program is free software; you can redistribute it and/or modify *
  6. * it under the terms of the GNU General Public License as published by *
  7. * the Free Software Foundation; either version 2 of the License, or *
  8. * (at your option) any later version. *
  9. * *
  10. * This program is distributed in the hope that it will be useful, *
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  13. * GNU General Public License for more details. *
  14. * *
  15. * You should have received a copy of the GNU General Public License along *
  16. * with this program; if not, write to the Free Software Foundation, Inc., *
  17. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
  18. *****************************************************************************/
  19. #include "dictwidget.h"
  20. #include <QScrollBar>
  21. #include <QVBoxLayout>
  22. #include <QToolBar>
  23. #include <QAction>
  24. #include <QIcon>
  25. #include <QMessageBox>
  26. #include <QMouseEvent>
  27. #include <QTextDocument>
  28. #include "application.h"
  29. #include "dictbrowser.h"
  30. #include "dictbrowsersearch.h"
  31. #include "mainwindow.h"
  32. #include "speaker.h"
  33. #include "pluginmanager.h"
  34. #include "../plugins/toolbarplugin.h"
  35. namespace
  36. {
  37. class DictWidgetToolbar: public QToolBar
  38. {
  39. public:
  40. DictWidgetToolbar(QWidget *parent = 0)
  41. : QToolBar(parent)
  42. { }
  43. protected:
  44. virtual void mouseDoubleClickEvent(QMouseEvent *event)
  45. {
  46. if (! actionAt(event->pos()))
  47. QToolBar::mouseDoubleClickEvent(event);
  48. }
  49. };
  50. }
  51. namespace QStarDict
  52. {
  53. DictWidget::DictWidget(QWidget *parent, Qt::WindowFlags f, bool hasOpenMainWindowAction)
  54. : QFrame(parent, f)
  55. {
  56. m_translationView = new DictBrowser(this);
  57. setFrameStyle(m_translationView->frameStyle());
  58. m_translationView->setFrameStyle(QFrame::NoFrame);
  59. m_translationView->verticalScrollBar()->setCursor(Qt::ArrowCursor);
  60. m_translationView->horizontalScrollBar()->setCursor(Qt::ArrowCursor);
  61. m_translationView->setOpenExternalLinks(true);
  62. connect(m_translationView, SIGNAL(sourceChanged(const QUrl&)), SLOT(on_translationView_sourceChanged(const QUrl&)));
  63. m_search = new DictBrowserSearch(this);
  64. connect(m_search, SIGNAL(search(const QString &,QTextDocument::FindFlags)),
  65. m_translationView, SLOT(search(const QString &,QTextDocument::FindFlags)));
  66. connect(m_search, SIGNAL(searchActive(bool)),
  67. m_translationView, SLOT(searchActive(bool)));
  68. connect(m_translationView, SIGNAL(sourceChanged(const QUrl&)),
  69. m_search, SLOT(hide()));
  70. connect(m_translationView, SIGNAL(searchResult(bool)), m_search, SLOT(searchResult(bool)));
  71. m_search->hide();
  72. // Primary toolbar
  73. m_toolBar = new DictWidgetToolbar(this);
  74. m_toolBar->setMouseTracking(true);
  75. QAction *actionBackward = m_toolBar->addAction(QIcon(":pics/go-previous.png"), tr("Go &back"),
  76. m_translationView, SLOT(backward()));
  77. actionBackward->setDisabled(true);
  78. connect(m_translationView, SIGNAL(backwardAvailable(bool)), actionBackward, SLOT(setEnabled(bool)));
  79. QAction *actionForward = m_toolBar->addAction(QIcon(":pics/go-next.png"), tr("Go &forward"),
  80. m_translationView, SLOT(forward()));
  81. actionForward->setDisabled(true);
  82. connect(m_translationView, SIGNAL(forwardAvailable(bool)), actionForward, SLOT(setEnabled(bool)));
  83. m_toolBar->addAction(QIcon(":pics/speaker.png"), tr("&Pronounce the word"),
  84. this, SLOT(speak()));
  85. QAction *actionSearch = m_toolBar->addAction(QIcon(":pics/system-search.png"), tr("Search"), this, SLOT(handleSearch()));
  86. actionSearch->setCheckable(true);
  87. actionSearch->setShortcut(QKeySequence::Find);
  88. connect(m_search, SIGNAL(searchActive(bool)), actionSearch, SLOT(setChecked(bool)));
  89. // Right toolbar
  90. DictWidgetToolbar *rightToolBar = new DictWidgetToolbar(this);
  91. rightToolBar->setMouseTracking(true);
  92. if (hasOpenMainWindowAction)
  93. {
  94. QAction *actionOpenMainWindow = rightToolBar->addAction(QIcon(":pics/view-fullscreen.png"),
  95. tr("Open in the main window"), this, SLOT(openMainWindow()));
  96. }
  97. m_toolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
  98. QGridLayout *layout = new QGridLayout(this);
  99. layout->setMargin(0);
  100. layout->setSpacing(0);
  101. layout->addWidget(m_toolBar, 0, 0);
  102. layout->addWidget(rightToolBar, 0, 1);
  103. layout->addWidget(m_translationView, 1, 0, 1, 2);
  104. layout->addWidget(m_search, 2, 0, 1, 2);
  105. setLayout(layout);
  106. connect(m_toolBar, SIGNAL(actionTriggered(QAction*)), this, SLOT(pluginAction(QAction*)));
  107. reloadToolbar();
  108. }
  109. void DictWidget::reloadToolbar() {
  110. for (auto i = m_toolbarPlugins.constBegin(); i != m_toolbarPlugins.constEnd(); i++) {
  111. m_toolBar->removeAction(i.key());
  112. delete i.key();
  113. }
  114. m_toolbarPlugins.clear();
  115. auto pm = Application::instance()->pluginManager();
  116. foreach (const QString &pluginId, pm->availablePlugins()) {
  117. auto plugin = pm->plugin<ToolbarPlugin>(pluginId);
  118. if (plugin) {
  119. QAction *action = m_toolBar->addAction(plugin->toolbarIcon(), plugin->toolbarText());
  120. m_toolbarPlugins[action] = plugin;
  121. }
  122. }
  123. }
  124. void DictWidget::pluginAction(QAction *action) {
  125. if (m_toolbarPlugins.find(action) != m_toolbarPlugins.end()) {
  126. m_toolbarPlugins[action]->execute(this);
  127. }
  128. }
  129. void DictWidget::translate(const QString &str)
  130. {
  131. m_translationView->setSource(QUrl("qstardict:" + str));
  132. }
  133. void DictWidget::on_translationView_sourceChanged(const QUrl &name)
  134. {
  135. emit wordTranslated(name.toString(QUrl::RemoveScheme));
  136. }
  137. void DictWidget::speak()
  138. {
  139. Application::instance()->speaker()->speak(translatedWord());
  140. }
  141. void DictWidget::handleSearch()
  142. {
  143. m_search->setVisible(!m_search->isVisible());
  144. }
  145. void DictWidget::setDefaultStyleSheet(const QString &css)
  146. {
  147. m_translationView->document()->setDefaultStyleSheet(css);
  148. m_translationView->reload();
  149. }
  150. void DictWidget::openMainWindow()
  151. {
  152. MainWindow *mainWindow = Application::instance()->mainWindow();
  153. mainWindow->showTranslation(translatedWord());
  154. mainWindow->setVisible(false);
  155. mainWindow->setVisible(true);
  156. }
  157. void DictWidget::focusInEvent(QFocusEvent *event)
  158. {
  159. m_translationView->setFocus();
  160. }
  161. }
  162. // vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab cindent textwidth=120 formatoptions=tc