Update gtk149

This commit is contained in:
daleclack 2023-04-03 23:02:06 +08:00
parent 0abb60e9c7
commit 42ca97e3b2
8 changed files with 227 additions and 46 deletions

View File

@ -30,24 +30,21 @@ set(SOURCE_FILE src/main.cpp src/FileWindow.cpp src/FileColumnView.cpp src/FileG
#Compile Resource #Compile Resource
# set(RESOURCE_LIST set(RESOURCE_LIST
# custom_style.css dialog-error.png
# STRIPBLANKS context_menu.xml )
# STRIPBLANKS default_menu.xml
# STRIPBLANKS prefs_stack.ui
# )
# compile_gresources(RESOURCE_FILE compile_gresources(RESOURCE_FILE
# XML_OUT XML_OUT
# TYPE EMBED_C TYPE EMBED_C
# RESOURCES ${RESOURCE_LIST} RESOURCES ${RESOURCE_LIST}
# PREFIX "/org/gtk/daleclack" PREFIX "/org/gtk/daleclack"
# SOURCE_DIR ${PROJECT_SOURCE_DIR}/res) SOURCE_DIR ${PROJECT_SOURCE_DIR}/res)
# Add a custom target to the makefile. Now make builds our resource file. # Add a custom target to the makefile. Now make builds our resource file.
# It depends on the output RESOURCE_FILE. # It depends on the output RESOURCE_FILE.
# add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE}) add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE})
#For win32 platform,use rc resource and .ico icon #For win32 platform,use rc resource and .ico icon
if(WIN32) if(WIN32)
@ -56,12 +53,12 @@ if(WIN32)
set_property(SOURCE ../icon.rc APPEND PROPERTY set_property(SOURCE ../icon.rc APPEND PROPERTY
OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/../icon.ico OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/../icon.ico
) )
add_executable(${PROJECT_NAME} WIN32 ${app_WINRC} ${SOURCE_FILE}) add_executable(${PROJECT_NAME} WIN32 ${app_WINRC} ${SOURCE_FILE} ${RESOURCE_FILE})
add_custom_command( TARGET ${PROJECT_NAME} add_custom_command( TARGET ${PROJECT_NAME}
COMMAND echo * > ${CMAKE_BINARY_DIR}/.gitignore COMMAND echo * > ${CMAKE_BINARY_DIR}/.gitignore
COMMAND echo **/* > ${CMAKE_BINARY_DIR}/.hgignore) COMMAND echo **/* > ${CMAKE_BINARY_DIR}/.hgignore)
else() else()
add_executable(${PROJECT_NAME} ${SOURCE_FILE}) add_executable(${PROJECT_NAME} ${SOURCE_FILE} ${RESOURCE_FILE})
add_custom_command( TARGET ${PROJECT_NAME} add_custom_command( TARGET ${PROJECT_NAME}
COMMAND echo \"*\" > ${CMAKE_BINARY_DIR}/.gitignore COMMAND echo \"*\" > ${CMAKE_BINARY_DIR}/.gitignore
COMMAND echo \"**/*\" > ${CMAKE_BINARY_DIR}/.hgignore) COMMAND echo \"**/*\" > ${CMAKE_BINARY_DIR}/.hgignore)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -25,6 +25,12 @@ static void setup_filename_item(GtkListItemFactory *factory, GtkListItem *item)
// Create label to show list item // Create label to show list item
GtkWidget *label; GtkWidget *label;
label = gtk_label_new(" "); label = gtk_label_new(" ");
// Set the mode for ellipsize
gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END);
gtk_label_set_width_chars(GTK_LABEL(label), 20);
// Add the label to the item
gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_widget_set_halign(label, GTK_ALIGN_START);
gtk_list_item_set_child(item, label); gtk_list_item_set_child(item, label);
} }
@ -46,6 +52,12 @@ static void setup_filetype_item(GtkListItemFactory *factory, GtkListItem *item)
// Create label to show list item // Create label to show list item
GtkWidget *label; GtkWidget *label;
label = gtk_label_new(" "); label = gtk_label_new(" ");
// Set the mode for ellipsize
gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END);
gtk_label_set_width_chars(GTK_LABEL(label), 10);
// Add the label to the item
gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_widget_set_halign(label, GTK_ALIGN_START);
gtk_list_item_set_child(item, label); gtk_list_item_set_child(item, label);
} }
@ -98,9 +110,10 @@ static void listview_activated(GtkColumnView *view, guint position, GtkDirectory
g_object_unref(info); g_object_unref(info);
} }
GtkWidget *create_column_view(GListModel *model) GtkWidget *create_column_view(FileWindow *win)
{ {
// Create view // Create view
GListModel *model = file_window_get_column_model(win);
GtkSingleSelection *selection = gtk_single_selection_new(model); GtkSingleSelection *selection = gtk_single_selection_new(model);
GtkWidget *view = gtk_column_view_new(GTK_SELECTION_MODEL(selection)); GtkWidget *view = gtk_column_view_new(GTK_SELECTION_MODEL(selection));

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include <gtk/gtk.h> #include "FileWindow.h"
// Create column view widget // Create column view widget
GtkWidget *create_column_view(GListModel *model); GtkWidget *create_column_view(FileWindow *win);

View File

@ -13,6 +13,12 @@ static void setup_grid_item(GtkListItemFactory *factory, GtkListItem *item)
label_filetype = gtk_label_new(" "); label_filetype = gtk_label_new(" ");
label_filesize = gtk_label_new(" "); label_filesize = gtk_label_new(" ");
// Make labels support ellipsize
gtk_label_set_ellipsize(GTK_LABEL(label_filename), PANGO_ELLIPSIZE_END);
gtk_label_set_ellipsize(GTK_LABEL(label_filetype), PANGO_ELLIPSIZE_END);
gtk_label_set_ellipsize(GTK_LABEL(label_filesize), PANGO_ELLIPSIZE_END);
gtk_label_set_width_chars(GTK_LABEL(label_filename), 20);
// Pack widgets // Pack widgets
gtk_image_set_pixel_size(GTK_IMAGE(image), 48); gtk_image_set_pixel_size(GTK_IMAGE(image), 48);
gtk_box_append(GTK_BOX(under_box), image); gtk_box_append(GTK_BOX(under_box), image);
@ -63,8 +69,11 @@ static void gridview_activate(GtkGridView *view, guint position, GtkDirectoryLis
g_object_unref(info); g_object_unref(info);
} }
GtkWidget *create_grid_view(GListModel *model) GtkWidget *create_grid_view(FileWindow *win)
{ {
// Get model for grid view
GListModel *model = file_window_get_grid_model(win);
// Create factory // Create factory
GtkListItemFactory *factory = gtk_signal_list_item_factory_new(); GtkListItemFactory *factory = gtk_signal_list_item_factory_new();
g_signal_connect(factory, "setup", G_CALLBACK(setup_grid_item), NULL); g_signal_connect(factory, "setup", G_CALLBACK(setup_grid_item), NULL);

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
#include <gtk/gtk.h> #include "FileWindow.h"
GtkWidget *create_grid_view(GListModel *model); GtkWidget *create_grid_view(FileWindow *win);

View File

@ -2,12 +2,14 @@
#include "FileColumnView.h" #include "FileColumnView.h"
#include "FileGridView.h" #include "FileGridView.h"
enum SyncMode{ enum SyncMode
MODEL1_TO_2, {
MODEL2_TO_1 MODEL_COLUMN_TO_GRID,
MODEL_GRID_TO_COLUMN
}; };
enum ViewMode{ enum ViewMode
{
MODE_LIST, MODE_LIST,
MODE_GRID MODE_GRID
}; };
@ -15,7 +17,7 @@ enum ViewMode{
struct _FileWindow struct _FileWindow
{ {
GtkApplicationWindow parent_instance; GtkApplicationWindow parent_instance;
GListModel *model1, *model2; GListModel *model_column, *model_grid;
GtkWidget *column_view, *grid_view; GtkWidget *column_view, *grid_view;
GtkWidget *main_box, *btn_box; GtkWidget *main_box, *btn_box;
GtkWidget *scrolled_window_column, *scrolled_window_grid; GtkWidget *scrolled_window_column, *scrolled_window_grid;
@ -27,32 +29,62 @@ struct _FileWindow
G_DEFINE_TYPE(FileWindow, file_window, GTK_TYPE_APPLICATION_WINDOW) G_DEFINE_TYPE(FileWindow, file_window, GTK_TYPE_APPLICATION_WINDOW)
static void sync_models(gpointer model1, gpointer model2, SyncMode mode){ static GFile *file_window_get_file(FileWindow *win)
if(mode == SyncMode::MODEL1_TO_2){ {
GFile *file = NULL;
if (win->view_mode == ViewMode::MODE_LIST)
{
// In list view mode, get current directory from the model1
file = gtk_directory_list_get_file(GTK_DIRECTORY_LIST(win->model_column));
}
else
{
// In list view mode, get current directory from the model2
file = gtk_directory_list_get_file(GTK_DIRECTORY_LIST(win->model_grid));
}
return file;
}
static void sync_models(gpointer model1, gpointer model2, SyncMode mode)
{
if (mode == SyncMode::MODEL_COLUMN_TO_GRID)
{
// Set the file from model1 // Set the file from model1
GFile *file = gtk_directory_list_get_file(GTK_DIRECTORY_LIST(model1)); GFile *file = gtk_directory_list_get_file(GTK_DIRECTORY_LIST(model1));
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(model2), file); if (file)
{
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(model2), file);
}
// g_object_unref(file); // g_object_unref(file);
}else{ }
else
{
// Set the file from model2 // Set the file from model2
GFile *file = gtk_directory_list_get_file(GTK_DIRECTORY_LIST(model2)); GFile *file = gtk_directory_list_get_file(GTK_DIRECTORY_LIST(model2));
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(model1), file); if (file)
{
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(model1), file);
}
// g_object_unref(file); // g_object_unref(file);
} }
} }
static void btnview_clicked(GtkButton *button, FileWindow *win){ static void btnview_clicked(GtkButton *button, FileWindow *win)
if(win->view_mode == ViewMode::MODE_LIST){ {
if (win->view_mode == ViewMode::MODE_LIST)
{
// Sync the models // Sync the models
sync_models(win->model1, win->model2, SyncMode::MODEL1_TO_2); sync_models(win->model_column, win->model_grid, SyncMode::MODEL_COLUMN_TO_GRID);
// 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, "view-grid");
win->view_mode = ViewMode::MODE_GRID; win->view_mode = ViewMode::MODE_GRID;
}else{ }
else
{
// Sync the models // Sync the models
sync_models(win->model1, win->model2, SyncMode::MODEL2_TO_1); sync_models(win->model_column, win->model_grid, SyncMode::MODEL_GRID_TO_COLUMN);
// 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);
@ -61,16 +93,138 @@ static void btnview_clicked(GtkButton *button, FileWindow *win){
} }
} }
static void btnup_clicked(GtkWidget *widget, FileWindow *win){ static void btnup_clicked(GtkWidget *widget, FileWindow *win)
{
// Get current directory and set to the new list
GFile *file = file_window_get_file(win);
if (!g_str_equal(g_file_get_path(file), "/"))
{
GFile *file1 = g_file_get_parent(file);
// 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_grid), file1);
g_object_unref(file1);
}
else
{
GFile *file1 = g_file_new_for_path("/");
// 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_grid), file1);
g_object_unref(file1);
}
} }
static void btnnew_clicked(GtkWidget *widget, FileWindow *win){ static void btnok_clicked(GtkWidget *widget, GtkWidget *dialog)
{
// Get entry widget and the content of entry
GtkWidget *entry_new = gtk_widget_get_first_child(dialog);
const char *file_name = gtk_editable_get_text(GTK_EDITABLE(entry_new));
// Get the parent dir of file
FileWindow *win = FILE_WINDOW(gtk_window_get_transient_for(GTK_WINDOW(dialog)));
GFile *file = file_window_get_file(win);
char *parent_dir = g_file_get_path(file);
char *path = NULL;
// Create a new folder
if (parent_dir[strlen(parent_dir) - 1] != '/')
{
path = g_strdup_printf("%s/%s", parent_dir, file_name);
}
else
{
path = g_strdup_printf("%s%s", parent_dir, file_name);
}
if (g_mkdir_with_parents(path, 0755) == -1)
{
g_print("Error Occured!");
}
// g_print("%s\n", path);
g_free(parent_dir);
g_free(path);
gtk_window_destroy(GTK_WINDOW(dialog));
} }
static void btndel_clicked(GtkWidget *widget, FileWindow *win){ static void btnnew_clicked(GtkWidget *widget, FileWindow *win)
{
GtkWidget *dialog_new;
// Create the window
dialog_new = gtk_window_new();
gtk_window_set_title(GTK_WINDOW(dialog_new), "Create Folder");
gtk_window_set_transient_for(GTK_WINDOW(dialog_new), GTK_WINDOW(win));
// Add the entry and the "OK" button
GtkWidget *header, *btn_ok, *entry_new;
header = gtk_header_bar_new();
btn_ok = gtk_button_new_with_label("OK");
entry_new = gtk_entry_new();
// Link signal for "OK" button
g_signal_connect(entry_new, "activate", G_CALLBACK(btnok_clicked), dialog_new);
g_signal_connect(btn_ok, "clicked", G_CALLBACK(btnok_clicked), dialog_new);
// Add widgets to window
gtk_header_bar_pack_end(GTK_HEADER_BAR(header), btn_ok);
gtk_window_set_titlebar(GTK_WINDOW(dialog_new), header);
gtk_window_set_child(GTK_WINDOW(dialog_new), entry_new);
gtk_window_present(GTK_WINDOW(dialog_new));
}
static void btnhome_clicked(GtkWidget *widget, FileWindow *win)
{
// Set Current dir to home dir
GFile *file = g_file_new_for_path(g_get_home_dir());
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_column), file);
gtk_directory_list_set_file(GTK_DIRECTORY_LIST(win->model_grid), file);
g_object_unref(file);
}
static void btndel_clicked(GtkWidget *widget, FileWindow *win)
{
GtkWidget *error_dialog;
// Create dialog
error_dialog = gtk_window_new();
gtk_window_set_title(GTK_WINDOW(error_dialog), "Error");
gtk_window_set_transient_for(GTK_WINDOW(error_dialog), GTK_WINDOW(win));
// Add a header bar
GtkWidget *header = gtk_header_bar_new();
GtkWidget *btn_ok = gtk_button_new_with_label("OK");
gtk_header_bar_pack_end(GTK_HEADER_BAR(header), btn_ok);
gtk_window_set_titlebar(GTK_WINDOW(error_dialog), header);
g_signal_connect_swapped(btn_ok, "clicked", G_CALLBACK(gtk_window_destroy), error_dialog);
// Add a label and a icon to show error
GtkWidget *dialog_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
GtkWidget *image = gtk_image_new_from_resource("/org/gtk/daleclack/dialog-error.png");
GtkWidget *label = gtk_label_new("Failed to delete file");
gtk_image_set_pixel_size(GTK_IMAGE(image), 48);
// Add widgets to the dialog
gtk_widget_set_margin_bottom(dialog_box, 20);
gtk_widget_set_margin_end(dialog_box, 20);
gtk_widget_set_margin_start(dialog_box, 20);
gtk_widget_set_margin_top(dialog_box, 20);
gtk_box_append(GTK_BOX(dialog_box), image);
gtk_box_append(GTK_BOX(dialog_box), label);
gtk_window_set_child(GTK_WINDOW(error_dialog), dialog_box);
gtk_window_present(GTK_WINDOW(error_dialog));
}
GListModel *file_window_get_grid_model(FileWindow *self){
// Get Model for grid view
return self->model_grid;
}
GListModel *file_window_get_column_model(FileWindow *self){
// Get Model for list column view
return self->model_column;
} }
static void file_window_dispose(GObject *object) static void file_window_dispose(GObject *object)
@ -88,17 +242,17 @@ static void file_window_init(FileWindow *self)
// Create list model // Create list model
GFile *file = g_file_new_for_path(g_get_home_dir()); GFile *file = g_file_new_for_path(g_get_home_dir());
self->model1 = G_LIST_MODEL(gtk_directory_list_new( self->model_column = G_LIST_MODEL(gtk_directory_list_new(
"standard::name,standard::display-name,standard::icon,standard::size,standard::content-type", file)); "standard::name,standard::display-name,standard::icon,standard::size,standard::content-type", file));
self->model2 = G_LIST_MODEL(gtk_directory_list_new( self->model_grid = G_LIST_MODEL(gtk_directory_list_new(
"standard::name,standard::display-name,standard::icon,standard::size,standard::content-type", file)); "standard::name,standard::display-name,standard::icon,standard::size,standard::content-type", file));
// Create column view widget // Create column view widget
self->column_view = create_column_view(self->model1); self->column_view = create_column_view(self);
// Create grid view widget // Create grid view widget
self->grid_view = create_grid_view(self->model2); 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("go-up");
@ -128,6 +282,10 @@ static void file_window_init(FileWindow *self)
// Link signals // Link signals
g_signal_connect(self->btn_view, "clicked", G_CALLBACK(btnview_clicked), self); g_signal_connect(self->btn_view, "clicked", G_CALLBACK(btnview_clicked), self);
g_signal_connect(self->btn_up, "clicked", G_CALLBACK(btnup_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_new, "clicked", G_CALLBACK(btnnew_clicked), 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),

View File

@ -5,3 +5,7 @@
G_DECLARE_FINAL_TYPE(FileWindow, file_window, FILE, WINDOW, GtkApplicationWindow) G_DECLARE_FINAL_TYPE(FileWindow, file_window, FILE, WINDOW, GtkApplicationWindow)
FileWindow *file_window_new(GtkApplication *app); FileWindow *file_window_new(GtkApplication *app);
GListModel *file_window_get_grid_model(FileWindow *self);
GListModel *file_window_get_column_model(FileWindow *self);