Update gtk149

This commit is contained in:
daleclack 2023-04-03 23:39:05 +08:00
parent 42ca97e3b2
commit 8c4329a9a6
11 changed files with 119 additions and 20 deletions

View File

@ -32,6 +32,12 @@ set(SOURCE_FILE src/main.cpp src/FileWindow.cpp src/FileColumnView.cpp src/FileG
set(RESOURCE_LIST set(RESOURCE_LIST
dialog-error.png dialog-error.png
icons/scalable/status/filewin-delete.svg
icons/scalable/status/filewin-go-home.svg
icons/scalable/status/filewin-go-up.svg
icons/scalable/status/filewin-new.svg
icons/scalable/status/filewin-view-grid.svg
icons/scalable/status/filewin-view-list.svg
) )
compile_gresources(RESOURCE_FILE compile_gresources(RESOURCE_FILE

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16.001" xmlns="http://www.w3.org/2000/svg">
<path d="M7.5 0C6.4 0 5.355.32 5.355.32L5 .428v1.683A13.88 13.88 0 0 0 2.002 3L2 4H1v1h1l.004 9c0 .439.04.788.15 1.082.111.294.311.528.563.668.503.28 1.12.25 1.953.25h5.664c.833 0 1.45.03 1.953-.25.252-.14.45-.374.56-.668.11-.294.153-.643.153-1.082l-.002-8h-1L12 14c0 .376-.04.603-.088.729-.034.09-.078.129-.11.146-.173.097-.611.125-1.468.125H4.67c-.857 0-1.295-.028-1.469-.125a.267.267 0 0 1-.113-.146v-.002c-.046-.122-.084-.348-.084-.727v-.002L3 5h11V4h-1.002L13 3a13.855 13.855 0 0 0-3-.889V.449L9.67.33S8.757 0 7.5 0zm0 1c.89 0 1.29.155 1.5.22v.739a14.05 14.05 0 0 0-1.498-.084c-.502 0-1.003.032-1.502.086v-.734C6.266 1.157 6.772 1 7.5 1zM5 6v6h1V6zm2 0v6h1V6zm2 0v6h1V6z" fill="gray" font-family="Ubuntu" font-size="15" font-weight="400" letter-spacing="0" text-anchor="middle" word-spacing="0"/>
</svg>

After

Width:  |  Height:  |  Size: 875 B

View File

@ -0,0 +1,10 @@
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<g fill="gray">
<path d="M14 5V3h-2.002z" overflow="visible"/>
<g font-weight="400">
<path d="M2 7v8h9v-1H3V6.333zm11.002-1L13 15h1V7z" font-family="Ubuntu" font-size="15" letter-spacing="0" text-anchor="middle" word-spacing="0"/>
<path d="M8 8.986a8.47 8.47 0 0 1 .607-.122 5.24 5.24 0 0 1 .872-.064c.295 0 .54.043.735.129.195.08.35.197.465.35.119.147.202.326.25.535.047.21.071.44.071.693V14.2H8z" font-family="Ubuntu" letter-spacing="0" text-anchor="end" word-spacing="0"/>
<path d="M8 .293L.146 8.146l.708.708L8 1.707l7.146 7.147.708-.708z" fill-rule="evenodd" font-family="sans-serif" overflow="visible" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none" white-space="normal"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M16 10c-.874-.69-1.757-1.397-2.656-2.008-1-.679-1.972-1.287-2.912-1.825C9.564 5.67 8.658 5.297 8 5c-.658.297-1.564.67-2.432 1.167a44.819 44.819 0 0 0-2.912 1.825C1.756 8.602.874 9.309 0 10h1.49c.524-.4 1.062-.837 1.625-1.222.71-.486 1.437-.942 2.18-1.37a39.201 39.201 0 0 1 2.5-1.285h.001L8 6.027l.203.096c.71.334 1.747.852 2.501 1.285.744.428 1.47.884 2.181 1.37.562.385 1.1.822 1.625 1.222H16z" fill="gray"/>
</svg>

After

Width:  |  Height:  |  Size: 489 B

View File

@ -0,0 +1,6 @@
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<g fill="gray" font-family="sans-serif" font-weight="400" white-space="normal">
<path d="M3.994 1c-1.258.015-2.179-.029-2.932.387a1.878 1.878 0 0 0-.84.996C.059 2.82 0 3.343 0 4v8c0 .658.058 1.179.223 1.617.164.439.463.79.84.998.752.416 1.673.37 2.931.385H10v-1H4c-1.26-.015-2.087-.06-2.453-.262-.183-.1-.29-.212-.387-.472C1.063 13.006 1 12.592 1 12V8c0-.592.064-1.006.162-1.266s.203-.371.387-.472c.367-.203 1.195-.247 2.459-.262h3.435l2.022-2h2.527c1.264.015 2.092.06 2.46.262.183.1.288.212.386.472.098.26.162.674.162 1.266v4h1V6c0-.658-.058-1.179-.223-1.617-.02-.055-.048-.104-.074-.154l-.027-.057a1.838 1.838 0 0 0-.738-.787c-.753-.416-1.674-.37-2.932-.385H8.967L6.945 1H3.996zm.012 1h2.53L8.3 3.746 7.033 5H3.994c-1.258.014-2.179-.03-2.932.385-.022.012-.04.03-.062.043V4c0-.592.062-1.006.16-1.266s.203-.371.387-.472c.366-.203 1.195-.247 2.459-.262z" overflow="visible" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:none;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-transform:none"/>
<path d="m13 11v2h-2v1h2v2h1v-2h2v-1h-2v-2z" overflow="visible" style="isolation:auto;mix-blend-mode:normal;text-decoration-color:#000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-transform:none"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M2 2v5h5V2zm7 0v5h5V2zM3 3h3v3H3zm7 0h3v3h-3zM2 9v5h5V9zm7 0v5h5V9zm-6 1h3v3H3zm7 0h3v3h-3z" fill="gray" font-family="sans-serif" font-weight="400" overflow="visible" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none" white-space="normal"/>
</svg>

After

Width:  |  Height:  |  Size: 639 B

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M2 2v3h3V2zm1 1h1v1H3zm3 0v1h8V3zM2 6v3h3V6zm1 1h1v1H3zm3 0v1h8V7zm-4 3v3h3v-3zm1 1h1v1H3zm3 0v1h8v-1z" fill="gray" font-family="sans-serif" font-weight="400" overflow="visible" style="font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;isolation:auto;mix-blend-mode:normal;shape-padding:0;text-decoration-color:#000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none" white-space="normal"/>
</svg>

After

Width:  |  Height:  |  Size: 650 B

View File

@ -95,17 +95,24 @@ static void bind_filesize_item(GtkListItemFactory *factory, GtkListItem *item)
gtk_label_set_label(GTK_LABEL(label), size_str); gtk_label_set_label(GTK_LABEL(label), size_str);
} }
static void listview_activated(GtkColumnView *view, guint position, GtkDirectoryList *list) static void listview_activated(GtkColumnView *view, guint position, FileWindow *win)
{ {
// Get the model // Get the model
GtkSelectionModel *model = gtk_column_view_get_model(view); GtkSelectionModel *model = gtk_column_view_get_model(view);
GFileInfo *info = G_FILE_INFO(g_list_model_get_item(G_LIST_MODEL(model), position)); GFileInfo *info = G_FILE_INFO(g_list_model_get_item(G_LIST_MODEL(model), position));
GtkDirectoryList *list = GTK_DIRECTORY_LIST(file_window_get_column_model(win));
// if the file type is directory, open the directory // if the file type is directory, open the directory
if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY) if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY)
{ {
gtk_directory_list_set_file(list, // Get the file and set it to the GtkDirectoryList
G_FILE(g_file_info_get_attribute_object(info, "standard::file"))); GFile *file = G_FILE(g_file_info_get_attribute_object(info, "standard::file"));
gtk_directory_list_set_file(list, file);
// Update string in the entry for path
char *path = g_file_get_path(file);
gtk_editable_set_text(GTK_EDITABLE(file_window_get_folder_entry(win)), path);
g_free(path);
} }
g_object_unref(info); g_object_unref(info);
} }
@ -150,7 +157,7 @@ GtkWidget *create_column_view(FileWindow *win)
g_object_unref(column); g_object_unref(column);
// Link signals // Link signals
g_signal_connect(view, "activate", G_CALLBACK(listview_activated), model); g_signal_connect(view, "activate", G_CALLBACK(listview_activated), win);
return view; return view;
} }

View File

@ -55,16 +55,24 @@ static void bind_grid_item(GtkListItemFactory *factory, GtkListItem *item)
gtk_label_set_label(GTK_LABEL(label_filesize), g_format_size(g_file_info_get_size(info))); gtk_label_set_label(GTK_LABEL(label_filesize), g_format_size(g_file_info_get_size(info)));
} }
static void gridview_activate(GtkGridView *view, guint position, GtkDirectoryList *list){ static void gridview_activate(GtkGridView *view, guint position, FileWindow *win)
{
// Get the model // Get the model
GtkSelectionModel *model = gtk_grid_view_get_model(view); GtkSelectionModel *model = gtk_grid_view_get_model(view);
GFileInfo *info = G_FILE_INFO(g_list_model_get_item(G_LIST_MODEL(model), position)); GFileInfo *info = G_FILE_INFO(g_list_model_get_item(G_LIST_MODEL(model), position));
GtkDirectoryList *list = GTK_DIRECTORY_LIST(file_window_get_grid_model(win));
// if the file type is directory, open the directory // if the file type is directory, open the directory
if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY) if (g_file_info_get_file_type(info) == G_FILE_TYPE_DIRECTORY)
{ {
gtk_directory_list_set_file(list, // Get the file and set it to the GtkDirectoryList
G_FILE(g_file_info_get_attribute_object(info, "standard::file"))); GFile *file = G_FILE(g_file_info_get_attribute_object(info, "standard::file"));
gtk_directory_list_set_file(list, file);
// Update string in the entry for path
char *path = g_file_get_path(file);
gtk_editable_set_text(GTK_EDITABLE(file_window_get_folder_entry(win)), path);
g_free(path);
} }
g_object_unref(info); g_object_unref(info);
} }
@ -84,7 +92,7 @@ GtkWidget *create_grid_view(FileWindow *win)
GtkWidget *grid_view = gtk_grid_view_new(GTK_SELECTION_MODEL(selection), factory); GtkWidget *grid_view = gtk_grid_view_new(GTK_SELECTION_MODEL(selection), factory);
// Link Signal // Link Signal
g_signal_connect(grid_view, "activate", G_CALLBACK(gridview_activate), model); g_signal_connect(grid_view, "activate", G_CALLBACK(gridview_activate), win);
return grid_view; return grid_view;
} }

View File

@ -22,6 +22,7 @@ struct _FileWindow
GtkWidget *main_box, *btn_box; GtkWidget *main_box, *btn_box;
GtkWidget *scrolled_window_column, *scrolled_window_grid; GtkWidget *scrolled_window_column, *scrolled_window_grid;
GtkWidget *stack; GtkWidget *stack;
GtkWidget *folder_entry;
GtkWidget *btn_up, *btn_home, *btn_new, *btn_del, *btn_view; GtkWidget *btn_up, *btn_home, *btn_new, *btn_del, *btn_view;
GtkWidget *separator; GtkWidget *separator;
ViewMode view_mode; ViewMode view_mode;
@ -78,7 +79,7 @@ static void btnview_clicked(GtkButton *button, FileWindow *win)
// Change view mode from list to grid // Change view mode from list to grid
gtk_stack_set_visible_child(GTK_STACK(win->stack), win->scrolled_window_grid); gtk_stack_set_visible_child(GTK_STACK(win->stack), win->scrolled_window_grid);
gtk_button_set_icon_name(button, "view-grid"); gtk_button_set_icon_name(button, "filewin-view-grid");
win->view_mode = ViewMode::MODE_GRID; win->view_mode = ViewMode::MODE_GRID;
} }
else else
@ -88,7 +89,7 @@ static void btnview_clicked(GtkButton *button, FileWindow *win)
// Change view mode from grid to list // Change view mode from grid to list
gtk_stack_set_visible_child(GTK_STACK(win->stack), win->scrolled_window_column); gtk_stack_set_visible_child(GTK_STACK(win->stack), win->scrolled_window_column);
gtk_button_set_icon_name(button, "view-list"); gtk_button_set_icon_name(button, "filewin-view-list");
win->view_mode = ViewMode::MODE_LIST; win->view_mode = ViewMode::MODE_LIST;
} }
} }
@ -100,17 +101,31 @@ static void btnup_clicked(GtkWidget *widget, FileWindow *win)
if (!g_str_equal(g_file_get_path(file), "/")) if (!g_str_equal(g_file_get_path(file), "/"))
{ {
GFile *file1 = g_file_get_parent(file); GFile *file1 = g_file_get_parent(file);
// Set the directory of models // Set the directory of models
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file1); gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file1);
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file1); gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file1);
// Update string in the entry for path
char *path = g_file_get_path(file1);
gtk_editable_set_text(GTK_EDITABLE(win->folder_entry), path);
g_free(path);
g_object_unref(file1); g_object_unref(file1);
} }
else else
{ {
GFile *file1 = g_file_new_for_path("/"); GFile *file1 = g_file_new_for_path("/");
// Set the directory of models // Set the directory of models
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file1); gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file1);
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file1); gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file1);
// Update string in the entry for path
char *path = g_file_get_path(file1);
gtk_editable_set_text(GTK_EDITABLE(win->folder_entry), path);
g_free(path);
g_object_unref(file1); g_object_unref(file1);
} }
} }
@ -178,6 +193,12 @@ static void btnhome_clicked(GtkWidget *widget, FileWindow *win)
{ {
// Set Current dir to home dir // Set Current dir to home dir
GFile *file = g_file_new_for_path(g_get_home_dir()); GFile *file = g_file_new_for_path(g_get_home_dir());
// Update string in the entry for path
char *path = g_file_get_path(file);
gtk_editable_set_text(GTK_EDITABLE(win->folder_entry), path);
g_free(path);
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file); gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file);
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file); gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file);
g_object_unref(file); g_object_unref(file);
@ -217,16 +238,35 @@ static void btndel_clicked(GtkWidget *widget, FileWindow *win)
gtk_window_present(GTK_WINDOW(error_dialog)); gtk_window_present(GTK_WINDOW(error_dialog));
} }
GListModel *file_window_get_grid_model(FileWindow *self){ static void folder_entry_activated(GtkWidget *widget, FileWindow *win)
{
// Get Path and create a associated file
const char *path = gtk_editable_get_text(GTK_EDITABLE(widget));
GFile *file = g_file_new_for_path(path);
// Set the directory of models
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file);
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file);
}
GListModel *file_window_get_grid_model(FileWindow *self)
{
// Get Model for grid view // Get Model for grid view
return self->model_grid; return self->model_grid;
} }
GListModel *file_window_get_column_model(FileWindow *self){ GListModel *file_window_get_column_model(FileWindow *self)
{
// Get Model for list column view // Get Model for list column view
return self->model_column; return self->model_column;
} }
GtkWidget *file_window_get_folder_entry(FileWindow *self)
{
// Get the entry widget
return self->folder_entry;
}
static void file_window_dispose(GObject *object) static void file_window_dispose(GObject *object)
{ {
// Clear List Model // Clear List Model
@ -237,6 +277,7 @@ static void file_window_init(FileWindow *self)
{ {
GtkColumnViewColumn *column; GtkColumnViewColumn *column;
// Initalize window // Initalize window
gtk_window_set_title(GTK_WINDOW(self), "My Finder");
gtk_window_set_icon_name(GTK_WINDOW(self), "org.gtk.daleclack"); gtk_window_set_icon_name(GTK_WINDOW(self), "org.gtk.daleclack");
gtk_window_set_default_size(GTK_WINDOW(self), 640, 400); gtk_window_set_default_size(GTK_WINDOW(self), 640, 400);
@ -255,11 +296,15 @@ static void file_window_init(FileWindow *self)
self->grid_view = create_grid_view(self); self->grid_view = create_grid_view(self);
// Create buttons // Create buttons
self->btn_up = gtk_button_new_from_icon_name("go-up"); self->btn_up = gtk_button_new_from_icon_name("filewin-go-up");
self->btn_home = gtk_button_new_from_icon_name("go-home"); self->btn_home = gtk_button_new_from_icon_name("filewin-go-home");
self->btn_new = gtk_button_new_from_icon_name("folder-new"); self->btn_new = gtk_button_new_from_icon_name("filewin-new");
self->btn_del = gtk_button_new_from_icon_name("edit-delete"); self->btn_del = gtk_button_new_from_icon_name("filewin-delete");
self->btn_view = gtk_button_new_from_icon_name("view-list"); self->btn_view = gtk_button_new_from_icon_name("filewin-view-list");
// Create entry for show and change the current folder
self->folder_entry = gtk_entry_new();
gtk_editable_set_text(GTK_EDITABLE(self->folder_entry), g_get_home_dir());
// Create widgets for layout // Create widgets for layout
self->scrolled_window_column = gtk_scrolled_window_new(); self->scrolled_window_column = gtk_scrolled_window_new();
@ -286,6 +331,7 @@ static void file_window_init(FileWindow *self)
g_signal_connect(self->btn_home, "clicked", G_CALLBACK(btnhome_clicked), self); g_signal_connect(self->btn_home, "clicked", G_CALLBACK(btnhome_clicked), self);
g_signal_connect(self->btn_del, "clicked", G_CALLBACK(btndel_clicked), self); g_signal_connect(self->btn_del, "clicked", G_CALLBACK(btndel_clicked), self);
g_signal_connect(self->btn_new, "clicked", G_CALLBACK(btnnew_clicked), self); g_signal_connect(self->btn_new, "clicked", G_CALLBACK(btnnew_clicked), self);
g_signal_connect(self->folder_entry, "activate", G_CALLBACK(folder_entry_activated), self);
// Add scrolled window for columns view // Add scrolled window for columns view
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(self->scrolled_window_column), gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(self->scrolled_window_column),
@ -302,8 +348,10 @@ static void file_window_init(FileWindow *self)
gtk_widget_set_vexpand(self->scrolled_window_grid, TRUE); gtk_widget_set_vexpand(self->scrolled_window_grid, TRUE);
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(self->scrolled_window_grid), self->grid_view); gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(self->scrolled_window_grid), self->grid_view);
gtk_stack_add_named(GTK_STACK(self->stack), self->scrolled_window_grid, "Grid View"); gtk_stack_add_named(GTK_STACK(self->stack), self->scrolled_window_grid, "Grid View");
gtk_box_append(GTK_BOX(self->main_box), self->btn_box);
gtk_box_append(GTK_BOX(self->main_box), self->stack); gtk_box_append(GTK_BOX(self->main_box), self->btn_box); // Box for control buttons
gtk_box_append(GTK_BOX(self->main_box), self->folder_entry); // Box for folder switcher
gtk_box_append(GTK_BOX(self->main_box), self->stack); // Box for main area
// gtk_stack_set_visible_child(GTK_STACK(self->stack), self->scrolled_window_grid); // gtk_stack_set_visible_child(GTK_STACK(self->stack), self->scrolled_window_grid);
gtk_window_set_child(GTK_WINDOW(self), self->main_box); gtk_window_set_child(GTK_WINDOW(self), self->main_box);
} }

View File

@ -9,3 +9,5 @@ FileWindow *file_window_new(GtkApplication *app);
GListModel *file_window_get_grid_model(FileWindow *self); GListModel *file_window_get_grid_model(FileWindow *self);
GListModel *file_window_get_column_model(FileWindow *self); GListModel *file_window_get_column_model(FileWindow *self);
GtkWidget *file_window_get_folder_entry(FileWindow *self);