Compare commits
4 Commits
685defa684
...
0a6b06d1d0
Author | SHA1 | Date | |
---|---|---|---|
0a6b06d1d0 | |||
d889acc315 | |||
6142bf9c53 | |||
244779bd8c |
@ -383,6 +383,10 @@ entry_add_thumbnail(gpointer data, gpointer user_data)
|
|||||||
self->icon = g_object_ref(icon);
|
self->icon = g_object_ref(icon);
|
||||||
g_object_unref(info);
|
g_object_unref(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The GVfs backend may not be friendly.
|
||||||
|
if (!self->icon)
|
||||||
|
self->icon = g_icon_new_for_string("text-x-generic-symbolic", NULL);
|
||||||
out:
|
out:
|
||||||
g_object_unref(file);
|
g_object_unref(file);
|
||||||
}
|
}
|
||||||
|
@ -309,15 +309,27 @@ on_show_enter_location(
|
|||||||
g_signal_connect(entry, "changed",
|
g_signal_connect(entry, "changed",
|
||||||
G_CALLBACK(on_enter_location_changed), self);
|
G_CALLBACK(on_enter_location_changed), self);
|
||||||
|
|
||||||
|
// Can't have it ellipsized and word-wrapped at the same time.
|
||||||
|
GtkWidget *protocols = gtk_label_new("");
|
||||||
|
gtk_label_set_ellipsize(GTK_LABEL(protocols), PANGO_ELLIPSIZE_END);
|
||||||
|
gtk_label_set_xalign(GTK_LABEL(protocols), 0);
|
||||||
|
|
||||||
|
gchar *protos = g_strjoinv(
|
||||||
|
", ", (gchar **) g_vfs_get_supported_uri_schemes(g_vfs_get_default()));
|
||||||
|
gchar *label = g_strdup_printf("<i>Available protocols:</i> %s", protos);
|
||||||
|
g_free(protos);
|
||||||
|
gtk_label_set_markup(GTK_LABEL(protocols), label);
|
||||||
|
g_free(label);
|
||||||
|
|
||||||
GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
|
||||||
gtk_container_add(GTK_CONTAINER(content), entry);
|
gtk_container_add(GTK_CONTAINER(content), entry);
|
||||||
|
gtk_container_add(GTK_CONTAINER(content), protocols);
|
||||||
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
|
gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
|
||||||
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE);
|
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE);
|
||||||
gtk_window_set_default_size(GTK_WINDOW(dialog), 800, -1);
|
gtk_window_set_default_size(GTK_WINDOW(dialog), 800, -1);
|
||||||
|
gtk_window_set_geometry_hints(GTK_WINDOW(dialog), NULL,
|
||||||
GdkGeometry geometry = {.max_width = G_MAXSHORT, .max_height = -1};
|
&(GdkGeometry) {.max_width = G_MAXSHORT, .max_height = -1},
|
||||||
gtk_window_set_geometry_hints(
|
GDK_HINT_MAX_SIZE);
|
||||||
GTK_WINDOW(dialog), NULL, &geometry, GDK_HINT_MAX_SIZE);
|
|
||||||
gtk_widget_show_all(dialog);
|
gtk_widget_show_all(dialog);
|
||||||
|
|
||||||
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
|
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
|
||||||
@ -397,9 +409,16 @@ fiv_sidebar_new(FivIoModel *model)
|
|||||||
g_return_val_if_fail(FIV_IS_IO_MODEL(model), NULL);
|
g_return_val_if_fail(FIV_IS_IO_MODEL(model), NULL);
|
||||||
|
|
||||||
FivSidebar *self = g_object_new(FIV_TYPE_SIDEBAR, NULL);
|
FivSidebar *self = g_object_new(FIV_TYPE_SIDEBAR, NULL);
|
||||||
self->model = g_object_ref(model);
|
|
||||||
|
// This doesn't work from the init function.
|
||||||
|
GtkWidget *sidebar_port = gtk_bin_get_child(GTK_BIN(self));
|
||||||
|
gtk_container_set_focus_hadjustment(GTK_CONTAINER(sidebar_port),
|
||||||
|
gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(self)));
|
||||||
|
gtk_container_set_focus_vadjustment(GTK_CONTAINER(sidebar_port),
|
||||||
|
gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(self)));
|
||||||
|
|
||||||
// TODO(p): There should be an extra signal to watch location changes only.
|
// TODO(p): There should be an extra signal to watch location changes only.
|
||||||
|
self->model = g_object_ref(model);
|
||||||
g_signal_connect_swapped(self->model, "subdirectories-changed",
|
g_signal_connect_swapped(self->model, "subdirectories-changed",
|
||||||
G_CALLBACK(update_location), self);
|
G_CALLBACK(update_location), self);
|
||||||
|
|
||||||
|
122
fiv.c
122
fiv.c
@ -566,11 +566,35 @@ on_item_activated(G_GNUC_UNUSED FivBrowser *browser, GFile *location,
|
|||||||
g_free(uri);
|
g_free(uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void open_any_file(GFile *file, gboolean force_browser);
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_mounted_enclosing(GObject *source_object, GAsyncResult *res,
|
||||||
|
G_GNUC_UNUSED gpointer user_data)
|
||||||
|
{
|
||||||
|
GFile *file = G_FILE(source_object);
|
||||||
|
GError *error = NULL;
|
||||||
|
if (!g_file_mount_enclosing_volume_finish(file, res, &error))
|
||||||
|
show_error_dialog(error);
|
||||||
|
else
|
||||||
|
open_any_file(file, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
open_any_file(GFile *file, gboolean force_browser)
|
open_any_file(GFile *file, gboolean force_browser)
|
||||||
{
|
{
|
||||||
gchar *uri = g_file_get_uri(file);
|
|
||||||
GFileType type = g_file_query_file_type(file, G_FILE_QUERY_INFO_NONE, NULL);
|
GFileType type = g_file_query_file_type(file, G_FILE_QUERY_INFO_NONE, NULL);
|
||||||
|
if (type == G_FILE_TYPE_UNKNOWN &&
|
||||||
|
G_FILE_GET_IFACE(file)->mount_enclosing_volume) {
|
||||||
|
// TODO(p): At least provide some kind of indication.
|
||||||
|
GMountOperation *op = gtk_mount_operation_new(GTK_WINDOW(g.window));
|
||||||
|
g_file_mount_enclosing_volume(file, G_MOUNT_MOUNT_NONE, op, NULL,
|
||||||
|
on_mounted_enclosing, NULL);
|
||||||
|
g_object_unref(op);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gchar *uri = g_file_get_uri(file);
|
||||||
if (type == G_FILE_TYPE_UNKNOWN) {
|
if (type == G_FILE_TYPE_UNKNOWN) {
|
||||||
errno = ENOENT;
|
errno = ENOENT;
|
||||||
show_error_dialog(g_error_new(G_FILE_ERROR,
|
show_error_dialog(g_error_new(G_FILE_ERROR,
|
||||||
@ -1124,6 +1148,52 @@ make_view_toolbar(void)
|
|||||||
return view_toolbar;
|
return view_toolbar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GtkWidget *
|
||||||
|
make_browser_sidebar(FivIoModel *model)
|
||||||
|
{
|
||||||
|
GtkWidget *sidebar = fiv_sidebar_new(model);
|
||||||
|
g_signal_connect(sidebar, "open-location",
|
||||||
|
G_CALLBACK(on_open_location), NULL);
|
||||||
|
|
||||||
|
g.plus = gtk_button_new_from_icon_name("zoom-in-symbolic",
|
||||||
|
GTK_ICON_SIZE_BUTTON);
|
||||||
|
gtk_widget_set_tooltip_text(g.plus, "Larger thumbnails");
|
||||||
|
g_signal_connect(g.plus, "clicked",
|
||||||
|
G_CALLBACK(on_toolbar_zoom), (gpointer) +1);
|
||||||
|
|
||||||
|
g.minus = gtk_button_new_from_icon_name("zoom-out-symbolic",
|
||||||
|
GTK_ICON_SIZE_BUTTON);
|
||||||
|
gtk_widget_set_tooltip_text(g.minus, "Smaller thumbnails");
|
||||||
|
g_signal_connect(g.minus, "clicked",
|
||||||
|
G_CALLBACK(on_toolbar_zoom), (gpointer) -1);
|
||||||
|
|
||||||
|
GtkWidget *zoom_group = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||||||
|
gtk_style_context_add_class(
|
||||||
|
gtk_widget_get_style_context(zoom_group), GTK_STYLE_CLASS_LINKED);
|
||||||
|
gtk_box_pack_start(GTK_BOX(zoom_group), g.plus, FALSE, FALSE, 0);
|
||||||
|
gtk_box_pack_start(GTK_BOX(zoom_group), g.minus, FALSE, FALSE, 0);
|
||||||
|
|
||||||
|
GtkWidget *funnel = gtk_toggle_button_new();
|
||||||
|
gtk_container_add(GTK_CONTAINER(funnel),
|
||||||
|
gtk_image_new_from_icon_name("funnel-symbolic", GTK_ICON_SIZE_BUTTON));
|
||||||
|
gtk_widget_set_tooltip_text(funnel, "Hide unsupported files");
|
||||||
|
g_signal_connect(funnel, "toggled",
|
||||||
|
G_CALLBACK(on_filtering_toggled), NULL);
|
||||||
|
|
||||||
|
GtkBox *toolbar = fiv_sidebar_get_toolbar(FIV_SIDEBAR(sidebar));
|
||||||
|
gtk_box_pack_start(toolbar, zoom_group, FALSE, FALSE, 0);
|
||||||
|
gtk_box_pack_start(toolbar, funnel, FALSE, FALSE, 0);
|
||||||
|
gtk_widget_set_halign(GTK_WIDGET(toolbar), GTK_ALIGN_CENTER);
|
||||||
|
|
||||||
|
g_signal_connect(g.browser, "notify::thumbnail-size",
|
||||||
|
G_CALLBACK(on_notify_thumbnail_size), NULL);
|
||||||
|
g_signal_connect(model, "notify::filtering",
|
||||||
|
G_CALLBACK(on_notify_filtering), funnel);
|
||||||
|
on_toolbar_zoom(NULL, (gpointer) 0);
|
||||||
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(funnel), TRUE);
|
||||||
|
return sidebar;
|
||||||
|
}
|
||||||
|
|
||||||
// This is incredibly broken https://stackoverflow.com/a/51054396/76313
|
// This is incredibly broken https://stackoverflow.com/a/51054396/76313
|
||||||
// thus resolving the problem using overlaps.
|
// thus resolving the problem using overlaps.
|
||||||
// We're trying to be universal for light and dark themes both. It's hard.
|
// We're trying to be universal for light and dark themes both. It's hard.
|
||||||
@ -1271,48 +1341,7 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
// TODO(p): As with GtkFileChooserWidget, bind C-h to filtering,
|
// TODO(p): As with GtkFileChooserWidget, bind C-h to filtering,
|
||||||
// and mayhaps forward the rest to the sidebar, somehow.
|
// and mayhaps forward the rest to the sidebar, somehow.
|
||||||
g.browser_sidebar = fiv_sidebar_new(g.model);
|
g.browser_sidebar = make_browser_sidebar(g.model);
|
||||||
g_signal_connect(g.browser_sidebar, "open-location",
|
|
||||||
G_CALLBACK(on_open_location), NULL);
|
|
||||||
|
|
||||||
// The opposite case, and it doesn't work from the init function.
|
|
||||||
GtkWidget *sidebar_port = gtk_bin_get_child(GTK_BIN(g.browser_sidebar));
|
|
||||||
gtk_container_set_focus_hadjustment(GTK_CONTAINER(sidebar_port),
|
|
||||||
gtk_scrolled_window_get_hadjustment(
|
|
||||||
GTK_SCROLLED_WINDOW(g.browser_sidebar)));
|
|
||||||
gtk_container_set_focus_vadjustment(GTK_CONTAINER(sidebar_port),
|
|
||||||
gtk_scrolled_window_get_vadjustment(
|
|
||||||
GTK_SCROLLED_WINDOW(g.browser_sidebar)));
|
|
||||||
|
|
||||||
g.plus = gtk_button_new_from_icon_name("zoom-in-symbolic",
|
|
||||||
GTK_ICON_SIZE_BUTTON);
|
|
||||||
gtk_widget_set_tooltip_text(g.plus, "Larger thumbnails");
|
|
||||||
g_signal_connect(g.plus, "clicked",
|
|
||||||
G_CALLBACK(on_toolbar_zoom), (gpointer) +1);
|
|
||||||
|
|
||||||
g.minus = gtk_button_new_from_icon_name("zoom-out-symbolic",
|
|
||||||
GTK_ICON_SIZE_BUTTON);
|
|
||||||
gtk_widget_set_tooltip_text(g.minus, "Smaller thumbnails");
|
|
||||||
g_signal_connect(g.minus, "clicked",
|
|
||||||
G_CALLBACK(on_toolbar_zoom), (gpointer) -1);
|
|
||||||
|
|
||||||
GtkWidget *zoom_group = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
|
||||||
gtk_style_context_add_class(
|
|
||||||
gtk_widget_get_style_context(zoom_group), GTK_STYLE_CLASS_LINKED);
|
|
||||||
gtk_box_pack_start(GTK_BOX(zoom_group), g.plus, FALSE, FALSE, 0);
|
|
||||||
gtk_box_pack_start(GTK_BOX(zoom_group), g.minus, FALSE, FALSE, 0);
|
|
||||||
|
|
||||||
GtkWidget *funnel = gtk_toggle_button_new();
|
|
||||||
gtk_container_add(GTK_CONTAINER(funnel),
|
|
||||||
gtk_image_new_from_icon_name("funnel-symbolic", GTK_ICON_SIZE_BUTTON));
|
|
||||||
gtk_widget_set_tooltip_text(funnel, "Hide unsupported files");
|
|
||||||
g_signal_connect(funnel, "toggled",
|
|
||||||
G_CALLBACK(on_filtering_toggled), NULL);
|
|
||||||
|
|
||||||
GtkBox *toolbar = fiv_sidebar_get_toolbar(FIV_SIDEBAR(g.browser_sidebar));
|
|
||||||
gtk_box_pack_start(toolbar, zoom_group, FALSE, FALSE, 0);
|
|
||||||
gtk_box_pack_start(toolbar, funnel, FALSE, FALSE, 0);
|
|
||||||
gtk_widget_set_halign(GTK_WIDGET(toolbar), GTK_ALIGN_CENTER);
|
|
||||||
|
|
||||||
g.browser_paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
|
g.browser_paned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
|
||||||
gtk_paned_add1(GTK_PANED(g.browser_paned), g.browser_sidebar);
|
gtk_paned_add1(GTK_PANED(g.browser_paned), g.browser_sidebar);
|
||||||
@ -1339,13 +1368,6 @@ main(int argc, char *argv[])
|
|||||||
G_CALLBACK(on_window_state_event), NULL);
|
G_CALLBACK(on_window_state_event), NULL);
|
||||||
gtk_container_add(GTK_CONTAINER(g.window), g.stack);
|
gtk_container_add(GTK_CONTAINER(g.window), g.stack);
|
||||||
|
|
||||||
g_signal_connect(g.browser, "notify::thumbnail-size",
|
|
||||||
G_CALLBACK(on_notify_thumbnail_size), NULL);
|
|
||||||
on_toolbar_zoom(NULL, (gpointer) 0);
|
|
||||||
g_signal_connect(g.model, "notify::filtering",
|
|
||||||
G_CALLBACK(on_notify_filtering), funnel);
|
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(funnel), TRUE);
|
|
||||||
|
|
||||||
// Try to get half of the screen vertically, in 4:3 aspect ratio.
|
// Try to get half of the screen vertically, in 4:3 aspect ratio.
|
||||||
//
|
//
|
||||||
// We need the GdkMonitor before the GtkWindow has a GdkWindow (i.e.,
|
// We need the GdkMonitor before the GtkWindow has a GdkWindow (i.e.,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user