file: add parent param to remote+preview method

Allow passing a file's parent to get_filesystem_use_preview and
get_filesystem_remote. This resolves the multi-level parent checking
discussed in [1], by only checking one parent at most.

[1] https://gitlab.gnome.org/GNOME/nautilus/-/issues/3336
This commit is contained in:
Peter Eisenmann 2024-03-15 03:45:09 +01:00
parent 1517233558
commit 928055c842

View file

@ -4405,66 +4405,57 @@ get_default_file_icon (void)
} }
static GFilesystemPreviewType static GFilesystemPreviewType
get_filesystem_use_preview (NautilusFile *file) get_filesystem_use_preview (NautilusFile *file,
NautilusFile *parent)
{ {
if (file->details->filesystem_info_is_up_to_date) if (file->details->filesystem_info_is_up_to_date)
{ {
return file->details->filesystem_use_preview; return file->details->filesystem_use_preview;
} }
else if (parent != NULL && parent->details->filesystem_info_is_up_to_date)
{
return parent->details->filesystem_use_preview;
}
else else
{ {
g_autoptr (NautilusFile) parent = nautilus_file_get_parent (file); return G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS;
if (parent != NULL && file->details->filesystem_info_is_up_to_date)
{
return parent->details->filesystem_use_preview;
}
} }
return G_FILESYSTEM_PREVIEW_TYPE_IF_ALWAYS;
} }
static gboolean static gboolean
get_filesystem_remote (NautilusFile *file) get_filesystem_remote (NautilusFile *file,
NautilusFile *parent)
{ {
if (file->details->filesystem_info_is_up_to_date) if (file->details->filesystem_info_is_up_to_date)
{ {
return file->details->filesystem_remote; return file->details->filesystem_remote;
} }
else
{
g_autoptr (NautilusFile) parent = NULL;
parent = nautilus_file_get_parent (file); g_autoptr (NautilusFile) tmp_parent = NULL;
if (parent != NULL && file->details->filesystem_info_is_up_to_date)
{ if (parent == NULL)
return parent->details->filesystem_remote; {
} tmp_parent = nautilus_file_get_parent (file);
parent = tmp_parent;
} }
return FALSE; if (parent != NULL && parent->details->filesystem_info_is_up_to_date)
{
return parent->details->filesystem_remote;
}
else
{
return FALSE;
}
} }
static gboolean static gboolean
get_speed_tradeoff_preference_for_file (NautilusFile *file, get_speed_tradeoff_preference_for_file (NautilusFile *file,
NautilusSpeedTradeoffValue value) NautilusSpeedTradeoffValue value)
{ {
GFilesystemPreviewType use_preview; g_autoptr (NautilusFile) parent = file->details->filesystem_info_is_up_to_date ?
g_autoptr (NautilusFile) parent = NULL; NULL : nautilus_file_get_parent (file);
NautilusFile *preffered_file = file; GFilesystemPreviewType use_preview = get_filesystem_use_preview (file, parent);
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
/* If the info is not already available, it's better to share the parent
* between the filesystem info check functions then to let both parse it
* twice. */
if (!file->details->filesystem_info_is_up_to_date)
{
parent = nautilus_file_get_parent (file);
preffered_file = parent != NULL ? parent : file;
}
use_preview = get_filesystem_use_preview (preffered_file);
if (value == NAUTILUS_SPEED_TRADEOFF_ALWAYS) if (value == NAUTILUS_SPEED_TRADEOFF_ALWAYS)
{ {
@ -4496,7 +4487,7 @@ get_speed_tradeoff_preference_for_file (NautilusFile *file,
else else
{ {
/* only local files */ /* only local files */
return !get_filesystem_remote (preffered_file); return !get_filesystem_remote (file, parent);
} }
} }
@ -7428,7 +7419,7 @@ nautilus_file_is_remote (NautilusFile *file)
{ {
g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE); g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
return get_filesystem_remote (file); return get_filesystem_remote (file, NULL);
} }
/** /**