Set combo delegate in TouchProxyStyle

This commit is contained in:
craig.p.drummond
2014-05-20 18:15:03 +00:00
committed by craig.p.drummond
parent 44323ff3d6
commit 988c4ccf99
2 changed files with 104 additions and 103 deletions

View File

@@ -25,111 +25,13 @@
#include "lineedit.h"
#include "utils.h"
#include <QAbstractItemView>
#include <QStyle>
#include <QStyleOption>
#include <QStyledItemDelegate>
#include <QDesktopWidget>
#include <QApplication>
#include <QPainter>
#include "gtkstyle.h"
// Max number of items before we try to force a scrollbar in popup menu...
static int maxPopupItemCount=-1;
class ComboItemDelegate : public QStyledItemDelegate
{
public:
ComboItemDelegate(ComboBox *p) : QStyledItemDelegate(p), mCombo(p) { }
virtual ~ComboItemDelegate() { }
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSize sz=QStyledItemDelegate::sizeHint(option, index);
int minH=option.fontMetrics.height()*2;
if (sz.height()<minH) {
sz.setHeight(minH);
}
return sz;
}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (GtkStyle::isActive()) {
QStyleOptionMenuItem opt = getStyleOption(option, index);
painter->fillRect(option.rect, opt.palette.background());
mCombo->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, mCombo);
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
static bool isSeparator(const QModelIndex &index)
{
return index.data(Qt::AccessibleDescriptionRole).toString() == QLatin1String("separator");
}
QStyleOptionMenuItem getStyleOption(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionMenuItem menuOption;
QPalette resolvedpalette = option.palette.resolve(QApplication::palette("QMenu"));
QVariant value = index.data(Qt::ForegroundRole);
if (value.canConvert<QBrush>()) {
resolvedpalette.setBrush(QPalette::WindowText, qvariant_cast<QBrush>(value));
resolvedpalette.setBrush(QPalette::ButtonText, qvariant_cast<QBrush>(value));
resolvedpalette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
}
menuOption.palette = resolvedpalette;
menuOption.state = QStyle::State_None;
if (mCombo->window()->isActiveWindow()) {
menuOption.state = QStyle::State_Active;
}
if ((option.state & QStyle::State_Enabled) && (index.model()->flags(index) & Qt::ItemIsEnabled)) {
menuOption.state |= QStyle::State_Enabled;
} else {
menuOption.palette.setCurrentColorGroup(QPalette::Disabled);
}
if (option.state & QStyle::State_Selected) {
menuOption.state |= QStyle::State_Selected;
}
menuOption.checkType = QStyleOptionMenuItem::NonExclusive;
menuOption.checked = mCombo->currentIndex() == index.row();
if (isSeparator(index)) {
menuOption.menuItemType = QStyleOptionMenuItem::Separator;
} else {
menuOption.menuItemType = QStyleOptionMenuItem::Normal;
}
QVariant variant = index.model()->data(index, Qt::DecorationRole);
switch (variant.type()) {
case QVariant::Icon:
menuOption.icon = qvariant_cast<QIcon>(variant);
break;
case QVariant::Color: {
static QPixmap pixmap(option.decorationSize);
pixmap.fill(qvariant_cast<QColor>(variant));
menuOption.icon = pixmap;
break;
}
default:
menuOption.icon = qvariant_cast<QPixmap>(variant);
break;
}
if (index.data(Qt::BackgroundRole).canConvert<QBrush>()) {
menuOption.palette.setBrush(QPalette::All, QPalette::Background,
qvariant_cast<QBrush>(index.data(Qt::BackgroundRole)));
}
menuOption.text = index.model()->data(index, Qt::DisplayRole).toString()
.replace(QLatin1Char('&'), QLatin1String("&&"));
menuOption.tabWidth = 0;
menuOption.maxIconWidth = option.decorationSize.width() + 4;
menuOption.menuRect = option.rect;
menuOption.rect = option.rect;
menuOption.font = mCombo->font();
menuOption.fontMetrics = QFontMetrics(menuOption.font);
return menuOption;
}
ComboBox *mCombo;
};
ComboBox::ComboBox(QWidget *p)
#ifdef ENABLE_KDE_SUPPORT
: KComboBox(p)
@@ -145,9 +47,6 @@ ComboBox::ComboBox(QWidget *p)
maxPopupItemCount=32;
}
}
if (Utils::touchFriendly()) {
setItemDelegate(new ComboItemDelegate(this));
}
}
void ComboBox::setEditable(bool editable)

View File

@@ -26,9 +26,12 @@
#include "gtkstyle.h"
#include "flickcharm.h"
#include <QSpinBox>
#include <QComboBox>
#include <QPainter>
#include <QStyleOptionSpinBox>
#include <QAbstractScrollArea>
#include <QStyledItemDelegate>
#include <QApplication>
static void drawSpinButton(QPainter *painter, const QRect &r, const QColor &col, bool isPlus)
{
@@ -49,6 +52,100 @@ static void drawSpinButton(QPainter *painter, const QRect &r, const QColor &col,
painter->restore();
}
class ComboItemDelegate : public QStyledItemDelegate
{
public:
ComboItemDelegate(QComboBox *p) : QStyledItemDelegate(p), combo(p) { }
virtual ~ComboItemDelegate() { }
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSize sz=QStyledItemDelegate::sizeHint(option, index);
int minH=option.fontMetrics.height()*2;
if (sz.height()<minH) {
sz.setHeight(minH);
}
return sz;
}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (GtkStyle::isActive()) {
QStyleOptionMenuItem opt = getStyleOption(option, index);
painter->fillRect(option.rect, opt.palette.background());
combo->style()->drawControl(QStyle::CE_MenuItem, &opt, painter, combo);
} else {
QStyledItemDelegate::paint(painter, option, index);
}
}
static bool isSeparator(const QModelIndex &index)
{
return index.data(Qt::AccessibleDescriptionRole).toString() == QLatin1String("separator");
}
QStyleOptionMenuItem getStyleOption(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionMenuItem menuOption;
QPalette resolvedpalette = option.palette.resolve(QApplication::palette("QMenu"));
QVariant value = index.data(Qt::ForegroundRole);
if (value.canConvert<QBrush>()) {
resolvedpalette.setBrush(QPalette::WindowText, qvariant_cast<QBrush>(value));
resolvedpalette.setBrush(QPalette::ButtonText, qvariant_cast<QBrush>(value));
resolvedpalette.setBrush(QPalette::Text, qvariant_cast<QBrush>(value));
}
menuOption.palette = resolvedpalette;
menuOption.state = QStyle::State_None;
if (combo->window()->isActiveWindow()) {
menuOption.state = QStyle::State_Active;
}
if ((option.state & QStyle::State_Enabled) && (index.model()->flags(index) & Qt::ItemIsEnabled)) {
menuOption.state |= QStyle::State_Enabled;
} else {
menuOption.palette.setCurrentColorGroup(QPalette::Disabled);
}
if (option.state & QStyle::State_Selected) {
menuOption.state |= QStyle::State_Selected;
}
menuOption.checkType = QStyleOptionMenuItem::NonExclusive;
menuOption.checked = combo->currentIndex() == index.row();
if (isSeparator(index)) {
menuOption.menuItemType = QStyleOptionMenuItem::Separator;
} else {
menuOption.menuItemType = QStyleOptionMenuItem::Normal;
}
QVariant variant = index.model()->data(index, Qt::DecorationRole);
switch (variant.type()) {
case QVariant::Icon:
menuOption.icon = qvariant_cast<QIcon>(variant);
break;
case QVariant::Color: {
static QPixmap pixmap(option.decorationSize);
pixmap.fill(qvariant_cast<QColor>(variant));
menuOption.icon = pixmap;
break;
}
default:
menuOption.icon = qvariant_cast<QPixmap>(variant);
break;
}
if (index.data(Qt::BackgroundRole).canConvert<QBrush>()) {
menuOption.palette.setBrush(QPalette::All, QPalette::Background,
qvariant_cast<QBrush>(index.data(Qt::BackgroundRole)));
}
menuOption.text = index.model()->data(index, Qt::DisplayRole).toString()
.replace(QLatin1Char('&'), QLatin1String("&&"));
menuOption.tabWidth = 0;
menuOption.maxIconWidth = option.decorationSize.width() + 4;
menuOption.menuRect = option.rect;
menuOption.rect = option.rect;
menuOption.font = combo->font();
menuOption.fontMetrics = QFontMetrics(menuOption.font);
return menuOption;
}
QComboBox *combo;
};
TouchProxyStyle::TouchProxyStyle(bool touchSpin)
: ProxyStyle()
, touchStyleSpin(touchSpin)
@@ -197,8 +294,13 @@ void TouchProxyStyle::drawComplexControl(ComplexControl control, const QStyleOpt
void TouchProxyStyle::polish(QWidget *widget)
{
if (Utils::touchFriendly() && qobject_cast<QAbstractScrollArea *>(widget)) {
FlickCharm::self()->activateOn(widget);
if (Utils::touchFriendly()) {
if (qobject_cast<QAbstractScrollArea *>(widget)) {
FlickCharm::self()->activateOn(widget);
} else if (qobject_cast<QComboBox *>(widget)) {
QComboBox *combo=static_cast<QComboBox *>(widget);
combo->setItemDelegate(new ComboItemDelegate(combo));
}
}
ProxyStyle::polish(widget);
}