\since 4.5
\inmodule QtWidgets
-
+
The QGtkStyle style provides a look and feel that integrates well
into GTK-based desktop environments such as the XFCe and GNOME.
Constructs a QGtkStyle object.
*/
QGtkStyle::QGtkStyle()
- : QWindowsStyle(*new QGtkStylePrivate)
+ : QCommonStyle(*new QGtkStylePrivate)
{
Q_D(QGtkStyle);
d->init();
Constructs a QGtkStyle object.
*/
QGtkStyle::QGtkStyle(QGtkStylePrivate &dd)
- : QWindowsStyle(dd)
+ : QCommonStyle(dd)
{
Q_D(QGtkStyle);
d->init();
{
Q_D(const QGtkStyle);
- QPalette palette = QWindowsStyle::standardPalette();
+ QPalette palette = QCommonStyle::standardPalette();
if (d->isThemeAvailable()) {
GtkStyle *style = d->gtkStyle();
GtkWidget *gtkButton = d->gtkWidget("GtkButton");
Q_D(QGtkStyle);
if (!d->isThemeAvailable())
- QWindowsStyle::polish(palette);
+ QCommonStyle::polish(palette);
else
palette = palette.resolve(standardPalette());
}
{
Q_D(QGtkStyle);
- QWindowsStyle::polish(app);
- // Custom fonts and palettes with QtConfig are intentionally
+ QCommonStyle::polish(app);
+ // Custom fonts and palettes with QtConfig are intentionally
// not supported as these should be entirely determined by
// current Gtk settings
if (app->desktopSettingsAware() && d->isThemeAvailable()) {
{
Q_D(QGtkStyle);
- QWindowsStyle::unpolish(app);
+ QCommonStyle::unpolish(app);
QPixmapCache::clear();
if (app->desktopSettingsAware() && d->isThemeAvailable()
{
Q_D(QGtkStyle);
- QWindowsStyle::polish(widget);
+ QCommonStyle::polish(widget);
if (!d->isThemeAvailable())
return;
if (qobject_cast<QAbstractButton*>(widget)
*/
void QGtkStyle::unpolish(QWidget *widget)
{
- QWindowsStyle::unpolish(widget);
+ QCommonStyle::unpolish(widget);
}
/*!
Q_D(const QGtkStyle);
if (!d->isThemeAvailable())
- return QWindowsStyle::pixelMetric(metric, option, widget);
+ return QCommonStyle::pixelMetric(metric, option, widget);
switch (metric) {
case PM_DefaultFrameWidth:
case PM_TabCloseIndicatorHeight:
return 20;
default:
- return QWindowsStyle::pixelMetric(metric, option, widget);
+ return QCommonStyle::pixelMetric(metric, option, widget);
}
}
Q_D(const QGtkStyle);
if (!d->isThemeAvailable())
- return QWindowsStyle::styleHint(hint, option, widget, returnData);
+ return QCommonStyle::styleHint(hint, option, widget, returnData);
switch (hint) {
+ case SH_ItemView_ChangeHighlightOnFocus:
+ return true;
case SH_ScrollBar_MiddleClickAbsolutePosition:
return true;
case SH_Menu_AllowActiveAndDisabled:
return false;
case SH_MainWindow_SpaceBelowMenuBar:
- return 0;
+ return false;
case SH_MenuBar_MouseTracking:
return true;
+ case SH_Menu_MouseTracking:
+ return true;
case SH_TitleBar_AutoRaise:
return true;
case SH_TitleBar_NoBorder:
mask->region -= QRect(option->rect.right() - 1, option->rect.top() + 2, 2, 1);
mask->region -= QRect(option->rect.right() , option->rect.top() + 3, 1, 2);
}
- return QWindowsStyle::styleHint(hint, option, widget, returnData);
+ return QCommonStyle::styleHint(hint, option, widget, returnData);
case SH_MessageBox_TextInteractionFlags:
return Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse;
case SH_MessageBox_CenterButtons:
case SH_ToolButtonStyle:
{
if (d->isKDE4Session())
- return QWindowsStyle::styleHint(hint, option, widget, returnData);
+ return QCommonStyle::styleHint(hint, option, widget, returnData);
GtkWidget *gtkToolbar = d->gtkWidget("GtkToolbar");
GtkToolbarStyle toolbar_style = GTK_TOOLBAR_ICONS;
g_object_get(gtkToolbar, "toolbar-style", &toolbar_style, NULL);
default:
break;
}
- return QWindowsStyle::styleHint(hint, option, widget, returnData);
+ return QCommonStyle::styleHint(hint, option, widget, returnData);
}
/*!
Q_D(const QGtkStyle);
if (!d->isThemeAvailable()) {
- QWindowsStyle::drawPrimitive(element, option, painter, widget);
+ QCommonStyle::drawPrimitive(element, option, painter, widget);
return;
}
break;
case PE_FrameDefaultButton: // fall through
- case PE_FrameFocusRect:
- if ((widget && qobject_cast<const QAbstractItemView*>(widget))) {
- if (option->state & State_KeyboardFocusChange)
- QWindowsStyle::drawPrimitive(element, option, painter, widget);
- } else {
- // ### this mess should move to subcontrolrect
- QRect frameRect = option->rect.adjusted(1, 1, -2, -2);
- if ( qobject_cast<const QTabBar*>(widget)) {
+ case PE_FrameFocusRect: {
+ QRect frameRect = option->rect.adjusted(1, 1, -2, -2); // ### this mess should move to subcontrolrect
+ if (qobject_cast<const QAbstractItemView*>(widget)) {
+ // Dont draw anything
+ } else if (qobject_cast<const QTabBar*>(widget)) {
GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook");
style = gtkPainter.getStyle(gtkNotebook);
gtkPainter.paintFocus(gtkNotebook, "tab", frameRect.adjusted(-1, 1, 1, 1), GTK_STATE_ACTIVE, style);
case QTabBar::TriangularWest:
case QTabBar::TriangularSouth:
painter->restore();
- QWindowsStyle::drawPrimitive(element, option, painter, widget);
+ QCommonStyle::drawPrimitive(element, option, painter, widget);
return;
}
break;
default:
- QWindowsStyle::drawPrimitive(element, option, painter, widget);
+ QCommonStyle::drawPrimitive(element, option, painter, widget);
}
}
Q_D(const QGtkStyle);
if (!d->isThemeAvailable()) {
- QWindowsStyle::drawComplexControl(control, option, painter, widget);
+ QCommonStyle::drawComplexControl(control, option, painter, widget);
return;
}
#endif // QT_NO_SLIDER
default:
- QWindowsStyle::drawComplexControl(control, option, painter, widget);
+ QCommonStyle::drawComplexControl(control, option, painter, widget);
break;
}
Q_D(const QGtkStyle);
if (!d->isThemeAvailable()) {
- QWindowsStyle::drawControl(element, option, painter, widget);
+ QCommonStyle::drawControl(element, option, painter, widget);
return;
}
// Draws one item in a popup menu.
if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- const int windowsItemFrame = 2; // menu item frame width
const int windowsItemHMargin = 3; // menu item hor text margin
const int windowsItemVMargin = 26; // menu item ver text margin
- const int windowsRightBorder = 15; // right border on windows
GtkWidget *gtkMenuItem = menuItem->checked ? d->gtkWidget("GtkMenu.GtkCheckMenuItem") :
d->gtkWidget("GtkMenu.GtkMenuItem");
int x, y, w, h;
menuitem->rect.getRect(&x, &y, &w, &h);
int tab = menuitem->tabWidth;
- int xm = windowsItemFrame + checkcol + windowsItemHMargin;
+ int xm = QGtkStylePrivate::menuItemFrame + checkcol + windowsItemHMargin;
int xpos = menuitem->rect.x() + xm + 1;
- QRect textRect(xpos, y + windowsItemVMargin, w - xm - windowsRightBorder - tab + 1, h - 2 * windowsItemVMargin);
+ QRect textRect(xpos, y + windowsItemVMargin, w - xm - QGtkStylePrivate::menuRightBorder - tab + 1, h - 2 * windowsItemVMargin);
QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect);
QString s = menuitem->text;
break;
default:
- QWindowsStyle::drawControl(element, option, painter, widget);
+ QCommonStyle::drawControl(element, option, painter, widget);
break;
}
break;
default:
- QWindowsStyle::drawControl(element, option, painter, widget);
+ QCommonStyle::drawControl(element, option, painter, widget);
}
}
{
Q_D(const QGtkStyle);
- QRect rect = QWindowsStyle::subControlRect(control, option, subControl, widget);
+ QRect rect = QCommonStyle::subControlRect(control, option, subControl, widget);
if (!d->isThemeAvailable())
- return QWindowsStyle::subControlRect(control, option, subControl, widget);
+ return QCommonStyle::subControlRect(control, option, subControl, widget);
switch (control) {
case CC_ScrollBar:
GtkWidget *arrowWidget = d->gtkWidget(arrowPath);
if (!arrowWidget)
- return QWindowsStyle::subControlRect(control, option, subControl, widget);
+ return QCommonStyle::subControlRect(control, option, subControl, widget);
GtkAllocation allocation;
d->gtk_widget_get_allocation(arrowWidget, &allocation);
{
Q_D(const QGtkStyle);
- QSize newSize = QWindowsStyle::sizeFromContents(type, option, size, widget);
+ QSize newSize = QCommonStyle::sizeFromContents(type, option, size, widget);
if (!d->isThemeAvailable())
return newSize;
newSize += QSize(6, 0);
}
break;
- case CT_MenuItem:
- if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- int textMargin = 8;
-
- if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
- GtkWidget *gtkMenuSeparator = d->gtkWidget("GtkMenu.GtkSeparatorMenuItem");
- GtkRequisition sizeReq = {0, 0};
- d->gtk_widget_size_request(gtkMenuSeparator, &sizeReq);
- newSize = QSize(size.width(), sizeReq.height);
- break;
- }
-
- GtkWidget *gtkMenuItem = d->gtkWidget("GtkMenu.GtkCheckMenuItem");
- GtkStyle* style = d->gtk_widget_get_style(gtkMenuItem);
-
- // Note we get the perfect height for the default font since we
- // set a fake text label on the gtkMenuItem
- // But if custom fonts are used on the widget we need a minimum size
- GtkRequisition sizeReq = {0, 0};
- d->gtk_widget_size_request(gtkMenuItem, &sizeReq);
- newSize.setHeight(qMax(newSize.height() - 4, sizeReq.height));
- newSize += QSize(textMargin + style->xthickness - 1, 0);
-
- gint checkSize;
- d->gtk_widget_style_get(gtkMenuItem, "indicator-size", &checkSize, NULL);
- newSize.setWidth(newSize.width() + qMax(0, checkSize - 20));
- }
- break;
case CT_SpinBox:
// QSpinBox does some nasty things that depends on CT_LineEdit
newSize = size + QSize(0, -d->gtk_widget_get_style(d->gtkWidget("GtkSpinButton"))->ythickness * 2);
newSize += QSize(1, 1);
break;
case CT_MenuBarItem:
- newSize += QSize(0, 2);
+ newSize += QSize(QGtkStylePrivate::menuItemHMargin * 4, QGtkStylePrivate::menuItemVMargin * 2 + 2);
break;
case CT_SizeGrip:
newSize += QSize(4, 4);
newSize = QSize(60, 19);
}
break;
+ case CT_MenuItem:
+ if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
+ int w = newSize.width();
+ int maxpmw = menuItem->maxIconWidth;
+ int tabSpacing = 20;
+ if (menuItem->text.contains(QLatin1Char('\t')))
+ w += tabSpacing;
+ else if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu)
+ w += 2 * QGtkStylePrivate::menuArrowHMargin;
+ else if (menuItem->menuItemType == QStyleOptionMenuItem::DefaultItem) {
+ // adjust the font and add the difference in size.
+ // it would be better if the font could be adjusted in the initStyleOption qmenu func!!
+ QFontMetrics fm(menuItem->font);
+ QFont fontBold = menuItem->font;
+ fontBold.setBold(true);
+ QFontMetrics fmBold(fontBold);
+ w += fmBold.width(menuItem->text) - fm.width(menuItem->text);
+ }
+
+ int checkcol = qMax<int>(maxpmw, QGtkStylePrivate::menuCheckMarkWidth); // Windows always shows a check column
+ w += checkcol;
+ w += int(QGtkStylePrivate::menuRightBorder) + 10;
+
+ newSize.setWidth(w);
+
+ int textMargin = 8;
+ if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
+ GtkWidget *gtkMenuSeparator = d->gtkWidget("GtkMenu.GtkSeparatorMenuItem");
+ GtkRequisition sizeReq = {0, 0};
+ d->gtk_widget_size_request(gtkMenuSeparator, &sizeReq);
+ newSize = QSize(newSize.width(), sizeReq.height);
+ break;
+ }
+
+ GtkWidget *gtkMenuItem = d->gtkWidget("GtkMenu.GtkCheckMenuItem");
+ GtkStyle* style = d->gtk_widget_get_style(gtkMenuItem);
+
+ // Note we get the perfect height for the default font since we
+ // set a fake text label on the gtkMenuItem
+ // But if custom fonts are used on the widget we need a minimum size
+ GtkRequisition sizeReq = {0, 0};
+ d->gtk_widget_size_request(gtkMenuItem, &sizeReq);
+ newSize.setHeight(qMax(newSize.height() - 4, sizeReq.height));
+ newSize += QSize(textMargin + style->xthickness - 1, 0);
+
+ gint checkSize;
+ d->gtk_widget_style_get(gtkMenuItem, "indicator-size", &checkSize, NULL);
+ newSize.setWidth(newSize.width() + qMax(0, checkSize - 20));
+ }
+ break;
default:
break;
}
Q_D(const QGtkStyle);
if (!d->isThemeAvailable())
- return QWindowsStyle::standardPixmap(sp, option, widget);
+ return QCommonStyle::standardPixmap(sp, option, widget);
QPixmap pixmap;
switch (sp) {
case SP_MessageBoxCritical:
return QGtkPainter::getIcon(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
default:
- return QWindowsStyle::standardPixmap(sp, option, widget);
+ return QCommonStyle::standardPixmap(sp, option, widget);
}
return pixmap;
}
Q_D(const QGtkStyle);
if (!d->isThemeAvailable())
- return QWindowsStyle::standardIcon(standardIcon, option, widget);
+ return QCommonStyle::standardIcon(standardIcon, option, widget);
switch (standardIcon) {
case SP_DialogDiscardButton:
return QGtkPainter::getIcon(GTK_STOCK_DELETE);
case SP_MessageBoxCritical:
return QGtkPainter::getIcon(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
default:
- return QWindowsStyle::standardIcon(standardIcon, option, widget);
+ return QCommonStyle::standardIcon(standardIcon, option, widget);
}
}
{
Q_D(const QGtkStyle);
- QRect r = QWindowsStyle::subElementRect(element, option, widget);
+ QRect r = QCommonStyle::subElementRect(element, option, widget);
if (!d->isThemeAvailable())
return r;
*/
QRect QGtkStyle::itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const
{
- return QWindowsStyle::itemPixmapRect(r, flags, pixmap);
+ return QCommonStyle::itemPixmapRect(r, flags, pixmap);
}
/*!
void QGtkStyle::drawItemPixmap(QPainter *painter, const QRect &rect,
int alignment, const QPixmap &pixmap) const
{
- QWindowsStyle::drawItemPixmap(painter, rect, alignment, pixmap);
+ QCommonStyle::drawItemPixmap(painter, rect, alignment, pixmap);
}
/*!
QStyle::SubControl QGtkStyle::hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
const QPoint &pt, const QWidget *w) const
{
- return QWindowsStyle::hitTestComplexControl(cc, opt, pt, w);
+ return QCommonStyle::hitTestComplexControl(cc, opt, pt, w);
}
/*!
QPixmap QGtkStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
const QStyleOption *opt) const
{
- return QWindowsStyle::generatedIconPixmap(iconMode, pixmap, opt);
+ return QCommonStyle::generatedIconPixmap(iconMode, pixmap, opt);
}
/*!
void QGtkStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal,
bool enabled, const QString& text, QPalette::ColorRole textRole) const
{
- return QWindowsStyle::drawItemText(painter, rect, alignment, pal, enabled, text, textRole);
+ return QCommonStyle::drawItemText(painter, rect, alignment, pal, enabled, text, textRole);
}
QT_END_NAMESPACE