mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-27 19:24:08 +00:00
60bc05218f
Preferences::sanitizeInputPhrase() transforms an input phrase by removing its whitespace/punctuation prefix and suffix. Translating a phrase from X11 primary selection or from clipboard, via mouse-over or from the command line results in such sanitization. This is useful when a punctuation mark or a space is selected accidentally alongside a word. This sanitization can be undesirable, however, when an abbreviated word is selected. For example: "etc.", "e.g.", "i.e.". This commit implements searching for the input word with the punctuation suffix preserved as an alternative form of the sanitized word to show articles for both. For example, when the word "etc." is translated from the clipboard, both "ETC" and "etc." articles are displayed. The punctuation suffix is preserved when the word is passed from the scan popup to the main window and when the translate line text is refreshed (e.g. when the current group is changed). The suffix is not stored in history and favorites (doing so would require file format changes and possibly substantial code changes, this can be implemented later if need be). Trim the input phrase once in ArticleNetworkAccessManager::getResource() instead of verbose trimming in multiple places in ArticleMaker::makeDefinitionFor(). Closes #1350.
243 lines
7.3 KiB
C++
243 lines
7.3 KiB
C++
/* This file is (c) 2008-2012 Konstantin Isakov <ikm@goldendict.org>
|
|
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
|
|
|
|
#ifndef __SCANPOPUP_HH_INCLUDED__
|
|
#define __SCANPOPUP_HH_INCLUDED__
|
|
|
|
#include "article_netmgr.hh"
|
|
#include "articleview.hh"
|
|
#include "wordfinder.hh"
|
|
#include "keyboardstate.hh"
|
|
#include "config.hh"
|
|
#include "ui_scanpopup.h"
|
|
#include <QDialog>
|
|
#include <QClipboard>
|
|
#include "history.hh"
|
|
#include "dictionarybar.hh"
|
|
#include "mainstatusbar.hh"
|
|
#ifdef HAVE_X11
|
|
#include "scanflag.hh"
|
|
#endif
|
|
|
|
/// This is a popup dialog to show translations when clipboard scanning mode
|
|
/// is enabled.
|
|
class ScanPopup: public QMainWindow, KeyboardState
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
ScanPopup( QWidget * parent,
|
|
Config::Class & cfg,
|
|
ArticleNetworkAccessManager &,
|
|
AudioPlayerPtr const &,
|
|
std::vector< sptr< Dictionary::Class > > const & allDictionaries,
|
|
Instances::Groups const &,
|
|
History & );
|
|
|
|
~ScanPopup();
|
|
|
|
/// Enables scanning. When the object is created, the scanning is disabled
|
|
/// initially.
|
|
void enableScanning();
|
|
/// Disables scanning.
|
|
void disableScanning();
|
|
|
|
/// Applies current zoom factor to the popup's view. Should be called when
|
|
/// it's changed.
|
|
void applyZoomFactor();
|
|
void applyWordsZoomLevel();
|
|
/// Translate the word
|
|
void translateWord( QString const & word );
|
|
|
|
void setDictionaryIconSize();
|
|
|
|
void saveConfigData();
|
|
|
|
signals:
|
|
|
|
/// Forwarded from the dictionary bar, so that main window could act on this.
|
|
void editGroupRequested( unsigned id );
|
|
/// Send word to main window
|
|
void sendPhraseToMainWindow( Config::InputPhrase const & phrase );
|
|
/// Close opened menus when window hide
|
|
void closeMenu();
|
|
/// Signals to set expand optional parts mode (retranslation from/to MainWindow and dictionary bar)
|
|
void setExpandMode( bool expand );
|
|
void setViewExpandMode( bool expand );
|
|
/// Signal to switch expand optional parts mode
|
|
void switchExpandMode();
|
|
/// Signal to add word to history even if history is disabled
|
|
void forceAddWordToHistory( const QString & word);
|
|
/// Retranslate signal from dictionary bar
|
|
void showDictionaryInfo( QString const & id );
|
|
void openDictionaryFolder( QString const & id );
|
|
/// Put translated word into history
|
|
void sendWordToHistory( QString const & word );
|
|
/// Put translated word into Favorites
|
|
void sendWordToFavorites( QString const & word, unsigned groupId );
|
|
/// Check is word already presented in Favorites
|
|
bool isWordPresentedInFavorites( QString const & word, unsigned groupId );
|
|
|
|
#ifdef HAVE_X11
|
|
/// Interaction with scan flag window
|
|
void showScanFlag( bool forcePopup );
|
|
void hideScanFlag();
|
|
#endif
|
|
|
|
#ifdef Q_OS_WIN32
|
|
/// Ask for source window is current translate tab
|
|
bool isGoldenDictWindow( HWND hwnd );
|
|
#endif
|
|
|
|
public slots:
|
|
void requestWindowFocus();
|
|
|
|
/// Translates the word from the clipboard, showing the window etc.
|
|
void translateWordFromClipboard();
|
|
/// Translates the word from the clipboard selection
|
|
void translateWordFromSelection();
|
|
/// From the dictionary bar.
|
|
void editGroupRequested();
|
|
|
|
void setGroupByName( QString const & name );
|
|
|
|
#ifdef HAVE_X11
|
|
void showEngagePopup();
|
|
#endif
|
|
|
|
private:
|
|
|
|
Qt::WindowFlags unpinnedWindowFlags() const;
|
|
|
|
// Translates the word from the clipboard or the clipboard selection
|
|
void translateWordFromClipboard(QClipboard::Mode m);
|
|
|
|
// Hides the popup window, effectively closing it.
|
|
void hideWindow();
|
|
|
|
// Grabs mouse and installs global event filter to track it thoroughly.
|
|
void interceptMouse();
|
|
// Ungrabs mouse and uninstalls global event filter.
|
|
void uninterceptMouse();
|
|
|
|
void updateDictionaryBar();
|
|
|
|
Config::Class & cfg;
|
|
bool isScanningEnabled;
|
|
std::vector< sptr< Dictionary::Class > > const & allDictionaries;
|
|
std::vector< sptr< Dictionary::Class > > dictionariesUnmuted;
|
|
Instances::Groups const & groups;
|
|
History & history;
|
|
Ui::ScanPopup ui;
|
|
ArticleView * definition;
|
|
QAction escapeAction, switchExpandModeAction, focusTranslateLineAction;
|
|
QAction openSearchAction;
|
|
Config::InputPhrase pendingInputPhrase, inputPhrase;
|
|
QString translateBoxSuffix; ///< A punctuation suffix that corresponds to translateBox's text.
|
|
WordFinder wordFinder;
|
|
Config::Events configEvents;
|
|
DictionaryBar dictionaryBar;
|
|
MainStatusBar * mainStatusBar;
|
|
/// Fonts saved before words zooming is in effect, so it could be reset back.
|
|
QFont wordListDefaultFont, translateLineDefaultFont, groupListDefaultFont;
|
|
|
|
#ifdef HAVE_X11
|
|
ScanFlag * scanFlag;
|
|
QTimer delayTimer;
|
|
#endif
|
|
|
|
bool mouseEnteredOnce;
|
|
bool mouseIntercepted;
|
|
|
|
QPoint startPos; // For window moving
|
|
|
|
QTimer hideTimer; // When mouse leaves the window, a grace period is
|
|
// given for it to return back. If it doesn't before
|
|
// this timer expires, the window gets hidden.
|
|
QTimer altModeExpirationTimer, altModePollingTimer; // Timers for alt mode
|
|
|
|
QTimer mouseGrabPollTimer;
|
|
|
|
QIcon starIcon, blueStarIcon;
|
|
|
|
void handleInputWord( QString const & , bool forcePopup = false );
|
|
void engagePopup( bool forcePopup, bool giveFocus = false );
|
|
|
|
vector< sptr< Dictionary::Class > > const & getActiveDicts();
|
|
|
|
virtual bool eventFilter( QObject * watched, QEvent * event );
|
|
|
|
/// Called from event filter or from mouseGrabPoll to handle mouse event
|
|
/// while it is being intercepted.
|
|
void reactOnMouseMove( QPoint const & p );
|
|
|
|
virtual void mousePressEvent( QMouseEvent * );
|
|
virtual void mouseMoveEvent( QMouseEvent * );
|
|
virtual void mouseReleaseEvent( QMouseEvent * );
|
|
virtual void leaveEvent( QEvent * event );
|
|
virtual void enterEvent( QEvent * event );
|
|
virtual void showEvent( QShowEvent * );
|
|
|
|
/// Returns inputWord, chopped with appended ... if it's too long/
|
|
QString elideInputWord();
|
|
|
|
void updateBackForwardButtons();
|
|
|
|
void showTranslationFor( Config::InputPhrase const & inputPhrase );
|
|
|
|
void updateSuggestionList();
|
|
void updateSuggestionList( QString const & text );
|
|
|
|
private slots:
|
|
|
|
void clipboardChanged( QClipboard::Mode );
|
|
void mouseHovered( QString const & , bool forcePopup);
|
|
void currentGroupChanged( QString const & );
|
|
void prefixMatchFinished();
|
|
void on_pronounceButton_clicked();
|
|
void pinButtonClicked( bool checked );
|
|
void on_showDictionaryBar_clicked( bool checked );
|
|
void showStatusBarMessage ( QString const &, int, QPixmap const & );
|
|
void on_sendWordButton_clicked();
|
|
void on_sendWordToFavoritesButton_clicked();
|
|
void on_goBackButton_clicked();
|
|
void on_goForwardButton_clicked();
|
|
|
|
void hideTimerExpired();
|
|
void altModeExpired();
|
|
void altModePoll();
|
|
|
|
/// Called repeatedly once the popup is initially engaged and we monitor the
|
|
/// mouse as it may move away from the window. This simulates mouse grab, in
|
|
/// essence, but seems more reliable. Once the mouse enters the window, the
|
|
/// polling stops.
|
|
void mouseGrabPoll();
|
|
|
|
void pageLoaded( ArticleView * );
|
|
|
|
void escapePressed();
|
|
|
|
void mutedDictionariesChanged();
|
|
|
|
void switchExpandOptionalPartsMode();
|
|
|
|
void translateInputChanged(QString const & text);
|
|
void translateInputFinished();
|
|
void wordListItemActivated( QListWidgetItem * );
|
|
|
|
void focusTranslateLine();
|
|
|
|
void typingEvent( QString const & );
|
|
|
|
void alwaysOnTopClicked( bool checked );
|
|
|
|
void titleChanged( ArticleView *, QString const & title );
|
|
|
|
#ifdef HAVE_X11
|
|
void delayShow();
|
|
#endif
|
|
};
|
|
|
|
#endif
|