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" 60 static const char * default_font_family =
"Sans Serif";
68 , _qtTranslations( 0 )
70 , _autoNormalFontSize( -1 )
71 , _autoHeadingFontSize( -1 )
72 , _leftHandedMouse( false )
73 , _askedForLeftHandedMouse( false )
74 , _contextMenuPos ( QPoint (0, 0) )
77 yuiDebug() <<
"YQApplication constructor start" << std::endl;
81 iconLoader()->addIconSearchPath( ICONDIR
"/icons/" );
85 yuiDebug() <<
"YQApplication constructor end" << std::endl;
97 static std::string glob_language =
"";
101 const std::string & encoding )
103 glob_language = language;
104 YApplication::setLanguage( language, encoding );
107 bool oldReverseLayout = YApplication::reverseLayout();
111 if ( oldReverseLayout != YApplication::reverseLayout() )
113 YDialog * dialog = YDialog::topmostDialog(
false );
116 dialog->recalcLayout();
124 QString path = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
127 if (glob_language ==
"")
128 language = QLocale::system().name();
130 language = glob_language.c_str();
132 QString transFile = QString(
"qt_%1.qm").arg( language );
134 yuiMilestone() <<
"Selected language: " << language << std::endl;
136 if ( path.isEmpty() )
138 yuiWarning() <<
"Qt locale directory not set - " 139 <<
"no translations for predefined Qt dialogs" 149 yuiWarning() <<
"Can't load translations for predefined Qt dialogs for " 150 << language << std::endl;
154 yuiMilestone() <<
"Loaded translations for predefined Qt dialogs for " 155 << language << std::endl;
159 if ( qApp->layoutDirection() == Qt::RightToLeft )
160 YApplication::setReverseLayout(
true );
168 QString lang( language.c_str() );
172 if ( lang.startsWith(
"ar" ) ||
173 lang.startsWith(
"he" ) )
175 yuiMilestone() <<
"Using reverse layout for " << language << std::endl;
177 qApp->setLayoutDirection( Qt::RightToLeft );
178 YApplication::setReverseLayout(
true );
182 qApp->setLayoutDirection( Qt::LeftToRight );
183 YApplication::setReverseLayout(
false );
210 _langFonts =
new QSettings( LANG_FONTS_FILE, QSettings::IniFormat );
213 if (
_langFonts->status() != QSettings::NoError )
214 yuiError() <<
"Error reading " <<
_langFonts->fileName() << std::endl;
216 yuiMilestone() <<
_langFonts->fileName() <<
" read OK" 217 << qPrintable(
_langFonts->allKeys().join(
"-" ) )
221 QString lang = language.c_str();
223 if ( ! encoding.empty() )
224 lang += QString(
"." ) + encoding.c_str();
227 bool reloadFont =
false;
231 lang = language.c_str();
234 lang.replace( QRegExp(
"_.*$" ),
"" );
239 QStringList fontList =
241 for (
int i = 0; i < fontList.size(); ++i )
243 yuiMilestone() <<
fontKey( lang ) <<
" adding " << fontList.at( i ) << std::endl;
244 QFontDatabase::addApplicationFont( fontList.at( i ) );
257 yuiMilestone() <<
"Reloading fonts" << std::endl;
262 foreach ( QWidget *widget, QApplication::allWidgets() )
264 QFont wfont( widget->font() );
266 widget->setFont( wfont );
268 QFont font( qApp->font() );
272 yuiMilestone() <<
"Removing the key " << lang << std::endl;
277 yuiDebug() <<
"No font change" << std::endl;
286 if ( lang.isEmpty() )
289 return QString(
"font[%1]").arg( lang );
308 if ( ! _currentFont )
315 _currentFont->setPixelSize( _autoNormalFontSize );
316 _currentFont->setWeight( QFont::Normal );
318 yuiMilestone() <<
"Loaded " << _autoNormalFontSize
319 <<
" pixel font: " << _currentFont->toString()
322 qApp->setFont( * _currentFont);
327 _currentFont =
new QFont( qApp->font() );
331 return * _currentFont;
341 _boldFont->setBold(
true );
355 if ( ! _headingFont )
362 _headingFont->setPixelSize( _autoHeadingFontSize );
363 _headingFont->setWeight( QFont::Bold );
365 yuiMilestone() <<
"Loaded " << _autoHeadingFontSize
366 <<
" pixel bold font: " << _headingFont->toString()
371 _headingFont =
new QFont(
_fontFamily, 14, QFont::Bold );
375 return * _headingFont;
395 _autoFonts = useAutoFonts;
402 if ( _autoNormalFontSize >= 0 )
405 int x = defaultWidth();
406 int y = defaultHeight();
411 if ( x >= 800 && y >= 600 )
417 if ( x >= 1024 && y >= 768 )
423 if ( x >= 1280 && y >= 1024 )
447 _autoNormalFontSize = normal;
448 _autoHeadingFontSize = heading;
450 yuiMilestone() <<
"Selecting auto fonts - normal: " << _autoNormalFontSize
451 <<
", heading: " << _autoHeadingFontSize <<
" (bold)" 463 if ( sym == YUIGlyph_ArrowLeft ) unicodeChar = QChar( reverseLayout() ? 0x2192 : 0x2190 );
464 else if ( sym == YUIGlyph_ArrowRight ) unicodeChar = QChar( reverseLayout() ? 0x2190 : 0x2192 );
465 else if ( sym == YUIGlyph_ArrowUp ) unicodeChar = QChar( 0x2191 );
466 else if ( sym == YUIGlyph_ArrowDown ) unicodeChar = QChar( 0x2193 );
467 else if ( sym == YUIGlyph_CheckMark ) unicodeChar = QChar( 0x2714 );
468 else if ( sym == YUIGlyph_BulletArrowRight ) unicodeChar = QChar( 0x279c );
469 else if ( sym == YUIGlyph_BulletCircle ) unicodeChar = QChar( 0x274d );
470 else if ( sym == YUIGlyph_BulletSquare ) unicodeChar = QChar( 0x274f );
473 return toUTF8( QString( unicodeChar ) );
479 const std::string & headline )
484 QFileDialog::getExistingDirectory( 0,
485 fromUTF8( headline ) ,
486 fromUTF8( startDir ), QFileDialog::DontUseNativeDialog);
490 return toUTF8( dirName );
496 const std::string & filter,
497 const std::string & headline )
501 QFileDialog* dialog =
new QFileDialog( 0,
502 fromUTF8( headline ),
503 fromUTF8( startWith ),
505 dialog->setFileMode( QFileDialog::ExistingFile );
506 dialog->setFilter( QDir::System | dialog->filter() );
507 dialog->setOptions( QFileDialog::DontUseNativeDialog );
510 if( dialog->exec() == QDialog::Accepted )
511 fileName = dialog->selectedFiles().value( 0 );
516 return toUTF8( fileName );
522 const std::string & filter,
523 const std::string & headline )
529 fromUTF8( headline ) );
532 return toUTF8( fileName );
540 YDialog * currentDialog = YDialog::currentDialog(
false );
542 parent = (QWidget *) currentDialog->widgetRep();
545 menu->addItems(itemCollection);
553 const QString & filter,
554 const QString & headline )
559 YDialog * currentDialog = YDialog::currentDialog(
false );
561 parent = (QWidget *) currentDialog->widgetRep();
567 fileName = QFileDialog::getSaveFileName( parent,
570 filter, 0, QFileDialog::DontUseNativeDialog );
572 if ( fileName.isEmpty() )
573 return QString::null;
580 YQApplication::displayWidth()
582 return qApp->desktop()->width();
587 YQApplication::displayHeight()
589 return qApp->desktop()->height();
594 YQApplication::displayDepth()
596 return qApp->desktop()->depth();
601 YQApplication::displayColors()
603 return 1L << qApp->desktop()->depth();
608 YQApplication::defaultWidth()
615 YQApplication::defaultHeight()
622 YQApplication::leftHandedMouse()
624 return _leftHandedMouse;
631 if ( _askedForLeftHandedMouse )
635 _(
"You clicked the right mouse button " 636 "where a left-click was expected." 638 "Switch left and right mouse buttons?" 642 YDialog * currentDialog = YDialog::currentDialog(
false );
644 parent = (QWidget *) currentDialog->widgetRep();
646 int button = QMessageBox::question( parent,
648 _(
"Unexpected Click" ),
650 QMessageBox::Yes | QMessageBox::Default,
652 QMessageBox::Cancel | QMessageBox::Escape );
654 if ( button == QMessageBox::Yes )
657 const char * command =
659 "xmodmap -e \"pointer = 1 2 3\"":
660 "xmodmap -e \"pointer = 3 2 1\"";
662 _leftHandedMouse = ! _leftHandedMouse;
663 _askedForLeftHandedMouse =
false;
664 yuiMilestone() <<
"Switching mouse buttons: " << command << std::endl;
666 result = system( command );
668 yuiError() <<
"Calling '" << command <<
"' failed" << std::endl;
670 yuiError() <<
"Running '" << command <<
"' exited with " << result << std::endl;
672 else if ( button == 1 )
674 _askedForLeftHandedMouse =
true;
692 if ( dim==YD_HORIZ ) size *= ( 80/640.0 );
693 else size *= ( 25/480.0 );
766 QString qtTitle = fromUTF8( title );
767 YApplication::setApplicationTitle ( title );
769 qApp->setApplicationName(qtTitle);
774 QString qtIcon = fromUTF8( icon );
775 YApplication::setApplicationIcon ( icon );
776 QPixmap pixmap (qtIcon);
777 if ( !pixmap.isNull() )
778 qApp->setWindowIcon ( QIcon ( pixmap ) );
781 #include "YQApplication.moc" 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.