|
103 | 103 | (* ADD: exclude in sync *) |
104 | 104 | (* FIX: preserve selection and focus when reloading dir *) |
105 | 105 | (* ADD: REST Server *) |
| 106 | +(* FIX: did not refresh folder if subfolder was deleted *) |
106 | 107 | (* *) |
107 | 108 | (******************************************************************************) |
108 | 109 | (* Silk icon set 1.3 used *) |
|
293 | 294 | Procedure DeleteShortcut; |
294 | 295 | Procedure IncGetElementCounter(Const aFolder: String); // aFolder ohne Pathdelim am ende ! |
295 | 296 | Procedure DecGetElementCounter(Const aFolder: String); // aFolder ohne Pathdelim am ende ! |
| 297 | + Procedure HandleJobQueue(); // Übernimmt alle Jobs die via AddToJobQueue eingetragen wurden ;) |
296 | 298 | public |
297 | 299 | fWorkThread: TWorkThread; // Bäh wieder Private machen ! |
298 | 300 | fLeftView, fRightView: TView; // Bäh wieder Private machen ! |
299 | 301 | Procedure LoadDir(Dir: String; Var View: TView; ForceElementBufferRefresh: Boolean = false); |
300 | | - Procedure AddToJobQueue(Const Job: TJob); //Fügt non LCL Blocking in die JobQueue ein, zum Übernehmen muss HandleJobQueue aufgerufen werden ! |
301 | | - Procedure HandleJobQueue(); // Arbeitet die JobQueue ab und übergibt die Jobs an die Threads |
| 302 | + Procedure AddToJobQueue(Const Job: TJob); //Fügt non LCL Blocking in die JobQueue ein |
302 | 303 | End; |
303 | 304 |
|
304 | 305 | Var |
|
639 | 640 | End; |
640 | 641 |
|
641 | 642 | Procedure TForm1.FormClose(Sender: TObject; Var CloseAction: TCloseAction); |
| 643 | +Var |
| 644 | + Workthread_reference: TWorkThread; |
642 | 645 | Begin |
643 | 646 | FreeRestAPI; |
644 | | - |
645 | | - If fWorkThread.JobsPending Then Begin |
646 | | - fWorkThread.OnFinishJob := Nil; // Der User Braucht auch nicht mehr sehen dass wir die Löschen |
647 | | - fWorkThread.CancelAllJobs(); |
648 | | - While fWorkThread.JobsPending Do Begin |
| 647 | + Workthread_reference := fWorkThread; |
| 648 | + fWorkThread := Nil; // Das sorgt dafür, dass der On Idle Handler nichts mehr macht ;) |
| 649 | + If Workthread_reference.JobsPending Then Begin |
| 650 | + Workthread_reference.OnFinishJob := Nil; // Der User Braucht auch nicht mehr sehen dass wir die Löschen |
| 651 | + Workthread_reference.CancelAllJobs(); |
| 652 | + While Workthread_reference.JobsPending Do Begin |
649 | 653 | sleep(1); |
650 | 654 | End; |
651 | 655 | End; |
652 | | - fWorkThread.Terminate; |
| 656 | + Workthread_reference.Terminate; |
653 | 657 | (* |
654 | 658 | * theoretisch Idled der Thread im 1ms takt, d.h. nach 10ms ist er auf jeden Fall weg. |
655 | 659 | *) |
|
659 | 663 | fJobFifo.free; |
660 | 664 | fJobFifo := Nil; |
661 | 665 | Sleep(10); |
662 | | - fWorkThread.free; |
663 | | - fWorkThread := Nil; |
| 666 | + Workthread_reference.free; |
| 667 | + Workthread_reference := Nil; |
664 | 668 |
|
665 | 669 | finiFile.WriteString(iniLeft, iniLastDir, cbDirLeft.text); |
666 | 670 | finiFile.WriteString(iniRight, iniLastDir, cbDirRight.text); |
|
700 | 704 | j := fWorkThread.PopQuestion(); |
701 | 705 | j.Answer := fWorkThread.AllResult; |
702 | 706 | AddToJobQueue(j); |
703 | | - HandleJobQueue(); |
704 | 707 | End |
705 | 708 | Else Begin |
706 | 709 | form5.ModalResult := mrNone; |
|
719 | 722 | j.ToAll := true; |
720 | 723 | j.Answer := jaSkip; |
721 | 724 | AddToJobQueue(j); |
722 | | - HandleJobQueue(); |
723 | 725 | End |
724 | 726 | Else Begin |
725 | 727 | j.free; |
|
730 | 732 | j.ToAll := Form5.CheckBox1.Checked; |
731 | 733 | j.Answer := jaReplace; |
732 | 734 | AddToJobQueue(j); |
733 | | - HandleJobQueue(); |
734 | 735 | End; |
735 | 736 | End; |
736 | 737 | End; |
737 | 738 | End; |
| 739 | + HandleJobQueue(); |
738 | 740 | End; |
739 | 741 | sleep(1); |
740 | 742 | End; |
|
928 | 930 | End; |
929 | 931 | AddToJobQueue(job); |
930 | 932 | End; |
931 | | - HandleJobQueue(); |
932 | 933 | End; |
933 | 934 | End; |
934 | 935 |
|
|
1057 | 1058 | oListview.SetFocus; |
1058 | 1059 | If assigned(oListview.ItemFocused) Then Begin |
1059 | 1060 | oListview.ItemFocused.Selected := true; |
| 1061 | + End |
| 1062 | + Else Begin |
| 1063 | + // Wir wählen eins in der "Nähe" aus, oder wenn der Itemindex auch kaputt ist, eben das 1. |
| 1064 | + ListViewSelectItemIndex(oListview, max(0, min(oListview.ItemIndex, oListview.Items.Count - 1))); |
1060 | 1065 | End; |
1061 | 1066 | key := 0; |
1062 | 1067 | exit; |
|
1222 | 1227 | AddtoCreateAndAddJobQueue(aListview.Items[i], jsCopy, aView^.aDirectory, oView^.aDirectory); |
1223 | 1228 | End; |
1224 | 1229 | End; |
1225 | | - HandleJobQueue(); |
1226 | 1230 | {$IFDEF Windows} |
1227 | 1231 | End; |
1228 | 1232 | {$ENDIF} |
|
1237 | 1241 | AddtoCreateAndAddJobQueue(aListview.Items[i], jsCopy, aView^.aDirectory, oView^.aDirectory); |
1238 | 1242 | End; |
1239 | 1243 | End; |
1240 | | - HandleJobQueue(); |
1241 | 1244 | End; |
1242 | 1245 | // F6 = Move |
1243 | 1246 | If key = VK_F6 Then Begin |
|
1248 | 1251 | AddtoCreateAndAddJobQueue(aListview.Items[i], jsMove, aView^.aDirectory, oView^.aDirectory); |
1249 | 1252 | End; |
1250 | 1253 | End; |
1251 | | - HandleJobQueue(); |
1252 | 1254 | End; |
1253 | 1255 | // F8 = Delete |
1254 | 1256 | If key = VK_F8 Then Begin |
|
1259 | 1261 | AddtoCreateAndAddJobQueue(aListview.Items[i], jsDel, aView^.aDirectory, ''); |
1260 | 1262 | End; |
1261 | 1263 | End; |
1262 | | - HandleJobQueue(); |
1263 | 1264 | End; |
1264 | 1265 | // User Search eingaben ;) |
1265 | 1266 | If key = VK_ESCAPE Then Begin |
|
1657 | 1658 | While Not fJobFifo.isempty Do Begin |
1658 | 1659 | job := fJobFifo.Pop; |
1659 | 1660 | // Gibt es diesen Job schon in unseren Listen ? |
1660 | | - If fWorkThread.ExistJob(job) Then Begin |
| 1661 | + If assigned(fWorkThread) And fWorkThread.ExistJob(job) Then Begin |
1661 | 1662 | If ID_NO = Application.MessageBox(pchar('Warning, Job:' + LineEnding + JobToString(job) + LineEnding + 'already exists in queue. Do you want to add the job anyway?') |
1662 | 1663 | , 'Warning' |
1663 | 1664 | , MB_YESNO Or MB_ICONQUESTION) Then Begin |
|
1670 | 1671 | n.Data := job; |
1671 | 1672 | form2.Invalidate; |
1672 | 1673 | // Aufnehmen in die Arbeiter Klasse ;) |
1673 | | - fWorkThread.AddJob(job); |
| 1674 | + If assigned(fWorkThread) Then Begin |
| 1675 | + fWorkThread.AddJob(job); |
| 1676 | + End |
| 1677 | + Else Begin |
| 1678 | + job.free; |
| 1679 | + End; |
1674 | 1680 | End; |
1675 | 1681 | End; |
1676 | 1682 |
|
|
1726 | 1732 | End; |
1727 | 1733 | End; |
1728 | 1734 | jtDelFile, jtDelDir: Begin |
1729 | | - s := IncludeTrailingPathDelimiter(ExtractFilePath(job.Source)); |
| 1735 | + If Job.JobType = jtDelDir Then Begin |
| 1736 | + s := IncludeTrailingPathDelimiter(ExtractFilePath(ExcludeTrailingPathDelimiter(job.Source))); |
| 1737 | + End |
| 1738 | + Else Begin |
| 1739 | + s := IncludeTrailingPathDelimiter(ExtractFilePath(job.Source)); |
| 1740 | + End; |
1730 | 1741 | decGetElementCounter(ExcludeTrailingPathDelimiter(s)); |
1731 | 1742 | If s = fLeftView.aDirectory Then LoadDir(s, fLeftView); |
1732 | 1743 | If s = fRightView.aDirectory Then LoadDir(s, fRightView); |
|
0 commit comments