1
0
mirror of https://github.com/KDE/latte-dock.git synced 2024-12-24 05:33:50 +03:00

layout editor:provide layout changed indicator

--following plasma systemsettings changes indicator,
layout editor is now also providing an orange circle
in order to indicate that a layout has changes
This commit is contained in:
Michail Vourlakos 2021-02-16 10:58:24 +02:00
parent 541800f972
commit cc044d8483
2 changed files with 66 additions and 8 deletions

View File

@ -39,6 +39,9 @@ namespace Settings {
namespace Layout {
namespace Delegate {
const int INDICATORCHANGESLENGTH = 6;
const int INDICATORCHANGESMARGIN = 2;
LayoutName::LayoutName(QObject *parent)
: QStyledItemDelegate(parent)
{
@ -72,6 +75,43 @@ void LayoutName::setModelData(QWidget *editor, QAbstractItemModel *model, const
}
}
void LayoutName::drawHasChangesIndicator(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//! draw changes circle indicator
int csize{INDICATORCHANGESLENGTH};
//! Draw indicator background
QStandardItemModel *model = (QStandardItemModel *) index.model();
if (qApp->layoutDirection() == Qt::RightToLeft) {
QStyleOptionViewItem indicatorOption = option;
indicatorOption.rect = QRect(option.rect.x(), option.rect.y(), csize + INDICATORCHANGESMARGIN, option.rect.height());
QStyledItemDelegate::paint(painter, indicatorOption, model->index(index.row(), Model::Layouts::HIDDENTEXTCOLUMN));
} else {
QStyleOptionViewItem indicatorOption = option;
indicatorOption.rect = QRect(option.rect.x() + option.rect.width() - csize - INDICATORCHANGESMARGIN, option.rect.y(), csize + INDICATORCHANGESMARGIN, option.rect.height());
QStyledItemDelegate::paint(painter, indicatorOption, model->index(index.row(), Model::Layouts::HIDDENTEXTCOLUMN));
}
bool isNewLayout = index.data(Model::Layouts::ISNEWLAYOUTROLE).toBool();
bool hasChanges = index.data(Model::Layouts::LAYOUTHASCHANGESROLE).toBool();
bool isChanged = (isNewLayout || hasChanges);
if (isChanged) {
QRect changesRect = (qApp->layoutDirection() == Qt::RightToLeft) ? QRect(option.rect.x() + INDICATORCHANGESMARGIN, option.rect.y() + option.rect.height()/2 - csize/2, csize, csize) :
QRect(option.rect.x() + option.rect.width() - csize - INDICATORCHANGESMARGIN, option.rect.y() + option.rect.height()/2 - csize/2, csize, csize);
QColor plasmaOrange(246, 116, 0); //orangish color used from plasma systemsettings #f67400
QBrush backBrush(plasmaOrange);
QPen pen; pen.setWidth(1);
pen.setColor(plasmaOrange);
painter->setBrush(backBrush);
painter->setPen(pen);
painter->drawEllipse(changesRect);
}
}
void LayoutName::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
bool inMultiple = index.data(Model::Layouts::INMULTIPLELAYOUTSROLE).toBool();
@ -94,10 +134,15 @@ void LayoutName::paint(QPainter *painter, const QStyleOptionViewItem &option, co
painter->setRenderHint(QPainter::Antialiasing, true);
int indicatorLength = INDICATORCHANGESLENGTH + INDICATORCHANGESMARGIN;
QRect optionRect = (qApp->layoutDirection() == Qt::RightToLeft) ? QRect(option.rect.x() + indicatorLength, option.rect.y(), option.rect.width() - indicatorLength, option.rect.height()) :
QRect(option.rect.x(), option.rect.y(), option.rect.width() - indicatorLength, option.rect.height());
adjustedOption.rect = optionRect;
if (isLocked) {
QStandardItemModel *model = (QStandardItemModel *) index.model();
bool active = Latte::isActive(option);
bool enabled = Latte::isEnabled(option);
bool selected = Latte::isSelected(option);
@ -107,14 +152,14 @@ void LayoutName::paint(QPainter *painter, const QStyleOptionViewItem &option, co
//! font metrics
QFontMetrics fm(option.font);
int textWidth = fm.boundingRect(name).width();
int thick = option.rect.height();
int thick = optionRect.height();
int length = thick;
int startWidth = (qApp->layoutDirection() == Qt::RightToLeft) ? length : 0;
int endWidth = (qApp->layoutDirection() == Qt::RightToLeft) ? 0 : length;
QRect destinationS(option.rect.x(), option.rect.y(), startWidth, thick);
QRect destinationE(option.rect.x() + option.rect.width() - endWidth, option.rect.y(), endWidth, thick);
QRect destinationS(optionRect.x(), optionRect.y(), startWidth, thick);
QRect destinationE(optionRect.x() + optionRect.width() - endWidth, optionRect.y(), endWidth, thick);
QStyleOptionViewItem myOptionS = adjustedOption;
QStyleOptionViewItem myOptionE = adjustedOption;
@ -125,8 +170,8 @@ void LayoutName::paint(QPainter *painter, const QStyleOptionViewItem &option, co
myOptionS.rect = destinationS;
myOptionE.rect = destinationE;
myOptionMain.rect.moveLeft(option.rect.x() + startWidth);
myOptionMain.rect.setWidth(option.rect.width() - startWidth - endWidth);
myOptionMain.rect.moveLeft(optionRect.x() + startWidth);
myOptionMain.rect.setWidth(optionRect.width() - startWidth - endWidth);
QStyledItemDelegate::paint(painter, myOptionMain, index);
@ -141,15 +186,25 @@ void LayoutName::paint(QPainter *painter, const QStyleOptionViewItem &option, co
QIcon lockIcon = QIcon::fromTheme("object-locked");
if (qApp->layoutDirection() == Qt::RightToLeft) {
painter->drawPixmap(QRect(option.rect.x(), option.rect.y(), thick, thick), lockIcon.pixmap(thick, thick, mode));
painter->drawPixmap(QRect(optionRect.x(), optionRect.y(), thick, thick), lockIcon.pixmap(thick, thick, mode));
} else {
painter->drawPixmap(QRect(option.rect.x() + option.rect.width() - endWidth, option.rect.y(), thick, thick), lockIcon.pixmap(thick, thick, mode));
painter->drawPixmap(QRect(optionRect.x() + optionRect.width() - endWidth, optionRect.y(), thick, thick), lockIcon.pixmap(thick, thick, mode));
}
}
//! in order to paint also the background
QStyleOptionViewItem indicatorOption = adjustedOption;
indicatorOption.rect = option.rect;
drawHasChangesIndicator(painter, indicatorOption, index);
return;
}
//! in order to paint also the background
QStyleOptionViewItem indicatorOption = adjustedOption;
indicatorOption.rect = option.rect;
drawHasChangesIndicator(painter, indicatorOption, index);
//! Draw valid text area
adjustedOption.font.setBold(isActive);
adjustedOption.font.setItalic(isChanged);

View File

@ -37,6 +37,9 @@ public:
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
private:
void drawHasChangesIndicator(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
}