diff options
Diffstat (limited to 'src/ui/dialog/about.cpp')
-rw-r--r-- | src/ui/dialog/about.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/src/ui/dialog/about.cpp b/src/ui/dialog/about.cpp new file mode 100644 index 0000000..89c3551 --- /dev/null +++ b/src/ui/dialog/about.cpp @@ -0,0 +1,200 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/** @file + * @brief A dialog for the about screen + * + * Copyright (C) Martin Owens 2019 <doctormo@gmail.com> + * + * Released under GNU GPL v2+, read the file 'COPYING' for more information. + */ + +#include "about.h" + +#include <algorithm> +#include <fstream> +#include <random> +#include <regex> +#include <streambuf> +#include <string> + +#include "document.h" +#include "inkscape-version-info.h" +#include "io/resource.h" +#include "ui/util.h" +#include "ui/view/svg-view-widget.h" +#include "util/units.h" + +using namespace Inkscape::IO; +using namespace Inkscape::UI::View; + +namespace Inkscape { +namespace UI { +namespace Dialog { + +static Gtk::Window *window = nullptr; +static Gtk::Notebook *tabs = nullptr; + +void close_about_screen() { + window->hide(); +} +bool show_copy_button(Gtk::Button *button, Gtk::Label *label) { + reveal_widget(button, true); + reveal_widget(label, false); + return false; +} +void copy_version(Gtk::Button *button, Gtk::Label *label) { + auto clipboard = Gtk::Clipboard::get(); + clipboard->set_text(Inkscape::inkscape_version()); + if (label) { + reveal_widget(button, false); + reveal_widget(label, true); + Glib::signal_timeout().connect_seconds( + sigc::bind(sigc::ptr_fun(&show_copy_button), button, label), 2); + } +} +void copy_debug_info(Gtk::Button *button, Gtk::Label *label) { + auto clipboard = Gtk::Clipboard::get(); + clipboard->set_text(Inkscape::debug_info()); + if (label) { + reveal_widget(button, false); + reveal_widget(label, true); + Glib::signal_timeout().connect_seconds( + sigc::bind(sigc::ptr_fun(&show_copy_button), button, label), 2); + } +} + +void AboutDialog::show_about() { + + if(!window) { + // Load glade file here + Glib::ustring gladefile = Resource::get_filename(Resource::UIS, "inkscape-about.glade"); + Glib::RefPtr<Gtk::Builder> builder; + try { + builder = Gtk::Builder::create_from_file(gladefile); + } catch (const Glib::Error &ex) { + g_error("Glade file loading failed for about screen dialog"); + return; + } + builder->get_widget("about-screen-window", window); + builder->get_widget("tabs", tabs); + if(!tabs || !window) { + g_error("Window or tabs in glade file are missing or do not have the right ids."); + return; + } + // Automatic signal handling (requires -rdynamic compile flag) + //gtk_builder_connect_signals(builder->gobj(), NULL); + + // When automatic handling fails + Gtk::Button *version; + Gtk::Label *label; + builder->get_widget("version", version); + builder->get_widget("version-copied", label); + if(version) { + version->set_label(Inkscape::inkscape_version()); + version->signal_clicked().connect( + sigc::bind(sigc::ptr_fun(©_version), version, label)); + } + + Gtk::Button *debug_info; + Gtk::Label *label2; + builder->get_widget("debug_info", debug_info); + builder->get_widget("debug-info-copied", label2); + if (debug_info) { + debug_info->signal_clicked().connect( + sigc::bind(sigc::ptr_fun(©_debug_info), version, label2)); + } + + // Render the about screen image via inkscape SPDocument + auto filename = Resource::get_filename(Resource::SCREENS, "about.svg", true, false); + SPDocument *doc = SPDocument::createNewDoc(filename.c_str(), TRUE); + + // Bind glade's container to our SVGViewWidget class + if(doc) { + //SVGViewWidget *viewer; + //builder->get_widget_derived("image-container", viewer, doc); + //Gtk::manage(viewer); + auto viewer = Gtk::manage(new Inkscape::UI::View::SVGViewWidget(doc)); + double width = doc->getWidth().value("px"); + double height = doc->getHeight().value("px"); + viewer->setResize(width, height); + + Gtk::AspectFrame *splash_widget; + builder->get_widget("aspect-frame", splash_widget); + splash_widget->unset_label(); + splash_widget->set_shadow_type(Gtk::SHADOW_NONE); + splash_widget->property_ratio() = width / height; + splash_widget->add(*viewer); + splash_widget->show_all(); + } else { + g_error("Error loading about screen SVG."); + } + + Gtk::TextView *authors; + builder->get_widget("credits-authors", authors); + std::random_device rd; + std::mt19937 g(rd()); + + if(authors) { + std::ifstream fn(Resource::get_filename(Resource::DOCS, "AUTHORS")); + std::vector<std::string> authors_data; + std::string line; + while (getline(fn, line)) { + authors_data.push_back(line); + } + std::shuffle(std::begin(authors_data), std::end(authors_data), g); + std::string str = ""; + for (auto author : authors_data) { + str += author + "\n"; + } + authors->get_buffer()->set_text(str.c_str()); + } + + Gtk::TextView *translators; + builder->get_widget("credits-translators", translators); + if(translators) { + std::ifstream fn(Resource::get_filename(Resource::DOCS, "TRANSLATORS")); + std::vector<std::string> translators_data; + std::string line; + while (getline(fn, line)) { + translators_data.push_back(line); + } + std::string str = ""; + std::regex e("(.*?)(<.*|)"); + std::shuffle(std::begin(translators_data), std::end(translators_data), g); + for (auto translator : translators_data) { + str += std::regex_replace(translator, e, "$1") + "\n"; + } + translators->get_buffer()->set_text(str.c_str()); + } + + Gtk::Label *license; + builder->get_widget("license-text", license); + if(license) { + std::ifstream fn(Resource::get_filename(Resource::DOCS, "LICENSE")); + std::string str((std::istreambuf_iterator<char>(fn)), + std::istreambuf_iterator<char>()); + license->set_markup(str.c_str()); + } + } + if(window) { + window->show(); + tabs->set_current_page(0); + } else { + g_error("About screen window couldn't be loaded. Missing window id in glade file."); + } +} + + +} // namespace Dialog +} // namespace UI +} // namespace Inkscape + +/* + 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 : |