diff options
author | Stefano Facchini <stefano.facchini@gmail.com> | 2020-06-07 18:34:46 +0200 |
---|---|---|
committer | Stefano Facchini <stefano.facchini@gmail.com> | 2020-06-12 12:32:31 +0200 |
commit | f4b3b4699b98fcf79e825704c68481eb43e9c149 (patch) | |
tree | 5d570972b5ec9996d65c72662cb6f6ecf0bc691e /src | |
parent | d24615e14f30f4f800af2c17aab612805ec291fb (diff) | |
download | baobab-f4b3b4699b98fcf79e825704c68481eb43e9c149.tar.gz |
Add files to the model
Diffstat (limited to 'src')
-rw-r--r-- | src/baobab-scanner.vala | 95 |
1 files changed, 49 insertions, 46 deletions
diff --git a/src/baobab-scanner.vala b/src/baobab-scanner.vala index 4c7badb..d1952cc 100644 --- a/src/baobab-scanner.vala +++ b/src/baobab-scanner.vala @@ -168,6 +168,7 @@ namespace Baobab { internal unowned Results? parent; internal string name; internal string display_name; + internal FileType file_type; // written in the worker thread before dispatch // read from the main thread only after dispatch @@ -183,6 +184,31 @@ namespace Baobab { // accessed only by the main thread internal Gtk.TreeIter iter; internal bool iter_is_set; + + public Results (FileInfo info, Results? parent_results) { + parent = parent_results; + name = info.get_name (); + var info_display_name = info.get_display_name (); + if (name == null || info_display_name != Filename.display_name (name)) { + display_name = info_display_name; + } + file_type = info.get_file_type (); + size = info.get_size (); + alloc_size = info.get_attribute_uint64 (FileAttribute.STANDARD_ALLOCATED_SIZE); + time_modified = info.get_attribute_uint64 (FileAttribute.TIME_MODIFIED); + elements = 1; + error = null; + child_error = false; + } + + public void update_with_child (Results child) { + size += child.size; + alloc_size += child.alloc_size; + elements += child.elements; + max_depth = int.max (max_depth, child.max_depth + 1); + child_error |= child.child_error || (child.error != null); + time_modified = uint64.max (time_modified, child.time_modified); + } } Results? add_directory (File directory, FileInfo info, Results? parent = null) { @@ -194,21 +220,7 @@ namespace Baobab { return null; } - var results = new Results (); - results.name = info.get_name (); - var display_name = info.get_display_name (); - if (results.name == null || display_name != Filename.display_name (results.name)) { - results.display_name = display_name; - } - results.parent = parent; - - results.time_modified = info.get_attribute_uint64 (FileAttribute.TIME_MODIFIED); - - results.size = info.get_size (); - results.alloc_size = info.get_attribute_uint64 (FileAttribute.STANDARD_ALLOCATED_SIZE); - results.elements = 1; - results.error = null; - results.child_error = false; + var results = new Results (info, parent); try { var children = directory.enumerate_children (ATTRIBUTES, FileQueryInfoFlags.NOFOLLOW_SYMLINKS, cancellable); @@ -220,18 +232,7 @@ namespace Baobab { var child_results = add_directory (child, child_info, results); if (child_results != null) { - results.size += child_results.size; - results.alloc_size += child_results.alloc_size; - results.elements += child_results.elements; - results.max_depth = int.max (results.max_depth, child_results.max_depth + 1); - if (child_results.error != null || child_results.child_error) { - results.child_error = true; - } - - if (results.time_modified < child_results.time_modified) { - results.time_modified = child_results.time_modified; - } - + results.update_with_child (child_results); results_array.results += (owned) child_results; } break; @@ -248,16 +249,12 @@ namespace Baobab { hardlinks.add ((owned) hl); } - } - results.size += child_info.get_size (); - results.alloc_size += child_info.get_attribute_uint64 (FileAttribute.STANDARD_ALLOCATED_SIZE); - results.elements++; - - var child_time = child_info.get_attribute_uint64 (FileAttribute.TIME_MODIFIED); - if (results.time_modified < child_time) { - results.time_modified = child_time; } + + var child_results = new Results (child_info, results); + results.update_with_child (child_results); + results_array.results += (owned) child_results; break; default: @@ -317,14 +314,14 @@ namespace Baobab { } prepend (out results.iter, parent_iter); - set (results.iter, - Columns.STATE, State.SCANNING, - Columns.NAME, results.name, - Columns.TIME_MODIFIED,results.time_modified); + set (results.iter, Columns.NAME, results.name); + // To save some memory, we only create these columns if they are needed if (results.display_name != null) { - set (results.iter, - Columns.DISPLAY_NAME, results.display_name); + set (results.iter, Columns.DISPLAY_NAME, results.display_name); + } + if (results.file_type == FileType.DIRECTORY) { + set (results.iter, Columns.STATE, State.SCANNING); } results.iter_is_set = true; @@ -351,11 +348,17 @@ namespace Baobab { } set (results.iter, - Columns.SIZE, results.size, - Columns.ALLOC_SIZE, results.alloc_size, - Columns.PERCENT, results.percent, - Columns.ELEMENTS, results.elements, - Columns.STATE, state); + Columns.PERCENT, results.percent, + Columns.SIZE, results.size, + Columns.ALLOC_SIZE, results.alloc_size, + Columns.TIME_MODIFIED, results.time_modified); + + // To save some memory, we only create these columns if they are needed + if (results.file_type == FileType.DIRECTORY) { + set (results.iter, + Columns.ELEMENTS, results.elements, + Columns.STATE, state); + } if (results.max_depth > max_depth) { max_depth = results.max_depth; |