summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorJabiertxof <jtx@jtx>2017-03-16 19:08:44 +0000
committerJabiertxof <jtx@jtx>2017-03-16 19:08:44 +0000
commit8330d0ef2b97c73121ead78ea9fbcec6ee01f879 (patch)
tree1b1717d1706ee6ebfecc800f2cc80430eb0450e0 /src/widgets
parentupdate to trunk (diff)
parentFix rendering when canvas rotated. General code clean-up and documentation. (diff)
downloadinkscape-8330d0ef2b97c73121ead78ea9fbcec6ee01f879.tar.gz
inkscape-8330d0ef2b97c73121ead78ea9fbcec6ee01f879.zip
Update to trunk
(bzr r13645.1.170)
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/arc-toolbar.cpp91
-rw-r--r--src/widgets/desktop-widget.cpp110
-rw-r--r--src/widgets/gimp/ruler.cpp5
-rw-r--r--src/widgets/mesh-toolbar.cpp1
-rw-r--r--src/widgets/text-toolbar.cpp165
-rw-r--r--src/widgets/toolbox.cpp5
6 files changed, 256 insertions, 121 deletions
diff --git a/src/widgets/arc-toolbar.cpp b/src/widgets/arc-toolbar.cpp
index 9b408a7b2..56eeb8922 100644
--- a/src/widgets/arc-toolbar.cpp
+++ b/src/widgets/arc-toolbar.cpp
@@ -148,7 +148,7 @@ static void sp_arctb_open_state_changed( EgeSelectOneAction *act, GObject *tbl )
SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" ));
if (DocumentUndo::getUndoSensitive(desktop->getDocument())) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setBool("/tools/shapes/arc/open", ege_select_one_action_get_active(act) != 0);
+ prefs->setInt("/tools/shapes/arc/arc_type", ege_select_one_action_get_active(act));
}
// quit if run by the attr_changed listener
@@ -159,35 +159,43 @@ static void sp_arctb_open_state_changed( EgeSelectOneAction *act, GObject *tbl )
// in turn, prevent listener from responding
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
- bool modmade = false;
- if ( ege_select_one_action_get_active(act) != 0 ) {
- auto itemlist= desktop->getSelection()->items();
- for(auto i=itemlist.begin();i!=itemlist.end();++i){
- SPItem *item = *i;
- if (SP_IS_GENERICELLIPSE(item)) {
- Inkscape::XML::Node *repr = item->getRepr();
- repr->setAttribute("sodipodi:open", "true");
- item->updateRepr();
- modmade = true;
- }
- }
- } else {
- auto itemlist= desktop->getSelection()->items();
- for(auto i=itemlist.begin();i!=itemlist.end();++i){
- SPItem *item = *i;
- if (SP_IS_GENERICELLIPSE(item)) {
- Inkscape::XML::Node *repr = item->getRepr();
- repr->setAttribute("sodipodi:open", NULL);
- item->updateRepr();
- modmade = true;
- }
+ int mode = ege_select_one_action_get_active(act);
+ Glib::ustring arc_type = "slice";
+ bool open = false;
+ switch (mode) {
+ case 0:
+ arc_type = "slice";
+ open = false;
+ break;
+ case 1:
+ arc_type = "arc";
+ open = true;
+ break;
+ case 2:
+ arc_type = "chord";
+ open = true; // For backward compat, not truly open but chord most like arc.
+ break;
+ default:
+ std::cerr << "sp_arctb_open_state_changed: bad arc type: " << mode << std::endl;
+ }
+
+ bool modmade = false;
+ auto itemlist= desktop->getSelection()->items();
+ for(auto i=itemlist.begin();i!=itemlist.end();++i){
+ SPItem *item = *i;
+ if (SP_IS_GENERICELLIPSE(item)) {
+ Inkscape::XML::Node *repr = item->getRepr();
+ repr->setAttribute("sodipodi:open", (open?"true":NULL) );
+ repr->setAttribute("sodipodi:arc-type", arc_type.c_str());
+ item->updateRepr();
+ modmade = true;
}
}
if (modmade) {
DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_ARC,
- _("Arc: Change open/closed"));
+ _("Arc: Changed arc type"));
}
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
@@ -234,14 +242,22 @@ static void arc_tb_event_attr_changed(Inkscape::XML::Node *repr, gchar const * /
sp_arctb_sensitivize( tbl, gtk_adjustment_get_value(adj1), gtk_adjustment_get_value(adj2) );
- char const *openstr = NULL;
- openstr = repr->attribute("sodipodi:open");
+ char const *arctypestr = NULL;
+ arctypestr = repr->attribute("sodipodi:arc-type");
+ if (!arctypestr) { // For old files.
+ char const *openstr = NULL;
+ openstr = repr->attribute("sodipodi:open");
+ arctypestr = (openstr ? "arc" : "slice");
+ }
+
EgeSelectOneAction *ocb = EGE_SELECT_ONE_ACTION( g_object_get_data( tbl, "open_action" ) );
- if (openstr) {
+ if (!strcmp(arctypestr,"slice")) {
+ ege_select_one_action_set_active( ocb, 0 );
+ } else if (!strcmp(arctypestr,"arc")) {
ege_select_one_action_set_active( ocb, 1 );
} else {
- ege_select_one_action_set_active( ocb, 0 );
+ ege_select_one_action_set_active( ocb, 2 );
}
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
@@ -338,25 +354,32 @@ void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObjec
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
}
- /* Segments / Pie checkbox */
+ /* Arc: Slice, Arc, Chord */
{
GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
GtkTreeIter iter;
gtk_list_store_append( model, &iter );
gtk_list_store_set( model, &iter,
- 0, _("Closed arc"),
- 1, _("Switch to segment (closed shape with two radii)"),
+ 0, _("Slice"),
+ 1, _("Switch to slice (closed shape with two radii)"),
2, INKSCAPE_ICON("draw-ellipse-segment"),
-1 );
gtk_list_store_append( model, &iter );
gtk_list_store_set( model, &iter,
- 0, _("Open Arc"),
+ 0, _("Arc (Open)"),
1, _("Switch to arc (unclosed shape)"),
2, INKSCAPE_ICON("draw-ellipse-arc"),
-1 );
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("Chord"),
+ 1, _("Switch to chord (closed shape)"),
+ 2, INKSCAPE_ICON("draw-ellipse-chord"),
+ -1 );
+
EgeSelectOneAction* act = ege_select_one_action_new( "ArcOpenAction", (""), (""), NULL, GTK_TREE_MODEL(model) );
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
g_object_set_data( holder, "open_action", act );
@@ -368,8 +391,8 @@ void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObjec
ege_select_one_action_set_icon_size( act, secondarySize );
ege_select_one_action_set_tooltip_column( act, 1 );
- bool isClosed = !prefs->getBool("/tools/shapes/arc/open", false);
- ege_select_one_action_set_active( act, isClosed ? 0 : 1 );
+ int arc_type = prefs->getInt("/tools/shapes/arc/arc_type", 0);
+ ege_select_one_action_set_active( act, arc_type );
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_arctb_open_state_changed), holder );
}
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index f0d0541c2..122b19e22 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -66,12 +66,6 @@
#include <gtkmm/cssprovider.h>
#include <gtkmm/paned.h>
#include <gtkmm/messagedialog.h>
-#include <iomanip>
-
-#if defined (SOLARIS) && (SOLARIS == 8)
-#include "round.h"
-using Inkscape::round;
-#endif
using Inkscape::UI::Widget::UnitTracker;
using Inkscape::UI::UXManager;
@@ -79,14 +73,6 @@ using Inkscape::UI::ToolboxFactory;
using ege::AppearTimeTracker;
using Inkscape::Util::unit_table;
-enum {
- ACTIVATE,
- DEACTIVATE,
- MODIFIED,
- EVENT_CONTEXT_CHANGED,
- LAST_SIGNAL
-};
-
//---------------------------------------------------------------------
/* SPDesktopWidget */
@@ -606,7 +592,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
dtw->zoom_update = g_signal_connect (G_OBJECT (dtw->zoom_status), "value_changed", G_CALLBACK (sp_dtw_zoom_value_changed), dtw);
dtw->zoom_update = g_signal_connect (G_OBJECT (dtw->zoom_status), "populate_popup", G_CALLBACK (sp_dtw_zoom_populate_popup), dtw);
auto css_provider_spinbutton = Gtk::CssProvider::create();
- css_provider_spinbutton->load_from_data("* { padding-left: 2; padding-right: 2; padding-top: 0; padding-bottom: 0;}");
+ css_provider_spinbutton->load_from_data("* { padding-left: 2px; padding-right: 2px; padding-top: 0px; padding-bottom: 0px;}");
auto zoomstat = Glib::wrap(dtw->zoom_status);
zoomstat->set_name("ZoomStatus");
auto context_zoom = zoomstat->get_style_context();
@@ -881,7 +867,7 @@ sp_desktop_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
double newshortside = MIN(newarea.width(), newarea.height());
zoom *= newshortside / oldshortside;
}
- dtw->desktop->zoom_absolute(area.midpoint()[Geom::X], area.midpoint()[Geom::Y], zoom);
+ dtw->desktop->zoom_absolute_center_point (area.midpoint(), zoom);
// TODO - Should call show_dialogs() from sp_namedview_window_from_document only.
// But delaying the call to here solves dock sizing issues on OS X, (see #171579)
@@ -911,7 +897,7 @@ sp_desktop_widget_realize (GtkWidget *widget)
if (d.width() < 1.0 || d.height() < 1.0) return;
- dtw->desktop->set_display_area (d.left(), d.top(), d.right(), d.bottom(), 10);
+ dtw->desktop->set_display_area (d, 10);
dtw->updateNamedview();
}
@@ -1679,7 +1665,7 @@ SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview)
gtk_widget_set_name(dtw->menubar, "MenuBar");
gtk_widget_show_all (dtw->menubar);
SPNamedView *nv = dtw->desktop->namedview;
- gtk_box_pack_start (GTK_BOX (dtw->vbox), dtw->menubar, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (dtw->vbox), dtw->menubar, FALSE, FALSE, 0);
dtw->layoutWidgets();
gtk_spin_button_set_value(GTK_SPIN_BUTTON (dtw->rotation_status), namedview->document_rotation);
sp_namedview_set_document_rotation(namedview);
@@ -1749,9 +1735,16 @@ void SPDesktopWidget::namedviewModified(SPObject *obj, guint flags)
if (GTK_IS_CONTAINER(i->data)) {
GList *grch = gtk_container_get_children (GTK_CONTAINER(i->data));
for (GList *j = grch; j != NULL; j = j->next) {
+
if (!GTK_IS_WIDGET(j->data)) // wasn't a widget
continue;
+ // Don't apply to text toolbar. We want to be able to
+ // use different units for text. (Bug 1562217)
+ const gchar* name = gtk_widget_get_name( (GTK_WIDGET(j->data)) );
+ if (strcmp( name, "TextToolbar") == 0)
+ continue;
+
gpointer t = sp_search_by_data_recursive(GTK_WIDGET(j->data), (gpointer) "tracker");
if (t == NULL) // didn't find any tracker data
continue;
@@ -1794,15 +1787,9 @@ sp_desktop_widget_adjustment_value_changed (GtkAdjustment */*adj*/, SPDesktopWid
dtw->update = 1;
- dtw->canvas->scrollTo(gtk_adjustment_get_value(dtw->hadj),
- gtk_adjustment_get_value(dtw->vadj), FALSE);
- sp_desktop_widget_update_rulers (dtw);
-
- /* update perspective lines if we are in the 3D box tool (so that infinite ones are shown correctly) */
- //sp_box3d_context_update_lines(dtw->desktop->event_context);
- if (SP_IS_BOX3D_CONTEXT(dtw->desktop->event_context)) {
- SP_BOX3D_CONTEXT(dtw->desktop->event_context)->_vpdrag->updateLines();
- }
+ // Do not call canvas->scrollTo directly... messes up 'offset'.
+ dtw->desktop->scroll_absolute( Geom::Point(gtk_adjustment_get_value(dtw->hadj),
+ gtk_adjustment_get_value(dtw->vadj)), false);
dtw->update = 0;
}
@@ -1839,16 +1826,21 @@ sp_dtw_zoom_display_to_value (gdouble value)
static gint
sp_dtw_zoom_input (GtkSpinButton *spin, gdouble *new_val, gpointer /*data*/)
{
- gdouble new_scrolled = gtk_spin_button_get_value (spin);
- const gchar *b = gtk_entry_get_text (GTK_ENTRY (spin));
- gdouble new_typed = atof (b);
+ gchar *b = g_strdup (gtk_entry_get_text (GTK_ENTRY (spin)));
- if (sp_dtw_zoom_value_to_display (new_scrolled) == new_typed) { // the new value is set by scrolling
- *new_val = new_scrolled;
- } else { // the new value is typed in
- *new_val = sp_dtw_zoom_display_to_value (new_typed);
+ gchar *comma = g_strstr_len (b, -1, ",");
+ if (comma) {
+ *comma = '.';
}
+ char *oldlocale = g_strdup (setlocale(LC_NUMERIC, NULL));
+ setlocale (LC_NUMERIC, "C");
+ gdouble new_typed = atof (b);
+ setlocale (LC_NUMERIC, oldlocale);
+ g_free (oldlocale);
+ g_free (b);
+
+ *new_val = sp_dtw_zoom_display_to_value (new_typed);
return TRUE;
}
@@ -1869,16 +1861,21 @@ sp_dtw_zoom_output (GtkSpinButton *spin, gpointer /*data*/)
static gint
sp_dtw_rotation_input (GtkSpinButton *spin, gdouble *new_val, gpointer /*data*/)
{
- gdouble new_scrolled = gtk_spin_button_get_value (spin);
- const gchar *b = gtk_entry_get_text (GTK_ENTRY (spin));
- gdouble new_typed = atof (b);
+ gchar *b = g_strdup (gtk_entry_get_text (GTK_ENTRY (spin)));
- if (new_scrolled == new_typed) { // the new value is set by scrolling
- *new_val = new_scrolled;
- } else { // the new value is typed in
- *new_val = new_typed;
+ gchar *comma = g_strstr_len (b, -1, ",");
+ if (comma) {
+ *comma = '.';
}
+ char *oldlocale = g_strdup (setlocale(LC_NUMERIC, NULL));
+ setlocale (LC_NUMERIC, "C");
+ gdouble new_value = atof (b);
+ setlocale (LC_NUMERIC, oldlocale);
+ g_free (oldlocale);
+ g_free (b);
+
+ *new_val = new_value;
return TRUE;
}
@@ -1887,10 +1884,9 @@ sp_dtw_rotation_output (GtkSpinButton *spin, gpointer /*data*/)
{
gchar b[64];
double val = gtk_spin_button_get_value (spin);
- std::ostringstream s;
- s.imbue(std::locale(""));;
- s << std::fixed << std::setprecision(2) << val << "º";
- gtk_entry_set_text (GTK_ENTRY (spin), s.str().c_str());
+ g_snprintf (b, 64, "%7.2f°", val);
+
+ gtk_entry_set_text (GTK_ENTRY (spin), b);
return TRUE;
}
@@ -1902,9 +1898,11 @@ sp_dtw_zoom_value_changed (GtkSpinButton *spin, gpointer data)
SPDesktopWidget *dtw = SP_DESKTOP_WIDGET (data);
SPDesktop *desktop = dtw->desktop;
- Geom::Rect const d = desktop->get_display_area();
+ // Zoom around center of window
+ Geom::Rect const d_canvas = desktop->getCanvas()->getViewbox();
+ Geom::Point midpoint = desktop->w2d(d_canvas.midpoint());
g_signal_handler_block (spin, dtw->zoom_update);
- desktop->zoom_absolute (d.midpoint()[Geom::X], d.midpoint()[Geom::Y], zoom_factor);
+ desktop->zoom_absolute_center_point (midpoint, zoom_factor);
g_signal_handler_unblock (spin, dtw->zoom_update);
spinbutton_defocus (GTK_WIDGET(spin));
@@ -2045,44 +2043,44 @@ sp_dtw_rotation_populate_popup (GtkEntry */*entry*/, GtkMenu *menu, gpointer dat
}
g_list_free (children);
- item = gtk_menu_item_new_with_label ("-180º");
+ item = gtk_menu_item_new_with_label ("-180°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_minus_180), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- item = gtk_menu_item_new_with_label ("-135º");
+ item = gtk_menu_item_new_with_label ("-135°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_minus_135), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- item = gtk_menu_item_new_with_label ("-90º");
+ item = gtk_menu_item_new_with_label ("-90°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_minus_90), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- item = gtk_menu_item_new_with_label ("-45º");
+ item = gtk_menu_item_new_with_label ("-45°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_minus_45), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- item = gtk_menu_item_new_with_label ("0º");
+ item = gtk_menu_item_new_with_label ("0°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_0), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- item = gtk_menu_item_new_with_label ("45º");
+ item = gtk_menu_item_new_with_label ("45°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_45), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- item = gtk_menu_item_new_with_label ("90º");
+ item = gtk_menu_item_new_with_label ("90°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_90), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- item = gtk_menu_item_new_with_label ("135º");
+ item = gtk_menu_item_new_with_label ("135°");
g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (sp_dtw_rotate_135), dtw);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
@@ -2140,7 +2138,7 @@ static void
sp_dtw_zoom_menu_handler (SPDesktop *dt, gdouble factor)
{
Geom::Rect const d = dt->get_display_area();
- dt->zoom_absolute(d.midpoint()[Geom::X], d.midpoint()[Geom::Y], factor);
+ dt->zoom_absolute_center_point (d.midpoint(), factor);
}
diff --git a/src/widgets/gimp/ruler.cpp b/src/widgets/gimp/ruler.cpp
index 2a71b5c08..6a1f7f903 100644
--- a/src/widgets/gimp/ruler.cpp
+++ b/src/widgets/gimp/ruler.cpp
@@ -34,11 +34,10 @@
#include <cstdio>
#include "ruler.h"
-#include "round.h"
#include <glibmm/i18n.h>
#include "util/units.h"
-#define ROUND(x) ((int) ((x) + 0.5))
+#define ROUND(x) ((int) round(x))
#define GTK_PARAM_READWRITE G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB
@@ -1217,7 +1216,7 @@ sp_ruler_draw_ticks (SPRuler *ruler)
// be e.g. 641.50000000000; rounding behaviour is not defined in such a case (see round.h)
// and jitter will be apparent (upon redrawing some of the lines on the ruler might jump a
// by a pixel, and jump back on the next redraw). This is suppressed by adding 1e-9 (that's only one nanopixel ;-))
- pos = gint(Inkscape::round((cur - lower) * increment + 1e-12));
+ pos = gint(round((cur - lower) * increment + 1e-12));
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{
diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp
index 7a37376db..0ca1cc027 100644
--- a/src/widgets/mesh-toolbar.cpp
+++ b/src/widgets/mesh-toolbar.cpp
@@ -20,7 +20,6 @@
#include <gtkmm.h>
-// REVIEW THESE AT END OF REWRITE
#include "ui/widget/color-preview.h"
#include "toolbox.h"
#include "mesh-toolbar.h"
diff --git a/src/widgets/text-toolbar.cpp b/src/widgets/text-toolbar.cpp
index ba79517d2..efa5527e4 100644
--- a/src/widgets/text-toolbar.cpp
+++ b/src/widgets/text-toolbar.cpp
@@ -205,6 +205,7 @@ static void sp_text_fontsize_value_changed( Ink_ComboBoxEntry_Action *act, GObje
if (endptr == text) { // Conversion failed, non-numeric input.
g_warning( "Conversion of size text to double failed, input: %s\n", text );
g_free( text );
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
return;
}
g_free( text );
@@ -301,10 +302,23 @@ static void sp_text_fontstyle_value_changed( Ink_ComboBoxEntry_Action *act, GObj
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
sp_desktop_set_style (desktop, css, true, true);
+
+
+ // If no selected objects, set default.
+ SPStyle query(SP_ACTIVE_DOCUMENT);
+ int result_style =
+ sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTSTYLE);
+ if (result_style == QUERY_STYLE_NOTHING) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->mergeStyle("/tools/text/style", css);
+ } else {
+ // Save for undo
+ DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_TEXT,
+ _("Text: Change font style"));
+ }
+
sp_repr_css_attr_unref (css);
- DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_TEXT,
- _("Text: Change font style"));
}
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
@@ -588,17 +602,14 @@ static void sp_text_lineheight_value_changed( GtkAdjustment *adj, GObject *tbl )
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- // Only save if not relative unit
- if ( !is_relative(unit) ) {
- // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit so
- // we can save it (allows us to adjust line height value when unit changes).
- SPILength temp_length;
- Inkscape::CSSOStringStream temp_stream;
- temp_stream << 1 << unit->abbr;
- temp_length.read(temp_stream.str().c_str());
- prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
- g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
- }
+ // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit so
+ // we can save it (allows us to adjust line height value when unit changes).
+ SPILength temp_length;
+ Inkscape::CSSOStringStream temp_stream;
+ temp_stream << 1 << unit->abbr;
+ temp_length.read(temp_stream.str().c_str());
+ prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
+ g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
// Set css line height.
SPCSSAttr *css = sp_repr_css_attr_new ();
@@ -701,16 +712,13 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
g_return_if_fail(unit != NULL);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- // Only save if not relative unit
- if ( !is_relative(unit) ) {
- // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit.
- SPILength temp_length;
- Inkscape::CSSOStringStream temp_stream;
- temp_stream << 1 << unit->abbr;
- temp_length.read(temp_stream.str().c_str());
- prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
- g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
- }
+ // This nonsense is to get SP_CSS_UNIT_xx value corresponding to unit.
+ SPILength temp_length;
+ Inkscape::CSSOStringStream temp_stream;
+ temp_stream << 1 << unit->abbr;
+ temp_length.read(temp_stream.str().c_str());
+ prefs->setInt("/tools/text/lineheight/display_unit", temp_length.unit);
+ g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(temp_length.unit));
// Read current line height value
EgeAdjustmentAction *line_height_act =
@@ -723,7 +731,10 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
auto itemlist = selection->items();
// Convert between units
- if ((unit->abbr == "" || unit->abbr == "em") && old_unit == SP_CSS_UNIT_EX) {
+ if ((unit->abbr == "" || unit->abbr == "em") &&
+ (old_unit == SP_CSS_UNIT_NONE || old_unit == SP_CSS_UNIT_EM)) {
+ // Do nothing
+ } else if ((unit->abbr == "" || unit->abbr == "em") && old_unit == SP_CSS_UNIT_EX) {
line_height *= 0.5;
} else if ((unit->abbr) == "ex" && (old_unit == SP_CSS_UNIT_EM || old_unit == SP_CSS_UNIT_NONE) ) {
line_height *= 2.0;
@@ -1130,6 +1141,54 @@ static void sp_text_orientation_changed( EgeSelectOneAction *act, GObject *tbl )
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
}
+static void sp_text_direction_changed( EgeSelectOneAction *act, GObject *tbl )
+{
+ // quit if run by the _changed callbacks
+ if (g_object_get_data(G_OBJECT(tbl), "freeze")) {
+ return;
+ }
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+
+ int mode = ege_select_one_action_get_active( act );
+
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ switch (mode)
+ {
+ case 0:
+ {
+ sp_repr_css_set_property (css, "direction", "ltr");
+ break;
+ }
+
+ case 1:
+ {
+ sp_repr_css_set_property (css, "direction", "rtl");
+ break;
+ }
+ }
+
+ SPStyle query(SP_ACTIVE_DOCUMENT);
+ int result_numbers =
+ sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
+
+ // If querying returned nothing, update default style.
+ if (result_numbers == QUERY_STYLE_NOTHING)
+ {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->mergeStyle("/tools/text/style", css);
+ }
+
+ sp_desktop_set_style (SP_ACTIVE_DESKTOP, css, true, true);
+ if(result_numbers != QUERY_STYLE_NOTHING)
+ {
+ DocumentUndo::done(SP_ACTIVE_DESKTOP->getDocument(), SP_VERB_CONTEXT_TEXT,
+ _("Text: Change direction"));
+ }
+ sp_repr_css_attr_unref (css);
+
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
+}
+
/*
* Set the default list of font sizes, scaled to the users preferred unit
*/
@@ -1170,8 +1229,7 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
std::cout << "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" << std::endl;
std::cout << "sp_text_toolbox_selection_changed: start " << count << std::endl;
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = desktop->getSelection();
+ Inkscape::Selection *selection = (SP_ACTIVE_DESKTOP)->getSelection();
auto itemlist0= selection->items();
for(auto i=itemlist0.begin();i!=itemlist0.end(); ++i) {
const gchar* id = (*i)->getId();
@@ -1494,6 +1552,15 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
ege_select_one_action_update_sensitive( textOrientationAction );
+ // Direction
+ int activeButton4 = 0;
+ if (query.direction.computed == SP_CSS_DIRECTION_LTR ) activeButton4 = 0;
+ if (query.direction.computed == SP_CSS_DIRECTION_RTL ) activeButton4 = 1;
+
+ EgeSelectOneAction* textDirectionAction =
+ EGE_SELECT_ONE_ACTION( g_object_get_data( tbl, "TextDirectionAction" ) );
+ ege_select_one_action_set_active( textDirectionAction, activeButton4 );
+
}
#ifdef DEBUG_TEXT
@@ -1926,6 +1993,52 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_text_orientation_changed), holder );
}
+
+ // Text direction (predominant direction of horizontal text).
+ {
+ GtkListStore* model = gtk_list_store_new( 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN );
+
+ GtkTreeIter iter;
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("LTR"),
+ 1, _("Left to right text"),
+ 2, INKSCAPE_ICON("format-text-direction-horizontal"),
+ 3, true,
+ -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("RTL"),
+ 1, _("Right to left text"),
+ 2, INKSCAPE_ICON("format-text-direction-r2l"),
+ 3, true,
+ -1 );
+
+ EgeSelectOneAction* act = ege_select_one_action_new( "TextDirectionAction", // Name
+ _("Text direction"), // Label
+ _("Text direction for normally horizontal text."), // Tooltip
+ NULL, // Icon name
+ GTK_TREE_MODEL(model) ); // Model
+
+ g_object_set( act, "short_label", "NotUsed", NULL );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ g_object_set_data( holder, "TextDirectionAction", act );
+
+ ege_select_one_action_set_appearance( act, "full" );
+ ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
+ g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
+ ege_select_one_action_set_icon_column( act, 2 );
+ ege_select_one_action_set_icon_size( act, secondarySize );
+ ege_select_one_action_set_tooltip_column( act, 1 );
+ ege_select_one_action_set_sensitive_column( act, 3 );
+
+ gint mode = prefs->getInt("/tools/text/text_direction", 0);
+ ege_select_one_action_set_active( act, mode );
+ g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_text_direction_changed), holder );
+ }
+
/* Line height unit tracker */
UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
tracker->prependUnit(unit_table.getUnit("")); // No unit
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 126eac9cd..016eafdaa 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -204,6 +204,7 @@ static struct {
SP_VERB_CONTEXT_ERASER_PREFS, "/tools/eraser", _("TBD")},
{ "/tools/lpetool", "lpetool_toolbox", 0, sp_lpetool_toolbox_prep, "LPEToolToolbar",
SP_VERB_CONTEXT_LPETOOL_PREFS, "/tools/lpetool", _("TBD")},
+ // If you change TextToolbar here, change it also in desktop-widget.cpp
{ "/tools/text", "text_toolbox", 0, sp_text_toolbox_prep, "TextToolbar",
SP_VERB_INVALID, 0, 0},
{ "/tools/dropper", "dropper_toolbox", 0, sp_dropper_toolbox_prep, "DropperToolbar",
@@ -529,6 +530,8 @@ static gchar const * ui_descr =
" <toolitem action='TextWritingModeAction' />"
" <separator />"
" <toolitem action='TextOrientationAction' />"
+ " <separator />"
+ " <toolitem action='TextDirectionAction' />"
" </toolbar>"
" <toolbar name='LPEToolToolbar'>"
@@ -1428,7 +1431,7 @@ void setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop)
auto kludge = dataHolders[aux_toolboxes[i].type_name];
auto holder = gtk_grid_new();
- gtk_widget_set_name( holder, "ToolbarHolder" );
+ gtk_widget_set_name( holder, aux_toolboxes[i].ui_name );
gtk_grid_attach( GTK_GRID(holder), kludge, 2, 0, 1, 1);
gchar* tmp = g_strdup_printf( "/ui/%s", aux_toolboxes[i].ui_name );
GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, tmp );