mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-03 00:15:21 +00:00

目前将声音的功能移到插件中实现,支持声音插件的面板的展示 Log: 简化任务栏代码,优化插件加载逻辑 Influence: 快捷面板,观察声音、亮度调整和音乐播放等功能是否显示正常 Task: https://pms.uniontech.com/task-view-208579.html Change-Id: I8fd7917e06dd7505da65dc36767166a779ffb0e6
111 lines
4.0 KiB
C++
111 lines
4.0 KiB
C++
/*
|
|
* Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
|
|
*
|
|
* Author: donghualin <donghualin@uniontech.com>
|
|
*
|
|
* Maintainer: donghualin <donghualin@uniontech.com>
|
|
*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "settingdelegate.h"
|
|
|
|
#include <DListView>
|
|
#include <QMouseEvent>
|
|
#include <QPainter>
|
|
#include <DGuiApplicationHelper>
|
|
#include <QPainterPath>
|
|
|
|
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<QIcon>();
|
|
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<QMouseEvent *>(event);
|
|
if (rctIndex.contains(mouseEvent->pos()))
|
|
Q_EMIT selectIndexChanged(index);
|
|
}
|
|
|
|
return DStyledItemDelegate::editorEvent(event, model, option, index);
|
|
}
|