Eolite/KFM2: 'Delete' feature rewritten (thanks IgorA for the report) - now always run in a separate process, other bugfixes

git-svn-id: svn://kolibrios.org@8861 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2021-06-15 18:22:58 +00:00
parent b436a2dc22
commit b3571d494b
5 changed files with 62 additions and 109 deletions

View File

@ -3,8 +3,9 @@
// 70.5 - get volume info and label // 70.5 - get volume info and label
#define TITLE "Eolite File Manager 5 Beta" #define ABOUT_TITLE "EOLITE 5 Beta2"
#define ABOUT_TITLE "EOLITE 5 Beta" #define TITLE_EOLITE "Eolite File Manager 5 Beta2"
#define TITLE_KFM "Kolibri File Manager 2 Beta2";
#ifndef AUTOBUILD #ifndef AUTOBUILD
#include "lang.h--" #include "lang.h--"
@ -125,7 +126,7 @@ _ini ini;
char scroll_used=false; char scroll_used=false;
dword about_stak=0,properties_stak=0,settings_stak=0,delete_stak=0; dword about_stak=0,properties_stak=0,settings_stak=0;
proc_info Form; proc_info Form;
int sc_slider_h; int sc_slider_h;
@ -199,10 +200,8 @@ void handle_param()
properties_dialog(); properties_dialog();
ExitProcess(); ExitProcess();
case 'd': case 'd':
strcpy(#file_path, p + 3); strcpy(#path, p + 3);
itdir = dir_exists(#file_path); DeleteThread();
DisplayOperationForm(DELETE_FLAG);
DeleteSingleElement();
ExitProcess(); ExitProcess();
case 'v': case 'v':
cut_active = ESBYTE[p+2] - '0'; cut_active = ESBYTE[p+2] - '0';
@ -244,7 +243,6 @@ void main()
ESBYTE[0] = NULL; ESBYTE[0] = NULL;
SystemDiscs.Get(); SystemDiscs.Get();
Open_Dir(#path,ONLY_OPEN); Open_Dir(#path,ONLY_OPEN);
strcpy(#inactive_path, #path); strcpy(#inactive_path, #path);
llist_copy(#files_inactive, #files); llist_copy(#files_inactive, #files);
@ -297,7 +295,6 @@ void main()
if (getElementSelectedFlag(files.cur_y) == false) selected_count = 0; //on redraw selection would be flashed, see [L001] if (getElementSelectedFlag(files.cur_y) == false) selected_count = 0; //on redraw selection would be flashed, see [L001]
EventShowListMenu(); EventShowListMenu();
} }
//break;
} }
if (mouse.x>=files.x+files.w) && (mouse.x<=files.x+files.w+16) && (mouse.y>files.y-17) && (mouse.y<files.y) if (mouse.x>=files.x+files.w) && (mouse.x<=files.x+files.w+16) && (mouse.y>files.y-17) && (mouse.y<files.y)
@ -345,16 +342,12 @@ void main()
if (efm) && (mouse.y > files.y) && (mouse.down) { if (efm) && (mouse.y > files.y) && (mouse.down) {
if (mouse.x<Form.cwidth/2) if (mouse.x<Form.cwidth/2)
{ {
if (active_panel!=1) if (active_panel!=1) {
{
active_panel = 1; active_panel = 1;
ChangeActivePanel(); ChangeActivePanel();
} }
} } else {
else if (active_panel!=2) {
{
if (active_panel!=2)
{
active_panel = 2; active_panel = 2;
ChangeActivePanel(); ChangeActivePanel();
} }
@ -436,16 +429,13 @@ void main()
if (new_element_active) || (del_active) || (dev_popin_active_on_panel) if (new_element_active) || (del_active) || (dev_popin_active_on_panel)
{ {
if (dev_popin_active_on_panel) {
if (key_scancode == SCAN_CODE_ESC) EventClosePopinForm(); if (key_scancode == SCAN_CODE_ESC) EventClosePopinForm();
}
if (del_active) { if (del_active) {
if (key_scancode == SCAN_CODE_ENTER) EventDelete(); if (key_scancode == SCAN_CODE_ENTER) EventDelete();
if (key_scancode == SCAN_CODE_ESC) EventClosePopinForm();
} }
if (new_element_active) { if (new_element_active) {
if (key_scancode == SCAN_CODE_ENTER) NewElement(); if (key_scancode == SCAN_CODE_ENTER) NewElement();
if (key_scancode == SCAN_CODE_ESC) EventClosePopinForm();
EAX = key_editbox; EAX = key_editbox;
edit_box_key stdcall (#new_file_ed); edit_box_key stdcall (#new_file_ed);
} }
@ -481,18 +471,17 @@ void main()
case SCAN_CODE_1...SCAN_CODE_10: case SCAN_CODE_1...SCAN_CODE_10:
key_scancode-=2; key_scancode-=2;
if (key_scancode >= SystemDiscs.list.count) break; if (key_scancode >= SystemDiscs.list.count) break;
if (!efm) if (!efm) {
{
DrawRectangle(17,key_scancode*16+74,159,16, 0); //display click DrawRectangle(17,key_scancode*16+74,159,16, 0); //display click
pause(7); pause(7);
} }
SystemDiscs.Click(key_scancode); SystemDiscs.Click(key_scancode);
break; break;
case SCAN_CODE_KEY_X: case SCAN_CODE_KEY_X:
EventCopy(CUT); CopyFilesListToClipboard(CUT);
break; break;
case SCAN_CODE_KEY_C: case SCAN_CODE_KEY_C:
EventCopy(NOCUT); CopyFilesListToClipboard(COPY);
break; break;
case SCAN_CODE_KEY_G: case SCAN_CODE_KEY_G:
EventOpenConsoleHere(); EventOpenConsoleHere();
@ -567,15 +556,13 @@ void main()
case evReDraw: case evReDraw:
draw_window(); draw_window();
if (CheckActiveProcess(Form.ID)) && (GetMenuClick()) break; if (CheckActiveProcess(Form.ID)) && (GetMenuClick()) break;
if (action_buf==OPERATION_END) if (action_buf==OPERATION_END) {
{
EventRefresh(); EventRefresh();
action_buf=0; action_buf=0;
} }
break; break;
default: default:
if (Form.status_window>2) break; if (Form.status_window<=2) EventRefreshDisksAndFolders();
EventRefreshDisksAndFolders();
} }
if(cmd_free) if(cmd_free)
@ -583,7 +570,6 @@ void main()
if(cmd_free==2) about_stak=free(about_stak); if(cmd_free==2) about_stak=free(about_stak);
else if(cmd_free==3) properties_stak=free(properties_stak); else if(cmd_free==3) properties_stak=free(properties_stak);
else if(cmd_free==4) settings_stak=free(settings_stak); else if(cmd_free==4) settings_stak=free(settings_stak);
else if(cmd_free==6) delete_stak=free(delete_stak);
cmd_free = false; cmd_free = false;
} }
} }
@ -594,7 +580,7 @@ void draw_window()
incn x; incn x;
dword title; dword title;
if (show_status_bar.checked) status_bar_h = STATUS_BAR_H; else status_bar_h = 0; if (show_status_bar.checked) status_bar_h = STATUS_BAR_H; else status_bar_h = 0;
if (efm) title = "Kolibri File Manager 2 - BETA"; else title = TITLE; if (efm) title = TITLE_KFM; else title = TITLE_EOLITE;
DefineAndDrawWindow(Form.left+rand_n,Form.top+rand_n,Form.width,Form.height,0x73,NULL,title,0); DefineAndDrawWindow(Form.left+rand_n,Form.top+rand_n,Form.width,Form.height,0x73,NULL,title,0);
GetProcessInfo(#Form, SelfInfo); GetProcessInfo(#Form, SelfInfo);
if (Form.status_window>2) return; if (Form.status_window>2) return;
@ -624,8 +610,8 @@ void draw_window()
ESDWORD[#toolbar_pal] = sc.work; ESDWORD[#toolbar_pal] = sc.work;
ESDWORD[#toolbar_pal+4] = MixColors(0, sc.work, 35); ESDWORD[#toolbar_pal+4] = MixColors(0, sc.work, 35);
PutPaletteImage(#toolbar, 246, 34, 0, 0, 8, #toolbar_pal); PutPaletteImage(#toolbar, 246, 34, 0, 0, 8, #toolbar_pal);
for (i=0; i<3; i++) DefineHiddenButton(toolbar_buttons_x[i]+2,7,31-5,29-5,21+i); for (i=0; i<3; i++) DefineHiddenButton(toolbar_buttons_x[i]+2,7,31-5,29-5,BACK_BTN+i);
for (i=3; i<6; i++) DefineHiddenButton(toolbar_buttons_x[i], 5,31, 29, 21+i); for (i=3; i<6; i++) DefineHiddenButton(toolbar_buttons_x[i], 5,31, 29, BACK_BTN+i);
DrawBar(127, 8, 1, 25, sc.work_graph); DrawBar(127, 8, 1, 25, sc.work_graph);
DrawBar(246,0, Form.cwidth - 246, 34, sc.work); DrawBar(246,0, Form.cwidth - 246, 34, sc.work);
DrawDot(Form.cwidth-17,12); DrawDot(Form.cwidth-17,12);
@ -1193,7 +1179,7 @@ void FnProcess(byte N)
break; break;
case 5: case 5:
if (efm) { if (efm) {
EventCopy(false); CopyFilesListToClipboard(COPY);
EventPaste(#inactive_path); EventPaste(#inactive_path);
} else { } else {
EventRefresh(); EventRefresh();
@ -1201,7 +1187,7 @@ void FnProcess(byte N)
break; break;
case 6: case 6:
if (efm) { if (efm) {
EventCopy(true); CopyFilesListToClipboard(CUT);
EventPaste(#inactive_path); EventPaste(#inactive_path);
} }
break; break;
@ -1384,16 +1370,12 @@ void EventPaste(dword _into_path) {
} }
void EventDelete() void EventDelete()
char line_param[4096+5];
{ {
char line_param[4096+5];
CopyFilesListToClipboard(DELETE);
EventClosePopinForm(); EventClosePopinForm();
if (!selected_count) {
sprintf(#line_param, "-d %s", #file_path); sprintf(#line_param, "-d %s", #file_path);
RunProgram(#program_path, #line_param); RunProgram(#program_path, #line_param);
} else {
delete_stak = malloc(40000);
CreateThread(#DeleteSelectedElements,delete_stak+40000-4);
}
} }
void EventClosePopinForm() void EventClosePopinForm()
@ -1402,8 +1384,6 @@ void EventClosePopinForm()
new_element_active = 0; new_element_active = 0;
dev_popin_active_on_panel = 0; dev_popin_active_on_panel = 0;
draw_window(); draw_window();
//DeleteButton(POPUP_BTN1);
//DeleteButton(POPUP_BTN2);
} }
void EventShowProperties() void EventShowProperties()
@ -1453,8 +1433,8 @@ void EventToolbarButtonClick(int _btid)
case BACK_BTN: EventHistoryGoBack(); break; case BACK_BTN: EventHistoryGoBack(); break;
case FWRD_BTN: EventHistoryGoForward(); break; case FWRD_BTN: EventHistoryGoForward(); break;
case GOUP_BTN: Dir_Up(); break; case GOUP_BTN: Dir_Up(); break;
case COPY_BTN: EventCopy(CUT); break; case COPY_BTN: CopyFilesListToClipboard(CUT); break;
case CUT_BTN: EventCopy(NOCUT); break; case CUT_BTN: CopyFilesListToClipboard(COPY); break;
case PASTE_BTN:EventPaste(#path); break; case PASTE_BTN:EventPaste(#path); break;
} }
} }

View File

@ -45,9 +45,9 @@ byte copy_to[4096];
byte copy_from[4096]; byte copy_from[4096];
bool cut_active = false; bool cut_active = false;
enum {NOCUT, CUT}; enum {COPY, CUT, DELETE};
void EventCopy(bool _cut_active) void CopyFilesListToClipboard(bool _cut_active)
{ {
byte copy_t[4096]; byte copy_t[4096];
dword buff_data; dword buff_data;
@ -58,7 +58,7 @@ void EventCopy(bool _cut_active)
if (files.count<=0) return; //no files if (files.count<=0) return; //no files
cut_active = _cut_active; if (cut_active!=DELETE) cut_active = _cut_active;
//if no element selected by "Insert" key, then we copy current element //if no element selected by "Insert" key, then we copy current element
if (!selected_count) { if (!selected_count) {
@ -88,8 +88,6 @@ void EventCopy(bool _cut_active)
sprintf(copy_buf_offset,"%s/%s",#path,items.get(i)*304+buf+72); sprintf(copy_buf_offset,"%s/%s",#path,items.get(i)*304+buf+72);
copy_buf_offset += strlen(copy_buf_offset) + 1; copy_buf_offset += strlen(copy_buf_offset) + 1;
//setElementSelectedFlag(i, false);
if (cut_active) { if (cut_active) {
if (i>=files.first) && (i<files.first+files.visible) if (i>=files.first) && (i<files.first+files.visible)
PutShadow(files.x+4,i-files.first*files.item_h+files.y,16,files.item_h,1,-3); PutShadow(files.x+4,i-files.first*files.item_h+files.y,16,files.item_h,1,-3);
@ -138,7 +136,6 @@ void PasteThread()
if (EAX!=0) goto _DIFFERENT_DRIVES; if (EAX!=0) goto _DIFFERENT_DRIVES;
path_offset += strlen(path_offset) + 1; path_offset += strlen(path_offset) + 1;
} }
cut_active=false;
DialogExit(); DialogExit();
} }
@ -161,7 +158,7 @@ _DIFFERENT_DRIVES:
} }
if (strstr(#copy_to, #copy_from)) if (strstr(#copy_to, #copy_from))
{ {
notify("Copy directory into itself is a bad idea..."); notify("'Not possible to copy directory into itself.\nProcess terminated.' -E");
DialogExit(); DialogExit();
} }
@ -173,12 +170,11 @@ _DIFFERENT_DRIVES:
else if (cut_active) else if (cut_active)
{ {
strcpy(#file_path, #copy_from); strcpy(#file_path, #copy_from);
Del_File2(#copy_from, 0); RecursiveDelete(#copy_from, false);
} }
path_offset += strlen(path_offset) + 1; path_offset += strlen(path_offset) + 1;
} }
cut_active=false;
DialogExit(); DialogExit();
} }
@ -190,7 +186,7 @@ _DIFFERENT_DRIVES:
//===================================================// //===================================================//
int del_error; int del_error;
int Del_File2(dword way, sh_progr) int RecursiveDelete(dword way, bool show_progress)
{ {
dword dirbuf, fcount, i, filename; dword dirbuf, fcount, i, filename;
int error; int error;
@ -205,11 +201,11 @@ int Del_File2(dword way, sh_progr)
sprintf(#del_from,"%s/%s",way,filename); sprintf(#del_from,"%s/%s",way,filename);
if ( TestBit(ESDWORD[filename-40], 4) ) if ( TestBit(ESDWORD[filename-40], 4) )
{ {
Del_File2(#del_from, 1); RecursiveDelete(#del_from, true);
} }
else else
{ {
if (sh_progr) Operation_Draw_Progress(filename); if (show_progress) Operation_Draw_Progress(filename);
if (error = DeleteFile(#del_from)) del_error = error; if (error = DeleteFile(#del_from)) del_error = error;
} }
} }
@ -217,51 +213,31 @@ int Del_File2(dword way, sh_progr)
if (error = DeleteFile(way)) del_error = error; if (error = DeleteFile(way)) del_error = error;
} }
void DeleteSingleElement() void DeleteThread()
{ {
DIR_SIZE delete_dir_size; int j;
del_error = NULL; int elements_count = 0;
dword buf;
if (itdir) { dword path_offset;
copy_bar.max = delete_dir_size.get(#file_path);
} else {
copy_bar.max = 1;
}
Del_File2(#file_path, 1);
if (del_error) Write_Error(del_error);
DialogExit();
}
void DeleteSelectedElements()
{
byte del_from[4096];
int i;
DisplayOperationForm(DELETE_FLAG); DisplayOperationForm(DELETE_FLAG);
if (!selected_count) { DeleteSingleElement(); return; } buf = Clipboard__GetSlotData(Clipboard__GetSlotCount()-1);
Clipboard__DeleteLastSlot();
if (DSDWORD[buf+4] != 3) return;
elements_count = ESINT[buf+8];
for (i=0; i<files.count; i++) path_offset = buf + 10;
{ for (j = 0; j < elements_count; j++) {
if (getElementSelectedFlag(i) == true) { copy_bar.max += GetFilesCount(path_offset);
sprintf(#del_from,"%s/%s",#path,items.get(i)*304+buf+72); path_offset += strlen(path_offset) + 1;
copy_bar.max += GetFilesCount(#del_from);
}
} }
del_error = 0; path_offset = buf + 10;
for (j = 0; j < elements_count; j++) {
for (i=0; i<files.count; i++) RecursiveDelete(path_offset, true);
{ path_offset += strlen(path_offset) + 1;
if (getElementSelectedFlag(i) == true) {
sprintf(#del_from,"%s/%s", #path, items.get(i)*304+buf+72);
Del_File2(#del_from, 1);
} }
}
if (del_error) Write_Error(del_error); if (del_error) Write_Error(del_error);
cmd_free = 6;
DialogExit(); DialogExit();
} }

View File

@ -103,8 +103,8 @@ void EventMenuClick(dword _id)
if (active_menu == MENU_FILE) switch(_id) { if (active_menu == MENU_FILE) switch(_id) {
case 1: EventOpen(0); break; case 1: EventOpen(0); break;
case 2: ShowOpenWithDialog(); break; case 2: ShowOpenWithDialog(); break;
case 3: EventCopy(NOCUT); break; case 3: CopyFilesListToClipboard(COPY); break;
case 4: EventCopy(CUT); break; case 4: CopyFilesListToClipboard(CUT); break;
case 5: EventPaste(#path); break; case 5: EventPaste(#path); break;
case 6: FnProcess(2); break; case 6: FnProcess(2); break;
case 7: Del_Form(); break; case 7: Del_Form(); break;
@ -112,8 +112,8 @@ void EventMenuClick(dword _id)
} }
if (active_menu == MENU_DIR) switch(_id) { if (active_menu == MENU_DIR) switch(_id) {
case 1: EventOpen(0); break; case 1: EventOpen(0); break;
case 2: EventCopy(NOCUT); break; case 2: CopyFilesListToClipboard(COPY); break;
case 3: EventCopy(CUT); break; case 3: CopyFilesListToClipboard(CUT); break;
case 4: EventPaste(#path); break; case 4: EventPaste(#path); break;
case 5: Del_Form(); break; case 5: Del_Form(); break;
case 6: FnProcess(1); break; case 6: FnProcess(1); break;

View File

@ -42,7 +42,6 @@ void DisplayOperationForm(int operation_flag)
switch(CheckEvent()) switch(CheckEvent())
{ {
case evButton: case evButton:
notify(T_CANCEL_PASTE);
DialogExit(); DialogExit();
break; break;

View File

@ -18,7 +18,6 @@
?define T_MOVE_WINDOW_TITLE "<EFBFBD>¥à¥¬¥é î..." ?define T_MOVE_WINDOW_TITLE "<EFBFBD>¥à¥¬¥é î..."
?define T_DELETE_WINDOW_TITLE "“¤ «ïî..." ?define T_DELETE_WINDOW_TITLE "“¤ «ïî..."
?define T_ABORT_WINDOW_BUTTON "<EFBFBD>à¥à¢ âì" ?define T_ABORT_WINDOW_BUTTON "<EFBFBD>à¥à¢ âì"
?define T_CANCEL_PASTE "Š®¯¨à®¢ ­¨¥ ¯à¥ªà é¥­®. <20> ¯ª  ᪮¯¨à®¢ ­  ­¥ ¯®«­®áâìî."
?define T_SELECT_APP_TO_OPEN_WITH "‚ë¡¥à¨â¥ ¯à®£à ¬¬ã ¤«ï ®âªàëâ¨ï ä ©« " ?define T_SELECT_APP_TO_OPEN_WITH "‚ë¡¥à¨â¥ ¯à®£à ¬¬ã ¤«ï ®âªàëâ¨ï ä ©« "
?define DEL_MORE_FILES_1 "¢ë¡à ­­ë¥ í«¥¬¥­âë (" ?define DEL_MORE_FILES_1 "¢ë¡à ­­ë¥ í«¥¬¥­âë ("
?define DEL_MORE_FILES_2 " èâ.)?" ?define DEL_MORE_FILES_2 " èâ.)?"
@ -48,7 +47,6 @@
?define T_MOVE_WINDOW_TITLE "Moving..." ?define T_MOVE_WINDOW_TITLE "Moving..."
?define T_DELETE_WINDOW_TITLE "Deleting..." ?define T_DELETE_WINDOW_TITLE "Deleting..."
?define T_ABORT_WINDOW_BUTTON "Abort" ?define T_ABORT_WINDOW_BUTTON "Abort"
?define T_CANCEL_PASTE "Copy process terminated. Folder copied incompletely."
?define T_SELECT_APP_TO_OPEN_WITH "Select application to open file" ?define T_SELECT_APP_TO_OPEN_WITH "Select application to open file"
?define DEL_MORE_FILES_1 "selected items(" ?define DEL_MORE_FILES_1 "selected items("
?define DEL_MORE_FILES_2 " pcs.)?" ?define DEL_MORE_FILES_2 " pcs.)?"