28 #include <QApplication> 31 #include <QFileDialog> 32 #include <QDesktopWidget> 33 #include <QMessageBox> 35 #include <QFontDatabase> 37 #include <QLibraryInfo> 39 #include <fontconfig/fontconfig.h> 41 #define YUILogComponent "qt-ui" 42 #include <yui/YUILog.h> 43 #include <yui/YUISymbols.h> 44 #include <yui/Libyui_config.h> 51 #include "YQApplication.h" 52 #include "YQPackageSelectorPluginStub.h" 53 #include "YQGraphPluginStub.h" 54 #include "YQContextMenu.h" 62 static const char * default_font_family =
"Sans Serif";
71 , _qtTranslations( 0 )
73 , _autoNormalFontSize( -1 )
74 , _autoHeadingFontSize( -1 )
75 , _leftHandedMouse( false )
76 , _askedForLeftHandedMouse( false )
77 , _contextMenuPos ( QPoint (0, 0) )
80 yuiDebug() <<
"YQApplication constructor start" << endl;
82 yuiMilestone() <<
"QIcon::themeName = '" << QIcon::themeName() <<
"'" << endl;
86 iconLoader()->addIconSearchPath( ICONDIR
"/icons/" );
90 yuiDebug() <<
"YQApplication constructor end" << endl;
102 static string glob_language =
"";
106 const string & encoding )
108 glob_language = language;
109 YApplication::setLanguage( language, encoding );
112 bool oldReverseLayout = YApplication::reverseLayout();
116 if ( oldReverseLayout != YApplication::reverseLayout() )
118 YDialog * dialog = YDialog::topmostDialog(
false );
121 dialog->recalcLayout();
129 QString path = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
132 if (glob_language ==
"")
133 language = QLocale::system().name();
135 language = glob_language.c_str();
137 QString transFile = QString(
"qt_%1.qm").arg( language );
139 yuiMilestone() <<
"Selected language: " << language << endl;
141 if ( path.isEmpty() )
143 yuiWarning() <<
"Qt locale directory not set - " 144 <<
"no translations for predefined Qt dialogs" 154 yuiWarning() <<
"Can't load translations for predefined Qt dialogs for " 159 yuiMilestone() <<
"Loaded translations for predefined Qt dialogs for " 164 if ( qApp->layoutDirection() == Qt::RightToLeft )
165 YApplication::setReverseLayout(
true );
173 QString lang( language.c_str() );
178 if ( lang.startsWith(
"ar" ) ||
179 lang.startsWith(
"fa" ) ||
180 lang.startsWith(
"he" ) )
182 yuiMilestone() <<
"Using reverse layout for " << language << endl;
184 qApp->setLayoutDirection( Qt::RightToLeft );
185 YApplication::setReverseLayout(
true );
189 qApp->setLayoutDirection( Qt::LeftToRight );
190 YApplication::setReverseLayout(
false );
217 _langFonts =
new QSettings( LANG_FONTS_FILE, QSettings::IniFormat );
220 if (
_langFonts->status() != QSettings::NoError )
221 yuiError() <<
"Error reading " <<
_langFonts->fileName() << endl;
223 yuiMilestone() <<
_langFonts->fileName() <<
" read OK" 224 << qPrintable(
_langFonts->allKeys().join(
"-" ) )
228 QString lang = language.c_str();
230 if ( ! encoding.empty() )
231 lang += QString(
"." ) + encoding.c_str();
234 bool reloadFont =
false;
238 lang = language.c_str();
241 lang.replace( QRegExp(
"_.*$" ),
"" );
246 QStringList fontList =
248 for (
int i = 0; i < fontList.size(); ++i )
250 yuiMilestone() <<
fontKey( lang ) <<
" adding " << fontList.at( i ) << endl;
251 QFontDatabase::addApplicationFont( fontList.at( i ) );
265 yuiMilestone() <<
"Reloading fonts" << endl;
270 foreach ( QWidget *widget, QApplication::allWidgets() )
272 QFont wfont( widget->font() );
274 widget->setFont( wfont );
277 QFont font( qApp->font() );
281 yuiMilestone() <<
"Removing the key " << lang << endl;
286 yuiDebug() <<
"No font change" << endl;
295 if ( lang.isEmpty() )
298 return QString(
"font[%1]").arg( lang );
317 if ( ! _currentFont )
324 _currentFont->setPixelSize( _autoNormalFontSize );
325 _currentFont->setWeight( QFont::Normal );
327 yuiMilestone() <<
"Loaded " << _autoNormalFontSize
328 <<
" pixel font: " << _currentFont->toString()
331 qApp->setFont( * _currentFont);
336 _currentFont =
new QFont( qApp->font() );
340 return * _currentFont;
350 _boldFont->setBold(
true );
364 if ( ! _headingFont )
371 _headingFont->setPixelSize( _autoHeadingFontSize );
372 _headingFont->setWeight( QFont::Bold );
374 yuiMilestone() <<
"Loaded " << _autoHeadingFontSize
375 <<
" pixel bold font: " << _headingFont->toString()
380 _headingFont =
new QFont(
_fontFamily, 14, QFont::Bold );
384 return * _headingFont;
404 _autoFonts = useAutoFonts;
411 if ( _autoNormalFontSize >= 0 )
414 int x = defaultWidth();
415 int y = defaultHeight();
420 if ( x >= 800 && y >= 600 )
426 if ( x >= 1024 && y >= 768 )
432 if ( x >= 1280 && y >= 1024 )
456 _autoNormalFontSize = normal;
457 _autoHeadingFontSize = heading;
459 yuiMilestone() <<
"Selecting auto fonts - normal: " << _autoNormalFontSize
460 <<
", heading: " << _autoHeadingFontSize <<
" (bold)" 472 if ( sym == YUIGlyph_ArrowLeft ) unicodeChar = QChar( reverseLayout() ? 0x2192 : 0x2190 );
473 else if ( sym == YUIGlyph_ArrowRight ) unicodeChar = QChar( reverseLayout() ? 0x2190 : 0x2192 );
474 else if ( sym == YUIGlyph_ArrowUp ) unicodeChar = QChar( 0x2191 );
475 else if ( sym == YUIGlyph_ArrowDown ) unicodeChar = QChar( 0x2193 );
476 else if ( sym == YUIGlyph_CheckMark ) unicodeChar = QChar( 0x2714 );
477 else if ( sym == YUIGlyph_BulletArrowRight ) unicodeChar = QChar( 0x279c );
478 else if ( sym == YUIGlyph_BulletCircle ) unicodeChar = QChar( 0x274d );
479 else if ( sym == YUIGlyph_BulletSquare ) unicodeChar = QChar( 0x274f );
482 return toUTF8( QString( unicodeChar ) );
488 const string & headline )
493 QFileDialog::getExistingDirectory( 0,
494 fromUTF8( headline ) ,
495 fromUTF8( startDir ), QFileDialog::DontUseNativeDialog);
499 return toUTF8( dirName );
505 const string & filter,
506 const string & headline )
510 QFileDialog* dialog =
new QFileDialog( 0,
511 fromUTF8( headline ),
512 fromUTF8( startWith ),
514 dialog->setFileMode( QFileDialog::ExistingFile );
515 dialog->setFilter( QDir::System | dialog->filter() );
516 dialog->setOptions( QFileDialog::DontUseNativeDialog );
519 if( dialog->exec() == QDialog::Accepted )
520 fileName = dialog->selectedFiles().value( 0 );
525 return toUTF8( fileName );
531 const string & filter,
532 const string & headline )
538 fromUTF8( headline ) );
541 return toUTF8( fileName );
549 YDialog * currentDialog = YDialog::currentDialog(
false );
552 parent = (QWidget *) currentDialog->widgetRep();
555 menu->addItems(itemCollection);
563 const QString & filter,
564 const QString & headline )
569 YDialog * currentDialog = YDialog::currentDialog(
false );
571 parent = (QWidget *) currentDialog->widgetRep();
577 fileName = QFileDialog::getSaveFileName( parent,
580 filter, 0, QFileDialog::DontUseNativeDialog );
582 if ( fileName.isEmpty() )
590 YQApplication::displayWidth()
592 return qApp->desktop()->width();
597 YQApplication::displayHeight()
599 return qApp->desktop()->height();
604 YQApplication::displayDepth()
606 return qApp->desktop()->depth();
611 YQApplication::displayColors()
613 return 1L << qApp->desktop()->depth();
618 YQApplication::defaultWidth()
625 YQApplication::defaultHeight()
632 YQApplication::leftHandedMouse()
634 return _leftHandedMouse;
641 if ( _askedForLeftHandedMouse )
645 _(
"You clicked the right mouse button " 646 "where a left-click was expected." 648 "Switch left and right mouse buttons?" 652 YDialog * currentDialog = YDialog::currentDialog(
false );
654 parent = (QWidget *) currentDialog->widgetRep();
656 int button = QMessageBox::question( parent,
658 _(
"Unexpected Click" ),
660 QMessageBox::Yes | QMessageBox::Default,
662 QMessageBox::Cancel | QMessageBox::Escape );
664 if ( button == QMessageBox::Yes )
667 const char * command =
669 "xmodmap -e \"pointer = 1 2 3\"":
670 "xmodmap -e \"pointer = 3 2 1\"";
672 _leftHandedMouse = ! _leftHandedMouse;
673 _askedForLeftHandedMouse =
false;
674 yuiMilestone() <<
"Switching mouse buttons: " << command << endl;
676 result = system( command );
678 yuiError() <<
"Calling '" << command <<
"' failed" << endl;
680 yuiError() <<
"Running '" << command <<
"' exited with " << result << endl;
682 else if ( button == 1 )
684 _askedForLeftHandedMouse =
true;
702 if ( dim==YD_HORIZ ) size *= ( 80/640.0 );
703 else size *= ( 25/480.0 );
778 QString qtTitle = fromUTF8( title );
779 YApplication::setApplicationTitle ( title );
781 qApp->setApplicationName(qtTitle);
787 QString qtIcon = fromUTF8( icon );
788 YApplication::setApplicationIcon ( icon );
789 QString icon_name = QFileInfo( qtIcon ).baseName();
791 if ( QIcon::hasThemeIcon( icon_name ) )
793 qApp->setWindowIcon( QIcon::fromTheme ( icon_name ) );
797 QPixmap pixmap( qtIcon );
799 if ( !pixmap.isNull() )
800 qApp->setWindowIcon( QIcon( pixmap ) );
int defaultSize(YUIDimension dim) const
Returns size for opt(defaultsize) dialogs (in one dimension).
virtual void normalCursor()
Change the (mouse) cursor back from busy status to normal.
virtual int deviceUnits(YUIDimension dim, float layoutUnits)
Convert logical layout spacing units into device dependent units.
virtual std::string glyph(const std::string &glyphSymbolName)
Return a std::string for a named glyph.
void setLayoutDirection(const std::string &language)
Set the layout direction (left-to-right or right-to-left) from 'language'.
void maybeLeftHandedUser()
A mouse click with the wrong mouse button was detected - e.g., a right click on a push button...
virtual QPoint contextMenuPos()
Return position of the context menu (in gloabl coordinates)
virtual ~YQApplication()
Destructor.
void setApplicationTitle(const QString &title)
Sets the application name for the window title.
virtual void setApplicationTitle(const std::string &title)
Set the application title.
virtual void busyCursor()
Change the (mouse) cursor to indicate busy status.
QSettings * _langFonts
Language-specific font settings.
void makeScreenShot(std::string filename)
Make a screen shot in .png format and save it to 'filename'.
void setAutoFonts(bool useAutoFonts)
Set whether or not fonts should automatically be picked.
void setLangFonts(const std::string &language, const std::string &encoding=std::string())
Set fonts according to the specified language and encoding.
void deleteFonts()
Delete the fonts so they will be reloaded upon their next usage.
QTranslator * _qtTranslations
Translator for the predefined Qt dialogs.
virtual bool openContextMenu(const YItemCollection &itemCollection)
Open a context menu for a widget.
QString fontKey(const QString &lang)
Constructs a key for the language specific font file: "font[lang]" for font[de_DE] = "Sans Serif" fon...
static YQGraphPluginStub * graphPlugin()
Return the package selector plugin singleton or creates it (including loading the plugin lib) if it d...
virtual void setContextMenuPos(QPoint contextMenuPos)
Sets the position of the context menu (in gloabl coordinates)
virtual void setApplicationIcon(const std::string &icon)
Set the application Icon.
virtual void makeScreenShot(const std::string &fileName)
Make a screen shot and save it to the specified file.
const QFont & headingFont()
Returns the application's heading font.
bool autoFonts() const
Returns 'true' if the UI automatically picks fonts, disregarding Qt standard settings.
QString _fontFamily
Font family or list of font families to use ("Sans Serif" etc.)
YQApplication()
Constructor.
virtual std::string askForExistingDirectory(const std::string &startDir, const std::string &headline)
Open a directory selection box and prompt the user for an existing directory.
virtual std::string askForSaveFileName(const std::string &startWith, const std::string &filter, const std::string &headline)
Open a file selection box and prompt the user for a file to save data to.
void busyCursor()
Show mouse cursor indicating busy state.
virtual void setLanguage(const std::string &language, const std::string &encoding=std::string())
Set language and encoding for the locale environment ($LANG).
virtual float layoutUnits(YUIDimension dim, int deviceUnits)
Convert device dependent units into logical layout spacing units.
const QFont & boldFont()
Returns the application's default bold font.
void loadPredefinedQtTranslations()
Load translations for Qt's predefined dialogs like file selection box etc.
void normalCursor()
Show normal mouse cursor not indicating busy status.
void pickAutoFonts()
Determine good fonts based on defaultsize geometry and set _auto_normal_font_size and _auto_heading_f...
static YQPackageSelectorPluginStub * packageSelectorPlugin()
Return the package selector plugin singleton or creates it (including loading the plugin lib) if it d...
static YQUI * ui()
Access the global Qt-UI.
const QFont & currentFont()
Returns the application's default font.
virtual std::string askForExistingFile(const std::string &startWith, const std::string &filter, const std::string &headline)
Open a file selection box and prompt the user for an existing file.