Eolite 3.2: deleting in another thread; progressbar while deleting

git-svn-id: svn://kolibrios.org@5804 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Serhii Sakhno 2015-09-05 17:50:37 +00:00
parent 1ed8c3d59c
commit 5d4d8a053c
5 changed files with 181 additions and 122 deletions

View File

@ -13,7 +13,6 @@
#include "..\lib\file_system.h" #include "..\lib\file_system.h"
#include "..\lib\gui.h" #include "..\lib\gui.h"
#include "..\lib\list_box.h" #include "..\lib\list_box.h"
#include "..\lib\copyf.h"
#include "..\lib\random.h" #include "..\lib\random.h"
#include "..\lib\font.h" #include "..\lib\font.h"
//obj //obj
@ -65,7 +64,7 @@ dword eolite_ini_path;
char scroll_used=false; char scroll_used=false;
dword menu_stak,about_stak,properties_stak,settings_stak,copy_stak; dword menu_stak,about_stak,properties_stak,settings_stak,copy_stak,delete_stak;
proc_info Form; proc_info Form;
int mouse_dd, sc_slider_h, kolibrios_drive; int mouse_dd, sc_slider_h, kolibrios_drive;
@ -88,7 +87,10 @@ PathShow_data PathShow = {0, 17,250, 6, 250, 0, 0, 0x0, 0xFFFfff, #path, #temp,
PathShow_data FileShow = {0, 56,215, 6, 100, 0, 0, 0x0, 0xFFFfff, #file_name, #temp, 0}; PathShow_data FileShow = {0, 56,215, 6, 100, 0, 0, 0x0, 0xFFFfff, #file_name, #temp, 0};
byte cmd_free=0; byte cmd_free=0;
#include "include\translations.h" #include "include\translations.h"
#include "include\fs.h"
#include "include\settings.h" #include "include\settings.h"
#include "include\progress_dialog.h"
#include "..\lib\copyf.h"
#include "include\copy.h" #include "include\copy.h"
#include "include\gui.h" #include "include\gui.h"
#include "include\sorting.h" #include "include\sorting.h"
@ -300,7 +302,7 @@ void main()
} }
if (del_active) if (del_active)
{ {
if (id==301) || (id==302) Del_File(302-id); if (id==301) || (id==302) Del_File(302-id);
break; break;
} }
if (new_element_active) if (new_element_active)
@ -492,7 +494,7 @@ void main()
draw_window(); draw_window();
if (action_buf) if (action_buf)
{ {
if (action_buf==COPY_PASTE_END) if (action_buf==OPERATION_END)
{ {
FnProcess(5); FnProcess(5);
SelectFileByName(#copy_to+strrchr(#copy_to,'/')); SelectFileByName(#copy_to+strrchr(#copy_to,'/'));
@ -800,10 +802,6 @@ void Del_Form()
byte f_count[128]; byte f_count[128];
int dform_x = files.w - 220 / 2 + files.x; int dform_x = files.w - 220 / 2 + files.x;
if (!strncmp(#file_name,".",2)) || (!strncmp(#file_name,"..",2)) return; if (!strncmp(#file_name,".",2)) || (!strncmp(#file_name,"..",2)) return;
if (del_active==2)
{
if (itdir) ShowMessage(WAIT_DELETING_FOLDER, 0);
}
else else
{ {
if (!files.count) return; if (!files.count) return;
@ -840,7 +838,7 @@ void Del_Form()
} }
int del_error; int del_error;
int Del_File2(dword way) int Del_File2(dword way, sh_progr)
{ {
dword dirbuf, fcount, i, filename; dword dirbuf, fcount, i, filename;
int error; int error;
@ -855,10 +853,11 @@ int Del_File2(dword way)
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); Del_File2(#del_from, 1);
} }
else else
{ {
if (sh_progr) Operation_Draw_Progress(#del_from);
if (error = DeleteFile(#del_from)) del_error = error; if (error = DeleteFile(#del_from)) del_error = error;
} }
} }
@ -866,19 +865,43 @@ int Del_File2(dword way)
if (error = DeleteFile(way)) del_error = error; if (error = DeleteFile(way)) del_error = error;
} }
void Del_File_Thread()
void Del_File(byte dodel)
{ {
byte del_from[4096]; byte del_from[4096];
dword selected_offset2; dword selected_offset2;
int tst, count, i; int tst, count, i;
if (dodel==true) file_count_copy = 0;
{ copy_bar.value = 0;
del_active=2; operation_flag = DELETE_FLAG;
if (itdir) ShowMessage(WAIT_DELETING_FOLDER, 0);
del_error = 0;
if (selected_count)
{
for (i=0; i<files.count; i++)
{
selected_offset2 = file_mas[i]*304 + buf+32 + 7;
if (ESBYTE[selected_offset2]) {
sprintf(#del_from,"%s%s",#path,file_mas[i]*304+buf+72);
GetFileInfo(#del_from, #file_info_count);
if ( file_info_count.isfolder ) DirFileCount(#del_from);
else file_count_copy++;
}
}
}
else
{
if (itdir) DirFileCount(#file_path);
else file_count_copy++;
}
copy_bar.max = file_count_copy;
//if (dodel==true)
//{
//del_active=2;
//if (itdir) ShowMessage(WAIT_DELETING_FOLDER, 0);
del_error = 0;
DisplayOperationForm();
if (selected_count) if (selected_count)
{ {
for (i=0; i<files.count; i++) for (i=0; i<files.count; i++)
@ -886,22 +909,32 @@ void Del_File(byte dodel)
selected_offset2 = file_mas[i]*304 + buf+32 + 7; selected_offset2 = file_mas[i]*304 + buf+32 + 7;
if (ESBYTE[selected_offset2]) { if (ESBYTE[selected_offset2]) {
sprintf(#del_from,"%s%s",#path,file_mas[i]*304+buf+72); sprintf(#del_from,"%s%s",#path,file_mas[i]*304+buf+72);
Del_File2(#del_from); Del_File2(#del_from, 1);
} }
} }
} }
else else
{ {
Del_File2(#file_path); Del_File2(#file_path, 1);
} }
if (del_error) Write_Error(del_error); if (del_error) Write_Error(del_error);
} DialogExit();
del_active=0; //}
DeleteButton(301); //del_active=0;
DeleteButton(302); //DeleteButton(301);
Open_Dir(#path,WITH_REDRAW); //DeleteButton(302);
//Open_Dir(#path,WITH_REDRAW);
} }
void Del_File(byte dodel) {
del_active=0;
if (dodel)
{
delete_stak = malloc(20000);
CreateThread(#Del_File_Thread,delete_stak+20000-4);
}
else draw_window();
}
void SelectFileByName(dword that_file) void SelectFileByName(dword that_file)
{ {

View File

@ -3,9 +3,7 @@ byte copy_to[4096];
byte copy_from[4096]; byte copy_from[4096];
byte cut_active=0; byte cut_active=0;
progress_bar copy_bar = {0,16,49,50,20,0,0,1,0xFFFFFF,0x00FF00,0x000000}; enum {NOCUT, CUT};
enum {NOCUT, CUT, COPY_PASTE_END};
Clipboard clipboard; Clipboard clipboard;
@ -52,37 +50,6 @@ void Paste() {
CreateThread(#PasteThread,copy_stak+20000-4); CreateThread(#PasteThread,copy_stak+20000-4);
} }
BDVK file_info_count;
int file_count_copy;
void DirFileCount(dword way)
{
dword dirbuf, fcount, i, filename;
dword cur_file;
if (isdir(way))
{
cur_file = malloc(4096);
// In the process of recursive descent, memory must be allocated dynamically, because the static memory -> was a bug !!! But unfortunately pass away to sacrifice speed.
GetDir(#dirbuf, #fcount, way, DIRS_ONLYREAL);
for (i=0; i<fcount; i++)
{
filename = i*304+dirbuf+72;
sprintf(cur_file,"%s/%s",way,filename);
if (TestBit(ESDWORD[filename-40], 4) )
{
file_count_copy++;
DirFileCount(cur_file);
}
else
{
file_count_copy++;
}
}
free(cur_file);
}
}
void PasteThread() void PasteThread()
{ {
char copy_rezult; char copy_rezult;
@ -102,10 +69,14 @@ void PasteThread()
else file_count_copy++; else file_count_copy++;
} }
copy_bar.max = file_count_copy; copy_bar.max = file_count_copy;
DisplayCopyfForm();
if (cut_active) operation_flag = MOVE_FLAG;
else operation_flag = COPY_FLAG;
DisplayOperationForm();
for (j = 0; j < cnt; j++) { for (j = 0; j < cnt; j++) {
strlcpy(#copy_from, j*4096+buf+10, 4096); strlcpy(#copy_from, j*4096+buf+10, 4096);
if (!copy_from) CopyExit(); if (!copy_from) DialogExit();
strcpy(#copy_to, #path); strcpy(#copy_to, #path);
strcat(#copy_to, #copy_from+strrchr(#copy_from,'/')); strcat(#copy_to, #copy_from+strrchr(#copy_from,'/'));
if (!strcmp(#copy_from,#copy_to)) if (!strcmp(#copy_from,#copy_to))
@ -117,7 +88,7 @@ void PasteThread()
if (strstr(#copy_to, #copy_from)) if (strstr(#copy_to, #copy_from))
{ {
notify("Copy directory into itself is a bad idea..."); notify("Copy directory into itself is a bad idea...");
CopyExit(); DialogExit();
} }
if (copy_rezult = copyf(#copy_from,#copy_to)) if (copy_rezult = copyf(#copy_from,#copy_to))
@ -126,8 +97,8 @@ void PasteThread()
} }
else if (cut_active) else if (cut_active)
{ {
strcpy(#file_path, #copy_from); //strcpy(#file_path, #copy_from);
Del_File(true); Del_File2(#copy_from, 0);
} }
} }
@ -136,52 +107,5 @@ void PasteThread()
cut_active=false; cut_active=false;
} }
if (info_after_copy) notify(INFO_AFTER_COPY); if (info_after_copy) notify(INFO_AFTER_COPY);
CopyExit(); DialogExit();
}
#define WIN_COPY_W 345
#define WIN_COPY_H 110
proc_info Copy_Form;
void DisplayCopyfForm()
{
switch(CheckEvent())
{
case evButton:
notify(T_CANCEL_PASTE);
CopyExit();
break;
case evReDraw:
DefineAndDrawWindow(Form.left+Form.width-200,Form.top+90,WIN_COPY_W,GetSkinHeight()+WIN_COPY_H,0x34,0xFFFFFF,T_PASTE_WINDOW_TITLE);
GetProcessInfo(#Copy_Form, SelfInfo);
WriteText(45, 11, 0x80, system.color.work_text, T_PASTE_WINDOW_TEXT);
DrawFlatButton(Copy_Form.cwidth - 96, Copy_Form.cheight - 32, 80, 22, 10, system.color.work_button, T_PASTE_WINDOW_BUTTON);
DrawBar(8, 10, 32, 32, 0xFFFfff);
break;
}
}
void CopyExit() {
action_buf = COPY_PASTE_END;
ActivateWindow(GetProcessSlot(Form.ID));
ExitProcess();
}
void copyf_Draw_Progress(dword copying_filename) {
if (Copy_Form.cwidth==0)
{
copy_bar.value++;
return;
}
copy_bar.width = Copy_Form.cwidth-32;
DisplayCopyfForm();
Put_icon(copying_filename+strrchr(copying_filename,'.'), 16, 19, 0xFFFfff, 0);
DrawBar(45, 29, Copy_Form.cwidth-45, 10, 0xFFFFFF);
WriteText(45, 29, 0x80, 0x000000, copying_filename);
progressbar_draw stdcall (#copy_bar);
progressbar_progress stdcall (#copy_bar);
//copy_bar.value++;
//pause(10);
} }

View File

@ -0,0 +1,31 @@
BDVK file_info_count;
int file_count_copy;
void DirFileCount(dword way)
{
dword dirbuf, fcount, i, filename;
dword cur_file;
if (isdir(way))
{
cur_file = malloc(4096);
// In the process of recursive descent, memory must be allocated dynamically, because the static memory -> was a bug !!! But unfortunately pass away to sacrifice speed.
GetDir(#dirbuf, #fcount, way, DIRS_ONLYREAL);
for (i=0; i<fcount; i++)
{
filename = i*304+dirbuf+72;
sprintf(cur_file,"%s/%s",way,filename);
if (TestBit(ESDWORD[filename-40], 4) )
{
file_count_copy++;
DirFileCount(cur_file);
}
else
{
file_count_copy++;
}
}
free(cur_file);
}
}

View File

@ -0,0 +1,58 @@
#define WIN_DIALOG_W 345
#define WIN_DIALOG_H 110
proc_info Dialog_Form;
progress_bar copy_bar = {0,16,49,50,20,0,0,1,0xFFFFFF,0x00FF00,0x000000};
enum {COPY_FLAG, MOVE_FLAG, DELETE_FLAG, OPERATION_END};
int operation_flag;
void DisplayOperationForm()
{
switch(CheckEvent())
{
case evButton:
notify(T_CANCEL_PASTE);
DialogExit();
break;
case evReDraw:
if (operation_flag==COPY_FLAG) DefineAndDrawWindow(Form.left+Form.width-200,Form.top+90,WIN_DIALOG_W,GetSkinHeight()+WIN_DIALOG_H,0x34,0xFFFFFF,T_COPY_WINDOW_TITLE);
else if (operation_flag==MOVE_FLAG) DefineAndDrawWindow(Form.left+Form.width-200,Form.top+90,WIN_DIALOG_W,GetSkinHeight()+WIN_DIALOG_H,0x34,0xFFFFFF,T_MOVE_WINDOW_TITLE);
else DefineAndDrawWindow(Form.left+Form.width-200,Form.top+90,WIN_DIALOG_W,GetSkinHeight()+WIN_DIALOG_H,0x34,0xFFFFFF,T_DELETE_WINDOW_TITLE);
GetProcessInfo(#Dialog_Form, SelfInfo);
if (operation_flag==COPY_FLAG) WriteText(45, 11, 0x80, system.color.work_text, T_COPY_WINDOW_TEXT);
else if (operation_flag==MOVE_FLAG) WriteText(45, 11, 0x80, system.color.work_text, T_MOVE_WINDOW_TEXT);
else WriteText(45, 11, 0x80, system.color.work_text, T_DELETE_WINDOW_TEXT);
DrawFlatButton(Dialog_Form.cwidth - 96, Dialog_Form.cheight - 32, 80, 22, 10, system.color.work_button, T_ABORT_WINDOW_BUTTON);
DrawBar(8, 10, 32, 32, 0xFFFfff);
break;
}
}
void DialogExit() {
action_buf = OPERATION_END;
ActivateWindow(GetProcessSlot(Form.ID));
ExitProcess();
}
void Operation_Draw_Progress(dword copying_filename) {
if (Dialog_Form.cwidth==0)
{
copy_bar.value++;
return;
}
copy_bar.width = Dialog_Form.cwidth-32;
DisplayOperationForm();
Put_icon(copying_filename+strrchr(copying_filename,'.'), 16, 19, 0xFFFfff, 0);
DrawBar(45, 29, Dialog_Form.cwidth-45, 10, 0xFFFFFF);
WriteText(45, 29, 0x80, 0x000000, copying_filename);
progressbar_draw stdcall (#copy_bar);
progressbar_progress stdcall (#copy_bar);
//copy_bar.value++;
pause(50);
}

View File

@ -1,5 +1,5 @@
#define TITLE "Eolite File Manager v3.14" #define TITLE "Eolite File Manager v3.2"
#define ABOUT_TITLE "Eolite 3.14" #define ABOUT_TITLE "Eolite 3.2"
#ifdef LANG_RUS #ifdef LANG_RUS
?define T_FILE "” ©«" ?define T_FILE "” ©«"
@ -15,12 +15,17 @@
?define T_RENAME "<EFBFBD>¥à¥¨¬¥­®¢ âì" ?define T_RENAME "<EFBFBD>¥à¥¨¬¥­®¢ âì"
?define FS_ITEM_ALREADY_EXISTS "'<27>«¥¬¥­â á â ª¨¬ ¨¬¥­¥¬ 㦥 áãé¥áâ¢ã¥â' -E" ?define FS_ITEM_ALREADY_EXISTS "'<27>«¥¬¥­â á â ª¨¬ ¨¬¥­¥¬ 㦥 áãé¥áâ¢ã¥â' -E"
?define T_DEL_ERROR_1 "Žè¨¡ª . <20> ¯ª  ­¥ ¯ãáâ ï." ?define T_DEL_ERROR_1 "Žè¨¡ª . <20> ¯ª  ­¥ ¯ãáâ ï."
?define WAIT_DELETING_FOLDER "“¤ «ï¥âáï ¯ ¯ª . <20>®¤®¦¨â¥..."
?define NOT_CREATE_FOLDER "<EFBFBD>¥ 㤠«®áì ᮧ¤ âì ¯ ¯ªã." ?define NOT_CREATE_FOLDER "<EFBFBD>¥ 㤠«®áì ᮧ¤ âì ¯ ¯ªã."
?define NOT_CREATE_FILE "<EFBFBD>¥ 㤠«®áì ᮧ¤ âì ä ©«." ?define NOT_CREATE_FILE "<EFBFBD>¥ 㤠«®áì ᮧ¤ âì ä ©«."
?define T_PASTE_WINDOW_TITLE "Š®¯¨àãî..." ?define T_COPY_WINDOW_TITLE "Š®¯¨àãî..."
?define T_PASTE_WINDOW_TEXT "Š®¯¨àã¥âáï ä ©«:" ?define T_COPY_WINDOW_TEXT "Š®¯¨àã¥âáï ä ©«:"
?define T_PASTE_WINDOW_BUTTON "<EFBFBD>à¥à¢ âì" ?define T_MOVE_WINDOW_TITLE "<EFBFBD>¥à¥¬¥é î..."
?define T_MOVE_WINDOW_TEXT "<EFBFBD>¥à¥¬¥é ¥âáï ä ©«:"
?define T_DELETE_WINDOW_TITLE "“¤ «ïî..."
?define T_DELETE_WINDOW_TEXT "“¤ «ï¥âáï ä ©«:"
?define T_ABORT_WINDOW_BUTTON "<EFBFBD>à¥à¢ âì"
?define INFO_AFTER_COPY "Š®¯¨à®¢ ­¨¥ § ¢¥à襭®" ?define INFO_AFTER_COPY "Š®¯¨à®¢ ­¨¥ § ¢¥à襭®"
?define T_CANCEL_PASTE "Š®¯¨à®¢ ­¨¥ ¯à¥ªà é¥­®. <20> ¯ª  ᪮¯¨à®¢ ­  ­¥ ¯®«­®áâìî." ?define T_CANCEL_PASTE "Š®¯¨à®¢ ­¨¥ ¯à¥ªà é¥­®. <20> ¯ª  ᪮¯¨à®¢ ­  ­¥ ¯®«­®áâìî."
?define T_SELECT_APP_TO_OPEN_WITH "‚ë¡¥à¨â¥ ¯à®£à ¬¬ã ¤«ï ®âªàëâ¨ï ä ©« " ?define T_SELECT_APP_TO_OPEN_WITH "‚ë¡¥à¨â¥ ¯à®£à ¬¬ã ¤«ï ®âªàëâ¨ï ä ©« "
@ -43,9 +48,13 @@
?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..." ?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..."
?define NOT_CREATE_FOLDER "Kataloogi ei saa luua." ?define NOT_CREATE_FOLDER "Kataloogi ei saa luua."
?define NOT_CREATE_FILE "Faili ei saa luua." ?define NOT_CREATE_FILE "Faili ei saa luua."
?define T_PASTE_WINDOW_TITLE "Kopeerin..." ?define T_COPY_WINDOW_TITLE "Copying..."
?define T_PASTE_WINDOW_TEXT "Kopeerin faili:" ?define T_COPY_WINDOW_TEXT "Copying file:"
?define T_PASTE_WINDOW_BUTTON "Abort" ?define T_MOVE_WINDOW_TITLE "Moving..."
?define T_MOVE_WINDOW_TEXT "Moving file:"
?define T_DELETE_WINDOW_TITLE "Deleting..."
?define T_DELETE_WINDOW_TEXT "Deleting file:"
?define T_ABORT_WINDOW_BUTTON "Abort"
?define INFO_AFTER_COPY "Copy finished" ?define INFO_AFTER_COPY "Copy finished"
?define T_CANCEL_PASTE "Copy process terminated. Folder copied incompletely." ?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"
@ -68,9 +77,13 @@
?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..." ?define WAIT_DELETING_FOLDER "Deleting folder. Please, wait..."
?define NOT_CREATE_FOLDER "Folder can not be created." ?define NOT_CREATE_FOLDER "Folder can not be created."
?define NOT_CREATE_FILE "File can not be created." ?define NOT_CREATE_FILE "File can not be created."
?define T_PASTE_WINDOW_TITLE "Copying..." ?define T_COPY_WINDOW_TITLE "Copying..."
?define T_PASTE_WINDOW_TEXT "Copying file:" ?define T_COPY_WINDOW_TEXT "Copying file:"
?define T_PASTE_WINDOW_BUTTON "Abort" ?define T_MOVE_WINDOW_TITLE "Moving..."
?define T_MOVE_WINDOW_TEXT "Moving file:"
?define T_DELETE_WINDOW_TITLE "Deleting..."
?define T_DELETE_WINDOW_TEXT "Deleting file:"
?define T_ABORT_WINDOW_BUTTON "Abort"
?define INFO_AFTER_COPY "Copy finished" ?define INFO_AFTER_COPY "Copy finished"
?define T_CANCEL_PASTE "Copy process terminated. Folder copied incompletely." ?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"