/* * Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. * * Author: donghualin * * Maintainer: donghualin * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "settingdelegate.h" #include #include #include #include #include DWIDGET_USE_NAMESPACE SettingDelegate::SettingDelegate(QAbstractItemView *parent) : DStyledItemDelegate(parent) { parent->installEventFilter(this); } SettingDelegate::~SettingDelegate() { } void SettingDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { painter->save(); QRect indexRect = option.rect; // 绘制背景色 bool isOver = option.state & QStyle::State_MouseOver; bool isDefault = index.data(itemCheckRole).toBool(); if (isDefault) { QPainterPath path, path1; path.addRoundedRect(indexRect, 8, 8); DPalette palette = DGuiApplicationHelper::instance()->applicationPalette(); painter->fillPath(path, palette.color(QPalette::ColorRole::Highlight)); } else { QPainterPath path; path.addRoundedRect(indexRect, 8, 8); painter->fillPath(path, isOver ? QColor(0, 0, 0, 100) : QColor(0, 0, 0, 64)); } // 绘制图标 QRect rectIcon = indexRect; rectIcon.setX(20); QIcon icon = index.data(Qt::DecorationRole).value(); QPixmap pixmap(icon.pixmap(16, 16)); rectIcon.setY(indexRect.y() + (rectIcon.height() - pixmap.height()) / 2); rectIcon.setWidth(pixmap.width()); rectIcon.setHeight(pixmap.height()); painter->drawPixmap(rectIcon, pixmap); #define RIGHTSPACE 11 #define SELECTICONSIZE 10 // 绘制文本 QRect rectText; rectText.setX(rectIcon.left() + rectIcon.width() + 8); rectText.setWidth(indexRect.width() - rectText.x() - RIGHTSPACE - SELECTICONSIZE - 5); QPen pen(isDefault ? QColor(255, 255, 255) : QColor(0, 0, 0)); pen.setWidth(2); painter->setPen(pen); QFont ft(DFontSizeManager::instance()->t6()); QFontMetrics ftm(ft); QString text = QFontMetrics(ft).elidedText(index.data(Qt::DisplayRole).toString(), Qt::TextElideMode::ElideRight, rectText.width()); painter->setFont(ft); rectText.setY(indexRect.y() + (indexRect.height() - QFontMetrics(ft).height()) / 2); rectText.setHeight(QFontMetrics(ft).height()); painter->drawText(rectText, text); // 如果当前是默认的输出设备,则绘制右侧的对钩 if (isDefault) { QPointF points[3] = { QPointF(indexRect.width() - RIGHTSPACE - SELECTICONSIZE, indexRect.center().y()), QPointF(indexRect.width() - RIGHTSPACE - SELECTICONSIZE / 2, rectIcon.bottom() + 2), QPointF(indexRect.width() - RIGHTSPACE, rectIcon.top() - 2) }; painter->drawPolyline(points, 3); } painter->restore(); } bool SettingDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if (event->type() == QEvent::MouseButtonRelease) { QRect rctIndex = option.rect; rctIndex.setHeight(rctIndex.height() - spacing()); QMouseEvent *mouseEvent = static_cast(event); if (rctIndex.contains(mouseEvent->pos())) Q_EMIT selectIndexChanged(index); } return DStyledItemDelegate::editorEvent(event, model, option, index); }