Compare commits
39 Commits
Author | SHA1 | Date | |
---|---|---|---|
bed4c66530 | |||
f4f8ffc863 | |||
1bf535577e | |||
738099d572 | |||
ac661e4b45 | |||
5c99fc9290 | |||
b5436b506f | |||
0520a006d0 | |||
19392d919c | |||
ebe3473d15 | |||
ee34925def | |||
86759a1bc5 | |||
86f7263b91 | |||
19e4ec2930 | |||
30372e2c32 | |||
bd275486a6 | |||
9cd85d98cf | |||
4c320183d1 | |||
5080fed7a9 | |||
b92e5c6c32 | |||
30f6169dd0 | |||
89d14e7e96 | |||
a569f6b63c | |||
c4ebe15b79 | |||
6661048433 | |||
20130363fb | |||
90c04767ad | |||
3c88cc03f8 | |||
bd51419f52 | |||
a3c5b9fc87 | |||
1bd4bad1cd | |||
3c1b2ae424 | |||
fed4a8edef | |||
cbb7510d99 | |||
aee6385e10 | |||
27bd1114cd | |||
d737cfed91 | |||
79ae58c1fe | |||
1a8bfe79db |
.github/workflows
.gitignoreAptSources
Donate
README.mdResource.qrcaboutwindow.cppaboutwindow.haboutwindow.uiadd-lib-to-kernel-manager.shaptpkginfo.cppaptpkginfo.hdata
debian
gxde-kernel-manager.desktopgxde-kernel-manager.proicon
kernelinformation.cppkernelinformation.hkernelinformationdialog.cppkernelinformationdialog.hkernelinformationdialog.uikernelinstaller.cppkernelinstaller.hkernelinstaller.uimain.cppmainwindow.cppmainwindow.hmainwindow.uiprograminfo.cppprograminfo.hshell
kernel-installer-reconfigure-template.shkernel-installer-template.shkernel-installer-update-template.shkernel-installer-upgrade-template.sh
translation
13
.github/workflows/program-builder.yml
vendored
Normal file
13
.github/workflows/program-builder.yml
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
name: Building Program
|
||||
run-name: Building ${{ GITHUB.REPOSITORY }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
tags:
|
||||
- "*"
|
||||
|
||||
jobs:
|
||||
call:
|
||||
uses: GXDE-OS/GXDE/.github/workflows/building-deb.yml@master
|
||||
secrets: inherit
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -70,3 +70,5 @@ CMakeLists.txt.user*
|
||||
*.dll
|
||||
*.exe
|
||||
|
||||
# Visual Studio Code
|
||||
.vscode
|
||||
|
@ -1 +1,3 @@
|
||||
deb [trusted=true] https://kernel.gxde.gfdgdxi.top/ ./
|
||||
deb [trusted=true] https://master.dl.sourceforge.net/project/gxde-kernel-manager/kernel/ ./
|
||||
# CN Mirror
|
||||
#deb [trusted=true] http://gfdgdxi.v5.idcfengye.com/gxde-linux-kernel/ ./
|
||||
|
BIN
Donate/Alipay.jpg
Normal file
BIN
Donate/Alipay.jpg
Normal file
Binary file not shown.
After ![]() (image error) Size: 270 KiB |
BIN
Donate/QQ.png
Normal file
BIN
Donate/QQ.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 66 KiB |
BIN
Donate/Wechat.png
Normal file
BIN
Donate/Wechat.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 76 KiB |
BIN
Donate/advertisement0.jpg
Normal file
BIN
Donate/advertisement0.jpg
Normal file
Binary file not shown.
After ![]() (image error) Size: 338 KiB |
73
README.md
73
README.md
@ -1,14 +1,72 @@
|
||||
<p width=100px align="center"><img width=40% src="icon/icon.svg"></p>
|
||||
<h1 align="center">GXDE 内核管理器 1.0.0</h1>
|
||||
<p width=100px align="center"><img width=40% src="icon/gxde-kernel-manager.svg"></p>
|
||||
<h1 align="center">GXDE 内核管理器 1.1.1</h1>
|
||||
<hr>
|
||||
<a href='https://gitee.com/GXDE-OS/gxde-kernel-manager/stargazers'><img src='https://gitee.com/GXDE-OS/gxde-kernel-manager/badge/star.svg?theme=dark' alt='star'></img></a>
|
||||
<a href='https://gitee.com/GXDE-OS/gxde-kernel-manager/members'><img src='https://gitee.com/GXDE-OS/gxde-kernel-manager/badge/fork.svg?theme=dark' alt='fork'></img></a>
|
||||
|
||||
## 国产的 arm CPU(如飞腾、鲲鹏、麒麟) 不要随意更换内核,否则会因为更换内核导致兼容性问题甚至无法启动
|
||||
|
||||
## 介绍
|
||||
GXDE 内核管理器是一个帮助用户更方便获取、安装、移除内核的工具。
|
||||
目前支持 amd64、arm64、mips64 和 loong64 四个架构
|
||||
***警告:请不要随意操作内核除非你知道你在做什么!***
|
||||
QQ 群:881201853
|
||||
|
||||
GXDE Kernel Manager is a kernel manager allows users to install or remove kernels easily.
|
||||
Support architectures: amd64, arm64, mips64, loong64
|
||||
**Warning: You may damage your system unless you know what you will do!**
|
||||
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
## GXDE 系统如何安装 GXDE 内核管理器?
|
||||
只适用于 GXDE,deepin/UOS 等需要下载 deb 手动安装
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install gxde-kernel-manager
|
||||
```
|
||||
|
||||
## 更新内容
|
||||
### 1.1.1(2024.06.29)
|
||||
**※1、新增内核详细信息窗口**
|
||||
**※2、修复在部分机器上安装内核直接提示错误 1 的问题**
|
||||
|
||||
**※1. Add an information window about the Kernel**
|
||||
**※2. Fix the issue with the installed Kernel causing exit code 1**
|
||||
|
||||
### 1.1.0(2024.05.12)
|
||||
**※1、支持从 apt 源读取内核数据并显示安装**
|
||||
**※2、支持只显示与当前系统相同架构的内核**
|
||||
**※3、下载/更新内核时支持调用 aptss 提升下载速度**
|
||||
**※4、新增卸载所有内核时的窗口警告**
|
||||
5、优化表格显示效果
|
||||
6、支持显示内核描述和版本
|
||||
|
||||
**※1. Support getting kernel data from apt database.**
|
||||
**※2. Support showing only kernels that are the same as the local system architecture.**
|
||||
**※3. Support using aptss to download packages faster.**
|
||||
**※4. Show a warning message box when removing all kernels.**
|
||||
5. Optimize the effect of the kernels table.
|
||||
6. Support showing kernel descriptions and versions.
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
|
||||
### 1.0.1(2024.05.03)
|
||||
**1、修复部分系统无法打开管理器的问题**
|
||||
**2、新增 Sourceforge 源以准备支持大内核文件**
|
||||
|
||||
### 1.0.0(2024.05.02)
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
## 内核仓库 apt 源
|
||||
安装 GXDE 内核管理器后会自动添加
|
||||
@ -31,5 +89,14 @@ sudo apt build-dep .
|
||||
sudo apt install fakeroot
|
||||
dpkg-buildpackage -b -us
|
||||
```
|
||||
## 请作者喝杯茶
|
||||
如果您觉得 GXDE 内核管理器对你有帮助,可以请作者喝杯茶
|
||||
<img src="Donate/Wechat.png" width="250" />
|
||||
<img src="Donate/Alipay.jpg" width="250" />
|
||||
<img src="Donate/QQ.png" width="250" >
|
||||
|
||||
# ©2023~Now gfdgd xi
|
||||
### 广告
|
||||
支付宝官方活动,扫描获得支付红包!
|
||||
<p><img src="Donate/advertisement0.jpg" width="250" ></p>
|
||||
|
||||
# ©2023~Now gfdgd xi
|
||||
|
14
Resource.qrc
14
Resource.qrc
@ -9,8 +9,20 @@
|
||||
<file>icon/dialog-ok.svg</file>
|
||||
<file>icon/dialog-question.svg</file>
|
||||
<file>icon/dialog-warning.svg</file>
|
||||
<file>icon/icon.svg</file>
|
||||
<file>icon/gxde-kernel-manager.svg</file>
|
||||
<file>shell/kernel-installer-remove-template.sh</file>
|
||||
<file>translation/gxde-kernel-manager_zh_CN.qm</file>
|
||||
<file>shell/kernel-installer-reconfigure-template.sh</file>
|
||||
<file>shell/kernel-installer-update-template.sh</file>
|
||||
<file>data/new/en_US.html</file>
|
||||
<file>data/new/zh_CN.html</file>
|
||||
<file>data/version</file>
|
||||
<file>shell/kernel-installer-upgrade-template.sh</file>
|
||||
<file>icon/icon1.png</file>
|
||||
<file>Donate/advertisement0.jpg</file>
|
||||
<file>Donate/Alipay.jpg</file>
|
||||
<file>Donate/QQ.png</file>
|
||||
<file>Donate/Wechat.png</file>
|
||||
<file>icon/tux.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -1,22 +1,33 @@
|
||||
#include "aboutwindow.h"
|
||||
#include "ui_aboutwindow.h"
|
||||
#include "programinfo.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QProcessEnvironment>
|
||||
#include <QFile>
|
||||
|
||||
AboutWindow::AboutWindow(QWidget *parent) :
|
||||
QMainWindow(parent),
|
||||
ui(new Ui::AboutWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
|
||||
QString info = "";
|
||||
info += "<pre>";
|
||||
info += tr("A kernel manager allows users to install or remove kernels easily.") + "\n\n";
|
||||
info += "<b>" + tr("Warning: You may damage your system unless you know what you will do!") + "</b>\n";
|
||||
info += tr("Built Time: ") + QString(__DATE__) + " " + __TIME__ + "\n";
|
||||
info += tr("QQ Group: 881201853") + "\n";
|
||||
info += "</pre>";
|
||||
info += "<hr/>";
|
||||
info += ProgramInfo::updateInfo();
|
||||
info += "<hr/>";
|
||||
info += "<h3>" + tr("Website") + "</h3>";
|
||||
info += "<p>Gitee: <a href='https://gitee.com/GXDE-OS/gxde-kernel-manager'>https://gitee.com/GXDE-OS/gxde-kernel-manager</a></p>";
|
||||
info += "<p>Github: <a href='https://github.com/GXDE-OS/gxde-kernel-manager'>https://github.com/GXDE-OS/gxde-kernel-manager</a></p>";
|
||||
info += "<p>Sourceforge: <a href='https://sourceforge.net/projects/gxde-kernel-manager/'>https://sourceforge.net/projects/gxde-kernel-manager/</a></p>";
|
||||
info += "<p>GXDE Homepage: <a href='https://www.gxde.org'>https://www.gxde.org</a></p>";
|
||||
info += "<hr/>\n";
|
||||
info += "<h1>©2023~" + QDateTime::currentDateTime().toString("yyyy") + " gfdgd xi</h1>\n";
|
||||
ui->textBrowser->setHtml(info);
|
||||
@ -32,3 +43,9 @@ void AboutWindow::on_m_closeButton_clicked()
|
||||
this->close();
|
||||
}
|
||||
|
||||
|
||||
void AboutWindow::on_m_logoShower_linkActivated(const QString &link)
|
||||
{
|
||||
ui->m_logoShower->setText("<html><head/><body><p><a href='https://www.gxde.org'><img width=128 src=\":/icon/icon1.png\"/></a></p></body></html>");
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,8 @@ public:
|
||||
private slots:
|
||||
void on_m_closeButton_clicked();
|
||||
|
||||
void on_m_logoShower_linkActivated(const QString &link);
|
||||
|
||||
private:
|
||||
Ui::AboutWindow *ui;
|
||||
};
|
||||
|
@ -15,14 +15,14 @@
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="Resource.qrc">
|
||||
<normaloff>:/icon/icon.svg</normaloff>:/icon/icon.svg</iconset>
|
||||
<normaloff>:/icon/gxde-kernel-manager.svg</normaloff>:/icon/gxde-kernel-manager.svg</iconset>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="m_logoShower">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><img width=128 src=":/icon/icon.svg"/></p></body></html></string>
|
||||
<string><html><head/><body><p><a href='https://www.gxde.org'><img width=128 src=":/icon/gxde-kernel-manager.svg"/></a></p></body></html></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
|
@ -8,7 +8,7 @@ fi
|
||||
programPath=$(cd $(dirname $0); pwd)
|
||||
dpkg -x "$1" /tmp/gxde-kernel-manager
|
||||
dpkg -e "$1" /tmp/gxde-kernel-manager/DEBIAN
|
||||
sed -i "s/libqtermwidget5-0 (>= 0.8.0), //g" /tmp/gxde-kernel-manager/DEBIAN/control
|
||||
sed -i "s/libqtermwidget5-0 (>= 0.8.0), /libqtermwidget5-0 | libqtermwidget5-1, /g" /tmp/gxde-kernel-manager/DEBIAN/control
|
||||
cp $programPath/lib /tmp/gxde-kernel-manager/opt/apps/gxde-kernel-manager/ -rv
|
||||
if [[ ! -n $2 ]]; then
|
||||
dpkg-deb -Z xz -z 9 -b /tmp/gxde-kernel-manager "$1"
|
||||
|
225
aptpkginfo.cpp
Normal file
225
aptpkginfo.cpp
Normal file
@ -0,0 +1,225 @@
|
||||
#include "aptpkginfo.h"
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
#include <QDebug>
|
||||
#include <QJsonObject>
|
||||
|
||||
AptPkgInfo::AptPkgInfo(QString pkgName, PkgSearchOption option)
|
||||
{
|
||||
this->pkgSearchOption = option;
|
||||
SetPkgName(pkgName);
|
||||
ReadAptData();
|
||||
}
|
||||
|
||||
QStringList AptPkgInfo::SplitVersion(QString version) const
|
||||
{
|
||||
SplitVersionStatus status = SplitVersionStatus::Checking;
|
||||
QStringList versionList;
|
||||
QString versionNumberTemp = "";
|
||||
QString versionLetterTemp = "";
|
||||
for(QString i: version) {
|
||||
if(symbolList.contains(i)) {
|
||||
// 如果是特殊字符
|
||||
|
||||
switch(status) {
|
||||
case SplitVersionStatus::Checking:
|
||||
versionList.append(versionNumberTemp);
|
||||
break;
|
||||
case SplitVersionStatus::MeetedEnglishLetter:
|
||||
versionList.append(versionLetterTemp);
|
||||
break;
|
||||
}
|
||||
versionList.append(i);
|
||||
versionNumberTemp = "";
|
||||
versionLetterTemp = "";
|
||||
status = SplitVersionStatus::MeetSymbol;
|
||||
continue;
|
||||
}
|
||||
if(i[0].isLetter()) {
|
||||
switch(status) {
|
||||
case SplitVersionStatus::Checking:
|
||||
versionList.append(versionNumberTemp);
|
||||
break;
|
||||
}
|
||||
versionLetterTemp += i;
|
||||
versionNumberTemp = "";
|
||||
status = SplitVersionStatus::MeetedEnglishLetter;
|
||||
continue;
|
||||
}
|
||||
switch(status) {
|
||||
case SplitVersionStatus::MeetedEnglishLetter:
|
||||
versionList.append(versionLetterTemp);
|
||||
break;
|
||||
}
|
||||
versionNumberTemp += i;
|
||||
status = SplitVersionStatus::Checking;
|
||||
versionLetterTemp = "";
|
||||
}
|
||||
if(status == SplitVersionStatus::Checking) {
|
||||
versionList.append(versionNumberTemp);
|
||||
}
|
||||
|
||||
|
||||
return versionList;
|
||||
}
|
||||
|
||||
bool AptPkgInfo::CompareVersion(QString version1, QString version2) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void AptPkgInfo::ReadAptData()
|
||||
{
|
||||
this->aptData = QJsonObject();
|
||||
QDir dir("/var/lib/apt/lists/");
|
||||
QStringList list = dir.entryList();
|
||||
for(QString i: list) {
|
||||
// 除去 . 和 ..
|
||||
if(i == "." || i == "..") {
|
||||
continue;
|
||||
}
|
||||
if(i.mid(i.indexOf("_Packages")) != "_Packages") {
|
||||
continue;
|
||||
}
|
||||
QFile file(dir.path() + "/" + i);
|
||||
file.open(QFile::ReadOnly);
|
||||
// 分析
|
||||
QJsonObject pkgData;
|
||||
pkgDataStatus status = pkgDataStatus::None;
|
||||
QString strTemp; // 因为直接 replace 会改变原来的值
|
||||
while(!file.atEnd()) {
|
||||
QByteArray line = file.readLine();
|
||||
strTemp = line;
|
||||
if(strTemp.replace(" ", "").replace("\n", "") == "") {
|
||||
// 空行
|
||||
if(status == pkgDataStatus::IsContain) {
|
||||
QString addPkgName = pkgData.value("Package").toString();
|
||||
// 如果已经存在表中
|
||||
if(pkgData.contains(addPkgName)) {
|
||||
// 新增数据
|
||||
QJsonObject allDataObject = aptData.value(addPkgName).toObject();
|
||||
// 判断版本大小,如果新于表内版本则更新
|
||||
QString dataVersion = allDataObject.value("Version").toString();
|
||||
|
||||
}
|
||||
else {
|
||||
aptData.insert(addPkgName, pkgData);
|
||||
}
|
||||
|
||||
}
|
||||
status = pkgDataStatus::EmptyLine;
|
||||
pkgData = QJsonObject(); // 清空
|
||||
continue;
|
||||
}
|
||||
// 如果已经被检测为非要寻找的包名,则
|
||||
if(status == pkgDataStatus::UnContain) {
|
||||
continue; // 忽略该行
|
||||
}
|
||||
// 分析行
|
||||
if(line.contains("Package: ")) {
|
||||
// 如果为包名行,则进行分析
|
||||
// 是否含有要求关键字
|
||||
strTemp = line;
|
||||
QString pkgName = strTemp.replace("Package: ", "").replace(" ", "").replace("\n", "");
|
||||
switch(this->pkgSearchOption) {
|
||||
case PkgSearchOption::Equal:
|
||||
if(pkgName == this->pkgName) {
|
||||
status = pkgDataStatus::IsContain;
|
||||
}
|
||||
else {
|
||||
status = pkgDataStatus::UnContain;
|
||||
}
|
||||
break;
|
||||
case PkgSearchOption::Include:
|
||||
if(pkgName.contains(this->pkgName)) {
|
||||
status = pkgDataStatus::IsContain;
|
||||
}
|
||||
else {
|
||||
status = pkgDataStatus::UnContain;
|
||||
}
|
||||
break;
|
||||
case PkgSearchOption::HeadInclude:
|
||||
if(pkgName.mid(0, this->pkgName.length()) == this->pkgName) {
|
||||
status = pkgDataStatus::IsContain;
|
||||
}
|
||||
else {
|
||||
status = pkgDataStatus::UnContain;
|
||||
}
|
||||
break;
|
||||
}
|
||||
// 解析为 QJsonObject
|
||||
pkgData.insert("Package", pkgName);
|
||||
continue;
|
||||
}
|
||||
// 处理
|
||||
int index = line.indexOf(":");
|
||||
strTemp = line;
|
||||
strTemp.replace("\n", "");
|
||||
pkgData.insert(QString(strTemp.mid(0, index)), QString(strTemp.mid(index + 2)));
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
}
|
||||
|
||||
void AptPkgInfo::SetPkgName(QString pkgName)
|
||||
{
|
||||
this->pkgName = pkgName;
|
||||
//pkgInfo = GetPkgInfo(pkgName);
|
||||
}
|
||||
|
||||
QString AptPkgInfo::GetPkgInfo(QString pkgName) const
|
||||
{
|
||||
if(pkgName == NULL) {
|
||||
pkgName = this->pkgName;
|
||||
}
|
||||
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
||||
env.insert("LANG", "en");
|
||||
return this->GetCommandResult("apt", QStringList() << "list" << pkgName, env);
|
||||
}
|
||||
|
||||
QString AptPkgInfo::get_package(QString pkgName) const
|
||||
{
|
||||
return this->aptData.value(pkgName).toObject().value("Package").toString();
|
||||
}
|
||||
|
||||
QString AptPkgInfo::get_version(QString pkgName) const
|
||||
{
|
||||
return this->aptData.value(pkgName).toObject().value("Version").toString();
|
||||
}
|
||||
|
||||
QString AptPkgInfo::get_maintainer(QString pkgName) const
|
||||
{
|
||||
return this->aptData.value(pkgName).toObject().value("Maintainer").toString();
|
||||
}
|
||||
|
||||
QString AptPkgInfo::get_description(QString pkgName) const
|
||||
{
|
||||
return this->aptData.value(pkgName).toObject().value("Description").toString();
|
||||
}
|
||||
|
||||
QString AptPkgInfo::get_architecture(QString pkgName) const
|
||||
{
|
||||
return this->aptData.value(pkgName).toObject().value("Architecture").toString();
|
||||
}
|
||||
|
||||
QStringList AptPkgInfo::GetAptPackageList() const
|
||||
{
|
||||
return this->aptData.keys();
|
||||
}
|
||||
|
||||
QByteArray AptPkgInfo::GetCommandResult(QString command, QStringList argv, QProcessEnvironment env) const
|
||||
{
|
||||
QProcess process;
|
||||
process.setProcessEnvironment(env);
|
||||
process.start(command, argv);
|
||||
process.waitForStarted();
|
||||
process.waitForFinished();
|
||||
QByteArray result = process.readAllStandardOutput();
|
||||
process.close();
|
||||
return result;
|
||||
}
|
||||
|
||||
QJsonObject AptPkgInfo::get_data() const
|
||||
{
|
||||
return aptData;
|
||||
}
|
67
aptpkginfo.h
Normal file
67
aptpkginfo.h
Normal file
@ -0,0 +1,67 @@
|
||||
#ifndef APTPKGINFO_H
|
||||
#define APTPKGINFO_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QProcess>
|
||||
#include <QJsonObject>
|
||||
|
||||
class AptPkgInfo
|
||||
{
|
||||
public:
|
||||
enum PkgSearchOption {
|
||||
Include = 0,
|
||||
Equal = 1,
|
||||
HeadInclude = 2
|
||||
};
|
||||
|
||||
explicit AptPkgInfo(QString pkgName, PkgSearchOption option = PkgSearchOption::Equal);
|
||||
|
||||
void SetPkgName(QString pkgName);
|
||||
QStringList GetAptPackageList() const;
|
||||
QByteArray GetCommandResult(QString command, QStringList argv, QProcessEnvironment env = QProcessEnvironment::systemEnvironment()) const;
|
||||
|
||||
QString GetPkgInfo(QString pkgName=NULL) const;
|
||||
|
||||
QString get_package(QString pkgName) const;
|
||||
QString get_version(QString pkgName) const;
|
||||
QString get_maintainer(QString pkgName) const;
|
||||
QString get_description(QString pkgName) const;
|
||||
QString get_architecture(QString pkgName) const;
|
||||
|
||||
QJsonObject get_data() const;
|
||||
|
||||
bool CompareVersion(QString version1, QString version2) const;
|
||||
|
||||
|
||||
private:
|
||||
QString pkgName;
|
||||
QString pkgInfo;
|
||||
QJsonObject aptData;
|
||||
PkgSearchOption pkgSearchOption = PkgSearchOption::Equal;
|
||||
QStringList symbolList = {"-", "~", "+"};
|
||||
enum SplitVersionStatus {
|
||||
Checking,
|
||||
MeetedEnglishLetter,
|
||||
MeetSymbol,
|
||||
Other
|
||||
};
|
||||
|
||||
QStringList SplitVersion(QString version) const;
|
||||
|
||||
enum pkgDataStatus {
|
||||
EmptyLine = 0,
|
||||
EmptyLineAgain = 1,
|
||||
Reading = 2,
|
||||
Readed = 3,
|
||||
None = 4,
|
||||
UnContain = 5,
|
||||
IsContain = 6,
|
||||
IsContainOldVersion = 7,
|
||||
IsContainNewVersion = 8,
|
||||
IsContainSameVersion = 9
|
||||
};
|
||||
|
||||
void ReadAptData();
|
||||
};
|
||||
|
||||
#endif // APTPKGINFO_H
|
6
data/new/en_US.html
Normal file
6
data/new/en_US.html
Normal file
@ -0,0 +1,6 @@
|
||||
<h1>What's new?</h1>
|
||||
<pre>
|
||||
<b>※1. Add an information window about the Kernel
|
||||
※2. Fix the issue with the installed Kernel causing exit code 1
|
||||
</b>
|
||||
</pre>
|
6
data/new/zh_CN.html
Normal file
6
data/new/zh_CN.html
Normal file
@ -0,0 +1,6 @@
|
||||
<h1>1.1.0 更新内容</h1>
|
||||
<pre>
|
||||
<b>※1、新增内核详细信息窗口
|
||||
※2、修复在部分机器上安装内核直接提示错误 1 的问题
|
||||
</b>
|
||||
</pre>
|
1
data/version
Normal file
1
data/version
Normal file
@ -0,0 +1 @@
|
||||
1.1.1
|
18
debian/changelog
vendored
18
debian/changelog
vendored
@ -1,5 +1,17 @@
|
||||
gxde-kernel-manager (1.0.0-1) UNRELEASED; urgency=medium
|
||||
gxde-kernel-manager (1.2.2) UNRELEASED; urgency=medium
|
||||
|
||||
* Initial release. (Closes: #nnnn) <nnnn is the bug number of your ITP>
|
||||
* ※1、支持从 apt 源读取内核数据并显示安装
|
||||
* ※2、支持只显示与当前系统相同架构的内核
|
||||
* ※3、下载/更新内核时支持调用 aptss 提升下载速度
|
||||
* ※4、新增卸载所有内核时的窗口警告
|
||||
* 5、优化表格显示效果
|
||||
* 6、支持显示内核描述和版本
|
||||
|
||||
-- gfdgd_xi <3025613752@qq.com> Sat, 27 Apr 2024 11:36:27 +0800
|
||||
* ※1. Support getting kernel data from apt database.
|
||||
* ※2. Support showing only kernels that are the same as the local system architecture.
|
||||
* ※3. Support using aptss to download packages faster.
|
||||
* ※4. Show a warning message box when removing all kernels.
|
||||
* 5. Optimize the effect of the kernels table.
|
||||
* 6. Support showing kernel descriptions and versions.
|
||||
|
||||
-- gfdgd_xi <3025613752@qq.com> Sun, 13 Oct 2024 10:56:49 +0800
|
||||
|
7
debian/control
vendored
7
debian/control
vendored
@ -12,13 +12,14 @@ Build-Depends:
|
||||
qttools5-dev-tools
|
||||
Standards-Version: 4.6.2
|
||||
Homepage: https://gitee.com/GXDE-OS/gxde-kernel-manager
|
||||
#Vcs-Browser: https://salsa.debian.org/debian/gxde-kernel-manager
|
||||
#Vcs-Git: https://salsa.debian.org/debian/gxde-kernel-manager.git
|
||||
Vcs-Git: https://gitee.com/GXDE-OS/gxde-kernel-manager.git
|
||||
|
||||
Package: gxde-kernel-manager
|
||||
Architecture: any
|
||||
Depends:
|
||||
${shlibs:Depends},
|
||||
${misc:Depends},
|
||||
Description: GXDE 内核管理器
|
||||
apt
|
||||
Description: GXDE 内核管理器是一个帮助用户更方便获取、安装、移除内核的工具。
|
||||
GXDE Kernel Manager is a kernel manager allows users to install or remove kernels easily.
|
||||
|
||||
|
2
debian/postinst
vendored
Normal file
2
debian/postinst
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
#!/bin/bash
|
||||
#apt update | true
|
@ -5,6 +5,6 @@ Name[zh_CN]=GXDE 内核管理器
|
||||
Comment=GXDE Kernel Manager
|
||||
Comment[zh_CN]=GXDE 内核管理器
|
||||
Type=Application
|
||||
Exec=bash /opt/apps/gxde-kernel-manager/gxde-kernel-manager-runner.sh
|
||||
Icon=/opt/apps/gxde-kernel-manager/icon.svg
|
||||
Exec=gxde-kernel-manager
|
||||
Icon=gxde-kernel-manager
|
||||
Categories=System
|
||||
|
@ -10,19 +10,26 @@ CONFIG += c++17
|
||||
|
||||
SOURCES += \
|
||||
aboutwindow.cpp \
|
||||
aptpkginfo.cpp \
|
||||
kernelinformation.cpp \
|
||||
kernelinformationdialog.cpp \
|
||||
kernelinstaller.cpp \
|
||||
main.cpp \
|
||||
mainwindow.cpp
|
||||
mainwindow.cpp \
|
||||
programinfo.cpp
|
||||
|
||||
HEADERS += \
|
||||
aboutwindow.h \
|
||||
aptpkginfo.h \
|
||||
kernelinformation.h \
|
||||
kernelinformationdialog.h \
|
||||
kernelinstaller.h \
|
||||
mainwindow.h
|
||||
mainwindow.h \
|
||||
programinfo.h
|
||||
|
||||
FORMS += \
|
||||
aboutwindow.ui \
|
||||
kernelinformationdialog.ui \
|
||||
kernelinstaller.ui \
|
||||
mainwindow.ui
|
||||
|
||||
@ -35,8 +42,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
unix:!macx: LIBS += -lqtermwidget5
|
||||
|
||||
aptsource.path = /etc/apt/sources.list.d/
|
||||
aptsource.files = $$PWD/AptSources/gxde-kernel-manager.list
|
||||
# 使用 GXDE 系统源里含有的内核
|
||||
#aptsource.path = /etc/apt/sources.list.d/
|
||||
#aptsource.files = $$PWD/AptSources/gxde-kernel-manager.list
|
||||
|
||||
aptsourcegpg.path = /etc/apt/trusted.gpg.d/
|
||||
aptsourcegpg.files = $$PWD/AptSources/gxde-kernel-manager.gpg
|
||||
@ -44,23 +52,29 @@ aptsourcegpg.files = $$PWD/AptSources/gxde-kernel-manager.gpg
|
||||
debiandesktop.path = /usr/share/applications/
|
||||
debiandesktop.files = $$PWD/gxde-kernel-manager.desktop
|
||||
|
||||
uosdesktop.path = /opt/apps/gxde-kernel-manager/entries/applications
|
||||
uosdesktop.files = $$PWD/gxde-kernel-manager.desktop
|
||||
#uosdesktop.path = /opt/apps/gxde-kernel-manager/entries/applications
|
||||
#uosdesktop.files = $$PWD/gxde-kernel-manager.desktop
|
||||
|
||||
icon.path = /opt/apps/gxde-kernel-manager/
|
||||
icon.files = $$PWD/icon/icon.svg
|
||||
icon.path = /usr/share/icons/
|
||||
icon.files = $$PWD/icon/gxde-kernel-manager.svg
|
||||
#icon.path = /opt/apps/gxde-kernel-manager/
|
||||
#icon.files = $$PWD/icon/icon.svg
|
||||
|
||||
targetrunner.path = /opt/apps/gxde-kernel-manager/
|
||||
targetrunner.files = $$PWD/gxde-kernel-manager-runner.sh
|
||||
# GXDE 下不需要该脚本
|
||||
#targetrunner.path = /opt/apps/gxde-kernel-manager/
|
||||
#targetrunner.files = $$PWD/gxde-kernel-manager-runner.sh
|
||||
|
||||
#libinclude.path = /opt/apps/gxde-kernel-manager/
|
||||
#libinclude.files = $$PWD/lib
|
||||
|
||||
target.path = /opt/apps/gxde-kernel-manager/
|
||||
#target.path = /opt/apps/gxde-kernel-manager/
|
||||
target.path = /usr/bin
|
||||
|
||||
sysbro.path = /usr/share/GXDE/gxde-system-assistant/tool-extensions
|
||||
sysbro.files = $$PWD/gxde-kernel-manager.desktop
|
||||
|
||||
|
||||
INSTALLS += aptsourcegpg aptsource target debiandesktop uosdesktop icon targetrunner
|
||||
#INSTALLS += aptsourcegpg aptsource target debiandesktop uosdesktop icon targetrunner
|
||||
INSTALLS += target icon sysbro
|
||||
|
||||
TRANSLATIONS += translation/gxde-kernel-manager_zh_CN.ts
|
||||
|
||||
|
Before (image error) Size: 32 KiB After (image error) Size: 32 KiB |
BIN
icon/icon1.png
Normal file
BIN
icon/icon1.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 257 KiB |
BIN
icon/tux.png
Normal file
BIN
icon/tux.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 7.5 KiB |
@ -1,4 +1,7 @@
|
||||
#include "kernelinformation.h"
|
||||
#include "aptpkginfo.h"
|
||||
|
||||
#include <QProcess>
|
||||
|
||||
KernelInformation::KernelInformation()
|
||||
{
|
||||
@ -7,22 +10,84 @@ KernelInformation::KernelInformation()
|
||||
|
||||
void KernelInformation::LoadInfo()
|
||||
{
|
||||
QUrl url(this->url);
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("format", "j1");
|
||||
url.setQuery(query.toString(QUrl::FullyEncoded));
|
||||
qDebug() << url;
|
||||
QNetworkRequest request(url);
|
||||
QNetworkAccessManager *m_http = new QNetworkAccessManager(this);
|
||||
QNetworkReply *reply = m_http->get(request);
|
||||
connect(reply, &QNetworkReply::finished, this, [this, m_http](){
|
||||
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
|
||||
QByteArray data = reply->readAll();
|
||||
qDebug() << data;
|
||||
qDebug() << reply->error();
|
||||
this->listData = QJsonDocument::fromJson(data).array();
|
||||
emit loadFinished(reply);
|
||||
});
|
||||
// 添加 GXDE Kernel Manager
|
||||
QJsonArray array;
|
||||
AptPkgInfo kernelManagerinfo = AptPkgInfo("gxde-kernel-manager", AptPkgInfo::PkgSearchOption::Equal);
|
||||
QStringList list = kernelManagerinfo.GetAptPackageList();
|
||||
qDebug() << kernelManagerinfo.get_data();
|
||||
for(QString i: list) {
|
||||
QJsonObject object;
|
||||
kernelManagerinfo.SetPkgName(i);
|
||||
object.insert("Name", i);
|
||||
object.insert("Author", kernelManagerinfo.get_maintainer(i));
|
||||
object.insert("Des", kernelManagerinfo.get_description(i));
|
||||
object.insert("Ver", kernelManagerinfo.get_version(i));
|
||||
object.insert("Arch", QJsonArray::fromStringList(QStringList() << arch()));
|
||||
object.insert("PkgName", QJsonArray::fromStringList(QStringList() << i));
|
||||
array.append(object);
|
||||
}
|
||||
AptPkgInfo info = AptPkgInfo("linux-", AptPkgInfo::PkgSearchOption::HeadInclude);
|
||||
list = info.GetAptPackageList();
|
||||
|
||||
indexMap = {};
|
||||
for(QString i: list) {
|
||||
QJsonObject object;
|
||||
bool isContinue = false;
|
||||
for(QString j: unShowMap) {
|
||||
if(i.contains(j)) {
|
||||
isContinue = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 跳过此次循环
|
||||
if(isContinue) {
|
||||
continue;
|
||||
}
|
||||
isContinue = true;
|
||||
for(QString j: showMap) {
|
||||
if(i.contains(j)) {
|
||||
isContinue = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 跳过此次循环
|
||||
if(isContinue) {
|
||||
continue;
|
||||
}
|
||||
QString strTemp = i;
|
||||
strTemp.replace("-image", "");
|
||||
strTemp.replace("-headers", "");
|
||||
int alreadyIndex = -1;
|
||||
if(indexMap.contains(strTemp)) {
|
||||
// 如果已经存在
|
||||
alreadyIndex = indexMap.value(strTemp);
|
||||
QJsonArray pkgArray = array.at(alreadyIndex).toObject().value("PkgName").toArray();
|
||||
QJsonArray archArray = array.at(alreadyIndex).toObject().value("Arch").toArray();
|
||||
pkgArray.append(i);
|
||||
QString pkgArch = info.get_architecture(i);
|
||||
if(!archArray.contains(pkgArch)) {
|
||||
archArray.append(pkgArch);
|
||||
}
|
||||
QJsonObject pkgObject = array.at(alreadyIndex).toObject();
|
||||
pkgObject["PkgName"] = pkgArray;
|
||||
pkgObject["Arch"] = archArray;
|
||||
array.replace(alreadyIndex, pkgObject);
|
||||
continue;
|
||||
}
|
||||
info.SetPkgName(strTemp);
|
||||
object.insert("Name", strTemp);
|
||||
object.insert("Author", info.get_maintainer(i));
|
||||
object.insert("Des", info.get_description(i));
|
||||
object.insert("Ver", info.get_version(i));
|
||||
object.insert("Arch", QJsonArray::fromStringList(QStringList() << info.get_architecture(i)));
|
||||
object.insert("PkgName", QJsonArray::fromStringList(QStringList() << i));
|
||||
indexMap.insert(strTemp, array.count());
|
||||
array.append(object);
|
||||
}
|
||||
|
||||
this->listData = array;
|
||||
emit loadFinished(NULL);
|
||||
|
||||
}
|
||||
|
||||
QJsonArray KernelInformation::get_listData() const
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <QProcess>
|
||||
|
||||
#include <QFile>
|
||||
#include <QMap>
|
||||
|
||||
class KernelInformation : public QObject
|
||||
{
|
||||
@ -42,9 +43,24 @@ signals:
|
||||
void loadFinished(QNetworkReply *reply);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
QString url = "http://info.kernel.gxde.gfdgdxi.top/information.json";
|
||||
QJsonArray listData;
|
||||
|
||||
QStringList unShowMap = {
|
||||
"-dbg"
|
||||
};
|
||||
|
||||
QStringList showMap = {
|
||||
"linux-headers",
|
||||
"linux-image",
|
||||
"linux-kernel"
|
||||
};
|
||||
|
||||
QMap<QString, int> indexMap;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // KERNELINFORMATION_H
|
||||
|
64
kernelinformationdialog.cpp
Normal file
64
kernelinformationdialog.cpp
Normal file
@ -0,0 +1,64 @@
|
||||
#include "kernelinformationdialog.h"
|
||||
#include "ui_kernelinformationdialog.h"
|
||||
|
||||
#include "kernelinstaller.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
|
||||
KernelInformationDialog::KernelInformationDialog(QJsonObject data, QWidget *parent) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::KernelInformationDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
// 解析数据
|
||||
ui->m_kernelName->setText(tr("Kernel Name:") + " " + data.value("Name").toString());
|
||||
ui->m_kernelVersion->setText(tr("Kernel Version:") + " " + data.value("Ver").toString());
|
||||
ui->m_kernelAuthor->setText(tr("Author:") + " " + data.value("Author").toString());
|
||||
QJsonArray array = data.value("PkgName").toArray();
|
||||
QString kernelText = "";
|
||||
for(QJsonValue i: array) {
|
||||
kernelText += i.toString() + " ";
|
||||
pkgList.append(i.toString());
|
||||
}
|
||||
ui->m_PkgName->setText(tr("Package Name:") + " " + kernelText);
|
||||
ui->m_kernelArch->setText(tr("Kernel Architecture:") + " " + data.value("Arch").toArray().at(0).toString());
|
||||
ui->m_des->setText(data.value("Des").toString());
|
||||
}
|
||||
|
||||
KernelInformationDialog::~KernelInformationDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void KernelInformationDialog::on_m_refreshButton_clicked()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void KernelInformationDialog::on_m_reconfigureButton_clicked()
|
||||
{
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Reconfigure, pkgList);
|
||||
installer->show();
|
||||
}
|
||||
|
||||
|
||||
void KernelInformationDialog::on_m_installButton_clicked()
|
||||
{
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Install, pkgList);
|
||||
connect(installer, &KernelInstaller::InstallFinished, this, [this](int status){
|
||||
emit InstallFinished(status);
|
||||
});
|
||||
installer->show();
|
||||
}
|
||||
|
||||
|
||||
void KernelInformationDialog::on_m_removeButton_clicked()
|
||||
{
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Remove, pkgList);
|
||||
connect(installer, &KernelInstaller::InstallFinished, this, [this](int status){
|
||||
emit RemoveFinished(status);
|
||||
});
|
||||
installer->show();
|
||||
}
|
||||
|
37
kernelinformationdialog.h
Normal file
37
kernelinformationdialog.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef KERNELINFORMATIONDIALOG_H
|
||||
#define KERNELINFORMATIONDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QJsonObject>
|
||||
|
||||
namespace Ui {
|
||||
class KernelInformationDialog;
|
||||
}
|
||||
|
||||
class KernelInformationDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit KernelInformationDialog(QJsonObject data, QWidget *parent = nullptr);
|
||||
~KernelInformationDialog();
|
||||
|
||||
signals:
|
||||
void InstallFinished(int status);
|
||||
void RemoveFinished(int status);
|
||||
|
||||
private slots:
|
||||
void on_m_refreshButton_clicked();
|
||||
|
||||
void on_m_reconfigureButton_clicked();
|
||||
|
||||
void on_m_installButton_clicked();
|
||||
|
||||
void on_m_removeButton_clicked();
|
||||
|
||||
private:
|
||||
Ui::KernelInformationDialog *ui;
|
||||
QStringList pkgList;
|
||||
};
|
||||
|
||||
#endif // KERNELINFORMATIONDIALOG_H
|
153
kernelinformationdialog.ui
Normal file
153
kernelinformationdialog.ui
Normal file
@ -0,0 +1,153 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>KernelInformationDialog</class>
|
||||
<widget class="QDialog" name="KernelInformationDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>650</width>
|
||||
<height>412</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Information</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="linuxIconShower">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><img src=":/icon/tux.png"/></p></body></html></string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="m_kernelName">
|
||||
<property name="text">
|
||||
<string>Kernel Name:</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="m_kernelVersion">
|
||||
<property name="text">
|
||||
<string>Kernel Version:</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="m_kernelAuthor">
|
||||
<property name="text">
|
||||
<string>Author:</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="m_kernelArch">
|
||||
<property name="text">
|
||||
<string>Kernel Architecture:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="m_PkgName">
|
||||
<property name="text">
|
||||
<string>Package Name:</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="m_desTip">
|
||||
<property name="text">
|
||||
<string>Description:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="m_des"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_reconfigureButton">
|
||||
<property name="text">
|
||||
<string>Reconfigure</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_installButton">
|
||||
<property name="text">
|
||||
<string>Install</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_removeButton">
|
||||
<property name="text">
|
||||
<string>Remove</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -23,12 +23,21 @@ KernelInstaller::KernelInstaller(Option option, QStringList kernelList, QWidget
|
||||
}
|
||||
|
||||
switch(runOption) {
|
||||
case Option::Install:
|
||||
ui->m_status->setText(tr("Try to install ") + kernel);
|
||||
break;
|
||||
case Option::Remove:
|
||||
ui->m_status->setText(tr("Try to remove ") + kernel);
|
||||
break;
|
||||
case Option::Install:
|
||||
ui->m_status->setText(tr("Try to install ") + kernel);
|
||||
break;
|
||||
case Option::Remove:
|
||||
ui->m_status->setText(tr("Try to remove ") + kernel);
|
||||
break;
|
||||
case Option::Reconfigure:
|
||||
ui->m_status->setText(tr("Try to reconfigure ") + kernel);
|
||||
break;
|
||||
case Option::Update:
|
||||
ui->m_status->setText(tr("Try to update apt cache"));
|
||||
break;
|
||||
case Option::Upgrade:
|
||||
ui->m_status->setText(tr("Try to upgrade ") + kernel);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@ -60,7 +69,7 @@ void KernelInstaller::StartInstaller()
|
||||
terminal->startShellProgram();
|
||||
processID = terminal->getShellPID();
|
||||
// 使用 QTimer 用于判断内核是否安装完成
|
||||
QTimer *runStatusTimer = new QTimer();
|
||||
runStatusTimer = new QTimer();
|
||||
runStatusTimer->setInterval(100);
|
||||
connect(runStatusTimer, &QTimer::timeout, this, &KernelInstaller::CheckInstallerStatusTimer);
|
||||
runStatusTimer->start();
|
||||
@ -75,12 +84,21 @@ QString KernelInstaller::BuildKernelInstallerBash(QStringList kernelList, QStrin
|
||||
}
|
||||
QString filePath = ":/shell/kernel-installer-template.sh";
|
||||
switch(runOption) {
|
||||
case Option::Install:
|
||||
filePath = ":/shell/kernel-installer-template.sh";
|
||||
break;
|
||||
case Option::Remove:
|
||||
filePath = ":/shell/kernel-installer-remove-template.sh";
|
||||
break;
|
||||
case Option::Install:
|
||||
filePath = ":/shell/kernel-installer-template.sh";
|
||||
break;
|
||||
case Option::Remove:
|
||||
filePath = ":/shell/kernel-installer-remove-template.sh";
|
||||
break;
|
||||
case Option::Reconfigure:
|
||||
filePath = ":/shell/kernel-installer-reconfigure-template.sh";
|
||||
break;
|
||||
case Option::Update:
|
||||
filePath = ":/shell/kernel-installer-update-template.sh";
|
||||
break;
|
||||
case Option::Upgrade:
|
||||
filePath = ":/shell/kernel-installer-upgrade-template.sh";
|
||||
break;
|
||||
}
|
||||
|
||||
QFile file(filePath);
|
||||
@ -130,6 +148,9 @@ void KernelInstaller::CheckInstallerStatusTimer()
|
||||
if(status == -1) {
|
||||
return;
|
||||
}
|
||||
// 关闭 Timer 防止一直发送错误的信号
|
||||
runStatusTimer->stop();
|
||||
emit InstallFinished(status);
|
||||
// 安装完成
|
||||
if(status == 0) {
|
||||
ui->m_status->setText(tr("Done"));
|
||||
|
@ -16,7 +16,10 @@ class KernelInstaller : public QMainWindow
|
||||
public:
|
||||
enum Option {
|
||||
Install,
|
||||
Remove
|
||||
Remove,
|
||||
Reconfigure,
|
||||
Update,
|
||||
Upgrade
|
||||
};
|
||||
|
||||
explicit KernelInstaller(Option option, QStringList kernelList, QWidget *parent = nullptr);
|
||||
@ -27,6 +30,7 @@ signals:
|
||||
void InstallFinished(int status);
|
||||
|
||||
private:
|
||||
QTimer *runStatusTimer;
|
||||
Option runOption;
|
||||
Ui::KernelInstaller *ui;
|
||||
QTermWidget *terminal;
|
||||
|
@ -15,7 +15,7 @@
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="Resource.qrc">
|
||||
<normaloff>:/icon/icon.svg</normaloff>:/icon/icon.svg</iconset>
|
||||
<normaloff>:/icon/gxde-kernel-manager.svg</normaloff>:/icon/gxde-kernel-manager.svg</iconset>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
|
6
main.cpp
6
main.cpp
@ -1,5 +1,7 @@
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "programinfo.h"
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
#include <QFile>
|
||||
@ -11,9 +13,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
QTranslator translator;
|
||||
// 检查系统语言以加载翻译
|
||||
if(QProcessEnvironment::systemEnvironment().value("LANG").contains("zh")) {
|
||||
// 中文,加载中文翻译
|
||||
if(ProgramInfo::systemLANG() == ProgramInfo::LANG::zh_CN) {
|
||||
translator.load(":/translation/gxde-kernel-manager_zh_CN.qm");
|
||||
}
|
||||
a.installTranslator(&translator);
|
||||
|
158
mainwindow.cpp
158
mainwindow.cpp
@ -1,17 +1,21 @@
|
||||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h"
|
||||
#include "aboutwindow.h"
|
||||
#include "programinfo.h"
|
||||
|
||||
#include "kernelinformation.h"
|
||||
|
||||
#include <QStandardItemModel>
|
||||
#include <qdesktopservices.h>
|
||||
|
||||
#include "kernelinformationdialog.h"
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::MainWindow)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->setWindowTitle(this->windowTitle() + " " + ProgramInfo::version());
|
||||
kernelInformation = new KernelInformation();
|
||||
RefreshKernelList();
|
||||
}
|
||||
@ -20,26 +24,52 @@ void MainWindow::RefreshKernelList()
|
||||
{
|
||||
ui->m_nowKernel->setText(tr("Kernel: ") + kernelInformation->localKernelName() + " " + tr("Arch: ") + kernelInformation->arch());
|
||||
connect(kernelInformation, &KernelInformation::loadFinished, this, [this](){
|
||||
qDebug() << this->kernelInformation->get_listData();
|
||||
RefreshKernelListView(kernelInformation);
|
||||
RefreshKernelListView(kernelInformation, ui->m_showLocalArchOnly->isChecked());
|
||||
});
|
||||
kernelInformation->LoadInfo();
|
||||
}
|
||||
|
||||
void MainWindow::RefreshKernelListView(KernelInformation *info)
|
||||
void MainWindow::RefreshKernelListView(KernelInformation *info, bool showLocalArchOnly)
|
||||
{
|
||||
// 更新列表
|
||||
int count = info->get_count();
|
||||
QStandardItemModel *model = new QStandardItemModel();
|
||||
model->setHorizontalHeaderLabels(QStringList() << tr("ID") << tr("Kernel Name") << tr("Author") << tr("Arch") << tr("Installed"));
|
||||
model->setHorizontalHeaderLabels(QStringList() << tr("ID") << tr("Kernel Name") << tr("Author") << tr("Arch") << tr("Version") << tr("Installed") << tr("Description"));
|
||||
const QString arch = info->arch();
|
||||
int line = 0;
|
||||
kernelNumber = 0;
|
||||
for(int i = 0; i < count; i++) {
|
||||
model->setItem(i, 0, new QStandardItem(QString::number(i)));
|
||||
model->setItem(i, 1, new QStandardItem(info->get_name(i)));
|
||||
model->setItem(i, 2, new QStandardItem(info->get_author(i)));
|
||||
model->setItem(i, 3, new QStandardItem(info->get_arch(i).at(0)));
|
||||
model->setItem(i, 4, new QStandardItem((QStringList() << "" << "Y").at(info->get_installedAlready(i))));
|
||||
// 显示所有架构
|
||||
QString kernelArch = "";
|
||||
bool isLocalArch = false;
|
||||
|
||||
for(QString i: info->get_arch(i)) {
|
||||
if(i == arch) {
|
||||
isLocalArch = true;
|
||||
}
|
||||
if(i == "all") {
|
||||
isLocalArch = true;
|
||||
}
|
||||
kernelArch += i + " ";
|
||||
}
|
||||
if(showLocalArchOnly && !isLocalArch) {
|
||||
continue;
|
||||
}
|
||||
model->setItem(line, 0, new QStandardItem(QString::number(i)));
|
||||
model->setItem(line, 1, new QStandardItem(info->get_name(i)));
|
||||
model->setItem(line, 2, new QStandardItem(info->get_author(i)));
|
||||
model->setItem(line, 3, new QStandardItem(kernelArch));
|
||||
model->setItem(line, 4, new QStandardItem(info->get_ver(i)));
|
||||
bool installed = info->get_installedAlready(i);
|
||||
model->setItem(line, 5, new QStandardItem((QStringList() << "" << "Y").at(installed)));
|
||||
if (installed) {
|
||||
kernelNumber++;
|
||||
}
|
||||
model->setItem(line, 6, new QStandardItem(info->get_des(i)));
|
||||
line++;
|
||||
}
|
||||
ui->m_kernelShow->setModel(model);
|
||||
ui->m_kernelShow->resizeColumnsToContents();
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
@ -58,7 +88,7 @@ void MainWindow::on_m_installButton_clicked()
|
||||
{
|
||||
QModelIndex list = ui->m_kernelShow->selectionModel()->currentIndex();
|
||||
int row = list.row();
|
||||
if(row <= 0) {
|
||||
if(row < 0) {
|
||||
// 未选中任何内容
|
||||
QMessageBox::critical(this, tr("Error"), tr("Nothing to choose"));
|
||||
return;
|
||||
@ -68,6 +98,10 @@ void MainWindow::on_m_installButton_clicked()
|
||||
int id = ui->m_kernelShow->model()->data(index).toUInt();
|
||||
// 获取选中行
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Install, kernelInformation->get_pkgName(id));
|
||||
connect(installer, &KernelInstaller::InstallFinished, this, [this](){
|
||||
// 刷新列表
|
||||
this->RefreshKernelListView(this->kernelInformation, ui->m_showLocalArchOnly->isChecked());
|
||||
});
|
||||
installer->show();
|
||||
}
|
||||
|
||||
@ -97,11 +131,53 @@ void MainWindow::on_actionGithub_triggered()
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MainWindow::on_actionSourceforge_triggered()
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl("https://sourceforge.net/projects/gxde-kernel-manager/"));
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_m_removeButton_clicked()
|
||||
{
|
||||
QModelIndex list = ui->m_kernelShow->selectionModel()->currentIndex();
|
||||
int row = list.row();
|
||||
if(row <= 0) {
|
||||
if(row < 0) {
|
||||
// 未选中任何内容
|
||||
QMessageBox::critical(this, tr("Error"), tr("Nothing to choose"));
|
||||
return;
|
||||
}
|
||||
// 获取 ID
|
||||
QModelIndex index = ui->m_kernelShow->model()->index(row, 0);
|
||||
int id = ui->m_kernelShow->model()->data(index).toUInt();
|
||||
if(kernelNumber <= 1) {
|
||||
QMessageBox msgBox;
|
||||
msgBox.setIcon(QMessageBox::Warning);
|
||||
msgBox.setWindowTitle(tr("Warning"));
|
||||
msgBox.setInformativeText(tr("Are you sure you want to remove all installed kernel versions? Please note that this may render your system unstable or unbootable."));
|
||||
msgBox.addButton(tr("Confirm"), QMessageBox::AcceptRole);
|
||||
msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
|
||||
if(msgBox.exec() == QMessageBox::RejectRole) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// 获取选中行
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Remove, kernelInformation->get_pkgName(id));
|
||||
installer->show();
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_m_showLocalArchOnly_stateChanged(int arg1)
|
||||
{
|
||||
RefreshKernelListView(this->kernelInformation, ui->m_showLocalArchOnly->isChecked());
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_m_reconfigureButton_clicked()
|
||||
{
|
||||
QModelIndex list = ui->m_kernelShow->selectionModel()->currentIndex();
|
||||
int row = list.row();
|
||||
if(row < 0) {
|
||||
// 未选中任何内容
|
||||
QMessageBox::critical(this, tr("Error"), tr("Nothing to choose"));
|
||||
return;
|
||||
@ -110,7 +186,65 @@ void MainWindow::on_m_removeButton_clicked()
|
||||
QModelIndex index = ui->m_kernelShow->model()->index(row, 0);
|
||||
int id = ui->m_kernelShow->model()->data(index).toUInt();
|
||||
// 获取选中行
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Remove, kernelInformation->get_pkgName(id));
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Reconfigure, kernelInformation->get_pkgName(id));
|
||||
installer->show();
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_actionUpdate_apt_cache_triggered()
|
||||
{
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Update, QStringList());
|
||||
connect(installer, &KernelInstaller::InstallFinished, this, [this, installer](){
|
||||
RefreshKernelList();
|
||||
});
|
||||
installer->show();
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_actionAbout_QT_triggered()
|
||||
{
|
||||
QMessageBox::aboutQt(this);
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_actionUpgrade_triggered()
|
||||
{
|
||||
KernelInstaller *installer = new KernelInstaller(KernelInstaller::Option::Upgrade, QStringList());
|
||||
installer->show();
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_actionDonate_triggered()
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl("https://gitee.com/GXDE-OS#%E8%AF%B7%E4%BD%9C%E8%80%85%E5%96%9D%E6%9D%AF%E8%8C%B6"));
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_m_kernelShow_doubleClicked(const QModelIndex &index)
|
||||
{
|
||||
// 显示具体信息
|
||||
QModelIndex list = index;
|
||||
int row = list.row();
|
||||
if(row < 0) {
|
||||
// 未选中任何内容
|
||||
QMessageBox::critical(this, tr("Error"), tr("Nothing to choose"));
|
||||
return;
|
||||
}
|
||||
// 获取 ID
|
||||
QModelIndex chooseIndex = ui->m_kernelShow->model()->index(row, 0);
|
||||
int id = ui->m_kernelShow->model()->data(chooseIndex).toUInt();
|
||||
// 获取选中行
|
||||
KernelInformationDialog *dialog = new KernelInformationDialog(kernelInformation->get_kernelData(id));
|
||||
connect(dialog, &KernelInformationDialog::InstallFinished, this, [this](){
|
||||
// 刷新列表
|
||||
this->RefreshKernelListView(this->kernelInformation, ui->m_showLocalArchOnly->isChecked());
|
||||
});
|
||||
connect(dialog, &KernelInformationDialog::RemoveFinished, this, [this](){
|
||||
// 刷新列表
|
||||
this->RefreshKernelListView(this->kernelInformation, ui->m_showLocalArchOnly->isChecked());
|
||||
});
|
||||
dialog->show();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
20
mainwindow.h
20
mainwindow.h
@ -33,10 +33,28 @@ private slots:
|
||||
|
||||
void on_m_removeButton_clicked();
|
||||
|
||||
void on_m_showLocalArchOnly_stateChanged(int arg1);
|
||||
|
||||
void on_m_reconfigureButton_clicked();
|
||||
|
||||
void on_actionUpdate_apt_cache_triggered();
|
||||
|
||||
void on_actionAbout_QT_triggered();
|
||||
|
||||
void on_actionUpgrade_triggered();
|
||||
|
||||
void on_actionDonate_triggered();
|
||||
|
||||
void on_m_kernelShow_doubleClicked(const QModelIndex &index);
|
||||
|
||||
void on_actionSourceforge_triggered();
|
||||
|
||||
private:
|
||||
Ui::MainWindow *ui;
|
||||
KernelInformation *kernelInformation;
|
||||
void RefreshKernelList();
|
||||
void RefreshKernelListView(KernelInformation *info);
|
||||
void RefreshKernelListView(KernelInformation *info, bool showLocalArchOnly = true);
|
||||
|
||||
int kernelNumber = 0;
|
||||
};
|
||||
#endif // MAINWINDOW_H
|
||||
|
@ -15,7 +15,7 @@
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="Resource.qrc">
|
||||
<normaloff>:/icon/icon.svg</normaloff>:/icon/icon.svg</iconset>
|
||||
<normaloff>:/icon/gxde-kernel-manager.svg</normaloff>:/icon/gxde-kernel-manager.svg</iconset>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
@ -27,9 +27,15 @@
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="horizontalHeaderCascadingSectionResizes">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="verticalHeaderVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
@ -57,6 +63,16 @@
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="m_showLocalArchOnly">
|
||||
<property name="text">
|
||||
<string>Show local PC architecture only</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_refreshButton">
|
||||
<property name="text">
|
||||
@ -64,6 +80,13 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_reconfigureButton">
|
||||
<property name="text">
|
||||
<string>Reconfigure</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="m_installButton">
|
||||
<property name="text">
|
||||
@ -103,10 +126,30 @@
|
||||
</property>
|
||||
<addaction name="actionGitee"/>
|
||||
<addaction name="actionGithub"/>
|
||||
<addaction name="actionSourceforge"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionDonate"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionAbout_QT"/>
|
||||
<addaction name="actionAbout"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuApt">
|
||||
<property name="title">
|
||||
<string>Apt</string>
|
||||
</property>
|
||||
<addaction name="actionUpdate_apt_cache"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionUpgrade"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuGrub">
|
||||
<property name="title">
|
||||
<string>Grub</string>
|
||||
</property>
|
||||
<addaction name="actionUpdate_Grub"/>
|
||||
</widget>
|
||||
<addaction name="menuProgram"/>
|
||||
<addaction name="menuApt"/>
|
||||
<addaction name="menuGrub"/>
|
||||
<addaction name="menuHelp"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
@ -130,6 +173,36 @@
|
||||
<string>Github</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionUpdate_apt_cache">
|
||||
<property name="text">
|
||||
<string>Update apt cache</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAbout_QT">
|
||||
<property name="text">
|
||||
<string>About QT</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionUpgrade">
|
||||
<property name="text">
|
||||
<string>Upgrade</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDonate">
|
||||
<property name="text">
|
||||
<string>Donate</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSourceforge">
|
||||
<property name="text">
|
||||
<string>Sourceforge</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionUpdate_Grub">
|
||||
<property name="text">
|
||||
<string>Update Grub</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="Resource.qrc"/>
|
||||
|
38
programinfo.cpp
Normal file
38
programinfo.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
#include "programinfo.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QProcessEnvironment>
|
||||
|
||||
ProgramInfo::LANG ProgramInfo::systemLANG()
|
||||
{
|
||||
if(QProcessEnvironment::systemEnvironment().value("LANG").contains("zh")) {
|
||||
return LANG::zh_CN;
|
||||
}
|
||||
return LANG::en_US;
|
||||
}
|
||||
|
||||
|
||||
QString ProgramInfo::updateInfo()
|
||||
{
|
||||
// 读取更新日志
|
||||
// 检查系统语言以加载对应语言的更新日志
|
||||
QString updateInfoPath = ":/data/new/en_US.html";
|
||||
if(QProcessEnvironment::systemEnvironment().value("LANG").contains("zh")) {
|
||||
// 中文,加载中文更新日志
|
||||
updateInfoPath = ":/data/new/zh_CN.html";
|
||||
}
|
||||
QFile file(updateInfoPath);
|
||||
file.open(QFile::ReadOnly);
|
||||
QString data = file.readAll();
|
||||
file.close();
|
||||
return data;
|
||||
}
|
||||
|
||||
QString ProgramInfo::version()
|
||||
{
|
||||
QFile file(":/data/version");
|
||||
file.open(QFile::ReadOnly);
|
||||
QString data = file.readAll();
|
||||
file.close();
|
||||
return data;
|
||||
}
|
18
programinfo.h
Normal file
18
programinfo.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef PROGRAMINFO_H
|
||||
#define PROGRAMINFO_H
|
||||
|
||||
#include <QString>
|
||||
|
||||
namespace ProgramInfo
|
||||
{
|
||||
enum LANG {
|
||||
zh_CN = 0,
|
||||
en_US = 1,
|
||||
other = en_US
|
||||
};
|
||||
LANG systemLANG() ;
|
||||
QString updateInfo();
|
||||
QString version();
|
||||
};
|
||||
|
||||
#endif // PROGRAMINFO_H
|
5
shell/kernel-installer-reconfigure-template.sh
Normal file
5
shell/kernel-installer-reconfigure-template.sh
Normal file
@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
rm /tmp/gxde-kernel-manager-installer-status -f
|
||||
dpkg-reconfigure ${KernelList}
|
||||
rm -f "${kernelInstallerShellTempPath}"
|
@ -1,6 +1,11 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
rm /tmp/gxde-kernel-manager-installer-status -f
|
||||
apt update
|
||||
apt install ${KernelList} -y
|
||||
rm -f "${kernelInstallerShellTempPath}"
|
||||
aptPath="apt"
|
||||
if [[ -f "/usr/bin/aptss" ]]; then
|
||||
# 如果 aptss 存在,则使用 aptss
|
||||
aptPath="aptss"
|
||||
fi
|
||||
$aptPath update
|
||||
$aptPath install ${KernelList} -y
|
||||
rm -f "${kernelInstallerShellTempPath}"
|
||||
|
10
shell/kernel-installer-update-template.sh
Normal file
10
shell/kernel-installer-update-template.sh
Normal file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
rm /tmp/gxde-kernel-manager-installer-status -f
|
||||
aptPath="apt"
|
||||
if [[ -f "/usr/bin/aptss" ]]; then
|
||||
# 如果 aptss 存在,则使用 aptss
|
||||
aptPath="aptss"
|
||||
fi
|
||||
$aptPath update
|
||||
rm -f "${kernelInstallerShellTempPath}"
|
11
shell/kernel-installer-upgrade-template.sh
Normal file
11
shell/kernel-installer-upgrade-template.sh
Normal file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
rm /tmp/gxde-kernel-manager-installer-status -f
|
||||
aptPath="apt"
|
||||
if [[ -f "/usr/bin/aptss" ]]; then
|
||||
# 如果 aptss 存在,则使用 aptss
|
||||
aptPath="aptss"
|
||||
fi
|
||||
$aptPath update
|
||||
$aptPath full-upgrade ${KernelList} -y
|
||||
rm -f "${kernelInstallerShellTempPath}"
|
@ -10,8 +10,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutwindow.ui" line="25"/>
|
||||
<source><html><head/><body><p><img width=128 src=":/icon/icon.svg"/></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<source><html><head/><body><p><a href='https://www.gxde.org'><img width=128 src=":/icon/gxde-kernel-manager.svg"/></a></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutwindow.ui" line="62"/>
|
||||
@ -19,21 +19,94 @@
|
||||
<translation>确定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutwindow.cpp" line="13"/>
|
||||
<location filename="../aboutwindow.cpp" line="18"/>
|
||||
<source>A kernel manager allows users to install or remove kernels easily.</source>
|
||||
<translation>GXDE 内核管理器是一个帮助用户更方便获取、安装、移除内核的工具。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutwindow.cpp" line="14"/>
|
||||
<location filename="../aboutwindow.cpp" line="19"/>
|
||||
<source>Warning: You may damage your system unless you know what you will do!</source>
|
||||
<translation>警告:请不要随意操作内核除非你知道你在做什么!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutwindow.cpp" line="17"/>
|
||||
<location filename="../aboutwindow.cpp" line="20"/>
|
||||
<source>Built Time: </source>
|
||||
<translation>构建时间: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutwindow.cpp" line="21"/>
|
||||
<source>QQ Group: 881201853</source>
|
||||
<translation>QQ 交流群:881201853</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutwindow.cpp" line="26"/>
|
||||
<source>Website</source>
|
||||
<translation>网址</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KernelInformationDialog</name>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="14"/>
|
||||
<source>Information</source>
|
||||
<translation>内核信息</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="28"/>
|
||||
<source><html><head/><body><p><img src=":/icon/tux.png"/></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="40"/>
|
||||
<location filename="../kernelinformationdialog.cpp" line="14"/>
|
||||
<source>Kernel Name:</source>
|
||||
<translation>内核名称:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="50"/>
|
||||
<location filename="../kernelinformationdialog.cpp" line="15"/>
|
||||
<source>Kernel Version:</source>
|
||||
<translation>内核版本:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="60"/>
|
||||
<location filename="../kernelinformationdialog.cpp" line="16"/>
|
||||
<source>Author:</source>
|
||||
<translation>维护者:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="70"/>
|
||||
<location filename="../kernelinformationdialog.cpp" line="24"/>
|
||||
<source>Kernel Architecture:</source>
|
||||
<translation>内核架构:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="94"/>
|
||||
<location filename="../kernelinformationdialog.cpp" line="23"/>
|
||||
<source>Package Name:</source>
|
||||
<translation>内核包名:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="104"/>
|
||||
<source>Description:</source>
|
||||
<translation>介绍:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="129"/>
|
||||
<source>Reconfigure</source>
|
||||
<translation>重新配置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="136"/>
|
||||
<source>Install</source>
|
||||
<translation>安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinformationdialog.ui" line="143"/>
|
||||
<source>Remove</source>
|
||||
<translation>卸载</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>KernelInstaller</name>
|
||||
<message>
|
||||
@ -46,7 +119,6 @@
|
||||
<translation>配置内核</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinstaller.ui" line="33"/>
|
||||
<location filename="../kernelinstaller.ui" line="46"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>文本标签</translation>
|
||||
@ -54,20 +126,35 @@
|
||||
<message>
|
||||
<location filename="../kernelinstaller.cpp" line="27"/>
|
||||
<source>Try to install </source>
|
||||
<translation>正在尝试安装 </translation>
|
||||
<translation>正在尝试安装内核 </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinstaller.cpp" line="30"/>
|
||||
<source>Try to remove </source>
|
||||
<translation>尝试移除 </translation>
|
||||
<translation>尝试移除内核 </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinstaller.cpp" line="135"/>
|
||||
<location filename="../kernelinstaller.cpp" line="33"/>
|
||||
<source>Try to reconfigure </source>
|
||||
<translation>尝试重新配置内核 </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinstaller.cpp" line="36"/>
|
||||
<source>Try to update apt cache</source>
|
||||
<translation>尝试刷新 apt 缓存</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinstaller.cpp" line="39"/>
|
||||
<source>Try to upgrade </source>
|
||||
<translation>尝试升级 </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinstaller.cpp" line="156"/>
|
||||
<source>Done</source>
|
||||
<translation>完成</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../kernelinstaller.cpp" line="140"/>
|
||||
<location filename="../kernelinstaller.cpp" line="161"/>
|
||||
<source>Something error, exit code: </source>
|
||||
<translation>出现错误,退出代码: </translation>
|
||||
</message>
|
||||
@ -84,102 +171,186 @@
|
||||
<translation>GXDE 内核管理器</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="43"/>
|
||||
<location filename="../mainwindow.ui" line="49"/>
|
||||
<source>TextLabel</source>
|
||||
<translation>文本标签</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="63"/>
|
||||
<location filename="../mainwindow.ui" line="69"/>
|
||||
<source>Show local PC architecture only</source>
|
||||
<translation>支持当前架构</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="79"/>
|
||||
<source>Refresh</source>
|
||||
<translation>刷新</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="70"/>
|
||||
<location filename="../mainwindow.ui" line="86"/>
|
||||
<source>Reconfigure</source>
|
||||
<translation>重新配置</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="93"/>
|
||||
<source>Install</source>
|
||||
<translation>安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="77"/>
|
||||
<location filename="../mainwindow.ui" line="100"/>
|
||||
<source>Remove</source>
|
||||
<translation>卸载</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="96"/>
|
||||
<location filename="../mainwindow.ui" line="119"/>
|
||||
<source>Program</source>
|
||||
<translation>程序</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="102"/>
|
||||
<location filename="../mainwindow.ui" line="125"/>
|
||||
<source>Help</source>
|
||||
<translation>帮助</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="115"/>
|
||||
<location filename="../mainwindow.ui" line="138"/>
|
||||
<source>Apt</source>
|
||||
<translation>Apt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="146"/>
|
||||
<source>Grub</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="158"/>
|
||||
<source>Exit</source>
|
||||
<translation>退出</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="120"/>
|
||||
<location filename="../mainwindow.ui" line="163"/>
|
||||
<source>About</source>
|
||||
<translation>关于</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="125"/>
|
||||
<location filename="../mainwindow.ui" line="168"/>
|
||||
<source>Gitee</source>
|
||||
<translation>Gitee</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="130"/>
|
||||
<location filename="../mainwindow.ui" line="173"/>
|
||||
<source>Github</source>
|
||||
<translation>Github</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="21"/>
|
||||
<location filename="../mainwindow.ui" line="178"/>
|
||||
<source>Update apt cache</source>
|
||||
<translation>刷新 apt 缓存</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="183"/>
|
||||
<source>About QT</source>
|
||||
<translation>关于 QT</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="188"/>
|
||||
<source>Upgrade</source>
|
||||
<translation>升级</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="193"/>
|
||||
<source>Donate</source>
|
||||
<translation>请作者喝杯茶</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="198"/>
|
||||
<source>Sourceforge</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.ui" line="203"/>
|
||||
<source>Update Grub</source>
|
||||
<translation>刷新 Grub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="25"/>
|
||||
<source>Kernel: </source>
|
||||
<translation>内核: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="21"/>
|
||||
<location filename="../mainwindow.cpp" line="25"/>
|
||||
<source>Arch: </source>
|
||||
<translation>架构: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="34"/>
|
||||
<location filename="../mainwindow.cpp" line="37"/>
|
||||
<source>ID</source>
|
||||
<translation>ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="34"/>
|
||||
<location filename="../mainwindow.cpp" line="37"/>
|
||||
<source>Kernel Name</source>
|
||||
<translation>内核名称</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="34"/>
|
||||
<location filename="../mainwindow.cpp" line="37"/>
|
||||
<source>Author</source>
|
||||
<translation>维护者</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="34"/>
|
||||
<location filename="../mainwindow.cpp" line="37"/>
|
||||
<source>Arch</source>
|
||||
<translation>架构</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="34"/>
|
||||
<location filename="../mainwindow.cpp" line="37"/>
|
||||
<source>Installed</source>
|
||||
<translation>是否安装</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="63"/>
|
||||
<location filename="../mainwindow.cpp" line="106"/>
|
||||
<location filename="../mainwindow.cpp" line="37"/>
|
||||
<source>Description</source>
|
||||
<translation>描述</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="37"/>
|
||||
<source>Version</source>
|
||||
<translation>版本</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="93"/>
|
||||
<location filename="../mainwindow.cpp" line="147"/>
|
||||
<location filename="../mainwindow.cpp" line="182"/>
|
||||
<location filename="../mainwindow.cpp" line="230"/>
|
||||
<source>Error</source>
|
||||
<translation>错误</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="63"/>
|
||||
<location filename="../mainwindow.cpp" line="106"/>
|
||||
<location filename="../mainwindow.cpp" line="93"/>
|
||||
<location filename="../mainwindow.cpp" line="147"/>
|
||||
<location filename="../mainwindow.cpp" line="182"/>
|
||||
<location filename="../mainwindow.cpp" line="230"/>
|
||||
<source>Nothing to choose</source>
|
||||
<translation>没有选择任何选项</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="156"/>
|
||||
<source>Warning</source>
|
||||
<translation>警告</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="157"/>
|
||||
<source>Are you sure you want to remove all installed kernel versions? Please note that this may render your system unstable or unbootable.</source>
|
||||
<translation>你确定要移除所有的内核?如果移除后你的系统将无法正常启动。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="158"/>
|
||||
<source>Confirm</source>
|
||||
<translation>确定</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="159"/>
|
||||
<source>Cancel</source>
|
||||
<translation>取消</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
|
Loading…
x
Reference in New Issue
Block a user