qskinny/src/controls/QskTabButton.cpp

142 lines
2.8 KiB
C++
Raw Normal View History

2017-07-21 18:21:34 +02:00
/******************************************************************************
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
*****************************************************************************/
#include "QskTabButton.h"
#include "QskTabBar.h"
#include "QskTextOptions.h"
#include <QFontMetricsF>
#include <QPointer>
QSK_SUBCONTROL( QskTabButton, Panel )
QSK_SUBCONTROL( QskTabButton, Text )
class QskTabButton::PrivateData
{
public:
PrivateData( const QString& txt ):
text( txt )
{
}
QString text;
QskTextOptions textOptions;
QPointer< QskTabBar > tabBar;
};
QskTabButton::QskTabButton( QQuickItem* parent ):
QskTabButton( QString(), parent )
{
}
QskTabButton::QskTabButton( const QString& text, QQuickItem* parent ):
Inherited( parent ),
m_data( new PrivateData( text ) )
{
resolveTabBar();
setSizePolicy( QskSizePolicy::Minimum, QskSizePolicy::Fixed );
setCheckable( true );
setExclusive( true );
}
QskTabButton::~QskTabButton()
{
}
void QskTabButton::setText( const QString& text )
{
if ( m_data->text == text )
return;
m_data->text = text;
Q_EMIT textChanged( text );
resetImplicitSize();
update();
}
QString QskTabButton::text() const
{
return m_data->text;
}
void QskTabButton::setTextOptions( const QskTextOptions& options )
{
if ( options != m_data->textOptions )
{
m_data->textOptions = options;
Q_EMIT textOptionsChanged();
}
}
QskTextOptions QskTabButton::textOptions() const
{
return m_data->textOptions;
}
QSizeF QskTabButton::contentsSizeHint() const
{
QSizeF size( metric( Panel | QskAspect::MinimumWidth ),
metric( Panel | QskAspect::MinimumHeight ) );
if ( !m_data->text.isEmpty() )
{
const QFontMetricsF fm( effectiveFont( Text ) );
const auto textSize = fm.size( Qt::TextShowMnemonic, m_data->text );
size += textSize;
}
return size;
}
QskTabBar* QskTabButton::tabBar() const
{
return m_data->tabBar;
}
void QskTabButton::changeEvent( QEvent* event )
{
switch( event->type() )
{
case QEvent::LocaleChange:
{
if ( !m_data->text.isEmpty() )
{
// maybe QLocale::textDirection() has changed
update();
}
break;
}
case QEvent::ParentChange:
{
resolveTabBar();
break;
}
default:
break;
}
Inherited::changeEvent( event );
}
void QskTabButton::resolveTabBar()
{
auto p = parent();
while ( p )
{
if ( const auto tabBar = qobject_cast< QskTabBar* >( p ) )
{
m_data->tabBar = tabBar;
break;
}
p = p->parent();
}
}
#include "moc_QskTabButton.cpp"