From 1636b5c80b0a4e8de11a1eb537682c0359141eeb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Josep=20Llodr=C3=A0?= <jlg.hrtc@gmail.com>
Date: Sat, 31 Mar 2018 17:53:48 +0200
Subject: [PATCH] linguist: Add actions in View menu to show more/fewer guesses

Three actions have been added to the main View menu (Guesses submenu)
in order to easily change the number of Guesses displayed.

View Menu
......
Guesses > Show more (alt - +)        [shows 5 more guesses]
          Show fewer (alt - -)       [shows 5 fewer guesses]
          ---
          Reset to default (alt - 0) [resets to 5 guesses]
......

Motivation behind this commit is that in large UIs with thousands
of strings, 5 guesses are not enough in some situations to gather
all the information necessary to correctly translate a string.

Change-Id: I3fdc1b8fc27af40300897cdfd1f9fa3620caad55
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
---
 src/linguist/linguist/mainwindow.cpp |  7 ++++++
 src/linguist/linguist/mainwindow.ui  | 34 ++++++++++++++++++++++++++++
 src/linguist/linguist/phraseview.cpp | 29 ++++++++++++++++++++----
 src/linguist/linguist/phraseview.h   | 10 ++++++++
 4 files changed, 76 insertions(+), 4 deletions(-)

diff --git a/src/linguist/linguist/mainwindow.cpp b/src/linguist/linguist/mainwindow.cpp
index 9f7109c85..355754b21 100644
--- a/src/linguist/linguist/mainwindow.cpp
+++ b/src/linguist/linguist/mainwindow.cpp
@@ -1933,6 +1933,10 @@ void MainWindow::setupMenuBar()
     connect(m_ui.actionIncreaseZoom, SIGNAL(triggered()), m_messageEditor, SLOT(increaseFontSize()));
     connect(m_ui.actionDecreaseZoom, SIGNAL(triggered()), m_messageEditor, SLOT(decreaseFontSize()));
     connect(m_ui.actionResetZoomToDefault, SIGNAL(triggered()), m_messageEditor, SLOT(resetFontSize()));
+    connect(m_ui.actionShowMoreGuesses, SIGNAL(triggered()), m_phraseView, SLOT(moreGuesses()));
+    connect(m_ui.actionShowFewerGuesses, SIGNAL(triggered()), m_phraseView, SLOT(fewerGuesses()));
+    connect(m_phraseView, SIGNAL(showFewerGuessesAvailable(bool)), m_ui.actionShowFewerGuesses, SLOT(setEnabled(bool)));
+    connect(m_ui.actionResetGuessesToDefault, SIGNAL(triggered()), m_phraseView, SLOT(resetNumGuesses()));
     m_ui.menuViewViews->addAction(m_contextDock->toggleViewAction());
     m_ui.menuViewViews->addAction(m_messagesDock->toggleViewAction());
     m_ui.menuViewViews->addAction(m_phrasesDock->toggleViewAction());
@@ -2622,6 +2626,8 @@ void MainWindow::readConfig()
 
     m_messageEditor->setFontSize(
                 config.value(settingPath("Options/EditorFontsize"), font().pointSize()).toReal());
+    m_phraseView->setMaxCandidates(config.value(settingPath("Options/NumberOfGuesses"),
+                                                PhraseView::getDefaultMaxCandidates()).toInt());
 
     recentFiles().readConfig();
 
@@ -2657,6 +2663,7 @@ void MainWindow::writeConfig()
     recentFiles().writeConfig();
 
     config.setValue(settingPath("Options/EditorFontsize"), m_messageEditor->fontSize());
+    config.setValue(settingPath("Options/NumberOfGuesses"), m_phraseView->getMaxCandidates());
 
     config.beginWriteArray(settingPath("OpenedPhraseBooks"),
         m_phraseBooks.size());
diff --git a/src/linguist/linguist/mainwindow.ui b/src/linguist/linguist/mainwindow.ui
index c09015912..6b4922e16 100644
--- a/src/linguist/linguist/mainwindow.ui
+++ b/src/linguist/linguist/mainwindow.ui
@@ -110,6 +110,15 @@
      <addaction name="separator"/>
      <addaction name="actionResetZoomToDefault"/>
     </widget>
+    <widget class="QMenu" name="menuGuesses">
+     <property name="title">
+      <string>Guesses</string>
+     </property>
+     <addaction name="actionShowMoreGuesses"/>
+     <addaction name="actionShowFewerGuesses"/>
+     <addaction name="separator"/>
+     <addaction name="actionResetGuessesToDefault"/>
+    </widget>
     <addaction name="actionResetSorting"/>
     <addaction name="actionDisplayGuesses"/>
     <addaction name="actionStatistics"/>
@@ -117,6 +126,7 @@
     <addaction name="actionVisualizeWhitespace"/>
     <addaction name="separator"/>
     <addaction name="menuZoom"/>
+    <addaction name="menuGuesses"/>
     <addaction name="separator"/>
     <addaction name="menuToolbars"/>
     <addaction name="menuViewViews"/>
@@ -926,6 +936,30 @@
     <string>Ctrl+0</string>
    </property>
   </action>
+  <action name="actionShowMoreGuesses">
+   <property name="text">
+    <string>Show more</string>
+   </property>
+   <property name="shortcut">
+    <string>Alt++</string>
+   </property>
+  </action>
+  <action name="actionShowFewerGuesses">
+   <property name="text">
+    <string>Show fewer</string>
+   </property>
+   <property name="shortcut">
+    <string>Alt+-</string>
+   </property>
+  </action>
+  <action name="actionResetGuessesToDefault">
+   <property name="text">
+    <string>Reset to default</string>
+   </property>
+   <property name="shortcut">
+    <string>Alt+0</string>
+   </property>
+  </action>
  </widget>
  <resources/>
  <connections/>
diff --git a/src/linguist/linguist/phraseview.cpp b/src/linguist/linguist/phraseview.cpp
index e1d31954e..39b02c8cd 100644
--- a/src/linguist/linguist/phraseview.cpp
+++ b/src/linguist/linguist/phraseview.cpp
@@ -44,9 +44,6 @@
 
 QT_BEGIN_NAMESPACE
 
-// Maximum number of guesses to display
-static const int MaxCandidates = 5;
-
 static QString phraseViewHeaderKey()
 {
     return settingPath("PhraseViewHeader");
@@ -154,6 +151,30 @@ void PhraseView::editPhrase()
     edit(currentIndex());
 }
 
+void PhraseView::setMaxCandidates(const int max)
+{
+    m_maxCandidates = max;
+    emit showFewerGuessesAvailable(m_maxCandidates > DefaultMaxCandidates);
+}
+
+void PhraseView::moreGuesses()
+{
+    setMaxCandidates(m_maxCandidates + DefaultMaxCandidates);
+    setSourceText(m_modelIndex, m_sourceText);
+}
+
+void PhraseView::fewerGuesses()
+{
+    setMaxCandidates(m_maxCandidates - DefaultMaxCandidates);
+    setSourceText(m_modelIndex, m_sourceText);
+}
+
+void PhraseView::resetNumGuesses()
+{
+    setMaxCandidates(DefaultMaxCandidates);
+    setSourceText(m_modelIndex, m_sourceText);
+}
+
 static CandidateList similarTextHeuristicCandidates(MultiDataModel *model, int mi,
     const char *text, int maxCandidates)
 {
@@ -217,7 +238,7 @@ void PhraseView::setSourceText(int model, const QString &sourceText)
 
     if (!sourceText.isEmpty() && m_doGuesses) {
         CandidateList cl = similarTextHeuristicCandidates(m_dataModel, model,
-            sourceText.toLatin1(), MaxCandidates);
+            sourceText.toLatin1(), m_maxCandidates);
         int n = 0;
         foreach (const Candidate &candidate, cl) {
             QString def;
diff --git a/src/linguist/linguist/phraseview.h b/src/linguist/linguist/phraseview.h
index 2e315b759..fbc4610fe 100644
--- a/src/linguist/linguist/phraseview.h
+++ b/src/linguist/linguist/phraseview.h
@@ -36,6 +36,8 @@
 
 QT_BEGIN_NAMESPACE
 
+static const int DefaultMaxCandidates = 5;
+
 class MultiDataModel;
 class PhraseModel;
 
@@ -73,9 +75,13 @@ public:
 public slots:
     void toggleGuessing();
     void update();
+    int getMaxCandidates() const { return m_maxCandidates; }
+    void setMaxCandidates(const int max);
+    static int getDefaultMaxCandidates() { return DefaultMaxCandidates; }
 
 signals:
     void phraseSelected(int latestModel, const QString &phrase);
+    void showFewerGuessesAvailable(bool canShow);
 
 protected:
     // QObject
@@ -88,6 +94,9 @@ private slots:
     void selectPhrase(const QModelIndex &index);
     void selectPhrase();
     void editPhrase();
+    void moreGuesses();
+    void fewerGuesses();
+    void resetNumGuesses();
 
 private:
     QList<Phrase *> getPhrases(int model, const QString &sourceText);
@@ -100,6 +109,7 @@ private:
     QString m_sourceText;
     int m_modelIndex;
     bool m_doGuesses;
+    int m_maxCandidates = DefaultMaxCandidates;
 };
 
 QT_END_NAMESPACE
-- 
GitLab