| 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 |
|
|---|
| 94 | class QFontDialogPrivate
|
|---|
| 95 | {
|
|---|
| 96 | public:
|
|---|
| 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 |
|
|---|
| 152 | QFontDialog::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 |
|
|---|
| 312 | QFontDialog::~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 | */
|
|---|
| 351 | QFont 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 | */
|
|---|
| 385 | QFont QFontDialog::getFont( bool *ok, QWidget *parent,const char* name)
|
|---|
| 386 | {
|
|---|
| 387 | return getFont( ok, 0, parent, name );
|
|---|
| 388 | }
|
|---|
| 389 |
|
|---|
| 390 | QFont 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 |
|
|---|
| 421 | bool 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 |
|
|---|
| 466 | class QListBoxFontText : public QListBoxText
|
|---|
| 467 | {
|
|---|
| 468 | QFont cfont;
|
|---|
| 469 | public:
|
|---|
| 470 | QListBoxFontText( const QString & text );
|
|---|
| 471 | ~QListBoxFontText() { }
|
|---|
| 472 |
|
|---|
| 473 | int height( const QListBox * ) const;
|
|---|
| 474 | int width( const QListBox * ) const;
|
|---|
| 475 |
|
|---|
| 476 | protected:
|
|---|
| 477 | void paint( QPainter * );
|
|---|
| 478 | };
|
|---|
| 479 |
|
|---|
| 480 | QListBoxFontText::QListBoxFontText( const QString & text )
|
|---|
| 481 | : QListBoxText(text), cfont(text)
|
|---|
| 482 | {
|
|---|
| 483 | }
|
|---|
| 484 |
|
|---|
| 485 | int QListBoxFontText::height( const QListBox * ) const
|
|---|
| 486 | {
|
|---|
| 487 | QFontMetrics fm(cfont);
|
|---|
| 488 | return QMAX( fm.lineSpacing() + 2, QApplication::globalStrut().height() );
|
|---|
| 489 | }
|
|---|
| 490 |
|
|---|
| 491 | int QListBoxFontText::width( const QListBox * ) const
|
|---|
| 492 | {
|
|---|
| 493 | QFontMetrics fm(cfont);
|
|---|
| 494 | return QMAX( fm.width( text() ) + 6, QApplication::globalStrut().width() );
|
|---|
| 495 | }
|
|---|
| 496 |
|
|---|
| 497 | void 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 |
|
|---|
| 513 | void 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 |
|
|---|
| 601 | void 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 |
|
|---|
| 647 | void 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 |
|
|---|
| 685 | void 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 | */
|
|---|
| 696 | void 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 | */
|
|---|
| 706 | void 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 |
|
|---|
| 722 | void 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 |
|
|---|
| 740 | void 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 |
|
|---|
| 757 | void 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 |
|
|---|
| 785 | void 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 |
|
|---|
| 807 | QFont 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
|
|---|