10#include <QItemSelectionModel>
16class RibbonGalleryItemPrivate
19 RibbonGalleryItemPrivate();
21 QMap<int, QVariant> m_datas;
22 Qt::ItemFlags m_flags;
26RibbonGalleryItemPrivate::RibbonGalleryItemPrivate()
27 : m_flags(Qt::ItemIsEnabled | Qt::ItemIsSelectable)
33RibbonGalleryItem::RibbonGalleryItem()
34 : d(new RibbonGalleryItemPrivate)
59 d->m_datas[role] =
data;
67 return d->m_action->text();
70 return d->m_action->toolTip();
72 case Qt::DecorationRole:
73 return d->m_action->icon();
78 return d->m_datas.value(role);
88 return data(Qt::DisplayRole).toString();
98 return data(Qt::ToolTipRole).toString();
103 setData(Qt::DecorationRole, ico);
108 return qvariant_cast<QIcon>(
data(Qt::DecorationRole));
113 return (d->m_flags & Qt::ItemIsSelectable);
119 d->m_flags |= Qt::ItemIsSelectable;
121 d->m_flags &= ~Qt::ItemIsSelectable;
127 return (d->m_flags & Qt::ItemIsEnabled);
137 d->m_flags |= Qt::ItemIsEnabled;
139 d->m_flags &= ~Qt::ItemIsEnabled;
147 d->m_action->setEnabled(flag & Qt::ItemIsEnabled);
162 if (act->isEnabled()) {
163 d->m_flags |= Qt::ItemIsEnabled;
165 d->m_flags &= ~Qt::ItemIsEnabled;
176 setData(Qt::TextAlignmentRole, (
int)a);
181 return qvariant_cast<Qt::Alignment>(
data(Qt::TextAlignmentRole));
186 : QStyledItemDelegate(parent)
192 const QModelIndex &index)
const
214 const QModelIndex &index)
const
216 QStyle *style = m_group->style();
217 int sp = m_group->spacing();
218 QRect rect = option.rect;
219 rect.adjust(sp, sp, -sp, -sp);
221 painter->setClipRect(rect);
222 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, m_group);
224 QRect iconRect = option.rect;
226 iconRect.adjust(sp, sp, -sp, -sp);
227 QIcon ico = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
228 ico.paint(painter, iconRect, Qt::AlignCenter, QIcon::Normal, QIcon::On);
233 const QModelIndex &index)
const
235 QStyledItemDelegate::paint(painter, option, index);
239 const QModelIndex &index)
const
241 QStyledItemDelegate::paint(painter, option, index);
248 return m_group->gridSize();
253 : QAbstractListModel(parent)
264 return (
parent.isValid() ? 0 : m_items.count());
269 if (!
index.isValid() || (
index.row() >= m_items.count())) {
270 return Qt::NoItemFlags;
272 return m_items.at(
index.row())->flags();
277 if (!
index.isValid() || (
index.row() >= m_items.count())) {
280 return m_items.at(
index.row())->data(
role);
293 if (!
index.isValid() || (
index.row() >= m_items.count())) {
297 m_items.at(
index.row())->setData(
role, value);
311 return m_items.value(
row);
323 if ((
row < 0) || (
row >= m_items.count())) {
336 m_items.append(
item);
341class RibbonGalleryGroupPrivate
345 RibbonGalleryGroupPrivate();
348 void itemActivate(
const QModelIndex &index, QAction::ActionEvent event);
349 int displayRowCount()
const;
351 QString m_groupTitle;
354 int m_gridMinimumWidth;
355 int m_gridMaximumWidth;
356 QActionGroup *m_actionGroup;
360RibbonGalleryGroupPrivate::RibbonGalleryGroupPrivate()
361 : m_preStyle(RibbonGalleryGroup::IconWithText)
362 , m_displayRow(RibbonGalleryGroup::DisplayOneRow)
363 , m_gridMinimumWidth(0)
364 , m_gridMaximumWidth(0)
365 , m_blockRecalc(false)
369void RibbonGalleryGroupPrivate::init()
371 Q_Q(RibbonGalleryGroup);
372 m_actionGroup =
new QActionGroup(q);
377RibbonGalleryGroupModel *RibbonGalleryGroupPrivate::groupModel()
379 Q_Q(
const RibbonGalleryGroup);
380 return qobject_cast<RibbonGalleryGroupModel *>(q->model());
383void RibbonGalleryGroupPrivate::itemActivate(
const QModelIndex &index, QAction::ActionEvent event)
385 if (index.isValid()) {
386 RibbonGalleryItem *item =
static_cast<RibbonGalleryItem *
>(index.internalPointer());
388 QAction *act = item->action();
390 act->activate(event);
396int RibbonGalleryGroupPrivate::displayRowCount()
const
398 switch (m_displayRow) {
416 setViewMode(QListView::IconMode);
417 setResizeMode(QListView::Adjust);
418 setSelectionRectVisible(
true);
419 setUniformItemSizes(
true);
440 d->m_blockRecalc = on;
446 return d->m_blockRecalc;
464 int dr = d->displayRowCount();
465 int h = galleryHeight / dr;
471 if (mw > 0 && w < mw) {
475 if (mw > 0 && w > mw) {
478 setGridSize(QSize(w, h));
481 const int shiftpix = 4;
484 int textHeight = fontMetrics().lineSpacing();
485 int iconHeight = h - textHeight - 2 * spacing() - shiftpix;
486 if (iconHeight > 0) {
487 setIconSize(QSize(w - 2 * spacing() - shiftpix, iconHeight));
489 setIconSize(QSize(w - 2 * spacing() - shiftpix, h - 2 * spacing() - shiftpix));
494 int textHeight = fontMetrics().lineSpacing() * 2;
495 int iconHeight = h - textHeight;
496 if (iconHeight > 0) {
497 setIconSize(QSize(w - 2 * spacing() - shiftpix, iconHeight - 2 * spacing() - shiftpix));
499 setIconSize(QSize(w - 2 * spacing() - shiftpix, h - 2 * spacing() - shiftpix));
504 setIconSize(QSize(w - 2 * spacing() - shiftpix, h - 2 * spacing() - shiftpix));
508 setIconSize(QSize(w - 2 * spacing() - shiftpix, h - 2 * spacing() - shiftpix));
512#ifdef QX_RIBBON_DEBUG
513 qDebug() <<
"RibbonGalleryGroup::recalcGridSize(" << galleryHeight <<
"): gridSize=" << gridSize()
514 <<
" iconSize=" << iconSize();
525 d->m_preStyle = style;
537 return d->m_preStyle;
557 d->m_actionGroup->addAction(act);
568 for (QAction *a : acts) {
569 d->m_actionGroup->addAction(a);
571 for (
int i = 0; i < acts.size(); ++i) {
579 d->m_groupTitle = title;
586 return d->m_groupTitle;
596 QModelIndex ind = model->
index(i, 0, QModelIndex());
597 QItemSelectionModel *selmodel = selectionModel();
599 selmodel->select(ind, QItemSelectionModel::SelectCurrent);
613 return d->m_displayRow;
623 d->m_gridMinimumWidth = w;
633 return d->m_gridMinimumWidth;
643 d->m_gridMaximumWidth = w;
652 return d->m_gridMaximumWidth;
657 QSize sz = QListView::sizeHint();
659 int dr = d->displayRowCount();
660 return QSize(sz.width(), sz.height() / dr);
670 return d->m_actionGroup;
676 d->itemActivate(index, QAction::Trigger);
682 d->itemActivate(index, QAction::Hover);
virtual void paintIconWithTextWordWrap(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
RibbonGalleryGroupItemDelegate(RibbonGalleryGroup *group, QObject *parent=Q_NULLPTR)
virtual void paintIconWithText(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual void paintIconOnly(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual int rowCount(const QModelIndex &parent) const override
void append(RibbonGalleryItem *item)
virtual ~RibbonGalleryGroupModel()
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
RibbonGalleryGroupModel(QObject *parent=Q_NULLPTR)
RibbonGalleryItem * at(int row) const
virtual QVariant data(const QModelIndex &index, int role) const override
void insert(int row, RibbonGalleryItem *item)
virtual bool setData(const QModelIndex &index, const QVariant &value, int role) override
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const override
RibbonGalleryItem * take(int row)
GalleryGroupStyle galleryGroupStyle() const
DisplayRow
定义Gallery在一个group下面显示的图标行数
void setDisplayRow(DisplayRow r)
void triggered(QAction *action)
等同QActionGroup的triggered 所有加入RibbonGalleryGroup的action都会被一个QActionGroup管理,可以通过
void selectByIndex(int i)
void onItemClicked(const QModelIndex &index)
DisplayRow displayRow() const
void setGroupTitle(const QString &title)
bool isRecalcGridSizeBlock() const
void onItemEntered(const QModelIndex &index)
void hovered(QAction *action)
等同QActionGroup的hovered 所有加入RibbonGalleryGroup的action都会被一个QActionGroup管理,可以通过
void recalcGridSize()
重新计算grid和icon的尺寸
void setGridMinimumWidth(int w)
设置grid最小的宽度,默认为0(不限制)
void setGridMaximumWidth(int w)
设置grid最大的宽度,默认为0(不限制)
void addItems(const QList< QAction * > &acts)
RibbonGalleryGroup(QWidget *w=Q_NULLPTR)
void setGalleryGroupStyle(GalleryGroupStyle style)
设置默认的预设样式
GalleryGroupStyle
GalleryGroup显示的样式
@ IconWithWordWrapText
图标带文字,文字会换行显示,此模式只会对DisplayOneRow生效,如果不是DisplayOneRow,等同IconWithText
QActionGroup * actionGroup() const
获取RibbonGalleryGroup管理的actiongroup
void setRecalcGridSizeBlock(bool on=true)
是否禁止计算
void addItem(const QString &text, const QIcon &icon)
void groupTitleChanged(const QString &title)
int gridMaximumWidth() const
grid最大的的宽度,默认为0(不限制)
virtual ~RibbonGalleryGroup()
QSize sizeHint() const override
int gridMinimumWidth() const
grid最小的宽度,默认为0(不限制)
QString groupTitle() const
virtual Qt::ItemFlags flags() const
Qt::Alignment textAlignment() const
void setToolTip(const QString &text)
bool isSelectable() const
void setFlags(Qt::ItemFlags flag)
virtual ~RibbonGalleryItem()
void setAction(QAction *act)
void setText(const QString &text)
void setSelectable(bool isSelectable)
void setEnable(bool isEnable)
void setData(int role, const QVariant &data)
void setIcon(const QIcon &ico)
void setTextAlignment(Qt::Alignment a)
virtual QVariant data(int role) const
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_FINI_PRIVATE()
#define QX_RIBBON_END_NAMESPACE
#define QX_RIBBON_BEGIN_NAMESPACE