From 0d26ccd7bc2070e38446b60f09f9ce23249b5ead Mon Sep 17 00:00:00 2001 From: daleclack Date: Thu, 30 Dec 2021 22:33:24 +0800 Subject: [PATCH] Add MenuBar --- Flos_Gtk4/.vscode/settings.json | 3 ++ Flos_Gtk4/CMakeLists.txt | 6 ++-- Flos_Gtk4/res/menubar.xml | 23 ++++++++++++++ Flos_Gtk4/src/core/MainWin.cpp | 53 +++++++++++++++++++++++++++++++++ Flos_Gtk4/src/core/MainWin.h | 7 +++++ Flos_Gtk4/src/core/main.cpp | 15 ++++++++-- 6 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 Flos_Gtk4/.vscode/settings.json create mode 100644 Flos_Gtk4/res/menubar.xml diff --git a/Flos_Gtk4/.vscode/settings.json b/Flos_Gtk4/.vscode/settings.json new file mode 100644 index 0000000..b4d8c35 --- /dev/null +++ b/Flos_Gtk4/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools" +} \ No newline at end of file diff --git a/Flos_Gtk4/CMakeLists.txt b/Flos_Gtk4/CMakeLists.txt index 216e890..bfcb764 100644 --- a/Flos_Gtk4/CMakeLists.txt +++ b/Flos_Gtk4/CMakeLists.txt @@ -1,6 +1,6 @@ set(CMAKE_CXX_STANDARD 17) cmake_minimum_required(VERSION 3.0.0) -project(gtk120 VERSION 1.0.0) +project(My_GtkUI_Flos VERSION 4.0.0) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../GCR_CMake/macros) include(GlibCompileResourcesSupport) @@ -14,6 +14,7 @@ set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack) include_directories(.) include_directories(..) +include_directories(src/core) find_package (PkgConfig REQUIRED) pkg_check_modules (GTK4 REQUIRED gtk4) @@ -23,7 +24,8 @@ link_directories (${GTK4_LIBRARY_DIRS}) #Compile Resource set(RESOURCE_LIST - flos.png) + flos.png + menubar.xml) compile_gresources(RESOURCE_FILE XML_OUT diff --git a/Flos_Gtk4/res/menubar.xml b/Flos_Gtk4/res/menubar.xml new file mode 100644 index 0000000..6c6eec6 --- /dev/null +++ b/Flos_Gtk4/res/menubar.xml @@ -0,0 +1,23 @@ + + + + + File + + + Edit + + + Show + + + Go to + + + windows + + + Help + + + \ No newline at end of file diff --git a/Flos_Gtk4/src/core/MainWin.cpp b/Flos_Gtk4/src/core/MainWin.cpp index e69de29..fb7bbba 100644 --- a/Flos_Gtk4/src/core/MainWin.cpp +++ b/Flos_Gtk4/src/core/MainWin.cpp @@ -0,0 +1,53 @@ +#include "MainWin.h" + +struct _MainWin{ + GtkApplicationWindow parent_instance; + GtkWidget * overlay; + GtkWidget * background; +}; + +G_DEFINE_TYPE(MainWin,main_win,GTK_TYPE_APPLICATION_WINDOW) + +static void main_win_init(MainWin * win){ + //Initalize window + gtk_window_set_title(GTK_WINDOW(win),"My GtkUI Flos Version"); + gtk_window_set_default_size(GTK_WINDOW(win),800,450); + gtk_window_set_icon_name(GTK_WINDOW(win),"org.gtk.daleclack"); + + //Create widgets + win->overlay = gtk_overlay_new(); + win->background = gtk_picture_new(); + + //Add Background + GdkPixbuf * pixbuf = gdk_pixbuf_new_from_resource("/org/gtk/daleclack/flos.png",NULL); + GdkPixbuf * sized = gdk_pixbuf_scale_simple(pixbuf,800,450,GDK_INTERP_BILINEAR); + gtk_picture_set_pixbuf(GTK_PICTURE(win->background),sized); + g_object_unref(pixbuf); + g_object_unref(sized); + + //Add button for menubar + GtkWidget * back_button = gtk_button_new_with_label(" "); + gtk_widget_set_valign(back_button,GTK_ALIGN_START); + gtk_widget_set_halign(back_button,GTK_ALIGN_FILL); + gtk_widget_set_sensitive(back_button,FALSE); + gtk_widget_set_opacity(back_button,0.7); + gtk_overlay_add_overlay(GTK_OVERLAY(win->overlay),back_button); + + //Add MenuBar + GtkBuilder * builder = gtk_builder_new_from_resource("/org/gtk/daleclack/menubar.xml"); + GMenuModel * model = G_MENU_MODEL(gtk_builder_get_object(builder,"model")); + GtkWidget * menubar = gtk_popover_menu_bar_new_from_model(model); + gtk_widget_set_valign(menubar,GTK_ALIGN_START); + gtk_widget_set_halign(menubar,GTK_ALIGN_FILL); + gtk_overlay_add_overlay(GTK_OVERLAY(win->overlay),menubar); + + //Add widgets + gtk_overlay_set_child(GTK_OVERLAY(win->overlay),win->background); + gtk_window_set_child(GTK_WINDOW(win),win->overlay); +} + +static void main_win_class_init(MainWinClass * klass){} + +MainWin * main_win_new(GtkApplication * app){ + return (MainWin*)g_object_new(main_win_get_type(),"application",app,NULL); +} \ No newline at end of file diff --git a/Flos_Gtk4/src/core/MainWin.h b/Flos_Gtk4/src/core/MainWin.h index e69de29..02b7ec1 100644 --- a/Flos_Gtk4/src/core/MainWin.h +++ b/Flos_Gtk4/src/core/MainWin.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +G_DECLARE_FINAL_TYPE(MainWin,main_win,MAIN,WIN,GtkApplicationWindow) + +MainWin * main_win_new(GtkApplication * app); diff --git a/Flos_Gtk4/src/core/main.cpp b/Flos_Gtk4/src/core/main.cpp index e6248eb..bf9aeaf 100644 --- a/Flos_Gtk4/src/core/main.cpp +++ b/Flos_Gtk4/src/core/main.cpp @@ -1,5 +1,16 @@ -#include +#include "MainWin.h" + +static void gtkmain(GtkApplication * app,gpointer user_data){ + //Create a window and show + MainWin * window; + window = main_win_new(app); + gtk_widget_show(GTK_WIDGET(window)); +} int main(int argc, char ** argv){ - + //Create a new application and run + GtkApplication * app; + app = gtk_application_new("org.gtk.daleclack",G_APPLICATION_NON_UNIQUE); + g_signal_connect(app,"activate",G_CALLBACK(gtkmain),NULL); + return g_application_run(G_APPLICATION(app),argc,argv); } \ No newline at end of file