Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 9bed565 in mainline


Ignore:
Timestamp:
2021-10-15T16:58:28Z (14 months ago)
Author:
Jiri Svoboda <jiri@…>
Children:
0e125698
Parents:
03c4b23
Message:

Highlight directories and sort them first

Location:
uspace/app/nav
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/nav/panel.c

    r03c4b23 r9bed565  
    4444#include <ui/paint.h>
    4545#include <ui/resource.h>
     46#include <vfs/vfs.h>
    4647#include <qsort.h>
    4748#include "panel.h"
     
    9394
    9495        rc = gfx_color_new_ega(0x0f, &panel->act_border_color);
     96        if (rc != EOK)
     97                goto error;
     98
     99        rc = gfx_color_new_ega(0x0f, &panel->dir_color);
    95100        if (rc != EOK)
    96101                goto error;
     
    107112        if (panel->curs_color != NULL)
    108113                gfx_color_delete(panel->curs_color);
     114        if (panel->act_border_color != NULL)
     115                gfx_color_delete(panel->act_border_color);
     116        if (panel->dir_color != NULL)
     117                gfx_color_delete(panel->dir_color);
    109118        ui_control_delete(panel->control);
    110119        free(panel);
     
    121130        gfx_color_delete(panel->curs_color);
    122131        gfx_color_delete(panel->act_border_color);
     132        gfx_color_delete(panel->dir_color);
    123133        panel_clear_entries(panel);
    124134        ui_control_delete(panel->control);
     
    157167        if (entry == panel->cursor && panel->active)
    158168                fmt.color = panel->curs_color;
     169        else if (entry->isdir)
     170                fmt.color = panel->dir_color;
    159171        else
    160172                fmt.color = panel->color;
     
    402414 * @param panel Panel
    403415 * @param name File name
    404  * @param size File size;
     416 * @param size File size
     417 * @param isdir @c true iff the entry is a directory
    405418 * @return EOK on success or an error code
    406419 */
    407 errno_t panel_entry_append(panel_t *panel, const char *name, uint64_t size)
     420errno_t panel_entry_append(panel_t *panel, const char *name, uint64_t size,
     421    bool isdir)
    408422{
    409423        panel_entry_t *entry;
     
    421435
    422436        entry->size = size;
     437        entry->isdir = isdir;
    423438        link_initialize(&entry->lentries);
    424439        list_append(&entry->lentries, &panel->entries);
     
    469484        DIR *dir;
    470485        struct dirent *dirent;
     486        vfs_stat_t finfo;
    471487        errno_t rc;
    472488
     
    477493        dirent = readdir(dir);
    478494        while (dirent != NULL) {
    479                 rc = panel_entry_append(panel, dirent->d_name, 1);
     495                rc = vfs_stat_path(dirent->d_name, &finfo);
    480496                if (rc != EOK)
    481497                        goto error;
     498
     499                rc = panel_entry_append(panel, dirent->d_name, 1,
     500                    finfo.is_directory);
     501                if (rc != EOK)
     502                        goto error;
     503
    482504                dirent = readdir(dir);
    483505        }
     
    553575        panel_entry_t *a = *(panel_entry_t **)pa;
    554576        panel_entry_t *b = *(panel_entry_t **)pb;
     577        int dcmp;
     578
     579        /* Sort directories first */
     580        dcmp = b->isdir - a->isdir;
     581        if (dcmp != 0)
     582                return dcmp;
    555583
    556584        return str_cmp(a->name, b->name);
  • uspace/app/nav/panel.h

    r03c4b23 r9bed565  
    5858extern void panel_activate(panel_t *);
    5959extern void panel_deactivate(panel_t *);
    60 extern errno_t panel_entry_append(panel_t *, const char *, uint64_t);
     60extern errno_t panel_entry_append(panel_t *, const char *, uint64_t, bool);
    6161extern void panel_entry_delete(panel_entry_t *);
    6262extern void panel_clear_entries(panel_t *);
  • uspace/app/nav/test/panel.c

    r03c4b23 r9bed565  
    7373        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    7474
    75         rc = panel_entry_append(panel, "a", 1);
     75        rc = panel_entry_append(panel, "a", 1, false);
    7676        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    7777
     
    324324        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    325325
    326         rc = panel_entry_append(panel, "a", 1);
     326        rc = panel_entry_append(panel, "a", 1, false);
    327327        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    328328
    329329        PCUT_ASSERT_INT_EQUALS(1, list_count(&panel->entries));
    330330
    331         rc = panel_entry_append(panel, "b", 2);
     331        rc = panel_entry_append(panel, "b", 2, false);
    332332        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    333333
     
    347347        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    348348
    349         rc = panel_entry_append(panel, "a", 1);
    350         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    351 
    352         rc = panel_entry_append(panel, "b", 2);
     349        rc = panel_entry_append(panel, "a", 1, false);
     350        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     351
     352        rc = panel_entry_append(panel, "b", 2, false);
    353353        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    354354
     
    377377        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    378378
    379         rc = panel_entry_append(panel, "a", 1);
    380         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    381 
    382         rc = panel_entry_append(panel, "b", 2);
     379        rc = panel_entry_append(panel, "a", 1, false);
     380        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     381
     382        rc = panel_entry_append(panel, "b", 2, false);
    383383        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    384384
     
    456456        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    457457
    458         rc = panel_entry_append(panel, "b", 1);
    459         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    460 
    461         rc = panel_entry_append(panel, "c", 3);
    462         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    463 
    464         rc = panel_entry_append(panel, "a", 2);
     458        rc = panel_entry_append(panel, "b", 1, false);
     459        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     460
     461        rc = panel_entry_append(panel, "c", 3, false);
     462        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     463
     464        rc = panel_entry_append(panel, "a", 2, false);
    465465        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    466466
     
    494494        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    495495
    496         rc = panel_entry_append(panel, "a", 2);
    497         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    498 
    499         rc = panel_entry_append(panel, "b", 1);
     496        rc = panel_entry_append(panel, "a", 2, false);
     497        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     498
     499        rc = panel_entry_append(panel, "b", 1, false);
    500500        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    501501
     
    534534
    535535        /* Add one entry */
    536         rc = panel_entry_append(panel, "a", 1);
     536        rc = panel_entry_append(panel, "a", 1, false);
    537537        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    538538
     
    544544
    545545        /* Add another entry */
    546         rc = panel_entry_append(panel, "b", 2);
     546        rc = panel_entry_append(panel, "b", 2, false);
    547547        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    548548
     
    570570
    571571        /* Add one entry */
    572         rc = panel_entry_append(panel, "a", 1);
     572        rc = panel_entry_append(panel, "a", 1, false);
    573573        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    574574
     
    580580
    581581        /* Add another entry */
    582         rc = panel_entry_append(panel, "b", 2);
     582        rc = panel_entry_append(panel, "b", 2, false);
    583583        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    584584
     
    603603
    604604        /* Add one entry */
    605         rc = panel_entry_append(panel, "a", 1);
     605        rc = panel_entry_append(panel, "a", 1, false);
    606606        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    607607
     
    614614
    615615        /* Add another entry */
    616         rc = panel_entry_append(panel, "b", 2);
     616        rc = panel_entry_append(panel, "b", 2, false);
    617617        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    618618
     
    640640
    641641        /* Add one entry */
    642         rc = panel_entry_append(panel, "a", 1);
     642        rc = panel_entry_append(panel, "a", 1, false);
    643643        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    644644
     
    651651
    652652        /* Add another entry */
    653         rc = panel_entry_append(panel, "b", 2);
     653        rc = panel_entry_append(panel, "b", 2, false);
    654654        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    655655
     
    702702
    703703        /* Add tree entries (more than page size, which is 2) */
    704         rc = panel_entry_append(panel, "a", 1);
    705         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    706 
    707         rc = panel_entry_append(panel, "b", 2);
    708         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    709 
    710         rc = panel_entry_append(panel, "c", 3);
     704        rc = panel_entry_append(panel, "a", 1, false);
     705        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     706
     707        rc = panel_entry_append(panel, "b", 2, false);
     708        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     709
     710        rc = panel_entry_append(panel, "c", 3, false);
    711711        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    712712
     
    783783
    784784        /* Add tree entries (more than page size, which is 2) */
    785         rc = panel_entry_append(panel, "a", 1);
    786         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    787 
    788         rc = panel_entry_append(panel, "b", 2);
    789         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    790 
    791         rc = panel_entry_append(panel, "c", 3);
     785        rc = panel_entry_append(panel, "a", 1, false);
     786        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     787
     788        rc = panel_entry_append(panel, "b", 2, false);
     789        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     790
     791        rc = panel_entry_append(panel, "c", 3, false);
    792792        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    793793
     
    866866
    867867        /* Add tree entries (more than page size, which is 2) */
    868         rc = panel_entry_append(panel, "a", 1);
    869         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    870 
    871         rc = panel_entry_append(panel, "b", 2);
    872         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    873 
    874         rc = panel_entry_append(panel, "c", 3);
     868        rc = panel_entry_append(panel, "a", 1, false);
     869        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     870
     871        rc = panel_entry_append(panel, "b", 2, false);
     872        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     873
     874        rc = panel_entry_append(panel, "c", 3, false);
    875875        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    876876
     
    927927
    928928        /* Add tree entries (more than page size, which is 2) */
    929         rc = panel_entry_append(panel, "a", 1);
    930         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    931 
    932         rc = panel_entry_append(panel, "b", 2);
    933         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    934 
    935         rc = panel_entry_append(panel, "c", 3);
     929        rc = panel_entry_append(panel, "a", 1, false);
     930        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     931
     932        rc = panel_entry_append(panel, "b", 2, false);
     933        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     934
     935        rc = panel_entry_append(panel, "c", 3, false);
    936936        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    937937
     
    989989
    990990        /* Add five entries (2 full pages, one partial) */
    991         rc = panel_entry_append(panel, "a", 1);
    992         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    993 
    994         rc = panel_entry_append(panel, "b", 2);
    995         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    996 
    997         rc = panel_entry_append(panel, "c", 3);
    998         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    999 
    1000         rc = panel_entry_append(panel, "d", 4);
    1001         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1002 
    1003         rc = panel_entry_append(panel, "e", 5);
     991        rc = panel_entry_append(panel, "a", 1, false);
     992        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     993
     994        rc = panel_entry_append(panel, "b", 2, false);
     995        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     996
     997        rc = panel_entry_append(panel, "c", 3, false);
     998        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     999
     1000        rc = panel_entry_append(panel, "d", 4, false);
     1001        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1002
     1003        rc = panel_entry_append(panel, "e", 5, false);
    10041004        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    10051005
     
    10771077
    10781078        /* Add five entries (2 full pages, one partial) */
    1079         rc = panel_entry_append(panel, "a", 1);
    1080         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1081 
    1082         rc = panel_entry_append(panel, "b", 2);
    1083         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1084 
    1085         rc = panel_entry_append(panel, "c", 3);
    1086         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1087 
    1088         rc = panel_entry_append(panel, "d", 4);
    1089         PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    1090 
    1091         rc = panel_entry_append(panel, "e", 5);
     1079        rc = panel_entry_append(panel, "a", 1, false);
     1080        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1081
     1082        rc = panel_entry_append(panel, "b", 2, false);
     1083        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1084
     1085        rc = panel_entry_append(panel, "c", 3, false);
     1086        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1087
     1088        rc = panel_entry_append(panel, "d", 4, false);
     1089        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
     1090
     1091        rc = panel_entry_append(panel, "e", 5, false);
    10921092        PCUT_ASSERT_ERRNO_VAL(EOK, rc);
    10931093
  • uspace/app/nav/types/panel.h

    r03c4b23 r9bed565  
    5353        /** File size */
    5454        uint64_t size;
     55        /** @c true iff entry is a directory */
     56        bool isdir;
    5557} panel_entry_t;
    5658
     
    7779        /** Active border color */
    7880        gfx_color_t *act_border_color;
     81
     82        /** Directory-type entry color */
     83        gfx_color_t *dir_color;
    7984
    8085        /** Panel entries (list of panel_entry_t) */
Note: See TracChangeset for help on using the changeset viewer.