2009-02-05 20:55:00 +00:00
|
|
|
#include "preferences.hh"
|
|
|
|
#include "keyboardstate.hh"
|
2009-07-29 16:39:27 +00:00
|
|
|
#include "language.hh"
|
|
|
|
#include "langcoder.hh"
|
2009-04-12 20:46:25 +00:00
|
|
|
#include <QMessageBox>
|
2009-09-29 13:01:05 +00:00
|
|
|
#include "broken_xrecord.hh"
|
2014-06-24 13:55:06 +00:00
|
|
|
#include "mainwindow.hh"
|
2013-05-05 10:22:12 +00:00
|
|
|
|
2009-02-05 20:55:00 +00:00
|
|
|
|
2014-06-24 13:55:06 +00:00
|
|
|
Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
2009-04-12 20:46:25 +00:00
|
|
|
QDialog( parent ), prevInterfaceLanguage( 0 )
|
2014-06-24 13:55:06 +00:00
|
|
|
, helpWindow( 0 )
|
|
|
|
, cfg( cfg_ )
|
|
|
|
, helpAction( this )
|
2009-02-05 20:55:00 +00:00
|
|
|
{
|
2014-06-24 13:55:06 +00:00
|
|
|
Config::Preferences const & p = cfg_.preferences;
|
2009-02-05 20:55:00 +00:00
|
|
|
ui.setupUi( this );
|
|
|
|
|
|
|
|
connect( ui.enableScanPopup, SIGNAL( toggled( bool ) ),
|
|
|
|
this, SLOT( enableScanPopupToggled( bool ) ) );
|
|
|
|
|
|
|
|
connect( ui.enableScanPopupModifiers, SIGNAL( toggled( bool ) ),
|
|
|
|
this, SLOT( enableScanPopupModifiersToggled( bool ) ) );
|
|
|
|
|
2017-06-05 13:15:38 +00:00
|
|
|
connect( ui.showScanFlag, SIGNAL( toggled( bool ) ),
|
|
|
|
this, SLOT( showScanFlagToggled( bool ) ) );
|
|
|
|
|
2009-02-05 20:55:00 +00:00
|
|
|
connect( ui.altKey, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( wholeAltClicked( bool ) ) );
|
|
|
|
connect( ui.ctrlKey, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( wholeCtrlClicked( bool ) ) );
|
|
|
|
connect( ui.shiftKey, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( wholeShiftClicked( bool ) ) );
|
|
|
|
|
|
|
|
connect( ui.leftAlt, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( sideAltClicked( bool ) ) );
|
|
|
|
connect( ui.rightAlt, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( sideAltClicked( bool ) ) );
|
|
|
|
connect( ui.leftCtrl, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( sideCtrlClicked( bool ) ) );
|
|
|
|
connect( ui.rightCtrl, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( sideCtrlClicked( bool ) ) );
|
|
|
|
connect( ui.leftShift, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( sideShiftClicked( bool ) ) );
|
|
|
|
connect( ui.rightShift, SIGNAL( clicked( bool ) ),
|
|
|
|
this, SLOT( sideShiftClicked( bool ) ) );
|
|
|
|
|
2014-06-24 13:55:06 +00:00
|
|
|
connect( ui.buttonBox, SIGNAL( helpRequested() ),
|
|
|
|
this, SLOT( helpRequested() ) );
|
|
|
|
|
|
|
|
helpAction.setShortcut( QKeySequence( "F1" ) );
|
|
|
|
helpAction.setShortcutContext( Qt::WidgetWithChildrenShortcut );
|
|
|
|
|
|
|
|
connect( &helpAction, SIGNAL( triggered() ),
|
|
|
|
this, SLOT( helpRequested() ) );
|
|
|
|
|
|
|
|
addAction( &helpAction );
|
|
|
|
|
2009-02-05 20:55:00 +00:00
|
|
|
// Load values into form
|
|
|
|
|
2009-04-12 20:46:25 +00:00
|
|
|
ui.interfaceLanguage->addItem( tr( "System default" ), QString() );
|
2009-07-29 16:39:27 +00:00
|
|
|
ui.interfaceLanguage->addItem( QIcon( ":/flags/us.png" ), Language::localizedNameForId( LangCoder::code2toInt( "en" ) ), QString( "en_US" ) );
|
|
|
|
|
|
|
|
// See which other translations do we have
|
|
|
|
|
|
|
|
QStringList availLocs = QDir( Config::getLocDir() ).entryList( QStringList( "*.qm" ),
|
|
|
|
QDir::Files );
|
|
|
|
|
|
|
|
// We need to sort by language name -- otherwise list looks really weird
|
|
|
|
QMap< QString, QPair< QIcon, QString > > sortedLocs;
|
|
|
|
|
|
|
|
for( QStringList::iterator i = availLocs.begin(); i != availLocs.end(); ++i )
|
|
|
|
{
|
|
|
|
// Here we assume the xx_YY naming, where xx is language and YY is region.
|
|
|
|
QString lang = i->mid( 0, 2 );
|
2010-12-03 12:35:06 +00:00
|
|
|
|
|
|
|
if ( lang == "qt" )
|
2010-12-03 19:14:14 +00:00
|
|
|
continue; // We skip qt's own localizations
|
2010-12-03 12:35:06 +00:00
|
|
|
|
2011-03-04 07:11:29 +00:00
|
|
|
sortedLocs.insertMulti(
|
2013-02-03 20:19:55 +00:00
|
|
|
Language::localizedNameForId( LangCoder::code2toInt( lang.toLatin1().data() ) ),
|
2011-03-04 07:11:29 +00:00
|
|
|
QPair< QIcon, QString >(
|
|
|
|
QIcon( QString( ":/flags/%1.png" ).arg( i->mid( 3, 2 ).toLower() ) ),
|
|
|
|
i->mid( 0, i->size() - 3 ) ) );
|
2009-07-29 16:39:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for( QMap< QString, QPair< QIcon, QString > >::iterator i = sortedLocs.begin();
|
|
|
|
i != sortedLocs.end(); ++i )
|
|
|
|
ui.interfaceLanguage->addItem( i.value().first, i.key(), i.value().second );
|
2009-04-12 20:46:25 +00:00
|
|
|
|
|
|
|
for( int x = 0; x < ui.interfaceLanguage->count(); ++x )
|
|
|
|
if ( ui.interfaceLanguage->itemData( x ).toString() == p.interfaceLanguage )
|
|
|
|
{
|
|
|
|
ui.interfaceLanguage->setCurrentIndex( x );
|
|
|
|
prevInterfaceLanguage = x;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2014-06-25 14:01:11 +00:00
|
|
|
// Fill help languages combobox
|
|
|
|
|
|
|
|
ui.helpLanguage->addItem( tr( "Default" ), QString() );
|
|
|
|
|
|
|
|
// See which helps do we have
|
|
|
|
|
|
|
|
QStringList availHelps = QDir( Config::getHelpDir() ).entryList( QStringList( "*.qch" ),
|
|
|
|
QDir::Files );
|
|
|
|
|
|
|
|
QMap< QString, QPair< QIcon, QString > > sortedHelps;
|
|
|
|
|
|
|
|
for( QStringList::iterator i = availHelps.begin(); i != availHelps.end(); ++i )
|
|
|
|
{
|
|
|
|
QString loc = i->mid( 7, i->length() - 11 );
|
|
|
|
QString lang = loc.mid( 0, 2 );
|
|
|
|
QString reg;
|
|
|
|
if(loc.length() >= 5 )
|
|
|
|
reg = loc.mid( 3, 2 ).toLower();
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( lang.compare( "en", Qt::CaseInsensitive ) == 0 )
|
|
|
|
reg = "US";
|
|
|
|
else
|
|
|
|
reg = lang.toUpper();
|
|
|
|
}
|
|
|
|
|
|
|
|
sortedHelps.insertMulti(
|
|
|
|
Language::localizedNameForId( LangCoder::code2toInt( lang.toLatin1().data() ) ),
|
|
|
|
QPair< QIcon, QString >(
|
|
|
|
QIcon( QString( ":/flags/%1.png" ).arg( reg.toLower() ) ), lang + "_" + reg ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
for( QMap< QString, QPair< QIcon, QString > >::iterator i = sortedHelps.begin();
|
|
|
|
i != sortedHelps.end(); ++i )
|
|
|
|
ui.helpLanguage->addItem( i.value().first, i.key(), i.value().second );
|
|
|
|
|
|
|
|
for( int x = 0; x < ui.helpLanguage->count(); ++x )
|
|
|
|
if ( ui.helpLanguage->itemData( x ).toString() == p.helpLanguage )
|
|
|
|
{
|
|
|
|
ui.helpLanguage->setCurrentIndex( x );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-07-19 17:07:32 +00:00
|
|
|
ui.displayStyle->addItem( QIcon( ":/icons/programicon_old.png" ), tr( "Default" ), QString() );
|
2013-03-23 16:48:31 +00:00
|
|
|
ui.displayStyle->addItem( QIcon( ":/icons/programicon.png" ), tr( "Modern" ), QString( "modern" ) );
|
2009-05-11 11:03:36 +00:00
|
|
|
ui.displayStyle->addItem( QIcon( ":/icons/icon32_dsl.png" ), tr( "Lingvo" ), QString( "lingvo" ) );
|
2012-01-28 03:07:23 +00:00
|
|
|
ui.displayStyle->addItem( QIcon( ":/icons/icon32_bgl.png" ), tr( "Babylon" ), QString( "babylon" ) );
|
2013-03-23 18:17:40 +00:00
|
|
|
ui.displayStyle->addItem( QIcon( ":/icons/icon32_lingoes.png" ), tr( "Lingoes" ), QString( "lingoes" ) );
|
2013-03-24 20:19:03 +00:00
|
|
|
ui.displayStyle->addItem( QIcon( ":/icons/icon32_lingoes.png" ), tr( "Lingoes-Blue" ), QString( "lingoes-blue" ) );
|
2009-05-11 11:03:36 +00:00
|
|
|
|
|
|
|
for( int x = 0; x < ui.displayStyle->count(); ++x )
|
|
|
|
if ( ui.displayStyle->itemData( x ).toString() == p.displayStyle )
|
|
|
|
{
|
|
|
|
ui.displayStyle->setCurrentIndex( x );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2020-11-12 15:57:10 +00:00
|
|
|
#ifdef Q_OS_WIN32
|
|
|
|
// 1 MB stands for 2^20 bytes on Windows. "MiB" is never used by this OS.
|
|
|
|
ui.maxNetworkCacheSize->setSuffix( tr( " MB" ) );
|
|
|
|
#endif
|
|
|
|
ui.maxNetworkCacheSize->setToolTip( ui.maxNetworkCacheSize->toolTip().arg( Config::getNetworkCacheDir() ) );
|
|
|
|
|
2009-04-13 12:51:25 +00:00
|
|
|
ui.newTabsOpenAfterCurrentOne->setChecked( p.newTabsOpenAfterCurrentOne );
|
|
|
|
ui.newTabsOpenInBackground->setChecked( p.newTabsOpenInBackground );
|
2011-06-23 14:17:09 +00:00
|
|
|
ui.hideSingleTab->setChecked( p.hideSingleTab );
|
2011-11-02 23:37:50 +00:00
|
|
|
ui.mruTabOrder->setChecked( p.mruTabOrder );
|
2009-02-05 20:55:00 +00:00
|
|
|
ui.enableTrayIcon->setChecked( p.enableTrayIcon );
|
|
|
|
ui.startToTray->setChecked( p.startToTray );
|
|
|
|
ui.closeToTray->setChecked( p.closeToTray );
|
2009-04-18 18:21:12 +00:00
|
|
|
ui.cbAutostart->setChecked( p.autoStart );
|
2010-04-08 20:37:59 +00:00
|
|
|
ui.doubleClickTranslates->setChecked( p.doubleClickTranslates );
|
2012-09-26 13:59:48 +00:00
|
|
|
ui.selectBySingleClick->setChecked( p.selectWordBySingleClick);
|
2011-05-07 13:42:49 +00:00
|
|
|
ui.escKeyHidesMainWindow->setChecked( p.escKeyHidesMainWindow );
|
2009-04-21 18:27:26 +00:00
|
|
|
|
|
|
|
ui.enableMainWindowHotkey->setChecked( p.enableMainWindowHotkey );
|
|
|
|
ui.mainWindowHotkey->setHotKey( p.mainWindowHotkey );
|
|
|
|
ui.enableClipboardHotkey->setChecked( p.enableClipboardHotkey );
|
|
|
|
ui.clipboardHotkey->setHotKey( p.clipboardHotkey );
|
|
|
|
|
2009-02-05 20:55:00 +00:00
|
|
|
ui.enableScanPopup->setChecked( p.enableScanPopup );
|
2009-02-08 20:20:02 +00:00
|
|
|
ui.startWithScanPopupOn->setChecked( p.startWithScanPopupOn );
|
2009-02-05 20:55:00 +00:00
|
|
|
ui.enableScanPopupModifiers->setChecked( p.enableScanPopupModifiers );
|
|
|
|
|
|
|
|
ui.altKey->setChecked( p.scanPopupModifiers & KeyboardState::Alt );
|
|
|
|
ui.ctrlKey->setChecked( p.scanPopupModifiers & KeyboardState::Ctrl );
|
|
|
|
ui.shiftKey->setChecked( p.scanPopupModifiers & KeyboardState::Shift );
|
|
|
|
ui.winKey->setChecked( p.scanPopupModifiers & KeyboardState::Win );
|
|
|
|
ui.leftAlt->setChecked( p.scanPopupModifiers & KeyboardState::LeftAlt );
|
|
|
|
ui.rightAlt->setChecked( p.scanPopupModifiers & KeyboardState::RightAlt );
|
|
|
|
ui.leftCtrl->setChecked( p.scanPopupModifiers & KeyboardState::LeftCtrl );
|
|
|
|
ui.rightCtrl->setChecked( p.scanPopupModifiers & KeyboardState::RightCtrl );
|
|
|
|
ui.leftShift->setChecked( p.scanPopupModifiers & KeyboardState::LeftShift );
|
|
|
|
ui.rightShift->setChecked( p.scanPopupModifiers & KeyboardState::RightShift );
|
|
|
|
|
2009-04-11 16:44:14 +00:00
|
|
|
ui.scanPopupAltMode->setChecked( p.scanPopupAltMode );
|
|
|
|
ui.scanPopupAltModeSecs->setValue( p.scanPopupAltModeSecs );
|
2018-04-16 12:23:22 +00:00
|
|
|
ui.ignoreOwnClipboardChanges->setChecked( p.ignoreOwnClipboardChanges );
|
2011-11-16 12:52:25 +00:00
|
|
|
ui.scanToMainWindow->setChecked( p.scanToMainWindow );
|
2011-07-09 19:26:30 +00:00
|
|
|
ui.scanPopupUseUIAutomation->setChecked( p.scanPopupUseUIAutomation );
|
|
|
|
ui.scanPopupUseIAccessibleEx->setChecked( p.scanPopupUseIAccessibleEx );
|
|
|
|
ui.scanPopupUseGDMessage->setChecked( p.scanPopupUseGDMessage );
|
Allow customizing unpinned scan popup window flags on X11 with Qt5
My tests in many desktop environments and window managers indicate that
no single configuration works perfectly in all environments. There are
also behavior differences between Qt::Popup and Qt::Tool flags, which
are not exactly bugs, so I suppose users might subjectively prefer
different options.
Customizing the flags allows the user to prevent unpinned scan popup
window flickering with Qt5 on Linux. In a way adding these options fixes
issue #645, which is: the scan popup window blinks rapidly, barely
noticeably in some applications, such as Calibre ebook-viewer
and Chromium. In this case the scan popup window usually ends up hidden
when selection ends, unless it was finished with a jerk.
I have tested the new options in 9 desktop environments and window
managers: at least one configuration for each eliminates #645 and makes
the scan popup window work the same as with Qt4 in this regard:
the popup window remains visible, text in the popup's translation line
keeps up with the text selection in the external application,
and the selected text is being translated on the fly.
Moreover, for each tested DE/WM, at least one configuration makes
the scan popup window work perfectly as far as I am concerned.
This issue was partially worked around with a 200ms scan popup delay
timer in the recent commit 58e41fe3ceb769cab37608e36637044e597ba1f8
for the duplicate issue #854. However the timer solution is incomplete
because it requires the user to select text quickly and without delays.
If global mouse selection does not change for 200ms while the left mouse
button is held down, the user will likely not see the scan popup when
(s)he finishes selection, and will have to try selecting again -
hopefully faster this time.
The 200ms delay is no longer critically important after this commit,
but it is still beneficial: the lookup query changes less often,
which in turn reduces article definition update frequency.
So the delay improves the UI (perhaps subjectively) and performance.
2018-04-09 17:50:23 +00:00
|
|
|
ui.scanPopupUnpinnedWindowFlags->setCurrentIndex( p.scanPopupUnpinnedWindowFlags );
|
|
|
|
ui.scanPopupUnpinnedBypassWMHint->setChecked( p.scanPopupUnpinnedBypassWMHint );
|
2009-04-11 16:44:14 +00:00
|
|
|
|
2012-09-11 13:03:10 +00:00
|
|
|
ui.storeHistory->setChecked( p.storeHistory );
|
2013-01-17 09:08:53 +00:00
|
|
|
ui.historyMaxSizeField->setValue( p.maxStringsInHistory );
|
2013-02-05 12:51:23 +00:00
|
|
|
ui.historySaveIntervalField->setValue( p.historyStoreInterval );
|
2012-09-16 10:19:47 +00:00
|
|
|
ui.alwaysExpandOptionalParts->setChecked( p.alwaysExpandOptionalParts );
|
2012-09-11 13:03:10 +00:00
|
|
|
|
2017-05-13 10:18:25 +00:00
|
|
|
ui.favoritesSaveIntervalField->setValue( p.favoritesStoreInterval );
|
2017-05-17 15:26:32 +00:00
|
|
|
ui.confirmFavoritesDeletion->setChecked( p.confirmFavoritesDeletion );
|
2017-05-13 10:18:25 +00:00
|
|
|
|
2013-06-02 11:20:33 +00:00
|
|
|
ui.collapseBigArticles->setChecked( p.collapseBigArticles );
|
|
|
|
ui.articleSizeLimit->setValue( p.articleSizeLimit );
|
2020-11-06 19:51:30 +00:00
|
|
|
ui.limitInputPhraseLength->setChecked( p.limitInputPhraseLength );
|
|
|
|
ui.inputPhraseLengthLimit->setValue( p.inputPhraseLengthLimit );
|
2018-06-13 16:00:42 +00:00
|
|
|
ui.ignoreDiacritics->setChecked( p.ignoreDiacritics );
|
2013-06-02 11:20:33 +00:00
|
|
|
|
2017-03-09 16:11:17 +00:00
|
|
|
ui.synonymSearchEnabled->setChecked( p.synonymSearchEnabled );
|
|
|
|
|
2013-06-11 18:31:01 +00:00
|
|
|
ui.maxDictsInContextMenu->setValue( p.maxDictionaryRefsInContextMenu );
|
|
|
|
|
2009-02-05 20:55:00 +00:00
|
|
|
// Different platforms have different keys available
|
|
|
|
|
|
|
|
#ifdef Q_OS_WIN32
|
|
|
|
ui.winKey->hide();
|
|
|
|
#else
|
|
|
|
ui.leftAlt->hide();
|
|
|
|
ui.rightAlt->hide();
|
|
|
|
ui.leftCtrl->hide();
|
|
|
|
ui.rightCtrl->hide();
|
|
|
|
ui.leftShift->hide();
|
|
|
|
ui.rightShift->hide();
|
2014-05-12 13:53:13 +00:00
|
|
|
#ifdef Q_OS_MAC
|
2014-02-17 13:48:05 +00:00
|
|
|
ui.altKey->setText( "Opt" );
|
|
|
|
ui.winKey->setText( "Ctrl" );
|
|
|
|
ui.ctrlKey->setText( "Cmd" );
|
|
|
|
#endif
|
2009-02-05 20:55:00 +00:00
|
|
|
#endif
|
2009-04-03 17:10:27 +00:00
|
|
|
|
2011-07-23 11:32:15 +00:00
|
|
|
//Platform-specific options
|
|
|
|
|
|
|
|
#ifndef Q_OS_WIN32
|
2012-09-11 13:03:10 +00:00
|
|
|
ui.groupBox_ScanPopupTechnologies->hide();
|
|
|
|
// ui.tabWidget->removeTab( 5 );
|
2011-07-23 11:32:15 +00:00
|
|
|
#endif
|
2009-04-03 17:10:27 +00:00
|
|
|
|
Allow customizing unpinned scan popup window flags on X11 with Qt5
My tests in many desktop environments and window managers indicate that
no single configuration works perfectly in all environments. There are
also behavior differences between Qt::Popup and Qt::Tool flags, which
are not exactly bugs, so I suppose users might subjectively prefer
different options.
Customizing the flags allows the user to prevent unpinned scan popup
window flickering with Qt5 on Linux. In a way adding these options fixes
issue #645, which is: the scan popup window blinks rapidly, barely
noticeably in some applications, such as Calibre ebook-viewer
and Chromium. In this case the scan popup window usually ends up hidden
when selection ends, unless it was finished with a jerk.
I have tested the new options in 9 desktop environments and window
managers: at least one configuration for each eliminates #645 and makes
the scan popup window work the same as with Qt4 in this regard:
the popup window remains visible, text in the popup's translation line
keeps up with the text selection in the external application,
and the selected text is being translated on the fly.
Moreover, for each tested DE/WM, at least one configuration makes
the scan popup window work perfectly as far as I am concerned.
This issue was partially worked around with a 200ms scan popup delay
timer in the recent commit 58e41fe3ceb769cab37608e36637044e597ba1f8
for the duplicate issue #854. However the timer solution is incomplete
because it requires the user to select text quickly and without delays.
If global mouse selection does not change for 200ms while the left mouse
button is held down, the user will likely not see the scan popup when
(s)he finishes selection, and will have to try selecting again -
hopefully faster this time.
The 200ms delay is no longer critically important after this commit,
but it is still beneficial: the lookup query changes less often,
which in turn reduces article definition update frequency.
So the delay improves the UI (perhaps subjectively) and performance.
2018-04-09 17:50:23 +00:00
|
|
|
#ifndef ENABLE_SPWF_CUSTOMIZATION
|
|
|
|
ui.groupBox_ScanPopupWindowFlags->hide();
|
|
|
|
#endif
|
|
|
|
|
2017-06-05 13:15:38 +00:00
|
|
|
#ifdef HAVE_X11
|
|
|
|
ui.showScanFlag->setChecked( p.showScanFlag);
|
|
|
|
#else
|
|
|
|
ui.showScanFlag->hide();
|
2018-04-16 12:23:22 +00:00
|
|
|
ui.ignoreOwnClipboardChanges->hide();
|
2017-06-05 13:15:38 +00:00
|
|
|
#endif
|
|
|
|
|
2009-04-10 21:07:03 +00:00
|
|
|
// Sound
|
|
|
|
|
|
|
|
ui.pronounceOnLoadMain->setChecked( p.pronounceOnLoadMain );
|
|
|
|
ui.pronounceOnLoadPopup->setChecked( p.pronounceOnLoadPopup );
|
|
|
|
|
2018-03-29 17:00:53 +00:00
|
|
|
ui.internalPlayerBackend->addItems( Config::InternalPlayerBackend::nameList() );
|
|
|
|
|
|
|
|
// Make sure that exactly one radio button in the group is checked and that
|
|
|
|
// on_useExternalPlayer_toggled() is called.
|
|
|
|
ui.useExternalPlayer->setChecked( true );
|
|
|
|
|
|
|
|
if( ui.internalPlayerBackend->count() > 0 )
|
|
|
|
{
|
|
|
|
// Checking ui.useInternalPlayer automatically unchecks ui.useExternalPlayer.
|
|
|
|
ui.useInternalPlayer->setChecked( p.useInternalPlayer );
|
|
|
|
|
|
|
|
int index = ui.internalPlayerBackend->findText( p.internalPlayerBackend.uiName() );
|
|
|
|
if( index < 0 ) // The specified backend is unavailable.
|
|
|
|
index = ui.internalPlayerBackend->findText( Config::InternalPlayerBackend::defaultBackend().uiName() );
|
|
|
|
Q_ASSERT( index >= 0 && "Logic error: the default backend must be present in the backend name list." );
|
|
|
|
ui.internalPlayerBackend->setCurrentIndex( index );
|
|
|
|
}
|
2013-05-05 10:22:12 +00:00
|
|
|
else
|
2018-03-29 17:00:53 +00:00
|
|
|
{
|
|
|
|
ui.useInternalPlayer->hide();
|
|
|
|
ui.internalPlayerBackend->hide();
|
|
|
|
}
|
2010-11-14 15:38:41 +00:00
|
|
|
|
2010-01-02 18:16:22 +00:00
|
|
|
ui.audioPlaybackProgram->setText( p.audioPlaybackProgram );
|
2009-04-10 21:07:03 +00:00
|
|
|
|
2009-09-29 13:01:05 +00:00
|
|
|
if ( !isRECORDBroken() )
|
|
|
|
ui.brokenXRECORD->hide();
|
|
|
|
|
2009-04-03 17:10:27 +00:00
|
|
|
// Proxy server
|
|
|
|
|
|
|
|
ui.useProxyServer->setChecked( p.proxyServer.enabled );
|
|
|
|
|
|
|
|
ui.proxyType->addItem( "SOCKS5" );
|
|
|
|
ui.proxyType->addItem( "HTTP Transp." );
|
|
|
|
ui.proxyType->addItem( "HTTP Caching" );
|
|
|
|
|
|
|
|
ui.proxyType->setCurrentIndex( p.proxyServer.type );
|
|
|
|
|
|
|
|
ui.proxyHost->setText( p.proxyServer.host );
|
|
|
|
ui.proxyPort->setValue( p.proxyServer.port );
|
|
|
|
|
|
|
|
ui.proxyUser->setText( p.proxyServer.user );
|
|
|
|
ui.proxyPassword->setText( p.proxyServer.password );
|
2009-04-20 19:54:34 +00:00
|
|
|
|
2014-04-01 17:00:13 +00:00
|
|
|
if( p.proxyServer.useSystemProxy )
|
|
|
|
{
|
|
|
|
ui.systemProxy->setChecked( true );
|
|
|
|
ui.customSettingsGroup->setEnabled( false );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ui.customProxy->setChecked( true );
|
|
|
|
ui.customSettingsGroup->setEnabled( p.proxyServer.enabled );
|
|
|
|
}
|
|
|
|
|
|
|
|
connect( ui.customProxy, SIGNAL( toggled( bool ) ),
|
|
|
|
this, SLOT( customProxyToggled( bool ) ) );
|
|
|
|
|
|
|
|
connect( ui.useProxyServer, SIGNAL( toggled( bool ) ),
|
|
|
|
this, SLOT( customProxyToggled( bool ) ) );
|
|
|
|
|
2009-04-20 19:54:34 +00:00
|
|
|
ui.checkForNewReleases->setChecked( p.checkForNewReleases );
|
2009-08-31 12:18:08 +00:00
|
|
|
ui.disallowContentFromOtherSites->setChecked( p.disallowContentFromOtherSites );
|
2011-05-08 21:19:08 +00:00
|
|
|
ui.enableWebPlugins->setChecked( p.enableWebPlugins );
|
2013-04-08 12:20:12 +00:00
|
|
|
ui.hideGoldenDictHeader->setChecked( p.hideGoldenDictHeader );
|
2020-11-12 15:57:10 +00:00
|
|
|
ui.maxNetworkCacheSize->setValue( p.maxNetworkCacheSize );
|
|
|
|
ui.clearNetworkCacheOnExit->setChecked( p.clearNetworkCacheOnExit );
|
2012-12-10 14:14:13 +00:00
|
|
|
|
|
|
|
// Add-on styles
|
|
|
|
ui.addonStylesLabel->setVisible( ui.addonStyles->count() > 1 );
|
|
|
|
ui.addonStyles->setCurrentStyle( p.addonStyle );
|
2014-04-17 14:31:51 +00:00
|
|
|
|
|
|
|
// Full-text search parameters
|
|
|
|
ui.ftsGroupBox->setChecked( p.fts.enabled );
|
|
|
|
|
|
|
|
ui.allowAard->setChecked( !p.fts.disabledTypes.contains( "AARD", Qt::CaseInsensitive ) );
|
|
|
|
ui.allowBGL->setChecked( !p.fts.disabledTypes.contains( "BGL", Qt::CaseInsensitive ) );
|
|
|
|
ui.allowDictD->setChecked( !p.fts.disabledTypes.contains( "DICTD", Qt::CaseInsensitive ) );
|
|
|
|
ui.allowDSL->setChecked( !p.fts.disabledTypes.contains( "DSL", Qt::CaseInsensitive ) );
|
|
|
|
ui.allowMDict->setChecked( !p.fts.disabledTypes.contains( "MDICT", Qt::CaseInsensitive ) );
|
|
|
|
ui.allowSDict->setChecked( !p.fts.disabledTypes.contains( "SDICT", Qt::CaseInsensitive ) );
|
2015-01-22 15:17:05 +00:00
|
|
|
ui.allowSlob->setChecked( !p.fts.disabledTypes.contains( "SLOB", Qt::CaseInsensitive ) );
|
2014-04-17 14:31:51 +00:00
|
|
|
ui.allowStardict->setChecked( !p.fts.disabledTypes.contains( "STARDICT", Qt::CaseInsensitive ) );
|
|
|
|
ui.allowXDXF->setChecked( !p.fts.disabledTypes.contains( "XDXF", Qt::CaseInsensitive ) );
|
|
|
|
ui.allowZim->setChecked( !p.fts.disabledTypes.contains( "ZIM", Qt::CaseInsensitive ) );
|
2014-05-20 13:59:56 +00:00
|
|
|
ui.allowEpwing->setChecked( !p.fts.disabledTypes.contains( "EPWING", Qt::CaseInsensitive ) );
|
2017-03-06 15:07:39 +00:00
|
|
|
ui.allowGls->setChecked( !p.fts.disabledTypes.contains( "GLS", Qt::CaseInsensitive ) );
|
2014-04-20 08:42:45 +00:00
|
|
|
#ifndef MAKE_ZIM_SUPPORT
|
|
|
|
ui.allowZim->hide();
|
2015-01-22 15:17:05 +00:00
|
|
|
ui.allowSlob->hide();
|
2014-05-20 13:59:56 +00:00
|
|
|
#endif
|
|
|
|
#ifdef NO_EPWING_SUPPORT
|
|
|
|
ui.allowEpwing->hide();
|
2014-04-20 08:42:45 +00:00
|
|
|
#endif
|
2014-04-17 14:31:51 +00:00
|
|
|
ui.maxDictionarySize->setValue( p.fts.maxDictionarySize );
|
2009-02-05 20:55:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Config::Preferences Preferences::getPreferences()
|
|
|
|
{
|
|
|
|
Config::Preferences p;
|
|
|
|
|
2009-04-12 20:46:25 +00:00
|
|
|
p.interfaceLanguage =
|
|
|
|
ui.interfaceLanguage->itemData(
|
|
|
|
ui.interfaceLanguage->currentIndex() ).toString();
|
|
|
|
|
2014-06-25 14:01:11 +00:00
|
|
|
p.helpLanguage =
|
|
|
|
ui.helpLanguage->itemData(
|
|
|
|
ui.helpLanguage->currentIndex() ).toString();
|
|
|
|
|
2009-05-11 11:03:36 +00:00
|
|
|
p.displayStyle =
|
|
|
|
ui.displayStyle->itemData(
|
|
|
|
ui.displayStyle->currentIndex() ).toString();
|
|
|
|
|
2009-04-13 12:51:25 +00:00
|
|
|
p.newTabsOpenAfterCurrentOne = ui.newTabsOpenAfterCurrentOne->isChecked();
|
|
|
|
p.newTabsOpenInBackground = ui.newTabsOpenInBackground->isChecked();
|
2011-06-23 14:17:09 +00:00
|
|
|
p.hideSingleTab = ui.hideSingleTab->isChecked();
|
2011-11-02 23:37:50 +00:00
|
|
|
p.mruTabOrder = ui.mruTabOrder->isChecked();
|
2009-02-08 20:20:02 +00:00
|
|
|
p.enableTrayIcon = ui.enableTrayIcon->isChecked();
|
|
|
|
p.startToTray = ui.startToTray->isChecked();
|
|
|
|
p.closeToTray = ui.closeToTray->isChecked();
|
2009-04-18 18:21:12 +00:00
|
|
|
p.autoStart = ui.cbAutostart->isChecked();
|
2010-04-08 20:37:59 +00:00
|
|
|
p.doubleClickTranslates = ui.doubleClickTranslates->isChecked();
|
2012-09-26 13:59:48 +00:00
|
|
|
p.selectWordBySingleClick = ui.selectBySingleClick->isChecked();
|
2011-05-07 13:42:49 +00:00
|
|
|
p.escKeyHidesMainWindow = ui.escKeyHidesMainWindow->isChecked();
|
2009-04-21 18:27:26 +00:00
|
|
|
|
|
|
|
p.enableMainWindowHotkey = ui.enableMainWindowHotkey->isChecked();
|
|
|
|
p.mainWindowHotkey = ui.mainWindowHotkey->getHotKey();
|
|
|
|
p.enableClipboardHotkey = ui.enableClipboardHotkey->isChecked();
|
|
|
|
p.clipboardHotkey = ui.clipboardHotkey->getHotKey();
|
|
|
|
|
2009-02-08 20:20:02 +00:00
|
|
|
p.enableScanPopup = ui.enableScanPopup->isChecked();
|
|
|
|
p.startWithScanPopupOn = ui.startWithScanPopupOn->isChecked();
|
|
|
|
p.enableScanPopupModifiers = ui.enableScanPopupModifiers->isChecked();
|
2009-02-05 20:55:00 +00:00
|
|
|
|
|
|
|
p.scanPopupModifiers += ui.altKey->isChecked() ? KeyboardState::Alt : 0;
|
|
|
|
p.scanPopupModifiers += ui.ctrlKey->isChecked() ? KeyboardState::Ctrl: 0;
|
|
|
|
p.scanPopupModifiers += ui.shiftKey->isChecked() ? KeyboardState::Shift: 0;
|
|
|
|
p.scanPopupModifiers += ui.winKey->isChecked() ? KeyboardState::Win: 0;
|
|
|
|
p.scanPopupModifiers += ui.leftAlt->isChecked() ? KeyboardState::LeftAlt: 0;
|
|
|
|
p.scanPopupModifiers += ui.rightAlt->isChecked() ? KeyboardState::RightAlt: 0;
|
|
|
|
p.scanPopupModifiers += ui.leftCtrl->isChecked() ? KeyboardState::LeftCtrl: 0;
|
|
|
|
p.scanPopupModifiers += ui.rightCtrl->isChecked() ? KeyboardState::RightCtrl: 0;
|
|
|
|
p.scanPopupModifiers += ui.leftShift->isChecked() ? KeyboardState::LeftShift: 0;
|
|
|
|
p.scanPopupModifiers += ui.rightShift->isChecked() ? KeyboardState::RightShift: 0;
|
|
|
|
|
2009-04-11 16:44:14 +00:00
|
|
|
p.scanPopupAltMode = ui.scanPopupAltMode->isChecked();
|
|
|
|
p.scanPopupAltModeSecs = ui.scanPopupAltModeSecs->value();
|
2018-04-16 12:23:22 +00:00
|
|
|
p.ignoreOwnClipboardChanges = ui.ignoreOwnClipboardChanges->isChecked();
|
2011-11-16 12:52:25 +00:00
|
|
|
p.scanToMainWindow = ui.scanToMainWindow->isChecked();
|
2017-06-05 13:15:38 +00:00
|
|
|
#ifdef HAVE_X11
|
|
|
|
p.showScanFlag= ui.showScanFlag->isChecked();
|
|
|
|
#endif
|
2011-07-09 19:26:30 +00:00
|
|
|
p.scanPopupUseUIAutomation = ui.scanPopupUseUIAutomation->isChecked();
|
|
|
|
p.scanPopupUseIAccessibleEx = ui.scanPopupUseIAccessibleEx->isChecked();
|
|
|
|
p.scanPopupUseGDMessage = ui.scanPopupUseGDMessage->isChecked();
|
Allow customizing unpinned scan popup window flags on X11 with Qt5
My tests in many desktop environments and window managers indicate that
no single configuration works perfectly in all environments. There are
also behavior differences between Qt::Popup and Qt::Tool flags, which
are not exactly bugs, so I suppose users might subjectively prefer
different options.
Customizing the flags allows the user to prevent unpinned scan popup
window flickering with Qt5 on Linux. In a way adding these options fixes
issue #645, which is: the scan popup window blinks rapidly, barely
noticeably in some applications, such as Calibre ebook-viewer
and Chromium. In this case the scan popup window usually ends up hidden
when selection ends, unless it was finished with a jerk.
I have tested the new options in 9 desktop environments and window
managers: at least one configuration for each eliminates #645 and makes
the scan popup window work the same as with Qt4 in this regard:
the popup window remains visible, text in the popup's translation line
keeps up with the text selection in the external application,
and the selected text is being translated on the fly.
Moreover, for each tested DE/WM, at least one configuration makes
the scan popup window work perfectly as far as I am concerned.
This issue was partially worked around with a 200ms scan popup delay
timer in the recent commit 58e41fe3ceb769cab37608e36637044e597ba1f8
for the duplicate issue #854. However the timer solution is incomplete
because it requires the user to select text quickly and without delays.
If global mouse selection does not change for 200ms while the left mouse
button is held down, the user will likely not see the scan popup when
(s)he finishes selection, and will have to try selecting again -
hopefully faster this time.
The 200ms delay is no longer critically important after this commit,
but it is still beneficial: the lookup query changes less often,
which in turn reduces article definition update frequency.
So the delay improves the UI (perhaps subjectively) and performance.
2018-04-09 17:50:23 +00:00
|
|
|
p.scanPopupUnpinnedWindowFlags = Config::spwfFromInt( ui.scanPopupUnpinnedWindowFlags->currentIndex() );
|
|
|
|
p.scanPopupUnpinnedBypassWMHint = ui.scanPopupUnpinnedBypassWMHint->isChecked();
|
2009-04-11 16:44:14 +00:00
|
|
|
|
2012-09-11 13:03:10 +00:00
|
|
|
p.storeHistory = ui.storeHistory->isChecked();
|
2013-01-17 09:08:53 +00:00
|
|
|
p.maxStringsInHistory = ui.historyMaxSizeField->text().toUInt();
|
2013-02-05 12:51:23 +00:00
|
|
|
p.historyStoreInterval = ui.historySaveIntervalField->text().toUInt();
|
2012-09-16 10:19:47 +00:00
|
|
|
p.alwaysExpandOptionalParts = ui.alwaysExpandOptionalParts->isChecked();
|
2012-09-11 13:03:10 +00:00
|
|
|
|
2017-05-13 10:18:25 +00:00
|
|
|
p.favoritesStoreInterval = ui.favoritesSaveIntervalField->text().toUInt();
|
2017-05-17 15:26:32 +00:00
|
|
|
p.confirmFavoritesDeletion = ui.confirmFavoritesDeletion->isChecked();
|
2017-05-13 10:18:25 +00:00
|
|
|
|
2013-06-02 11:20:33 +00:00
|
|
|
p.collapseBigArticles = ui.collapseBigArticles->isChecked();
|
2020-11-06 19:51:44 +00:00
|
|
|
p.articleSizeLimit = ui.articleSizeLimit->value();
|
2020-11-06 19:51:30 +00:00
|
|
|
p.limitInputPhraseLength = ui.limitInputPhraseLength->isChecked();
|
|
|
|
p.inputPhraseLengthLimit = ui.inputPhraseLengthLimit->value();
|
2018-06-13 16:00:42 +00:00
|
|
|
p.ignoreDiacritics = ui.ignoreDiacritics->isChecked();
|
2013-06-02 11:20:33 +00:00
|
|
|
|
2017-03-09 16:11:17 +00:00
|
|
|
p.synonymSearchEnabled = ui.synonymSearchEnabled->isChecked();
|
|
|
|
|
2013-06-11 18:31:01 +00:00
|
|
|
p.maxDictionaryRefsInContextMenu = ui.maxDictsInContextMenu->text().toInt();
|
|
|
|
|
2009-04-10 21:07:03 +00:00
|
|
|
p.pronounceOnLoadMain = ui.pronounceOnLoadMain->isChecked();
|
|
|
|
p.pronounceOnLoadPopup = ui.pronounceOnLoadPopup->isChecked();
|
2013-05-05 10:22:12 +00:00
|
|
|
p.useInternalPlayer = ui.useInternalPlayer->isChecked();
|
2018-03-29 17:00:53 +00:00
|
|
|
p.internalPlayerBackend.setUiName( ui.internalPlayerBackend->currentText() );
|
2009-04-10 21:07:03 +00:00
|
|
|
p.audioPlaybackProgram = ui.audioPlaybackProgram->text();
|
|
|
|
|
2009-04-03 17:10:27 +00:00
|
|
|
p.proxyServer.enabled = ui.useProxyServer->isChecked();
|
2014-04-01 17:00:13 +00:00
|
|
|
p.proxyServer.useSystemProxy = ui.systemProxy->isChecked();
|
2009-04-03 17:10:27 +00:00
|
|
|
|
|
|
|
p.proxyServer.type = ( Config::ProxyServer::Type ) ui.proxyType->currentIndex();
|
|
|
|
|
|
|
|
p.proxyServer.host = ui.proxyHost->text();
|
|
|
|
p.proxyServer.port = ( unsigned ) ui.proxyPort->value();
|
|
|
|
|
|
|
|
p.proxyServer.user = ui.proxyUser->text();
|
|
|
|
p.proxyServer.password = ui.proxyPassword->text();
|
|
|
|
|
2009-04-20 19:54:34 +00:00
|
|
|
p.checkForNewReleases = ui.checkForNewReleases->isChecked();
|
2009-08-31 12:18:08 +00:00
|
|
|
p.disallowContentFromOtherSites = ui.disallowContentFromOtherSites->isChecked();
|
2011-05-08 21:19:08 +00:00
|
|
|
p.enableWebPlugins = ui.enableWebPlugins->isChecked();
|
2013-04-08 12:20:12 +00:00
|
|
|
p.hideGoldenDictHeader = ui.hideGoldenDictHeader->isChecked();
|
2020-11-12 15:57:10 +00:00
|
|
|
p.maxNetworkCacheSize = ui.maxNetworkCacheSize->value();
|
|
|
|
p.clearNetworkCacheOnExit = ui.clearNetworkCacheOnExit->isChecked();
|
2009-04-20 19:54:34 +00:00
|
|
|
|
2012-12-10 14:14:13 +00:00
|
|
|
p.addonStyle = ui.addonStyles->getCurrentStyle();
|
|
|
|
|
2014-04-17 14:31:51 +00:00
|
|
|
p.fts.enabled = ui.ftsGroupBox->isChecked();
|
|
|
|
p.fts.maxDictionarySize = ui.maxDictionarySize->value();
|
|
|
|
|
|
|
|
if( !ui.allowAard->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "AARD";
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !ui.allowBGL->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "BGL";
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !ui.allowDictD->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "DICTD";
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !ui.allowDSL->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "DSL";
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !ui.allowMDict->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "MDICT";
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !ui.allowSDict->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "SDICT";
|
|
|
|
}
|
|
|
|
|
2015-01-22 15:17:05 +00:00
|
|
|
if( !ui.allowSlob->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "SLOB";
|
|
|
|
}
|
|
|
|
|
2014-04-17 14:31:51 +00:00
|
|
|
if( !ui.allowStardict->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "STARDICT";
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !ui.allowXDXF->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "XDXF";
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !ui.allowZim->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "ZIM";
|
|
|
|
}
|
|
|
|
|
2014-05-20 13:59:56 +00:00
|
|
|
if( !ui.allowEpwing->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "EPWING";
|
|
|
|
}
|
|
|
|
|
2017-03-06 15:07:39 +00:00
|
|
|
if( !ui.allowGls->isChecked() )
|
|
|
|
{
|
|
|
|
if( !p.fts.disabledTypes.isEmpty() )
|
|
|
|
p.fts.disabledTypes += ',';
|
|
|
|
p.fts.disabledTypes += "GLS";
|
|
|
|
}
|
|
|
|
|
2009-02-05 20:55:00 +00:00
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::enableScanPopupToggled( bool b )
|
|
|
|
{
|
|
|
|
ui.scanPopupModifiers->setEnabled( b && ui.enableScanPopupModifiers->isChecked() );
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::enableScanPopupModifiersToggled( bool b )
|
|
|
|
{
|
|
|
|
ui.scanPopupModifiers->setEnabled( b && ui.enableScanPopup->isChecked() );
|
2017-06-05 13:15:38 +00:00
|
|
|
if( b )
|
|
|
|
ui.showScanFlag->setChecked( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::showScanFlagToggled( bool b )
|
|
|
|
{
|
|
|
|
if( b )
|
|
|
|
ui.enableScanPopupModifiers->setChecked( false );
|
2009-02-05 20:55:00 +00:00
|
|
|
}
|
|
|
|
|
Allow customizing unpinned scan popup window flags on X11 with Qt5
My tests in many desktop environments and window managers indicate that
no single configuration works perfectly in all environments. There are
also behavior differences between Qt::Popup and Qt::Tool flags, which
are not exactly bugs, so I suppose users might subjectively prefer
different options.
Customizing the flags allows the user to prevent unpinned scan popup
window flickering with Qt5 on Linux. In a way adding these options fixes
issue #645, which is: the scan popup window blinks rapidly, barely
noticeably in some applications, such as Calibre ebook-viewer
and Chromium. In this case the scan popup window usually ends up hidden
when selection ends, unless it was finished with a jerk.
I have tested the new options in 9 desktop environments and window
managers: at least one configuration for each eliminates #645 and makes
the scan popup window work the same as with Qt4 in this regard:
the popup window remains visible, text in the popup's translation line
keeps up with the text selection in the external application,
and the selected text is being translated on the fly.
Moreover, for each tested DE/WM, at least one configuration makes
the scan popup window work perfectly as far as I am concerned.
This issue was partially worked around with a 200ms scan popup delay
timer in the recent commit 58e41fe3ceb769cab37608e36637044e597ba1f8
for the duplicate issue #854. However the timer solution is incomplete
because it requires the user to select text quickly and without delays.
If global mouse selection does not change for 200ms while the left mouse
button is held down, the user will likely not see the scan popup when
(s)he finishes selection, and will have to try selecting again -
hopefully faster this time.
The 200ms delay is no longer critically important after this commit,
but it is still beneficial: the lookup query changes less often,
which in turn reduces article definition update frequency.
So the delay improves the UI (perhaps subjectively) and performance.
2018-04-09 17:50:23 +00:00
|
|
|
void Preferences::on_scanPopupUnpinnedWindowFlags_currentIndexChanged( int index )
|
|
|
|
{
|
|
|
|
ui.scanPopupUnpinnedBypassWMHint->setEnabled( Config::spwfFromInt( index ) != Config::SPWF_default );
|
|
|
|
}
|
|
|
|
|
2009-02-05 20:55:00 +00:00
|
|
|
void Preferences::wholeAltClicked( bool b )
|
|
|
|
{
|
|
|
|
if ( b )
|
|
|
|
{
|
|
|
|
ui.leftAlt->setChecked( false );
|
|
|
|
ui.rightAlt->setChecked( false );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::wholeCtrlClicked( bool b )
|
|
|
|
{
|
|
|
|
if ( b )
|
|
|
|
{
|
|
|
|
ui.leftCtrl->setChecked( false );
|
|
|
|
ui.rightCtrl->setChecked( false );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::wholeShiftClicked( bool b )
|
|
|
|
{
|
|
|
|
if ( b )
|
|
|
|
{
|
|
|
|
ui.leftShift->setChecked( false );
|
|
|
|
ui.rightShift->setChecked( false );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::sideAltClicked( bool )
|
|
|
|
{
|
|
|
|
if ( ui.leftAlt->isChecked() || ui.rightAlt->isChecked() )
|
|
|
|
ui.altKey->setChecked( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::sideCtrlClicked( bool )
|
|
|
|
{
|
|
|
|
if ( ui.leftCtrl->isChecked() || ui.rightCtrl->isChecked() )
|
|
|
|
ui.ctrlKey->setChecked( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::sideShiftClicked( bool )
|
|
|
|
{
|
|
|
|
if ( ui.leftShift->isChecked() || ui.rightShift->isChecked() )
|
|
|
|
ui.shiftKey->setChecked( false );
|
|
|
|
}
|
2009-04-12 20:46:25 +00:00
|
|
|
|
2009-04-21 18:27:26 +00:00
|
|
|
void Preferences::on_enableMainWindowHotkey_toggled( bool checked )
|
|
|
|
{
|
|
|
|
ui.mainWindowHotkey->setEnabled( checked );
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::on_enableClipboardHotkey_toggled( bool checked )
|
|
|
|
{
|
|
|
|
ui.clipboardHotkey->setEnabled( checked );
|
|
|
|
}
|
|
|
|
|
2009-04-12 20:46:25 +00:00
|
|
|
void Preferences::on_buttonBox_accepted()
|
|
|
|
{
|
|
|
|
if ( prevInterfaceLanguage != ui.interfaceLanguage->currentIndex() )
|
|
|
|
QMessageBox::information( this, tr( "Changing Language" ),
|
|
|
|
tr( "Restart the program to apply the language change." ) );
|
|
|
|
}
|
|
|
|
|
2010-01-02 18:16:22 +00:00
|
|
|
void Preferences::on_useExternalPlayer_toggled( bool enabled )
|
|
|
|
{
|
2018-03-29 17:00:53 +00:00
|
|
|
ui.internalPlayerBackend->setEnabled( !enabled );
|
2010-01-02 18:16:22 +00:00
|
|
|
ui.audioPlaybackProgram->setEnabled( enabled );
|
|
|
|
}
|
|
|
|
|
2014-04-01 17:00:13 +00:00
|
|
|
void Preferences::customProxyToggled( bool )
|
|
|
|
{
|
|
|
|
ui.customSettingsGroup->setEnabled( ui.customProxy->isChecked()
|
|
|
|
&& ui.useProxyServer->isChecked() );
|
|
|
|
}
|
2014-06-24 13:55:06 +00:00
|
|
|
|
2020-11-12 15:57:10 +00:00
|
|
|
void Preferences::on_maxNetworkCacheSize_valueChanged( int value )
|
|
|
|
{
|
|
|
|
ui.clearNetworkCacheOnExit->setEnabled( value != 0 );
|
|
|
|
}
|
|
|
|
|
2014-06-24 13:55:06 +00:00
|
|
|
void Preferences::helpRequested()
|
|
|
|
{
|
|
|
|
if( !helpWindow )
|
|
|
|
{
|
|
|
|
MainWindow * mainWindow = qobject_cast< MainWindow * >( parentWidget() );
|
|
|
|
if( mainWindow )
|
|
|
|
mainWindow->closeGDHelp();
|
|
|
|
|
|
|
|
helpWindow = new Help::HelpWindow( this, cfg );
|
|
|
|
|
|
|
|
if( helpWindow )
|
|
|
|
{
|
|
|
|
helpWindow->setWindowFlags( Qt::Window );
|
|
|
|
|
|
|
|
connect( helpWindow, SIGNAL( needClose() ),
|
|
|
|
this, SLOT( closeHelp() ) );
|
|
|
|
helpWindow->showHelpFor( "Preferences" );
|
|
|
|
helpWindow->show();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( !helpWindow->isVisible() )
|
|
|
|
helpWindow->show();
|
|
|
|
|
|
|
|
helpWindow->activateWindow();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Preferences::closeHelp()
|
|
|
|
{
|
|
|
|
if( helpWindow )
|
|
|
|
helpWindow->hide();
|
|
|
|
}
|