diff --git a/Gtk4_Reset/CMakeLists.txt b/Gtk4_Reset/CMakeLists.txt index 6666d69..f115d5a 100644 --- a/Gtk4_Reset/CMakeLists.txt +++ b/Gtk4_Reset/CMakeLists.txt @@ -24,7 +24,7 @@ include_directories (${GTK_INCLUDE_DIRS}) link_directories (${GTK_LIBRARY_DIRS}) set(SOURCES src/core/main.cpp src/core/MainWin.cpp src/core/MyStack.cpp - src/ui/MyDock.cpp) + src/ui/MyDock.cpp src/ui/MyFinder.cpp) #Compile resources with GCR_CMake diff --git a/Gtk4_Reset/src/ui/MyDock.cpp b/Gtk4_Reset/src/ui/MyDock.cpp index 15ff9d4..408885c 100644 --- a/Gtk4_Reset/src/ui/MyDock.cpp +++ b/Gtk4_Reset/src/ui/MyDock.cpp @@ -1,4 +1,5 @@ #include "MyDock.h" +#include "MyFinder.h" void add_dock(GtkWidget *main_page1) { @@ -8,6 +9,7 @@ void add_dock(GtkWidget *main_page1) // Get widgets GtkWidget *dock_box = GTK_WIDGET(gtk_builder_get_object(dock_builder, "dock_box")); GtkWidget *main_box = GTK_WIDGET(gtk_builder_get_object(dock_builder, "main_box")); + GtkWidget *finder_box = GTK_WIDGET(gtk_builder_get_object(dock_builder, "finder_box")); GtkWidget *dock_left = GTK_WIDGET(gtk_builder_get_object(dock_builder, "dock_left")); GtkWidget *icons_sw = GTK_WIDGET(gtk_builder_get_object(dock_builder, "icons_sw")); @@ -21,9 +23,19 @@ void add_dock(GtkWidget *main_page1) g_object_unref(pixbuf); g_object_unref(sized); + // Add finder + GtkWidget *finder = my_finder_new(GTK_ORIENTATION_HORIZONTAL, 5); + gtk_box_append(GTK_BOX(finder_box), finder); + // Pack widgets - gtk_widget_set_size_request(icons_sw, -1, 300); - gtk_box_append(GTK_BOX(dock_left), dock_box); // Dock position, will be changable soon + + // Dock position and mode, will be changable soon + gtk_widget_set_vexpand(icons_sw, TRUE); + gtk_widget_set_valign(icons_sw, GTK_ALIGN_FILL); + gtk_widget_set_valign(dock_box, GTK_ALIGN_FILL); + gtk_box_append(GTK_BOX(dock_left), dock_box); + + // Others gtk_overlay_set_child(GTK_OVERLAY(main_overlay), main_pic); gtk_overlay_add_overlay(GTK_OVERLAY(main_overlay), main_box); gtk_box_append(GTK_BOX(main_page1), main_overlay); diff --git a/Gtk4_Reset/src/ui/MyFinder.cpp b/Gtk4_Reset/src/ui/MyFinder.cpp new file mode 100644 index 0000000..3637488 --- /dev/null +++ b/Gtk4_Reset/src/ui/MyFinder.cpp @@ -0,0 +1,142 @@ +#include "MyFinder.h" +#include +#include + +struct _MyFinder +{ + GtkBox parent_instance; + GtkWidget *btn_icon, *btntitle, *btnfile, *btnedit, + *btnshow, *btngoto, *btnwin, *btnhelp; + GtkWidget *label_title, *labelfile, *labeledit, *labelshow, + *labelgoto, *labelwin, *labelhelp, *time_label; + GtkWidget *separator; + GtkWidget *time_button, *time_popover, *calendar; + GtkWidget *find_button, *menu_button, *battery_button, + *network_button, *screen_button, *audio_button; +}; + +G_DEFINE_TYPE(MyFinder, my_finder, GTK_TYPE_BOX) + +static void get_menu(GtkBuilder *builder, const char *id, GtkWidget *menu_button) +{ + // Initalize Menu button + gtk_menu_button_set_has_frame(GTK_MENU_BUTTON(menu_button), FALSE); + + // Get Menu model and initalize the popover relate to the menubutton + GMenuModel *menu_model = G_MENU_MODEL(gtk_builder_get_object(builder, id)); + gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(menu_button), menu_model); + + // Make the menu has no arrow and pack the start + GtkPopover *popover = gtk_menu_button_get_popover(GTK_MENU_BUTTON(menu_button)); + gtk_popover_set_has_arrow(popover, FALSE); + gtk_widget_set_halign(GTK_WIDGET(popover), GTK_ALIGN_START); +} + +static gboolean timeout_func(gpointer data) +{ + // Get Localtime + time_t t; + t = time(NULL); + struct tm *local; + local = localtime(&t); + char time_data[57]; + snprintf(time_data, sizeof(time_data), "%d/%d/%d %d:%d:%d", local->tm_year + 1900, + local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); + gtk_label_set_label(GTK_LABEL(data), time_data); + return TRUE; +} + +static void my_finder_init(MyFinder *self) +{ + // Create widgets + self->btn_icon = gtk_menu_button_new(); + self->btntitle = gtk_menu_button_new(); + self->btnfile = gtk_menu_button_new(); + self->btnedit = gtk_menu_button_new(); + self->btnshow = gtk_menu_button_new(); + self->btngoto = gtk_menu_button_new(); + self->btnwin = gtk_menu_button_new(); + self->btnhelp = gtk_menu_button_new(); + self->time_button = gtk_menu_button_new(); + self->label_title = gtk_label_new("My Gtk UI"); + self->labelfile = gtk_label_new("File"); + self->labeledit = gtk_label_new("Edit"); + self->labelshow = gtk_label_new("Show"); + self->labelgoto = gtk_label_new("Go to"); + self->labelwin = gtk_label_new("Windows"); + self->labelhelp = gtk_label_new("Help"); + self->time_label = gtk_label_new("2023/6/9 22:29:00"); + self->separator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); + self->find_button = gtk_button_new_from_icon_name("finder-find"); + self->screen_button = gtk_button_new_from_icon_name("finder-computer"); + self->battery_button = gtk_button_new_from_icon_name("finder-battery"); + self->audio_button = gtk_button_new_from_icon_name("finder_audio"); + self->network_button = gtk_button_new_from_icon_name("finder-wifi"); + self->menu_button = gtk_button_new_from_icon_name("open-menu"); + gtk_menu_button_set_icon_name(GTK_MENU_BUTTON(self->btn_icon), "My_GtkUI"); + gtk_button_set_has_frame(GTK_BUTTON(self->find_button), FALSE); + gtk_button_set_has_frame(GTK_BUTTON(self->screen_button), FALSE); + gtk_button_set_has_frame(GTK_BUTTON(self->battery_button), FALSE); + gtk_button_set_has_frame(GTK_BUTTON(self->audio_button), FALSE); + gtk_button_set_has_frame(GTK_BUTTON(self->network_button), FALSE); + gtk_button_set_has_frame(GTK_BUTTON(self->menu_button), FALSE); + gtk_button_set_has_frame(GTK_BUTTON(self->time_button), FALSE); + + // Add labels to the menu button + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->btntitle), self->label_title); + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->btnfile), self->labelfile); + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->btnedit), self->labeledit); + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->btnshow), self->labelshow); + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->btngoto), self->labelgoto); + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->btnwin), self->labelwin); + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->btnhelp), self->labelhelp); + gtk_menu_button_set_child(GTK_MENU_BUTTON(self->time_button), self->time_label); + + // Create GtkBuilder for menu + GtkBuilder *menu_builder = gtk_builder_new_from_resource("/org/gtk/daleclack/menubar.xml"); + get_menu(menu_builder, "main_menu", self->btn_icon); + get_menu(menu_builder, "title_menu", self->btntitle); + get_menu(menu_builder, "menu_file", self->btnfile); + get_menu(menu_builder, "menu_edit", self->btnedit); + get_menu(menu_builder, "menu_show", self->btnshow); + get_menu(menu_builder, "menu_goto", self->btngoto); + get_menu(menu_builder, "menu_win", self->btnwin); + get_menu(menu_builder, "menu_help", self->btnhelp); + + // Create timer + g_timeout_add(1000, timeout_func, self->time_label); + self->time_popover = gtk_popover_new(); + self->calendar = gtk_calendar_new(); + gtk_popover_set_child(GTK_POPOVER(self->time_popover), self->calendar); + gtk_menu_button_set_popover(GTK_MENU_BUTTON(self->time_button), + self->time_popover); + + // Pack widgets + gtk_widget_set_hexpand(self->separator, TRUE); + gtk_box_append(GTK_BOX(self), self->btn_icon); + gtk_box_append(GTK_BOX(self), self->btntitle); + gtk_box_append(GTK_BOX(self), self->btnfile); + gtk_box_append(GTK_BOX(self), self->btnedit); + gtk_box_append(GTK_BOX(self), self->btnshow); + gtk_box_append(GTK_BOX(self), self->btngoto); + gtk_box_append(GTK_BOX(self), self->btnwin); + gtk_box_append(GTK_BOX(self), self->btnhelp); + gtk_box_append(GTK_BOX(self), self->separator); + gtk_box_append(GTK_BOX(self), self->screen_button); + gtk_box_append(GTK_BOX(self), self->audio_button); + gtk_box_append(GTK_BOX(self), self->network_button); + gtk_box_append(GTK_BOX(self), self->battery_button); + gtk_box_append(GTK_BOX(self), self->time_button); + gtk_box_append(GTK_BOX(self), self->find_button); + gtk_box_append(GTK_BOX(self), self->menu_button); +} + +static void my_finder_class_init(MyFinderClass *klass) +{ +} + +GtkWidget *my_finder_new(GtkOrientation orientation, int spacing) +{ + return GTK_WIDGET(g_object_new(my_finder_get_type(), + "orientation", orientation, "spacing", spacing, NULL)); +} diff --git a/Gtk4_Reset/src/ui/MyFinder.h b/Gtk4_Reset/src/ui/MyFinder.h new file mode 100644 index 0000000..450a366 --- /dev/null +++ b/Gtk4_Reset/src/ui/MyFinder.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +G_DECLARE_FINAL_TYPE(MyFinder, my_finder, MY, FINDER, GtkBox) + +GtkWidget *my_finder_new(GtkOrientation orientation, int spacing);