Add Menu for gtk119

This commit is contained in:
daleclack 2021-12-28 16:38:56 +08:00
parent 26a856eb58
commit e351ae0d5c
5 changed files with 90 additions and 24 deletions

View File

@ -1,6 +1,6 @@
set(CMAKE_CXX_STANDARD 17)
cmake_minimum_required(VERSION 3.0.0)
project(gtk117 VERSION 1.0.0)
project(gtk119 VERSION 1.0.0)
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../GCR_CMake/macros)
include(GlibCompileResourcesSupport)
@ -22,23 +22,19 @@ link_directories (${GTKMM3_LIBRARY_DIRS})
#Compile Resource
# set(RESOURCE_LIST
# gnome-fs-directory.png
# gnome-fs-regular.png
# icons/24x24/actions/view-grid-symbolic.png
# icons/24x24/actions/view-list-symbolic.png
# icons/48x48/actions/dialog-error.png)
set(RESOURCE_LIST
appmenu.xml)
# compile_gresources(RESOURCE_FILE
# XML_OUT
# TYPE EMBED_C
# RESOURCES ${RESOURCE_LIST}
# PREFIX "/org/gtk/daleclack"
# SOURCE_DIR ${PROJECT_SOURCE_DIR}/../default_res)
compile_gresources(RESOURCE_FILE
XML_OUT
TYPE EMBED_C
RESOURCES ${RESOURCE_LIST}
PREFIX "/org/gtk/daleclack"
SOURCE_DIR ${PROJECT_SOURCE_DIR}/res)
# Add a custom target to the makefile. Now make builds our 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
if(WIN32)
@ -47,9 +43,9 @@ if(WIN32)
set_property(SOURCE ../icon.rc APPEND PROPERTY
OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/../icon.ico
)
add_executable(${PROJECT_NAME} WIN32 ${app_WINRC} src/main.cc src/MyWin.cc src/MyImage.cc)
add_executable(${PROJECT_NAME} WIN32 ${app_WINRC} src/main.cc src/MyWin.cc src/MyImage.cc ${RESOURCE_FILE})
else()
add_executable(${PROJECT_NAME} src/main.cc src/MyWin.cc src/MyImage.cc)
add_executable(${PROJECT_NAME} src/main.cc src/MyWin.cc src/MyImage.cc ${RESOURCE_FILE})
endif(WIN32)

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="model">
<item>
<attribute name="label">Zoom Out</attribute>
<attribute name="action">win.zoom_out</attribute>
</item>
<item>
<attribute name="label">Zoom In</attribute>
<attribute name="action">win.zoom_in</attribute>
</item>
<item>
<attribute name="label">11</attribute>
<attribute name="action">win.zoom_reset</attribute>
</item>
</menu>
</interface>

View File

@ -31,6 +31,14 @@ bool MyImage::on_draw(const Cairo::RefPtr<Cairo::Context> &cr)
void MyImage::scale_draw(double scale)
{
// Set the scale radio and scale
if(scale <= 0){
scale_radio = 0.1;
return;
}
if(scale > 10.0){
scale_radio = 10.0;
return;
}
scale_radio = scale;
queue_draw();
}

View File

@ -26,13 +26,28 @@ MyWin::MyWin()
main_box.pack_start(btnbox, Gtk::PACK_SHRINK);
btnopen.signal_clicked().connect(sigc::mem_fun(*this, &MyWin::btnopen_clicked));
// Add Gesture
// Add Drag Gesture
gesture_drag = Gtk::GestureDrag::create(image_area);
gesture_drag->set_button(GDK_BUTTON_PRIMARY);
// gesture_drag->signal_drag_begin().connect(sigc::mem_fun(*this,&MyWin::drag_begin));
gesture_drag->signal_drag_update().connect(sigc::mem_fun(*this, &MyWin::drag_update));
gesture_drag->signal_drag_end().connect(sigc::mem_fun(*this, &MyWin::drag_end));
gesture_click = Gtk::GestureMultiPress::create(image_area);
gesture_click->set_button(GDK_BUTTON_SECONDARY);
gesture_click->signal_pressed().connect(sigc::mem_fun(*this,&MyWin::press));
// Add Menu
auto builder = Gtk::Builder::create_from_resource("/org/gtk/daleclack/appmenu.xml");
auto object = builder->get_object("model");
auto gmenu = Glib::RefPtr<Gio::MenuModel>::cast_dynamic(object);
popover.bind_model(gmenu);
popover.set_relative_to(image_area);
// Add actions for menu
add_action("zoom_in", sigc::mem_fun(*this, &MyWin::image_zoom_in));
add_action("zoom_out", sigc::mem_fun(*this, &MyWin::image_zoom_out));
add_action("zoom_reset", sigc::mem_fun(*this, &MyWin::image_zoom_reset));
overlay.add(main_box);
add(overlay);
show_all_children();
@ -73,15 +88,16 @@ void MyWin::dialog_response(int response_id)
void MyWin::scale_changed()
{
// Get Value of scale widget and scale image
double value = scale.get_value();
g_print("%f\n", value);
// g_print("%f\n", value);
image_area.scale_draw(value);
}
void MyWin::drag_begin(double x, double y)
{
// g_print("drag begins\n");
// move_to(x,y);
void MyWin::press(int n_press,double x,double y){
// Set Popover to the position of mouse and show
popover.set_pointing_to(Gdk::Rectangle(x,y,1,1));
popover.popup();
}
void MyWin::drag_update(double x, double y)
@ -129,3 +145,25 @@ void MyWin::move_to(double x, double y)
hadjustment->set_value(h_value);
vadjustment->set_value(v_value);
}
void MyWin::image_zoom_in(){
// Scale 0.1 More
double value = scale.get_value();
value+=0.1;
scale.set_value(value);
image_area.scale_draw(value);
}
void MyWin::image_zoom_out(){
// Scale 0.1 Less
double value = scale.get_value();
value-=0.1;
scale.set_value(value);
image_area.scale_draw(value);
}
void MyWin::image_zoom_reset(){
// Scale as 1:1
scale.set_value(1.0);
image_area.scale_draw(1.0);
}

View File

@ -3,7 +3,7 @@
#include <gtkmm.h>
#include "MyImage.hh"
class MyWin : public Gtk::Window{
class MyWin : public Gtk::ApplicationWindow{
public:
MyWin();
private:
@ -24,9 +24,16 @@ class MyWin : public Gtk::Window{
void drag_update(double x,double y);
void drag_end(double x,double y);
void move_to(double x,double y);
//Menu for image control
Gtk::PopoverMenu popover;
void press(int n_press,double x,double y);
//Signal Handlers
void btnopen_clicked();
void dialog_response(int response_id);
void scale_changed();
void image_zoom_in();
void image_zoom_out();
void image_zoom_reset();
};