summaryrefslogtreecommitdiffstats
path: root/src/actions/actions-base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/actions/actions-base.cpp')
-rw-r--r--src/actions/actions-base.cpp252
1 files changed, 252 insertions, 0 deletions
diff --git a/src/actions/actions-base.cpp b/src/actions/actions-base.cpp
new file mode 100644
index 0000000..156be4b
--- /dev/null
+++ b/src/actions/actions-base.cpp
@@ -0,0 +1,252 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Gio::Actions tied to the application and independent of GUI.
+ *
+ * Copyright (C) 2018 Tavmjong Bah
+ *
+ * The contents of this file may be used under the GNU General Public License Version 2 or later.
+ *
+ */
+
+#include <iostream>
+
+#include <giomm.h> // Not <gtkmm.h>! To eventually allow a headless version!
+#include <glibmm/i18n.h>
+
+#include "actions-base.h"
+#include "actions-helper.h"
+
+#include "actions/actions-extra-data.h"
+#include "inkscape-application.h"
+
+#include "inkscape.h" // Inkscape::Application
+#include "inkscape-version-info.h"// Inkscape version
+#include "path-prefix.h" // Extension directory
+#include "selection.h" // Selection
+#include "object/sp-root.h" // query_all()
+#include "file.h" // dpi convert method
+#include "io/resource.h"
+
+void
+print_inkscape_version()
+{
+ std::cout << Inkscape::inkscape_version() << std::endl;
+}
+
+void
+print_debug_info()
+{
+ std::cout << Inkscape::debug_info() << std::endl;
+}
+
+void
+print_system_data_directory()
+{
+ std::cout << Glib::build_filename(get_inkscape_datadir(), "inkscape") << std::endl;
+}
+
+void
+print_user_data_directory()
+{
+ std::cout << Inkscape::IO::Resource::profile_path("") << std::endl;
+}
+
+// Helper function for query_x(), query_y(), query_width(), and query_height().
+void
+query_dimension(InkscapeApplication* app, bool extent, Geom::Dim2 const axis)
+{
+ SPDocument* document = nullptr;
+ Inkscape::Selection* selection = nullptr;
+ if (!get_document_and_selection(app, &document, &selection)) {
+ return;
+ }
+
+ if (selection->isEmpty()) {
+ selection->add(document->getRoot());
+ }
+
+ bool first = true;
+ auto items = selection->items();
+ for (auto item : items) {
+ if (!first) {
+ std::cout << ",";
+ }
+ first = false;
+ Geom::OptRect area = item->documentVisualBounds();
+ if (area) {
+ if (extent) {
+ std::cout << area->dimensions()[axis];
+ } else {
+ std::cout << area->min()[axis];
+ }
+ } else {
+ std::cout << "0";
+ }
+ }
+ std::cout << std::endl;
+}
+
+void
+query_x(InkscapeApplication* app)
+{
+ query_dimension(app, false, Geom::X);
+}
+
+void
+query_y(InkscapeApplication* app)
+{
+ query_dimension(app, false, Geom::Y);
+}
+
+void
+query_width(InkscapeApplication* app)
+{
+ query_dimension(app, true, Geom::X);
+}
+
+void
+query_height(InkscapeApplication* app)
+{
+ query_dimension(app, true, Geom::Y);
+}
+
+// Helper for query_all()
+void
+query_all_recurse (SPObject *o)
+{
+ SPItem *item = dynamic_cast<SPItem*>(o);
+ if (item && item->getId()) {
+ Geom::OptRect area = item->documentVisualBounds();
+ if (area) {
+ // clang-format off
+ std::cout << item->getId() << ","
+ << area->min()[Geom::X] << ","
+ << area->min()[Geom::Y] << ","
+ << area->dimensions()[Geom::X] << ","
+ << area->dimensions()[Geom::Y] << std::endl;
+ // clang-format on
+ }
+
+ for (auto& child: o->children) {
+ query_all_recurse (&child);
+ }
+ }
+}
+
+void
+query_all(InkscapeApplication* app)
+{
+ SPDocument* doc = app->get_active_document();
+ if (!doc) {
+ std::cerr << "query_all: no document!" << std::endl;
+ return;
+ }
+
+ SPObject *o = doc->getRoot();
+ if (o) {
+ query_all_recurse(o);
+ }
+}
+
+void
+pdf_page(int page)
+{
+ INKSCAPE.set_pdf_page(page);
+}
+
+void
+convert_dpi_method(Glib::ustring method)
+{
+ if (method == "none") {
+ sp_file_convert_dpi_method_commandline = FILE_DPI_UNCHANGED;
+ } else if (method == "scale-viewbox") {
+ sp_file_convert_dpi_method_commandline = FILE_DPI_VIEWBOX_SCALED;
+ } else if (method == "scale-document") {
+ sp_file_convert_dpi_method_commandline = FILE_DPI_DOCUMENT_SCALED;
+ } else {
+ std::cerr << "dpi_convert_method: invalid option" << std::endl;
+ }
+}
+
+void
+no_convert_baseline()
+{
+ sp_no_convert_text_baseline_spacing = true;
+}
+
+void
+vacuum_defs(InkscapeApplication* app)
+{
+ SPDocument* document = nullptr;
+ Inkscape::Selection* selection = nullptr;
+ if (!get_document_and_selection(app, &document, &selection)) {
+ return;
+ }
+ document->vacuumDocument();
+}
+
+std::vector<std::vector<Glib::ustring>> raw_data_base =
+{
+ // clang-format off
+ {"app.inkscape-version", N_("Inkscape Version"), "Base", N_("Print Inkscape version and exit") },
+ {"app.debug-info", N_("Debug Info"), "Base", N_("Print debugging information and exit") },
+ {"app.system-data-directory", N_("System Directory"), "Base", N_("Print system data directory and exit") },
+ {"app.user-data-directory", N_("User Directory"), "Base", N_("Print user data directory and exit") },
+ {"app.action-list", N_("List Actions"), "Base", N_("Print a list of actions and exit") },
+ {"app.vacuum-defs", N_("Clean up Document"), "Base", N_("Remove unused definitions (gradients, etc.)") },
+ {"app.quit", N_("Quit"), "Base", N_("Quit Inkscape, check for data loss") },
+ {"app.quit-immediate", N_("Quit Immediately"), "Base", N_("Immediately quit Inkscape, no check for data loss") },
+
+ {"app.open-page", N_("Import Page Number"), "Import", N_("Select PDF page number to import") },
+ {"app.convert-dpi-method", N_("Import DPI Method"), "Import", N_("Set DPI conversion method for legacy Inkscape files")},
+ {"app.no-convert-baseline", N_("No Import Baseline Conversion"), "Import", N_("Do not convert text baselines in legacy Inkscape files")},
+
+ {"app.query-x", N_("Query X"), "Query", N_("Query 'x' value(s) of selected objects") },
+ {"app.query-y", N_("Query Y"), "Query", N_("Query 'y' value(s) of selected objects") },
+ {"app.query-width", N_("Query Width"), "Query", N_("Query 'width' value(s) of object(s)") },
+ {"app.query-height", N_("Query Height"), "Query", N_("Query 'height' value(s) of object(s)") },
+ {"app.query-all", N_("Query All"), "Query", N_("Query 'x', 'y', 'width', and 'height'") }
+ // clang-format on
+};
+
+void
+add_actions_base(InkscapeApplication* app)
+{
+ auto *gapp = app->gio_app();
+
+ // Note: "radio" actions are just an easy way to set type without using templating.
+ // clang-format off
+ gapp->add_action( "inkscape-version", sigc::ptr_fun(&print_inkscape_version) );
+ gapp->add_action( "debug-info", sigc::ptr_fun(&print_debug_info) );
+ gapp->add_action( "system-data-directory", sigc::ptr_fun(&print_system_data_directory) );
+ gapp->add_action( "user-data-directory", sigc::ptr_fun(&print_user_data_directory) );
+ gapp->add_action( "action-list", sigc::mem_fun(app, &InkscapeApplication::print_action_list) );
+ gapp->add_action( "vacuum-defs", sigc::bind<InkscapeApplication*>(sigc::ptr_fun(&vacuum_defs), app) );
+ gapp->add_action( "quit", sigc::mem_fun(app, &InkscapeApplication::on_quit) );
+ gapp->add_action( "quit-immediate", sigc::mem_fun(app, &InkscapeApplication::on_quit_immediate) );
+
+ gapp->add_action_radio_integer( "open-page", sigc::ptr_fun(&pdf_page), 0);
+ gapp->add_action_radio_string( "convert-dpi-method", sigc::ptr_fun(&convert_dpi_method), "none");
+ gapp->add_action( "no-convert-baseline", sigc::ptr_fun(&no_convert_baseline) );
+
+
+ gapp->add_action( "query-x", sigc::bind<InkscapeApplication*>(sigc::ptr_fun(&query_x), app) );
+ gapp->add_action( "query-y", sigc::bind<InkscapeApplication*>(sigc::ptr_fun(&query_y), app) );
+ gapp->add_action( "query-width", sigc::bind<InkscapeApplication*>(sigc::ptr_fun(&query_width), app) );
+ gapp->add_action( "query-height", sigc::bind<InkscapeApplication*>(sigc::ptr_fun(&query_height), app) );
+ gapp->add_action( "query-all", sigc::bind<InkscapeApplication*>(sigc::ptr_fun(&query_all), app) );
+ // clang-format on
+
+ app->get_action_extra_data().add_data(raw_data_base);
+}
+
+/*
+ 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 :