summaryrefslogtreecommitdiffstats
path: root/src/actions/actions-view-mode.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/actions/actions-view-mode.cpp372
1 files changed, 372 insertions, 0 deletions
diff --git a/src/actions/actions-view-mode.cpp b/src/actions/actions-view-mode.cpp
new file mode 100644
index 0000000..ad1330b
--- /dev/null
+++ b/src/actions/actions-view-mode.cpp
@@ -0,0 +1,372 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/** \file
+ *
+ * Actions related to View mode
+ *
+ * Authors:
+ * Sushant A A <sushant.co19@gmail.com>
+ * Tavmjong Bah
+ *
+ * Copyright (C) 2021, 2022 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include <giomm.h>
+#include <glibmm/i18n.h>
+
+#include "actions-view-mode.h"
+
+#include "inkscape-application.h"
+#include "inkscape-window.h"
+
+#include "object/sp-namedview.h"
+
+#include "ui/monitor.h" // Monitor aspect ratio
+#include "ui/widget/canvas.h"
+
+#include "widgets/desktop-widget.h"
+
+// Helper function to set state.
+void
+canvas_set_state(InkscapeWindow *win, Glib::ustring action_name, bool state)
+{
+ // Get Action
+ auto action = win->lookup_action(action_name);
+ if (!action) {
+ std::cerr << "canvas_set_state: " << action_name << " action missing!" << std::endl;
+ return;
+ }
+
+ auto saction = Glib::RefPtr<Gio::SimpleAction>::cast_dynamic(action);
+ if (!saction) {
+ std::cerr << "canvas_set_state: " << action_name << " not SimpleAction!" << std::endl;
+ return;
+ }
+
+ // Set State
+ saction->change_state(state);
+}
+
+// Helper function to toggle state.
+bool
+canvas_toggle_state(InkscapeWindow *win, Glib::ustring action_name)
+{
+ // Get Action
+ auto action = win->lookup_action(action_name);
+ if (!action) {
+ std::cerr << "canvas_toggle_state: " << action_name << " action missing!" << std::endl;
+ return false;
+ }
+
+ auto saction = Glib::RefPtr<Gio::SimpleAction>::cast_dynamic(action);
+ if (!saction) {
+ std::cerr << "canvas_toggle_state: " << action_name << " not SimpleAction!" << std::endl;
+ return false;
+ }
+
+ // Toggle State
+ bool state = false;
+ saction->get_state(state);
+ state = !state;
+ saction->change_state(state);
+
+ return state;
+}
+
+void
+canvas_show_grid_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-show-grid");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleGrids();
+}
+
+void
+canvas_commands_bar_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-commands-bar");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("commands");
+}
+
+void
+canvas_snap_controls_bar_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-snap-controls-bar");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("snaptoolbox");
+}
+
+void
+canvas_tool_control_bar_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-tool-control-bar");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("toppanel");
+}
+
+void
+canvas_toolbox_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-toolbox");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("toolbox");
+}
+
+void
+canvas_rulers_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-rulers");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("rulers");
+}
+
+void
+canvas_scroll_bars(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-scroll-bars");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("scrollbars");
+}
+
+void
+canvas_palette_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-palette");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("panels");
+}
+
+void
+canvas_statusbar_toggle(InkscapeWindow *win)
+{
+ // Toggle State
+ canvas_toggle_state(win, "canvas-statusbar");
+
+ // Do Action
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleToolbar("statusbar");
+}
+
+void
+canvas_interface_mode(InkscapeWindow *win)
+{
+ // Toggle State
+ bool state = canvas_toggle_state(win, "canvas-interface-mode");
+
+ // Save to preferences
+ auto prefs = Inkscape::Preferences::get();
+ Glib::ustring pref_root = "/window/";
+ auto desktop = win->get_desktop();
+ if (desktop && desktop->is_focusMode()) {
+ pref_root = "/focus/";
+ } else if (desktop && desktop->is_fullscreen()) {
+ pref_root = "/fullscreen/";
+ }
+ prefs->setBool(pref_root + "interface_mode", state);
+
+ // Update Interface
+ auto desktop_widget = win->get_desktop_widget();
+ desktop_widget->layoutWidgets();
+}
+
+void
+view_fullscreen(InkscapeWindow *win)
+{
+ SPDesktop* dt = win->get_desktop();
+ dt->fullscreen();
+}
+
+void
+view_full_screen_focus(InkscapeWindow *win)
+{
+ SPDesktop* dt = win->get_desktop();
+ dt->fullscreen();
+ dt->focusMode(!dt->is_fullscreen());
+}
+
+void
+view_focus_toggle(InkscapeWindow *win)
+{
+ SPDesktop* dt = win->get_desktop();
+ dt->focusMode(!dt->is_focusMode());
+}
+
+void
+canvas_command_palette(InkscapeWindow *win)
+{
+ SPDesktop* dt = win->get_desktop();
+ dt->toggleCommandPalette();
+}
+
+/*
+ * Sets state of actions (and thus toggle buttons).
+ * Needed when changing window mode (fullscreen, normal, focus).
+ */
+void
+view_set_gui(InkscapeWindow* win)
+{
+ auto prefs = Inkscape::Preferences::get();
+ SPDesktop* desktop = win->get_desktop();
+
+ if (!desktop) {
+ std::cerr << "canvas_set_gui: no desktop!" << std::endl;
+ return;
+ }
+
+ Glib::ustring pref_root = "/window/";
+ if (desktop && desktop->is_focusMode()) {
+ pref_root = "/focus/";
+ } else if (desktop && desktop->is_fullscreen()) {
+ pref_root = "/fullscreen/";
+ }
+
+ // clang-format off
+
+ // Current States of Actions
+ bool commands_state = prefs->getBool(pref_root + "commands/state", true);
+ bool snaptoolbox_state = prefs->getBool(pref_root + "snaptoolbox/state", true);
+ bool toppanel_state = prefs->getBool(pref_root + "toppanel/state", true);
+ bool toolbox_state = prefs->getBool(pref_root + "toolbox/state", true);
+ bool palette_state = prefs->getBool(pref_root + "panels/state", true);
+ bool statusbar_state = prefs->getBool(pref_root + "statusbar/state", true);
+ bool scrollbars_state = prefs->getBool(pref_root + "scrollbars/state", true);
+ bool rulers_state = prefs->getBool(pref_root + "rulers/state", true);
+ bool interface_mode = prefs->getInt(pref_root + "interface_mode", false);
+
+ canvas_set_state(win, "canvas-commands-bar", commands_state);
+ canvas_set_state(win, "canvas-snap-controls-bar", snaptoolbox_state);
+ canvas_set_state(win, "canvas-tool-control-bar", toppanel_state);
+ canvas_set_state(win, "canvas-toolbox", toolbox_state);
+ canvas_set_state(win, "canvas-rulers", rulers_state);
+ canvas_set_state(win, "canvas-scroll-bars", scrollbars_state);
+ canvas_set_state(win, "canvas-palette", palette_state);
+ canvas_set_state(win, "canvas-statusbar", statusbar_state);
+ // clang-format on
+}
+
+std::vector<std::vector<Glib::ustring>> raw_data_view_mode =
+{
+ // clang-format off
+ {"win.canvas-show-grid", N_("Page Grid"), "Canvas Display", N_("Show or hide the page grid")},
+
+ {"win.canvas-commands-bar", N_("Commands Bar"), "Canvas Display", N_("Show or hide the Commands bar (under the menu)")},
+ {"win.canvas-snap-controls-bar", N_("Snap Controls Bar"), "Canvas Display", N_("Show or hide the snapping controls")},
+ {"win.canvas-tool-control-bar", N_("Tool Controls Bar"), "Canvas Display", N_("Show or hide the Tool Controls bar")},
+ {"win.canvas-toolbox", N_("Toolbox"), "Canvas Display", N_("Show or hide the main toolbox (on the left)")},
+ {"win.canvas-rulers", N_("Rulers"), "Canvas Display", N_("Show or hide the canvas rulers")},
+ {"win.canvas-scroll-bars", N_("Scroll bars"), "Canvas Display", N_("Show or hide the canvas scrollbars")},
+ {"win.canvas-palette", N_("Palette"), "Canvas Display", N_("Show or hide the color palette")},
+ {"win.canvas-statusbar", N_("Statusbar"), "Canvas Display", N_("Show or hide the statusbar (at the bottom of the window)")},
+
+ {"win.canvas-command-palette", N_("Command Palette"), "Canvas Display", N_("Show or hide the on-canvas command palette")},
+ {"win.view-fullscreen", N_("Fullscreen"), "Canvas Display", N_("Stretch this document window to full screen")},
+
+ {"win.view-full-screen-focus", N_("Fullscreen & Focus Mode"), "Canvas Display", N_("Stretch this document window to full screen")},
+ {"win.view-focus-toggle", N_("Focus Mode"), "Canvas Display", N_("Remove excess toolbars to focus on drawing")},
+
+ {"win.canvas-interface-mode", N_("Interface Mode"), "Canvas Display", N_("Toggle wide or narrow screen setup")},
+ // clang-format on
+};
+
+void
+add_actions_view_mode(InkscapeWindow* win)
+{
+ auto prefs = Inkscape::Preferences::get();
+ SPDesktop* desktop = win->get_desktop();
+
+ if (!desktop) {
+ std::cerr << "add_actions_view_mode: no desktop!" << std::endl;
+ }
+
+ Glib::ustring pref_root = "/window/";
+ if (desktop && desktop->is_focusMode()) {
+ pref_root = "/focus/";
+ } else if (desktop && desktop->is_fullscreen()) {
+ pref_root = "/fullscreen/";
+ }
+
+ // Initial States of Actions
+
+ // If interface_mode unset, use screen aspect ratio.
+ Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_primary();
+ double const width = monitor_geometry.get_width();
+ double const height = monitor_geometry.get_height();
+ bool widescreen = (height > 0 && width/height > 1.65);
+ widescreen = prefs->getInt(pref_root + "task/taskset", widescreen ? 2 : 0) == 2; // legacy
+
+ // clang-format off
+ bool commands_toggle = prefs->getBool(pref_root + "commands/state", true);
+ bool snaptoolbox_toggle = prefs->getBool(pref_root + "snaptoolbox/state", true);
+ bool toppanel_toggle = prefs->getBool(pref_root + "toppanel/state", true);
+ bool toolbox_toggle = prefs->getBool(pref_root + "toolbox/state", true);
+ bool rulers_toggle = prefs->getBool(pref_root + "rulers/state", true);
+ bool scrollbars_toggle = prefs->getBool(pref_root + "scrollbars/state", true);
+ bool palette_toggle = prefs->getBool(pref_root + "panels/state", true);
+ bool statusbar_toggle = prefs->getBool(pref_root + "statusbar/state", true);
+
+ bool interface_mode = prefs->getBool(pref_root + "interface_mode", widescreen);
+
+ win->add_action_bool( "canvas-show-grid", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_show_grid_toggle), win));
+
+ win->add_action_bool( "canvas-commands-bar", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_commands_bar_toggle), win), commands_toggle);
+ win->add_action_bool( "canvas-snap-controls-bar", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_snap_controls_bar_toggle), win), snaptoolbox_toggle);
+ win->add_action_bool( "canvas-tool-control-bar", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_tool_control_bar_toggle), win), toppanel_toggle);
+ win->add_action_bool( "canvas-toolbox", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_toolbox_toggle), win), toolbox_toggle);
+ win->add_action_bool( "canvas-rulers", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_rulers_toggle), win), rulers_toggle);
+ win->add_action_bool( "canvas-scroll-bars", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_scroll_bars), win), scrollbars_toggle);
+ win->add_action_bool( "canvas-palette", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_palette_toggle), win), palette_toggle);
+ win->add_action_bool( "canvas-statusbar", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_statusbar_toggle), win), statusbar_toggle);
+
+ win->add_action_bool ( "canvas-interface-mode", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_interface_mode), win), interface_mode);
+ win->add_action( "view-fullscreen", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&view_fullscreen), win));
+
+ win->add_action( "view-full-screen-focus", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&view_full_screen_focus), win));
+ win->add_action( "view-focus-toggle", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&view_focus_toggle), win));
+
+ win->add_action( "canvas-command-palette", sigc::bind<InkscapeWindow*>(sigc::ptr_fun(&canvas_command_palette), win));
+ // clang-format on
+
+ auto app = InkscapeApplication::instance();
+ if (!app) {
+ std::cerr << "add_actions_view_mode: no app!" << std::endl;
+ return;
+ }
+ app->get_action_extra_data().add_data(raw_data_view_mode);
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim:filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99: