Update gtk143

This commit is contained in:
daleclack 2022-11-30 13:16:42 +08:00
parent e495e65b21
commit ae1934b9ac
5 changed files with 86 additions and 34 deletions

View File

@ -26,7 +26,7 @@ link_directories (${GTKMM4_LIBRARY_DIRS})
# set(PO_DIR ${CMAKE_BINARY_DIR}/po/zh_CN/LC_MESSAGES)
#Source files
set(SOURCE_FILE src/main.cc src/MenuWin.cc src/Win1.cc src/Win2.cc)
set(SOURCE_FILE src/main.cc src/MenuWin.cc src/Win1.cc src/Win2.cc src/MenuBar.cc)
#Compile Resource

View File

@ -0,0 +1,33 @@
#include "MenuBar.hh"
MenuBar::MenuBar()
{
// Create models
builder_def = Gtk::Builder::create_from_resource("/org/gtk/daleclack/default_menu.xml");
model_default = builder_def->get_object<Gio::MenuModel>("default_menu");
builder_win1 = Gtk::Builder::create_from_resource("/org/gtk/daleclack/win1_menu.xml");
model_win1 = builder_win1->get_object<Gio::MenuModel>("win1_menu");
builder_win2 = Gtk::Builder::create_from_resource("/org/gtk/daleclack/win2_menu.xml");
model_win2 = builder_win2->get_object<Gio::MenuModel>("win2_menu");
menubar = Gtk::make_managed<Gtk::PopoverMenuBar>(model_default);
}
void MenuBar::change_menu(WinShown win_id)
{
// Switch the menu for a window
switch (win_id)
{
case WinShown::DEFAULT:
menubar->set_menu_model(model_default);
break;
case WinShown::WIN_1:
menubar->set_menu_model(model_win1);
break;
case WinShown::WIN_2:
menubar->set_menu_model(model_win2);
break;
}
}
MenuBar::~MenuBar(){
}

View File

@ -0,0 +1,24 @@
#pragma once
#include <gtkmm.h>
enum class WinShown
{
DEFAULT,
WIN_1,
WIN_2
};
class MenuBar
{
public:
MenuBar();
~MenuBar();
void change_menu(WinShown win_id);
Gtk::PopoverMenuBar *menubar;
private:
// Menu Models
Glib::RefPtr<Gtk::Builder> builder_def, builder_win1, builder_win2;
Glib::RefPtr<Gio::MenuModel> model_default, model_win1, model_win2;
};

View File

@ -16,14 +16,6 @@ MenuWin::MenuWin()
set_icon_name("org.gtk.daleclack");
set_default_size(300, 200);
// Create models
builder_def = Gtk::Builder::create_from_resource("/org/gtk/daleclack/default_menu.xml");
model_default = builder_def->get_object<Gio::MenuModel>("default_menu");
builder_win1 = Gtk::Builder::create_from_resource("/org/gtk/daleclack/win1_menu.xml");
model_win1 = builder_win1->get_object<Gio::MenuModel>("win1_menu");
builder_win2 = Gtk::Builder::create_from_resource("/org/gtk/daleclack/win2_menu.xml");
model_win2 = builder_win2->get_object<Gio::MenuModel>("win2_menu");
// Add actions
add_action("new_win1", sigc::mem_fun(*this, &MenuWin::new_win1));
add_action("quit_win1", sigc::mem_fun(*this, &MenuWin::quit_win1));
@ -31,8 +23,9 @@ MenuWin::MenuWin()
add_action("quit_win2", sigc::mem_fun(*this, &MenuWin::quit_win2));
// Add popover menu bar
menu_bar = new Gtk::PopoverMenuBar(model_default);
main_box.append(*menu_bar);
//menu_bar = new Gtk::PopoverMenuBar(model_default);
main_box.append(*(menu_bar.menubar));
// (menu_bar.menubar)->show();
// Add a label
label1.set_expand();
@ -52,6 +45,8 @@ MenuWin::MenuWin()
btn_main.signal_clicked().connect(sigc::mem_fun(*this, &MenuWin::btnmain_clicked));
btn_win1.signal_clicked().connect(sigc::mem_fun(*this, &MenuWin::btnwin1_clicked));
btn_win2.signal_clicked().connect(sigc::mem_fun(*this, &MenuWin::btnwin2_clicked));
window1.signal_close_request().connect(sigc::mem_fun(*this, &MenuWin::win1_closed),true);
window2.signal_close_request().connect(sigc::mem_fun(*this, &MenuWin::win2_closed),true);
window1.set_transient_for(*this);
window2.set_transient_for(*this);
@ -64,20 +59,20 @@ void MenuWin::btnmain_clicked()
{
window1.hide();
window2.hide();
menu_bar->set_menu_model(model_default);
menu_bar.change_menu(WinShown::DEFAULT);
}
// Launch Window1
void MenuWin::btnwin1_clicked()
{
menu_bar->set_menu_model(model_win1);
menu_bar.change_menu(WinShown::WIN_1);
window1.show();
}
// Launch Window2
void MenuWin::btnwin2_clicked()
{
menu_bar->set_menu_model(model_win2);
menu_bar.change_menu(WinShown::WIN_2);
window2.show();
}
@ -85,31 +80,40 @@ void MenuWin::btnwin2_clicked()
void MenuWin::new_win1()
{
window1.show();
menu_bar->set_menu_model(model_win1);
menu_bar.change_menu(WinShown::WIN_1);
}
// Quit a window
void MenuWin::quit_win1()
{
window1.hide();
menu_bar->set_menu_model(model_default);
menu_bar.change_menu(WinShown::DEFAULT);
}
//
bool MenuWin::win1_closed(){
window1.hide();
menu_bar.change_menu(WinShown::DEFAULT);
return true;
}
// New a window
void MenuWin::new_win2()
{
window2.show();
menu_bar->set_menu_model(model_win2);
menu_bar.change_menu(WinShown::WIN_2);
}
// Quit a window
void MenuWin::quit_win2()
{
window2.hide();
menu_bar->set_menu_model(model_default);
menu_bar.change_menu(WinShown::DEFAULT);
}
MenuWin::~MenuWin()
{
delete menu_bar;
//
bool MenuWin::win2_closed(){
window2.hide();
menu_bar.change_menu(WinShown::DEFAULT);
return true;
}

View File

@ -3,31 +3,20 @@
#include <gtkmm.h>
#include "Win1.hh"
#include "Win2.hh"
enum class WinShown
{
DEFAULT,
WIN_1,
WIN_2
};
#include "MenuBar.hh"
class MenuWin : public Gtk::ApplicationWindow
{
public:
MenuWin();
~MenuWin();
private:
// Child Widgets
Gtk::PopoverMenuBar *menu_bar;
MenuBar menu_bar;
Gtk::Box main_box, btn_box;
Gtk::Button btn_main, btn_win1, btn_win2;
Gtk::Label label1;
// Menu Models
Glib::RefPtr<Gtk::Builder> builder_def, builder_win1, builder_win2;
Glib::RefPtr<Gio::MenuModel> model_default, model_win1, model_win2;
// Windows
Win1 window1;
Win2 window2;
@ -38,6 +27,8 @@ private:
void btnwin2_clicked();
void new_win1();
void quit_win1();
bool win1_closed();
void new_win2();
void quit_win2();
bool win2_closed();
};