Basic cut, copy, paste and select all impl

master
Melroy van den Berg 2021-02-16 00:04:41 +01:00
parent 03f55ad3a9
commit 7bf7f86f74
6 changed files with 131 additions and 31 deletions

View File

@ -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
*/

View File

@ -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

View File

@ -27,7 +27,13 @@ MainWindow::MainWindow()
add_accel_group(accelGroup);
// Connect signals
m_menu.quit.connect(sigc::mem_fun(this, &MainWindow::hide)); /*!< hide main window and therefor closes the app */
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,33 +118,38 @@ void MainWindow::doRequest(const std::string &path, bool setAddressBar, bool isH
if (m_requestThread == nullptr)
{
m_requestThread = new std::thread(&MainWindow::processRequest, this, path);
if (setAddressBar)
m_addressBar.set_text(path);
// Do not insert history back/forward calls into the history (again)
if (!isHistoryRequest)
{
if (history.size() == 0)
{
history.push_back(path);
currentHistoryIndex = history.size() - 1;
}
else if (history.size() > 0 && !path.empty() && (history.back().compare(path) != 0))
{
history.push_back(path);
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);
postDoRequest(path, setAddressBar, isHistoryRequest);
}
}
Glib::RefPtr<Gtk::AccelGroup> &MainWindow::getAccelGroup()
/**
* Post processing request actions
*/
void MainWindow::postDoRequest(const std::string &path, bool setAddressBar, bool isHistoryRequest)
{
return accelGroup;
if (setAddressBar)
m_addressBar.set_text(path);
// Do not insert history back/forward calls into the history (again)
if (!isHistoryRequest)
{
if (history.size() == 0)
{
history.push_back(path);
currentHistoryIndex = history.size() - 1;
}
else if (history.size() > 0 && !path.empty() && (history.back().compare(path) != 0))
{
history.push_back(path);
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);
}
void MainWindow::go_home()

View File

@ -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();

View File

@ -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);
}

View File

@ -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);