Introduce ZimItemWidget to Delegate Item Display

Decouple complex item creation from button. Used later for styling.
This commit is contained in:
ShaopengLin 2024-10-28 22:50:18 -04:00 committed by Kelson
parent e9c7421fc1
commit e489712787
2 changed files with 61 additions and 12 deletions

View File

@ -42,12 +42,8 @@ void MultiZimButton::updateDisplay()
item->setData(Qt::UserRole, bookId); item->setData(Qt::UserRole, bookId);
item->setData(Qt::DisplayRole, bookTitle); item->setData(Qt::DisplayRole, bookTitle);
const auto radioBt = new QRadioButton(bookTitle);
radioBt->setIcon(zimIcon);
mp_radioButtonGroup->addButton(radioBt);
mp_buttonList->addItem(item); mp_buttonList->addItem(item);
mp_buttonList->setItemWidget(item, radioBt); setItemZimWidget(item, bookTitle, zimIcon);
} }
mp_buttonList->sortItems(); mp_buttonList->sortItems();
@ -58,9 +54,8 @@ void MultiZimButton::updateDisplay()
setDisabled(mp_buttonList->model()->rowCount() == 0); setDisabled(mp_buttonList->model()->rowCount() == 0);
const auto firstWidget = mp_buttonList->itemWidget(mp_buttonList->item(0)); if (const auto firstWidget = getZimWidget(0))
if (const auto firstBt = qobject_cast<QRadioButton *>(firstWidget)) firstWidget->getRadioButton()->setChecked(true);
firstBt->setChecked(true);
} }
QStringList MultiZimButton::getZimIds() const QStringList MultiZimButton::getZimIds() const
@ -68,10 +63,44 @@ QStringList MultiZimButton::getZimIds() const
QStringList idList; QStringList idList;
for (int row = 0; row < mp_buttonList->count(); row++) for (int row = 0; row < mp_buttonList->count(); row++)
{ {
const auto listItem = mp_buttonList->item(row); const auto widget = getZimWidget(row);
const auto radioBt = qobject_cast<QRadioButton *>(mp_buttonList->itemWidget(listItem)); if (widget && widget->getRadioButton()->isChecked())
if (radioBt && radioBt->isChecked()) idList.append(mp_buttonList->item(row)->data(Qt::UserRole).toString());
idList.append(listItem->data(Qt::UserRole).toString());
} }
return idList; return idList;
} }
ZimItemWidget *MultiZimButton::getZimWidget(int row) const
{
const auto widget = mp_buttonList->itemWidget(mp_buttonList->item(row));
return qobject_cast<ZimItemWidget *>(widget);
}
void MultiZimButton::setItemZimWidget(QListWidgetItem *item,
const QString &title, const QIcon &icon)
{
const auto zimWidget = new ZimItemWidget(title, icon);
mp_radioButtonGroup->addButton(zimWidget->getRadioButton());
mp_buttonList->setItemWidget(item, zimWidget);
}
ZimItemWidget::ZimItemWidget(QString text, QIcon icon, QWidget *parent) :
QWidget(parent),
textLabel(new QLabel(this)),
iconLabel(new QLabel(this)),
radioBt(new QRadioButton(this))
{
setLayout(new QHBoxLayout);
layout()->setSpacing(0);
layout()->setContentsMargins(0, 0, 0, 0);
textLabel->setText(text);
/* TODO: change temporary values once size is defined laters */
const QSize iconSize = QSize(24, 24);
iconLabel->setPixmap(icon.pixmap(iconSize));
layout()->addWidget(iconLabel);
layout()->addWidget(textLabel);
layout()->addWidget(radioBt);
}

View File

@ -5,6 +5,23 @@
class QListWidget; class QListWidget;
class QButtonGroup; class QButtonGroup;
class QListWidgetItem;
class QRadioButton;
class QLabel;
class ZimItemWidget : public QWidget {
Q_OBJECT
public:
ZimItemWidget(QString text, QIcon icon, QWidget *parent = nullptr);
QRadioButton* getRadioButton() const { return radioBt; }
private:
QLabel* textLabel;
QLabel* iconLabel;
QRadioButton* radioBt;
};
class MultiZimButton : public QToolButton { class MultiZimButton : public QToolButton {
Q_OBJECT Q_OBJECT
@ -19,6 +36,9 @@ public slots:
private: private:
QListWidget* mp_buttonList; QListWidget* mp_buttonList;
QButtonGroup* mp_radioButtonGroup; QButtonGroup* mp_radioButtonGroup;
ZimItemWidget* getZimWidget(int row) const;
void setItemZimWidget(QListWidgetItem* item, const QString& title, const QIcon& icon);
}; };
#endif // MULTIZIMBUTTON_H #endif // MULTIZIMBUTTON_H