diff --git a/NEWS.md b/NEWS.md
index 206a945a..f98671f1 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,6 @@
+Red Panda C++ Version 0.14.4
+ - enhancement: git - log
+
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
diff --git a/RedPandaIDE/RedPandaIDE.pro b/RedPandaIDE/RedPandaIDE.pro
index fdd59aea..48928ba0 100644
--- a/RedPandaIDE/RedPandaIDE.pro
+++ b/RedPandaIDE/RedPandaIDE.pro
@@ -10,7 +10,7 @@ isEmpty(APP_NAME) {
}
isEmpty(APP_VERSION) {
- APP_VERSION=0.14.3
+ APP_VERSION=0.14.4
}
isEmpty(PREFIX) {
@@ -92,6 +92,7 @@ SOURCES += \
todoparser.cpp \
toolsmanager.cpp \
vcs/gitbranchdialog.cpp \
+ vcs/gitlogdialog.cpp \
vcs/gitmanager.cpp \
vcs/gitmergedialog.cpp \
vcs/gitrepository.cpp \
@@ -227,6 +228,7 @@ HEADERS += \
todoparser.h \
toolsmanager.h \
vcs/gitbranchdialog.h \
+ vcs/gitlogdialog.h \
vcs/gitmanager.h \
vcs/gitmergedialog.h \
vcs/gitrepository.h \
@@ -326,6 +328,7 @@ FORMS += \
settingsdialog/toolsgeneralwidget.ui \
settingsdialog/toolsgitwidget.ui \
vcs/gitbranchdialog.ui \
+ vcs/gitlogdialog.ui \
vcs/gitmergedialog.ui \
widgets/aboutdialog.ui \
widgets/cpudialog.ui \
diff --git a/RedPandaIDE/RedPandaIDE_zh_CN.ts b/RedPandaIDE/RedPandaIDE_zh_CN.ts
index d55b2a91..c8968fc8 100644
--- a/RedPandaIDE/RedPandaIDE_zh_CN.ts
+++ b/RedPandaIDE/RedPandaIDE_zh_CN.ts
@@ -3202,6 +3202,79 @@ Are you really want to continue?
取消
+
+ GitLogDialog
+
+
+
+ Dialog
+ Git版本日志
+
+
+
+
+ 关闭
+
+
+
+
+ 回滚(Reset)
+
+
+
+
+ 撤销(Revert)
+
+
+
+
+ 分支(branch)
+
+
+
+
+ 标签(Tag)
+
+
+
+
+ 将"%1"回滚(Reset)到这里...
+
+
+
+
+ 将"%1"撤销(Revert)到这里...
+
+
+
+
+ 在此版本创建分支(Branch)...
+
+
+
+
+ 在此版本创建标签(Tag)...
+
+
+
+ GitLogModel
+
+
+
+ 日期
+
+
+
+
+ 作者
+
+
+
+
+ title
+ 标题
+
+
GitManager
@@ -3450,18 +3523,18 @@ Are you really want to continue?
MainWindow
-
+
小熊猫C++
-
-
-
-
-
-
+
+
+
+
+
+
编译器
@@ -3480,8 +3553,8 @@ Are you really want to continue?
工具
-
-
+
+
运行
@@ -3493,25 +3566,25 @@ Are you really want to continue?
-
+
项目
-
+
监视
-
+
结构
-
+
文件
@@ -3521,10 +3594,10 @@ Are you really want to continue?
-
-
-
-
+
+
+
+
调试
@@ -3535,7 +3608,7 @@ Are you really want to continue?
-
+
调试主控台
@@ -3557,7 +3630,7 @@ Are you really want to continue?
-
+
查找
@@ -3582,7 +3655,7 @@ Are you really want to continue?
替换
-
+
关闭
@@ -3593,7 +3666,7 @@ Are you really want to continue?
-
+
代码
@@ -3611,72 +3684,72 @@ Are you really want to continue?
工具栏2
-
+
新建
-
+
Ctrl+N
-
+
打开...
-
+
Ctrl+O
-
+
保存
-
+
Ctrl+S
-
+
另存为...
-
+
另存为
-
+
全部保存
-
+
Ctrl+Shift+S
-
+
选项
-
-
-
-
-
+
+
+
+
+
编译
-
+
工具输出
@@ -3691,200 +3764,200 @@ Are you really want to continue?
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
-
+
单步进入
-
-
+
+
试题集
-
+
新建试题集
@@ -3903,14 +3976,14 @@ Are you really want to continue?
-
+
保存试题集
-
+
载入试题集
@@ -3932,21 +4005,21 @@ Are you really want to continue?
-
+
TODO
-
+
书签
-
-
+
+
试题
@@ -4021,487 +4094,494 @@ 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)
-
+
官方网站
-
+
分支切换(Switch)
-
+
合并(Merge)
+
+
+
+
+ Log
+ 显示日志(Log)
+
工具窗口栏
-
+
状态栏
-
+
Ctrl+Backspace
-
+
中断
-
-
+
+
删除到单词开头
-
+
Ctrl+Shift+B
-
+
删除到单词结尾
-
+
Ctrl+Shift+E
-
+
Add Class...
新建类...
-
-
+
+
New Header
新建头文件...
@@ -4511,47 +4591,47 @@ Are you really want to continue?
插入行
-
+
删除当前行
-
+
Ctrl+D
-
+
复制当前行
-
+
Ctrl+E
-
+
删除当前单词
-
+
Ctrl+Shift+D
-
+
删除到行尾
-
+
Ctrl+Del
-
+
删除到行首
@@ -4560,78 +4640,78 @@ Are you really want to continue?
C/C++参考
-
+
EGE图形库手册
-
+
添加书签
-
+
删除书签
-
+
修改书签说明
-
+
在文件视图中定位
-
-
+
+
打开文件夹
-
+
运行参数...
-
+
文件编码
-
+
文件历史
-
-
-
-
-
-
+
+
+
+
+
+
正在调试
-
-
-
-
-
-
+
+
+
+
+
+
正在运行
-
-
-
-
-
-
+
+
+
+
+
+
正在编译
@@ -4640,194 +4720,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
@@ -4848,68 +4928,68 @@ Are you really want to continue?
或者选择使用其他的网络端口。
-
-
+
+
重新构建项目
-
-
+
+
项目已经被修改过,是否需要重新构建?
-
+
自动保存出错
-
+
自动保存"%1"到"%2"失败:%3
-
+
试题属性...
-
+
设置试题集名称
-
+
试题集名称:
-
+
删除
-
+
删除全部书签
-
+
修改描述
-
-
-
+
+
+
书签描述
-
-
-
+
+
+
描述:
@@ -4918,337 +4998,337 @@ 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"已存在!
-
+
无法提交!
-
+
下列文件处于冲突状态,请解决后重新添加和提交:
-
+
提交信息
-
+
提交信息:
-
+
提交失败
-
+
提交信息不能为空!
@@ -5257,233 +5337,233 @@ 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个文件)
@@ -7159,7 +7239,7 @@ Are you really want to continue?
无法解析试题集文件"%1":%2
-
+
<由Git自动生成>
@@ -7618,7 +7698,7 @@ Are you really want to continue?
自动链接
-
+
@@ -7694,15 +7774,15 @@ Are you really want to continue?
杂项
-
-
+
+
程序运行
-
+
试题集
diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp
index 743e1987..0bcace3b 100644
--- a/RedPandaIDE/mainwindow.cpp
+++ b/RedPandaIDE/mainwindow.cpp
@@ -43,6 +43,7 @@
#include "vcs/gitrepository.h"
#include "vcs/gitbranchdialog.h"
#include "vcs/gitmergedialog.h"
+#include "vcs/gitlogdialog.h"
#include "widgets/infomessagebox.h"
#include
@@ -3092,6 +3093,7 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
if (shouldAdd)
vcsMenu.addAction(ui->actionGit_Add_Files);
}
+ vcsMenu.addAction(ui->actionGit_Log);
vcsMenu.addAction(ui->actionGit_Branch);
vcsMenu.addAction(ui->actionGit_Merge);
vcsMenu.addAction(ui->actionGit_Commit);
@@ -3099,9 +3101,10 @@ void MainWindow::onProjectViewContextMenu(const QPoint &pos)
bool canBranch = !mProject->model()->iconProvider()->VCSRepository()->hasChangedFiles()
&& !mProject->model()->iconProvider()->VCSRepository()->hasStagedFiles();
+ ui->actionGit_Branch->setEnabled(canBranch);
ui->actionGit_Merge->setEnabled(canBranch);
- ui->actionGit_Commit->setEnabled(canBranch);
- ui->actionGit_Branch->setEnabled(true);
+ ui->actionGit_Commit->setEnabled(true);
+ ui->actionGit_Log->setEnabled(true);
ui->actionGit_Restore->setEnabled(true);
// vcsMenu.addAction(ui->actionGit_Reset);
@@ -3212,6 +3215,7 @@ void MainWindow::onFilesViewContextMenu(const QPoint &pos)
if (shouldAdd)
vcsMenu.addAction(ui->actionGit_Add_Files);
}
+ vcsMenu.addAction(ui->actionGit_Log);
vcsMenu.addAction(ui->actionGit_Branch);
vcsMenu.addAction(ui->actionGit_Merge);
vcsMenu.addAction(ui->actionGit_Commit);
@@ -3221,6 +3225,7 @@ void MainWindow::onFilesViewContextMenu(const QPoint &pos)
&& !mFileSystemModelIconProvider.VCSRepository()->hasStagedFiles();
ui->actionGit_Branch->setEnabled(canBranch);
ui->actionGit_Merge->setEnabled(canBranch);
+ ui->actionGit_Log->setEnabled(true);
ui->actionGit_Commit->setEnabled(true);
ui->actionGit_Restore->setEnabled(true);
@@ -5736,6 +5741,7 @@ void MainWindow::updateVCSActions()
&& !mFileSystemModelIconProvider.VCSRepository()->hasStagedFiles();
}
ui->actionGit_Create_Repository->setEnabled(!hasRepository && shouldEnable);
+ ui->actionGit_Log->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Commit->setEnabled(hasRepository && shouldEnable);
ui->actionGit_Branch->setEnabled(hasRepository && shouldEnable && canBranch);
ui->actionGit_Merge->setEnabled(hasRepository && shouldEnable && canBranch);
@@ -6877,3 +6883,27 @@ void MainWindow::on_actionGit_Merge_triggered()
}
}
+
+void MainWindow::on_actionGit_Log_triggered()
+{
+ QString folder;
+ if (ui->treeFiles->isVisible()) {
+ folder = pSettings->environment().currentFolder();
+ } else if (ui->projectView->isVisible() && mProject) {
+ folder = mProject->folder();
+ }
+ if (folder.isEmpty())
+ return;
+ GitLogDialog dialog(folder);
+ if (dialog.exec()==QDialog::Accepted) {
+ //update project view
+ if (mProject) {
+ mProject->model()->beginUpdate();
+ mProject->model()->endUpdate();
+ }
+ //update files view
+ setFilesViewRoot(pSettings->environment().currentFolder());
+ }
+ return ;
+}
+
diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h
index 84c9b7fd..a580f87c 100644
--- a/RedPandaIDE/mainwindow.h
+++ b/RedPandaIDE/mainwindow.h
@@ -594,6 +594,8 @@ private slots:
void on_actionGit_Merge_triggered();
+ void on_actionGit_Log_triggered();
+
private:
Ui::MainWindow *ui;
EditorList *mEditorList;
diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui
index f4e8bde4..d09bbba0 100644
--- a/RedPandaIDE/mainwindow.ui
+++ b/RedPandaIDE/mainwindow.ui
@@ -542,7 +542,7 @@
QTabWidget::South
- 2
+ 6
@@ -1603,6 +1603,7 @@
+
@@ -2802,6 +2803,14 @@
Merge
+
+
+ Show Log
+
+
+ Show Log
+
+
diff --git a/RedPandaIDE/vcs/gitlogdialog.cpp b/RedPandaIDE/vcs/gitlogdialog.cpp
new file mode 100644
index 00000000..999021c6
--- /dev/null
+++ b/RedPandaIDE/vcs/gitlogdialog.cpp
@@ -0,0 +1,107 @@
+#include "gitlogdialog.h"
+#include "ui_gitlogdialog.h"
+#include "gitmanager.h"
+
+#include
+
+GitLogDialog::GitLogDialog(const QString& folder, QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::GitLogDialog),
+ mModel(folder)
+{
+ ui->setupUi(this);
+ ui->tblLogs->setModel(&mModel);
+ ui->tblLogs->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
+ connect(ui->tblLogs,&QTableView::customContextMenuRequested,
+ this, &GitLogDialog::onLogsContextMenu);
+}
+
+GitLogDialog::~GitLogDialog()
+{
+ delete ui;
+}
+
+GitLogModel::GitLogModel(const QString &folder, QObject *parent):
+ QAbstractTableModel(parent),mFolder(folder)
+{
+ GitManager manager;
+ mCount = manager.logCounts(folder);
+}
+
+int GitLogModel::rowCount(const QModelIndex &parent) const
+{
+ return mCount;
+}
+
+int GitLogModel::columnCount(const QModelIndex &parent) const
+{
+ return 3;
+}
+
+QVariant GitLogModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+ if (role == Qt::DisplayRole) {
+ int row = index.row();
+ GitManager manager;
+ QList listCommitInfos =
+ manager.log(mFolder,row,1);
+ if (listCommitInfos.isEmpty()) {
+ return QVariant();
+ }
+ switch(index.column()) {
+ case 0:
+ return listCommitInfos[0]->authorDate;
+ case 1:
+ return listCommitInfos[0]->author;
+ case 2:
+ return listCommitInfos[0]->title;
+ }
+ }
+ return QVariant();
+}
+
+QVariant GitLogModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+ if (orientation==Qt::Horizontal && role == Qt::DisplayRole) {
+ switch(section) {
+ case 0:
+ return tr("Date");
+ case 1:
+ return tr("Author");
+ case 2:
+ return tr("Title");
+ }
+ }
+ return QVariant();
+}
+
+const QString &GitLogModel::folder() const
+{
+ return mFolder;
+}
+
+void GitLogDialog::on_btnClose_clicked()
+{
+ reject();
+}
+
+void GitLogDialog::onLogsContextMenu(const QPoint &pos)
+{
+ QMenu menu(this);
+ QString branch;
+ GitManager manager;
+ if (!manager.hasRepository(mModel.folder(), branch))
+ return;
+ menu.addAction(ui->actionRevert);
+ menu.addAction(ui->actionReset);
+ menu.addAction(ui->actionBranch);
+ menu.addAction(ui->actionTag);
+ ui->actionReset->setText(tr("Reset \"%1\" to this...").arg(branch));
+ ui->actionRevert->setText(tr("Revert \"%1\" to this...").arg(branch));
+ ui->actionBranch->setText(tr("Create Branch at this version..."));
+ ui->actionTag->setText(tr("Create Tag at this version..."));
+ menu.exec(ui->tblLogs->mapToGlobal(pos));
+}
+
diff --git a/RedPandaIDE/vcs/gitlogdialog.h b/RedPandaIDE/vcs/gitlogdialog.h
new file mode 100644
index 00000000..43b1995c
--- /dev/null
+++ b/RedPandaIDE/vcs/gitlogdialog.h
@@ -0,0 +1,48 @@
+#ifndef GITLOGDIALOG_H
+#define GITLOGDIALOG_H
+
+#include
+#include
+#include
+#include "gitutils.h"
+
+namespace Ui {
+class GitLogDialog;
+}
+
+class GitLogModel: public QAbstractTableModel {
+public:
+ explicit GitLogModel(const QString& folder,QObject *parent = nullptr);
+
+ // QAbstractItemModel interface
+public:
+ int rowCount(const QModelIndex &parent) const override;
+ int columnCount(const QModelIndex &parent) const override;
+ QVariant data(const QModelIndex &index, int role) const override;
+ QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
+ const QString &folder() const;
+
+private:
+ QString mFolder;
+ int mCount;
+ QMap mGitCommitInfos;
+};
+
+class GitLogDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit GitLogDialog(const QString& folder, QWidget *parent = nullptr);
+ ~GitLogDialog();
+
+private slots:
+ void on_btnClose_clicked();
+ void onLogsContextMenu(const QPoint &pos);
+
+private:
+ Ui::GitLogDialog *ui;
+ GitLogModel mModel;
+};
+
+#endif // GITLOGDIALOG_H
diff --git a/RedPandaIDE/vcs/gitlogdialog.ui b/RedPandaIDE/vcs/gitlogdialog.ui
new file mode 100644
index 00000000..db5195b1
--- /dev/null
+++ b/RedPandaIDE/vcs/gitlogdialog.ui
@@ -0,0 +1,101 @@
+
+
+ GitLogDialog
+
+
+
+ 0
+ 0
+ 922
+ 613
+
+
+
+ Git Log
+
+
+ -
+
+
+ QAbstractItemView::SingleSelection
+
+
+ QAbstractItemView::SelectRows
+
+
+ 250
+
+
+ true
+
+
+
+ -
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Raised
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 795
+ 20
+
+
+
+
+ -
+
+
+ Close
+
+
+
+
+
+
+
+
+
+ Reset
+
+
+
+
+ Revert
+
+
+
+
+ branch
+
+
+
+
+ Tag
+
+
+
+
+
+
diff --git a/RedPandaIDE/vcs/gitmanager.cpp b/RedPandaIDE/vcs/gitmanager.cpp
index 0738a5ed..e9169dec 100644
--- a/RedPandaIDE/vcs/gitmanager.cpp
+++ b/RedPandaIDE/vcs/gitmanager.cpp
@@ -126,6 +126,65 @@ void GitManager::restore(const QString &folder, const QString &path)
runGit(folder,args);
}
+int GitManager::logCounts(const QString &folder, const QString &branch)
+{
+ QStringList args;
+ args.append("rev-list");
+ args.append("--count");
+ if (branch.isEmpty())
+ args.append("HEAD");
+ else
+ args.append(branch);
+ QString s = runGit(folder,args).trimmed();
+ bool ok;
+ int result = s.toInt(&ok);
+ if (!ok)
+ result = 0;
+ return result;
+}
+
+QList GitManager::log(const QString &folder, int start, int count, const QString &branch)
+{
+ QStringList args;
+ args.append("log");
+ args.append("--skip");
+ args.append(QString("%1").arg(start-1));
+ args.append("-n");
+ args.append(QString("%1").arg(count));
+ args.append("--format=medium");
+ args.append("--date=iso-strict");
+ if (branch.isEmpty())
+ args.append("HEAD");
+ else
+ args.append(branch);
+ QString output = runGit(folder,args);
+ QStringList lines = textToLines(output);
+ QList result;
+ int pos = 0;
+ PGitCommitInfo commitInfo;
+ while (pos();
+ commitInfo->commitHash=lines[pos].mid(QString("commit ").length()).trimmed();
+ result.append(commitInfo);
+ } else if(!commitInfo) {
+ break;
+ } else if (lines[pos].startsWith("Author:")) {
+ commitInfo->author=lines[pos].mid(QString("Author:").length()).trimmed();
+ } else if (lines[pos].startsWith("Date:")) {
+ commitInfo->authorDate=QDateTime::fromString(lines[pos].mid(QString("Date:").length()).trimmed(),Qt::ISODate);
+ } else if (!lines[pos].trimmed().isEmpty()) {
+ if (commitInfo->title.isEmpty()) {
+ commitInfo->title = lines[pos].trimmed();
+ } else {
+ commitInfo->fullCommitMessage.append(lines[pos].trimmed()+"\n");
+ }
+ }
+ pos++;
+ }
+ return result;
+}
+
QStringList GitManager::listFiles(const QString &folder)
{
QStringList args;
diff --git a/RedPandaIDE/vcs/gitmanager.h b/RedPandaIDE/vcs/gitmanager.h
index 915a87c3..c3a3756c 100644
--- a/RedPandaIDE/vcs/gitmanager.h
+++ b/RedPandaIDE/vcs/gitmanager.h
@@ -33,6 +33,9 @@ public:
void rename(const QString& folder, const QString& oldName, const QString& newName);
void restore(const QString& folder, const QString& path);
+ int logCounts(const QString& folder, const QString& branch=QString());
+ QList log(const QString& folder, int start, int count, const QString& branch=QString());
+
QStringList listFiles(const QString& folder);
QStringList listStagedFiles(const QString& folder);
QStringList listChangedFiles(const QString& folder);
diff --git a/RedPandaIDE/vcs/gitutils.h b/RedPandaIDE/vcs/gitutils.h
index 2453ec9a..1bcf2e94 100644
--- a/RedPandaIDE/vcs/gitutils.h
+++ b/RedPandaIDE/vcs/gitutils.h
@@ -1,6 +1,11 @@
#ifndef GITUTILS_H
#define GITUTILS_H
+#include
+#include
+#include
+
+
enum class GitResetStrategy {
Soft,
Hard,
@@ -30,4 +35,14 @@ enum class GitMergeStrategyOption {
Subtree
};
+struct GitCommitInfo {
+ QString commitHash;
+ QString author;
+ QDateTime authorDate;
+ QString title;
+ QString fullCommitMessage;
+};
+
+using PGitCommitInfo = std::shared_ptr;
+
#endif // GITUTILS_H
diff --git a/Red_Panda_CPP.pro b/Red_Panda_CPP.pro
index 085083ef..2867f5a9 100644
--- a/Red_Panda_CPP.pro
+++ b/Red_Panda_CPP.pro
@@ -7,7 +7,7 @@ SUBDIRS += \
APP_NAME = RedPandaCPP
-APP_VERSION = 0.14.3
+APP_VERSION = 0.14.4
linux: {