diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2018-04-07 15:08:17 +0000 |
|---|---|---|
| committer | Tavmjong Bah <tavmjong@free.fr> | 2018-04-07 15:08:17 +0000 |
| commit | e1421ddfb53f4292b6695972478256a2c19df56c (patch) | |
| tree | 6164a4cddf3bae338d32429512e179e299f5e303 | |
| parent | Erase rejected files (diff) | |
| download | inkscape-e1421ddfb53f4292b6695972478256a2c19df56c.tar.gz inkscape-e1421ddfb53f4292b6695972478256a2c19df56c.zip | |
Cleanup Text and Font dialog.
Includes removal of unused buttons. These buttons were redundant with
those in the Text toolbar except for TextPath offset... which will need
to be added to the toolbar.
| -rw-r--r-- | src/ui/dialog/text-edit.cpp | 278 | ||||
| -rw-r--r-- | src/ui/dialog/text-edit.h | 58 |
2 files changed, 62 insertions, 274 deletions
diff --git a/src/ui/dialog/text-edit.cpp b/src/ui/dialog/text-edit.cpp index 7ce39695e..f770f1d23 100644 --- a/src/ui/dialog/text-edit.cpp +++ b/src/ui/dialog/text-edit.cpp @@ -84,49 +84,14 @@ TextEdit::TextEdit() samplephrase(_("AaBbCcIiPpQq12369$\342\202\254\302\242?.;/()")) { + /* Font tab -------------------------------- */ + /* Font selector */ GtkWidget *fontsel = sp_font_selector_new (); gtk_widget_set_size_request (fontsel, 0, 150); fsel = SP_FONT_SELECTOR(fontsel); fontsel_hbox.pack_start(*Gtk::manage(Glib::wrap(fontsel)), true, true); - - /* Align buttons */ - styleButton(&align_left, _("Align left"), INKSCAPE_ICON("format-justify-left"), NULL); - styleButton(&align_center, _("Align center"), INKSCAPE_ICON("format-justify-center"), &align_left); - styleButton(&align_right, _("Align right"), INKSCAPE_ICON("format-justify-right"), &align_left); - styleButton(&align_justify, _("Justify (only flowed text)"), INKSCAPE_ICON("format-justify-fill"), &align_left); - - align_sep.set_orientation(Gtk::ORIENTATION_VERTICAL); - - layout_hbox.pack_start(align_sep, false, false, 10); - - /* Direction buttons */ - styleButton(&text_horizontal, _("Horizontal text"), INKSCAPE_ICON("format-text-direction-horizontal"), NULL); - styleButton(&text_vertical, _("Vertical text"), INKSCAPE_ICON("format-text-direction-vertical"), &text_horizontal); - - text_sep.set_orientation(Gtk::ORIENTATION_VERTICAL); - - layout_hbox.pack_start(text_sep, false, false, 10); - - // Text start Offset - { - startOffset = gtk_combo_box_text_new_with_entry (); - gtk_widget_set_size_request(startOffset, 90, -1); - - const gchar *spacings[] = {"0%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%", NULL}; - for (int i = 0; spacings[i]; i++) { - gtk_combo_box_text_append_text(reinterpret_cast<GtkComboBoxText *>(startOffset), spacings[i]); - } - gtk_entry_set_text(reinterpret_cast<GtkEntry *>(gtk_bin_get_child(reinterpret_cast<GtkBin *>(startOffset))), "0%"); - - gtk_widget_set_tooltip_text(startOffset, _("Text path offset")); - - auto sep = Gtk::manage(new Gtk::Separator()); - sep->set_orientation(Gtk::ORIENTATION_VERTICAL); - layout_hbox.pack_start(*sep, false, false, 10); - - layout_hbox.pack_start(*Gtk::manage(Glib::wrap(startOffset)), false, false); - } + fontsel_hbox.set_name("Font Selector HBox"); /* Font preview */ preview_label.set_ellipsize(Pango::ELLIPSIZE_END); @@ -136,7 +101,7 @@ TextEdit::TextEdit() font_vbox.pack_start(fontsel_hbox, true, true); font_vbox.pack_start(preview_label, true, true, VB_MARGIN); - /* Text tab */ + /* Text tab -------------------------------- */ scroller.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC ); scroller.set_shadow_type(Gtk::SHADOW_IN); @@ -145,12 +110,12 @@ TextEdit::TextEdit() gtk_text_view_set_wrap_mode ((GtkTextView *) text_view, GTK_WRAP_WORD); #ifdef WITH_GTKSPELL -/* + /* TODO: Use computed xml:lang attribute of relevant element, if present, to specify the language (either as 2nd arg of gtkspell_new_attach, or with explicit gtkspell_set_language call in; see advanced.c example in gtkspell docs). onReadSelection looks like a suitable place. -*/ + */ GtkSpellChecker * speller = gtk_spell_checker_new(); if (! gtk_spell_checker_attach(speller, GTK_TEXT_VIEW(text_view))) { @@ -163,11 +128,13 @@ TextEdit::TextEdit() scroller.add(*Gtk::manage(Glib::wrap(text_view))); text_vbox.pack_start(scroller, true, true, 0); + /* Notebook -----------------------------------*/ + notebook.set_name( "TextEdit Notebook" ); notebook.append_page(font_vbox, font_label); notebook.append_page(text_vbox, text_label); notebook.append_page(vari_vbox, vari_label); - /* Buttons */ + /* Buttons (under notebook) ------------------ */ setasdefault_button.set_use_underline(true); apply_button.set_can_default(); button_row.pack_start(setasdefault_button, false, false, 0); @@ -175,15 +142,14 @@ TextEdit::TextEdit() button_row.pack_end(apply_button, false, false, VB_MARGIN); Gtk::Box *contents = _getContents(); + contents->set_name("TextEdit Dialog Box"); contents->set_spacing(4); contents->pack_start(notebook, true, true); contents->pack_start(button_row, false, false, VB_MARGIN); /* Signal handlers */ g_signal_connect ( G_OBJECT (fontsel), "font_set", G_CALLBACK (onFontChange), this ); - // g_signal_connect ( G_OBJECT (spacing_combo), "changed", G_CALLBACK (onLineSpacingChange), this ); g_signal_connect ( G_OBJECT (text_buffer), "changed", G_CALLBACK (onTextChange), this ); - g_signal_connect(startOffset, "changed", G_CALLBACK(onStartOffsetChange), this); setasdefault_button.signal_clicked().connect(sigc::mem_fun(*this, &TextEdit::onSetDefault)); apply_button.signal_clicked().connect(sigc::mem_fun(*this, &TextEdit::onApply)); close_button.signal_clicked().connect(sigc::bind(_signal_response.make_slot(), GTK_RESPONSE_CLOSE)); @@ -205,24 +171,6 @@ TextEdit::~TextEdit() fontVariantChangedConn.disconnect(); } -void TextEdit::styleButton(Gtk::RadioButton *button, gchar const *tooltip, gchar const *icon_name, Gtk::RadioButton *group_button ) -{ - GtkWidget *icon = gtk_image_new_from_icon_name( icon_name, GTK_ICON_SIZE_SMALL_TOOLBAR ); - - if (group_button) { - Gtk::RadioButton::Group group = group_button->get_group(); - button->set_group(group); - } - - button->add(*Gtk::manage(Glib::wrap(icon))); - button->set_tooltip_text(tooltip); - button->set_relief(Gtk::RELIEF_NONE); - button->set_mode(false); - button->signal_clicked().connect(sigc::mem_fun(*this, &TextEdit::onToggle)); - - layout_hbox.pack_start(*button, false, false); -} - void TextEdit::onSelectionModified(guint flags ) { gboolean style, content; @@ -257,46 +205,40 @@ void TextEdit::onReadSelection ( gboolean dostyle, gboolean /*docontent*/ ) guint items = getSelectedTextCount (); if (items == 1) { gtk_widget_set_sensitive (text_view, TRUE); - gtk_widget_set_sensitive( startOffset, SP_IS_TEXT_TEXTPATH(text) ); - if (SP_IS_TEXT_TEXTPATH(text)) { - SPTextPath *tp = SP_TEXTPATH(text->firstChild()); - if (tp->getAttribute("startOffset")) { - gtk_entry_set_text(reinterpret_cast<GtkEntry *>(gtk_bin_get_child(reinterpret_cast<GtkBin *>(startOffset))), tp->getAttribute("startOffset")); - } - } } else { gtk_widget_set_sensitive (text_view, FALSE); - gtk_widget_set_sensitive( startOffset, FALSE ); } apply_button.set_sensitive ( false ); setasdefault_button.set_sensitive ( true ); - //if (docontent) { // When would we NOT want to show the content ? - gchar *str; - str = sp_te_get_string_multiline (text); - if (str) { - if (items == 1) { - gtk_text_buffer_set_text (text_buffer, str, strlen (str)); - gtk_text_buffer_set_modified (text_buffer, FALSE); - } - phrase = str; - - } else { - gtk_text_buffer_set_text (text_buffer, "", 0); + gchar *str; + str = sp_te_get_string_multiline (text); + if (str) { + if (items == 1) { + gtk_text_buffer_set_text (text_buffer, str, strlen (str)); + gtk_text_buffer_set_modified (text_buffer, FALSE); } - //} // end of if (docontent) + phrase = str; + + } else { + gtk_text_buffer_set_text (text_buffer, "", 0); + } + text->getRepr(); // was being called but result ignored. Check this. } else { gtk_widget_set_sensitive (text_view, FALSE); - gtk_widget_set_sensitive( startOffset, FALSE ); apply_button.set_sensitive ( false ); setasdefault_button.set_sensitive ( false ); } if (dostyle) { + // create temporary style SPStyle query(SP_ACTIVE_DOCUMENT); - // query style from desktop into it. This returns a result flag and fills query with the style of subselection, if any, or selection + + // Query style from desktop into it. This returns a result flag and fills query with the + // style of subselection, if any, or selection + //int result_fontspec = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONT_SPECIFICATION); int result_family = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTFAMILY); int result_style = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTSTYLE); @@ -304,8 +246,9 @@ void TextEdit::onReadSelection ( gboolean dostyle, gboolean /*docontent*/ ) // If querying returned nothing, read the style from the text tool prefs (default style for new texts) // (Ok to not get a font specification - must just rely on the family and style in that case) - if (result_family == QUERY_STYLE_NOTHING || result_style == QUERY_STYLE_NOTHING - || result_numbers == QUERY_STYLE_NOTHING) { + if (result_family == QUERY_STYLE_NOTHING || + result_style == QUERY_STYLE_NOTHING || + result_numbers == QUERY_STYLE_NOTHING) { query.readFromPrefs("/tools/text"); } @@ -326,44 +269,14 @@ void TextEdit::onReadSelection ( gboolean dostyle, gboolean /*docontent*/ ) setPreviewText (fontspec, phrase); - if (query.text_anchor.computed == SP_CSS_TEXT_ANCHOR_START) { - if (query.text_align.computed == SP_CSS_TEXT_ALIGN_JUSTIFY) { - align_justify.set_active(); - } else { - align_left.set_active(); - } - } else if (query.text_anchor.computed == SP_CSS_TEXT_ANCHOR_MIDDLE) { - align_center.set_active(); - } else { - align_right.set_active(); - } - - if (query.writing_mode.computed == SP_CSS_WRITING_MODE_LR_TB) { - text_horizontal.set_active(); - } else { - text_vertical.set_active(); - } - - /* - double height; - if (query.line_height.normal) height = Inkscape::Text::Layout::LINE_HEIGHT_NORMAL; - else if (query.line_height.unit == SP_CSS_UNIT_PERCENT) - height = query.line_height.value; - else height = query.line_height.computed; - gchar *sstr = g_strdup_printf ("%d%%", (int) floor(height * 100 + 0.5)); - - gtk_entry_set_text ((GtkEntry *) gtk_bin_get_child ((GtkBin *) spacing_combo), sstr); - g_free(sstr); - */ - // Update font variant widget //int result_variants = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTVARIANTS); int result_features = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTFEATURESETTINGS); vari_vbox.update( &query, result_features == QUERY_STYLE_MULTIPLE_DIFFERENT, fontspec ); - } + blocked = false; } @@ -371,6 +284,7 @@ void TextEdit::onReadSelection ( gboolean dostyle, gboolean /*docontent*/ ) void TextEdit::setPreviewText (Glib::ustring font_spec, Glib::ustring phrase) { if (font_spec.empty()) { + preview_label.set_markup(""); return; } @@ -383,12 +297,9 @@ void TextEdit::setPreviewText (Glib::ustring font_spec, Glib::ustring phrase) pt_size = std::min(pt_size, 100.0); // Pango font size is in 1024ths of a point - // C++11: Glib::ustring size = std::to_string( int(pt_size * PANGO_SCALE) ); - std::ostringstream size_st; - size_st << int(pt_size * PANGO_SCALE); // Markup code expects integers - + Glib::ustring size = std::to_string( int(pt_size * PANGO_SCALE) ); Glib::ustring markup = "<span font=\'" + font_spec_escaped + - "\' size=\'" + size_st.str() + "\'>" + phrase_escaped + "</span>"; + "\' size=\'" + size + "\'>" + phrase_escaped + "</span>"; preview_label.set_markup(markup.c_str()); } @@ -469,32 +380,6 @@ SPCSSAttr *TextEdit::fillTextStyle () sp_repr_css_set_property (css, "font-size", os.str().c_str()); } - // Layout - if ( align_left.get_active() ) { - sp_repr_css_set_property (css, "text-anchor", "start"); - sp_repr_css_set_property (css, "text-align", "start"); - } else if ( align_center.get_active() ) { - sp_repr_css_set_property (css, "text-anchor", "middle"); - sp_repr_css_set_property (css, "text-align", "center"); - } else if ( align_right.get_active() ){ - sp_repr_css_set_property (css, "text-anchor", "end"); - sp_repr_css_set_property (css, "text-align", "end"); - } else { - // Align Justify - sp_repr_css_set_property (css, "text-anchor", "start"); - sp_repr_css_set_property (css, "text-align", "justify"); - } - - if (text_horizontal.get_active()) { - sp_repr_css_set_property (css, "writing-mode", "lr"); - } else { - sp_repr_css_set_property (css, "writing-mode", "tb"); - } - - // Note that SVG 1.1 does not support line-height but we use it. - // const gchar *sstr = gtk_combo_box_text_get_active_text ((GtkComboBoxText *) spacing_combo); - // sp_repr_css_set_property (css, "line-height", sstr); - // Font variants vari_vbox.fill_css( css ); @@ -563,116 +448,49 @@ void TextEdit::onApply() blocked = false; } -void TextEdit::onTextChange (GtkTextBuffer *text_buffer, TextEdit *self) +void TextEdit::onChange() { - if (!self || self->blocked) { + if (blocked) { return; } - SPItem *text = self->getSelectedTextItem(); + SPItem *text = getSelectedTextItem(); GtkTextIter start; GtkTextIter end; gtk_text_buffer_get_bounds (text_buffer, &start, &end); gchar *str = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE); - Glib::ustring fontspec = sp_font_selector_get_fontspec(self->fsel); - if( !fontspec.empty() ) { - const gchar *phrase = str && *str ? str : self->samplephrase.c_str(); - self->setPreviewText(fontspec, phrase); - } else { - self->preview_label.set_markup(""); - } + Glib::ustring fontspec = sp_font_selector_get_fontspec(fsel); + const gchar *phrase = str && *str ? str : samplephrase.c_str(); + setPreviewText(fontspec, phrase); g_free (str); if (text) { - self->apply_button.set_sensitive ( true ); - //self->onApply(); - } - self->setasdefault_button.set_sensitive ( true); -} - -void TextEdit::onFontChange(SPFontSelector * /*fontsel*/, gchar* fontspec, TextEdit *self) -{ - GtkTextIter start, end; - gchar *str; - - if (!self || self->blocked) - return; - - SPItem *text = self->getSelectedTextItem (); - - gtk_text_buffer_get_bounds (self->text_buffer, &start, &end); - str = gtk_text_buffer_get_text (self->text_buffer, &start, &end, TRUE); - - if (fontspec) { - const gchar *phrase = str && *str ? str : self->samplephrase.c_str(); - self->setPreviewText(fontspec, phrase); - } else { - self->preview_label.set_markup(""); - } - g_free(str); - - if (text) { - self->apply_button.set_sensitive ( true ); - //self->onApply(); - } - self->setasdefault_button.set_sensitive ( true ); - -} - -void TextEdit::onFontVariantChange(TextEdit *self) -{ - if( self->blocked ) - return; - - SPItem *text = self->getSelectedTextItem (); - - if (text) { - self->apply_button.set_sensitive ( true ); + apply_button.set_sensitive ( true ); } - self->setasdefault_button.set_sensitive ( true ); + setasdefault_button.set_sensitive ( true); } -void TextEdit::onStartOffsetChange(GtkTextBuffer * /*text_buffer*/, TextEdit *self) +void TextEdit::onTextChange (GtkTextBuffer *text_buffer, TextEdit *self) { - SPItem *text = self->getSelectedTextItem(); - if (text && SP_IS_TEXT_TEXTPATH(text)) - { - SPTextPath *tp = SP_TEXTPATH(text->firstChild()); - const gchar *sstr = gtk_combo_box_text_get_active_text(reinterpret_cast<GtkComboBoxText *>(self->startOffset)); - tp->setAttribute("startOffset", sstr); - - DocumentUndo::maybeDone(SP_ACTIVE_DESKTOP->getDocument(), "startOffset", SP_VERB_CONTEXT_TEXT, _("Set text style")); - } + self->onChange(); } -void TextEdit::onToggle() +void TextEdit::onFontChange(SPFontSelector * /*fontsel*/, gchar* fontspec, TextEdit *self) { - if (blocked) - return; - - SPItem *text = getSelectedTextItem (); - - if (text) { - apply_button.set_sensitive ( true ); - //onApply(); - } - setasdefault_button.set_sensitive ( true ); + self->onChange(); } - -void TextEdit::onLineSpacingChange(GtkComboBox* /*widget*/, gpointer data) +void TextEdit::onFontVariantChange(TextEdit *self) { - TextEdit *self = static_cast<TextEdit *>(data); - if (!self || self->blocked) + if( self->blocked ) return; SPItem *text = self->getSelectedTextItem (); if (text) { self->apply_button.set_sensitive ( true ); - //self->onApply(); } self->setasdefault_button.set_sensitive ( true ); } diff --git a/src/ui/dialog/text-edit.h b/src/ui/dialog/text-edit.h index 35b051b6f..f28bc4eaf 100644 --- a/src/ui/dialog/text-edit.h +++ b/src/ui/dialog/text-edit.h @@ -26,9 +26,7 @@ #include <gtkmm/notebook.h> #include <gtkmm/button.h> #include <gtkmm/frame.h> -#include <gtkmm/radiobutton.h> #include <gtkmm/scrolledwindow.h> -#include <gtkmm/separator.h> #include "ui/widget/panel.h" #include "ui/widget/frame.h" #include "ui/dialog/desktop-tracker.h" @@ -36,7 +34,6 @@ class SPItem; struct SPFontSelector; -//class FontVariants; class font_instance; class SPCSSAttr; @@ -86,8 +83,6 @@ protected: * @param content Indicates whether the modification of the user includes a style change. Actually refers to the question if we do want to show the content? (Parameter currently not used) */ void onReadSelection (gboolean style, gboolean content); - void onToggle (); - static void onLineSpacingChange (GtkComboBox* widget, gpointer data); /** * Callback invoked when the user modifies the text of the selected text object. @@ -96,9 +91,9 @@ protected: * modified the text in the selected object. The UI of the dialog is * updated. The subfunction setPreviewText updates the preview label. * - * @param text_buffer pointer to GtkTextBuffer with the text of the selected text object * @param self pointer to the current instance of the dialog. */ + void onChange (); static void onTextChange (GtkTextBuffer *text_buffer, TextEdit *self); /** @@ -124,14 +119,6 @@ protected: static void onFontVariantChange (TextEdit *self); /** - * Callback invoked when the user modifies the startOffset of text on a path. - * - * @param text_buffer pointer to the GtkTextBuffer with the text of the selected text object. - * @param self pointer to the current instance of the dialog. - */ - static void onStartOffsetChange(GtkTextBuffer *text_buffer, TextEdit *self); - - /** * Get the selected text off the main canvas. * * @return SPItem pointer to the selected text object @@ -155,18 +142,6 @@ protected: SPCSSAttr *fillTextStyle (); /** - * Helper function to style radio buttons with icons, tooltips. - * - * styleButton is used when creating the dialog. - * - * @param button pointer to the button which is created - * @param tooltip pointer to its tooltip string - * @param iconname string identifying the icon to be shown - * @param group_button group to which the radio button belongs to - */ - void styleButton(Gtk::RadioButton *button, gchar const *tooltip, gchar const *iconname, Gtk::RadioButton *group_button ); - - /** * Can be invoked for setting the desktop. Currently not used. */ void setDesktop(SPDesktop *desktop); @@ -187,41 +162,33 @@ private: */ Gtk::Notebook notebook; + // Tab 1: Font ---------------------- // Gtk::VBox font_vbox; Gtk::Label font_label; + Gtk::Box fontsel_hbox; SPFontSelector *fsel; + Gtk::Label preview_label; // Share with variants tab? - Gtk::Box layout_hbox; - Gtk::RadioButton align_left; - Gtk::RadioButton align_center; - Gtk::RadioButton align_right; - Gtk::RadioButton align_justify; - Gtk::Separator align_sep; - Gtk::RadioButton text_vertical; - Gtk::RadioButton text_horizontal; - Gtk::Separator text_sep; - - GtkWidget *spacing_combo; - - GtkWidget *startOffset; - - Gtk::Label preview_label; - - Gtk::Label text_label; + // Tab 2: Text ---------------------- // Gtk::VBox text_vbox; + Gtk::Label text_label; + Gtk::ScrolledWindow scroller; GtkWidget *text_view; // TODO - Convert this to a Gtk::TextView, but GtkSpell doesn't seem to work with it GtkTextBuffer *text_buffer; + // Tab 3: Variants ----------------- // Inkscape::UI::Widget::FontVariants vari_vbox; Gtk::Label vari_label; - + + // Shared ------- ------------------ // Gtk::HBox button_row; Gtk::Button setasdefault_button; Gtk::Button close_button; Gtk::Button apply_button; + // Signals SPDesktop *desktop; DesktopTracker deskTrack; sigc::connection desktopChangeConn; @@ -230,8 +197,11 @@ private: sigc::connection selectModifiedConn; sigc::connection fontVariantChangedConn; + // Other bool blocked; const Glib::ustring samplephrase; + + TextEdit(TextEdit const &d); TextEdit operator=(TextEdit const &d); }; |
