Enhance save as template and new from template dialogs
[inkscape.git] / src / ui / dialog / save-template-dialog.cpp
blob6cafe044024209c1ac14f46d3b47057f64cf6d6d
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /** @file
3 * "Save document as template" dialog
4 *//*
5 * Authors: see git history
7 * Copyright (C) 2018 Authors
8 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
9 */
11 #include "save-template-dialog.h"
13 #include <glibmm/i18n.h>
14 #include <gtkmm/dialog.h>
15 #include <gtkmm/entry.h>
16 #include <gtkmm/window.h>
18 #include "file.h"
19 #include "io/resource.h"
20 #include "ui/dialog-run.h"
22 namespace Inkscape::UI::Dialog {
24 SaveTemplate::SaveTemplate(Gtk::Window& parent) : Dialog(_("Save as Template"), parent, true) {
25 set_default_size(600, 400);
27 _name.set_halign(Gtk::Align::END);
28 _desc_label.set_halign(Gtk::Align::END);
29 _content.set_column_spacing(4);
30 _content.set_row_spacing(4);
31 _content.set_margin_top(16);
32 _content.set_margin_bottom(8);
33 // lame attempt to align content optically:
34 _content.set_margin_start(60);
35 _content.set_margin_end(100);
36 _content.attach(_name, 0, 0);
37 _content.attach(_filename, 1, 0);
38 _content.attach(_desc_label, 0, 1);
39 _content.attach(_description, 1, 1);
40 _filename.set_hexpand();
41 _filename.set_max_length(250);
42 _filename.set_input_hints(Gtk::InputHints::NO_SPELLCHECK);
43 _filename.signal_changed().connect([this]{ update_save_widgets(); });
44 _description.set_hexpand();
46 auto& templates = _list.templates();
47 templates.init(Extension::TEMPLATE_NEW_FROM, UI::Widget::TemplateList::Custom);
48 _list.show_page_selector(false);
49 _list.show_header(false);
50 _list.set_content(_content);
51 set_child(_list);
53 _save.add_css_class("dialog-cmd-button");
54 _btn_group->add_widget(_cancel);
55 _btn_group->add_widget(_save);
56 _set_as_default.set_tooltip_text(_("Base every other new document on this template"));
57 _list.add_button(_set_as_default, UI::Widget::DocumentTemplates::Start);
58 _list.add_button(_cancel, UI::Widget::DocumentTemplates::End);
59 _list.add_button(_save, UI::Widget::DocumentTemplates::End);
61 templates.connectItemSelected([this](int pos) { update_save_widgets(); });
62 _cancel.signal_clicked().connect([this]{ response(Gtk::ResponseType::CANCEL); });
63 _save.signal_clicked().connect([this]{ response(Gtk::ResponseType::OK); });
65 update_save_widgets();
66 set_default_widget(_save);
67 set_transient_for(parent);
68 set_visible();
69 _filename.grab_focus();
72 void SaveTemplate::update_save_widgets() {
73 if (_update.pending()) return;
75 auto scope = _update.block();
77 bool enable_save = false;
78 bool enable_name = false;
80 auto preset = _list.templates().get_selected_preset();
82 if (_current_preset != preset) {
83 _current_preset = preset;
85 if (_list.templates().has_selected_new_template()) {
86 _filename.set_text("");
87 _description.set_text("");
89 else if (preset) {
90 _filename.set_text(preset->get_name());
91 _description.set_text(preset->get_description());
95 if (_list.templates().has_selected_new_template()) {
96 // saving a new template?
97 bool has_text = _filename.get_text_length() > 0;
98 enable_name = true;
99 enable_save = has_text;
101 else if (preset) {
102 // overwriting existing template
103 enable_name = false;
104 enable_save = true;
107 _save.set_label(preset ? _("Overwrite") : _("Save"));
108 _save.set_sensitive(enable_save);
109 _filename.set_sensitive(enable_name);
110 _name.set_sensitive(enable_name);
113 void SaveTemplate::save_template(Gtk::Window &parent) {
114 auto fname = _filename.get_text();
115 auto description = _description.get_text();
116 auto set_default_template = _set_as_default.get_active();
117 // not used currently:
118 Glib::ustring author, keywords;
120 if (auto preset = _list.templates().get_selected_preset()) {
121 sp_file_save_template(parent, preset->get_name(), author, description, keywords, set_default_template);
123 else if (!fname.empty()) {
124 sp_file_save_template(parent, fname, author, description, keywords, set_default_template);
128 void SaveTemplate::save_document_as_template(Gtk::Window &parent) {
130 SaveTemplate dialog(parent);
131 int response = UI::dialog_run(dialog);
133 switch (response) {
134 case Gtk::ResponseType::OK:
135 dialog.save_template(parent);
136 break;
137 default:
138 break;
141 dialog.close();
144 } // namespace Inkscape::UI::Dialog
147 Local Variables:
148 mode:c++
149 c-file-style:"stroustrup"
150 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
151 indent-tabs-mode:nil
152 fill-column:99
153 End:
155 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :