source: vendor/trolltech/current/src/dialogs/qfontdialog.cpp

Last change on this file was 2, checked in by dmik, 20 years ago

Imported xplatform parts of the official release 3.3.1 from Trolltech

  • Property svn:keywords set to Id
File size: 22.6 KB
Line 
1/****************************************************************************
2** $Id: qfontdialog.cpp 2 2005-11-16 15:49:26Z dmik $
3**
4** Implementation of QFontDialog
5**
6** Created : 970605
7**
8** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
9**
10** This file is part of the dialogs module of the Qt GUI Toolkit.
11**
12** This file may be distributed under the terms of the Q Public License
13** as defined by Trolltech AS of Norway and appearing in the file
14** LICENSE.QPL included in the packaging of this file.
15**
16** This file may be distributed and/or modified under the terms of the
17** GNU General Public License version 2 as published by the Free Software
18** Foundation and appearing in the file LICENSE.GPL included in the
19** packaging of this file.
20**
21** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
22** licenses may use this file in accordance with the Qt Commercial License
23** Agreement provided with the Software.
24**
25** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
26** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
27**
28** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
29** information about Qt Commercial License Agreements.
30** See http://www.trolltech.com/qpl/ for QPL licensing information.
31** See http://www.trolltech.com/gpl/ for GPL licensing information.
32**
33** Contact info@trolltech.com if any conditions of this licensing are
34** not clear to you.
35**
36**********************************************************************/
37
38#include "qwindowdefs.h"
39
40#ifndef QT_NO_FONTDIALOG
41
42#include "qfontdialog.h"
43
44#include "qlineedit.h"
45#include "qlistbox.h"
46#include "qpushbutton.h"
47#include "qcheckbox.h"
48#include "qcombobox.h"
49#include "qlayout.h"
50#include "qvgroupbox.h"
51#include "qhgroupbox.h"
52#include "qlabel.h"
53#include "qapplication.h"
54#include "qfontdatabase.h"
55#include "qstyle.h"
56#include <private/qfontdata_p.h>
57#include <qvalidator.h>
58
59/*!
60 \class QFontDialog qfontdialog.h
61 \ingroup dialogs
62 \mainclass
63 \brief The QFontDialog class provides a dialog widget for selecting a font.
64
65 The usual way to use this class is to call one of the static convenience
66 functions, e.g. getFont().
67
68 Examples:
69
70 \code
71 bool ok;
72 QFont font = QFontDialog::getFont(
73 &ok, QFont( "Helvetica [Cronyx]", 10 ), this );
74 if ( ok ) {
75 // font is set to the font the user selected
76 } else {
77 // the user canceled the dialog; font is set to the initial
78 // value, in this case Helvetica [Cronyx], 10
79 }
80 \endcode
81
82 The dialog can also be used to set a widget's font directly:
83 \code
84 myWidget.setFont( QFontDialog::getFont( 0, myWidget.font() ) );
85 \endcode
86 If the user clicks OK the font they chose will be used for myWidget,
87 and if they click Cancel the original font is used.
88
89 \sa QFont QFontInfo QFontMetrics
90
91 <img src=qfontdlg-w.png>
92*/
93
94class QFontDialogPrivate
95{
96public:
97 QFontDialogPrivate() : script( QFontPrivate::defaultScript ) {};
98 QLabel * familyAccel;
99 QLineEdit * familyEdit;
100 QListBox * familyList;
101
102 QLabel * styleAccel;
103 QLineEdit * styleEdit;
104 QListBox * styleList;
105
106 QLabel * sizeAccel;
107 QLineEdit * sizeEdit;
108 QListBox * sizeList;
109
110 QVGroupBox * effects;
111 QCheckBox * strikeout;
112 QCheckBox * underline;
113 QComboBox * color;
114
115 QHGroupBox * sample;
116 QLineEdit * sampleEdit;
117
118 QLabel * scriptAccel;
119 QComboBox * scriptCombo;
120
121 QPushButton * ok;
122 QPushButton * cancel;
123
124 QBoxLayout * buttonLayout;
125 QBoxLayout * effectsLayout;
126 QBoxLayout * sampleLayout;
127 QBoxLayout * sampleEditLayout;
128
129 QFontDatabase fdb;
130
131 QString family;
132 QFont::Script script;
133 QString style;
134 int size;
135
136 bool smoothScalable;
137};
138
139
140/*!
141 \internal
142 Constructs a standard font dialog.
143
144 Use setFont() to set the initial font attributes.
145
146 The \a parent, \a name, \a modal and \a f parameters are passed to
147 the QDialog constructor.
148
149 \sa getFont()
150*/
151
152QFontDialog::QFontDialog( QWidget *parent, const char *name,
153 bool modal, WFlags f )
154 : QDialog( parent, name, modal, f )
155{
156 setSizeGripEnabled( TRUE );
157 d = new QFontDialogPrivate;
158 // grid
159 d->familyEdit = new QLineEdit( this, "font family I" );
160 d->familyEdit->setReadOnly( TRUE );
161 d->familyList = new QListBox( this, "font family II" );
162 d->familyEdit->setFocusProxy( d->familyList );
163
164 d->familyAccel
165 = new QLabel( d->familyList, tr("&Font"), this, "family accelerator" );
166 d->familyAccel->setIndent( 2 );
167
168 d->styleEdit = new QLineEdit( this, "font style I" );
169 d->styleEdit->setReadOnly( TRUE );
170 d->styleList = new QListBox( this, "font style II" );
171 d->styleEdit->setFocusProxy( d->styleList );
172
173 d->styleAccel
174 = new QLabel( d->styleList, tr("Font st&yle"), this, "style accelerator" );
175 d->styleAccel->setIndent( 2 );
176
177 d->sizeEdit = new QLineEdit( this, "font size I" );
178 d->sizeEdit->setFocusPolicy( ClickFocus );
179 QIntValidator *validator = new QIntValidator( 1, 512, this );
180 d->sizeEdit->setValidator( validator );
181 d->sizeList = new QListBox( this, "font size II" );
182
183 d->sizeAccel
184 = new QLabel ( d->sizeEdit, tr("&Size"), this, "size accelerator" );
185 d->sizeAccel->setIndent( 2 );
186
187 // effects box
188 d->effects = new QVGroupBox( tr("Effects"), this, "font effects" );
189 d->strikeout = new QCheckBox( d->effects, "strikeout on/off" );
190 d->strikeout->setText( tr("Stri&keout") );
191 d->underline = new QCheckBox( d->effects, "underline on/off" );
192 d->underline->setText( tr("&Underline") );
193
194 d->sample = new QHGroupBox( tr("Sample"), this, "sample text" );
195 d->sampleEdit = new QLineEdit( d->sample, "r/w sample text" );
196 d->sampleEdit->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored) );
197 d->sampleEdit->setAlignment( AlignCenter );
198 // Note that the sample text is *not* translated with tr(), as the
199 // characters used depend on the charset encoding.
200 d->sampleEdit->setText( "AaBbYyZz" );
201
202 d->scriptCombo = new QComboBox( FALSE, this, "font encoding" );
203
204 d->scriptAccel
205 = new QLabel( d->scriptCombo, tr("Scr&ipt"), this,"encoding label");
206 d->scriptAccel->setIndent( 2 );
207
208 d->size = 0;
209 d->smoothScalable = FALSE;
210
211 connect( d->scriptCombo, SIGNAL(activated(int)),
212 SLOT(scriptHighlighted(int)) );
213 connect( d->familyList, SIGNAL(highlighted(int)),
214 SLOT(familyHighlighted(int)) );
215 connect( d->styleList, SIGNAL(highlighted(int)),
216 SLOT(styleHighlighted(int)) );
217 connect( d->sizeList, SIGNAL(highlighted(const QString&)),
218 SLOT(sizeHighlighted(const QString&)) );
219 connect( d->sizeEdit, SIGNAL(textChanged(const QString&)),
220 SLOT(sizeChanged(const QString&)) );
221
222 connect( d->strikeout, SIGNAL(clicked()),
223 SLOT(updateSample()) );
224 connect( d->underline, SIGNAL(clicked()),
225 SLOT(updateSample()) );
226
227 (void)d->familyList->sizeHint();
228 (void)d->styleList->sizeHint();
229 (void)d->sizeList->sizeHint();
230
231 for (int i = 0; i < QFont::NScripts; i++) {
232 QString scriptname = QFontDatabase::scriptName((QFont::Script) i);
233 if ( !scriptname.isEmpty() )
234 d->scriptCombo->insertItem( scriptname );
235 }
236
237 updateFamilies();
238 if ( d->familyList->count() != 0 )
239 d->familyList->setCurrentItem( 0 );
240
241 // grid layout
242 QGridLayout * mainGrid = new QGridLayout( this, 9, 6, 12, 0 );
243
244 mainGrid->addWidget( d->familyAccel, 0, 0 );
245 mainGrid->addWidget( d->familyEdit, 1, 0 );
246 mainGrid->addWidget( d->familyList, 2, 0 );
247
248 mainGrid->addWidget( d->styleAccel, 0, 2 );
249 mainGrid->addWidget( d->styleEdit, 1, 2 );
250 mainGrid->addWidget( d->styleList, 2, 2 );
251
252 mainGrid->addWidget( d->sizeAccel, 0, 4 );
253 mainGrid->addWidget( d->sizeEdit, 1, 4 );
254 mainGrid->addWidget( d->sizeList, 2, 4 );
255
256 mainGrid->setColStretch( 0, 38 );
257 mainGrid->setColStretch( 2, 24 );
258 mainGrid->setColStretch( 4, 10 );
259
260 mainGrid->addColSpacing( 1, 6 );
261 mainGrid->addColSpacing( 3, 6 );
262 mainGrid->addColSpacing( 5, 6 );
263
264 mainGrid->addRowSpacing( 3, 12 );
265
266 mainGrid->addWidget( d->effects, 4, 0 );
267
268 mainGrid->addMultiCellWidget( d->sample, 4, 7, 2, 4 );
269
270 mainGrid->addWidget( d->scriptAccel, 5, 0 );
271 mainGrid->addRowSpacing( 6, 2 );
272 mainGrid->addWidget( d->scriptCombo, 7, 0 );
273
274 mainGrid->addRowSpacing( 8, 12 );
275
276 QHBoxLayout *buttonBox = new QHBoxLayout;
277 mainGrid->addMultiCell( buttonBox, 9, 9, 0, 4 );
278
279 buttonBox->addStretch( 1 );
280 QString okt = modal ? tr("OK") : tr("Apply");
281 d->ok = new QPushButton( okt, this, "accept font selection" );
282 buttonBox->addWidget( d->ok );
283 if ( modal )
284 connect( d->ok, SIGNAL(clicked()), SLOT(accept()) );
285 d->ok->setDefault( TRUE );
286 d->ok->setFixedWidth( 80 );
287
288 buttonBox->addSpacing( 12 );
289
290 QString cancelt = modal ? tr("Cancel") : tr("Close");
291 d->cancel = new QPushButton( cancelt, this, "cancel/close" );
292 buttonBox->addWidget( d->cancel );
293 connect( d->cancel, SIGNAL(clicked()), SLOT(reject()) );
294 d->cancel->setFixedWidth( 80 );
295
296
297 resize( 500, 360 );
298
299 d->sizeEdit->installEventFilter( this );
300 d->familyList->installEventFilter( this );
301 d->styleList->installEventFilter( this );
302 d->sizeList->installEventFilter( this );
303
304 d->familyList->setFocus();
305}
306
307/*!
308 \internal
309 Destroys the font dialog and frees up its storage.
310*/
311
312QFontDialog::~QFontDialog()
313{
314 delete d;
315 d = 0;
316}
317
318/*!
319 Executes a modal font dialog and returns a font.
320
321 If the user clicks OK, the selected font is returned. If the user
322 clicks Cancel, the \a initial font is returned.
323
324 The dialog is called \a name, with the parent \a parent.
325 \a initial is the initially selected font.
326 If the \a ok parameter is not-null, \e *\a ok is set to TRUE if the
327 user clicked OK, and set to FALSE if the user clicked Cancel.
328
329 This static function is less flexible than the full QFontDialog
330 object, but is convenient and easy to use.
331
332 Examples:
333 \code
334 bool ok;
335 QFont font = QFontDialog::getFont( &ok, QFont( "Times", 12 ), this );
336 if ( ok ) {
337 // font is set to the font the user selected
338 } else {
339 // the user canceled the dialog; font is set to the initial
340 // value, in this case Times, 12.
341 }
342 \endcode
343
344 The dialog can also be used to set a widget's font directly:
345 \code
346 myWidget.setFont( QFontDialog::getFont( 0, myWidget.font() ) );
347 \endcode
348 In this example, if the user clicks OK the font they chose will be
349 used, and if they click Cancel the original font is used.
350*/
351QFont QFontDialog::getFont( bool *ok, const QFont &initial,
352 QWidget *parent, const char* name)
353{
354 return getFont( ok, &initial, parent, name );
355}
356
357/*!
358 \overload
359
360 Executes a modal font dialog and returns a font.
361
362 If the user clicks OK, the selected font is returned. If the user
363 clicks Cancel, the Qt default font is returned.
364
365 The dialog is called \a name, with parent \a parent.
366 If the \a ok parameter is not-null, \e *\a ok is set to TRUE if the
367 user clicked OK, and FALSE if the user clicked Cancel.
368
369 This static function is less functional than the full QFontDialog
370 object, but is convenient and easy to use.
371
372 Example:
373 \code
374 bool ok;
375 QFont font = QFontDialog::getFont( &ok, this );
376 if ( ok ) {
377 // font is set to the font the user selected
378 } else {
379 // the user canceled the dialog; font is set to the default
380 // application font, QApplication::font()
381 }
382 \endcode
383
384*/
385QFont QFontDialog::getFont( bool *ok, QWidget *parent,const char* name)
386{
387 return getFont( ok, 0, parent, name );
388}
389
390QFont QFontDialog::getFont( bool *ok, const QFont *def,
391 QWidget *parent, const char* name)
392{
393 QFont result;
394 if ( def )
395 result = *def;
396
397 QFontDialog *dlg = new QFontDialog( parent, name, TRUE );
398
399 dlg->setFont( ( def ? *def : QFont() ) );
400#ifndef QT_NO_WIDGET_TOPEXTRA
401 dlg->setCaption( tr("Select Font") );
402#endif
403
404 bool res = (dlg->exec() == QDialog::Accepted);
405 if ( res )
406 result = dlg->font();
407 if ( ok )
408 *ok = res;
409 delete dlg;
410 return result;
411}
412
413
414/*!
415 \internal
416 An event filter to make the Up, Down, PageUp and PageDown keys work
417 correctly in the line edits. The source of the event is the object
418 \a o and the event is \a e.
419*/
420
421bool QFontDialog::eventFilter( QObject * o , QEvent * e )
422{
423 if ( e->type() == QEvent::KeyPress) {
424 QKeyEvent * k = (QKeyEvent *)e;
425 if ( o == d->sizeEdit &&
426 (k->key() == Key_Up ||
427 k->key() == Key_Down ||
428 k->key() == Key_Prior ||
429 k->key() == Key_Next) ) {
430
431 int ci = d->sizeList->currentItem();
432 (void)QApplication::sendEvent( d->sizeList, k );
433
434 if ( ci != d->sizeList->currentItem() &&
435 style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this))
436 d->sizeEdit->selectAll();
437 return TRUE;
438 } else if ( ( o == d->familyList || o == d->styleList ) &&
439 ( k->key() == Key_Return || k->key() == Key_Enter) ) {
440 k->accept();
441 accept();
442 return TRUE;
443 }
444 } else if ( e->type() == QEvent::FocusIn &&
445 style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this) ) {
446 if ( o == d->familyList )
447 d->familyEdit->selectAll();
448 else if ( o == d->styleList )
449 d->styleEdit->selectAll();
450 else if ( o == d->sizeList )
451 d->sizeEdit->selectAll();
452 } else if ( e->type() == QEvent::MouseButtonPress && o == d->sizeList ) {
453 d->sizeEdit->setFocus();
454 }
455 return QDialog::eventFilter( o, e );
456}
457
458#ifdef Q_WS_MAC
459// #define SHOW_FONTS_IN_FAMILIES
460#endif
461
462#ifdef SHOW_FONTS_IN_FAMILIES
463#include "qpainter.h"
464#include <sizeedit.h>
465
466class QListBoxFontText : public QListBoxText
467{
468 QFont cfont;
469public:
470 QListBoxFontText( const QString & text );
471 ~QListBoxFontText() { }
472
473 int height( const QListBox * ) const;
474 int width( const QListBox * ) const;
475
476protected:
477 void paint( QPainter * );
478};
479
480QListBoxFontText::QListBoxFontText( const QString & text )
481 : QListBoxText(text), cfont(text)
482{
483}
484
485int QListBoxFontText::height( const QListBox * ) const
486{
487 QFontMetrics fm(cfont);
488 return QMAX( fm.lineSpacing() + 2, QApplication::globalStrut().height() );
489}
490
491int QListBoxFontText::width( const QListBox * ) const
492{
493 QFontMetrics fm(cfont);
494 return QMAX( fm.width( text() ) + 6, QApplication::globalStrut().width() );
495}
496
497void QListBoxFontText::paint( QPainter *painter )
498{
499 painter->save();
500 painter->setFont(cfont);
501 QListBoxText::paint(painter);
502 painter->restore();
503}
504
505#endif
506
507/*!
508 \internal
509 Updates the contents of the "font family" list box. This
510 function can be reimplemented if you have special requirements.
511*/
512
513void QFontDialog::updateFamilies()
514{
515 d->familyList->blockSignals( TRUE );
516
517 enum match_t { MATCH_NONE=0, MATCH_LAST_RESORT=1, MATCH_APP=2, MATCH_FALLBACK, MATCH_FAMILY=3 };
518
519 QStringList familyNames = d->fdb.families(d->script);
520 {
521 // merge the unicode/unknown family list with the above list.
522 QStringList l = d->fdb.families(QFont::Unicode) +
523 d->fdb.families(QFont::UnknownScript);
524 QStringList::ConstIterator it = l.begin(), end = l.end();
525 for (; it != end; ++it) {
526 if (! familyNames.contains(*it))
527 familyNames << *it;
528 }
529 }
530
531 familyNames.sort();
532
533 d->familyList->clear();
534#ifdef SHOW_FONTS_IN_FAMILIES
535 QStringList::Iterator it = familyNames.begin();
536 int idx = 0;
537 for( ; it != familyNames.end() ; ++it )
538 d->familyList->insertItem(new QListBoxFontText(*it), idx++);
539#else
540 d->familyList->insertStringList( familyNames );
541#endif
542
543 QString foundryName1, familyName1, foundryName2, familyName2;
544 int bestFamilyMatch = -1;
545 match_t bestFamilyType = MATCH_NONE;
546
547 QFont f;
548
549 // ##### do the right thing for a list of family names in the font.
550 QFontDatabase::parseFontName(d->family, foundryName1, familyName1);
551
552 QStringList::Iterator it = familyNames.begin();
553 int i = 0;
554 for( ; it != familyNames.end(); ++it, ++i ) {
555
556 QFontDatabase::parseFontName(*it, foundryName2, familyName2);
557
558 //try to match..
559 if ( familyName1 == familyName2 ) {
560 bestFamilyType = MATCH_FAMILY;
561 if ( foundryName1 == foundryName2 ) {
562 bestFamilyMatch = i;
563 break;
564 }
565 if ( bestFamilyMatch < MATCH_FAMILY )
566 bestFamilyMatch = i;
567 }
568
569 //and try some fall backs
570 match_t type = MATCH_NONE;
571 if ( bestFamilyType <= MATCH_NONE && familyName2 == f.lastResortFamily() )
572 type = MATCH_LAST_RESORT;
573 if ( bestFamilyType <= MATCH_LAST_RESORT && familyName2 == f.family() )
574 type = MATCH_APP;
575 // ### add fallback for script
576 if ( type != MATCH_NONE ) {
577 bestFamilyType = type;
578 bestFamilyMatch = i;
579 }
580 }
581
582 if (i != -1 && bestFamilyType != MATCH_NONE)
583 d->familyList->setCurrentItem(bestFamilyMatch);
584 else
585 d->familyList->setCurrentItem( 0 );
586 d->familyEdit->setText( d->familyList->currentText() );
587 if ( style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this) &&
588 d->familyList->hasFocus() )
589 d->familyEdit->selectAll();
590
591 d->familyList->blockSignals( FALSE );
592 updateStyles();
593}
594
595/*!
596 \internal
597 Updates the contents of the "font style" list box. This
598 function can be reimplemented if you have special requirements.
599*/
600
601void QFontDialog::updateStyles()
602{
603 d->styleList->blockSignals( TRUE );
604
605 d->styleList->clear();
606
607 QStringList styles = d->fdb.styles( d->familyList->currentText() );
608
609 if ( styles.isEmpty() ) {
610 d->styleEdit->clear();
611 d->smoothScalable = FALSE;
612 } else {
613 d->styleList->insertStringList( styles );
614
615 if ( !d->style.isEmpty() ) {
616 bool found = FALSE;
617 for ( int i = 0 ; i < (int)d->styleList->count() ; i++ ) {
618 if ( d->style == d->styleList->text(i) ) {
619 d->styleList->setCurrentItem( i );
620 found = TRUE;
621 break;
622 }
623 }
624 if ( !found )
625 d->styleList->setCurrentItem( 0 );
626 }
627
628 d->styleEdit->setText( d->styleList->currentText() );
629 if ( style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this) &&
630 d->styleList->hasFocus() )
631 d->styleEdit->selectAll();
632
633 d->smoothScalable = d->fdb.isSmoothlyScalable( d->familyList->currentText(), d->styleList->currentText() );
634 }
635
636 d->styleList->blockSignals( FALSE );
637
638 updateSizes();
639}
640
641/*!
642 \internal
643 Updates the contents of the "font size" list box. This
644 function can be reimplemented if you have special requirements.
645*/
646
647void QFontDialog::updateSizes()
648{
649 d->sizeList->blockSignals( TRUE );
650
651 d->sizeList->clear();
652
653 if ( !d->familyList->currentText().isEmpty() ) {
654 QValueList<int> sizes = d->fdb.pointSizes( d->familyList->currentText(), d->styleList->currentText() );
655
656 int i = 0;
657 bool found = FALSE;
658 for( QValueList<int>::iterator it = sizes.begin() ; it != sizes.end(); ++it ) {
659 d->sizeList->insertItem( QString::number( *it ) );
660 if ( !found && *it >= d->size ) {
661 d->sizeList->setCurrentItem( i );
662 found = TRUE;
663 }
664 ++i;
665 }
666 if ( !found ) {
667 // we request a size bigger than the ones in the list, select the biggest one
668 d->sizeList->setCurrentItem( d->sizeList->count() - 1 );
669 }
670
671 d->sizeEdit->blockSignals( TRUE );
672 d->sizeEdit->setText( ( d->smoothScalable ? QString::number( d->size ) : d->sizeList->currentText() ) );
673 if ( style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this) &&
674 d->sizeList->hasFocus() )
675 d->sizeEdit->selectAll();
676 d->sizeEdit->blockSignals( FALSE );
677 } else {
678 d->sizeEdit->clear();
679 }
680
681 d->sizeList->blockSignals( FALSE );
682 updateSample();
683}
684
685void QFontDialog::updateSample()
686{
687 if ( d->familyList->currentText().isEmpty() )
688 d->sampleEdit->clear();
689 else
690 d->sampleEdit->setFont( font() );
691}
692
693/*!
694 \internal
695*/
696void QFontDialog::scriptHighlighted( int index )
697{
698 d->script = (QFont::Script)index;
699 d->sampleEdit->setText( d->fdb.scriptSample( d->script ) );
700 updateFamilies();
701}
702
703/*!
704 \internal
705*/
706void QFontDialog::familyHighlighted( int i )
707{
708 d->family = d->familyList->text( i );
709 d->familyEdit->setText( d->family );
710 if ( style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this) &&
711 d->familyList->hasFocus() )
712 d->familyEdit->selectAll();
713
714 updateStyles();
715}
716
717
718/*!
719 \internal
720*/
721
722void QFontDialog::styleHighlighted( int index )
723{
724 QString s = d->styleList->text( index );
725 d->styleEdit->setText( s );
726 if ( style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this) &&
727 d->styleList->hasFocus() )
728 d->styleEdit->selectAll();
729
730 d->style = s;
731
732 updateSizes();
733}
734
735
736/*!
737 \internal
738*/
739
740void QFontDialog::sizeHighlighted( const QString &s )
741{
742 d->sizeEdit->setText( s );
743 if ( style().styleHint(QStyle::SH_FontDialog_SelectAssociatedText, this) &&
744 d->sizeEdit->hasFocus() )
745 d->sizeEdit->selectAll();
746
747 d->size = s.toInt();
748 updateSample();
749}
750
751/*!
752 \internal
753 This slot is called if the user changes the font size.
754 The size is passed in the \a s argument as a \e string.
755*/
756
757void QFontDialog::sizeChanged( const QString &s )
758{
759 // no need to check if the conversion is valid, since we have an QIntValidator in the size edit
760 int size = s.toInt();
761 if ( d->size == size )
762 return;
763
764 d->size = size;
765 if ( d->sizeList->count() != 0 ) {
766 int i;
767 for ( i = 0 ; i < (int)d->sizeList->count() - 1 ; i++ ) {
768 if ( d->sizeList->text(i).toInt() >= d->size )
769 break;
770 }
771 d->sizeList->blockSignals( TRUE );
772 d->sizeList->setCurrentItem( i );
773 d->sizeList->blockSignals( FALSE );
774 }
775 updateSample();
776}
777
778/*!
779 \internal
780 Sets the font highlighted in the QFontDialog to font \a f.
781
782 \sa font()
783*/
784
785void QFontDialog::setFont( const QFont &f )
786{
787 d->family = f.family();
788 d->style = d->fdb.styleString( f );
789 d->size = f.pointSize();
790 if ( d->size == -1 ) {
791 QFontInfo fi( f );
792 d->size = fi.pointSize();
793 }
794 d->strikeout->setChecked( f.strikeOut() );
795 d->underline->setChecked( f.underline() );
796
797 updateFamilies();
798}
799
800/*!
801 \internal
802 Returns the font which the user has chosen.
803
804 \sa setFont()
805*/
806
807QFont QFontDialog::font() const
808{
809 int pSize = d->sizeEdit->text().toInt();
810
811 QFont f = d->fdb.font( d->familyList->currentText(), d->style, pSize );
812 f.setStrikeOut( d->strikeout->isChecked() );
813 f.setUnderline( d->underline->isChecked() );
814 return f;
815}
816
817#endif
Note: See TracBrowser for help on using the repository browser.