1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 // File: QtxFontEdit.cxx
23 // Author: Sergey TELKOV
25 #include "QtxFontEdit.h"
27 #include "QtxComboBox.h"
30 #include <QToolButton>
31 #include <QFontDialog>
32 #include <QFontDatabase>
33 #include <QFontComboBox>
37 \brief The QtxFontEdit class represents a widget for font
38 preference items editing.
40 The font preference item is represented as the drop-down combo box
41 filled with the list of available fonts. Additional controls for
42 modifying font properties ('bold', 'italic', font size, etc) are also
45 Initial font value can be set with setCurrentFont() method. Chosen font
46 can be retrieved with the currentFont() method.
48 Font properties can be set with the setFontSize(), setFontFamily(),
49 setFontScripting() methods and retrieved with fontSize(), fontFamily(),
50 fontScripting() methods.
52 Additional widgets for direct modyfing font properties are available
53 with use of setFeatures() method.
58 \param feat font widget features (ORed QtxFontEdit::Features flags)
59 \param parent parent widget
61 QtxFontEdit::QtxFontEdit( const int feat, QWidget* parent )
71 \param parent parent widget
73 All font widget features are enabled.
75 QtxFontEdit::QtxFontEdit( QWidget* parent )
85 QtxFontEdit::~QtxFontEdit()
90 \brief Get font widget features.
91 \return font widget features (ORed QtxFontEdit::Features flags)
94 int QtxFontEdit::features() const
100 \brief Set font widget features.
101 \param f font widget features (ORed QtxFontEdit::Features flags)
104 void QtxFontEdit::setFeatures( const int f )
106 if ( myFeatures == f )
114 \brief Get currently selected font.
118 QFont QtxFontEdit::currentFont() const
120 QFont fnt( fontFamily(), fontSize() );
122 int script = fontScripting();
123 fnt.setBold( script & Bold );
124 fnt.setItalic( script & Italic );
125 fnt.setUnderline( script & Underline );
126 fnt.setOverline( script & Shadow ); //addVtkFontPref( tr( "LABELS" ), valLblFontGr, "values_labeling_font" );
132 \brief Set currently selected font.
133 \param fnt current font
136 void QtxFontEdit::setCurrentFont( const QFont& fnt )
138 myFamily->blockSignals( true );
139 myCustomFams->blockSignals( true );
140 mySize->blockSignals( true );
141 myB->blockSignals( true );
142 myI->blockSignals( true );
143 myU->blockSignals( true );
145 setFontFamily( fnt.family() );
146 setFontSize( fnt.pointSize() );
147 setFontScripting( ( fnt.bold() ? Bold : 0 ) |
148 ( fnt.italic() ? Italic : 0 ) |
149 ( fnt.underline() ? Underline : 0 ) |
150 ( fnt.overline() ? Shadow : 0 ) );
152 myFamily->blockSignals( false );
153 myCustomFams->blockSignals( false );
154 mySize->blockSignals( false );
155 myB->blockSignals( false );
156 myI->blockSignals( false );
157 myU->blockSignals( false );
159 emit( changed( currentFont() ) );
163 \brief Get selected font family name.
164 \return current font family name
167 QString QtxFontEdit::fontFamily() const
169 if ( myMode == Native )
170 return myFamily->currentFont().family();
172 return myCustomFams->currentText();
176 \brief Get selected font size.
177 \return current font size
180 int QtxFontEdit::fontSize() const
183 int pSize = mySize->currentText().toInt( &ok );
184 return ok ? pSize : 0;
188 \brief Get selected font scripting.
189 \return current font scripting
190 \sa setFontScripting()
192 int QtxFontEdit::fontScripting() const
194 return ( myB->isChecked() ? Bold : 0 ) |
195 ( myI->isChecked() ? Italic : 0 ) |
196 ( myU->isChecked() ? Underline : 0 ) |
197 ( myS->isChecked() ? Shadow : 0 ) ;
201 \brief Set font family name.
202 \param fam new font family name
205 void QtxFontEdit::setFontFamily( const QString& fam )
207 if ( myMode == Native )
209 myFamily->setCurrentFont( QFont( fam ) );
210 onFontChanged( myFamily->currentFont() );
214 myCustomFams->setCurrentIndex( myCustomFams->findText( fam ) );
215 if ( !myCustomFams->signalsBlocked() )
216 emit( changed( currentFont() ) );
221 \brief Set font size.
222 \param fam new font size
225 void QtxFontEdit::setFontSize( const int s )
230 int idx = mySize->findText( QString::number( s ) );
232 mySize->setCurrentIndex( idx );
233 else if ( mySize->isEditable() )
234 mySize->setEditText( QString::number( s ) );
238 \brief Set font scripting.
239 \param fam new font scripting
242 void QtxFontEdit::setFontScripting( const int script )
244 myB->setChecked( script & Bold );
245 myI->setChecked( script & Italic );
246 myU->setChecked( script & Underline );
247 myS->setChecked( script & Shadow );
251 \brief Update widget state
253 void QtxFontEdit::updateState()
255 int feat = features();
257 myFamily->setVisible( ( feat & Family ) && myMode == Native );
258 myCustomFams->setVisible( ( feat & Family ) && myMode == Custom );
259 mySize->setVisible( feat & Size );
260 myB->setVisible( feat & Bold );
261 myI->setVisible( feat & Italic );
262 myU->setVisible( feat & Underline );
263 myS->setVisible( feat & Shadow );
264 myPreview->setVisible( feat & Preview );
266 mySize->setEditable( feat & UserSize );
270 \brief Called when current font is changed.
273 void QtxFontEdit::onFontChanged( const QFont& /*f*/ )
275 bool blocked = mySize->signalsBlocked();
276 mySize->blockSignals( true );
281 QList<int> szList = QFontDatabase().pointSizes( fontFamily() );
283 for ( QList<int>::const_iterator it = szList.begin(); it != szList.end(); ++it )
284 sizes.append( QString::number( *it ) );
285 mySize->addItems( sizes );
289 mySize->blockSignals( blocked );
291 if ( !myFamily->signalsBlocked() )
292 emit( changed( currentFont() ) );
295 void QtxFontEdit::onPropertyChanged()
297 emit( changed( currentFont() ) );
301 \brief Called when "Preview" button is clicked.
304 void QtxFontEdit::onPreview( bool /*on*/ )
307 QFont fnt = QFontDialog::getFont( &ok, currentFont() );
310 setCurrentFont( fnt );
314 \brief Perform internal intialization.
316 void QtxFontEdit::initialize()
318 QHBoxLayout* base = new QHBoxLayout( this );
319 base->setMargin( 0 );
320 base->setSpacing( 5 );
322 base->addWidget( myFamily = new QFontComboBox( this ) );
323 base->addWidget( myCustomFams = new QComboBox( this ) );
324 base->addWidget( mySize = new QtxComboBox( this ) );
325 mySize->setInsertPolicy( QComboBox::NoInsert );
326 mySize->setValidator( new QIntValidator( 1, 250, mySize ) );
328 base->addWidget( myB = new QToolButton( this ) );
329 myB->setText( tr( "B" ) );
330 myB->setCheckable( true );
332 base->addWidget( myI = new QToolButton( this ) );
333 myI->setText( tr( "I" ) );
334 myI->setCheckable( true );
336 base->addWidget( myU = new QToolButton( this ) );
337 myU->setText( tr( "U" ) );
338 myU->setCheckable( true );
340 base->addWidget( myS = new QToolButton( this ) );
341 myS->setText( tr( "S" ) );
342 myS->setCheckable( true );
344 base->addWidget( myPreview = new QToolButton( this ) );
345 myPreview->setText( "..." );
347 myFamily->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
348 myCustomFams->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
350 connect( myPreview, SIGNAL( clicked( bool ) ), this, SLOT( onPreview( bool ) ) );
351 connect( myFamily, SIGNAL( currentFontChanged( const QFont& ) ), this, SLOT( onFontChanged( const QFont& ) ) );
352 connect( mySize, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onPropertyChanged() ) );
353 connect( mySize, SIGNAL( editTextChanged( QString ) ), this, SLOT( onPropertyChanged() ) );
354 connect( myB, SIGNAL( toggled( bool ) ), this, SLOT( onPropertyChanged() ) );
355 connect( myI, SIGNAL( toggled( bool ) ), this, SLOT( onPropertyChanged() ) );
356 connect( myU, SIGNAL( toggled( bool ) ), this, SLOT( onPropertyChanged() ) );
358 myCustomFams->hide();
362 onFontChanged( currentFont() );
366 \brief Specifies whether widget works in Native or Custom mode. Native mode
367 is intended for working with system fonts. Custom mode is intended for
368 working with manually defined set of fonts. Set of custom fonts can be
369 specified with setCustomFonts() method
370 \param mode mode from QtxFontEdit::Mode enumeration
373 void QtxFontEdit::setMode( const int mode )
375 if ( myMode == mode )
380 myFamily->setShown( myMode == Native );
381 myCustomFams->setShown( myMode == Custom );
387 \brief Verifies whether widget works in Native or Custom mode
388 \return Native or Custom mode
391 int QtxFontEdit::mode() const
397 \brief Sets list of custom fonts.
398 <b>This method is intended for working in Custom mode.</b>
399 \param fams list of families
400 \sa fonts(), setMode()
402 void QtxFontEdit::setFonts( const QStringList& fams )
404 QString currFam = myCustomFams->currentText();
406 myCustomFams->clear();
407 myCustomFams->addItems( fams );
409 int ind = myCustomFams->findText( currFam );
411 myCustomFams->setCurrentIndex( ind );
413 setSizes( QList<int>() );
417 \brief Sets list of available font sizes.
418 <b>This method is intended for working in Custom mode.</b> The list of sizes can
419 be empty. In this case system generate listof size automatically from 8 till 72.
420 \param sizes list of sizes
421 \sa sizes(), setMode()
423 void QtxFontEdit::setSizes( const QList<int>& sizes )
425 QString currSize = mySize->currentText();
428 if ( !sizes.isEmpty() )
431 for ( QList<int>::const_iterator it = sizes.begin(); it != sizes.end(); ++it )
432 szList.append( QString::number( *it ) );
433 mySize->addItems( szList );
437 static QStringList defLst;
438 if ( defLst.isEmpty() )
440 QString str( "8 9 10 11 12 14 16 18 20 22 24 26 28 36 48 72" );
441 defLst = str.split( " " );
443 mySize->addItems( defLst );
446 int ind = mySize->findText( currSize );
448 mySize->setCurrentIndex( ind );
452 \brief Gets list of custom fonts
453 \return list of families
454 \sa setFonts(), setMode()
456 QStringList QtxFontEdit::fonts() const
459 for ( int i = 0, n = myCustomFams->count(); i < n; i++ )
460 fams.append( myCustomFams->itemText( i ) );
465 \brief Gets list of custom fonts
466 \return list of families
467 \sa setCustomFonts(), setMode()
469 QList<int> QtxFontEdit::sizes() const
472 for ( int i = 0, n = mySize->count(); i < n; i++ )
473 lst.append( mySize->itemText( i ).toInt() );