Add finder

This commit is contained in:
daleclack 2023-06-09 23:07:25 +08:00
parent 120c788f80
commit 2051a3cc5a
4 changed files with 164 additions and 3 deletions

View File

@ -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

View File

@ -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);

View File

@ -0,0 +1,142 @@
#include "MyFinder.h"
#include <cstdio>
#include <ctime>
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));
}

View File

@ -0,0 +1,7 @@
#pragma once
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE(MyFinder, my_finder, MY, FINDER, GtkBox)
GtkWidget *my_finder_new(GtkOrientation orientation, int spacing);