add font selection window
This commit is contained in:
parent
75fc981019
commit
33d9e8822f
|
@ -107,6 +107,9 @@ namespace
|
||||||
auto colorSelectionButton = new Button( "Color selection", this );
|
auto colorSelectionButton = new Button( "Color selection", this );
|
||||||
connect( colorSelectionButton, &Button::clicked, this, &ButtonBox::execColorSelection );
|
connect( colorSelectionButton, &Button::clicked, this, &ButtonBox::execColorSelection );
|
||||||
|
|
||||||
|
auto fontSelectionButton = new Button( "Font selection", this );
|
||||||
|
connect( fontSelectionButton, &Button::clicked, this, &ButtonBox::execFontSelection );
|
||||||
|
|
||||||
setExtraSpacingAt( Qt::BottomEdge );
|
setExtraSpacingAt( Qt::BottomEdge );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,6 +196,15 @@ namespace
|
||||||
// not implemented for now (class is not public)
|
// not implemented for now (class is not public)
|
||||||
#else
|
#else
|
||||||
( void ) qskDialog->selectColor( "select color" );
|
( void ) qskDialog->selectColor( "select color" );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void execFontSelection()
|
||||||
|
{
|
||||||
|
#ifndef QSK_USE_EXEC
|
||||||
|
// not implemented for now (class is not public)
|
||||||
|
#else
|
||||||
|
( void ) qskDialog->selectFont( "select font" );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -21,34 +21,6 @@
|
||||||
#include <private/qquickfontdialog_p.h>
|
#include <private/qquickfontdialog_p.h>
|
||||||
#include <private/qquickmessagedialog_p.h>
|
#include <private/qquickmessagedialog_p.h>
|
||||||
|
|
||||||
#include <QtQml>
|
|
||||||
|
|
||||||
static QQuickAbstractDialog* createQml( const char* className )
|
|
||||||
{
|
|
||||||
static QQmlEngine engine( nullptr );
|
|
||||||
|
|
||||||
QByteArray qmlCode = "import QtQuick.Dialogs\n";
|
|
||||||
qmlCode += className;
|
|
||||||
qmlCode += " {}";
|
|
||||||
|
|
||||||
auto component = new QQmlComponent( &engine );
|
|
||||||
component->setData( qmlCode.constData(), QUrl() );
|
|
||||||
|
|
||||||
if ( component->status() != QQmlComponent::Ready )
|
|
||||||
{
|
|
||||||
qWarning() << component->errorString();
|
|
||||||
delete component;
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto dialog = qobject_cast< QQuickAbstractDialog* >( component->create() );
|
|
||||||
QObject::connect( dialog, &QObject::destroyed,
|
|
||||||
component, &QObject::deleteLater );
|
|
||||||
|
|
||||||
return dialog;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
class ButtonBox : public QskLinearBox
|
class ButtonBox : public QskLinearBox
|
||||||
|
@ -126,6 +98,11 @@ namespace
|
||||||
auto file = qskDialog->selectDirectory( "select directory", QDir::currentPath() );
|
auto file = qskDialog->selectDirectory( "select directory", QDir::currentPath() );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case FontDialog:
|
||||||
|
{
|
||||||
|
qskDialog->selectFont( "select font" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MessageDialog:
|
case MessageDialog:
|
||||||
{
|
{
|
||||||
auto action = qskDialog->message( "message", "The quick brown fox jumps over the lazy dog" );
|
auto action = qskDialog->message( "message", "The quick brown fox jumps over the lazy dog" );
|
||||||
|
@ -134,11 +111,7 @@ namespace
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
const auto metaEnum = QMetaEnum::fromType<DialogType>();
|
qWarning() << "unknown dialog type detected";
|
||||||
m_dialog = createQml( metaEnum.key( dialogType ) );
|
|
||||||
|
|
||||||
if ( m_dialog )
|
|
||||||
m_dialog->setParentWindow( window() );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -457,6 +457,7 @@ list(APPEND PRIVATE_HEADERS
|
||||||
dialogs/QskColorPickerSkinlet.h
|
dialogs/QskColorPickerSkinlet.h
|
||||||
dialogs/QskColorSelectionWindow.h
|
dialogs/QskColorSelectionWindow.h
|
||||||
dialogs/QskFileSelectionWindow.h
|
dialogs/QskFileSelectionWindow.h
|
||||||
|
dialogs/QskFontSelectionWindow.h
|
||||||
dialogs/QskWindowOrSubWindow.h
|
dialogs/QskWindowOrSubWindow.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -470,6 +471,7 @@ list(APPEND SOURCES
|
||||||
dialogs/QskDialogSubWindow.cpp
|
dialogs/QskDialogSubWindow.cpp
|
||||||
dialogs/QskDialogWindow.cpp
|
dialogs/QskDialogWindow.cpp
|
||||||
dialogs/QskFileSelectionWindow.cpp
|
dialogs/QskFileSelectionWindow.cpp
|
||||||
|
dialogs/QskFontSelectionWindow.cpp
|
||||||
dialogs/QskMessageSubWindow.cpp
|
dialogs/QskMessageSubWindow.cpp
|
||||||
dialogs/QskMessageWindow.cpp
|
dialogs/QskMessageWindow.cpp
|
||||||
dialogs/QskSelectionSubWindow.cpp
|
dialogs/QskSelectionSubWindow.cpp
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
|
|
||||||
#include "QskWindowOrSubWindow.h"
|
#include "QskWindowOrSubWindow.h"
|
||||||
|
|
||||||
class QskColorPicker;
|
|
||||||
|
|
||||||
template< typename W >
|
template< typename W >
|
||||||
class QskColorSelectionWindow : public QskWindowOrSubWindow< W >
|
class QskColorSelectionWindow : public QskWindowOrSubWindow< W >
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
#include "QskBoxBorderMetrics.h"
|
#include "QskBoxBorderMetrics.h"
|
||||||
#include "QskColorSelectionWindow.h"
|
#include "QskColorSelectionWindow.h"
|
||||||
#include "QskFileSelectionWindow.h"
|
#include "QskFileSelectionWindow.h"
|
||||||
|
#include "QskFontSelectionWindow.h"
|
||||||
#include "QskEvent.h"
|
#include "QskEvent.h"
|
||||||
#include "QskFunctions.h"
|
#include "QskFunctions.h"
|
||||||
#include "QskListView.h"
|
|
||||||
|
|
||||||
#include "QskFocusIndicator.h"
|
#include "QskFocusIndicator.h"
|
||||||
|
|
||||||
|
@ -245,6 +245,17 @@ static QColor qskSelectColor( QskColorSelectionWindow< W >& window )
|
||||||
return selectedColor;
|
return selectedColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
static QFont qskSelectFont( QskFontSelectionWindow< W >& window )
|
||||||
|
{
|
||||||
|
QFont selectedFont = window.selectedFont();
|
||||||
|
|
||||||
|
if( window.exec() == QskDialog::Accepted )
|
||||||
|
selectedFont = window.selectedFont();
|
||||||
|
|
||||||
|
return selectedFont;
|
||||||
|
}
|
||||||
|
|
||||||
class QskDialog::PrivateData
|
class QskDialog::PrivateData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -449,6 +460,34 @@ QColor QskDialog::selectColor( const QString& title ) const
|
||||||
return qskSelectColor< QskDialogWindow >( window );
|
return qskSelectColor< QskDialogWindow >( window );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QFont QskDialog::selectFont( const QString& title ) const
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
// should be parameters
|
||||||
|
const auto actions = QskDialog::Ok | QskDialog::Cancel;
|
||||||
|
const auto defaultAction = QskDialog::Ok;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ( m_data->policy == EmbeddedBox )
|
||||||
|
{
|
||||||
|
auto quickWindow = qobject_cast< QQuickWindow* >( m_data->transientParent );
|
||||||
|
|
||||||
|
if ( quickWindow == nullptr )
|
||||||
|
quickWindow = qskSomeQuickWindow();
|
||||||
|
|
||||||
|
if ( quickWindow )
|
||||||
|
{
|
||||||
|
QskFontSelectionWindow< QskDialogSubWindow > window( quickWindow, title,
|
||||||
|
actions, defaultAction );
|
||||||
|
return qskSelectFont< QskDialogSubWindow >( window );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QskFontSelectionWindow< QskDialogWindow > window( m_data->transientParent, title,
|
||||||
|
actions, defaultAction );
|
||||||
|
return qskSelectFont< QskDialogWindow >( window );
|
||||||
|
}
|
||||||
|
|
||||||
QskDialog::ActionRole QskDialog::actionRole( Action action )
|
QskDialog::ActionRole QskDialog::actionRole( Action action )
|
||||||
{
|
{
|
||||||
using Q = QPlatformDialogHelper;
|
using Q = QPlatformDialogHelper;
|
||||||
|
|
|
@ -139,6 +139,8 @@ class QSK_EXPORT QskDialog : public QObject
|
||||||
|
|
||||||
Q_INVOKABLE QColor selectColor( const QString& title ) const;
|
Q_INVOKABLE QColor selectColor( const QString& title ) const;
|
||||||
|
|
||||||
|
Q_INVOKABLE QFont selectFont( const QString& title ) const;
|
||||||
|
|
||||||
static ActionRole actionRole( Action action );
|
static ActionRole actionRole( Action action );
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
|
|
|
@ -0,0 +1,160 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) The authors
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "QskFontSelectionWindow.h"
|
||||||
|
|
||||||
|
#include "QskFontRole.h"
|
||||||
|
#include "QskGridBox.h"
|
||||||
|
#include "QskLinearBox.h"
|
||||||
|
#include "QskSimpleListBox.h"
|
||||||
|
#include "QskTextLabel.h"
|
||||||
|
|
||||||
|
#include <QFontDatabase>
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
class QskFontSelectionWindow< W >::PrivateData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QFont selectedFont;
|
||||||
|
|
||||||
|
QskSimpleListBox* familyView;
|
||||||
|
QskSimpleListBox* styleView;
|
||||||
|
QskSimpleListBox* sizeView;
|
||||||
|
|
||||||
|
QskTextLabel* outputLabel;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
QskFontSelectionWindow< W >::QskFontSelectionWindow( QObject* parent, const QString& title,
|
||||||
|
QskDialog::Actions actions, QskDialog::Action defaultAction )
|
||||||
|
: Inherited( parent, title, actions, defaultAction )
|
||||||
|
, m_data( new PrivateData )
|
||||||
|
{
|
||||||
|
auto* outerBox = new QskLinearBox( Qt::Vertical );
|
||||||
|
outerBox->setMargins( 20 );
|
||||||
|
outerBox->setSpacing( 20 );
|
||||||
|
#if 1
|
||||||
|
outerBox->setFixedSize( 700, 500 );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
setupControls( outerBox );
|
||||||
|
loadFontInfo();
|
||||||
|
|
||||||
|
Inherited::setContentItem( outerBox );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
QskFontSelectionWindow< W >::~QskFontSelectionWindow() = default;
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
QFont QskFontSelectionWindow< W >::selectedFont() const
|
||||||
|
{
|
||||||
|
return m_data->selectedFont;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
void QskFontSelectionWindow< W >::setupControls( QQuickItem* parentItem )
|
||||||
|
{
|
||||||
|
auto* gridBox = new QskGridBox( parentItem );
|
||||||
|
gridBox->setSpacing( 10 );
|
||||||
|
|
||||||
|
const QskFontRole role( QskFontRole::Subtitle, QskFontRole::Normal );
|
||||||
|
|
||||||
|
auto* familyLabel = new QskTextLabel( "Family", gridBox );
|
||||||
|
familyLabel->setFontRole( role );
|
||||||
|
gridBox->addItem( familyLabel, 0, 0 );
|
||||||
|
|
||||||
|
auto* styleLabel = new QskTextLabel( "Style", gridBox );
|
||||||
|
styleLabel->setFontRole( role );
|
||||||
|
gridBox->addItem( styleLabel, 0, 1 );
|
||||||
|
|
||||||
|
auto* sizeLabel = new QskTextLabel( "Size", gridBox );
|
||||||
|
sizeLabel->setFontRole( role );
|
||||||
|
gridBox->addItem( sizeLabel, 0, 2 );
|
||||||
|
|
||||||
|
m_data->familyView = new QskSimpleListBox( gridBox );
|
||||||
|
m_data->familyView->setSizePolicy( Qt::Vertical, QskSizePolicy::Expanding );
|
||||||
|
gridBox->addItem( m_data->familyView, 1, 0 );
|
||||||
|
|
||||||
|
m_data->styleView = new QskSimpleListBox( gridBox );
|
||||||
|
m_data->styleView->setSizePolicy( Qt::Vertical, QskSizePolicy::Expanding );
|
||||||
|
gridBox->addItem( m_data->styleView, 1, 1 );
|
||||||
|
|
||||||
|
m_data->sizeView = new QskSimpleListBox( gridBox );
|
||||||
|
m_data->sizeView->setSizePolicy( Qt::Vertical, QskSizePolicy::Expanding );
|
||||||
|
gridBox->addItem( m_data->sizeView, 1, 2 );
|
||||||
|
|
||||||
|
auto* sampleLabel = new QskTextLabel( "Sample", gridBox );
|
||||||
|
sampleLabel->setFontRole( role );
|
||||||
|
gridBox->addItem( sampleLabel, 2, 0 );
|
||||||
|
|
||||||
|
m_data->outputLabel = new QskTextLabel( gridBox );
|
||||||
|
m_data->outputLabel->setSizePolicy( QskSizePolicy::Preferred, QskSizePolicy::Minimum );
|
||||||
|
m_data->outputLabel->setElideMode( Qt::ElideRight );
|
||||||
|
gridBox->addItem( m_data->outputLabel, 3, 0, 1, 3 );
|
||||||
|
|
||||||
|
gridBox->setColumnStretchFactor( 0, 5 );
|
||||||
|
gridBox->setColumnStretchFactor( 1, 3 );
|
||||||
|
gridBox->setColumnStretchFactor( 2, 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
void QskFontSelectionWindow< W >::loadFontInfo()
|
||||||
|
{
|
||||||
|
const auto families = QFontDatabase::families();
|
||||||
|
m_data->familyView->setEntries( families );
|
||||||
|
|
||||||
|
QObject::connect( m_data->familyView, &QskSimpleListBox::selectedEntryChanged,
|
||||||
|
this, [this]( const QString& family )
|
||||||
|
{
|
||||||
|
const auto styles = QFontDatabase::styles( family );
|
||||||
|
m_data->styleView->setEntries( styles );
|
||||||
|
} );
|
||||||
|
|
||||||
|
QObject::connect( m_data->familyView, &QskSimpleListBox::selectedEntryChanged,
|
||||||
|
this, [this]( const QString& family )
|
||||||
|
{
|
||||||
|
const auto sizes = QFontDatabase::pointSizes( family );
|
||||||
|
QStringList sizesString;
|
||||||
|
sizesString.reserve( sizes.count() );
|
||||||
|
|
||||||
|
for( const auto size : sizes )
|
||||||
|
{
|
||||||
|
sizesString.append( QString::number( size ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_data->sizeView->setEntries( sizesString );
|
||||||
|
} );
|
||||||
|
|
||||||
|
auto displaySample = [this]()
|
||||||
|
{
|
||||||
|
const auto family = m_data->familyView->selectedEntry();
|
||||||
|
const auto style = m_data->styleView->selectedEntry();
|
||||||
|
const auto size = m_data->sizeView->selectedEntry();
|
||||||
|
|
||||||
|
if( !family.isNull() && !style.isNull() && !size.isNull() )
|
||||||
|
{
|
||||||
|
auto& f = m_data->selectedFont;
|
||||||
|
|
||||||
|
f = QFont( family, size.toInt() );
|
||||||
|
f.setStyleName( style );
|
||||||
|
|
||||||
|
m_data->outputLabel->setSkinHint( QskTextLabel::Text | QskAspect::FontRole, f );
|
||||||
|
m_data->outputLabel->resetImplicitSize();
|
||||||
|
m_data->outputLabel->setText( "The quick brown fox jumps over the lazy dog" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_data->outputLabel->setText( {} );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
QObject::connect( m_data->familyView, &QskSimpleListBox::selectedEntryChanged, this, displaySample );
|
||||||
|
QObject::connect( m_data->styleView, &QskSimpleListBox::selectedEntryChanged, this, displaySample );
|
||||||
|
QObject::connect( m_data->sizeView, &QskSimpleListBox::selectedEntryChanged, this, displaySample );
|
||||||
|
}
|
||||||
|
|
||||||
|
template class QskFontSelectionWindow< QskDialogWindow >;
|
||||||
|
template class QskFontSelectionWindow< QskDialogSubWindow >;
|
|
@ -0,0 +1,32 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* QSkinny - Copyright (C) The authors
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef QSK_FONT_SELECTION_WINDODW_H
|
||||||
|
#define QSK_FONT_SELECTION_WINDODW_H
|
||||||
|
|
||||||
|
#include "QskWindowOrSubWindow.h"
|
||||||
|
|
||||||
|
template< typename W >
|
||||||
|
class QskFontSelectionWindow : public QskWindowOrSubWindow< W >
|
||||||
|
{
|
||||||
|
using Inherited = QskWindowOrSubWindow< W >;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
QskFontSelectionWindow( QObject* parent, const QString& title,
|
||||||
|
QskDialog::Actions actions, QskDialog::Action defaultAction );
|
||||||
|
~QskFontSelectionWindow();
|
||||||
|
|
||||||
|
QFont selectedFont() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setupControls( QQuickItem* );
|
||||||
|
void loadFontInfo();
|
||||||
|
|
||||||
|
class PrivateData;
|
||||||
|
std::unique_ptr< PrivateData > m_data;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue