1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * "Save document as template" dialog
5 * Authors: see git history
7 * Copyright (C) 2018 Authors
8 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
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>
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
);
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
);
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("");
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;
99 enable_save
= has_text
;
102 // overwriting existing template
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
);
134 case Gtk::ResponseType::OK
:
135 dialog
.save_template(parent
);
144 } // namespace Inkscape::UI::Dialog
149 c-file-style:"stroustrup"
150 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
155 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :