diff --git a/uppsrc/TextDiffCtrl/DirDiff.cpp b/uppsrc/TextDiffCtrl/DirDiff.cpp index 9678b773e..92feb7945 100644 --- a/uppsrc/TextDiffCtrl/DirDiff.cpp +++ b/uppsrc/TextDiffCtrl/DirDiff.cpp @@ -66,9 +66,9 @@ DirDiffDlg::DirDiffDlg() seldir1.Title("First directory to compare"); seldir2.Title("Second directory to compare"); - compare <<= THISBACK(Compare); - dir1 <<= THISBACK(ClearFiles); - dir2 <<= THISBACK(ClearFiles); + compare << [=] { Compare(); }; + dir1 << [=] { ClearFiles(); }; + dir2 << [=] { ClearFiles(); }; modified << [=] { ShowResult(); }; removed << [=] { ShowResult(); }; @@ -196,7 +196,7 @@ bool DirDiffDlg::FileEqual(const String& f1, const String& f2, int& kind) return false; } -void DirDiffDlg::Compare() +void DirDiffDlg::Compare(const String& types) { VectorMap fs; GatherFilesDeep(fs, ~dir1, Null); @@ -219,20 +219,22 @@ void DirDiffDlg::Compare() if(pi.StepCanceled()) break; String p = fs.GetKey(i); - String p1 = AppendFileName(~dir1, p); - String p2 = AppendFileName(~dir2, p); - 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(!FileEqual(p1, p2, kind) && !IsGit(p1) && !IsGit(p2)) { - exts.FindAdd(GetFileExt(p1)); - FileInfo& m = list.Add(); - m.file = p; - m.path1 = p1; - m.path2 = p2; - m.time = fs[i]; - m.kind = kind; + if(IsNull(types) || PatternMatchMulti(types, GetFileName(p))) { + String p1 = AppendFileName(~dir1, p); + String p2 = AppendFileName(~dir2, p); + 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(!FileEqual(p1, p2, kind) && !IsGit(p1) && !IsGit(p2)) { + exts.FindAdd(GetFileExt(p1)); + FileInfo& m = list.Add(); + m.file = p; + m.path1 = p1; + m.path2 = p2; + m.time = fs[i]; + m.kind = kind; + } } } diff --git a/uppsrc/TextDiffCtrl/TextDiffCtrl.h b/uppsrc/TextDiffCtrl/TextDiffCtrl.h index 4c80cfb8b..8c0df4ed5 100644 --- a/uppsrc/TextDiffCtrl/TextDiffCtrl.h +++ b/uppsrc/TextDiffCtrl/TextDiffCtrl.h @@ -330,7 +330,7 @@ protected: static bool FileEqual(const String& f1, const String& f2, int& kind); void GatherFilesDeep(VectorMap& files, const String& base, const String& path); - void Compare(); + void Compare(const String& types = Null); void ShowResult(); void ClearFiles(); virtual void File(); diff --git a/uppsrc/ide/DirRepoDiff.cpp b/uppsrc/ide/DirRepoDiff.cpp index 6c800a417..8e4781a00 100644 --- a/uppsrc/ide/DirRepoDiff.cpp +++ b/uppsrc/ide/DirRepoDiff.cpp @@ -51,21 +51,34 @@ DirRepoDiffDlg::DirRepoDiffDlg() files_pane << r[i].HSizePos().TopPos(y, cy); y += lcy + lcy / 2; } + + files_pane << masks.TopPos(y, cy).HSizePos(); + masks.NullText("Scan all file types"); + y += lcy + div; + + masks.AddList("*.cpp *.h *.hpp *.c *.C *.cc *.cxx *.icpp"); + masks.AddList("*.diff *.patch"); + masks.AddList("*.java"); + masks.AddList("*.json"); + masks.AddList("*.py *.pyc *.pyd *.pyo"); + masks.AddList("*.html *.js *.css *.witz"); + masks.AddList("*.xml *.xsd"); + masks.AddList("*.sch *.usc *.dbg *.rc *.brc *.upt"); - files_pane.Add(hidden.TopPos(y, bcy).LeftPos(0, bcx)); - files_pane.Add(split_lines.TopPos(y, bcy).LeftPosZ(52, 100)); - files_pane.Add(compare.TopPos(y, bcy).RightPos(0, bcx)); + files_pane << hidden.TopPos(y, bcy).LeftPos(0, bcx); + files_pane << split_lines.TopPos(y, bcy).LeftPosZ(52, 100); + files_pane << compare.TopPos(y, bcy).RightPos(0, bcx); y += bcy + div; - 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 + Zx(8))); - files_pane.Add(extension.TopPos(y, bcy).RightPos(bcx + Zx(8) + DPI(8), bcx)); + files_pane << added.TopPos(y, bcy).LeftPosZ(2, 60); + files_pane << modified.TopPos(y, bcy).LeftPosZ(52, 70); + files_pane << removed.TopPos(y, bcy).LeftPosZ(128, 80); + files_pane << recent.TopPos(y, bcy).RightPos(0, bcx + Zx(8)); + files_pane << extension.TopPos(y, bcy).RightPos(bcx + Zx(8) + DPI(8), bcx); y += bcy + div; - files_pane.Add(files.VSizePos(y, Zy(24)).HSizePos()); - files_pane.Add(find.BottomPosZ(6, 19).HSizePosZ()); + files_pane << files.VSizePos(y, Zy(24)).HSizePos(); + files_pane << find.BottomPosZ(6, 19).HSizePosZ(); extension.Disable(); @@ -173,5 +186,5 @@ void DirRepoDiffDlg::Compare() return true; }; if(Clone(0, dir1, lmid) && Clone(1, dir2, rmid)) - DirDiffDlg::Compare(); + DirDiffDlg::Compare(~masks); } \ No newline at end of file diff --git a/uppsrc/ide/urepo.h b/uppsrc/ide/urepo.h index 55d34fbd6..da522af52 100644 --- a/uppsrc/ide/urepo.h +++ b/uppsrc/ide/urepo.h @@ -99,6 +99,7 @@ struct DirRepoDiffDlg : public DirDiffDlg { DropList mode[2]; Button hash[2], log[2]; DropList r[2], branch[2]; + WithDropChoice masks; Vector gitd; String session_id;