diff --git a/src/fileProcess/configfilemanager.cpp b/src/fileProcess/configfilemanager.cpp index 7ede36d..649c591 100644 --- a/src/fileProcess/configfilemanager.cpp +++ b/src/fileProcess/configfilemanager.cpp @@ -7,6 +7,15 @@ ConfigFileManager::ConfigFileManager(QObject *parent) : QObject(parent) } +/** + * @brief 创建 JSON 文件 + * + * 在指定的缓存目录中创建 JSON 文件。 + * + * @param cachedir 缓存目录对象 + * + * @return 如果成功创建 JSON 文件,则返回 true;否则返回 false。 + */ bool ConfigFileManager::createJson(QDir cachedir) { QString m_themePath = cachedir.absolutePath(); @@ -26,6 +35,15 @@ bool ConfigFileManager::createJson(QDir cachedir) } } +/** + * @brief 创建配置文件 + * + * 在给定的缓存目录中创建配置文件。 + * + * @param cachedir 缓存目录对象 + * + * @return 创建成功返回 true,否则返回 false + */ bool ConfigFileManager::createConf(QDir cachedir) { QString m_themePath = cachedir.absolutePath(); @@ -45,6 +63,16 @@ bool ConfigFileManager::createConf(QDir cachedir) } } +/** + * @brief 修改radius的json配置文件 + * + * 根据给定的radius值,修改指定的json配置文件中的"Radius"字段的值。 + * + * @param radius Radius值 + * @param jsonFilePath 配置文件路径 + * + * @return 修改成功返回true,否则返回false + */ bool ConfigFileManager::modifyRadiusJson(int radius,QString jsonFilePath) { QString confFilePath = jsonFilePath; @@ -89,7 +117,16 @@ bool ConfigFileManager::modifyRadiusJson(int radius,QString jsonFilePath) emit updateInfo(); } - +/** + * @brief 修改配置文件中的强调色配置 + * + * 将给定的强调色配置写入指定的配置文件中。 + * + * @param accentcolor 强调色 + * @param confFilePath 配置文件路径 + * + * @return 修改成功返回 true,否则返回 false + */ bool ConfigFileManager::modifyAccentColorConf(QColor accentcolor,QString confFilePath) { @@ -127,6 +164,16 @@ bool ConfigFileManager::modifyAccentColorConf(QColor accentcolor,QString confFil } } +/** + * @brief 修改壁纸配置文件 + * + * 从指定的配置文件路径读取文件内容,并修改其中的壁纸路径,然后将修改后的内容写回到文件中。 + * + * @param wallpaperpath 壁纸路径 + * @param confFilePath 配置文件路径 + * + * @return 修改成功返回 true,否则返回 false + */ bool ConfigFileManager::modifyWallPaperConf(QString wallpaperpath,QString confFilePath) { @@ -161,6 +208,16 @@ bool ConfigFileManager::modifyWallPaperConf(QString wallpaperpath,QString confFi } } +/** + * @brief 修改透明度配置 + * + * 读取指定的配置文件内容,并修改其中的透明度设置,最后将修改后的内容写回到文件中。 + * + * @param transparency 透明度值 + * @param confFilePath 配置文件路径 + * + * @return 修改成功返回 true,否则返回 false + */ bool ConfigFileManager::modifyTransparencyConf(int transparency,QString confFilePath) { // 读取文件内容 @@ -192,6 +249,16 @@ bool ConfigFileManager::modifyTransparencyConf(int transparency,QString confFile } } +/** + * @brief 修改窗口半径配置 + * + * 将指定的文件中的窗口半径配置进行修改,并保存到文件中。 + * + * @param windowradius 窗口半径值 + * @param confFilePath 配置文件路径 + * + * @return 修改成功返回 true,否则返回 false + */ bool ConfigFileManager::modifywindowRadiusConf(int windowradius,QString confFilePath) { QFile file(confFilePath); @@ -219,6 +286,16 @@ bool ConfigFileManager::modifywindowRadiusConf(int windowradius,QString confFile } } +/** + * @brief 复制文件内容到另一个文件 + * + * 将源文件的内容复制到目标文件中。 + * + * @param sourceFilePath 源文件路径 + * @param destinationFilePath 目标文件路径 + * + * @return 复制成功返回 true,否则返回 false + */ bool ConfigFileManager::copyFileContent(const QString &sourceFilePath, const QString &destinationFilePath) { QFile sourceFile(sourceFilePath); @@ -247,6 +324,16 @@ bool ConfigFileManager::copyFileContent(const QString &sourceFilePath, const QSt return true; } +/** + * @brief 将文件复制到缓存目录 + * + * 将指定的文件复制到缓存目录中。如果文件已经存在于缓存目录中,则不会进行复制。 + * + * @param map 存储键值对的映射 + * @param cachedir 缓存目录对象 + * + * @return 复制是否成功的布尔值 + */ bool ConfigFileManager::copyIcontoCacheDir(QMap *map, QDir cachedir) { bool success = true; @@ -279,6 +366,15 @@ bool ConfigFileManager::copyIcontoCacheDir(QMap *map, QDir cac return success; } +/** + * @brief 将文件复制到缓存目录 + * + * 将指定的文件复制到缓存目录中,根据不同的类型设置不同的目标文件名。 + * + * @param destinationFilePath 目标文件路径 + * @param cachedir 缓存目录 + * @param type 类型 + */ void ConfigFileManager::copyPictoCacheDir(const QString &destinationFilePath, QDir cachedir, QString type) { QString sourceFilePath = destinationFilePath; @@ -305,6 +401,14 @@ void ConfigFileManager::copyPictoCacheDir(const QString &destinationFilePath, QD qDebug() << "File copied successfully"; } +/** + * @brief 将文件复制到缓存目录 + * + * 使用ffmpeg命令将指定的MP4文件复制到缓存目录中,并根据文件名生成相应的缓存文件。 + * + * @param destinationFilePath 目标文件路径 + * @param cachedir 缓存目录 + */ void ConfigFileManager::copyMp4toCacheDir(const QString &destinationFilePath, QDir cachedir) { QStringList list; diff --git a/src/fileProcess/historyinfoload.cpp b/src/fileProcess/historyinfoload.cpp index bdaaded..d03a6d4 100644 --- a/src/fileProcess/historyinfoload.cpp +++ b/src/fileProcess/historyinfoload.cpp @@ -6,6 +6,14 @@ #include #include +/** + * @brief 构造函数,用于加载历史信息 + * + * 根据给定的日期,创建一个 HistoryInfoLoad 对象,用于加载历史信息。 + * + * @param date 日期 + * @param parent 父对象指针 + */ HistoryInfoLoad::HistoryInfoLoad(const QString &date, QObject *parent) { m_historyInfo.historytime = date; @@ -17,6 +25,13 @@ HistoryInfoLoad::HistoryInfoLoad(const QString &date, QObject *parent) getWindowRadius(); } +/** + * @brief 获取封面 + * + * 从历史信息中获取封面的路径。 + * + * @return 封面路径 + */ QString HistoryInfoLoad::getCover() { QString filePath = m_historyInfo.filepath + "/src/globalTheme/preview"; @@ -37,6 +52,13 @@ QString HistoryInfoLoad::getCover() return m_historyInfo.coverpath; } +/** + * @brief 获取主题名称 + * + * 从指定的文件路径中读取主题名称并返回。 + * + * @return 主题名称 + */ QString HistoryInfoLoad::getThemeName() { QString filePath = m_historyInfo.filepath + "/src/debian/control"; @@ -64,6 +86,13 @@ QString HistoryInfoLoad::getThemeName() return m_historyInfo.themename; } +/** + * @brief 获取主题类型 + * + * 根据文件路径获取主题类型。 + * + * @return 主题类型 + */ QString HistoryInfoLoad::getThemeType() { QString filePath = m_historyInfo.filepath + "/src"; @@ -85,6 +114,11 @@ QString HistoryInfoLoad::getThemeType() return m_historyInfo.themetype; } +/** + * @brief 获取半径 + * + * 从给定的文件路径中加载半径信息,并保存在 HistoryInfo 对象的 radius 成员变量中。 + */ void HistoryInfoLoad::getRadius() { QString filePath = m_historyInfo.filepath + "/src/globalTheme/default.json"; @@ -114,6 +148,11 @@ void HistoryInfoLoad::getRadius() } +/** + * @brief 获取壁纸 + * + * 从指定的文件中读取壁纸路径。 + */ void HistoryInfoLoad::getWallpaper() { QString filePath = m_historyInfo.filepath + "/src/globalTheme/theme.conf"; @@ -146,6 +185,11 @@ void HistoryInfoLoad::getWallpaper() } +/** + * @brief 获取强调色 + * + * 从指定路径读取主题配置文件,并获取其中的强调色信息。 + */ void HistoryInfoLoad::getAccentColor() { QString filePath = m_historyInfo.filepath + "/src/globalTheme/theme.conf"; @@ -176,6 +220,11 @@ void HistoryInfoLoad::getAccentColor() } } +/** + * @brief 获取透明度 + * + * 从指定的路径加载配置文件中获取透明度信息,并将其保存在 HistoryInfo 对象的 transparency 属性中。 + */ void HistoryInfoLoad::getTransparency() { QString filePath = m_historyInfo.filepath + "/src/globalTheme/theme.conf"; @@ -212,6 +261,11 @@ void HistoryInfoLoad::getTransparency() } } +/** + * @brief 获取窗口半径 + * + * 从指定路径读取主题配置文件,并从中获取窗口半径值。 + */ void HistoryInfoLoad::getWindowRadius() { QString filePath = m_historyInfo.filepath + "/src/globalTheme/theme.conf"; @@ -248,12 +302,24 @@ void HistoryInfoLoad::getWindowRadius() } } +/** + * @brief 获取历史信息数据 + * + * 返回包含历史信息的数据对象。 + * + * @return 历史信息数据对象 + */ HistoryInfo HistoryInfoLoad::getInfoData() { qDebug()<setBackgroundRole(QPalette::Base); @@ -55,11 +62,23 @@ MainInterface::MainInterface(QWidget *parent) : QWidget(parent) }); } +/** + * @brief 设置是否启用历史记录 + * + * 根据给定的布尔值设置是否启用历史记录。 + * + * @param ishistory 是否启用历史记录 + */ void MainInterface::isHistory(bool ishistory) { m_ishistory = ishistory; } +/** + * @brief 初始化主界面 + * + * 初始化主界面,包括左侧栏、主题堆叠小部件等。 + */ void MainInterface::init() { @@ -120,6 +139,13 @@ void MainInterface::init() } +/** + * @brief 初始化左侧工具栏 + * + * 创建一个QWidget作为左侧工具栏,并设置其最小和最大尺寸。然后创建一个QVBoxLayout来管理左侧工具栏的布局。 + * 创建一个QButtonGroup来管理多个按钮的选中状态。将多个按钮添加到按钮组中,并设置它们为可选中状态。 + * 将全局按钮和构建按钮添加到布局中,并设置构建按钮为普通按钮。最后将布局中的控件添加到左侧工具栏中。 + */ void MainInterface::initLeftBar() { m_navigationwidget = new QWidget(m_belowwidget); @@ -244,26 +270,44 @@ void MainInterface::getThemeInfo(const HistoryInfo &InfoData) } +/** + * @brief 获取应用程序图标映射表 + * + * 返回一个 QMap 类型的指针,该指针指向应用程序图标映射表。 + * + * @return 应用程序图标映射表指针 + */ QMap* MainInterface::getAppIconsMap() { + //资源文件的appiconmap return m_iconthemewidget->getAppIconsMap(); } QMap *MainInterface::getSystemIconsMap() { + //资源文件的systemiconmap return m_iconthemewidget->getSystemIconsMap(); } QMap *MainInterface::getCurosrMap() { + //资源文件的cursoriconmap return m_cursorthemewidget->getCursorMap(); } QMap *MainInterface::getTimeCurosrMap() { + //资源文件的timecursoriconmap return m_cursorthemewidget->getTimeCursorMap(); } +/** + * @brief 刷新界面 + * + * 根据传入的主题类型刷新界面。 + * + * @param themeType 主题类型 + */ void MainInterface::refresh(QString themeType) { if("global" == themeType){ @@ -296,6 +340,13 @@ void MainInterface::updateButtonGroup(bool isGlobalTheme) } +/** + * @brief 更新缩略图 + * + * 将指定的缩略图路径设置为 PlymouthThemeWidget 的缩略图图标。 + * + * @param thumbnailPath 缩略图路径 + */ void MainInterface::updateThumbnail(QString thumbnailPath) { m_plymouththemewidget->setThumbnailIcon(thumbnailPath); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1e0cd61..9c48cc9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -46,6 +46,9 @@ MainWindow::~MainWindow() { } +/** + * @brief 初始化界面 + */ void MainWindow::initUI() { QPalette palette; @@ -211,6 +214,11 @@ void MainWindow::initUI() }); } +/** + * @brief 初始化入口 + * + * 初始化各个按钮的入口,并设置相应的图标和提示信息。 + */ void MainWindow::initEntry() { m_globalbtn = new EntryButton(); @@ -241,6 +249,11 @@ void MainWindow::refresh() // m_maininterface->refresh(); } +/** + * @brief 点击"GoHome"按钮后执行的函数 + * + * 当用户点击"GoHome"按钮后,执行该函数。 + */ void MainWindow::onGoHomeClicked() { //返回主界面判断,是否在主界面点击返回按钮 @@ -281,6 +294,14 @@ void MainWindow::onGoHomeClicked() // refresh(); } +/** + * @brief 设置入口按钮的图标和文本 + * + * 设置入口按钮的图标和文本。 + * + * @param icon QIcon 对象,表示要设置的图标 + * @param text QString 对象,表示要设置的文本 + */ void EntryButton::setEntry(const QIcon &icon, const QString &text) { QFont font("Arial", 18); @@ -293,6 +314,13 @@ void EntryButton::setEntry(const QIcon &icon, const QString &text) textLabel->setFont(QFont("Arial" , 18)); } +/** + * @brief 设置提示文字 + * + * 设置 EntryButton 控件的提示文字。 + * + * @param text 提示文字 + */ void EntryButton::setTip(const QString &text) { tipLabel->setText(text); @@ -303,6 +331,13 @@ void EntryButton::setTip(const QString &text) tipLabel->setWordWrap(true); } +/** + * @brief 构造函数 + * + * 创建一个 EntryButton 对象,继承自 QPushButton。 + * + * @param parent 父对象指针 + */ EntryButton::EntryButton(QWidget *parent): QPushButton(parent) { this->setFixedSize(240,280); @@ -319,23 +354,45 @@ EntryButton::EntryButton(QWidget *parent): QPushButton(parent) layout->addWidget(tipLabel); } +/** + * @brief 鼠标按下事件处理函数 + * + * 当鼠标左键按下时,执行该函数。 + * + * @param event 鼠标事件指针 + */ void MainWindow::mousePressEvent(QMouseEvent *event) { + // 判断是否按下左键 if (event->button() == Qt::LeftButton) { + // 设置拖动标志为真 this->m_drag = true; + // 记录按下位置的坐标 this->dragPos = event->pos(); + // 记录全局位置 this->resizeDownPos = event->globalPos(); + // 记录按下时窗口的矩形大小 this->mouseDownRect = this->rect(); } } + +/** + * @brief 鼠标移动事件 + * + * 当鼠标移动时,该函数会被调用。 + * + * @param event 鼠标事件指针 + */ void MainWindow::mouseMoveEvent(QMouseEvent * event) { if (resizeRegion != Default) { + // 处理调整窗体大小的操作 handleResize(); return; } if(m_move) { + // 移动窗体 move(event->globalPos() - dragPos); return; } @@ -343,21 +400,34 @@ void MainWindow::mouseMoveEvent(QMouseEvent * event) QRect r = this->rect(); QRect resizeInnerRect(resizeBorderWidth, resizeBorderWidth, r.width() - 2*resizeBorderWidth, r.height() - 2*resizeBorderWidth); if(r.contains(clientCursorPos) && !resizeInnerRect.contains(clientCursorPos)) { //调整窗体大小 + // 获取窗体的可调整大小区域 ResizeRegion resizeReg = getResizeRegion(clientCursorPos); + // 设置鼠标的形状为可调整大小形状 setResizeCursor(resizeReg); if (m_drag && (event->buttons() & Qt::LeftButton)) { + // 设置窗体的可调整大小区域,并处理调整大小操作 resizeRegion = resizeReg; handleResize(); } } else { //移动窗体 + // 设置鼠标的形状为箭头形状 setCursor(Qt::ArrowCursor); if (m_drag && (event->buttons() & Qt::LeftButton)) { + // 设置标志位为移动窗体状态,并移动窗体 m_move = true; move(event->globalPos() - dragPos); } } } + +/** + * @brief 鼠标释放事件 + * + * 当鼠标释放时触发本事件。 + * + * @param event QMouseEvent 指针,指向发生事件的对象。 + */ void MainWindow::mouseReleaseEvent(QMouseEvent *event) { m_drag = false; @@ -368,52 +438,97 @@ void MainWindow::mouseReleaseEvent(QMouseEvent *event) resizeRegion = Default; setCursor(Qt::ArrowCursor); } + +/** + * @brief 设置调整大小的游标 + * + * 根据给定的调整区域设置对应的游标。 + * + * @param region 调整区域 + */ void MainWindow::setResizeCursor(ResizeRegion region) { switch (region) { case North: case South: + // 设置上下调整光标 setCursor(Qt::SizeVerCursor); break; case East: case West: + // 设置左右调整光标 setCursor(Qt::SizeHorCursor); break; case NorthWest: case SouthEast: + // 设置对角线调整光标(从左上到右下) setCursor(Qt::SizeFDiagCursor); break; default: + // 设置对角线调整光标(从右上到左下) setCursor(Qt::SizeBDiagCursor); break; } } + +/** + * @brief 获取窗口调整大小区域 + * + * 根据给定的客户端位置获取窗口调整大小的区域。 + * + * @param clientPos 客户端位置 + * + * @return 返回窗口调整大小区域枚举值 + */ ResizeRegion MainWindow::getResizeRegion(QPoint clientPos) { + // 如果客户点的y坐标小于等于边框宽度 if (clientPos.y() <= resizeBorderWidth) { + // 如果客户点的x坐标小于等于边框宽度 if (clientPos.x() <= resizeBorderWidth) + // 返回北西方向 return NorthWest; + // 如果客户点的x坐标大于等于窗口宽度减去边框宽度 else if (clientPos.x() >= this->width() - resizeBorderWidth) + // 返回北东方向 return NorthEast; else + // 返回北方向 return North; } + // 如果客户点的y坐标大于等于窗口高度减去边框宽度 else if (clientPos.y() >= this->height() - resizeBorderWidth) { + // 如果客户点的x坐标小于等于边框宽度 if (clientPos.x() <= resizeBorderWidth) + // 返回南西方向 return SouthWest; + // 如果客户点的x坐标大于等于窗口宽度减去边框宽度 else if (clientPos.x() >= this->width() - resizeBorderWidth) + // 返回南东方向 return SouthEast; else + // 返回南方向 return South; } else { + // 如果客户点的x坐标小于等于边框宽度 if (clientPos.x() <= resizeBorderWidth) + // 返回西方向 return West; else + // 返回东方向 return East; } } + +/** + * @brief 处理移动事件 + * + * 当移动事件发生时,该函数用于处理移动事件,并调整窗口位置。 + * + * @param pt 鼠标当前位置 + */ void MainWindow::handleMove(QPoint pt) { QDesktopWidget* desktop = QApplication::desktop(); // 创建 QDesktopWidget 实例 @@ -429,57 +544,79 @@ void MainWindow::handleMove(QPoint pt) } move(currentPos); } + +/** + * @brief 处理窗口大小调整 + * + * 根据鼠标的位置和移动距离,调整窗口的大小。 + */ void MainWindow::handleResize() { + // 计算x轴和y轴的偏移量 int xdiff = QCursor::pos().x() - resizeDownPos.x(); int ydiff = QCursor::pos().y() - resizeDownPos.y(); + + // 根据不同的resizeRegion进行不同的操作 switch (resizeRegion) { - case East: - { - resize(mouseDownRect.width()+xdiff, this->height()); - break; - } - case West: - { - resize(mouseDownRect.width()-xdiff, this->height()); - move(resizeDownPos.x()+xdiff, this->y()); - break; - } - case South: - { - resize(this->width(),mouseDownRect.height()+ydiff); - break; - } - case North: - { - resize(this->width(),mouseDownRect.height()-ydiff); - move(this->x(), resizeDownPos.y()+ydiff); - break; - } - case SouthEast: - { - resize(mouseDownRect.width() + xdiff, mouseDownRect.height() + ydiff); - break; - } - case NorthEast: - { - resize(mouseDownRect.width()+xdiff, mouseDownRect.height()-ydiff); - move(this->x(), resizeDownPos.y()+ydiff); - break; - } - case NorthWest: - { - resize(mouseDownRect.width()-xdiff, mouseDownRect.height()-ydiff); - move(resizeDownPos.x()+xdiff, resizeDownPos.y()+ydiff); - break; - } - case SouthWest: - { - resize(mouseDownRect.width()-xdiff, mouseDownRect.height()+ydiff); - move(resizeDownPos.x()+xdiff, this->y()); - break; - } + case East: + { + // 东方向,宽度增加 + resize(mouseDownRect.width()+xdiff, this->height()); + break; + } + case West: + { + // 西方向,宽度减少 + resize(mouseDownRect.width()-xdiff, this->height()); + // 移动到原始位置,x轴偏移量增加 + move(resizeDownPos.x()+xdiff, this->y()); + break; + } + case South: + { + // 南方向,高度增加 + resize(this->width(),mouseDownRect.height()+ydiff); + break; + } + case North: + { + // 北方向,高度减少 + resize(this->width(),mouseDownRect.height()-ydiff); + // 移动到原始位置,y轴偏移量增加 + move(this->x(), resizeDownPos.y()+ydiff); + break; + } + case SouthEast: + { + // 东南方向,宽度和高度都增加 + resize(mouseDownRect.width() + xdiff, mouseDownRect.height() + ydiff); + break; + } + case NorthEast: + { + // 东北方向,宽度增加,高度减少 + resize(mouseDownRect.width()+xdiff, mouseDownRect.height()-ydiff); + // 移动到原始位置,x轴偏移量增加,y轴偏移量增加 + move(this->x(), resizeDownPos.y()+ydiff); + break; + } + case NorthWest: + { + // 西北方向,宽度减少,高度减少 + resize(mouseDownRect.width()-xdiff, mouseDownRect.height()-ydiff); + // 移动到原始位置,x轴偏移量减少,y轴偏移量减少 + move(resizeDownPos.x()+xdiff, resizeDownPos.y()+ydiff); + break; + } + case SouthWest: + { + // 西南方向,宽度减少,高度增加 + resize(mouseDownRect.width()-xdiff, mouseDownRect.height()+ydiff); + // 移动到原始位置,x轴偏移量减少,y轴偏移量增加 + move(resizeDownPos.x()+xdiff, this->y()); + break; + } } } diff --git a/src/module/cursorthemefeature.cpp b/src/module/cursorthemefeature.cpp index 0a78776..65d4c2e 100644 --- a/src/module/cursorthemefeature.cpp +++ b/src/module/cursorthemefeature.cpp @@ -86,18 +86,31 @@ void CursorImageWidget::updateImage(const QString& imagePath) qDebug() << "Failed to load image:" << filePath; } } + // 适应视图,保持宽高比 graphicsView->fitInView(graphicsView->scene()->sceneRect(), Qt::KeepAspectRatio); + // 获取当前视图转换矩阵 QTransform currentTransform = graphicsView->transform(); + // 计算场景的中心点坐标,并转换为视图坐标系下的坐标 QPointF sceneCenter = graphicsView->mapToScene(graphicsView->viewport()->rect().center()); currentTransform.translate(sceneCenter.x(), sceneCenter.y()); + // 设置新的视图转换矩阵,使视图中心点移动到场景中心点 graphicsView->setTransform(currentTransform); - + // 计算场景的中心点坐标,并转换为视图坐标系下的坐标 QPointF viewCenter = graphicsView->mapFromScene(graphicsView->scene()->sceneRect().center()); + // 将视图中心点移动到新的中心点 graphicsView->centerOn(viewCenter); + // 更新视口 graphicsView->viewport()->update(); } +/** + * @brief 更新图标映射 + * + * 根据新的图标映射更新光标图像小部件的图标。 + * + * @param newIconMap 新的图标映射 + */ void CursorImageWidget::updateIconMap(const QMap *newIconMap) { m_iconMap = newIconMap; @@ -181,6 +194,14 @@ void CursorImageWidget::updateIconMap(const QMap *newIconMap) graphicsView->show(); } +/** + * @brief CursorImageWidget 构造函数 + * + * 初始化 CursorImageWidget 对象。 + * + * @param parent 父 QWidget 对象指针 + * @param iconMap 包含图标键值对的 QMap 对象指针 + */ CursorImageWidget::CursorImageWidget(QWidget *parent, const QMap* iconMap) : QWidget(parent), m_iconMap(iconMap) { @@ -268,6 +289,14 @@ CursorImageWidget::CursorImageWidget(QWidget *parent, const QMapsetTransform(transform); } +/** + * @brief 更新图标 + * + * 根据给定的 widgetName 和 newFilePath,更新指定在 QGraphicsView 中的光标图像部件的图标。 + * + * @param widgetName 部件名称 + * @param newFilePath 新的文件路径 + */ void CursorImageWidget::updateIcon(const QString& widgetName, const QString& newFilePath) { QGraphicsScene* scene = graphicsView->scene(); @@ -300,7 +329,13 @@ void CursorImageWidget::setIconMap(QMap *iconmap) m_iconMap = iconmap; } - +/** + * @brief 构造函数 + * + * 创建一个 CursorEditWidget 对象。 + * + * @param parent 父对象指针 + */ CursorEditWidget::CursorEditWidget(QWidget *parent) { @@ -342,6 +377,13 @@ CursorCustomLabel::CursorCustomLabel(QWidget *parent): QLabel(parent), pixmap() this->setFixedSize(48,48); } +/** + * @brief 绘制事件 + * + * 当需要绘制标签时,调用此函数。 + * + * @param event QPaintEvent 对象指针,表示绘制事件 + */ void CursorCustomLabel::paintEvent(QPaintEvent *event) { QLabel::paintEvent(event); // 调用父类的 paintEvent 函数,绘制文本 diff --git a/src/module/cursorthemewidget.cpp b/src/module/cursorthemewidget.cpp index e173c2c..2a29130 100644 --- a/src/module/cursorthemewidget.cpp +++ b/src/module/cursorthemewidget.cpp @@ -35,6 +35,11 @@ void CursorThemeWidget::eidtInitWidget(const HistoryInfo &InfoData) updateCustomPathMap(m_historytimeiconpathmap,"timecursor"); } +/** + * @brief 初始化预览小部件 + * + * 创建一个新的预览小部件,并对其进行初始化。 + */ void CursorThemeWidget::initPreviewWidget() { m_previewwidget = new QWidget(this); @@ -64,6 +69,15 @@ void CursorThemeWidget::initPreviewWidget() m_previewlayout->addItem(spacer2); } +/** + * @brief 从目录中的文件获取小部件名称列表 + * + * 从指定的目录中获取所有文件的名称,并返回包含小部件名称的字符串列表。 + * + * @param directoryPath 目录路径 + * + * @return 小部件名称列表 + */ QStringList CursorThemeWidget::getWidgetNamesFromFilesInDirectory(const QString& directoryPath) { QStringList widgetNames; QDir dir(directoryPath); @@ -78,6 +92,11 @@ QStringList CursorThemeWidget::getWidgetNamesFromFilesInDirectory(const QString& return widgetNames; } +/** + * @brief 刷新光标主题控件 + * + * 刷新光标主题控件,更新预览控件的图标映射和自定义路径映射。 + */ void CursorThemeWidget::refresh() { m_preview->updateIconMap(getResourcesAppIconMap("cursor")); @@ -86,6 +105,15 @@ void CursorThemeWidget::refresh() updateCustomPathMap(m_timeiconpathmap,"timecursor"); } +/** + * @brief 获取资源应用程序图标映射 + * + * 根据指定的类型获取资源应用程序图标映射。 + * + * @param Type 类型 + * + * @return 返回 QMap 指针,指向图标映射 + */ QMap *CursorThemeWidget::getResourcesAppIconMap(QString Type) { if("cursor" == Type){ @@ -112,6 +140,11 @@ QMap *CursorThemeWidget::getResourcesAppIconMap(QString Type) } +/** + * @brief 初始化Map + * + * 初始化Map数据,包括获取光标相关资源和应用图标映射。 + */ void CursorThemeWidget::initMaps() { getResourcesAppIconMap("cursor"); @@ -119,6 +152,11 @@ void CursorThemeWidget::initMaps() m_pathWidgetMap = new QMap; } +/** + * @brief 初始化时间映射 + * + * 初始化时间映射,包括获取资源应用程序图标映射和自定义图标路径映射。 + */ void CursorThemeWidget::initTimeMaps() { getResourcesAppIconMap("timecursor"); @@ -126,6 +164,9 @@ void CursorThemeWidget::initTimeMaps() m_timepathWidgetMap = new QMap; } +/** + * @brief 初始化右侧小部件 + */ void CursorThemeWidget::initRightWidget() { m_rightwidget = new QWidget(this); @@ -175,25 +216,41 @@ void CursorThemeWidget::initRightWidget() }); + // 遍历sortedList1中的每个元素,创建一个CursorEditWidget对象,并将其添加到主布局中 for (const auto& pair : sortedList1) { const QString& widgetName = pair.first; const QString& filePath = pair.second; + // 创建一个CursorEditWidget对象,并将其设置为viewportWidget的子控件 CursorEditWidget* widget = new CursorEditWidget(viewportWidget); + // 设置widget的默认图标为filePath指定的文件路径 widget->setdefaulticon(filePath); + // 将widget添加到主布局中 mainLayout->addWidget(widget); + // 将widget插入到m_pathWidgetMap中,以便后续可以通过widgetName找到对应的widget m_pathWidgetMap->insert(widgetName, widget); + connect(widget->m_addiconbutton, &QPushButton::clicked, this, [=]() { + // 通过sender()获取发送信号的对象,将其强制转换为QPushButton指针类型 QPushButton* clickedButton = qobject_cast(sender()); + // 如果获取的对象是合法的QPushButton对象 if (clickedButton) { + // 通过clickedButton的parentWidget()获取widget对象,并将其强制转换为CursorEditWidget指针类型 CursorEditWidget* clickedWidget = qobject_cast(clickedButton->parentWidget()); + // 如果获取的对象是合法的CursorEditWidget对象 if (clickedWidget) { + // 弹出文件选择对话框,让用户选择一个SVG文件 QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select SVG file"), "", tr("SVG file (*.svg)")); + // 如果用户选择了文件,且文件路径不为空 if (!newFilePath.isEmpty()) { + // 将widgetName和newFilePath插入到m_customiconpathmap中,以便后续可以通过widgetName找到自定义图标路径 m_customiconpathmap->insert(widgetName, newFilePath); + // 调用m_preview的updateIcon函数,更新预览图标 m_preview->updateIcon(widgetName, newFilePath); + // 设置widget的自定义图标为newFilePath指定的文件路径 clickedWidget->setcustomicon(newFilePath); + // 发出newCursorMap信号,通知其他部分更新图标映射 emit newCursorMap(m_customiconpathmap); g_themeChange = true; } else { @@ -214,19 +271,32 @@ void CursorThemeWidget::initRightWidget() m_timepathWidgetMap->insert(widgetName, widget); connect(widget->m_addiconbutton, &QPushButton::clicked, this, [=]() { + // 获取发送信号的按钮对象 QPushButton* clickedButton = qobject_cast(sender()); + // 判断获取的按钮对象是否为空,如果不为空,则继续执行下面的代码 if (clickedButton) { + // 通过按钮对象的parentWidget获取其父窗口对象,假设该父窗口对象为CursorEditWidget CursorEditWidget* clickedWidget = qobject_cast(clickedButton->parentWidget()); + // 判断获取的CursorEditWidget对象是否为空,如果不为空,则继续执行下面的代码 if (clickedWidget) { + // 使用QFileDialog::getOpenFileName函数打开一个文件选择对话框,选择一个SVG文件 QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select SVG file"), "", tr("SVG file (*.svg)")); + // 判断选择的文件路径是否为空,如果不为空,则执行下面的代码 if (!newFilePath.isEmpty()) { + + // 将选择的文件路径插入到m_timecustomiconpathmap中,假设widgetName为键 m_timecustomiconpathmap->insert(widgetName, newFilePath); + + // 更新m_preview2的对应图标 m_preview2->updateIcon(widgetName, newFilePath); + + // 设置clickedWidget的自定义图标 clickedWidget->setcustomicon(newFilePath); + + // 发出一个新的时间光标映射信号,假设m_timecustomiconpathmap为数据源 emit newTimeCursorMap(m_timecustomiconpathmap); g_themeChange = true; } - } } }); @@ -237,6 +307,13 @@ void CursorThemeWidget::initRightWidget() m_rightwidget->setLayout(mainWidgetLayout); } +/** + * @brief 设置历史光标 + * + * 根据给定的类型设置历史光标的主题。 + * + * @param type 光标类型 + */ void CursorThemeWidget::setHistoryCursor(QString type) { if("cursor" == type){ @@ -249,8 +326,11 @@ void CursorThemeWidget::setHistoryCursor(QString type) m_historyiconpathmap = new QMap; foreach (const QString& fileName, fileList) { - QString filePath = directoryPath + fileName; // 使用文件名构建文件路径 + // 使用文件名构建文件路径 + QString filePath = directoryPath + fileName; + // 获取文件名(不包括扩展名) QString name = fileName.left(fileName.lastIndexOf('.')); + // 将文件名和文件路径插入到历史图标路径映射表中 m_historyiconpathmap->insert(name, filePath); } } else if ("timecursor" == type){ @@ -263,14 +343,25 @@ void CursorThemeWidget::setHistoryCursor(QString type) m_historytimeiconpathmap = new QMap; foreach (const QString& fileName, fileList) { + // 使用文件名构建文件路径 QString filePath = directoryPath + fileName; // 使用文件名构建文件路径 + // 获取文件名(不包括扩展名) QString name = fileName.left(fileName.lastIndexOf('.')); + // 将文件名和文件路径插入到 map 中 m_historytimeiconpathmap->insert(name, filePath); } } } +/** + * @brief 更新自定义路径映射 + * + * 根据给定的历史映射和类型,更新自定义路径映射。 + * + * @param historyMap 历史映射指针 + * @param type 类型 + */ void CursorThemeWidget::updateCustomPathMap(QMap *historyMap, QString type) { if("cursor" == type){ diff --git a/src/module/globalthemefeature.cpp b/src/module/globalthemefeature.cpp index 4a5c325..b9cbb8d 100644 --- a/src/module/globalthemefeature.cpp +++ b/src/module/globalthemefeature.cpp @@ -5,87 +5,178 @@ #include #include +/** + * @brief CustomGraphicsView 构造函数 + * + * 创建一个 CustomGraphicsView 对象,并设置相应的参数。 + * + * @param scene QGraphicsScene 对象指针 + */ CustomGraphicsView::CustomGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene) { + // 设置视图跟随鼠标的变换锚点 setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + // 设置拖拽模式为手滚动模式 setDragMode(QGraphicsView::ScrollHandDrag); + // 设置抗锯齿渲染提示,开启抗锯齿 setRenderHint(QPainter::Antialiasing, true); + // 设置优化标志,不调整抗锯齿优化和保存画家的状态 setOptimizationFlags(QGraphicsView::DontAdjustForAntialiasing | QGraphicsView::DontSavePainterState); + // 设置背景色为透明 this->setStyleSheet("background-color: transparent;"); + // 设置水平滚动条始终隐藏 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + // 设置垂直滚动条始终隐藏 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); } +/** + * @brief 滚轮事件 + * + * 当触发滚轮事件时,如果按下 Ctrl 键,则执行缩放操作。根据滚轮滚动的距离计算缩放倍数,并限制最大缩放倍数为 1.1 倍。 + * 如果未按下 Ctrl 键,则调用父类的滚轮事件处理函数。 + * + * @param event 滚轮事件指针 + */ void CustomGraphicsView::wheelEvent(QWheelEvent* event) { + // 判断是否按下了控制键 if (QGuiApplication::keyboardModifiers() == Qt::ControlModifier) { + // 根据滚轮的滚动距离计算缩放因子 qreal scaleFactor = std::pow(qreal(2), event->delta() / 240.0); - qreal currentScale = transform().m11(); // 获取当前的缩放倍数 + // 获取当前的缩放倍数 + qreal currentScale = transform().m11(); // 限制最大为1.1倍 + // 计算目标缩放倍数 qreal targetScale = currentScale * scaleFactor; if (targetScale > 1.1) { + // 如果目标缩放倍数大于1.1,则缩小到1.1倍 scaleFactor = 1.1 / currentScale; }else if (targetScale < 0.3) { + // 如果目标缩放倍数小于0.3,则放大到0.3倍 scaleFactor = 0.3 / currentScale; } + // 执行缩放操作 scale(scaleFactor, scaleFactor); } else { + // 如果不是控制键,则调用QGraphicsView的滚轮事件处理方法 QGraphicsView::wheelEvent(event); } } +/** + * @brief 更新全局图像小部件的半径 + * + * 根据滑块的值更新全局图像小部件的半径。 + * + * @param sliderValue 滑块的值 + */ void GlobalImageWidget::updateWidgetRadius(int sliderValue) { + // 将滑块的值赋给半径变量 int radius = sliderValue; + // 将半径值设置给显示控件 m_showwidget->setRadius(radius); + // 更新显示控件的显示 m_showwidget->update(); } +/** + * @brief 更新按钮颜色 + * + * 根据给定的颜色更新按钮的颜色。 + * + * @param color 要更新的按钮颜色 + */ void GlobalImageWidget::updateButtonColor(const QColor& color) { + // 获取m_showbtn的调色板 QPalette palette = m_showbtn->palette(); + // 设置调色板中的按钮颜色为传入的color palette.setColor(QPalette::Button, color); + // 将修改后的调色板应用到m_showbtn m_showbtn->setPalette(palette); + // 更新m_showbtn的显示 m_showbtn->update(); } +/** + * @brief 更新小部件的背景颜色 + * + * 根据给定的颜色更新小部件的背景颜色。 + * + * @param color 背景颜色 + */ void GlobalImageWidget::updateWidgetBackgroundColor(const QColor& color) { + // 设置显示小部件的背景颜色 m_showwidget->setBackgroundColor(color); } +/** + * @brief 更新覆盖图像 + * + * 根据指定的覆盖图像路径,更新全局图像小部件的覆盖图像。 + * + * @param overlayImagePath 覆盖图像路径 + */ void GlobalImageWidget::updateOverlayImage(const QString& overlayImagePath) { + // 加载叠加图像 QPixmap overlayImage(overlayImagePath); + + // 如果叠加图像不为空 if (!overlayImage.isNull()) { + // 创建一个与原图像大小相同的透明图像 m_mergedImage = QPixmap(m_image.size()); m_mergedImage.fill(Qt::transparent); + // 创建一个画板,将原图像画到新的合并图像上 QPainter painter(&m_mergedImage); painter.drawPixmap(0, 0, m_image); + + // 计算叠加图像的位置,使其居中显示 int x = (m_image.width() - overlayImage.width()) / 2; int y = m_image.height() - overlayImage.height(); painter.drawPixmap(x, y, overlayImage); painter.end(); + // 将原代理窗口删除,并清空场景 QGraphicsProxyWidget* newproxy = m_proxy; m_scene->removeItem(m_proxy); m_scene->clear(); + + // 将合并后的图像添加到场景中,并设置场景大小为合并图像的大小 m_scene->addPixmap(m_mergedImage); m_scene->setSceneRect(m_mergedImage.rect()); + + // 调整视图大小,保持长宽比不变 graphicsView->fitInView(m_scene->sceneRect(), Qt::KeepAspectRatio); + // 将原代理窗口重新添加到场景中 m_scene->addItem(newproxy); } else { qDebug() << "Failed to load overlay image."; } } +/** + * @brief 更新比例尺 + * + * 根据当前图像的大小和缩放级别,更新比例尺并重新设置视图。 + */ void GlobalImageWidget::updatescale() { + // 重置视图变换 graphicsView->resetTransform(); + + // 定义中心点坐标为(1500, 600) QPointF centerPoint(1500, 600); + + // 将视图中心定位到中心点 graphicsView->centerOn(centerPoint); + + // 缩放视图,缩放比例为1:1,即不进行缩放 graphicsView->scale(1, 1); } @@ -97,17 +188,42 @@ void GlobalImageWidget::updatescale1() graphicsView->scale(0.3, 0.3); } +/** + * @brief 更新控件半径 + * + * 根据给定的值更新控件的半径。 + * + * @param Value 半径值 + */ void GlobalImageWidget::updateControlRadius(int Value) { + // 设置显示按钮的半径 m_showbtn->setRadius(Value); } +/** + * @brief 更新透明度 + * + * 根据指定的透明度值更新图像小部件的透明度。 + * + * @param transparency 透明度值 + */ void GlobalImageWidget::updateTransparency(int transparency) { + // 设置m_showwidget的透明度为传入的参数transparency m_showwidget->setTransparency(transparency); + // 更新m_showwidget的显示 m_showwidget->update(); } +/** + * @brief GlobalImageWidget构造函数 + * + * 创建一个GlobalImageWidget对象 + * + * @param parent 父QWidget对象 + * @param coverFilePath 封面文件路径 + */ GlobalImageWidget::GlobalImageWidget(QWidget *parent, const QString& coverFilePath) : QWidget(parent), m_coverFilePath(coverFilePath) { @@ -184,6 +300,14 @@ GlobalImageWidget::GlobalImageWidget(QWidget *parent, const QString& coverFilePa // m_showwidget->setGraphicsEffect(blurEffect); } +/** + * @brief 全局主题功能构造函数 + * + * 通过给定的封面文件路径创建一个全局图像部件,并将其添加到全局主题功能中。 + * + * @param parent 父部件指针 + * @param coverFilePath 封面文件路径 + */ Globalthemefeature::Globalthemefeature(QWidget *parent, const QString& coverFilePath) : QWidget(parent) { GlobalImageWidget* globalImageWidget = new GlobalImageWidget(this, coverFilePath); @@ -216,15 +340,27 @@ void RoundedWidget::setBackgroundColor(const QColor &color) // update(); } +/** + * @brief 绘制事件 + * + * 当需要进行绘制时,会调用该函数。 + * + * @param event 绘制事件指针 + */ void RoundedWidget::paintEvent(QPaintEvent *event) { - + // 创建QPainter对象,用于绘制图形 QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing, true); // 开启抗锯齿 + // 开启抗锯齿绘制 + painter.setRenderHint(QPainter::Antialiasing, true); + // 获取控件的内容矩形,并根据边框宽度进行调整 QRectF rect = contentsRect().adjusted(borderWidth, borderWidth, -borderWidth, -borderWidth); - int r = std::min(rect.width(), rect.height()) / 2; // 计算圆角半径 - int actualRadius = std::min(m_radius, r); // 取实际圆角半径和计算半径的较小值 + // 计算圆角半径 + int r = std::min(rect.width(), rect.height()) / 2; + // 取实际圆角半径和计算半径的较小值 + int actualRadius = std::min(m_radius, r); + // 设置背景色的透明度 backgroundColor.setAlphaF(m_transparency); // 绘制背景 @@ -232,13 +368,19 @@ void RoundedWidget::paintEvent(QPaintEvent *event) painter.setBrush(backgroundColor); painter.drawRoundedRect(rect, actualRadius, actualRadius); - // 绘制边框 +// // 绘制边框 // painter.setPen(QPen(borderColor, borderWidth)); // painter.setBrush(Qt::NoBrush); // painter.drawRoundedRect(rect, actualRadius, actualRadius); - } +/** + * @brief RoundedButton 构造函数 + * + * 创建一个 RoundedButton 对象,并将其初始化为 QPushButton 类型。 + * + * @param parent 父对象指针 + */ RoundedButton::RoundedButton(QWidget *parent): QPushButton(parent) { setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); @@ -247,12 +389,26 @@ RoundedButton::RoundedButton(QWidget *parent): QPushButton(parent) setFocusPolicy(Qt::NoFocus); } +/** + * @brief 设置圆角半径 + * + * 设置圆角按钮的半径。 + * + * @param radius 半径值 + */ void RoundedButton::setRadius(int radius) { m_radius = radius; update(); } +/** + * @brief 绘制事件处理函数 + * + * 在绘制事件发生时,执行绘制操作。 + * + * @param event 绘制事件指针 + */ void RoundedButton::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); diff --git a/src/module/globalthemewidget.cpp b/src/module/globalthemewidget.cpp index 482cefc..225848c 100644 --- a/src/module/globalthemewidget.cpp +++ b/src/module/globalthemewidget.cpp @@ -2,6 +2,13 @@ #include "../fileProcess/filecheck.h" bool GlobalThemeWidget::g_themeChange; +/** + * @brief 构造函数 + * + * 创建一个 GlobalThemeWidget 对象,并设置父窗口。 + * + * @param parent 父窗口指针 + */ GlobalThemeWidget::GlobalThemeWidget(QWidget *parent) : QWidget(parent) { initPreviewWidget(); @@ -12,11 +19,25 @@ GlobalThemeWidget::GlobalThemeWidget(QWidget *parent) : QWidget(parent) this->setLayout(m_globalthemelayout); } +/** + * @brief 获取壁纸路径 + * + * 返回壁纸的路径。 + * + * @return 壁纸路径 + */ QString GlobalThemeWidget::getWallpaperPath() { return m_wallpaperpath; } +/** + * @brief 初始化小部件 + * + * 根据给定的历史信息编辑小部件的初始化。 + * + * @param InfoData 历史信息 + */ void GlobalThemeWidget::eidtInitWidget(const HistoryInfo &InfoData) { m_info = InfoData; @@ -30,6 +51,11 @@ void GlobalThemeWidget::eidtInitWidget(const HistoryInfo &InfoData) // this->update(); } +/** + * @brief 刷新全局主题界面 + * + * 刷新全局主题界面,更新设置项。 + */ void GlobalThemeWidget::refresh() { @@ -42,6 +68,12 @@ void GlobalThemeWidget::refresh() m_preview->updatescale1(); } +/** + * @brief 初始化预览小部件 + * + * 创建一个新的 QWidget 作为预览小部件,并设置其大小和背景颜色。 + * 预览小部件用于展示壁纸的预览图。 + */ void GlobalThemeWidget::initPreviewWidget() { m_previewwidget = new QWidget(this); @@ -60,6 +92,11 @@ void GlobalThemeWidget::initPreviewWidget() m_previewwidget->setLayout(m_previewlayout); } +/** + * @brief 初始化右侧小部件 + * + * 初始化右侧小部件,包括滚动区域、视口小部件、各个主题设置小部件等。 + */ void GlobalThemeWidget::initRightWidget() { m_rightwidget = new QWidget(this); @@ -107,6 +144,11 @@ void GlobalThemeWidget::initRightWidget() } +/** + * @brief 初始化CoverWidget + * + * 初始化CoverWidget控件,并设置相关属性。 + */ void GlobalThemeWidget::initCoverWidget() { m_coverwidget = new QWidget(m_viewportwidget); @@ -139,12 +181,13 @@ void GlobalThemeWidget::initCoverWidget() connect(m_coverbtn, &QPushButton::clicked, this, [=]() { QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select picture file"), "", tr("Picture file (*.png *.jpg)")); - bool legalFile = FileCheck::isLegalWallPaperFile(newFilePath,"cover"); - - if (newFilePath.isEmpty() || !legalFile) { + if (newFilePath.isEmpty()) { newFilePath = m_coverpath; + }else{ + if(!FileCheck::isLegalWallPaperFile(newFilePath,"cover")){ + newFilePath = m_coverpath; + } } - m_coverpath = newFilePath; m_coverbtn->setIcon(QIcon(m_coverpath)); m_coverbtn->setIconSize(m_coverbtn->size()); @@ -160,6 +203,11 @@ void GlobalThemeWidget::initCoverWidget() } +/** + * @brief 初始化桌面壁纸小部件 + * + * 初始化桌面壁纸小部件,并设置相关属性。 + */ void GlobalThemeWidget::initWallPaperWidget() { m_wallpaperwidget = new QWidget(m_viewportwidget); @@ -187,15 +235,17 @@ void GlobalThemeWidget::initWallPaperWidget() connect(wallpaperbtn, &QPushButton::clicked, this, [=]() { QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select picture file"), "", tr("Picture file (*.png *.jpg)")); - if (!newFilePath.isEmpty() && FileCheck::isLegalWallPaperFile(newFilePath,"wallpaper")) { - updateWallpaperFilePath(newFilePath); - emit wallpaperupdate(newFilePath); - emit newWallpaperFilePath(newFilePath); + if (!newFilePath.isEmpty()) { + if(FileCheck::isLegalWallPaperFile(newFilePath,"wallpaper")){ + updateWallpaperFilePath(newFilePath); + emit wallpaperupdate(newFilePath); + emit newWallpaperFilePath(newFilePath); - QPixmap pixmap(newFilePath); - wallpaperbtn->setIcon(QIcon(pixmap)); - wallpaperbtn->setIconSize(wallpaperbtn->size()); - g_themeChange = true; + QPixmap pixmap(newFilePath); + wallpaperbtn->setIcon(QIcon(pixmap)); + wallpaperbtn->setIconSize(wallpaperbtn->size()); + g_themeChange = true; + } } else { qDebug() << "Selected file path:" << newFilePath; updateWallpaperFilePath(m_wallpaperpath); @@ -208,6 +258,15 @@ void GlobalThemeWidget::initWallPaperWidget() m_wallpaperwidget->setLayout(layout); } +/** + * @brief 初始化外观小部件 + * + * 创建一个新的 QWidget,并设置其固定高度为 65。 + * 创建一个 QLabel,设置其宽度与小部件相同,并设置文本为 "Window appearance"。 + * 创建一个 QHBoxLayout,并添加 QLabel 和 QComboBox 到布局中。 + * 设置 QComboBox 的项目,包括 "light" 和 "dark" 两个选项,分别对应白色和黑色。 + * 连接 QComboBox 的 currentIndexChanged 信号到槽函数,当选项改变时更新预览小部件的背景颜色和覆盖图像,并发送 newExterior 信号。 + */ void GlobalThemeWidget::initExteriorWidget() { m_exteriorwidget = new QWidget(m_viewportwidget); @@ -244,6 +303,11 @@ void GlobalThemeWidget::initExteriorWidget() m_exteriorwidget->setLayout(layout); } +/** + * @brief 初始化圆角控件小部件 + * + * 初始化圆角控件小部件,并设置相关属性和布局。 + */ void GlobalThemeWidget::initFilletWidget() { m_filletwidget = new QWidget(m_viewportwidget); @@ -286,6 +350,11 @@ void GlobalThemeWidget::initFilletWidget() m_filletwidget->setLayout(layout); } +/** + * @brief 初始化强调色控件 + * + * 初始化强调色控件,并设置相应的布局和功能。 + */ void GlobalThemeWidget::initAccentColorWidget() { m_accentcolorwidget = new QWidget(m_viewportwidget); @@ -322,6 +391,16 @@ void GlobalThemeWidget::initAccentColorWidget() m_accentcolorwidget->setLayout(layout); } +/** + * @brief 初始化透明度控件 + * + * 创建一个QWidget作为透明度控件,并设置其固定高度。 + * 创建一个水平布局,添加标题标签和透明度滑块。 + * 设置滑块的相关属性,包括方向、固定宽度、范围、单步长、刻度间隔和固定宽度,并设置初始值为65。 + * 创建一个显示按钮,并设置其大小和文本。 + * 连接滑块的值变化信号与更新透明度的槽函数。 + * 设置透明度控件的布局。 + */ void GlobalThemeWidget::initTransparencyWidget() { m_transparencywidget = new QWidget(m_viewportwidget); @@ -357,6 +436,17 @@ void GlobalThemeWidget::initTransparencyWidget() m_transparencywidget->setLayout(layout); } +/** + * @brief 初始化窗户圆角控件 + * + * 创建一个新的 QWidget,并将其设置为视口小部件的父小部件。 + * 设置透明度小部件的固定高度为 65。 + * 创建一个水平布局并添加标签和下拉框。 + * 下拉框包含 "Large"、"Medium" 和 "Small" 三项,分别对应 12、6 和 0 的整数值。 + * 将下拉框的当前选项设置为 "Medium",并连接下拉框的 currentIndexChanged 信号。 + * 当选项改变时,更新预览小部件的缩放比例,并更新控件的半径。 + * 发出新窗口半径信号,其中包含选定的半径大小。 + */ void GlobalThemeWidget::initWindowFilletWidget() { m_windowfilletwidget = new QWidget(m_viewportwidget); @@ -370,11 +460,13 @@ void GlobalThemeWidget::initWindowFilletWidget() m_filletcombobox->addItem(tr("Small"), int(0)); m_filletcombobox->setCurrentIndex(1); connect(m_filletcombobox, QOverload::of(&QComboBox::currentIndexChanged), this, [=](int index){ - + // 获取当前选项对应的圆角大小值 int selectedSize = m_filletcombobox->itemData(index).value(); + // 更新预览部件的缩放比例 m_preview->updatescale(); + // 更新预览部件的圆角大小 m_preview->updateWidgetRadius(selectedSize); - + // 发出新的窗口圆角大小信号 emit newWindowRadius(selectedSize); g_themeChange = true; }); @@ -383,6 +475,13 @@ void GlobalThemeWidget::initWindowFilletWidget() m_windowfilletwidget->setLayout(layout); } +/** + * @brief 更新壁纸文件路径 + * + * 根据传入的封面文件路径更新壁纸文件路径。 + * + * @param coverFilePath 封面文件路径 + */ void GlobalThemeWidget::updateWallpaperFilePath(const QString& coverFilePath) { m_wallpaperpath = coverFilePath; @@ -401,6 +500,11 @@ void GlobalThemeWidget::updateWallpaperFilePath(const QString& coverFilePath) { } } +/** + * @brief 添加间距项 + * + * 在全局主题小部件中添加间距项。 + */ void GlobalThemeWidget::addspaceritem() { QSpacerItem *spacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -413,11 +517,25 @@ void GlobalThemeWidget::addspaceritem() m_previewlayout->addItem(spacer2); } +/** + * @brief 设置圆角设置 + * + * 将指定的圆角值设置到控件中。 + * + * @param radius 圆角值 + */ void GlobalThemeWidget::setRadiusSetting(int radius) { m_filletslider->setValue(radius); } +/** + * @brief 设置强调色 + * + * 设置全局主题小部件的强调色。 + * + * @param accentcolor 强调色的字符串表示形式 + */ void GlobalThemeWidget::setAccentColor(QString accentcolor) { QColor color; @@ -429,21 +547,50 @@ void GlobalThemeWidget::setAccentColor(QString accentcolor) } } +/** + * @brief 设置透明度 + * + * 设置全局主题小部件的透明度。 + * + * @param transparency 透明度值 + */ void GlobalThemeWidget::setTransparency(int transparency) { + // 设置透明度滑块的当前值 m_transparencyslider->setValue(transparency); } +/** + * @brief 设置封面 + * + * 设置封面按钮的图标为封面路径对应的图标。 + * + * @param coverpath 封面路径 + */ void GlobalThemeWidget::setCover(QString coverpath) { m_coverbtn->setIcon(QIcon(coverpath)); } +/** + * @brief 设置壁纸 + * + * 设置壁纸按钮的图标为壁纸路径对应的图标。 + * + * @param wallpaperpath 壁纸路径 + */ void GlobalThemeWidget::setWallpaper(QString wallpaperpath) { wallpaperbtn->setIcon(QIcon(wallpaperpath)); } +/** + * @brief 设置窗口半径 + * + * 根据给定的窗口半径,设置控件的圆角程度。 + * + * @param windowradius 窗口半径 + */ void GlobalThemeWidget::setWindowRadius(int windowradius) { QMap radiusIndexMap; diff --git a/src/module/grubthemefeature.cpp b/src/module/grubthemefeature.cpp index 4d878cc..534513c 100644 --- a/src/module/grubthemefeature.cpp +++ b/src/module/grubthemefeature.cpp @@ -36,6 +36,13 @@ void GrubGraphicsView::wheelEvent(QWheelEvent *event) } } +/** + * @brief GrubImageWidget 构造函数 + * + * 创建一个 GrubImageWidget 对象。 + * + * @param parent 父对象 + */ GrubImageWidget::GrubImageWidget(QWidget *parent) { m_scene = new QGraphicsScene(this); @@ -83,6 +90,13 @@ GrubImageWidget::GrubImageWidget(QWidget *parent) graphicsView->scale(initialScale, initialScale); } +/** + * @brief 更新背景图片 + * + * 根据给定的图片路径,加载新的背景图片并更新界面显示。 + * + * @param imagePath 图片路径 + */ void GrubImageWidget::updateBackground(const QString &imagePath) { // 加载新的背景图片 diff --git a/src/module/grubthemewidget.cpp b/src/module/grubthemewidget.cpp index faf5117..ee4bec4 100644 --- a/src/module/grubthemewidget.cpp +++ b/src/module/grubthemewidget.cpp @@ -3,6 +3,13 @@ #include bool GrubThemeWidget::g_themeChange; +/** + * @brief GrubThemeWidget 构造函数 + * + * 创建一个 GrubThemeWidget 对象。 + * + * @param parent 父对象 + */ GrubThemeWidget::GrubThemeWidget(QWidget *parent) : QWidget(parent) { initPreviewWidget(); @@ -13,6 +20,18 @@ GrubThemeWidget::GrubThemeWidget(QWidget *parent) : QWidget(parent) this->setLayout(globalthemelayout); } +/** + * @brief 初始化预览小部件 + * + * 创建一个新的QWidget作为预览小部件,并设置其最小大小。 + * 设置预览小部件的背景角色为QPalette::Window。 + * 设置预览小部件的背景颜色为"#F5F5F5"。 + * 设置预览小部件自动填充背景。 + * 创建一个新的GrubImageWidget作为预览图像小部件。 + * 创建一个新的QVBoxLayout作为预览小部件的布局。 + * 添加一个空项。 + * 设置预览小部件的布局。 + */ void GrubThemeWidget::initPreviewWidget() { m_previewwidget = new QWidget(this); @@ -33,6 +52,14 @@ void GrubThemeWidget::initPreviewWidget() m_previewwidget->setLayout(m_previewlayout); } +/** + * @brief 初始化右侧小部件 + * + * 创建一个新的 QWidget,并将其设置为当前对象的成员变量 m_rightwidget。 + * 设置最小大小为 400x620,最大宽度为 400。 + * 设置背景角色为 QPalette::Base。 + * 调用 initEditWidget() 函数初始化编辑小部件。 + */ void GrubThemeWidget::initRightWidget() { m_rightwidget = new QWidget(this); @@ -42,6 +69,16 @@ void GrubThemeWidget::initRightWidget() initEditWidget(); } +/** + * @brief 初始化编辑小部件 + * + * 创建一个新的 QWidget,设置固定高度,并添加垂直布局。 + * 创建两个 QLabel 和一个 QPushButton,并将它们添加到布局中。 + * 创建 QHBoxLayout,将 QPushButton 和 QLabel 添加到布局中。 + * 连接 QPushButton 的 clicked 信号,当点击按钮时,打开文件对话框选择图片文件。 + * 如果选择的文件合法,则更新背景预览并设置 QPushButton 的图标。 + * 发出 newGrubFilePath 信号以更新新的 Grub 文件路径。 + */ void GrubThemeWidget::initEditWidget() { m_grubwidget = new QWidget(m_rightwidget); @@ -60,23 +97,29 @@ void GrubThemeWidget::initEditWidget() tipLabel1->setText("尺寸:3840*2160
大小:不超过 10 MB
格式:PNG"); connect(showBtn, &QPushButton::clicked, this, [=]() { + // 弹出文件选择对话框,选择图片文件 QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select picture file"), "", tr("Picture file (*.png *.jpg)")); - if (!newFilePath.isEmpty()/* && FileCheck::isLegalWallPaperFile(newFilePath,"wallpaper")*/) { - - m_preview->updateBackground(newFilePath); - QPixmap pixmap(newFilePath); - showBtn->setIcon(QIcon(pixmap)); - showBtn->setIconSize(showBtn->size()); - emit newGrubFilePath(newFilePath); - g_themeChange = true; + // 如果选择的文件路径不为空 + if (!newFilePath.isEmpty()) { + // 判断选择的文件是否是合法的壁纸文件 + if(FileCheck::isLegalWallPaperFile(newFilePath,"wallpaper")){ + // 更新背景预览 + m_preview->updateBackground(newFilePath); + // 加载图片文件并创建一个QPixmap对象 + QPixmap pixmap(newFilePath); + // 设置按钮的图标为加载的图片文件对应的图标,并设置图标大小为按钮的大小 + showBtn->setIcon(QIcon(pixmap)); + showBtn->setIconSize(showBtn->size()); + // 发出新的Grub文件路径信号 + emit newGrubFilePath(newFilePath); + g_themeChange = true; + } } else { qDebug() << "Selected file path:" << newFilePath; } }); - - widgetLayout->addWidget(showBtn); widgetLayout->addWidget(tipLabel1); grubWidget->setLayout(widgetLayout); diff --git a/src/module/historywidget.cpp b/src/module/historywidget.cpp index e299e0d..0cefc2e 100644 --- a/src/module/historywidget.cpp +++ b/src/module/historywidget.cpp @@ -2,6 +2,13 @@ #include "../fileProcess/historyinfoload.h" #include "../fileProcess/diroperation.h" +/** + * @brief 历史记录窗口 + * + * 历史记录窗口类的构造函数,用于初始化历史记录窗口。 + * + * @param parent 父窗口指针 + */ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) { QVBoxLayout *alllayout = new QVBoxLayout(); @@ -72,6 +79,13 @@ HistoryWidget::HistoryWidget(QWidget *parent) : QWidget(parent) this->setLayout(alllayout); } +/** + * @brief 历史记录窗口 + * + * 历史记录窗口类的构造函数,用于初始化历史记录窗口。 + * + * @param parent 父窗口指针 + */ void HistoryWidget::updateHistoryDir() { QDir builderDir = QDir(QDir::homePath() + "/.cache/theme-build/"); @@ -136,6 +150,13 @@ void HistoryWidget::updateHistoryDir() } } +/** + * @brief 历史按钮构造函数 + * + * 创建一个历史按钮的构造函数。 + * + * @param parent 父窗口指针 + */ HistoryButton::HistoryButton(QWidget* parent): QPushButton(parent) { // this->setBackgroundRole(QPalette::Base); @@ -163,6 +184,11 @@ void HistoryButton::setThemeType(const QString &themeType) m_themetype = themeType; } +/** + * @brief 初始化 UI + * + * 初始化 HistoryButton 的 UI。 + */ void HistoryButton::initUI() { QVBoxLayout* layout = new QVBoxLayout(this); diff --git a/src/module/iconthemewidget.cpp b/src/module/iconthemewidget.cpp index 8458278..d97033c 100644 --- a/src/module/iconthemewidget.cpp +++ b/src/module/iconthemewidget.cpp @@ -1,5 +1,13 @@ #include "iconthemewidget.h" +/** + * @brief 构造函数 + * + * 用于创建 IconThemeWidget 实例的构造函数。 + * + * @param isHistory 是否为历史图标主题 + * @param parent 父 QWidget + */ IconThemeWidget::IconThemeWidget(bool isHistory, QWidget *parent) : QWidget(parent) { initMaps(); @@ -14,6 +22,16 @@ IconThemeWidget::IconThemeWidget(bool isHistory, QWidget *parent) : QWidget(pare this->setLayout(m_iconthemelayout); } +/** + * @brief 初始化预览小部件 + * + * 创建一个QWidget作为预览小部件,并设置其最小大小、背景颜色等属性。 + * 创建一个QStackedWidget作为图片预览的容器。 + * 创建两个ImageWidget分别用于显示自定义图标和系统图标,并更新图标路径映射。 + * 将两个ImageWidget添加到QStackedWidget中。 + * 将QStackedWidget添加到布局中。 + * 连接壁纸更新信号,当壁纸更新时,更新预览小部件的图片。 + */ void IconThemeWidget::initPreviewWidget() { m_previewwidget = new QWidget(this); @@ -48,6 +66,11 @@ void IconThemeWidget::initPreviewWidget() m_previewwidget->setLayout(layout); } +/** + * @brief 初始化编辑小部件 + * + * 初始化编辑小部件,并创建相应的控件和布局。 + */ void IconThemeWidget::initEditWidget() { @@ -102,6 +125,14 @@ void IconThemeWidget::initEditWidget() m_editwidget->setLayout(mainWidgetLayout); } +/** + * @brief 更新自定义图标路径映射 + * + * 清空现有的 m_customiconpathmap,将 historyMap 中的数据复制到 m_customiconpathmap, + * 并更新相应的图标和预览。 + * + * @param historyMap 自定义图标路径历史的 QMap 指针 + */ void IconThemeWidget::updateCustomIconPathMap(QMap*historyMap) { // 清空现有的 m_customiconpathmap @@ -133,6 +164,13 @@ void IconThemeWidget::updateCustomIconPathMap(QMap*historyMap) } } +/** + * @brief 更新自定义系统图标路径映射 + * + * 根据给定的历史图标路径映射,更新自定义系统图标路径映射。 + * + * @param historyMap 历史图标路径映射指针 + */ void IconThemeWidget::updateCustomSyetemIconPathMap(QMap*historyMap) { m_systemcustomiconpathmap->clear(); @@ -160,6 +198,12 @@ void IconThemeWidget::updateCustomSyetemIconPathMap(QMap*histo } } } + +/** + * @brief 初始化系统编辑控件 + * + * 初始化系统编辑控件,并创建相应的子控件。 + */ void IconThemeWidget::initSystemEditWidget() { m_systemeditwidget = new QWidget(m_stackedwidget); @@ -182,29 +226,44 @@ void IconThemeWidget::initSystemEditWidget() m_systempathWidgetMap->insert(widgetName, widget); + // 当widget中的"添加图标"按钮被点击时,执行下面的函数。 connect(widget->m_addiconbutton, &QPushButton::clicked, this, [=]() { + // 获取发出信号的按钮,并将其转换为QPushButton*类型。 QPushButton* clickedButton = qobject_cast(sender()); + // 检查转换是否成功。如果成功,继续执行下面的代码。 if (clickedButton) { + // 定义一个IconEditWidget类型的指针变量,并将其初始化为nullptr。 IconEditWidget* clickedWidget = nullptr; + // 获取点击的按钮的父窗口,并将其作为QWidget类型保存。 QWidget *widget = clickedButton->parentWidget(); + + // 循环遍历父窗口,直到找到一个窗口是IconEditWidget类型的窗口。 while (widget && !widget->inherits("IconEditWidget")) { widget = widget->parentWidget(); } + // 将QWidget类型转换为IconEditWidget类型,并将结果保存到clickedWidget变量中。 clickedWidget = qobject_cast(widget); + // 检查转换是否成功。如果成功,继续执行下面的代码。 if (clickedWidget) { - + + // 显示一个文件选择对话框,让用户选择一个SVG文件。将文件路径保存到newFilePath变量中。 QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select SVG file"), "", tr("SVG file (*.svg)")); if (!newFilePath.isEmpty()) { //check if(FileCheck::isLegalIconFile(newFilePath)){ + // 将新的文件路径插入到m_systemcustomiconpathmap中,键为widgetName。 m_systemcustomiconpathmap->insert(widgetName, newFilePath); + // 设置clickedWidget的自定义图标为新的文件路径。 clickedWidget->setcustomicon(newFilePath); - + + // 输出选择的文件路径和对应的widgetName。 qDebug() << "Selected file path:" << newFilePath<< "Corresponding widgetName:" << widgetName; + // 更新系统预览图标的显示。 m_systempreview->updateIcon(widgetName, newFilePath); } } + // 发出一个新的系统图标映射信号。 emit newSystemIconsMap(m_systemcustomiconpathmap); } } @@ -216,6 +275,15 @@ void IconThemeWidget::initSystemEditWidget() m_systemeditwidget->setLayout(mainWidgetLayout); } +/** + * @brief 从目录中获取文件列表的widget名称 + * + * 从指定的目录中获取文件列表,并返回包含文件名称的widget名称列表。 + * + * @param directoryPath 目录路径 + * + * @return widget名称列表 + */ QStringList IconThemeWidget::getWidgetNamesFromFilesInDirectory(const QString& directoryPath) { QStringList widgetNames; QDir dir(directoryPath); @@ -230,6 +298,11 @@ QStringList IconThemeWidget::getWidgetNamesFromFilesInDirectory(const QString& d return widgetNames; } +/** + * @brief 初始化应用程序图标地图 + * + * 初始化应用程序图标地图。 + */ void IconThemeWidget::initMaps() { getResourcesAppIconMap("appicon"); @@ -238,6 +311,15 @@ void IconThemeWidget::initMaps() m_pathWidgetMap = new QMap; } +/** + * @brief 获取资源应用程序图标映射 + * + * 根据给定的类型获取资源应用程序图标映射。 + * + * @param Type 图标类型 + * + * @return 返回 QMap 指针,指向应用程序图标映射 + */ QMap *IconThemeWidget::getResourcesAppIconMap(QString Type) { if("appicon" == Type){ @@ -266,6 +348,11 @@ QMap *IconThemeWidget::getResourcesAppIconMap(QString Type) } +/** + * @brief 初始化系统图标主题 + * + * 初始化系统图标主题,包括获取系统应用图标映射和系统自定义图标路径映射,并创建新的 QMap 对象用于存储图标编辑小部件。 + */ void IconThemeWidget::initSystemMaps() { //解决历史记录三次之后第单数历史记录窗出现段错误 @@ -275,6 +362,11 @@ void IconThemeWidget::initSystemMaps() m_systempathWidgetMap = new QMap; } +/** + * @brief 初始化右侧小部件 + * + * 初始化右侧的子小部件,包括更换图标按钮、编辑图标和系统图标编辑页面以及堆叠式控件。 + */ void IconThemeWidget::initRightWidget() { m_rightwidget = new QWidget(this); @@ -330,18 +422,37 @@ void IconThemeWidget::initRightWidget() m_rightwidget->setLayout(m_rightwidgetlayout); } +/** + * @brief 获取应用图标的 QMap 对象 + * + * 返回一个 QMap 对象,该对象包含了应用图标的键值对。 + * 用于刷新 + * @return 应用图标的 QMap 对象指针 + */ QMap* IconThemeWidget::getAppIconsMap() { getResourcesAppIconMap("icon"); return m_iconpathmap; } +/** + * @brief 获取系统图标映射表 + * + * 获取系统图标映射表,返回一个 QMap 对象,其中键为图标名称,值为图标路径。 + * 用于刷新 + * @return 系统图标映射表 + */ QMap *IconThemeWidget::getSystemIconsMap() { getResourcesAppIconMap("systemicon"); return m_systemiconpathmap; } +/** + * @brief 设置应用图标的浏览历史记录 + * + * 根据指定的目录路径,浏览并加载该目录下所有的应用图标文件,并将它们保存到浏览历史记录中。 + */ void IconThemeWidget::setHistoryAppIcon() { QString directoryPath = m_info.filepath + "/src/iconTheme/appicon/"; @@ -361,6 +472,11 @@ void IconThemeWidget::setHistoryAppIcon() } } +/** + * @brief 设置历史系统图标 + * + * 从指定路径加载系统图标,并存储在历史系统图标映射中。 + */ void IconThemeWidget::setHistorySystemIcon() { QString directoryPath = m_info.filepath + "/src/iconTheme/systemicon/"; @@ -378,7 +494,13 @@ void IconThemeWidget::setHistorySystemIcon() m_historysystemiconmap->insert(name, filePath); } } - +/** + * @brief 初始化小部件 + * + * 使用给定的历史信息数据初始化小部件。 + * + * @param InfoData 历史信息数据对象 + */ void IconThemeWidget::eidtInitWidget(const HistoryInfo &InfoData) { m_info = InfoData; @@ -390,6 +512,11 @@ void IconThemeWidget::eidtInitWidget(const HistoryInfo &InfoData) updateCustomSyetemIconPathMap(m_historysystemiconmap); } +/** + * @brief 刷新图标主题部件 + * + * 更新图标主题部件的预览图标映射和自定义图标路径映射。 + */ void IconThemeWidget::refresh() { m_preview->updateIconMap(getResourcesAppIconMap("appicon")); diff --git a/src/module/iconwidgetfeature.cpp b/src/module/iconwidgetfeature.cpp index 51b75ce..b42fe8f 100644 --- a/src/module/iconwidgetfeature.cpp +++ b/src/module/iconwidgetfeature.cpp @@ -1,4 +1,4 @@ -#include "iconwidgetfeature.h" +#include "iconwidgetfeature.h" MainInterFaceFeature::MainInterFaceFeature(QWidget *parent) : QWidget(parent) { @@ -9,6 +9,13 @@ TypeButton::TypeButton(QWidget *parent): QPushButton(parent) setCheckable(true); } +/** + * @brief 绘制事件 + * + * 当按钮被绘制时调用此函数。 + * + * @param event 绘制事件指针 + */ void TypeButton::paintEvent(QPaintEvent *event) { QPushButton::paintEvent(event); @@ -22,8 +29,13 @@ void TypeButton::paintEvent(QPaintEvent *event) } } - - +/** + * @brief 构造函数 + * + * 创建一个 QGraphicsView 实例,并设置相关参数。 + * + * @param scene QGraphicsScene 对象指针,用于显示在视图中的场景 + */ IconGraphicsView::IconGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene) { setTransformationAnchor(QGraphicsView::AnchorUnderMouse); @@ -36,6 +48,13 @@ IconGraphicsView::IconGraphicsView(QGraphicsScene* scene) : QGraphicsView(scene) setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); } +/** + * @brief 滚轮事件 + * + * 当发生滚轮事件时,该函数将被调用。如果按下控制键,则通过缩放视图来处理滚轮事件;否则,将滚轮事件传递给基类 QGraphicsView 处理。 + * + * @param event 滚轮事件指针 + */ void IconGraphicsView::wheelEvent(QWheelEvent* event) { // if (QGuiApplication::keyboardModifiers() == Qt::ControlModifier) { @@ -64,6 +83,14 @@ void IconGraphicsView::wheelEvent(QWheelEvent* event) } bool ImageWidget::g_themeChange; +/** + * @brief ImageWidget构造函数 + * + * ImageWidget的构造函数,用于初始化ImageWidget对象。 + * + * @param parent QWidget对象指针,指向ImageWidget的父窗口 + * @param iconMap QMap对象指针,用于存储图标与路径的对应关系 + */ ImageWidget::ImageWidget(QWidget *parent, const QMap* iconMap) : QWidget(parent), m_iconMap(iconMap) { @@ -77,7 +104,10 @@ ImageWidget::ImageWidget(QWidget *parent, const QMap* iconMap) setLayout(layout); + // 获取图标映射表的大小 int count = m_iconMap->size(); + + // 如果图标映射表的大小等于11,加载特定的背景图片并添加到场景中 if(count == 11){ image = new QPixmap(":/resource/background/controlcenter-light.png"); if (image->isNull()) { @@ -89,75 +119,107 @@ ImageWidget::ImageWidget(QWidget *parent, const QMap* iconMap) qDebug() << "Failed to load image."; } } + // 将场景添加到视图,并设置视图显示的场景 scene->addPixmap(*image); graphicsView->setScene(scene); + // 根据视图的大小调整场景的大小,保持宽高比不变 graphicsView->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); + // 显示视图 graphicsView->show(); - + // 如果图标映射表的大小等于11,则进行特定的图片加载和添加操作 if (count == 11) { - + // 获取图标映射表的所有键值对 QList keys = m_iconMap->keys(); + // 根据特定的顺序创建键值的数组 QString positions[11] = { keys[0], keys[9], keys[4], keys[5], keys[6], keys[3], keys[10], keys[8], keys[1], keys[7], keys[2] }; - + // 定义图片的位置数组 int posX[3] = { 208, 879, 1550 }; int posY[4] = { 275, 535, 795, 1055 }; int index = 0; - + // 遍历位置数组,加载并添加图片到场景中 for (int i = 0; i < 4; ++i) { for (int j = 0; j < 3; ++j) { + // 检查索引是否超出范围 if (index >= 11) { break; // 处理超出索引范围的情况 } - + // 根据键值获取图片路径,并加载图片 QString pixmapPath = m_iconMap->value(positions[index]); QPixmap pixmap(pixmapPath); QGraphicsPixmapItem* item = scene->addPixmap(pixmap.scaled(100, 100)); + // 设置图形的可选择和可聚焦属性,以触发选择和焦点事件 item->setFlag(QGraphicsItem::ItemIsSelectable); // 启用选择事件 item->setFlag(QGraphicsItem::ItemIsFocusable); // 启用焦点事件 + // 将键值和图片路径保存到图形的数据中,以便后续使用 item->setData(0, keys[index]); item->setData(1, pixmapPath); + // 设置图形的位置 item->setPos(posX[j], posY[i]); - + // 增加索引的值,准备处理下一个图片的加载和添加操作 ++index; } } - } - else{ - int columnCount = 10; - int row = 1; - int col = 2; - for (auto it = m_iconMap->begin(); it != m_iconMap->end(); ++it) { - const QString& widgetName = it.key(); + }else{ // 如果图标映射表的大小不等于11,则进行常规的图片加载和添加操作 + // 定义列数和行数,以及初始的列和行索引值 + int columnCount = 10; + int row = 1; + int col = 2; + // 遍历图标映射表的所有键值对,加载并添加图片到场景中 + for (auto it = m_iconMap->begin(); it != m_iconMap->end(); ++it) { + const QString& widgetName = it.key(); // 获取键值对应的名称,用于后续数据的保存和处理中用到此处名称的部分。 + // 获取当前迭代器it的值 const QString& filePath = it.value(); + // 根据文件路径加载QPixmap对象,这将加载文件并创建一个QPixmap对象 QPixmap pixmap(filePath); + + // 判断图片是否成功加载,如果QPixmap对象为空,说明加载失败 if (!pixmap.isNull()) { + // 如果图片加载成功,则将图片添加到QGraphicsScene中,并按照128x128的尺寸进行缩放 QGraphicsPixmapItem* item = scene->addPixmap(pixmap.scaled(128, 128)); - item->setFlag(QGraphicsItem::ItemIsSelectable); // 启用选择事件 - item->setFlag(QGraphicsItem::ItemIsFocusable); // 启用焦点事件 + + // 设置该项可以被选择,即响应用户的点击选择事件 + item->setFlag(QGraphicsItem::ItemIsSelectable); + + // 设置该项在场景中的位置 item->setPos(col * 160, row * 160); item->setScale(1.0); - item->setData(0, widgetName); - item->setData(1, filePath); + + // 为该项设置一些自定义的数据,这些数据可以通过调用QGraphicsItem::data方法来获取 + item->setData(0, widgetName); // 将widgetName数据保存到该项的第一个数据槽中 + item->setData(1, filePath); // 将filePath数据保存到该项的第二个数据槽中 + qDebug()<<"widgetName"<= columnCount) { - col = 2; - row++; + col = 2; // 重新开始列计数器,但这次从第二列开始计数 + row++; // 增加一行计数器 + } else { + qDebug() << "Failed to load image:" << filePath; } - } else { - qDebug() << "Failed to load image:" << filePath; } } - } // 设置初始缩放倍数为0.9倍 qreal initialScale = 0.9; graphicsView->scale(initialScale, initialScale); + } } + +/** + * @brief 更新图标映射 + * + * 更新图标映射,并重新布局图标。 + * + * @param newIconMap 新的图标映射 + */ void ImageWidget::updateIconMap(const QMap* newIconMap) { m_iconMap = newIconMap; @@ -244,49 +306,79 @@ void ImageWidget::updateIconMap(const QMap* newIconMap) graphicsView->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); } +/** + * @brief 更新图像 + * + * 根据给定的图像路径更新图像。 + * + * @param imagePath 图像路径 + */ void ImageWidget::updateImage(const QString& imagePath) { + // 如果已经有图片存在,则删除并置空 if (image != nullptr) { delete image; image = nullptr; } + + // 根据给定的路径加载图片 image = new QPixmap(imagePath); if (image->isNull()) { qDebug() << "Failed to load image."; } + // 获取图形视图的对象,并清空场景中的内容 QGraphicsScene* scene = graphicsView->scene(); scene->clear(); + // 在场景中添加图片 scene->addPixmap(*image); + + // 定义列数和初始行列位置 int columnCount = 10; int row = 1; int col = 2; - for (auto it = m_iconMap->begin(); it != m_iconMap->end(); ++it) { - const QString& widgetName = it.key(); - const QString& filePath = it.value(); + // 遍历图标映射表,逐个添加图标到场景中 + for (auto it = m_iconMap->begin(); it != m_iconMap->end(); ++it) { + const QString& widgetName = it.key(); // 获取键值对应的widgetName + const QString& filePath = it.value(); // 获取键值对应的文件路径 + + // 根据文件路径加载图标 QPixmap pixmap(filePath); if (!pixmap.isNull()) { + // 缩放图标大小为128x128,并添加到场景中 QGraphicsPixmapItem* item = scene->addPixmap(pixmap.scaled(128, 128)); - item->setPos(col * 160, row * 160); - item->setScale(1.0); - item->setData(0, widgetName); - item->setData(1, filePath); + // 设置图标的初始位置和缩放比例,并将widgetName和文件路径保存到图标的数据中 + item->setPos(col * 160, row * 160); + item->setScale(1.0); + item->setData(0, widgetName); + item->setData(1, filePath); - col++; - if (col >= columnCount) { - col = 2; - row++; - } - } else { + // 更新列的位置,如果超过列数则重新开始行,行数加1 + col++; + if (col >= columnCount) { + col = 2; + row++; + } + } else { qDebug() << "Failed to load image:" << filePath; } } + + // 根据场景的边界自适应视图大小,保持视图比例不变 graphicsView->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); } +/** + * @brief 更新图标 + * + * 根据给定的 widgetName 和 newFilePath,更新图标。 + * + * @param widgetName 控件名称 + * @param newFilePath 新的文件路径 + */ void ImageWidget::updateIcon(const QString& widgetName, const QString& newFilePath) { QGraphicsScene* scene = graphicsView->scene(); @@ -298,26 +390,40 @@ void ImageWidget::updateIcon(const QString& widgetName, const QString& newFilePa << "Position:" << item->pos() << "Type:" << item->type(); } + // 遍历所有的图形项 for (QGraphicsItem* item : items) { + // 尝试将当前图形项转换为图形位图项 QGraphicsPixmapItem* pixmapItem = dynamic_cast(item); - qDebug()<data(0).toString() == widgetName) { - qDebug()<<"!!!!!sss!!!!!!"; + // 保存图形位图项的旧位置 QPointF oldPosition = pixmapItem->pos(); + // 从场景中移除图形位图项 scene->removeItem(pixmapItem); + // 删除图形位图项 delete pixmapItem; + // 加载新的位图(从newFilePath路径) QPixmap newPixmap(newFilePath); + // 如果新的位图不为空 if (!newPixmap.isNull()) { + // 如果widgetName包含"kylin-setting"字符串 if(widgetName.contains("kylin-setting")){ + // 添加新的位图(缩放为100x100)到场景中,并设置数据(索引为0为widgetName, 索引为1为newFilePath) QGraphicsPixmapItem* newPixmapItem = scene->addPixmap(newPixmap.scaled(100, 100)); newPixmapItem->setData(0, widgetName); newPixmapItem->setData(1, newFilePath); + // 设置新的位图的位置为旧位置 newPixmapItem->setPos(oldPosition); }else{ - QGraphicsPixmapItem* newPixmapItem = scene->addPixmap(newPixmap.scaled(128, 128)); - newPixmapItem->setData(0, widgetName); - newPixmapItem->setData(1, newFilePath); - newPixmapItem->setPos(oldPosition); + // 添加新的位图(缩放为128x128)到场景中,并设置数据(索引为0为widgetName, 索引为1为newFilePath) + QGraphicsPixmapItem* newPixmapItem = scene->addPixmap(newPixmap.scaled(128, 128)); + newPixmapItem->setData(0, widgetName); + newPixmapItem->setData(1, newFilePath); + // 设置新的位图的位置为旧位置 + newPixmapItem->setPos(oldPosition); + } + }else { + qDebug() << "Failed to load image:" << newFilePath; } g_themeChange = true; } else { @@ -328,6 +434,13 @@ void ImageWidget::updateIcon(const QString& widgetName, const QString& newFilePa } } +/** + * @brief 构造函数 + * + * 创建一个图标编辑器部件,作为父窗口的子部件进行显示。 + * + * @param parent 父窗口指针 + */ IconEditWidget::IconEditWidget(QWidget *parent) { QVBoxLayout *widgetLayout = new QVBoxLayout(this); @@ -369,28 +482,62 @@ IconEditWidget::IconEditWidget(QWidget *parent) } +/** + * @brief 设置默认图标 + * + * 设置默认图标的函数,通过传入图标名称来设置默认图标。 + * + * @param iconname 图标名称 + */ void IconEditWidget::setdefaulticon(QString iconname) { m_icondefaultlabel->setPixmap(QIcon::fromTheme(iconname).pixmap(48,48)); } +/** + * @brief 设置默认图标名称 + * + * 设置默认图标名称,将标签的文本更新为指定的图标名称。 + * + * @param iconname 图标名称 + */ void IconEditWidget::setdefaulticonname(QString iconname) { m_label->setText(iconname); } +/** + * @brief 设置自定义图标 + * + * 通过指定的图标文件路径设置自定义图标。 + * + * @param iconFilePath 图标文件路径 + */ void IconEditWidget::setcustomicon(QString iconFilePath) { QPixmap pixmap(iconFilePath); m_icondecustomlabel->setPixmap(pixmap.scaled(48, 48)); } - +/** + * @brief 构造函数 + * + * 创建一个 CustomLabel 对象,并设置父对象。 + * + * @param parent 父对象指针 + */ CustomLabel::CustomLabel(QWidget *parent): QLabel(parent), pixmap() { this->setFixedSize(48,48); } +/** + * @brief 自定义标签的绘制事件 + * + * 在绘制事件发生时,执行标签的绘制操作。 + * + * @param event 绘制事件指针 + */ void CustomLabel::paintEvent(QPaintEvent *event) { QLabel::paintEvent(event); @@ -414,6 +561,13 @@ void CustomLabel::paintEvent(QPaintEvent *event) } } +/** + * @brief 设置 QPixmap + * + * 设置 CustomLabel 的 QPixmap。 + * + * @param pixmap QPixmap 对象 + */ void CustomLabel::setPixmap(const QPixmap &pixmap) { this->pixmap = pixmap; diff --git a/src/module/plymouththemefeature.cpp b/src/module/plymouththemefeature.cpp index 1291a1c..2258407 100644 --- a/src/module/plymouththemefeature.cpp +++ b/src/module/plymouththemefeature.cpp @@ -12,6 +12,13 @@ PlymouthThemeFeature::PlymouthThemeFeature(QWidget *parent) : QWidget(parent) } +/** + * @brief PlymouthImageWidget 构造函数 + * + * 创建一个 PlymouthImageWidget 对象,并将其设置为给定父对象的子对象。 + * + * @param parent 父对象指针 + */ PlymouthImageWidget::PlymouthImageWidget(QWidget *parent) { scene = new QGraphicsScene(this); @@ -37,6 +44,13 @@ PlymouthImageWidget::PlymouthImageWidget(QWidget *parent) graphicsView->scale(initialScale, initialScale); } +/** + * @brief 更新 Plymouth 图像 + * + * 根据给定的图像路径更新 Plymouth 图像。 + * + * @param imagePath 图像路径 + */ void PlymouthImageWidget::updatePlymouth(const QString &imagePath) { scene->clear(); // 清空当前场景 @@ -71,6 +85,11 @@ void PlymouthImageWidget::updatePlymouth(const QString &imagePath) graphicsView->fitInView(scene->sceneRect(), Qt::KeepAspectRatio); // 调整视图以适应新内容 } +/** + * @brief 显示 Plymouth 图像 + * + * 通过定时器,依次显示 pixmaps 中的图像,形成动画效果。 + */ PlymouthGraphicsView::PlymouthGraphicsView(QGraphicsScene *scene) { setTransformationAnchor(QGraphicsView::AnchorUnderMouse); diff --git a/src/module/plymouththemewidget.cpp b/src/module/plymouththemewidget.cpp index b939b92..ba29080 100644 --- a/src/module/plymouththemewidget.cpp +++ b/src/module/plymouththemewidget.cpp @@ -1,6 +1,13 @@ #include "plymouththemewidget.h" bool PlymouthThemeWidget::g_themeChange; +/** + * @brief PlymouthThemeWidget 构造函数 + * + * 创建一个 PlymouthThemeWidget 对象,并设置其父对象。 + * + * @param parent 父对象 + */ PlymouthThemeWidget::PlymouthThemeWidget(QWidget *parent) : QWidget(parent) { initPreviewWidget(); @@ -11,6 +18,15 @@ PlymouthThemeWidget::PlymouthThemeWidget(QWidget *parent) : QWidget(parent) this->setLayout(globalthemelayout); } +/** + * @brief 初始化预览小部件 + * + * 创建一个新的 QWidget 作为预览小部件,并设置其最小大小。 + * 设置预览小部件的背景角色为 QPalette::Window。 + * 设置预览小部件的调色板,并开启自动填充背景。 + * 创建一个新的 PlymouthImageWidget,并将其添加到预览小部件的垂直布局中。 + * 添加一个空隙项,并设置预览小部件的布局。 + */ void PlymouthThemeWidget::initPreviewWidget() { m_previewwidget = new QWidget(this); @@ -31,6 +47,12 @@ void PlymouthThemeWidget::initPreviewWidget() m_previewwidget->setLayout(m_previewlayout); } +/** + * @brief 初始化右侧小部件 + * + * 创建一个新的QWidget对象作为右侧小部件,并设置其最小和最大尺寸,以及背景色。 + * 之后初始化编辑小部件。 + */ void PlymouthThemeWidget::initRightWidget() { m_rightwidget = new QWidget(this); @@ -40,6 +62,11 @@ void PlymouthThemeWidget::initRightWidget() initEditWidget(); } +/** + * @brief 初始化编辑小部件 + * + * 初始化编辑小部件,包括设置固定高度、创建布局、添加控件等。 + */ void PlymouthThemeWidget::initEditWidget() { m_plymouthwidget = new QWidget(m_rightwidget); @@ -70,7 +97,7 @@ void PlymouthThemeWidget::initEditWidget() addButton->setIcon(QIcon::fromTheme("list-add-symbolic")); addButton->setFixedSize(36,36); connect(addButton, &QPushButton::clicked, this, [=]() { - QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select SVG file"), "", tr("SVG file (*.svg *.png *.gif *.mp4)")); + QString newFilePath = QFileDialog::getOpenFileName(this, tr("Select MP4 file"), "", tr("MP4 file (*.svg *.png *.gif *.mp4)")); if (!newFilePath.isEmpty()) { QPixmap pixmap(newFilePath); pixmap = pixmap.scaled(64,64, Qt::KeepAspectRatio); diff --git a/src/titlebar.cpp b/src/titlebar.cpp index 19732df..f2bcdf6 100644 --- a/src/titlebar.cpp +++ b/src/titlebar.cpp @@ -1,5 +1,12 @@ #include "titlebar.h" +/** + * @brief TitleBar类的构造函数 + * + * TitleBar类的构造函数,用于创建一个带有标题栏的窗口。 + * + * @param parent 父窗口指针 + */ TitleBar::TitleBar(QWidget *parent) : QWidget(parent) { m_ismaximized = false; @@ -79,17 +86,31 @@ TitleBar::TitleBar(QWidget *parent) : QWidget(parent) layout->addLayout(buttonLayout); } + +/** + * @brief 切换最大化状态 + * + * 如果当前窗口不是最大化状态,则将其最大化,并更新相应的按钮图标。 + * 如果当前窗口已经是最大化状态,则将其恢复为正常状态,并更新相应的按钮图标。 + */ void TitleBar::toggleMaximize() { + // 如果当前窗口不是最大化状态 if (!m_ismaximized) { + // 显示最大化窗口 parentWidget()->parentWidget()->showMaximized(); + // 设置状态为已最大化 m_ismaximized = true; + // 设置最大化按钮的图标为还原图标 m_maximumbtn->setIcon(QIcon::fromTheme("window-restore-symbolic")); + // 如果当前窗口已经是最大化状态 } else { + // 显示普通窗口 parentWidget()->parentWidget()->showNormal(); + // 设置状态为未最大化 m_ismaximized = false; + // 设置最大化按钮的图标为最大化图标 m_maximumbtn->setIcon(QIcon::fromTheme("window-maximize-symbolic")); - } } diff --git a/translation/themebuilder_en_US.ts b/translation/themebuilder_en_US.ts index 7167f57..6dba30d 100644 --- a/translation/themebuilder_en_US.ts +++ b/translation/themebuilder_en_US.ts @@ -4,12 +4,14 @@ CursorThemeWidget - + + Select SVG file - + + SVG file (*.svg) @@ -48,87 +50,125 @@ GlobalThemeWidget - + Overall theme rendering - - + + Select picture file - - + + Picture file (*.png *.jpg) - + Desktop wallpaper - + Window appearance - + light - + dark - + Control fillet - + Accent colour - + daybreakBlue - + jamPurple - + magenta - + sunRed - + sunsetOrange - + dustGold - + polarGreen + + + Window transparency + + + + + Window fillet + + + + + Large + + + + + Medium + + + + + Small + + + + + GrubThemeWidget + + + Select picture file + + + + + Picture file (*.png *.jpg) + + HistoryWidget @@ -146,24 +186,24 @@ IconThemeWidget - - + + Select SVG file - - + + SVG file (*.svg) - + APP - + System setting @@ -207,11 +247,14 @@ + + Input format error! + Input is empty! @@ -219,32 +262,32 @@ MainInterface - + GlobalTheme - + IconTheme - + CursorTheme - + PlymouthTheme - + GrubTheme - + Start Building @@ -252,33 +295,76 @@ MainWindow - + kylin-theme-builder - + User guide - + Global Theme - + + Topics include basic styles for windows and controls, icons, cursors, and more! + + + + Icon Theme - + + The icon theme includes multiple application icons and system settings homepage icons. + + + + Cursor Theme - - Boot Theme + + Cursor theme for pointer cursor icon + + + + + Plymouth Theme + + + + + Boot animation can be customized to boot screen effect + + + + + GRUB Theme + + + + + Modify GURB background wallpaper + + + + + PlymouthThemeWidget + + + Select MP4 file + + + + + MP4 file (*.svg *.png *.gif *.mp4) diff --git a/translation/themebuilder_zh_CN.qm b/translation/themebuilder_zh_CN.qm index d5f4a03..cbf4281 100644 Binary files a/translation/themebuilder_zh_CN.qm and b/translation/themebuilder_zh_CN.qm differ diff --git a/translation/themebuilder_zh_CN.ts b/translation/themebuilder_zh_CN.ts index 235bdb3..e1552c1 100644 --- a/translation/themebuilder_zh_CN.ts +++ b/translation/themebuilder_zh_CN.ts @@ -4,12 +4,14 @@ CursorThemeWidget - + + Select SVG file 选择SVG文件 - + + SVG file (*.svg) SVG 文件 (*.svg) @@ -48,87 +50,125 @@ GlobalThemeWidget - + Overall theme rendering 全局主题效果图 - - + + Select picture file 选择图片文件 - - + + Picture file (*.png *.jpg) 图片文件 (*.png *.jpg) - + Desktop wallpaper 桌面壁纸 - + Window appearance 窗口外观 - + light 浅色 - + dark 深色 - + Control fillet 控件圆角 - + Accent colour 强调色 - + daybreakBlue 拂晓蓝 - + jamPurple 果酱紫 - + magenta 玫瑰红 - + sunRed 烈日红 - + sunsetOrange 日暮橙 - + dustGold 薄雾金 - + polarGreen 极光绿 + + + Window transparency + 窗口透明度 + + + + Window fillet + 窗口圆角 + + + + Large + + + + + Medium + + + + + Small + + + + + GrubThemeWidget + + + Select picture file + 选择图片文件 + + + + Picture file (*.png *.jpg) + 图片文件 (*.png *.jpg) + HistoryWidget @@ -146,24 +186,24 @@ IconThemeWidget - - + + Select SVG file 选择SVG文件 - - + + SVG file (*.svg) SVG 文件 (*.svg) - + APP APP - + System setting 系统设置 @@ -207,11 +247,14 @@ + + Input format error! 输入格式错误! + Input is empty! 输入为空! @@ -219,32 +262,32 @@ MainInterface - + GlobalTheme 全局样式 - + IconTheme 图标主题 - + CursorTheme 光标主题 - + PlymouthTheme 开机动画 - + GrubTheme 启动个性化 - + Start Building 制作全局主题 @@ -252,34 +295,89 @@ MainWindow - + kylin-theme-builder 主题打包工具 - + User guide 使用指南 - + Global Theme 全局主题 - + + Topics include basic styles for windows and controls, icons, cursors, and more! + 主题包含窗口与控件基础样式、图标、光标等内容 + + + Icon Theme 图标主题 - + + The icon theme includes multiple application icons and system settings homepage icons. + 图标主题包含系统自带多个应用图标和系统设置首页图标 + + + Cursor Theme 光标主题 - + + Cursor theme for pointer cursor icon + 光标主题为指针光标图标 + + + + Plymouth Theme + 开机动画 + + + + Boot animation can be customized to boot screen effect + 开机动画可以自定义开机界面效果 + + + + GRUB Theme + GRUB背景 + + + + Modify GURB background wallpaper + 修改GURB背景壁纸 + + Boot Theme - 启动个性化 + 启动个性化 + + + + PlymouthThemeWidget + + Select SVG file + 选择SVG文件 + + + SVG file (*.svg *.png *.gif *.mp4) + 图片文件 (*.svg *.png *.gif *.mp4) + + + + Select MP4 file + 选择MP4文件 + + + + MP4 file (*.svg *.png *.gif *.mp4) + 选择MP4文件(*.mp4)