summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/dialog/text-edit.cpp278
-rw-r--r--src/ui/dialog/text-edit.h58
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);
};