Add new style primatives for enhanced third party style compatibility

pull/2/head
Timothy Pearson 12 years ago
parent 22d1ab9ecc
commit 69429dcfc3

@ -1847,6 +1847,37 @@ QPalette QApplication::palette(const QWidget* w)
return *app_pal; return *app_pal;
} }
QPalette QApplication::palette(QStringList objectTypeList)
{
#if defined(QT_CHECK_STATE)
if ( !qApp )
qWarning( "QApplication::palette: This function can only be "
"called after the QApplication object has been created" );
#endif
if ( !app_pal ) {
if ( !qt_std_pal )
qt_create_std_palette();
app_pal = new QPalette( *qt_std_pal );
qt_fix_tooltips();
}
if ( (objectTypeList.count() > 0) && app_palettes ) {
QPalette* wp = app_palettes->find( objectTypeList[objectTypeList.count()-1] );
if ( wp ) {
return *wp;
}
QAsciiDictIterator<QPalette> it( *app_palettes );
const char* name;
while ( (name=it.currentKey()) != 0 ) {
if ( objectTypeList.contains(name) ) {
return *it.current();
}
++it;
}
}
return *app_pal;
}
/*! /*!
Changes the default application palette to \a palette. If \a Changes the default application palette to \a palette. If \a
informWidgets is TRUE, then existing widgets are informed about the informWidgets is TRUE, then existing widgets are informed about the

@ -113,6 +113,7 @@ public:
static void setGlobalMouseTracking( bool enable ); static void setGlobalMouseTracking( bool enable );
#ifndef QT_NO_PALETTE #ifndef QT_NO_PALETTE
static QPalette palette( const QWidget* = 0 ); static QPalette palette( const QWidget* = 0 );
static QPalette palette( QStringList );
static void setPalette( const QPalette &, bool informWidgets=FALSE, static void setPalette( const QPalette &, bool informWidgets=FALSE,
const char* className = 0 ); const char* className = 0 );
#endif #endif

@ -458,6 +458,11 @@ public:
PE_HeaderSectionMenu, PE_HeaderSectionMenu,
PE_PanelScrollBar,
PE_MenuItemIndicatorFrame,
PE_MenuItemIndicatorIconFrame,
PE_MenuItemIndicatorCheck,
// do not add any values below/greater this // do not add any values below/greater this
PE_CustomBase = 0xf000000 PE_CustomBase = 0xf000000
}; };
@ -830,6 +835,8 @@ public:
PM_MenuBarItemSpacing, PM_MenuBarItemSpacing,
PM_ToolBarItemSpacing, PM_ToolBarItemSpacing,
PM_ArrowSize,
// do not add any values below/greater than this // do not add any values below/greater than this
PM_CustomBase = 0xf0000000 PM_CustomBase = 0xf0000000
}; };

@ -2870,6 +2870,9 @@ int QCommonStyle::pixelMetric(PixelMetric m, QStyleControlElementData ceData, Co
case PM_TabBarScrollButtonWidth: case PM_TabBarScrollButtonWidth:
ret = 16; ret = 16;
break; break;
case PM_ArrowSize:
ret = 7;
break;
default: default:
ret = 0; ret = 0;
break; break;

@ -189,13 +189,7 @@ void QCompactStyle::drawControl( ControlElement element, QPainter *p, QStyleCont
return; return;
if ( mi->isChecked() ) { if ( mi->isChecked() ) {
if ( act && !dis ) { drawPrimitive( PE_MenuItemIndicatorFrame, p, ceData, elementFlags, QRect(x, y, checkcol, h), itemg, flags, opt );
qDrawShadePanel( p, x, y, checkcol, h,
g, TRUE, 1, &g.brush( QColorGroup::Button ) );
} else {
qDrawShadePanel( p, x, y, checkcol, h,
g, TRUE, 1, &g.brush( QColorGroup::Midlight ) );
}
} else if ( !act ) { } else if ( !act ) {
p->fillRect(x, y, checkcol , h, p->fillRect(x, y, checkcol , h,
g.brush( QColorGroup::Button )); g.brush( QColorGroup::Button ));
@ -214,7 +208,7 @@ void QCompactStyle::drawControl( ControlElement element, QPainter *p, QStyleCont
int pixh = pixmap.height(); int pixh = pixmap.height();
if ( act && !dis ) { if ( act && !dis ) {
if ( !mi->isChecked() ) if ( !mi->isChecked() )
qDrawShadePanel( p, x, y, checkcol, h, g, FALSE, 1, &g.brush( QColorGroup::Button ) ); drawPrimitive( PE_MenuItemIndicatorIconFrame, p, ceData, elementFlags, QRect(x, y, checkcol, h), itemg, flags, opt );
} }
QRect cr( x, y, checkcol, h ); QRect cr( x, y, checkcol, h );
QRect pmr( 0, 0, pixw, pixh ); QRect pmr( 0, 0, pixw, pixh );
@ -226,18 +220,8 @@ void QCompactStyle::drawControl( ControlElement element, QPainter *p, QStyleCont
g.brush( QColorGroup::Button ); g.brush( QColorGroup::Button );
p->fillRect( x+checkcol + 1, y, w - checkcol - 1, h, fill); p->fillRect( x+checkcol + 1, y, w - checkcol - 1, h, fill);
} else if ( checkable ) { // just "checking"... } else if ( checkable ) { // just "checking"...
int mw = checkcol + motifItemFrame;
int mh = h - 2*motifItemFrame;
if ( mi->isChecked() ) { if ( mi->isChecked() ) {
drawPrimitive( PE_MenuItemIndicatorCheck, p, ceData, elementFlags, QRect(x, y, checkcol, h), itemg, flags, opt );
SFlags cflags = Style_Default;
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
drawPrimitive( PE_CheckMark, p, ceData, elementFlags, QRect(x + motifItemFrame + 2, y + motifItemFrame,
mw, mh), itemg, cflags, opt );
} }
} }
@ -319,4 +303,56 @@ void QCompactStyle::drawControl( ControlElement element, QPainter *p, QStyleCont
} }
} }
/*! \reimp */
void QCompactStyle::drawPrimitive( PrimitiveElement pe,
QPainter *p,
QStyleControlElementData ceData,
ControlElementFlags elementFlags,
const QRect &r,
const QColorGroup &cg,
SFlags flags,
const QStyleOption& opt ) const
{
bool dis = !(flags & Style_Enabled);
bool act = flags & Style_Active;
int x, y, w, h;
r.rect( &x, &y, &w, &h );
switch (pe) {
case PE_MenuItemIndicatorFrame:
{
if ( act && !dis ) {
qDrawShadePanel( p, x, y, w, h, cg, TRUE, 1, &cg.brush( QColorGroup::Button ) );
} else {
qDrawShadePanel( p, x, y, w, h, cg, TRUE, 1, &cg.brush( QColorGroup::Midlight ) );
}
}
break;
case PE_MenuItemIndicatorIconFrame:
{
qDrawShadePanel( p, x, y, w, h, cg, FALSE, 1, &cg.brush( QColorGroup::Button ) );
}
break;
case PE_MenuItemIndicatorCheck:
{
int mw = w + motifItemFrame;
int mh = h - 2*motifItemFrame;
SFlags cflags = Style_Default;
if (! dis) {
cflags |= Style_Enabled;
}
if (act) {
cflags |= Style_On;
}
drawPrimitive( PE_CheckMark, p, ceData, elementFlags, QRect(x + motifItemFrame + 2, y + motifItemFrame, mw, mh), cg, cflags, opt );
}
break;
default:
break;
}
}
#endif #endif

@ -60,6 +60,15 @@ public:
int pixelMetric( PixelMetric metric, QStyleControlElementData ceData, ControlElementFlags elementFlags, const QWidget *widget = 0 ); int pixelMetric( PixelMetric metric, QStyleControlElementData ceData, ControlElementFlags elementFlags, const QWidget *widget = 0 );
void drawPrimitive( PrimitiveElement pe,
QPainter *p,
QStyleControlElementData ceData,
ControlElementFlags elementFlags,
const QRect &r,
const QColorGroup &cg,
SFlags flags = Style_Default,
const QStyleOption& = QStyleOption::Default ) const;
void drawControl( ControlElement element, QPainter *p, QStyleControlElementData ceData, ControlElementFlags elementFlags, const QRect &r, void drawControl( ControlElement element, QPainter *p, QStyleControlElementData ceData, ControlElementFlags elementFlags, const QRect &r,
const QColorGroup &cg, SFlags how = Style_Default, const QStyleOption& = QStyleOption::Default, const QWidget *w = 0 ); const QColorGroup &cg, SFlags how = Style_Default, const QStyleOption& = QStyleOption::Default, const QWidget *w = 0 );

@ -282,6 +282,9 @@ void QMotifPlusStyle::drawPrimitive( PrimitiveElement pe,
SFlags flags, SFlags flags,
const QStyleOption& opt ) const const QStyleOption& opt ) const
{ {
bool dis = ! (flags & Style_Enabled);
bool act = flags & Style_Active;
switch (pe) { switch (pe) {
case PE_HeaderSection: case PE_HeaderSection:
@ -638,6 +641,28 @@ void QMotifPlusStyle::drawPrimitive( PrimitiveElement pe,
break; break;
} }
case PE_PanelScrollBar:
{
drawMotifPlusShade(p, r, cg, TRUE, FALSE, &cg.brush(QColorGroup::Mid));
break;
}
case PE_MenuItemIndicatorCheck:
{
int x, y, w, h;
r.rect(&x, &y, &w, &h);
QRect vrect = visualRect( QRect( x+2, y+2, w, h-2 ), r );
SFlags cflags = Style_Default;
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
drawPrimitive(PE_CheckMark, p, ceData, elementFlags, vrect, cg, cflags);
break;
}
default: default:
QMotifStyle::drawPrimitive(pe, p, ceData, elementFlags, r, cg, flags, opt); QMotifStyle::drawPrimitive(pe, p, ceData, elementFlags, r, cg, flags, opt);
break; break;
@ -828,13 +853,7 @@ void QMotifPlusStyle::drawControl( ControlElement element,
} else if (checkable) { } else if (checkable) {
if (mi->isChecked()) { if (mi->isChecked()) {
SFlags cflags = Style_Default; drawPrimitive(PE_MenuItemIndicatorCheck, p, ceData, elementFlags, QRect(x, y, checkcol, h), cg, flags);
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
drawPrimitive(PE_CheckMark, p, ceData, elementFlags, vrect, cg, cflags);
} }
} }
@ -1147,8 +1166,12 @@ void QMotifPlusStyle::drawComplexControl(ComplexControl control,
if (controls == (SC_ScrollBarAddLine | SC_ScrollBarSubLine | if (controls == (SC_ScrollBarAddLine | SC_ScrollBarSubLine |
SC_ScrollBarAddPage | SC_ScrollBarSubPage | SC_ScrollBarAddPage | SC_ScrollBarSubPage |
SC_ScrollBarFirst | SC_ScrollBarLast | SC_ScrollBarSlider)) SC_ScrollBarFirst | SC_ScrollBarLast | SC_ScrollBarSlider))
drawMotifPlusShade(p, widget->rect(), cg, TRUE, FALSE, drawPrimitive(PE_PanelScrollBar, p, ceData, elementFlags, ceData.rect, cg,
&cg.brush(QColorGroup::Mid)); ((maxedOut) ? Style_Default : Style_Enabled) |
((active == SC_ScrollBarLast) ?
Style_Down : Style_Default) |
((ceData.orientation == Qt::Horizontal) ?
Style_Horizontal : Style_Default));
if ((controls & SC_ScrollBarSubLine) && subline.isValid()) if ((controls & SC_ScrollBarSubLine) && subline.isValid())
drawPrimitive(PE_ScrollBarSubLine, p, ceData, elementFlags, subline, cg, drawPrimitive(PE_ScrollBarSubLine, p, ceData, elementFlags, subline, cg,

@ -211,6 +211,9 @@ void QMotifStyle::drawPrimitive( PrimitiveElement pe,
SFlags flags, SFlags flags,
const QStyleOption& opt ) const const QStyleOption& opt ) const
{ {
bool dis = ! (flags & Style_Enabled);
bool act = flags & Style_Active;
switch( pe ) { switch( pe ) {
#ifndef QT_NO_LISTVIEW #ifndef QT_NO_LISTVIEW
case PE_CheckListExclusiveIndicator: { case PE_CheckListExclusiveIndicator: {
@ -761,6 +764,30 @@ void QMotifStyle::drawPrimitive( PrimitiveElement pe,
r.height() - 4, cg.brush(QColorGroup::Highlight)); r.height() - 4, cg.brush(QColorGroup::Highlight));
break; break;
case PE_PanelScrollBar:
qDrawShadePanel(p, r, cg, TRUE,
pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags),
&cg.brush(QColorGroup::Mid));
break;
case PE_MenuItemIndicatorCheck:
{
int x, y, w, h;
r.rect( &x, &y, &w, &h );
QRect vrect = visualRect( QRect( x+motifItemFrame, y+motifItemFrame, w, h-2*motifItemFrame ), r );
int xvis = vrect.x();
int mw = w;
int mh = h - 2*motifItemFrame;
SFlags cflags = Style_Default;
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
drawPrimitive(PE_CheckMark, p, ceData, elementFlags, QRect(xvis, y+motifItemFrame, mw, mh), cg, cflags);
}
default: default:
QCommonStyle::drawPrimitive( pe, p, ceData, elementFlags, r, cg, flags, opt ); QCommonStyle::drawPrimitive( pe, p, ceData, elementFlags, r, cg, flags, opt );
break; break;
@ -1076,18 +1103,8 @@ void QMotifStyle::drawControl( ControlElement element,
p->drawPixmap( pmr.topLeft(), pixmap ); p->drawPixmap( pmr.topLeft(), pixmap );
} else if ( checkable ) { // just "checking"... } else if ( checkable ) { // just "checking"...
int mw = checkcol;
int mh = h - 2*motifItemFrame;
if ( mi->isChecked() ) { if ( mi->isChecked() ) {
SFlags cflags = Style_Default; drawPrimitive(PE_MenuItemIndicatorCheck, p, ceData, elementFlags, QRect(x, y, checkcol, h), cg, flags);
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
drawPrimitive(PE_CheckMark, p, ceData, elementFlags,
QRect(xvis, y+motifItemFrame, mw, mh),
cg, cflags);
} }
} }
@ -1339,9 +1356,10 @@ void QMotifStyle::drawComplexControl( ComplexControl control,
if (sub == (SC_ScrollBarAddLine | SC_ScrollBarSubLine | SC_ScrollBarAddPage | if (sub == (SC_ScrollBarAddLine | SC_ScrollBarSubLine | SC_ScrollBarAddPage |
SC_ScrollBarSubPage | SC_ScrollBarFirst | SC_ScrollBarLast | SC_ScrollBarSubPage | SC_ScrollBarFirst | SC_ScrollBarLast |
SC_ScrollBarSlider)) SC_ScrollBarSlider))
qDrawShadePanel(p, ceData.rect, cg, TRUE, drawPrimitive(PE_PanelScrollBar, p, ceData, elementFlags, ceData.rect, cg,
pixelMetric(PM_DefaultFrameWidth, ceData, elementFlags, widget), ((ceData.orientation == Qt::Horizontal) ?
&cg.brush(QColorGroup::Mid)); Style_Horizontal : Style_Default));
QCommonStyle::drawComplexControl(control, p, ceData, elementFlags, r, cg, flags, sub, QCommonStyle::drawComplexControl(control, p, ceData, elementFlags, r, cg, flags, sub,
subActive, opt, widget); subActive, opt, widget);
break; break;

@ -567,6 +567,9 @@ void QSGIStyle::drawPrimitive( PrimitiveElement pe,
const int defaultFrameWidth = pixelMetric( PM_DefaultFrameWidth, ceData, elementFlags ); const int defaultFrameWidth = pixelMetric( PM_DefaultFrameWidth, ceData, elementFlags );
bool hot = ( flags & Style_MouseOver ) && ( flags & Style_Enabled ); bool hot = ( flags & Style_MouseOver ) && ( flags & Style_Enabled );
bool dis = ! (flags & Style_Enabled);
bool act = flags & Style_Active;
switch ( pe ) { switch ( pe ) {
case PE_ButtonCommand: case PE_ButtonCommand:
{ {
@ -878,6 +881,25 @@ void QSGIStyle::drawPrimitive( PrimitiveElement pe,
} }
break; break;
case PE_MenuItemIndicatorCheck:
{
int x, y, w, h;
r.rect(&x, &y, &w, &h);
SFlags cflags = Style_Default;
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
QRect er( x+sgiItemFrame+1, y+sgiItemFrame+3, pixelMetric(PM_IndicatorWidth, ceData, elementFlags), pixelMetric(PM_IndicatorHeight, ceData, elementFlags) );
er.addCoords( 1, 1, -1, -1 );
drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, er, cg, cflags, opt );
er.addCoords( 0, 1, 1, 1 );
drawPrimitive( PE_CheckMark, p, ceData, elementFlags, er, cg, cflags | Style_On, opt );
}
break;
default: default:
QMotifStyle::drawPrimitive( pe, p, ceData, elementFlags, r, cg, flags, opt ); QMotifStyle::drawPrimitive( pe, p, ceData, elementFlags, r, cg, flags, opt );
break; break;
@ -1018,20 +1040,8 @@ void QSGIStyle::drawControl( ControlElement element,
p->drawPixmap( pmr.topLeft(), pixmap ); p->drawPixmap( pmr.topLeft(), pixmap );
} else { } else {
if ( checkable ) { if ( checkable ) {
SFlags cflags = Style_Default;
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
if ( mi->isChecked() ) { if ( mi->isChecked() ) {
QRect er( x+sgiItemFrame+1, y+sgiItemFrame+3, drawPrimitive(PE_MenuItemIndicatorCheck, p, ceData, elementFlags, QRect(x, y, w, h), cg, flags);
pixelMetric(PM_IndicatorWidth, ceData, elementFlags),
pixelMetric(PM_IndicatorHeight, ceData, elementFlags) );
er.addCoords( 1, 1, -1, -1 );
drawPrimitive( PE_ButtonBevel, p, ceData, elementFlags, er, cg, cflags, opt );
er.addCoords( 0, 1, 1, 1 );
drawPrimitive( PE_CheckMark, p, ceData, elementFlags, er, cg, cflags | Style_On, opt );
} }
} }
} }

@ -225,6 +225,9 @@ void QWindowsStyle::drawPrimitive( PrimitiveElement pe,
SFlags flags, SFlags flags,
const QStyleOption& opt ) const const QStyleOption& opt ) const
{ {
bool dis = !(flags & Style_Enabled);
bool act = flags & Style_Active;
QRect rr( r ); QRect rr( r );
switch (pe) { switch (pe) {
case PE_ButtonCommand: case PE_ButtonCommand:
@ -568,6 +571,60 @@ void QWindowsStyle::drawPrimitive( PrimitiveElement pe,
} }
break; break;
case PE_MenuItemIndicatorFrame:
{
int x, y, w, h;
r.rect( &x, &y, &w, &h );
QRect vrect = visualRect( QRect( x, y, w, h ), r );
int xvis = vrect.x();
if ( act && !dis ) {
qDrawShadePanel( p, xvis, y, w, h, cg, TRUE, 1, &cg.brush( QColorGroup::Button ) );
}
else {
QBrush fill( cg.light(), Dense4Pattern );
// set the brush origin for the hash pattern to the x/y coordinate
// of the menu item's checkmark... this way, the check marks have
// a consistent look
QPoint origin = p->brushOrigin();
p->setBrushOrigin( xvis, y );
qDrawShadePanel( p, xvis, y, w, h, cg, TRUE, 1, &fill );
// restore the previous brush origin
p->setBrushOrigin( origin );
}
}
break;
case PE_MenuItemIndicatorIconFrame:
{
int x, y, w, h;
r.rect( &x, &y, &w, &h );
QRect vrect = visualRect( QRect( x, y, w, h ), r );
int xvis = vrect.x();
qDrawShadePanel( p, xvis, y, w, h, cg, FALSE, 1, &cg.brush( QColorGroup::Button ) );
}
break;
case PE_MenuItemIndicatorCheck:
{
int x, y, w, h;
r.rect( &x, &y, &w, &h );
int xp = x + windowsItemFrame;
SFlags cflags = Style_Default;
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
drawPrimitive(PE_CheckMark, p, ceData, elementFlags, visualRect( QRect(xp, y + windowsItemFrame, w - 2*windowsItemFrame, h - 2*windowsItemFrame), r ), cg, cflags);
}
break;
default: default:
if (pe >= PE_ArrowUp && pe <= PE_ArrowLeft) { if (pe >= PE_ArrowUp && pe <= PE_ArrowLeft) {
QPointArray a; QPointArray a;
@ -809,21 +866,7 @@ void QWindowsStyle::drawControl( ControlElement element,
QRect vrect = visualRect( QRect( xpos, y, checkcol, h ), r ); QRect vrect = visualRect( QRect( xpos, y, checkcol, h ), r );
int xvis = vrect.x(); int xvis = vrect.x();
if ( mi->isChecked() ) { if ( mi->isChecked() ) {
if ( act && !dis ) drawPrimitive(PE_MenuItemIndicatorFrame, p, ceData, elementFlags, QRect(x, y, checkcol, h), cg, flags);
qDrawShadePanel( p, xvis, y, checkcol, h,
cg, TRUE, 1, &cg.brush( QColorGroup::Button ) );
else {
QBrush fill( cg.light(), Dense4Pattern );
// set the brush origin for the hash pattern to the x/y coordinate
// of the menu item's checkmark... this way, the check marks have
// a consistent look
QPoint origin = p->brushOrigin();
p->setBrushOrigin( xvis, y );
qDrawShadePanel( p, xvis, y, checkcol, h, cg, TRUE, 1,
&fill );
// restore the previous brush origin
p->setBrushOrigin( origin );
}
} else if (! act) } else if (! act)
p->fillRect(xvis, y, checkcol , h, cg.brush( QColorGroup::Button )); p->fillRect(xvis, y, checkcol , h, cg.brush( QColorGroup::Button ));
@ -839,8 +882,7 @@ void QWindowsStyle::drawControl( ControlElement element,
int pixw = pixmap.width(); int pixw = pixmap.width();
int pixh = pixmap.height(); int pixh = pixmap.height();
if ( act && !dis && !mi->isChecked() ) if ( act && !dis && !mi->isChecked() )
qDrawShadePanel( p, xvis, y, checkcol, h, cg, FALSE, 1, drawPrimitive(PE_MenuItemIndicatorIconFrame, p, ceData, elementFlags, QRect(x, y, checkcol, h), cg, flags);
&cg.brush( QColorGroup::Button ) );
QRect pmr( 0, 0, pixw, pixh ); QRect pmr( 0, 0, pixw, pixh );
pmr.moveCenter( vrect.center() ); pmr.moveCenter( vrect.center() );
p->setPen( cg.text() ); p->setPen( cg.text() );
@ -851,20 +893,9 @@ void QWindowsStyle::drawControl( ControlElement element,
cg.brush( QColorGroup::Button )); cg.brush( QColorGroup::Button ));
int xp = xpos + checkcol + 1; int xp = xpos + checkcol + 1;
p->fillRect( visualRect( QRect( xp, y, w - checkcol - 1, h ), r ), fill); p->fillRect( visualRect( QRect( xp, y, w - checkcol - 1, h ), r ), fill);
} else if ( checkable ) { // just "checking"... } else if ( checkable ) { // just "checking"...
if ( mi->isChecked() ) { if ( mi->isChecked() ) {
int xp = xpos + windowsItemFrame; drawPrimitive(PE_MenuItemIndicatorCheck, p, ceData, elementFlags, QRect(x, y, checkcol, h), cg, flags);
SFlags cflags = Style_Default;
if (! dis)
cflags |= Style_Enabled;
if (act)
cflags |= Style_On;
drawPrimitive(PE_CheckMark, p, ceData, elementFlags,
visualRect( QRect(xp, y + windowsItemFrame,
checkcol - 2*windowsItemFrame,
h - 2*windowsItemFrame), r ), cg, cflags);
} }
} }

Loading…
Cancel
Save