*/}}
Browse Source

File browser improvements

YimingWu 3 weeks ago
parent
commit
8c1553ed41
6 changed files with 172 additions and 19 deletions
  1. 11 1
      la_interface.h
  2. 3 3
      la_kernel.c
  3. 134 1
      resources/la_operators.c
  4. 14 7
      resources/la_templates.c
  5. 4 1
      resources/la_translations.c
  6. 6 6
      resources/la_widgets.c

+ 11 - 1
la_interface.h

@@ -2148,6 +2148,7 @@ STRUCTURE(laFileItem){
     int IsFolder;
     char Name[1024];
     int Size;
+    int Timestamp;
     laTimeInfo TimeModified;
     int Type;
 };
@@ -2164,10 +2165,18 @@ STRUCTURE(laBookmarkedFolder){
     char Path[1024];
 };
 
+#define LA_FILE_SORT_NAME     0
+#define LA_FILE_SORT_NAME_REV 1
+#define LA_FILE_SORT_TIME     2
+#define LA_FILE_SORT_TIME_REV 3
+#define LA_FILE_SORT_SIZE     4
+#define LA_FILE_SORT_SIZE_REV 5
+
 STRUCTURE(laFileBrowser){
     laListItem Hyper;
-    char Path[1024];
+    char Path[2048];
     char FileName[512];
+    char TempStr[512];
     laDiskItem *RootDisk;
     laFileItem *Active;
     laListHandle FileList;
@@ -2181,6 +2190,7 @@ STRUCTURE(laFileBrowser){
     int UseType;
     int FilterType;
     int ShowBackups;
+    int SortBy;
     laStringSplitor* ss_filter_extensions;
 };
 

+ 3 - 3
la_kernel.c

@@ -6407,8 +6407,8 @@ laUiList *la_DetectUiListRecursive(laUiList *uil, int x, int y, int LimH,
         }
 
         if ((ui->Type == _LA_UI_FIXED_GROUP || ui->Type == _LA_UI_TAB) && (ui->Subs.pFirst || ui->Page)){
-            if (ui->Page->HeightCoeff) CPB = ui->B;
-            else CPB = ui->Page->B;
+            if (ui->Page->HeightCoeff) CPB = ui->B+ui->Page->PanY;
+            else CPB = ui->Page->B+ui->Page->PanY;
             if (ui->Page->ScrollerShownV && laIsInBound(x, y, ui->R - LA_SCROLL_W - bt->RP*2, ui->R, ui->Page->U, CPB)){
                 if (ScrollUil) *ScrollUil = ui->Page; if (ParentUi) *ParentUi = ui;
             }elif (ui->Page->ScrollerShownH && laIsInBound(x, y, ui->Page->L, ui->Page->R, ui->B - LA_SCROLL_W - bt->BP*2, ui->B)){
@@ -7418,7 +7418,7 @@ int la_HandleSingleEvent(laEvent *e, laListHandle *Operators){
 
     while (1){
         if (!a) break;
-
+        
         if (a->StopNow){
             NextA = a->Item.pNext;
             if (a->Type->Exit) a->Type->Exit(a, Result);

+ 134 - 1
resources/la_operators.c

@@ -193,6 +193,34 @@ int la_AcceptFileFormat(laFileBrowser* fb, char* format){
     }
     return 0;
 }
+
+typedef int (*FileSortCompF)(laFileItem* f1,laFileItem* f2);
+int la_filecompname(laFileItem* f1,laFileItem* f2){ return strverscmp(f2->Name, f1->Name); }
+int la_filecompnamerev(laFileItem* f1,laFileItem* f2){ return strverscmp(f1->Name, f2->Name); }
+int la_filecomptime(laFileItem* f1,laFileItem* f2){ return f1->Timestamp - f2->Timestamp; }
+int la_filecomptimerev(laFileItem* f1,laFileItem* f2){ return f2->Timestamp - f1->Timestamp; }
+int la_filecompsize(laFileItem* f1,laFileItem* f2){ return f1->Size - f2->Size; }
+int la_filecompsizerev(laFileItem* f1,laFileItem* f2){ return f2->Size - f1->Size; }
+void la_SortFiles(laFileBrowser* fb, laListHandle* files){
+    laListHandle tmp={0}; laFileItem* fi;
+    FileSortCompF comp = 0;
+    switch(fb->SortBy){
+    case LA_FILE_SORT_NAME: default: comp=la_filecompname; break;
+    case LA_FILE_SORT_NAME_REV: comp=la_filecompnamerev; break;
+    case LA_FILE_SORT_TIME: comp=la_filecomptime; break;
+    case LA_FILE_SORT_TIME_REV: comp=la_filecomptimerev; break;
+    case LA_FILE_SORT_SIZE: comp=la_filecompsize; break;
+    case LA_FILE_SORT_SIZE_REV: comp=la_filecompsizerev; break;
+    }
+    while(fi=lstPopItem(files)){ int inserted=0;
+        for(laFileItem* fii=tmp.pFirst;fii;fii=fii->Hyper.pNext){
+            int a=comp(fii,fi);
+            if(a<0){ lstInsertItemBefore(&tmp,fi,fii); inserted=1; break; }
+        }
+        if(!inserted){ lstAppendItem(&tmp, fi); }
+    }
+    files->pFirst=tmp.pFirst; files->pLast=tmp.pLast;
+}
 void la_FileBrowserRebuildList(laFileBrowser *fb){
     laFileItem *fi = 0;
     laDiskItem *dl = 0;
@@ -211,7 +239,7 @@ void la_FileBrowserRebuildList(laFileBrowser *fb){
 #ifdef __linux__
     if (fb->Path[len - 1] != U'/') strcat(fb->Path, "/");
     struct dirent **NameList=0;
-    int NumFiles=scandir(fb->Path,&NameList,0,alphasort);
+    int NumFiles=scandir(fb->Path,&NameList,0,versionsort);
 
     while (fi = lstPopItem(&fb->FileList)) memFree(fi);
 
@@ -236,6 +264,7 @@ void la_FileBrowserRebuildList(laFileBrowser *fb){
             fi->Size = s.st_size;
             fi->Type = la_DetectFileItemType(format);
 
+            fi->Timestamp = s.st_ctime;
             struct tm *t = localtime(&s.st_ctime);
             fi->TimeModified.Year = t->tm_year+1900;
             fi->TimeModified.Month = t->tm_mon+1;;
@@ -295,6 +324,7 @@ void la_FileBrowserRebuildList(laFileBrowser *fb){
     }
 #endif
 
+    la_SortFiles(fb, &Files);
     lstCombineLists(&fb->FileList, &Files);
 
     while (dl = lstPopItem(&fb->Disks)) memFree(dl);
@@ -446,6 +476,38 @@ void* laset_FileBrowserExtension(laFileBrowser* fb, laExtensionType* et){
 void laset_FileBrowserShowBackups(laFileBrowser* fb, int show){
     fb->ShowBackups = show; la_FileBrowserRebuildList(fb); laRecalcCurrentPanel();
 }
+void laset_FileBrowserSortName(laFileBrowser* fb, int s){
+    if(fb->SortBy==LA_FILE_SORT_NAME) fb->SortBy=LA_FILE_SORT_NAME_REV;
+    else fb->SortBy=LA_FILE_SORT_NAME; la_FileBrowserRebuildList(fb); laRecalcCurrentPanel();
+}
+int laget_FileBrowserSortName(laFileBrowser*fb){
+    if(fb->SortBy==LA_FILE_SORT_NAME) return 1; if(fb->SortBy==LA_FILE_SORT_NAME_REV) return 2; return 0;
+}
+void laset_FileBrowserSortTime(laFileBrowser* fb, int s){
+    if(fb->SortBy==LA_FILE_SORT_TIME) fb->SortBy=LA_FILE_SORT_TIME_REV;
+    else fb->SortBy=LA_FILE_SORT_TIME; la_FileBrowserRebuildList(fb); laRecalcCurrentPanel();
+}
+int laget_FileBrowserSortTime(laFileBrowser*fb){
+    if(fb->SortBy==LA_FILE_SORT_TIME) return 1; if(fb->SortBy==LA_FILE_SORT_TIME_REV) return 2; return 0;
+}
+void laset_FileBrowserSortSize(laFileBrowser* fb, int s){
+    if(fb->SortBy==LA_FILE_SORT_SIZE) fb->SortBy=LA_FILE_SORT_SIZE_REV;
+    else fb->SortBy=LA_FILE_SORT_SIZE; la_FileBrowserRebuildList(fb); laRecalcCurrentPanel();
+}
+int laget_FileBrowserSortSize(laFileBrowser*fb){
+    if(fb->SortBy==LA_FILE_SORT_SIZE) return 1; if(fb->SortBy==LA_FILE_SORT_SIZE_REV) return 2; return 0;
+}
+void laget_FileBrowserFileSizeString(laFileItem* fi, char* content, char** move){
+    if(fi->Size >= (1<<30)){
+        sprintf(content, "%.3lf GB", (real)fi->Size/(1<<30));
+    }elif(fi->Size >= (1<<20)){
+        sprintf(content, "%.3lf MB", (real)fi->Size/(1<<20));
+    }elif(fi->Size >= (1<<10)){
+        sprintf(content, "%.3lf KB", (real)fi->Size/(1<<10));
+    }else{
+        sprintf(content, "%d %s", fi->Size, transLate("Bytes"));
+    }
+}
 void la_FileBrowserUpLevel(laFileBrowser *fb){
     char *p = fb->Path;
     char *LastP = 0;
@@ -460,6 +522,22 @@ void la_FileBrowserUpLevel(laFileBrowser *fb){
     else if(LastP) *(LastP + 1) = 0;
     la_FileBrowserRebuildList(fb); fb->FileName[0] = 0;
 }
+void la_FileBrowserNewDirectory(laFileBrowser* fb,char* path){
+    char* p=fb->Path;
+    int len =strlen(p);
+#ifdef __linux__
+    if (p[len - 1] != U'/') strcat(p, "/");
+    char usepath[2048]; sprintf(usepath,"%s%s",p,path);
+    if(!mkdir(usepath,S_IRWXU | S_IRWXG | S_IRWXO)){
+        strcpy(fb->Path,usepath);
+    }
+#endif
+#ifdef _WIN32
+    if (p[len - 1] != U'\\') strcat(p, "\\");
+    //...
+#endif
+    la_FileBrowserRebuildList(fb); laRecalcCurrentPanel();
+}
 int OPINV_FileBrowser(laOperator *a, laEvent *e){
     a->CustomData = la_FileBrowserInit(a);
     laEnableOperatorPanel(a, 0, LA_RH2, LA_RH2, 500, 500, 0, 0, 0, 0, LA_RH2, LA_RH2, LA_RH2, LA_RH2, e);
@@ -506,6 +584,30 @@ int OPINV_FileBrowserUpLevel(laOperator *a, laEvent *e){
     }
     return LA_FINISHED_PASS;
 }
+int OPINV_FileBrowserRefresh(laOperator *a, laEvent *e){
+    if (a->This){
+        la_FileBrowserRebuildList(a->This->EndInstance); laRecalcCurrentPanel();
+        laNotifyUsersPPPath(a->This, "path");
+    }
+    return LA_FINISHED_PASS;
+}
+int OPINV_FileBrowserNewDirectory(laOperator *a, laEvent *e){
+    if (a->This){
+        laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,400,400,0,0,0,0,0,0,e);
+        return LA_RUNNING;
+    }
+    return LA_FINISHED;
+}
+int OPMOD_FileBrowserNewDirectory(laOperator *a, laEvent *e){
+    laFileBrowser* fb=a->This->EndInstance;
+    if (a->ConfirmData){
+        if (a->ConfirmData->Mode == LA_CONFIRM_OK){
+            la_FileBrowserNewDirectory(fb,fb->TempStr);
+        }
+        return LA_FINISHED;
+    }
+    return LA_RUNNING;
+}
 int OPCHK_FileBrowserCanConfirm(laPropPack *This, laStringSplitor *ss){
     if(!OPCHK_IsFileBrowser(This,ss)) return 0;
     laFileBrowser* fb=This->EndInstance;
@@ -547,6 +649,15 @@ int OPMOD_FileBrowserConfirm(laOperator *a, laEvent *e){
     return LA_RUNNING;
 }
 
+void laui_FileBrowserNewDirectory(laUiList *uil, laPropPack *This, laPropPack *Operator, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil);
+    laShowItem(uil,c,This,"temp_str");
+    laUiItem* row=laBeginRow(uil,c,0,0);
+    laShowSeparator(uil,c)->Expand=1;
+    laShowItem(uil,c,0,"LA_confirm")->Flags|=LA_UI_FLAGS_HIGHLIGHT;
+    laEndRow(uil,row);
+}
+
 void OPEXT_UDFOperation(laOperator *a, laEvent *e){
     laUDFPreviewExtra *upe = a->CustomData;
     memFree(upe);
@@ -2247,6 +2358,9 @@ void la_RegisterBuiltinOperators(){
 
     laCreateOperatorType("LA_view_hyper_data", "View Hyper Data", "Show Properties Of Specific Data Block", OPCHK_IsHyper, 0, 0, OPINV_ViewHyperData, 0, U'🛈', LA_ACTUATOR_SYSTEM);
     
+    at = laCreateOperatorType("LA_file_dialog_new_directory", "New Directory", "New Directory", OPCHK_IsFileBrowser, 0, 0, OPINV_FileBrowserNewDirectory, OPMOD_FileBrowserNewDirectory, U'📁', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
+    at->UiDefine = laui_FileBrowserNewDirectory;
+    laCreateOperatorType("LA_file_dialog_refresh", "Refresh", "Refresh List", OPCHK_IsFileBrowser, 0, 0, OPINV_FileBrowserRefresh, 0, U'🗘', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
     laCreateOperatorType("LA_file_dialog_up", "Up", "Select Upper Folder Level", OPCHK_IsFileBrowser, 0, 0, OPINV_FileBrowserUpLevel, 0, U'🢰', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
     laCreateOperatorType("LA_file_dialog_confirm", "Confirm", "Confirm selection", OPCHK_FileBrowserCanConfirm, 0, 0, OPINV_FileBrowserConfirm, OPMOD_FileBrowserConfirm, U'✔', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
     at = laCreateOperatorType("LA_file_dialog", "File Dialog", "Do File Operations", 0, 0, OPEXT_FileBrowser, OPINV_FileBrowser, OPMOD_FileBrowser, U'🗐', LA_ACTUATOR_SYSTEM);
@@ -2256,6 +2370,7 @@ void la_RegisterBuiltinOperators(){
 
     laAddStringProperty(pc, "path", "Path", "Directort Path", 0, 0, 0, "/", 0, offsetof(laFileBrowser, Path), 0, 0, laset_FileBrowserPath, 0, LA_UDF_LOCAL);
     laAddStringProperty(pc, "file_name", "File Name", "File Name", 0, 0, 0, 0, 0, offsetof(laFileBrowser, FileName), 0, 0, laset_FileBrowserFileName, 0, LA_UDF_LOCAL);
+    laAddStringProperty(pc, "temp_str", "Temp String", "Temp String", 0, 0, 0, "", 0, offsetof(laFileBrowser, TempStr), 0, 0, 0, 0, LA_UDF_LOCAL);
     laAddSubGroup(pc, "file_list", "File List", "List Of Files And Directories Under A Specific Path", "file_item",0,0,laui_FileBrowserFileItem, -1, 0, laget_FileBrowserActiveFile, 0, 0, 0, laset_FileBrowserSelectFile, offsetof(laFileBrowser, FileList), 0);
     laAddSubGroup(pc, "disk_list", "Disk List", "List Of All Logical Drives (In Windows)", "disk_item",0, 0, 0, -1, 0, 0, 0, 0, 0, laset_FileBrowserActiveDisk, offsetof(laFileBrowser, Disks), 0);
     laAddSubGroup(pc, "bookmarks", "Bookmarks", "Bookmarked directories in GTK3", "bookmarked_folder",0, 0, 0, -1, 0, 0, 0, laset_FileBrowserBookmark, 0, 0, offsetof(laFileBrowser, Bookmarks), 0);
@@ -2265,6 +2380,8 @@ void la_RegisterBuiltinOperators(){
         laAddEnumItemAs(ep, "file", "File", "File", LA_FILE_SELECT_FILE, U'📁');
         laAddEnumItemAs(ep, "folder", "Folder", "Folder", LA_FILE_SELECT_FOLDER, U'🖹');
     }
+    laAddOperatorProperty(pc, "new_directory", "New Directory", "Create a new directory", "LA_file_dialog_new_directory", U'📁', 0);
+    laAddOperatorProperty(pc, "refresh", "Refresh", "Refresh file list", "LA_file_dialog_refresh", U'🗘', 0);
     laAddOperatorProperty(pc, "folder_up", "Up", "Select Upper Folder Level In File Browsers", "LA_file_dialog_up", U'🢰', 0);
     laAddOperatorProperty(pc, "confirm", "Confirm", "Confirm selection", "LA_file_dialog_confirm", U'✔', 0);
     p = laAddPropertyContainer("disk_item", "Disk Item", "A Logical Drive (In Windows)", 0, laui_FileBrowserDiskItem, 0, 0, 0, 1);{
@@ -2277,6 +2394,7 @@ void la_RegisterBuiltinOperators(){
         laAddIntProperty(p, "is_folder", "Is Folder", "File Is A Folder Or Actual File", 0, 0, 0, 1, 0, 0, 0, 0, offsetof(laFileItem, IsFolder), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
         laAddSubGroup(p, "time_modified", "Time Last Modified", "The Time When The File Was Last Modified", "time_info",0, 0, 0, offsetof(laFileItem, TimeModified), 0, 0, 0, 0, 0, 0, 0, LA_UDF_LOCAL);
         laAddIntProperty(p, "size", "Size", "File Size In Bytes", 0, 0, "Bytes", 0, 0, 0, 0, 0, offsetof(laFileItem, Size), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);
+        laAddStringProperty(p, "size_string", "Size String", "File size in convenient string", 0, 0, 0, 0, 0, 0, 0, laget_FileBrowserFileSizeString, 0, 0, LA_READ_ONLY);
         ep = laAddEnumProperty(p, "type", "Type", "General Type Of The File", 0, 0, 0, 0, 0, offsetof(laFileItem, Type), 0, 0, 0, 0, 0, 0, 0, 0, 0,LA_READ_ONLY);{
             laAddEnumItemAs(ep, "unknown", "Unknown", "Unknown/Uncategorized File Type", LA_FILETYPE_UNKNOWN, U'🖹');
             laAddEnumItemAs(ep, "udf", "UDF", "Uniform Data Format", LA_FILETYPE_UDF, U'📦');
@@ -2305,6 +2423,21 @@ void la_RegisterBuiltinOperators(){
         laAddEnumItemAs(ep, "NONE", "None", "Don't show backup files", 0, 0);
         laAddEnumItemAs(ep, "SHOWN", "Shown", "Show backup files", 1, U'~');
     }
+    ep = laAddEnumProperty(pc, "sort_name", "Name", "Sort by names",LA_WIDGET_ENUM_CYCLE, 0, 0, 0, 0, 0, laget_FileBrowserSortName,laset_FileBrowserSortName, 0, 0, 0, 0, 0, 0, 0,0);{
+        laAddEnumItemAs(ep, "NONE", "None", "Don't sort", 0, 0);
+        laAddEnumItemAs(ep, "SORT", "Sort", "Sort accending", 1, U'🔻');
+        laAddEnumItemAs(ep, "REV", "Reversed", "Sort Descending", 2, U'🔺');
+    }
+    ep = laAddEnumProperty(pc, "sort_time", "Time", "Sort by times",LA_WIDGET_ENUM_CYCLE, 0, 0, 0, 0, 0, laget_FileBrowserSortTime,laset_FileBrowserSortTime, 0, 0, 0, 0, 0, 0, 0,0);{
+        laAddEnumItemAs(ep, "NONE", "None", "Don't sort", 0, 0);
+        laAddEnumItemAs(ep, "SORT", "Sort", "Sort accending", 1, U'🔻');
+        laAddEnumItemAs(ep, "REV", "Reversed", "Sort Descending", 2, U'🔺');
+    }
+    ep = laAddEnumProperty(pc, "sort_size", "Size", "Sort by sizes",LA_WIDGET_ENUM_CYCLE, 0, 0, 0, 0, 0, laget_FileBrowserSortSize,laset_FileBrowserSortSize, 0, 0, 0, 0, 0, 0, 0,0);{
+        laAddEnumItemAs(ep, "NONE", "None", "Don't sort", 0, 0);
+        laAddEnumItemAs(ep, "SORT", "Sort", "Sort accending", 1, U'🔻');
+        laAddEnumItemAs(ep, "REV", "Reversed", "Sort Descending", 2, U'🔺');
+    }
     
     at = laCreateOperatorType("LA_udf_read", "Read", "Read a UDF file", 0, 0, OPEXT_UDFOperation, OPINV_UDFRead, OPMOD_UDFRead, U'📑', LA_ACTUATOR_SYSTEM);
     pc = laDefineOperatorProps(at, 0);

+ 14 - 7
resources/la_templates.c

@@ -903,7 +903,7 @@ void laui_FileBrowserFileItem(laUiList *uil, laPropPack *This, laPropPack *OP_UN
     laShowItemFull(uil, clrl, This, "name", LA_WIDGET_STRING_PLAIN, 0, 0, 0);
     ui = laOnConditionThat(uil, clrr, laNot(laPropExpression(This, "is_folder")));{
         laShowItemFull(uil, clrrl, This, "time_modified.time_string", LA_WIDGET_STRING_PLAIN, 0, 0, 0);
-        laShowItem(uil, clrrr, This, "size")->Flags|=LA_UI_FLAGS_NO_DECAL;
+        laShowItemFull(uil, clrrr, This, "size_string",LA_WIDGET_STRING_PLAIN,0,0,0)->Flags|=LA_TEXT_ALIGN_RIGHT;
     }
     laEndCondition(uil, ui);
     //laShowSeparator(uil,cll)
@@ -932,12 +932,19 @@ void laui_FileBrowserFileList(laUiList *uil, laPropPack *THIS_UNUSED, laPropPack
     laUiList *u; laUiItem *b; laUiList *ul;
 
     laSplitColumn(uil, col, 0.25);
-    cl = laLeftColumn(col, 10);
-    cr = laRightColumn(col, 0);
+    cl = laLeftColumn(col, 10); cr = laRightColumn(col, 0);
 
-    laShowItemFull(uil, cl, Operator, "folder_up", LA_WIDGET_BUTTON_NO_CONFIRM, 0 ,0,0);
+    laUiItem* row=laBeginRow(uil,cl,0,0);
+    laShowItemFull(uil, cl, Operator, "refresh", LA_WIDGET_BUTTON_NO_CONFIRM,0,0,0);
+    laShowItemFull(uil, cl, Operator, "folder_up", LA_WIDGET_BUTTON_NO_CONFIRM,0,0,0)->Expand=1;
+    laEndRow(uil,row);
     laShowItem(uil, cr, Operator, "path")->Expand=1;
 
+    row=laBeginRow(uil,cl,0,0);
+    laShowSeparator(uil,cl)->Expand=1;
+    laShowItemFull(uil, cl, Operator, "new_directory", LA_WIDGET_BUTTON_NO_CONFIRM,0,0,0);
+    laEndRow(uil,row);
+
     laUiItem* r=laBeginRow(uil,cr,0,0);
     laShowItem(uil, cr, Operator, "file_name")->Expand=1;
     laShowItem(uil, cr, Operator, "confirm")->Flags|=LA_UI_FLAGS_HIGHLIGHT|LA_UI_FLAGS_NO_CONFIRM;
@@ -970,9 +977,9 @@ void laui_FileBrowserFileList(laUiList *uil, laPropPack *THIS_UNUSED, laPropPack
     laSplitColumn(u, clr, 0.7); clrl = laLeftColumn(clr, 0); clrr = laRightColumn(clr, 0);
     laSplitColumn(u, clrr, 0.5); clrrl = laLeftColumn(clrr, 0); clrrr = laRightColumn(clrr, 0);
     laShowColumnAdjuster(u, c);
-    laShowLabel(u, clrl, "File Name", 0, 0);
-    laShowLabel(u, clrrl, "Last Modified On", 0, 0);
-    laShowLabel(u, clrrr, "File Size", 0, 0);
+    laShowItemFull(u, clrl,Operator, "sort_name",0,"text=File Name",0,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+    laShowItemFull(u, clrrl,Operator, "sort_time",0,"text=Last Modified On",0,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+    laShowItemFull(u, clrrr,Operator, "sort_size",0,"text=Size",0,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
     laShowItem(u, c, Operator, "file_list")->Flags|=LA_UI_FLAGS_NO_DECAL;
 }
 void laui_LinkerPanel(laUiList *uil, laPropPack *Base, laPropPack *OperatorInst, laColumn *ExtraColumns, int context){

+ 4 - 1
resources/la_translations.c

@@ -19,8 +19,11 @@
 #include "la_5.h"
 
 static const char *entries[]={
+"New Directory","新文件夹",
+"Bytes","字节",
+"Show Backups","显示备份文件",
 "Auto Switch","自动切换",
-"Per screen config","针对每个屏幕设置:",
+"Per screen config:","针对每个屏幕设置:",
 "Will remove input mapping","将删除映射",
 "Will remove this key map entry","将删除该映射条目",
 "Select Signal","选择信号",

+ 6 - 6
resources/la_widgets.c

@@ -222,7 +222,7 @@ int la_ValueGetMinWidth(laUiItem *ui){
 int la_LabelGetMinWidth(laUiItem *ui){
     laBoxedTheme *bt = *ui->Type->Theme;
     if(ui->Flags&LA_UI_MIN_WIDTH){ return LA_RH; }
-    int strw=tnsStringGetWidth(transLate(ui->Display->Ptr), 0, ui->Flags&LA_TEXT_MONO);
+    int strw=tnsStringGetWidth(transLate(SSTR(ui->Display)), 0, ui->Flags&LA_TEXT_MONO);
     if(ui->Type==_LA_UI_MENU_ROOT && strw<LA_RH)strw=LA_RH;
     return (strw + bt->LM + bt->RM);
 }
@@ -1027,7 +1027,7 @@ void la_LabelDraw(laUiItem *ui, int h){
 
     //int State = ui->Instructions ? (strArgumentMatch(ui->Instructions, "disabled", "true") ? LA_THEME_DISABLED : LA_UI_NORMAL) : LA_UI_NORMAL;
 
-    tnsDrawStringAuto(transLate(ui->Display->Ptr),
+    tnsDrawStringAuto(transLate(SSTR(ui->Display)),
         IsDisabled?laThemeColor(bt,LA_BT_TEXT|LA_UI_DISABLED):(IsHighlight?laAccentColor(LA_BT_TEXT):laThemeColor(bt,LA_BT_TEXT)),
         ui->L, ui->R, ui->U, ui->Flags);
 }
@@ -1397,15 +1397,15 @@ void la_DrawColumnAdjusterRecursive(int U, int B, laColumn *c, int W, tnsVector3
         la_DrawColumnAdjusterRecursive(U, B, c->RS, W, color, LeftMost);
     }else{
         if(c->IL==LeftMost) return;
-        tnsDrawStringAuto("", color, c->IL-LA_RH, c->IL+LA_RH, U, LA_TEXT_ALIGN_CENTER);
+        tnsDrawStringAuto("⌉⌈", color, c->IL-LA_RH, c->IL+LA_RH, U, LA_TEXT_ALIGN_CENTER);
     }
 }
 void la_ColumnAdjusterDraw(laUiItem *ui, int h){
     laBoxedTheme *bt = (*ui->Type->Theme);
 
     tnsUseNoTexture();
-    tnsColor4dv(laThemeColor(bt,LA_BT_BORDER));
-    la_DrawColumnAdjusterRecursive(ui->U, ui->U + LA_RH, ui->C, (bt->LM+bt->RM)/2, laThemeColor(bt, LA_BT_BORDER), ui->C->IL);
+    tnsColor4dv(laThemeColor(bt,LA_BT_TEXT));
+    la_DrawColumnAdjusterRecursive(ui->U, ui->U + LA_RH, ui->C, (bt->LM+bt->RM)/2, laThemeColor(bt, LA_BT_TEXT), ui->C->IL);
 }
 void la_ColumnViewerDraw(laUiItem *ui, int h){
     laBoxedTheme *bt = (*ui->Type->Theme);
@@ -3119,7 +3119,7 @@ int OPMOD_Collection(laOperator *a, laEvent *e) {
   }
   uil = la_DetectUiListRecursive(ToUil, lx, ly, 10000, 0, 0, 0, 0, 0);
   if (uil != ((laUiListDrawItem *)a->LocalUiLists.pFirst)->Target) {
-    // printf("EXIT\n");
+    printf("%d %d EXIT\n",((laUiListDrawItem *)a->LocalUiLists.pFirst)->Target, uil);
     return LA_FINISHED;
   }