diff --git a/NEWS.md b/NEWS.md
index 07bf110e..60d437b3 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,6 @@
+Red Panda C++ Version 0.14.1
+ - enhancement: custom theme
+
Red Panda C++ Version 0.14.0
- enhancement: custom icon set ( in the configuration folder)
- enhancement: show custom icon set folder in options -> enviroment -> folders
diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.qm b/RedPandaIDE/RedPandaIDE_zh_CN.qm
index 3b864c45..e8803827 100644
Binary files a/RedPandaIDE/RedPandaIDE_zh_CN.qm and b/RedPandaIDE/RedPandaIDE_zh_CN.qm differ
diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts
index f299b572..7d735c6f 100644
--- a/RedPandaIDE/RedPandaIDE_zh_CN.ts
+++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts
@@ -129,14 +129,23 @@ p, li { white-space: pre-wrap; }
AppTheme
-
+
+
+ 主题文件"%1"不存在!
+
+
+
JSON文件'%1':%2中存在错误:%3
-
+
+
+ 无法读取主题文件"%1"!
+
+
- 无法读取文件'%1'.
+ 无法读取文件'%1'.
@@ -1993,12 +2002,17 @@ Are you really want to continue?
主题:
-
+
+
+ 使用自定义主题
+
+
+
图标集:
-
+
使用自定义图标
@@ -2157,12 +2171,17 @@ Are you really want to continue?
EnvironmentShortcutModel
-
+
+
+ 动作
+
+
+
功能
-
+
快捷键
@@ -2178,7 +2197,7 @@ Are you really want to continue?
ExecutableRunner
-
+
The runner process failed to start.
无法启动程序运行进程'%1'。
@@ -2188,17 +2207,17 @@ Are you really want to continue?
程序运行进程启动后崩溃。
-
+
waitFor()函数等待超时。
-
+
在向程序运行进程写入内容时出错。
-
+
在从程序运行进程读取内容时出错。
@@ -3235,51 +3254,51 @@ Are you really want to continue?
MainWindow
-
+
小熊猫C++
-
+
-
-
-
-
-
+
+
+
+
+
编译器
-
+
编译日志
-
+
文件
-
+
工具
-
-
+
+
运行
-
+
编辑
-
+
项目
@@ -3297,7 +3316,7 @@ Are you really want to continue?
结构
-
+
文件
@@ -3307,85 +3326,85 @@ Are you really want to continue?
资源
-
-
-
-
+
+
+
+
调试
-
+
求值
-
-
+
+
调试主控台
-
+
调用栈
-
+
断点
-
+
局部变量
-
-
+
+
查找
-
+
历史:
-
+
重新查找
-
+
替换为:
-
+
替换
-
+
关闭
-
+
运行
-
-
+
+
代码
-
+
窗口
@@ -3398,766 +3417,766 @@ Are you really want to continue?
工具栏2
-
+
新建
-
+
Ctrl+N
-
+
打开...
-
+
Ctrl+O
-
+
保存
-
+
Ctrl+S
-
+
另存为...
-
+
另存为
-
+
全部保存
-
+
Ctrl+Shift+S
-
+
选项
-
-
-
-
-
+
+
+
+
+
编译
-
+
F9
-
+
F10
-
+
恢复
-
+
Ctrl+Z
-
+
重做
-
+
Ctrl+Y
-
+
剪切
-
+
Ctrl+X
-
-
-
+
+
+
复制
-
+
Ctrl+C
-
-
+
+
粘贴
-
+
Ctrl+V
-
-
+
+
选择全部
-
+
Ctrl+A
-
+
缩进
-
+
取消缩进
-
+
切换注释
-
+
Ctrl+/
-
+
全部收起
-
+
全部展开
-
+
使用ANSI编码
-
+
使用UTF-8编码
-
+
自动检测
-
+
转换为ANSI编码
-
+
转换为UTF-8编码
-
-
+
+
编译运行
-
+
F11
-
-
+
+
全部重编译
-
+
F12
-
+
停止执行
-
+
F6
-
+
F5
-
+
单步跳过
-
+
F7
-
+
单步进入
-
-
+
+
-
+
试题集
-
-
+
+
新建试题集
-
+
添加试题
-
+
删除试题
-
-
+
+
保存试题集
-
-
+
+
载入试题集
-
+
内存
-
+
Address:
地址表达式:
-
+
取消
-
+
TODO
-
+
书签
-
-
+
+
-
+
试题
-
+
添加试题案例
-
+
Remove Problem Set
删除试题集
-
+
打开答案源代码文件
-
+
Run Current Case
运行所有案例
-
+
测试案例验证选项
-
+
%v/%m
-
+
输出
-
+
输入
-
+
期望输出
-
+
帮助
-
+
重构
-
+
视图
-
+
工具窗口
-
+
主工具栏
-
+
编译器配置集
-
-
+
+
新建源代码文件
-
+
Tab
-
+
Shift+Tab
-
+
F8
-
+
单步跳出
-
+
Ctrl+F8
-
+
执行到光标处
-
+
Ctrl+F5
-
+
继续执行
-
+
F4
-
+
添加监视
-
+
打开CPU信息窗口...
-
+
退出
-
+
查找...
-
+
Ctrl+F
-
+
在文件中查找...
-
+
Ctrl+Shift+F
-
+
替换
-
+
Ctrl+R
-
+
查找下一个
-
+
F3
-
+
查找前一个
-
+
Shift+F3
-
+
删除监视值
-
+
Remove All
删除全部监视值
-
+
修改监视值
-
+
对代码重新排版
-
+
Ctrl+Shift+A
-
+
前一次编辑位置
-
+
Ctrl+Alt+Left
-
+
后一次编辑位置
-
+
Ctrl+Alt+Right
-
+
Ctrl+W
-
+
全部关闭
-
+
Ctrl+Shift+W
-
+
最大化编辑器
-
+
Ctrl+F11
-
+
下一窗口
-
+
Ctrl+Tab
-
+
前一窗口
-
+
Ctrl+Shift+Tab
-
+
切换断点
-
+
Ctrl+F4
-
-
+
+
删除所有断点
-
+
设置断点条件...
-
+
跳转到声明处
-
+
跳转到定义处
-
+
查找符号的引用
-
+
打开所在的文件夹
-
+
Ctrl+B
-
+
打开命令行窗口
-
+
文件属性...
-
+
关闭项目
-
+
项目属性
-
+
新建项目...
-
+
新建项目文件
-
+
添加到项目...
-
+
从项目删除
-
+
查看Makefile
-
+
清理构建文件
-
+
在浏览器中打开
-
+
在终端中打开
-
+
关于
-
-
+
+
重命名符号
-
+
Shift+F6
-
+
打印...
-
+
Ctrl+P
-
-
+
+
导出为RTF
-
-
+
+
导出为HTML
-
+
移动到其他视图
-
+
Ctrl+M
@@ -4299,7 +4318,7 @@ Are you really want to continue?
-
+
打开文件夹
@@ -4309,42 +4328,42 @@ Are you really want to continue?
运行参数...
-
+
文件编码
-
+
文件历史
-
-
-
-
-
-
+
+
+
+
+
+
正在调试
-
-
-
-
-
-
+
+
+
+
+
+
正在运行
-
-
-
-
-
-
+
+
+
+
+
+
正在编译
@@ -4353,193 +4372,193 @@ Are you really want to continue?
行:%1 列:%2 已选择:%3 总行数:%4 总长度:%5
-
+
Line: %1 Col: %2 Selected: %3 Lines: %4 Length: %5
行: %1 列: %2 已选择 :%3 总行数: %4 总长度: %5
-
+
只读
-
+
插入
-
+
覆写
-
+
关闭项目
-
+
你确定要关闭'%1'吗?
-
-
+
+
确认
-
-
-
+
+
+
源文件尚未编译。
-
-
+
+
现在编译?
-
-
+
+
源文件比可执行程序新。
-
+
重新编译?
-
+
无编译器设置
-
+
没有配置编译器设置。
-
+
无法启动调试器
-
-
+
+
启用调试参数
-
-
+
+
当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题?
-
+
项目尚未构建
-
+
项目尚未构建。是否构建?
-
+
宿主程序不存在
-
+
动态链接库(DLL)需要一个宿主程序来运行。
-
+
但它不存在。
-
+
宿主程序不存在
-
+
宿主程序'%1'不存在。
-
+
重新编译?
-
-
+
+
保存上次打开信息失败
-
+
无法删除旧上次打开信息文件'%1'
-
+
无法保存上次打开信息文件'%1'
-
+
载入上次打开信息失败
-
+
无法载入上次打开信息文件'%1'
-
+
打开源代码文件
-
+
显示详细调试器日志
-
+
全部复制
-
-
+
+
清除
-
+
导出
-
+
插入代码段
-
-
+
+
试题集%1
@@ -4560,68 +4579,68 @@ Are you really want to continue?
或者选择使用其他的网络端口。
-
-
+
+
重新构建项目
-
-
+
+
项目已经被修改过,是否需要重新构建?
-
+
自动保存出错
-
+
自动保存"%1"到"%2"失败:%3
-
+
试题属性...
-
+
设置试题集名称
-
+
试题集名称:
-
+
删除
-
+
删除全部书签
-
+
修改描述
-
-
-
+
+
+
书签描述
-
-
-
+
+
+
描述:
@@ -4630,240 +4649,240 @@ Are you really want to continue?
在调试主控台中显示调试器输出
-
+
清除这次搜索
-
+
删除所有搜索
-
+
断点条件...
-
+
断点条件
-
+
输入当前断点的生效条件:
-
+
Remove all breakpoints
删除所有断点
-
+
删除当前断点
-
+
重命名文件
-
-
+
+
添加文件夹
-
+
新文件夹
-
+
文件夹:
-
+
重命名
-
+
删除文件夹
-
+
按类型排序
-
+
按名称排序
-
+
显示继承的成员
-
+
跳转到声明处
-
+
跳转到定义处
-
+
在编辑器中打开
-
+
使用外部程序打开
-
+
在终端中打开
-
+
在Windows浏览器中打开
-
+
字符集
-
+
已自动保存%1个文件
-
+
设置答案源代码...
-
+
选择其他文件...
-
+
选择答案源代码文件
-
+
C/C++Source Files (*.c *.cpp *.cc *.cxx
C/C++源代码文件 (*.c *.cpp *.cc *.cxx)
-
+
保存项目
-
+
项目'%1'有改动。
-
-
+
+
需要保存吗?
-
-
+
+
文件已发生变化
-
+
新建项目文件?
-
+
您是否要将新建的文件加入项目?
-
-
-
-
+
+
+
+
保存失败
-
+
改变项目编译器配置集
-
+
改变项目的编译器配置集会导致所有的自定义编译器选项被重置。
-
+
你真的想要做那些吗?
-
+
您真的要清除该文件的所有断点吗?
-
+
新建项目
-
+
关闭'%1'以打开新项目?
-
+
文件夹不存在
-
+
文件夹'%1'不存在。是否创建?
-
+
无法创建文件夹
-
+
创建文件夹'%1'失败。
-
+
@@ -4872,222 +4891,227 @@ Are you really want to continue?
小熊猫Dev-C++项目文件 (*.dev)
-
+
新建项目失败
-
+
无法使用模板创建项目
-
+
删除文件
-
+
同时从硬盘上删除文件?
-
+
无标题
-
+
新的项目文件名
-
+
文件名:
-
+
文件已存在!
-
+
文件'%1'已经存在!
-
+
添加到项目
-
+
小熊猫C++项目文件(*.dev)
-
+
重命名出错
-
+
符号'%1'在系统头文件中定义,无法修改。
-
+
新名称
-
-
+
+
替换出错
-
+
无法打开文件'%1'进行替换!
-
+
内容和上次查找时不一致。
-
+
RTF格式文件 (*.rtf)
-
+
HTML文件 (*.html)
-
+
当前的试题集不是空的。
-
+
试题%1
-
-
+
+
试题集文件 (*.pbs)
-
+
载入失败
-
-
+
+
试题案例%1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
错误
-
+
项目历史
-
+
+
+ 载入主题失败
+
+
+
磁盘文件'%1'已被修改。
-
+
是否重新读取它的内容?
-
+
磁盘文件'%1'已被删除。
-
+
是否保持它在小熊猫C++中打开的编辑窗口?
-
+
打开
-
+
编译失败
-
+
运行失败
-
+
确认转换
-
+
当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗?
-
+
新监视表达式
-
+
输入监视表达式
-
+
(%1/%2)正在解析文件"%3"
-
-
+
+
完成%1个文件的解析,用时%2秒
-
+
(每秒%1个文件)
@@ -5144,7 +5168,7 @@ Are you really want to continue?
源文件名:
-
+
路径
@@ -5210,22 +5234,22 @@ Are you really want to continue?
OJProblemCasesRunner
-
+
无法启动程序运行进程'%1'。
-
+
waitFor()函数等待超时。
-
+
在向程序运行进程写入内容时出错。
-
+
在从程序运行进程读取内容时出错。
@@ -6000,7 +6024,7 @@ Are you really want to continue?
QApplication
-
+
错误
@@ -6075,200 +6099,200 @@ Are you really want to continue?
无法载入自动链接设置
-
-
-
-
+
+
+
+
下列%1文件夹不存在:
-
-
+
+
二进制
-
+
未指定%1文件夹
-
+
C包含
-
-
+
+
C++包含
-
-
-
-
+
+
+
+
无法找到%1程序"%2"
-
+
C编译器
-
+
C++编译器
-
+
构建程序(Make)
-
+
调试器
-
+
C语言选项
-
+
支持所有ANSI标准C程序(-ansi)
-
+
不支持将asm、inline和typeof作为关键字(-fno-asm)
-
+
模仿传统C预处理器行为(-traditional-cpp)
-
+
代码生成
-
+
生成特定机器的专用指令(-march)
-
+
完整兼容特定机器,较少优化(-tune)
-
+
启用特定指令集(-mx)
-
+
优化级别(-Ox)
-
+
使用下列指针大小编译(-mx)
-
+
语言标准(-std)
-
+
性能分析
-
+
生成调试信息(-g3)
-
+
您同意小熊猫C++在PATH路径中寻找gcc编译器吗?
-
+
生成性能分析信息(-pg)
-
+
代码警告
-
+
忽略所有警告信息(-w)
-
+
启用常见问题警告(-Wall)
-
+
启用更多问题警告(-Wextra)
-
+
检查ISO C/C++/C++0x语法一致性(-pedantic)
-
+
只进行语法检查(不编译)(-fsyntax-only)
-
+
将警告作为错误处理(-Werror)
-
+
遇到第一个错误后立即中止编译(-Wfatal-errors)
-
+
链接器
-
+
链接Objective-C程序 (-lobjc)
-
+
不使用标准库和系统启动文件(-nostdlib)
-
+
不产生控制台窗口(-mwindows)
-
+
剥除附加信息(-s)
@@ -6277,54 +6301,54 @@ Are you really want to continue?
链接Ojbective C程序(-lobjc)
-
+
输出
-
+
在生成的汇编代码中加入注释(-fverbose-asm)
-
+
编译时使用管道而不是临时文件(-pipe)
-
+
只生成汇编代码(-S)
-
-
+
+
确认
-
+
在验证编译器设置"%1"时遇到了下列问题:
-
+
是否让小熊猫C++删除这些配置,并尝试重新建立配置?
-
+
如果仍然保留这些设置,可能会导致编译错误。<br /><br />请选择“是”,除非您清楚的知道选择“否”的后果,
-
+
未配置编译器设置。
-
+
您需要小熊猫C++在下列位置搜索编译器吗:<br />%1<br />%2
@@ -6676,12 +6700,12 @@ Are you really want to continue?
无标题
-
+
构造函数
-
+
析构函数
@@ -7158,7 +7182,7 @@ Are you really want to continue?
自动链接
-
+
@@ -7234,15 +7258,15 @@ Are you really want to continue?
杂项
-
-
+
+
程序运行
-
+
试题集
diff --git a/RedPandaIDE/colorscheme.cpp b/RedPandaIDE/colorscheme.cpp
index f73ab5fd..e5f7befb 100644
--- a/RedPandaIDE/colorscheme.cpp
+++ b/RedPandaIDE/colorscheme.cpp
@@ -275,11 +275,11 @@ void ColorManager::reload()
{
mSchemes.clear();
//bundled schemes ( the lowest priority)
- loadSchemesInDir(pSettings->dirs().data(Settings::Dirs::DataType::ColorSheme),true,false);
+ loadSchemesInDir(pSettings->dirs().data(Settings::Dirs::DataType::ColorScheme),true,false);
//config schemes ( higher priority)
- loadSchemesInDir(pSettings->dirs().config(Settings::Dirs::DataType::ColorSheme),false,false);
+ loadSchemesInDir(pSettings->dirs().config(Settings::Dirs::DataType::ColorScheme),false,false);
//customed schemes ( highest priority)
- loadSchemesInDir(pSettings->dirs().config(Settings::Dirs::DataType::ColorSheme),false,true);
+ loadSchemesInDir(pSettings->dirs().config(Settings::Dirs::DataType::ColorScheme),false,true);
}
QStringList ColorManager::getSchemes(const QString &themeType)
@@ -731,9 +731,9 @@ QString ColorManager::generateFullPathname(const QString &name, bool isBundled,
{
QString filename = generateFilename(name,isCustomed);
if (isBundled && !isCustomed) {
- return includeTrailingPathDelimiter(pSettings->dirs().data(Settings::Dirs::DataType::ColorSheme))+filename;
+ return includeTrailingPathDelimiter(pSettings->dirs().data(Settings::Dirs::DataType::ColorScheme))+filename;
} else {
- return includeTrailingPathDelimiter(pSettings->dirs().config(Settings::Dirs::DataType::ColorSheme))+filename;
+ return includeTrailingPathDelimiter(pSettings->dirs().config(Settings::Dirs::DataType::ColorScheme))+filename;
}
}
diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp
index 5d4d887f..8c06ff03 100644
--- a/RedPandaIDE/mainwindow.cpp
+++ b/RedPandaIDE/mainwindow.cpp
@@ -567,16 +567,27 @@ void MainWindow::updateEditorColorSchemes()
void MainWindow::applySettings()
{
ThemeManager themeManager;
- PAppTheme appTheme = themeManager.theme(pSettings->environment().theme());
- if (appTheme->isDark())
- QApplication::setStyle(new DarkFusionStyle());
- else
- QApplication::setStyle(new LightFusionStyle());
- qApp->setPalette(appTheme->palette());
- //fix for qstatusbar bug
- mFileEncodingStatus->setPalette(appTheme->palette());
- mFileModeStatus->setPalette(appTheme->palette());
- mFileInfoStatus->setPalette(appTheme->palette());
+ if (pSettings->environment().useCustomTheme()) {
+ themeManager.prepareCustomeTheme();
+ }
+ themeManager.setUseCustomTheme(pSettings->environment().useCustomTheme());
+ try {
+ PAppTheme appTheme = themeManager.theme(pSettings->environment().theme());
+ if (appTheme->isDark())
+ QApplication::setStyle(new DarkFusionStyle());
+ else
+ QApplication::setStyle(new LightFusionStyle());
+ qApp->setPalette(appTheme->palette());
+ //fix for qstatusbar bug
+ mFileEncodingStatus->setPalette(appTheme->palette());
+ mFileModeStatus->setPalette(appTheme->palette());
+ mFileInfoStatus->setPalette(appTheme->palette());
+ } catch (FileError e) {
+ QMessageBox::critical(this,
+ tr("Load Theme Error"),
+ e.reason());
+ }
+
updateEditorColorSchemes();
QFont font(pSettings->environment().interfaceFont());
@@ -1182,6 +1193,7 @@ void MainWindow::updateActionIcons()
ui->actionNew->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_NEW));
ui->actionNew_Project->setIcon(pIconsManager->getIcon(IconsManager::ACTION_PROJECT_NEW));
ui->actionOpen->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_OPEN));
+ ui->actionOpen_Folder->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_OPEN_FOLDER));
ui->actionSave->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_SAVE));
ui->actionSaveAs->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_SAVE_AS));
ui->actionSaveAll->setIcon(pIconsManager->getIcon(IconsManager::ACTION_FILE_SAVE_ALL));
diff --git a/RedPandaIDE/settings.cpp b/RedPandaIDE/settings.cpp
index 7f89043f..036501da 100644
--- a/RedPandaIDE/settings.cpp
+++ b/RedPandaIDE/settings.cpp
@@ -208,10 +208,12 @@ QString Settings::Dirs::data(Settings::Dirs::DataType dataType) const
switch (dataType) {
case DataType::None:
return dataDir;
- case DataType::ColorSheme:
+ case DataType::ColorScheme:
return ":/colorschemes/colorschemes";
case DataType::IconSet:
return ":/resources/iconsets";
+ case DataType::Theme:
+ return ":/themes";
}
return "";
}
@@ -224,10 +226,12 @@ QString Settings::Dirs::config(Settings::Dirs::DataType dataType) const
switch (dataType) {
case DataType::None:
return configDir;
- case DataType::ColorSheme:
+ case DataType::ColorScheme:
return includeTrailingPathDelimiter(configDir)+"scheme";
case DataType::IconSet:
return includeTrailingPathDelimiter(configDir)+"iconsets";
+ case DataType::Theme:
+ return includeTrailingPathDelimiter(configDir)+"themes";
}
return "";
}
@@ -2900,6 +2904,7 @@ void Settings::Environment::doLoad()
mLanguage = stringValue("language", QLocale::system().name());
mIconSet = stringValue("icon_set","newlook");
mUseCustomIconSet = boolValue("use_custom_icon_set", false);
+ mUseCustomTheme = boolValue("use_custom_theme", false);
mCurrentFolder = stringValue("current_folder",QDir::currentPath());
@@ -3001,6 +3006,16 @@ void Settings::Environment::setUseCustomIconSet(bool newUseCustomIconSet)
mUseCustomIconSet = newUseCustomIconSet;
}
+bool Settings::Environment::useCustomTheme() const
+{
+ return mUseCustomTheme;
+}
+
+void Settings::Environment::setUseCustomTheme(bool newUseCustomTheme)
+{
+ mUseCustomTheme = newUseCustomTheme;
+}
+
void Settings::Environment::doSave()
{
//Appearence
@@ -3010,6 +3025,7 @@ void Settings::Environment::doSave()
saveValue("language", mLanguage);
saveValue("icon_set",mIconSet);
saveValue("use_custom_icon_set", mUseCustomIconSet);
+ saveValue("use_custom_theme", mUseCustomTheme);
saveValue("current_folder",mCurrentFolder);
saveValue("default_open_folder",mDefaultOpenFolder);
diff --git a/RedPandaIDE/settings.h b/RedPandaIDE/settings.h
index 1338b0ab..0b49aacf 100644
--- a/RedPandaIDE/settings.h
+++ b/RedPandaIDE/settings.h
@@ -102,8 +102,9 @@ public:
public:
enum class DataType {
None,
- ColorSheme,
- IconSet
+ ColorScheme,
+ IconSet,
+ Theme
};
explicit Dirs(Settings * settings);
QString appDir() const;
@@ -523,6 +524,9 @@ public:
bool useCustomIconSet() const;
void setUseCustomIconSet(bool newUseCustomIconSet);
+ bool useCustomTheme() const;
+ void setUseCustomTheme(bool newUseCustomTheme);
+
private:
//Appearence
@@ -533,6 +537,7 @@ public:
QString mCurrentFolder;
QString mIconSet;
bool mUseCustomIconSet;
+ bool mUseCustomTheme;
QString mDefaultOpenFolder;
QString mTerminalPath;
diff --git a/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp b/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp
index 3f3b598f..1a509188 100644
--- a/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp
+++ b/RedPandaIDE/settingsdialog/environmentappearencewidget.cpp
@@ -53,6 +53,7 @@ void EnvironmentAppearenceWidget::doLoad()
ui->spinFontSize->setValue(pSettings->environment().interfaceFontSize());
ui->cbIconSet->setCurrentText(pSettings->environment().iconSet());
ui->chkUseCustomIconSet->setChecked(pSettings->environment().useCustomIconSet());
+ ui->chkUseCustomTheme->setChecked(pSettings->environment().useCustomTheme());
for (int i=0;icbLanguage->count();i++) {
if (ui->cbLanguage->itemData(i) == pSettings->environment().language()) {
@@ -78,6 +79,7 @@ void EnvironmentAppearenceWidget::doSave()
pSettings->environment().setLanguage(ui->cbLanguage->currentData().toString());
pSettings->environment().setIconSet(ui->cbIconSet->currentText());
pSettings->environment().setUseCustomIconSet(ui->chkUseCustomIconSet->isChecked());
+ pSettings->environment().setUseCustomTheme(ui->chkUseCustomTheme->isChecked());
pSettings->editor().save();
pSettings->environment().save();
diff --git a/RedPandaIDE/settingsdialog/environmentappearencewidget.ui b/RedPandaIDE/settingsdialog/environmentappearencewidget.ui
index 4a5dc4f7..1b212565 100644
--- a/RedPandaIDE/settingsdialog/environmentappearencewidget.ui
+++ b/RedPandaIDE/settingsdialog/environmentappearencewidget.ui
@@ -152,6 +152,13 @@
-
+ -
+
+
+ Use custom theme
+
+
+
-
diff --git a/RedPandaIDE/thememanager.cpp b/RedPandaIDE/thememanager.cpp
index bf753703..65ea3199 100644
--- a/RedPandaIDE/thememanager.cpp
+++ b/RedPandaIDE/thememanager.cpp
@@ -23,8 +23,10 @@
#include
#include
#include "utils.h"
+#include "settings.h"
-ThemeManager::ThemeManager(QObject *parent) : QObject(parent)
+ThemeManager::ThemeManager(QObject *parent) : QObject(parent),
+ mUseCustomTheme(false)
{
}
@@ -32,10 +34,33 @@ ThemeManager::ThemeManager(QObject *parent) : QObject(parent)
PAppTheme ThemeManager::theme(const QString &themeName)
{
PAppTheme appTheme = std::make_shared();
- appTheme->load(QString(":/themes/%1.json").arg(themeName));
+ QString themeDir;
+ if (mUseCustomTheme)
+ themeDir = pSettings->dirs().config(Settings::Dirs::DataType::Theme);
+ else
+ themeDir = pSettings->dirs().data(Settings::Dirs::DataType::Theme);
+ appTheme->load(QString("%1/%2.json").arg(themeDir, themeName));
return appTheme;
}
+bool ThemeManager::useCustomTheme() const
+{
+ return mUseCustomTheme;
+}
+
+void ThemeManager::setUseCustomTheme(bool newUseCustomTheme)
+{
+ mUseCustomTheme = newUseCustomTheme;
+}
+
+void ThemeManager::prepareCustomeTheme()
+{
+
+ if (QFile(pSettings->dirs().config(Settings::Dirs::DataType::Theme)).exists())
+ return;
+ copyFolder(pSettings->dirs().data(Settings::Dirs::DataType::Theme),pSettings->dirs().config(Settings::Dirs::DataType::Theme));
+}
+
AppTheme::AppTheme(QObject *parent):QObject(parent)
{
@@ -116,8 +141,10 @@ QPalette AppTheme::palette() const
void AppTheme::load(const QString &filename)
{
QFile file(filename);
- if (!file.exists())
- return;
+ if (!file.exists()) {
+ throw FileError(tr("Theme file '%1' doesn't exist!")
+ .arg(filename));
+ }
if (file.open(QFile::ReadOnly)) {
QByteArray content = file.readAll();
QJsonParseError error;
@@ -144,7 +171,7 @@ void AppTheme::load(const QString &filename)
}
} else {
- throw FileError(tr("Can't open file '%1' for read.")
+ throw FileError(tr("Can't open the theme file '%1' for read.")
.arg(filename));
}
}
diff --git a/RedPandaIDE/thememanager.h b/RedPandaIDE/thememanager.h
index 573a53db..f09cbeb7 100644
--- a/RedPandaIDE/thememanager.h
+++ b/RedPandaIDE/thememanager.h
@@ -102,6 +102,12 @@ class ThemeManager : public QObject
public:
explicit ThemeManager(QObject *parent = nullptr);
PAppTheme theme(const QString& themeName);
+ bool useCustomTheme() const;
+ void setUseCustomTheme(bool newUseCustomTheme);
+ void prepareCustomeTheme();
+
+private:
+ bool mUseCustomTheme;
};
#endif // THEMEMANAGER_H
diff --git a/RedPandaIDE/utils.cpp b/RedPandaIDE/utils.cpp
index dedeae41..3b899332 100644
--- a/RedPandaIDE/utils.cpp
+++ b/RedPandaIDE/utils.cpp
@@ -1120,7 +1120,6 @@ void copyFolder(const QString &fromDir, const QString &toDir)
if(!fileInfo.isHidden()) { //filters dot and dotdot
const QString subPathStructure = fileInfo.absoluteFilePath().mid(absSourcePathLength);
const QString constructedAbsolutePath = targetDir.absolutePath() + subPathStructure;
- qDebug()<