diff --git a/NEWS.md b/NEWS.md
index 9f962658..3b93a500 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,15 +1,17 @@
- - change: rename "compile log" panel to "tools output"
- - fix: debug panel can't be correctly show/hide
- - enhancement: redesign tools output's context menu, add "clear" menu item
- - enhancement: tools -> git in the options dialog
- - enhancement: auto detect git in PATH
- - enhancement: basic git commands
-
Red Panda C++ Version 0.14.3
- fix: wrong code completion font size, when screen dpi changed
- enhancement: replace Files View Panel's path lineedit control with combo box
- enhancement: custome icons for project view
- fix: convert to encoding setting in compiler set option not correctly handled
+ - change: rename "compile log" panel to "tools output"
+ - fix: debug panel can't be correctly show/hide
+ - enhancement: redesign tools output's context menu, add "clear" menu item
+ - enhancement: tools -> git in the options dialog
+ - enhancement: auto detect git in PATH
+ - enhancement: git - create repository
+ - enhancement: git - add files
+ - enhancement: git - commit
+ - enhancement: git - restore
Red Panda C++ Version 0.14.2
- enhancement: file system view mode for project
diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro
index f1befd7e..82b78de5 100644
--- a/RedPandaIDE/RedPandaIDE.pro
+++ b/RedPandaIDE/RedPandaIDE.pro
@@ -93,6 +93,7 @@ SOURCES += \
toolsmanager.cpp \
vcs/gitmanager.cpp \
vcs/gitrepository.cpp \
+ vcs/gitutils.cpp \
widgets/aboutdialog.cpp \
widgets/bookmarkmodel.cpp \
widgets/classbrowser.cpp \
@@ -224,6 +225,7 @@ HEADERS += \
toolsmanager.h \
vcs/gitmanager.h \
vcs/gitrepository.h \
+ vcs/gitutils.h \
widgets/aboutdialog.h \
widgets/bookmarkmodel.h \
widgets/classbrowser.h \
diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts
index f8930252..7a4ba211 100644
--- a/RedPandaIDE/RedPandaIDE_zh_CN.ts
+++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts
@@ -581,7 +581,7 @@ p, li { white-space: pre-wrap; }
[说明]
-
+
无法启动编译器进程'%1'。
@@ -590,27 +590,27 @@ p, li { white-space: pre-wrap; }
无法启动编译进程。
-
+
编译进程启动后崩溃。
-
+
waitFor()函数等待超时。
-
+
在向编译进程输入内容时出错。
-
+
在从编译进程读取内容时出错。
-
+
发生了未知错误。
@@ -3099,7 +3099,7 @@ Are you really want to continue?
GitManager
-
+
文件夹"%1"中已存在仓库!
@@ -3273,18 +3273,18 @@ Are you really want to continue?
MainWindow
-
+
小熊猫C++
-
-
-
-
-
-
-
+
+
+
+
+
+
+
编译器
@@ -3293,48 +3293,48 @@ Are you really want to continue?
编译日志
-
+
文件
-
+
工具
-
-
+
+
运行
-
+
编辑
-
-
+
+
项目
-
+
监视
-
+
结构
-
+
文件
@@ -3343,85 +3343,85 @@ Are you really want to continue?
资源
-
-
-
-
-
+
+
+
+
+
调试
-
+
求值
-
-
+
+
调试主控台
-
+
调用栈
-
+
断点
-
+
局部变量
-
-
-
+
+
+
查找
-
+
历史:
-
+
重新查找
-
+
替换为:
-
+
替换
-
+
关闭
-
+
运行
-
-
+
+
代码
-
+
窗口
@@ -3434,408 +3434,408 @@ Are you really want to continue?
工具栏2
-
+
新建
-
+
Ctrl+N
-
+
打开...
-
+
Ctrl+O
-
+
保存
-
+
Ctrl+S
-
+
另存为...
-
+
另存为
-
+
全部保存
-
+
Ctrl+Shift+S
-
+
选项
-
-
-
-
-
+
+
+
+
+
编译
-
-
+
+
工具输出
-
+
工具面板
-
+
Git
-
+
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
-
+
输出
-
+
输入
-
+
期望输出
-
+
帮助
-
+
重构
-
+
视图
@@ -3844,461 +3844,472 @@ Are you really want to continue?
工具窗口
-
+
主工具栏
-
+
编译器配置集
-
-
+
+
新建源代码文件
-
+
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
-
-
+
+
C++参考手册
-
+
C参考手册
-
+
显示全部工具面板
-
-
- 创建仓库
+
+
+ Create Repository
+ 创建Git仓库
-
+
提交(Commit)
-
+
撤销(Revert)
-
+
回滚(Reset)
+
+
+
+ 添加文件
+
+
+
+
+ 还原(Restore)
+
工具窗口栏
-
+
状态栏
-
+
Ctrl+Backspace
-
+
中断
-
-
+
+
删除到单词开头
-
+
Ctrl+Shift+B
-
+
删除到单词结尾
-
+
Ctrl+Shift+E
-
+
Add Class...
新建类...
-
-
+
+
New Header
新建头文件...
@@ -4308,47 +4319,47 @@ Are you really want to continue?
插入行
-
+
删除当前行
-
+
Ctrl+D
-
+
复制当前行
-
+
Ctrl+E
-
+
删除当前单词
-
+
Ctrl+Shift+D
-
+
删除到行尾
-
+
Ctrl+Del
-
+
删除到行首
@@ -4357,78 +4368,78 @@ Are you really want to continue?
C/C++参考
-
+
EGE图形库手册
-
+
添加书签
-
+
删除书签
-
+
修改书签说明
-
+
在文件视图中定位
-
-
+
+
打开文件夹
-
+
运行参数...
-
+
文件编码
-
+
文件历史
-
-
-
-
-
-
+
+
+
+
+
+
正在调试
-
-
-
-
-
-
+
+
+
+
+
+
正在运行
-
-
-
-
-
-
+
+
+
+
+
+
正在编译
@@ -4437,194 +4448,194 @@ 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
@@ -4645,68 +4656,68 @@ Are you really want to continue?
或者选择使用其他的网络端口。
-
-
+
+
重新构建项目
-
-
+
+
项目已经被修改过,是否需要重新构建?
-
+
自动保存出错
-
+
自动保存"%1"到"%2"失败:%3
-
+
试题属性...
-
+
设置试题集名称
-
+
试题集名称:
-
+
删除
-
+
删除全部书签
-
+
修改描述
-
-
-
+
+
+
书签描述
-
-
-
+
+
+
描述:
@@ -4715,536 +4726,557 @@ 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'以打开新项目?
-
+
文件夹不存在
-
+
文件夹'%1'不存在。是否创建?
-
+
无法创建文件夹
-
+
创建文件夹'%1'失败。
-
+
-
+
文件夹%1不是空的。
-
+
你真的要删除它吗?
-
-
+
+
头文件已存在
-
-
+
+
头文件"%1"已存在!
-
+
源文件已存在!
-
+
源文件"%1"已存在!
+
+
+
+ 提交信息
+
+
+
+
+ 提交失败
+
+
+
+
+ 提交信息不能为空!
+
小熊猫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个文件)
@@ -5466,108 +5498,108 @@ Are you really want to continue?
Project
-
+
未找到文件
-
+
找不到项目文件'%1'!
-
+
无标题
-
+
无法保存文件
-
+
无法保存文件'%1'.
-
+
载入文件错误
-
+
文件已存在
-
+
文件'%1'已在项目中
-
+
项目已升级
-
+
已成功将项目升级到新的格式
-
+
旧项目文件备份在'%1'。
-
+
头文件
-
+
源文件
-
+
其他文件
-
+
设置需要更新
-
+
The compiler settings format of Dev-C++ has changed.
小熊猫C++的编译器设置格式已发生改变。
-
+
请在项目 >> 项目属性 >> 编译器设置中修改您的设置并保存您的项目
-
+
未找到编译器
-
+
您为该项目设置的编译器不存在。
-
+
它将会被全局编译器设置代替。
-
+
Developed using the Red Panda Dev-C++ IDE
使用小熊猫C++编辑器开发
@@ -5974,24 +6006,24 @@ Are you really want to continue?
ProjectModel
-
+
文件已存在
-
+
文件'%1'已存在。是否删除?
-
-
+
+
删除失败
-
-
+
+
无法删除文件'%1'
@@ -6215,7 +6247,7 @@ Are you really want to continue?
QApplication
-
+
错误
@@ -6223,12 +6255,12 @@ Are you really want to continue?
QObject
-
+
保存
-
+
将修改保存到"%1"?
@@ -6413,7 +6445,7 @@ Are you really want to continue?
生成调试信息(-g3)
-
+
您同意小熊猫C++在PATH路径中寻找gcc编译器吗?
@@ -6512,34 +6544,34 @@ Are you really want to continue?
只生成汇编代码(-S)
-
-
+
+
确认
-
+
在验证编译器设置"%1"时遇到了下列问题:
-
+
是否让小熊猫C++删除这些配置,并尝试重新建立配置?
-
+
如果仍然保留这些设置,可能会导致编译错误。<br /><br />请选择“是”,除非您清楚的知道选择“否”的后果,
-
-
+
+
未配置编译器设置。
-
+
您需要小熊猫C++在下列位置搜索编译器吗:<br />%1<br />%2
@@ -7373,7 +7405,7 @@ Are you really want to continue?
自动链接
-
+
@@ -7449,15 +7481,15 @@ Are you really want to continue?
杂项
-
-
+
+
程序运行
-
+
试题集
@@ -7874,12 +7906,12 @@ Are you really want to continue?
选项
-
+
Git程序文件
-
+
所有文件 (%1)
diff --git a/RedPandaIDE/customfileiconprovider.cpp b/RedPandaIDE/customfileiconprovider.cpp
index 9610c5ea..4c827c1d 100644
--- a/RedPandaIDE/customfileiconprovider.cpp
+++ b/RedPandaIDE/customfileiconprovider.cpp
@@ -22,6 +22,11 @@ void CustomFileIconProvider::update()
mVCSRepository->update();
}
+GitRepository *CustomFileIconProvider::VCSRepository() const
+{
+ return mVCSRepository;
+}
+
QIcon CustomFileIconProvider::icon(IconType type) const
{
if (type == IconType::Folder) {
@@ -86,6 +91,15 @@ QIcon CustomFileIconProvider::icon(const QFileInfo &info) const
icon = pIconsManager->getIcon(IconsManager::FILESYSTEM_PROJECTFILE_VCS_NOCHANGE);
} else
icon = pIconsManager->getIcon(IconsManager::FILESYSTEM_PROJECTFILE);
+ } else {
+ if (mVCSRepository->isFileInRepository(info)) {
+ if (mVCSRepository->isFileStaged(info))
+ icon = pIconsManager->getIcon(IconsManager::FILESYSTEM_FILE_VCS_STAGED);
+ else if (mVCSRepository->isFileChanged(info))
+ icon = pIconsManager->getIcon(IconsManager::FILESYSTEM_FILE_VCS_CHANGED);
+ else
+ icon = pIconsManager->getIcon(IconsManager::FILESYSTEM_FILE_VCS_NOCHANGE);
+ } //use default system icon
}
if (!icon.isNull())
return icon;
diff --git a/RedPandaIDE/customfileiconprovider.h b/RedPandaIDE/customfileiconprovider.h
index 5e79a45a..aac770d5 100644
--- a/RedPandaIDE/customfileiconprovider.h
+++ b/RedPandaIDE/customfileiconprovider.h
@@ -17,6 +17,7 @@ private:
public:
QIcon icon(IconType type) const override;
QIcon icon(const QFileInfo &info) const override;
+ GitRepository *VCSRepository() const;
};
#endif // CUSTOMFILEICONPROVIDER_H
diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp
index 917b7ae6..df4ea79f 100644
--- a/RedPandaIDE/mainwindow.cpp
+++ b/RedPandaIDE/mainwindow.cpp
@@ -747,16 +747,17 @@ void MainWindow::updateDPI()
void MainWindow::onFileSaved(const QString &path, bool inProject)
{
- qDebug()<model()->beginUpdate();
- mProject->model()->endUpdate();
- }
- QModelIndex index = mFileSystemModel.index(path);
- if (index.isValid()) {
- mFileSystemModelIconProvider.update();
- mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
- ui->treeFiles->update(index);
+ if (pSettings->vcs().gitOk()) {
+ if (inProject && mProject) {
+ mProject->model()->beginUpdate();
+ mProject->model()->endUpdate();
+ }
+ QModelIndex index = mFileSystemModel.index(path);
+ if (index.isValid()) {
+ mFileSystemModelIconProvider.update();
+ mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
+ ui->treeFiles->update(index);
+ }
}
pMainWindow->updateForEncodingInfo();
}
@@ -2974,6 +2975,7 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
bool onUnit = false;
bool onRoot = false;
bool folderEmpty = false;
+ bool multiSelection = ui->projectView->selectionModel()->selectedRows().count()>1;
int unitIndex = -1;
QModelIndex current = mProjectProxyModel->mapToSource(ui->projectView->selectionModel()->currentIndex());
if (current.isValid() && mProject) {
@@ -3006,7 +3008,7 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
if (!onFolder) {
menu.addAction(ui->actionRemove_from_project);
}
- if (onUnit) {
+ if (onUnit && !multiSelection) {
menu.addAction(mProject_Rename_Unit);
}
menu.addSeparator();
@@ -3040,16 +3042,41 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
menu.addAction(ui->actionProject_options);
if (pSettings->vcs().gitOk() && hasRepository) {
- vcsMenu.setTitle(tr("VCS"));
- if (ui->projectView->selectionModel()->hasSelection())
- vcsMenu.addAction(ui->actionGit_Add_Files);
+ vcsMenu.setTitle(tr("Version Control"));
+ if (ui->projectView->selectionModel()->hasSelection()) {
+ bool shouldAdd = true;
+ foreach (const QModelIndex& index, ui->projectView->selectionModel()->selectedRows()) {
+ if (!index.isValid()) {
+ shouldAdd=false;
+ break;
+ }
+ QModelIndex realIndex = mProjectProxyModel->mapToSource(index);
+ ProjectModelNode * node = static_cast(realIndex.internalPointer());
+ if (!node || node->unitIndex<0) {
+ shouldAdd=false;
+ break;
+ }
+ PProjectUnit pUnit=mProject->units()[node->unitIndex];
+ if (mProject->model()->iconProvider()->VCSRepository()->isFileInRepository(
+ pUnit->fileName()
+ )) {
+ shouldAdd=false;
+ break;
+ }
+ }
+ if (shouldAdd)
+ vcsMenu.addAction(ui->actionGit_Add_Files);
+ }
vcsMenu.addAction(ui->actionGit_Commit);
- vcsMenu.addAction(ui->actionGit_Reset);
- vcsMenu.addAction(ui->actionGit_Revert);
+ vcsMenu.addAction(ui->actionGit_Restore);
ui->actionGit_Commit->setEnabled(true);
- ui->actionGit_Reset->setEnabled(true);
- ui->actionGit_Revert->setEnabled(true);
+ ui->actionGit_Restore->setEnabled(true);
+
+// vcsMenu.addAction(ui->actionGit_Reset);
+// vcsMenu.addAction(ui->actionGit_Revert);
+// ui->actionGit_Reset->setEnabled(true);
+// ui->actionGit_Revert->setEnabled(true);
}
menu.exec(ui->projectView->mapToGlobal(pos));
}
@@ -3135,16 +3162,30 @@ void MainWindow::onFilesViewContextMenu(const QPoint &pos)
mFilesView_OpenInExplorer->setEnabled(!path.isEmpty());
if (pSettings->vcs().gitOk() && hasRepository) {
- vcsMenu.setTitle(tr("VCS"));
- if (ui->treeFiles->selectionModel()->hasSelection())
- vcsMenu.addAction(ui->actionGit_Add_Files);
+ vcsMenu.setTitle(tr("Version Control"));
+ if (ui->treeFiles->selectionModel()->hasSelection()) {
+ bool shouldAdd = true;
+ foreach (const QModelIndex& index, ui->treeFiles->selectionModel()->selectedRows()) {
+ if (mFileSystemModelIconProvider.VCSRepository()->isFileInRepository(
+ mFileSystemModel.fileInfo(index)
+ )) {
+ shouldAdd=false;
+ break;
+ }
+ }
+ if (shouldAdd)
+ vcsMenu.addAction(ui->actionGit_Add_Files);
+ }
vcsMenu.addAction(ui->actionGit_Commit);
- vcsMenu.addAction(ui->actionGit_Reset);
- vcsMenu.addAction(ui->actionGit_Revert);
+ vcsMenu.addAction(ui->actionGit_Restore);
ui->actionGit_Commit->setEnabled(true);
- ui->actionGit_Reset->setEnabled(true);
- ui->actionGit_Revert->setEnabled(true);
+ ui->actionGit_Restore->setEnabled(true);
+
+// vcsMenu.addAction(ui->actionGit_Reset);
+// vcsMenu.addAction(ui->actionGit_Revert);
+// ui->actionGit_Reset->setEnabled(true);
+// ui->actionGit_Revert->setEnabled(true);
}
menu.exec(ui->treeFiles->mapToGlobal(pos));
}
@@ -6555,17 +6596,38 @@ void MainWindow::on_actionGit_Create_Repository_triggered()
if (ui->treeFiles->isVisible()) {
GitManager vcsManager;
vcsManager.createRepository(pSettings->environment().currentFolder());
+ //update files view;
int pos = ui->cbFilesPath->findText(pSettings->environment().currentFolder());
if (pos>=0) {
ui->cbFilesPath->setItemIcon(pos, pIconsManager->getIcon(IconsManager::FILESYSTEM_GIT));
}
+ mFileSystemModelIconProvider.update();
+ mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
+ //update project view
+ if (mProject && mProject->folder() == mFileSystemModel.rootPath()) {
+ mProject->addUnit(includeTrailingPathDelimiter(mProject->folder())+".gitignore", mProject->rootNode(), true);
+ } else if (mProject && mFileSystemModel.index(mProject->folder()).isValid()) {
+ mProject->model()->beginUpdate();
+ mProject->model()->endUpdate();
+ }
} else if (ui->projectView->isVisible() && mProject) {
GitManager vcsManager;
vcsManager.createRepository(mProject->folder());
- }
- if (mProject) {
- mProject->model()->beginUpdate();
- mProject->model()->endUpdate();
+ vcsManager.add(mProject->folder(), extractFileName(mProject->filename()));
+ //update project view
+ mProject->addUnit(includeTrailingPathDelimiter(mProject->folder())+".gitignore", mProject->rootNode(), true);
+ mProject->saveAll();
+ if (mProject->folder() == mFileSystemModel.rootPath()
+ || mFileSystemModel.rootPath().startsWith(includeTrailingPathDelimiter(mProject->folder()), PATH_SENSITIVITY)) {
+
+ //update files view;
+ int pos = ui->cbFilesPath->findText(pSettings->environment().currentFolder());
+ if (pos>=0) {
+ ui->cbFilesPath->setItemIcon(pos, pIconsManager->getIcon(IconsManager::FILESYSTEM_GIT));
+ }
+ mFileSystemModelIconProvider.update();
+ mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
+ }
}
}
@@ -6620,10 +6682,39 @@ void MainWindow::on_actionGit_Commit_triggered()
if (folder.isEmpty())
return;
QString message = QInputDialog::getText(this,tr("Commit Message"),"Commit Message:");
- if (message.isEmpty())
+ if (message.isEmpty()) {
+ QMessageBox::critical(this,
+ tr("Commit Failed"),
+ tr("Commit message shouldn't be empty!")
+ );
return;
- GitRepository repository(folder);
- repository.commit(message,true);
+ }
+ GitManager vcsManager;
+ vcsManager.commit(folder,message,true);
+
+ //update project view
+ if (mProject) {
+ mProject->model()->beginUpdate();
+ mProject->model()->endUpdate();
+ }
+ //update files view
+ mFileSystemModelIconProvider.update();
+ mFileSystemModel.setIconProvider(&mFileSystemModelIconProvider);
+}
+
+
+void MainWindow::on_actionGit_Restore_triggered()
+{
+ QString folder;
+ if (ui->treeFiles->isVisible()) {
+ folder = pSettings->environment().currentFolder();
+ } else if (ui->projectView->isVisible() && mProject) {
+ folder = mProject->folder();
+ }
+ if (folder.isEmpty())
+ return;
+ GitManager vcsManager;
+ vcsManager.restore(folder,"");
//update project view
if (mProject) {
diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h
index b848d186..12b53b82 100644
--- a/RedPandaIDE/mainwindow.h
+++ b/RedPandaIDE/mainwindow.h
@@ -584,6 +584,8 @@ private slots:
void on_actionGit_Commit_triggered();
+ void on_actionGit_Restore_triggered();
+
private:
Ui::MainWindow *ui;
EditorList *mEditorList;
diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui
index 35a5c356..dd4263cc 100644
--- a/RedPandaIDE/mainwindow.ui
+++ b/RedPandaIDE/mainwindow.ui
@@ -85,7 +85,7 @@
QTabWidget::West
- 3
+ 0
true
@@ -126,7 +126,7 @@
Qt::MoveAction
- QAbstractItemView::SingleSelection
+ QAbstractItemView::ExtendedSelection
QAbstractItemView::SelectRows
@@ -1603,8 +1603,7 @@
-
-
+
@@ -2756,7 +2755,7 @@
- Create Repository
+ Create Git Repository
@@ -2779,6 +2778,11 @@
Add Files
+
+
+ Restore
+
+
diff --git a/RedPandaIDE/project.cpp b/RedPandaIDE/project.cpp
index 1d166bf5..c8f07497 100644
--- a/RedPandaIDE/project.cpp
+++ b/RedPandaIDE/project.cpp
@@ -36,7 +36,7 @@
#include "customfileiconprovider.h"
#include
#include "settings.h"
-#include "vcs/gitmanager.h"
+#include "vcs/gitrepository.h"
Project::Project(const QString &filename, const QString &name, QObject *parent) :
QObject(parent),
@@ -904,10 +904,6 @@ PProjectUnit Project::addUnit(const QString &inFileName, PProjectModelNode paren
newUnit->setOverrideBuildCmd(false);
newUnit->setBuildCmd("");
if (rebuild) {
- mModel.beginUpdate();
- auto action = finally([this]{
- mModel.endUpdate();
- });
rebuildNodes();
}
setModified(true);
@@ -1910,13 +1906,11 @@ ProjectModel::ProjectModel(Project *project, QObject *parent):
mProject(project)
{
mUpdateCount = 0;
- mVCSRepository = new GitRepository("");
mIconProvider = new CustomFileIconProvider();
}
ProjectModel::~ProjectModel()
{
- delete mVCSRepository;
delete mIconProvider;
}
@@ -1932,12 +1926,16 @@ void ProjectModel::endUpdate()
{
mUpdateCount--;
if (mUpdateCount==0) {
- mVCSRepository->setFolder(mProject->folder());
mIconProvider->setRootFolder(mProject->folder());
endResetModel();
}
}
+CustomFileIconProvider *ProjectModel::iconProvider() const
+{
+ return mIconProvider;
+}
+
Project *ProjectModel::project() const
{
return mProject;
@@ -1994,7 +1992,7 @@ QVariant ProjectModel::data(const QModelIndex &index, int role) const
if (role == Qt::DisplayRole) {
if (p == mProject->rootNode().get()) {
QString branch;
- if (mVCSRepository->hasRepository(branch))
+ if (mIconProvider->VCSRepository()->hasRepository(branch))
return QString("%1 [%2]").arg(p->text,branch);
}
return p->text;
@@ -2007,7 +2005,7 @@ QVariant ProjectModel::data(const QModelIndex &index, int role) const
} else {
if (p == mProject->rootNode().get()) {
QString branch;
- if (mVCSRepository->hasRepository(branch))
+ if (mIconProvider->VCSRepository()->hasRepository(branch))
icon = pIconsManager->getIcon(IconsManager::FILESYSTEM_GIT);
} else {
switch(p->folderNodeType) {
diff --git a/RedPandaIDE/project.h b/RedPandaIDE/project.h
index 063dc19e..61feb624 100644
--- a/RedPandaIDE/project.h
+++ b/RedPandaIDE/project.h
@@ -112,7 +112,6 @@ public:
void endUpdate();
private:
Project* mProject;
- GitRepository *mVCSRepository;
int mUpdateCount;
CustomFileIconProvider* mIconProvider;
@@ -136,6 +135,7 @@ public:
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
QMimeData *mimeData(const QModelIndexList &indexes) const override;
Project *project() const;
+ CustomFileIconProvider *iconProvider() const;
};
class ProjectModelSortFilterProxy : public QSortFilterProxyModel
diff --git a/RedPandaIDE/vcs/gitmanager.cpp b/RedPandaIDE/vcs/gitmanager.cpp
index eb072f9b..f109232f 100644
--- a/RedPandaIDE/vcs/gitmanager.cpp
+++ b/RedPandaIDE/vcs/gitmanager.cpp
@@ -119,7 +119,10 @@ void GitManager::restore(const QString &folder, const QString &path)
{
QStringList args;
args.append("restore");
- args.append(path);
+ if (path.isEmpty())
+ args.append(".");
+ else
+ args.append(path);
runGit(folder,args);
}
@@ -155,10 +158,12 @@ void GitManager::clone(const QString &folder, const QString &url)
runGit(folder,args);
}
-void GitManager::commit(const QString &folder, const QString &message)
+void GitManager::commit(const QString &folder, const QString &message, bool autoStage)
{
QStringList args;
args.append("commit");
+ if (autoStage)
+ args.append("-a");
args.append("-m");
args.append(message);
runGit(folder,args);
diff --git a/RedPandaIDE/vcs/gitmanager.h b/RedPandaIDE/vcs/gitmanager.h
index ef54245f..06bff104 100644
--- a/RedPandaIDE/vcs/gitmanager.h
+++ b/RedPandaIDE/vcs/gitmanager.h
@@ -5,7 +5,7 @@
#include
#include
#include "utils.h"
-#include "gitrepository.h"
+#include "gitutils.h"
class GitError: public BaseError {
public:
@@ -32,12 +32,13 @@ public:
void remove(const QString& folder, const QString& path);
void rename(const QString& folder, const QString& oldName, const QString& newName);
void restore(const QString& folder, const QString& path);
+
QStringList listFiles(const QString& folder);
QStringList listStagedFiles(const QString& folder);
QStringList listChangedFiles(const QString& folder);
void clone(const QString& folder, const QString& url);
- void commit(const QString& folder, const QString& message);
+ void commit(const QString& folder, const QString& message, bool autoStage);
void revert(const QString& folder);
void reset(const QString& folder, const QString& commit, GitResetStrategy strategy);
diff --git a/RedPandaIDE/vcs/gitrepository.cpp b/RedPandaIDE/vcs/gitrepository.cpp
index 0a882bad..c5a29727 100644
--- a/RedPandaIDE/vcs/gitrepository.cpp
+++ b/RedPandaIDE/vcs/gitrepository.cpp
@@ -62,16 +62,9 @@ void GitRepository::clone(const QString &url)
mManager->clone(mFolder,url);
}
-void GitRepository::commit(const QString &message, bool autoAdd)
+void GitRepository::commit(const QString &message, bool autoStage)
{
- if (autoAdd) {
- convertFilesListToSet(mManager->listChangedFiles(mRealFolder),mChangedFiles);
- foreach(const QString& s, mChangedFiles) {
- QFileInfo info(s);
- mManager->add(info.absolutePath(),info.fileName());
- }
- }
- mManager->commit(mRealFolder, message);
+ mManager->commit(mRealFolder, message, autoStage);
}
void GitRepository::revert()
diff --git a/RedPandaIDE/vcs/gitrepository.h b/RedPandaIDE/vcs/gitrepository.h
index 2f8d55f7..16bb236f 100644
--- a/RedPandaIDE/vcs/gitrepository.h
+++ b/RedPandaIDE/vcs/gitrepository.h
@@ -5,14 +5,7 @@
#include
#include
#include
-
-enum class GitResetStrategy {
- Soft,
- Hard,
- Merge,
- Mixed,
- Keep
-};
+#include "gitutils.h"
class GitManager;
class GitRepository : public QObject
@@ -53,7 +46,7 @@ public:
QSet listFiles(bool refresh);
void clone(const QString& url);
- void commit(const QString& message, bool autoAdd=true);
+ void commit(const QString& message, bool autoStage=true);
void revert();
void reset(const QString& commit, GitResetStrategy strategy);
diff --git a/RedPandaIDE/vcs/gitutils.cpp b/RedPandaIDE/vcs/gitutils.cpp
new file mode 100644
index 00000000..d7321e94
--- /dev/null
+++ b/RedPandaIDE/vcs/gitutils.cpp
@@ -0,0 +1,2 @@
+#include "gitutils.h"
+
diff --git a/RedPandaIDE/vcs/gitutils.h b/RedPandaIDE/vcs/gitutils.h
new file mode 100644
index 00000000..d42214d6
--- /dev/null
+++ b/RedPandaIDE/vcs/gitutils.h
@@ -0,0 +1,12 @@
+#ifndef GITUTILS_H
+#define GITUTILS_H
+
+enum class GitResetStrategy {
+ Soft,
+ Hard,
+ Merge,
+ Mixed,
+ Keep
+};
+
+#endif // GITUTILS_H