Add gtk133
This commit is contained in:
parent
0a5e1b1050
commit
20c06e5f66
|
@ -1,6 +1,6 @@
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
cmake_minimum_required(VERSION 3.0.0)
|
cmake_minimum_required(VERSION 3.0.0)
|
||||||
project(gtk131_calc2 VERSION 1.0.0)
|
project(gtk132_editor2 VERSION 1.0.0)
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../GCR_CMake/macros)
|
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../GCR_CMake/macros)
|
||||||
include(GlibCompileResourcesSupport)
|
include(GlibCompileResourcesSupport)
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
|
cmake_minimum_required(VERSION 3.0.0)
|
||||||
|
project(gtk133_editor3 VERSION 1.0.0)
|
||||||
|
|
||||||
|
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../GCR_CMake/macros)
|
||||||
|
include(GlibCompileResourcesSupport)
|
||||||
|
|
||||||
|
include(CTest)
|
||||||
|
enable_testing()
|
||||||
|
|
||||||
|
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
|
||||||
|
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
|
||||||
|
|
||||||
|
include(CPack)
|
||||||
|
include_directories(.)
|
||||||
|
include_directories(..)
|
||||||
|
|
||||||
|
#Find PkgConfig to use gtkmm3
|
||||||
|
find_package (PkgConfig REQUIRED)
|
||||||
|
pkg_check_modules (GTKMM3 REQUIRED gtkmm-3.0)
|
||||||
|
include_directories (${GTKMM3_INCLUDE_DIRS})
|
||||||
|
link_directories (${GTKMM3_LIBRARY_DIRS})
|
||||||
|
|
||||||
|
#Find Gettext
|
||||||
|
find_package (Gettext REQUIRED)
|
||||||
|
set(PO_DIR ${CMAKE_BINARY_DIR}/po/zh_CN/LC_MESSAGES)
|
||||||
|
|
||||||
|
#Source files
|
||||||
|
set(SOURCE_FILE src/main.cc src/TextEditor.cc)
|
||||||
|
|
||||||
|
#Compile Resource
|
||||||
|
|
||||||
|
set(RESOURCE_LIST
|
||||||
|
searchbar.ui
|
||||||
|
text_menu.xml)
|
||||||
|
|
||||||
|
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})
|
||||||
|
|
||||||
|
#For win32 platform,use rc resource and .ico icon
|
||||||
|
if(WIN32)
|
||||||
|
SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
|
||||||
|
set(app_WINRC ../icon.rc)
|
||||||
|
set_property(SOURCE ../icon.rc APPEND PROPERTY
|
||||||
|
OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/../icon.ico
|
||||||
|
)
|
||||||
|
add_executable(${PROJECT_NAME} WIN32 ${app_WINRC} ${SOURCE_FILE} ${RESOURCE_FILE})
|
||||||
|
add_custom_command( TARGET ${PROJECT_NAME}
|
||||||
|
COMMAND echo * > ${CMAKE_BINARY_DIR}/.gitignore
|
||||||
|
COMMAND echo **/* > ${CMAKE_BINARY_DIR}/.hgignore)
|
||||||
|
else()
|
||||||
|
add_executable(${PROJECT_NAME} ${SOURCE_FILE} ${RESOURCE_FILE})
|
||||||
|
add_custom_command( TARGET ${PROJECT_NAME}
|
||||||
|
COMMAND echo \"*\" > ${CMAKE_BINARY_DIR}/.gitignore
|
||||||
|
COMMAND echo \"**/*\" > ${CMAKE_BINARY_DIR}/.hgignore)
|
||||||
|
endif(WIN32)
|
||||||
|
|
||||||
|
#Add command to generate .gitignore and .mo files
|
||||||
|
# add_custom_command( TARGET ${PROJECT_NAME}
|
||||||
|
# COMMAND mkdir -p ${PO_DIR}
|
||||||
|
# COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ${CMAKE_SOURCE_DIR}/po/zh_CN.po -o ${PO_DIR}/${PROJECT_NAME}.mo)
|
||||||
|
|
||||||
|
SET (CMAKE_EXTRA_CXX_FLAGS ${GTKMM3_CFLAGS_OTHER})
|
||||||
|
target_link_libraries (${PROJECT_NAME} ${GTKMM3_LIBRARIES} -lpthread)
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- Generated with glade 3.38.2 -->
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="3.24"/>
|
||||||
|
<object class="GtkBox" id="search_box">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSearchBar" id="searchbar">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSearchEntry" id="searchentry">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="primary-icon-name">edit-find-symbolic</property>
|
||||||
|
<property name="primary-icon-activatable">False</property>
|
||||||
|
<property name="primary-icon-sensitive">False</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</interface>
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<interface>
|
||||||
|
<menu id="text_menu">
|
||||||
|
<section>
|
||||||
|
<item>
|
||||||
|
<attribute name="label">Open</attribute>
|
||||||
|
<attribute name="action">win.text_open</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label">Save As</attribute>
|
||||||
|
<attribute name="action">win.text_save</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label">Copy</attribute>
|
||||||
|
<attribute name="action">win.text_copy</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label">Paste</attribute>
|
||||||
|
<attribute name="action">win.text_paste</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label">Clear</attribute>
|
||||||
|
<attribute name="action">win.text_clear</attribute>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<attribute name="label">About</attribute>
|
||||||
|
<attribute name="action">win.text_about</attribute>
|
||||||
|
</item>
|
||||||
|
</section>
|
||||||
|
</menu>
|
||||||
|
</interface>
|
|
@ -0,0 +1,207 @@
|
||||||
|
#include "TextEditor.hh"
|
||||||
|
#include "text_types.hh"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
// Only for build in this repository
|
||||||
|
#define text_globs supported_globs
|
||||||
|
|
||||||
|
TextEditor::TextEditor()
|
||||||
|
:vbox(Gtk::ORIENTATION_VERTICAL,5),
|
||||||
|
hbox(Gtk::ORIENTATION_HORIZONTAL,5)
|
||||||
|
{
|
||||||
|
//Initalize Window
|
||||||
|
set_default_size(800,450);
|
||||||
|
set_icon_name("my_textedit");
|
||||||
|
|
||||||
|
//Initalize HeaderBar
|
||||||
|
header.set_decoration_layout("close,minimize,maximize:menu");
|
||||||
|
header.set_show_close_button();
|
||||||
|
menubtn.set_image_from_icon_name("open-menu");
|
||||||
|
search_button.set_image_from_icon_name("find");
|
||||||
|
header.pack_end(menubtn);
|
||||||
|
header.pack_end(search_button);
|
||||||
|
header.set_title("Simple Text Editor");
|
||||||
|
set_titlebar(header);
|
||||||
|
|
||||||
|
//Add a menu
|
||||||
|
menu_builder = Gtk::Builder::create_from_resource("/org/gtk/daleclack/text_menu.xml");
|
||||||
|
auto object = menu_builder->get_object("text_menu");
|
||||||
|
auto gmenu = Glib::RefPtr<Gio::Menu>::cast_dynamic(object);
|
||||||
|
popover.bind_model(gmenu);
|
||||||
|
menubtn.set_popover(popover);
|
||||||
|
|
||||||
|
//Initalize Text Buffers
|
||||||
|
buffer1=textview1.get_buffer();
|
||||||
|
buffer1->signal_changed().connect(sigc::mem_fun(*this,&TextEditor::buffer1_changed));
|
||||||
|
|
||||||
|
//Pack Widgets
|
||||||
|
sw1.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC);
|
||||||
|
sw1.add(textview1);
|
||||||
|
hbox.pack_start(sw1);
|
||||||
|
|
||||||
|
//Add actions and signal handlers
|
||||||
|
add_action("text_open",sigc::mem_fun(*this,&TextEditor::btnopen_clicked));
|
||||||
|
add_action("text_save",sigc::mem_fun(*this,&TextEditor::btnsave_clicked));
|
||||||
|
add_action("text_copy",sigc::mem_fun(*this,&TextEditor::btncopy_clicked));
|
||||||
|
add_action("text_paste",sigc::mem_fun(*this,&TextEditor::btnpaste_clicked));
|
||||||
|
add_action("text_clear",sigc::mem_fun(*this,&TextEditor::btnclear_clicked));
|
||||||
|
|
||||||
|
//Add searchbar
|
||||||
|
searchbar_builder = Gtk::Builder::create_from_resource("/org/gtk/daleclack/searchbar.ui");
|
||||||
|
searchbar_builder->get_widget("searchbar",searchbar);
|
||||||
|
searchbar_builder->get_widget("searchentry",search_entry);
|
||||||
|
searchbar_builder->get_widget("search_box",searchbox);
|
||||||
|
Glib::Binding::bind_property(search_button.property_active(),
|
||||||
|
searchbar->property_search_mode_enabled(),
|
||||||
|
Glib::BINDING_BIDIRECTIONAL);
|
||||||
|
vbox.pack_start(*searchbox);
|
||||||
|
|
||||||
|
//A InfoBar
|
||||||
|
infobar.add_button("OK",Gtk::RESPONSE_OK);
|
||||||
|
infobar.signal_response().connect(sigc::mem_fun(*this,&TextEditor::infobar_response));
|
||||||
|
infobox=dynamic_cast<Gtk::Box*>(infobar.get_content_area());
|
||||||
|
infobox->pack_start(label1);
|
||||||
|
vbox.pack_start(infobar,Gtk::PACK_SHRINK);
|
||||||
|
|
||||||
|
//Show everything
|
||||||
|
vbox.pack_start(hbox);
|
||||||
|
add(vbox);
|
||||||
|
show_all_children();
|
||||||
|
infobar.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::btnopen_clicked(){
|
||||||
|
//Create a dialog
|
||||||
|
dialog=Gtk::FileChooserNative::create("Open a text file",*this,
|
||||||
|
Gtk::FILE_CHOOSER_ACTION_OPEN,"OK","Cancel");
|
||||||
|
|
||||||
|
dialog->signal_response().connect(sigc::mem_fun(*this,&TextEditor::opendialog_response));
|
||||||
|
|
||||||
|
//Add Filters
|
||||||
|
auto filter=Gtk::FileFilter::create();
|
||||||
|
filter->set_name("Text Files");
|
||||||
|
if(mimetype_supported()){
|
||||||
|
filter->add_mime_type("text/*");
|
||||||
|
}else{
|
||||||
|
for(int i = 0; text_globs != NULL && text_globs[i] != NULL; i++){
|
||||||
|
const char *glob = text_globs[i];
|
||||||
|
filter->add_pattern(glob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialog->add_filter(filter);
|
||||||
|
|
||||||
|
auto filter_any=Gtk::FileFilter::create();
|
||||||
|
filter_any->set_name("Any Files");
|
||||||
|
filter_any->add_pattern("*");
|
||||||
|
dialog->add_filter(filter_any);
|
||||||
|
|
||||||
|
dialog->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::opendialog_response(int response){
|
||||||
|
if(response==Gtk::RESPONSE_ACCEPT){
|
||||||
|
//Load Contents of a file
|
||||||
|
auto file=dialog->get_file();
|
||||||
|
char * contents;
|
||||||
|
gsize length;
|
||||||
|
if(file->load_contents(contents,length)){
|
||||||
|
buffer1->set_text(contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialog.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::btnsave_clicked(){
|
||||||
|
//Create a dialog
|
||||||
|
dialog=Gtk::FileChooserNative::create("Save file",*this,
|
||||||
|
Gtk::FILE_CHOOSER_ACTION_SAVE,"OK","Cancel");
|
||||||
|
|
||||||
|
dialog->signal_response().connect(sigc::mem_fun(*this,&TextEditor::savedialog_response));
|
||||||
|
|
||||||
|
//Add Filters
|
||||||
|
auto filter=Gtk::FileFilter::create();
|
||||||
|
filter->set_name("Text Files");
|
||||||
|
if(mimetype_supported()){
|
||||||
|
filter->add_mime_type("text/*");
|
||||||
|
}else{
|
||||||
|
for(int i = 0; text_globs != NULL && text_globs[i] != NULL; i++){
|
||||||
|
const char *glob = text_globs[i];
|
||||||
|
filter->add_pattern(glob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialog->add_filter(filter);
|
||||||
|
|
||||||
|
auto filter_any=Gtk::FileFilter::create();
|
||||||
|
filter_any->set_name("Any Files");
|
||||||
|
filter_any->add_pattern("*");
|
||||||
|
dialog->add_filter(filter_any);
|
||||||
|
|
||||||
|
dialog->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::savedialog_response(int response){
|
||||||
|
if(response==Gtk::RESPONSE_ACCEPT){
|
||||||
|
//Get Filename
|
||||||
|
auto file=dialog->get_file();
|
||||||
|
std::string filename=file->get_path();
|
||||||
|
//Get Text
|
||||||
|
Glib::ustring text;
|
||||||
|
text=buffer1->get_text();
|
||||||
|
//Save to a file
|
||||||
|
std::ofstream outfile;
|
||||||
|
outfile.open(filename,std::ios_base::out);
|
||||||
|
outfile<<text;
|
||||||
|
outfile.close();
|
||||||
|
}
|
||||||
|
dialog.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::buffer1_changed(){
|
||||||
|
//When the text changed,enable the copy button
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::btncopy_clicked(){
|
||||||
|
//Get Text
|
||||||
|
Glib::ustring text;
|
||||||
|
Gtk::TextBuffer::iterator start,end;
|
||||||
|
if(buffer1->get_selection_bounds(start,end)){
|
||||||
|
text=buffer1->get_text(start,end);
|
||||||
|
}else{
|
||||||
|
text=buffer1->get_text();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get Clipboard and set text
|
||||||
|
auto refClipboard=Gtk::Clipboard::get();
|
||||||
|
refClipboard->set_text(text);
|
||||||
|
|
||||||
|
//Show InfoBar
|
||||||
|
label1.set_label("The Text is copyed");
|
||||||
|
infobar.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::btnpaste_clicked(){
|
||||||
|
//Get ClipBoard
|
||||||
|
auto refClipboard=Gtk::Clipboard::get();
|
||||||
|
refClipboard->request_text(sigc::mem_fun(*this,&TextEditor::clipboard_receive));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::clipboard_receive(const Glib::ustring &text){
|
||||||
|
if(buffer1->insert_interactive_at_cursor(text)){
|
||||||
|
//Show InfoBar
|
||||||
|
label1.set_label("The Text is Pasted at cursor position");
|
||||||
|
infobar.show();
|
||||||
|
}else{
|
||||||
|
//Show InfoBar
|
||||||
|
label1.set_label("Text Paste Error!");
|
||||||
|
infobar.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::btnclear_clicked(){
|
||||||
|
buffer1->set_text("");
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextEditor::infobar_response(int response){
|
||||||
|
infobar.hide();
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <gtkmm.h>
|
||||||
|
|
||||||
|
class TextEditor : public Gtk::ApplicationWindow{
|
||||||
|
public:
|
||||||
|
TextEditor();
|
||||||
|
private:
|
||||||
|
//Header widgets
|
||||||
|
Gtk::HeaderBar header;
|
||||||
|
Gtk::MenuButton menubtn;
|
||||||
|
Gtk::Popover popover;
|
||||||
|
Gtk::ToggleButton search_button;
|
||||||
|
Gtk::SearchBar *searchbar;
|
||||||
|
Gtk::SearchEntry *search_entry;
|
||||||
|
Glib::RefPtr<Gtk::Builder> menu_builder, searchbar_builder;
|
||||||
|
Gtk::Box *searchbox;
|
||||||
|
|
||||||
|
//Window widgets
|
||||||
|
Gtk::Box vbox,hbox,*infobox;
|
||||||
|
Gtk::ScrolledWindow sw1,sw2;
|
||||||
|
Glib::RefPtr<Gtk::TextBuffer> buffer1;
|
||||||
|
Gtk::TextView textview1;
|
||||||
|
Gtk::InfoBar infobar;
|
||||||
|
Gtk::Label label1;
|
||||||
|
|
||||||
|
//File Dialog
|
||||||
|
Glib::RefPtr<Gtk::FileChooserNative> dialog;
|
||||||
|
Glib::ustring curr_filename;
|
||||||
|
|
||||||
|
//Signal Handlers
|
||||||
|
void btnopen_clicked();
|
||||||
|
void opendialog_response(int response);
|
||||||
|
void btnsave_clicked();
|
||||||
|
void savedialog_response(int response);
|
||||||
|
void btncopy_clicked();
|
||||||
|
void btnpaste_clicked();
|
||||||
|
void btnclear_clicked();
|
||||||
|
void buffer1_changed();
|
||||||
|
void clipboard_receive(const Glib::ustring &text);
|
||||||
|
void infobar_response(int response);
|
||||||
|
};
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "TextEditor.hh"
|
||||||
|
|
||||||
|
int main(int argc,char **argv){
|
||||||
|
auto app = Gtk::Application::create(argc,argv,"org.gtk.daleclack");
|
||||||
|
TextEditor textwin;
|
||||||
|
return app->run(textwin);
|
||||||
|
}
|
Loading…
Reference in New Issue