[FEATURE] Choose font family for app

- Define app font family (or Qt default) in app options
- App font choices in options are now temporary unless saved
- Refactor to more general stylesheet methods (for later use)
- Add QgisAppInterface and sip methods for setting app font and family
This commit is contained in:
Larry Shaffer 2012-09-26 18:18:44 -06:00
parent d8c7c15fa3
commit 48e0a97f40
11 changed files with 246 additions and 28 deletions

View File

@ -32,6 +32,18 @@ class QgisInterface : QObject
public slots: // TODO: do these functions really need to be slots?
/** Set the app font size
* @param fontSize point size of font
* @note added in 2.0
*/
virtual void setFontSize( int fontSize ) = 0;
/** Set the app font family
* @param fontFamily family of font (not including any style)
* @note added in 2.0
*/
virtual void setFontFamily( QString fontFamily ) = 0;
//! Zoom to full extent of map layers
virtual void zoomFull() = 0;

View File

@ -83,9 +83,10 @@ QgsComposer::QgsComposer( QgisApp *qgis, const QString& title )
connect( mButtonBox, SIGNAL( rejected() ), this, SLOT( close() ) );
QSettings settings;
setAppStyleSheet();
int size = settings.value( "/IconSize", QGIS_ICON_SIZE ).toInt();
setIconSize( QSize( size, size ) );
setFontSize( settings.value( "/fontPointSize", QGIS_DEFAULT_FONTSIZE ).toInt() );
QToolButton* orderingToolButton = new QToolButton( this );
orderingToolButton->setPopupMode( QToolButton::InstantPopup );
@ -372,7 +373,14 @@ void QgsComposer::setIconSizes( int size )
void QgsComposer::setFontSize( int fontSize )
{
setStyleSheet( QString( "font-size: %1pt; " ).arg( fontSize ) );
//Convenience method for backwards compatibility
//Should set directly for QgisApp instead
QgisApp::instance()->setFontSize( fontSize );
}
void QgsComposer::setAppStyleSheet()
{
setStyleSheet( QgisApp::instance()->styleSheet() );
}
void QgsComposer::connectSlots()

View File

@ -60,6 +60,9 @@ class QgsComposer: public QMainWindow, private Ui::QgsComposerBase
void setIconSizes( int size );
void setFontSize( int size );
//! Set app stylesheet from main app
//! @note added in 2.0
void setAppStyleSheet();
//! Open and show, set defaults if first time
void open();

View File

@ -457,7 +457,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, QWidget * parent,
qApp->processEvents();
QSettings settings;
setFontSize( settings.value( "/fontPointSize", QGIS_DEFAULT_FONTSIZE ).toInt() );
setAppStyleSheet();
QWidget *centralWidget = this->centralWidget();
QGridLayout *centralLayout = new QGridLayout( centralWidget );
@ -1147,11 +1147,48 @@ void QgisApp::createActionGroups()
void QgisApp::setFontSize( int fontSize )
{
setStyleSheet( QString( "font-size: %1pt; " ).arg( fontSize ) );
if ( fontSize < 4 || 99 < fontSize ) // defaults for Options spinbox
{
return;
}
QSettings settings;
settings.setValue( "/fontPointSize", fontSize );
setAppStyleSheet();
}
void QgisApp::setFontFamily( const QString& fontFamily )
{
QSettings settings;
settings.setValue( "/fontFamily", fontFamily );
setAppStyleSheet();
}
void QgisApp::setAppStyleSheet()
{
QSettings settings;
int fontSize = settings.value( "/fontPointSize", QGIS_DEFAULT_FONTSIZE ).toInt();
QString fontFamily = settings.value( "/fontFamily", QVariant( "QtDefault" ) ).toString();
QString family = QString( "" ); // use default Qt font family
if ( fontFamily != "QtDefault" )
{
QFont *tempFont = new QFont( fontFamily );
// is exact family match returned from system?
if ( tempFont->family() == fontFamily )
{
family = QString( " \"%1\";" ).arg( fontFamily );
}
delete tempFont;
}
QString stylesheet = QString( "font: %1pt%2\n" ).arg( fontSize ).arg( family );
setStyleSheet( stylesheet );
// cascade styles to any current project composers
foreach ( QgsComposer *c, mPrintComposers )
{
c->setFontSize( fontSize );
c->setAppStyleSheet();
}
}

View File

@ -175,7 +175,13 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
void setTheme( QString themeName = "default" );
void setIconSizes( int size );
void setFontSize( int size );
void setFontSize( int fontSize );
//! Set app font family
//! @note added in 2.0
void setFontFamily( const QString& fontFamily );
//! Set app stylesheet from settings
//! @note added in 2.0
void setAppStyleSheet();
//! Setup the toolbar popup menus for a given theme
void setupToolbarPopups( QString themeName );

View File

@ -67,6 +67,16 @@ QgsLegendInterface* QgisAppInterface::legendInterface()
return &legendIface;
}
void QgisAppInterface::setFontSize( int fontSize )
{
qgis->setFontSize( fontSize );
}
void QgisAppInterface::setFontFamily( QString fontFamily )
{
qgis->setFontFamily( fontFamily );
}
void QgisAppInterface::zoomFull()
{
qgis->zoomFull();

View File

@ -50,6 +50,18 @@ class QgisAppInterface : public QgisInterface
QgsLegendInterface* legendInterface();
/* Exposed functions */
/** Set the app font size
* @param fontSize point size of font
* @note added in 2.0
*/
void setFontSize( int fontSize );
/** Set the app font family
* @param fontFamily family of font (not including any style)
* @note added in 2.0
*/
void setFontFamily( QString fontFamily );
//! Zoom map to full extent
void zoomFull();
//! Zoom map to previous extent

View File

@ -32,6 +32,7 @@
#include "qgsrasterformatsaveoptionswidget.h"
#include "qgsrasterpyramidsoptionswidget.h"
#include "qgsdialog.h"
#include "qgscomposer.h"
#include <QInputDialog>
#include <QFileDialog>
@ -76,7 +77,10 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
connect( cmbIconSize, SIGNAL( highlighted( const QString& ) ), this, SLOT( iconSizeChanged( const QString& ) ) );
connect( cmbIconSize, SIGNAL( textChanged( const QString& ) ), this, SLOT( iconSizeChanged( const QString& ) ) );
connect( spinFontSize, SIGNAL( valueChanged( const QString& ) ), this, SLOT( fontSizeChanged( const QString& ) ) );
connect( spinFontSize, SIGNAL( valueChanged( const QString& ) ), this, SLOT( updateAppStyleSheet() ) );
connect( mFontFamilyRadioQt, SIGNAL( released() ), this, SLOT( updateAppStyleSheet() ) );
connect( mFontFamilyRadioCustom, SIGNAL( released() ), this, SLOT( updateAppStyleSheet() ) );
connect( mFontFamilyComboBox, SIGNAL( currentFontChanged( const QFont& ) ), this, SLOT( updateAppStyleSheet() ) );
connect( cmbEllipsoid, SIGNAL( currentIndexChanged( int ) ), this, SLOT( updateEllipsoidUI( int ) ) );
@ -85,6 +89,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
#endif
connect( this, SIGNAL( accepted() ), this, SLOT( saveOptions() ) );
connect( this, SIGNAL( rejected() ), this, SLOT( rejectOptions() ) );
QStringList styles = QStyleFactory::keys();
foreach ( QString style, styles )
@ -373,7 +378,26 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
// set the theme combo
cmbTheme->setCurrentIndex( cmbTheme->findText( settings.value( "/Themes", "default" ).toString() ) );
cmbIconSize->setCurrentIndex( cmbIconSize->findText( settings.value( "/IconSize", QGIS_ICON_SIZE ).toString() ) );
// set font size and family
blockSignals( true );
spinFontSize->setValue( settings.value( "/fontPointSize", QGIS_DEFAULT_FONTSIZE ).toInt() );
QString fontFamily = settings.value( "/fontFamily", QVariant( "QtDefault" ) ).toString();
bool isQtDefault = ( fontFamily == QString( "QtDefault" ) );
mFontFamilyRadioQt->setChecked( isQtDefault );
mFontFamilyRadioCustom->setChecked( !isQtDefault );
if ( !isQtDefault )
{
QFont *tempFont = new QFont( fontFamily );
// is exact family match returned from system?
if ( tempFont->family() == fontFamily )
{
mFontFamilyComboBox->setCurrentFont( *tempFont );
}
delete tempFont;
}
blockSignals( false );
QString name = QApplication::style()->objectName();
cmbStyle->setCurrentIndex( cmbStyle->findText( name, Qt::MatchFixedString ) );
//set the state of the checkboxes
@ -741,9 +765,23 @@ void QgsOptions::iconSizeChanged( const QString &iconSize )
QgisApp::instance()->setIconSizes( iconSize.toInt() );
}
void QgsOptions::fontSizeChanged( const QString &fontSize )
void QgsOptions::updateAppStyleSheet()
{
QgisApp::instance()->setFontSize( fontSize.toInt() );
int fontSize = spinFontSize->value();
QString family = QString( "" ); // use default Qt font family
if ( mFontFamilyRadioCustom->isChecked() )
{
family = QString( " \"%1\";" ).arg( mFontFamilyComboBox->currentFont().family() );
}
QString stylesheet = QString( "font: %1pt%2" ).arg( fontSize ).arg( family );
QgisApp::instance()->setStyleSheet( stylesheet );
foreach ( QgsComposer* c, QgisApp::instance()->printComposers() )
{
c->setAppStyleSheet();
}
}
void QgsOptions::toggleEnableBackbuffer( int state )
@ -910,7 +948,16 @@ void QgsOptions::saveOptions()
}
settings.setValue( "/IconSize", cmbIconSize->currentText() );
// application stylesheet settings
settings.setValue( "/fontPointSize", spinFontSize->value() );
QString fontFamily = QString( "QtDefault" );
if ( mFontFamilyRadioCustom->isChecked() )
{
fontFamily = mFontFamilyComboBox->currentFont().family();
}
settings.setValue( "/fontFamily", fontFamily );
QgisApp::instance()->setAppStyleSheet();
// rasters settings
settings.setValue( "/Raster/defaultRedBand", spnRed->value() );
@ -1086,6 +1133,10 @@ void QgsOptions::saveOptions()
saveGdalDriverList();
}
void QgsOptions::rejectOptions()
{
QgisApp::instance()->setAppStyleSheet();
}
void QgsOptions::on_pbnSelectProjection_clicked()
{

View File

@ -65,13 +65,21 @@ class QgsOptions : public QDialog, private Ui::QgsOptionsBase
void on_pbnEditPyramidsOptions_pressed();
void editGdalDriver( const QString& driverName );
void saveOptions();
/*!
* Slot to reset any temporarily applied options on dialog close/cancel
* @note added in QGIS 2.0
*/
void rejectOptions();
//! Slot to change the theme this is handled when the user
// activates or highlights a theme name in the drop-down list
void themeChanged( const QString & );
void iconSizeChanged( const QString &iconSize );
void fontSizeChanged( const QString &fontSize );
/*!
* Slot to temporarily apply settings to app stylesheet
* @note added in QGIS 2.0
*/
void updateAppStyleSheet();
//! Slot to change backbuffering. This is handled when the user changes
// the value of the checkbox

View File

@ -76,6 +76,19 @@ class GUI_EXPORT QgisInterface : public QObject
public slots: // TODO: do these functions really need to be slots?
/* Exposed functions */
/** Set the app font size
* @param fontSize point size of font
* @note added in 2.0
*/
virtual void setFontSize( int fontSize ) = 0;
/** Set the app font family
* @param fontFamily family of font (not including any style)
* @note added in 2.0
*/
virtual void setFontFamily( QString fontFamily ) = 0;
//! Zoom to full extent of map layers
virtual void zoomFull() = 0;

View File

@ -33,7 +33,7 @@
<item row="2" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>4</number>
<number>0</number>
</property>
<property name="iconSize">
<size>
@ -437,29 +437,71 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_11">
<layout class="QHBoxLayout" name="horizontalLayout_27">
<item>
<widget class="QLabel" name="label_20">
<widget class="QLabel" name="label_43">
<property name="text">
<string>Menu size</string>
<string>Font</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QRadioButton" name="mFontFamilyRadioQt">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
<property name="text">
<string>Qt default</string>
</property>
</spacer>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="mFontFamilyRadioCustom">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QFontComboBox" name="mFontFamilyComboBox">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_20">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Size</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="spinFontSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimum">
<number>4</number>
</property>
@ -2993,8 +3035,8 @@
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>194</x>
<y>465</y>
<x>200</x>
<y>669</y>
</hint>
<hint type="destinationlabel">
<x>730</x>
@ -3009,8 +3051,8 @@
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>194</x>
<y>465</y>
<x>200</x>
<y>669</y>
</hint>
<hint type="destinationlabel">
<x>731</x>
@ -3018,5 +3060,21 @@
</hint>
</hints>
</connection>
<connection>
<sender>mFontFamilyRadioCustom</sender>
<signal>toggled(bool)</signal>
<receiver>mFontFamilyComboBox</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>450</x>
<y>508</y>
</hint>
<hint type="destinationlabel">
<x>518</x>
<y>508</y>
</hint>
</hints>
</connection>
</connections>
</ui>