ide: DirDiff minor improvements

This commit is contained in:
Mirek Fidler 2025-09-30 23:53:54 +02:00
parent 1eb4c3f200
commit fa325e4a6e
4 changed files with 52 additions and 26 deletions

View file

@ -22,7 +22,10 @@ DirDiffDlg::DirDiffDlg()
recent.Add(3, "3 Days");
recent.Add(7, "7 Days");
recent.Add(14, "14 Days");
recent.Add(32, "28 Days");
recent.Add(28, "28 Days");
recent.Add(60, "3 Months");
recent.Add(180, "6 Months");
recent.Add(365, "1 Year");
compare.SetLabel(t_("Compare"));
int bcy = max(cy, compare.GetStdSize().cy);
@ -35,8 +38,8 @@ DirDiffDlg::DirDiffDlg()
files_pane.Add(added.TopPos(3 * cy + 3 * div, bcy).LeftPosZ(2, 60));
files_pane.Add(modified.TopPos(3 * cy + 3 * div, bcy).LeftPosZ(52, 70));
files_pane.Add(removed.TopPos(3 * cy + 3 * div, bcy).LeftPosZ(128, 80));
files_pane.Add(recent.TopPos(3 * cy + 3 * div, bcy).RightPos(0, bcx));
files_pane.Add(extension.TopPos(3 * cy + 3 * div, bcy).RightPos(bcx + DPI(8), bcx));
files_pane.Add(recent.TopPos(3 * cy + 3 * div, bcy).RightPos(0, bcx + Zx(8)));
files_pane.Add(extension.TopPos(3 * cy + 3 * div, bcy).RightPos(bcx + Zx(8) + DPI(8), bcx));
removed = 1;
added = 1;
@ -72,6 +75,7 @@ DirDiffDlg::DirDiffDlg()
added << [=] { ShowResult(); };
find << [=] { ShowResult(); };
extension << [=] { ShowResult(); };
recent << [=] { ShowResult(); };
clearFind << [=] { find.Clear(); ShowResult();};
files.WhenSel = THISBACK(File);
@ -210,8 +214,6 @@ void DirDiffDlg::Compare()
Progress pi(t_("Comparing.."));
pi.SetTotal(f.GetCount());
Date dlim = IsNull(recent) ? Null : GetSysDate() - (int)~recent;
list.Clear();
Index<String> exts;
for(int i = 0; i < f.GetCount(); i++) {
@ -219,14 +221,19 @@ void DirDiffDlg::Compare()
break;
String p1 = AppendFileName(~dir1, f[i]);
String p2 = AppendFileName(~dir2, f[i]);
int n = NORMAL_FILE;
int kind = NORMAL_FILE;
auto IsGit = [&](const String& path) {
return path.Find("/.git/") >= 0 || path.Find("\\.git/") >= 0 || path.Find("\\.git\\") >= 0 || path.Find("/.git\\") >= 0;
};
if((IsNull(dlim) || FileGetTime(p1) >= dlim || FileGetTime(p2) >= dlim) && !FileEqual(p1, p2, n) &&
!IsGit(p1) && !IsGit(p2)) {
if(!FileEqual(p1, p2, kind) && !IsGit(p1) && !IsGit(p2)) {
exts.FindAdd(GetFileExt(p1));
list.Add(MakeTuple(f[i], p1, p2, n));
FileInfo& m = list.Add();
m.file = f[i];
m.path1 = p1;
m.path2 = p2;
m.time1 = FileGetTime(p1);
m.time2 = FileGetTime(p2);
m.kind = kind;
}
}
@ -246,14 +253,14 @@ FileList::File DirDiffDlg::MakeFile(int i)
m.isdir = false;
m.unixexe = false;
m.hidden = false;
Image icn = WhenIcon(FileExists(list[i].b) ? list[i].b : list[i].c);
int k = list[i].d;
Image icn = WhenIcon(FileExists(list[i].path1) ? list[i].path1 : list[i].path2);
int k = list[i].kind;
if(IsNull(icn))
icn = CtrlImg::File();
m.icon = decode(k, FAILED_FILE, AdjustImage(icn, [](const Image& m) { return GetOver(m, DiffImg::Failed()); }),
PATCHED_FILE, AdjustImage(icn, [](const Image& m) { return GetOver(m, DiffImg::Patched()); }),
icn);
m.name = list[i].a;
m.name = list[i].file;
m.font = decode(k, FAILED_FILE, StdFont().Strikeout().Italic(),
PATCHED_FILE, StdFont().Italic(), StdFont());
m.ink = cs[k];
@ -269,14 +276,19 @@ void DirDiffDlg::ShowResult()
files.Clear();
String sFind = ToLower(~~find);
String ext = ToLower(~~extension);
for(int i = 0; i < list.GetCount(); i++)
{
int n = list[i].d;
String fn = ToLower(list[i].a);
if((n == NORMAL_FILE && modified || n == DELETED_FILE && removed
|| n == NEW_FILE && added || n == FAILED_FILE || n == PATCHED_FILE)
&& fn.Find(sFind) >= 0
&& fn.EndsWith(ext))
Date dlim = IsNull(recent) ? Null : GetSysDate() - (int)~recent;
for(int i = 0; i < list.GetCount(); i++) {
const FileInfo& fi = list[i];
int n = fi.kind;
String fn = ToLower(list[i].file);
if((IsNull(dlim) || fi.time1 >= dlim || fi.time2 >= dlim) &&
(n == NORMAL_FILE && modified ||
n == DELETED_FILE && removed ||
n == NEW_FILE && added ||
n == FAILED_FILE ||
n == PATCHED_FILE) &&
fn.Find(sFind) >= 0 &&
fn.EndsWith(ext))
files.Add(MakeFile(i));
}
Title(AsString(files.GetCount()) + " files");

View file

@ -94,7 +94,7 @@ PatchDiff::PatchDiff()
FileDelete(file_path);
else
SaveFile(file_path, patched_file);
list[ii].d = 4;
list[ii].kind = PATCHED_FILE;
files.Set(files.GetCursor(), MakeFile(ii));
Refresh();
}
@ -146,6 +146,7 @@ bool PatchDiff::Open(const char *patch_path, const Vector<String>& target_dirs0)
list.Clear();
pi.SetText("Checking files");
pi.SetTotal(patch.GetCount());
Time now = GetSysTime();
for(int i = 0; i < patch.GetCount(); i++) {
if(pi.StepCanceled())
return false;
@ -155,7 +156,11 @@ bool PatchDiff::Open(const char *patch_path, const Vector<String>& target_dirs0)
bool pe = h.GetCount();
bool x = FileExists(p);
bool failed = h.IsVoid();
list.Add(MakeTuple(fn, p, p, failed ? 3 : pe && x ? 0 : pe ? 2 : 1));
FileInfo& fi = list.Add();
fi.file = fn;
fi.path1 = fi.path2 = p;
fi.kind = failed ? FAILED_FILE : pe && x ? NORMAL_FILE : pe ? NEW_FILE : DELETED_FILE;
fi.time1 = fi.time2 = now;
if(failed)
failed_count++;
}
@ -197,7 +202,7 @@ void PatchDiff::File()
file_path = patch.GetPath(ii);
if(GetFileLength(file_path) < 4 * 1024 * 1024) {
String content = LoadFile(file_path);
if(list[ii].d == PATCHED_FILE) {
if(list[ii].kind == PATCHED_FILE) {
p2 = "[FILE IS PATCHED]";
diff.Set(content, content);
}

View file

@ -312,7 +312,16 @@ protected:
enum { NORMAL_FILE, DELETED_FILE, NEW_FILE, FAILED_FILE, PATCHED_FILE };
Array<Tuple<String, String, String, int>> list;
struct FileInfo {
String file;
String path1;
String path2;
Time time1;
Time time2;
int kind;
};
Array<FileInfo> list;
static bool FileEqual(const String& f1, const String& f2, int& n);

View file

@ -57,8 +57,8 @@ DirRepoDiffDlg::DirRepoDiffDlg()
files_pane.Add(added.TopPos(y, bcy).LeftPosZ(2, 60));
files_pane.Add(modified.TopPos(y, bcy).LeftPosZ(52, 70));
files_pane.Add(removed.TopPos(y, bcy).LeftPosZ(128, 80));
files_pane.Add(recent.TopPos(y, bcy).RightPos(0, bcx));
files_pane.Add(extension.TopPos(y, bcy).RightPos(bcx + DPI(8), bcx));
files_pane.Add(recent.TopPos(y, bcy).RightPos(0, bcx + Zx(8)));
files_pane.Add(extension.TopPos(y, bcy).RightPos(bcx + Zx(8) + DPI(8), bcx));
y += bcy + div;
files_pane.Add(files.VSizePos(y, Zy(24)).HSizePos());