Basic cut, copy, paste and select all impl
parent
03f55ad3a9
commit
7bf7f86f74
44
src/draw.cc
44
src/draw.cc
|
@ -2,6 +2,7 @@
|
|||
#include "node.h"
|
||||
#include "mainwindow.h"
|
||||
#include <gdk/gdkthreads.h>
|
||||
#include <gdk/gdkselection.h>
|
||||
#include <iostream>
|
||||
#define PANGO_SCALE_XXX_LARGE ((double)1.98)
|
||||
|
||||
|
@ -160,6 +161,49 @@ void Draw::processDocument(cmark_node *root_node)
|
|||
}
|
||||
}
|
||||
|
||||
void Draw::selectAll()
|
||||
{
|
||||
auto buffer = get_buffer();
|
||||
buffer->select_range(buffer->begin(), buffer->end());
|
||||
}
|
||||
|
||||
void Draw::cut()
|
||||
{
|
||||
bool isEditable = get_editable();
|
||||
if (isEditable)
|
||||
{
|
||||
auto buffer = get_buffer();
|
||||
auto clipboard = get_clipboard("CLIPBOARD");
|
||||
buffer->cut_clipboard(clipboard);
|
||||
}
|
||||
else
|
||||
{
|
||||
auto buffer = get_buffer();
|
||||
auto clipboard = get_clipboard("CLIPBOARD");
|
||||
buffer->copy_clipboard(clipboard);
|
||||
}
|
||||
}
|
||||
|
||||
void Draw::copy()
|
||||
{
|
||||
auto buffer = get_buffer();
|
||||
auto clipboard = get_clipboard("CLIPBOARD");
|
||||
buffer->copy_clipboard(clipboard);
|
||||
}
|
||||
|
||||
void Draw::paste()
|
||||
{
|
||||
bool isEditable = get_editable();
|
||||
if (isEditable)
|
||||
{
|
||||
auto buffer = get_buffer();
|
||||
auto pasteIter = buffer->get_iter_at_offset(0);
|
||||
auto clipboard = get_clipboard("CLIPBOARD");
|
||||
buffer->select_range(pasteIter, pasteIter);
|
||||
buffer->paste_clipboard(clipboard);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process and parse each node in the AST
|
||||
*/
|
||||
|
|
|
@ -15,6 +15,10 @@ public:
|
|||
void showMessage(const std::string &message, const std::string &detailed_info = "");
|
||||
void showStartPage();
|
||||
void processDocument(cmark_node *root_node);
|
||||
void selectAll();
|
||||
void cut();
|
||||
void copy();
|
||||
void paste();
|
||||
|
||||
protected:
|
||||
// Signals
|
||||
|
|
|
@ -28,6 +28,12 @@ MainWindow::MainWindow()
|
|||
|
||||
// Connect signals
|
||||
m_menu.quit.connect(sigc::mem_fun(this, &MainWindow::hide)); /*!< hide main window and therefor closes the app */
|
||||
m_menu.cut.connect(sigc::mem_fun(m_draw, &Draw::cut));
|
||||
m_menu.copy.connect(sigc::mem_fun(m_draw, &Draw::copy));
|
||||
m_menu.paste.connect(sigc::mem_fun(m_draw, &Draw::paste));
|
||||
//m_menu.del.connect(sigc::mem_fun(m_draw, &Draw::del));
|
||||
m_menu.select_all.connect(sigc::mem_fun(m_draw, &Draw::selectAll));
|
||||
//m_menu.find.connect(sigc::mem_fun(this, &MainWindow::find));
|
||||
m_menu.back.connect(sigc::mem_fun(this, &MainWindow::back)); /*!< Menu item for previous page */
|
||||
m_menu.forward.connect(sigc::mem_fun(this, &MainWindow::forward)); /*!< Menu item for next page */
|
||||
m_menu.reload.connect(sigc::mem_fun(this, &MainWindow::refresh)); /*!< Menu item for reloading the page */
|
||||
|
@ -112,8 +118,18 @@ void MainWindow::doRequest(const std::string &path, bool setAddressBar, bool isH
|
|||
if (m_requestThread == nullptr)
|
||||
{
|
||||
m_requestThread = new std::thread(&MainWindow::processRequest, this, path);
|
||||
postDoRequest(path, setAddressBar, isHistoryRequest);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Post processing request actions
|
||||
*/
|
||||
void MainWindow::postDoRequest(const std::string &path, bool setAddressBar, bool isHistoryRequest)
|
||||
{
|
||||
if (setAddressBar)
|
||||
m_addressBar.set_text(path);
|
||||
|
||||
// Do not insert history back/forward calls into the history (again)
|
||||
if (!isHistoryRequest)
|
||||
{
|
||||
|
@ -128,18 +144,13 @@ void MainWindow::doRequest(const std::string &path, bool setAddressBar, bool isH
|
|||
currentHistoryIndex = history.size() - 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Enable back/forward buttons when possible
|
||||
m_backButton.set_sensitive(currentHistoryIndex > 0);
|
||||
m_menu.setBackMenuSensitive(currentHistoryIndex > 0);
|
||||
m_forwardButton.set_sensitive(currentHistoryIndex < history.size() - 1);
|
||||
m_menu.setForwardMenuSensitive(currentHistoryIndex < history.size() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
Glib::RefPtr<Gtk::AccelGroup> &MainWindow::getAccelGroup()
|
||||
{
|
||||
return accelGroup;
|
||||
}
|
||||
|
||||
void MainWindow::go_home()
|
||||
{
|
||||
|
|
|
@ -19,7 +19,6 @@ class MainWindow : public Gtk::Window
|
|||
public:
|
||||
MainWindow();
|
||||
void doRequest(const std::string &path= std::string(), bool setAddressBar = false, bool isHistoryRequest = false);
|
||||
Glib::RefPtr<Gtk::AccelGroup>& getAccelGroup();
|
||||
|
||||
protected:
|
||||
// Signal handlers:
|
||||
|
@ -62,6 +61,7 @@ private:
|
|||
std::size_t currentHistoryIndex;
|
||||
std::vector<std::string> history;
|
||||
|
||||
void postDoRequest(const std::string &path, bool setAddressBar, bool isHistoryRequest);
|
||||
void processRequest(const std::string &path);
|
||||
void fetchFromIPFS();
|
||||
void openFromDisk();
|
||||
|
|
39
src/menu.cc
39
src/menu.cc
|
@ -2,16 +2,37 @@
|
|||
|
||||
Menu::Menu(const Glib::RefPtr<Gtk::AccelGroup> &accelgroup)
|
||||
: m_file("_File", true),
|
||||
m_edit("_Edit", true),
|
||||
m_view("_View", true),
|
||||
m_help("_Help", true)
|
||||
{
|
||||
// Create accelerator group
|
||||
// File submenu
|
||||
// File sub-menu
|
||||
auto quitMenuItem = createMenuItem("_Quit");
|
||||
quitMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_Q, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
quitMenuItem->signal_activate().connect(quit);
|
||||
|
||||
// View submenu
|
||||
// Edit sub-menu
|
||||
auto cutMenuItem = createMenuItem("Cu_t");
|
||||
cutMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_X, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
cutMenuItem->signal_activate().connect(cut);
|
||||
auto copyMenuItem = createMenuItem("_Copy");
|
||||
copyMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_C, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
copyMenuItem->signal_activate().connect(copy);
|
||||
auto pasteMenuItem = createMenuItem("_Paste");
|
||||
pasteMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_V, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
pasteMenuItem->signal_activate().connect(paste);
|
||||
auto deleteMenuItem = createMenuItem("_Delete");
|
||||
deleteMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_Delete, (Gdk::ModifierType)0, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
deleteMenuItem->signal_activate().connect(del);
|
||||
auto selectAllMenuItem = createMenuItem("Select _All");
|
||||
selectAllMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_A, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
selectAllMenuItem->signal_activate().connect(select_all);
|
||||
auto findMenuItem = createMenuItem("_Find");
|
||||
findMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_F, Gdk::ModifierType::CONTROL_MASK, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
findMenuItem->signal_activate().connect(find);
|
||||
|
||||
// View sub-menu
|
||||
backMenuItem = createMenuItem("_Previous Page");
|
||||
backMenuItem->set_sensitive(false);
|
||||
backMenuItem->add_accelerator("activate", accelgroup, GDK_KEY_Left, Gdk::ModifierType::MOD1_MASK, Gtk::AccelFlags::ACCEL_VISIBLE);
|
||||
|
@ -26,25 +47,35 @@ Menu::Menu(const Glib::RefPtr<Gtk::AccelGroup> &accelgroup)
|
|||
auto sourceCodeMenuItem = createMenuItem("View _Source");
|
||||
sourceCodeMenuItem->signal_activate().connect(source_code);
|
||||
|
||||
// Help submenu
|
||||
// Help subm-enu
|
||||
auto aboutMenuItem = createMenuItem("_About");
|
||||
aboutMenuItem->signal_activate().connect(about);
|
||||
|
||||
// Add items to sub-menus
|
||||
m_fileSubmenu.append(*quitMenuItem);
|
||||
m_editSubmenu.append(*cutMenuItem);
|
||||
m_editSubmenu.append(*copyMenuItem);
|
||||
m_editSubmenu.append(*pasteMenuItem);
|
||||
m_editSubmenu.append(*deleteMenuItem);
|
||||
m_editSubmenu.append(m_separator1);
|
||||
m_editSubmenu.append(*selectAllMenuItem);
|
||||
m_editSubmenu.append(m_separator2);
|
||||
m_editSubmenu.append(*findMenuItem);
|
||||
m_viewSubmenu.append(*backMenuItem);
|
||||
m_viewSubmenu.append(*forwardMenuItem);
|
||||
m_viewSubmenu.append(*reloadMenuItem);
|
||||
m_viewSubmenu.append(m_separator1);
|
||||
m_viewSubmenu.append(m_separator3);
|
||||
m_viewSubmenu.append(*sourceCodeMenuItem);
|
||||
m_helpSubmenu.append(*aboutMenuItem);
|
||||
|
||||
// Add sub-menus to menus
|
||||
m_file.set_submenu(m_fileSubmenu);
|
||||
m_edit.set_submenu(m_editSubmenu);
|
||||
m_view.set_submenu(m_viewSubmenu);
|
||||
m_help.set_submenu(m_helpSubmenu);
|
||||
// Add menus to menu bar
|
||||
append(m_file);
|
||||
append(m_edit);
|
||||
append(m_view);
|
||||
append(m_help);
|
||||
}
|
||||
|
|
14
src/menu.h
14
src/menu.h
|
@ -14,11 +14,17 @@
|
|||
class Menu : public Gtk::MenuBar
|
||||
{
|
||||
public:
|
||||
sigc::signal<void> quit;
|
||||
sigc::signal<void> cut;
|
||||
sigc::signal<void> copy;
|
||||
sigc::signal<void> paste;
|
||||
sigc::signal<void> del;
|
||||
sigc::signal<void> select_all;
|
||||
sigc::signal<void> find;
|
||||
sigc::signal<void> back;
|
||||
sigc::signal<void> forward;
|
||||
sigc::signal<void> reload;
|
||||
sigc::signal<void> source_code;
|
||||
sigc::signal<void> quit;
|
||||
sigc::signal<void> about;
|
||||
|
||||
explicit Menu(const Glib::RefPtr<Gtk::AccelGroup> &accelgroup);
|
||||
|
@ -29,12 +35,16 @@ public:
|
|||
protected:
|
||||
// Child widgets
|
||||
Gtk::MenuItem m_file;
|
||||
Gtk::MenuItem m_edit;
|
||||
Gtk::MenuItem m_view;
|
||||
Gtk::MenuItem m_help;
|
||||
Gtk::Menu m_fileSubmenu; /*!< File sub menu */
|
||||
Gtk::Menu m_viewSubmenu; /*!< Help sub menu */
|
||||
Gtk::Menu m_editSubmenu; /*!< Edit sub menu */
|
||||
Gtk::Menu m_viewSubmenu; /*!< View sub menu */
|
||||
Gtk::Menu m_helpSubmenu; /*!< Help sub menu */
|
||||
Gtk::SeparatorMenuItem m_separator1;
|
||||
Gtk::SeparatorMenuItem m_separator2;
|
||||
Gtk::SeparatorMenuItem m_separator3;
|
||||
|
||||
private:
|
||||
Gtk::MenuItem *createMenuItem(const Glib::ustring &label_text);
|
||||
|
|
Loading…
Reference in New Issue