summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-07-27 23:01:20 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-07-28 08:55:03 +0000
commitc95148c6586247aecc863d1e7847d4a75d676189 (patch)
tree64256051494df2298b94273f7a69b9466175261d /src
parentMerge branch 'master' of gitlab.com:asiersarasua/inkscape (diff)
downloadinkscape-c95148c6586247aecc863d1e7847d4a75d676189.tar.gz
inkscape-c95148c6586247aecc863d1e7847d4a75d676189.zip
Add verbs update checkbuttons in menu. Also do improvements requested in https://gitlab.com/inkscape/inkscape/issues/323 and improve XRay rendering
Diffstat (limited to 'src')
-rw-r--r--src/desktop.cpp62
-rw-r--r--src/desktop.h5
-rw-r--r--src/display/sp-canvas.cpp17
-rw-r--r--src/object/sp-namedview.cpp8
-rw-r--r--src/ui/desktop/menubar.cpp35
-rw-r--r--src/verbs.cpp12
6 files changed, 110 insertions, 29 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index 6fc3f8d05..4e9b84839 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -768,7 +768,7 @@ SPItem *SPDesktop::getGroupAtPoint(Geom::Point const &p) const
* Returns the mouse point in document coordinates; if mouse is
* outside the canvas, returns the center of canvas viewpoint.
*/
-Geom::Point SPDesktop::point() const
+Geom::Point SPDesktop::point(bool outside_infinite) const
{
Geom::Point p = _widget->getPointer();
Geom::Point pw = sp_canvas_window_to_world (canvas, p);
@@ -778,10 +778,13 @@ Geom::Point SPDesktop::point() const
p = w2d(pw);
return p;
}
-
- Geom::Point r0 = w2d(r.min());
- Geom::Point r1 = w2d(r.max());
- return (r0 + r1) / 2.0;
+ if (outside_infinite) {
+ return Geom::Point(Geom::infinity(), Geom::infinity());
+ } else {
+ Geom::Point r0 = w2d(r.min());
+ Geom::Point r1 = w2d(r.max());
+ return (r0 + r1) / 2.0;
+ }
}
@@ -1417,22 +1420,33 @@ void
SPDesktop::toggleRulers()
{
_widget->toggleRulers();
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_TOGGLE_RULERS);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
void
SPDesktop::toggleScrollbars()
{
_widget->toggleScrollbars();
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_TOGGLE_SCROLLBARS);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
-void SPDesktop::toggleToolbar(gchar const *toolbar_name)
+void SPDesktop::toggleToolbar(gchar const *toolbar_name, unsigned int verbenum)
{
Glib::ustring pref_path = getLayoutPrefPath(this) + toolbar_name + "/state";
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
gboolean visible = prefs->getBool(pref_path, true);
prefs->setBool(pref_path, !visible);
-
+ Inkscape::Verb *verb = Inkscape::Verb::get(verbenum);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
layoutWidget();
}
@@ -1573,11 +1587,19 @@ void SPDesktop::clearWaitingCursor() {
void SPDesktop::toggleColorProfAdjust()
{
_widget->toggleColorProfAdjust();
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_VIEW_CMS_TOGGLE);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
void SPDesktop::toggleGuidesLock()
{
sp_namedview_guides_toggle_lock(this->getDocument(), namedview);
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_EDIT_GUIDES_TOGGLE_LOCK);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
bool SPDesktop::colorProfAdjustEnabled()
@@ -1596,14 +1618,28 @@ void SPDesktop::toggleGrids()
namedview->writeNewGrid(this->getDocument(), Inkscape::GRID_RECTANGULAR);
showGrids(true);
}
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_TOGGLE_GRID);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
void SPDesktop::toggleSplitMode()
{
if (this->getToplevel()) {
_split_canvas = !_split_canvas;
- SPCanvas *canvas = getCanvas();
- canvas->requestFullRedraw();
+ if (_split_canvas && _xray) {
+ _xray = !_xray;
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_VIEW_TOGGLE_XRAY);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
+ }
+ canvas->requestUpdate();
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_VIEW_TOGGLE_SPLIT);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
}
@@ -1613,9 +1649,17 @@ void SPDesktop::toggleXRay()
_xray = !_xray;
if (_split_canvas && _xray) {
_split_canvas = !_split_canvas;
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_VIEW_TOGGLE_SPLIT);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
SPCanvas *canvas = getCanvas();
canvas->requestFullRedraw();
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_VIEW_TOGGLE_XRAY);
+ if (verb) {
+ _menu_update.emit(verb->get_code());
+ }
}
}
diff --git a/src/desktop.h b/src/desktop.h
index 09ac4a634..450e0b2cf 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -206,6 +206,7 @@ public:
Glib::ustring _reconstruction_old_layer_id;
sigc::signal<void, sp_verb_t> _tool_changed;
+ sigc::signal<void, unsigned int> _menu_update;
sigc::signal<void, SPObject *> _layer_changed_signal;
sigc::signal<bool, const SPCSSAttr *>::accumulated<StopOnTrue> _set_style_signal;
sigc::signal<int, SPStyle *, int>::accumulated<StopOnNonZero> _query_style_signal;
@@ -323,7 +324,7 @@ public:
SPItem *getItemFromListAtPointBottom(const std::vector<SPItem*> &list, Geom::Point const &p) const;
SPItem *getItemAtPoint(Geom::Point const &p, bool into_groups, SPItem *upto = nullptr) const;
SPItem *getGroupAtPoint(Geom::Point const &p) const;
- Geom::Point point() const;
+ Geom::Point point(bool outside_infinite = false) const;
void prev_transform();
void next_transform();
@@ -416,7 +417,7 @@ public:
void toggleSnapGlobal();
bool gridsEnabled() const { return grids_visible; };
void showGrids(bool show, bool dirty_document = true);
- void toggleToolbar(gchar const *toolbar_name);
+ void toggleToolbar(gchar const *toolbar_name, unsigned int verbenum);
bool is_iconified();
bool is_darktheme();
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index f77e6f31d..64fca5926 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -1743,17 +1743,14 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event)
status = 1;
} else {
if (desktop && desktop->event_context && desktop->xrayMode()) {
- if (!canvas->_xray) {
+ if (canvas->_xray) {
sp_reset_spliter(canvas);
}
Geom::Point prev_orig = canvas->_xray_orig;
- canvas->_xray_orig = desktop->point();
+ canvas->_xray_orig = desktop->point(true);
canvas->_xray_orig *= desktop->current_zoom();
canvas->_xray = true;
- if (!Geom::are_near(prev_orig, canvas->_xray_orig)) { //to avoid redraw when outside
- canvas->dirtyAll();
- canvas->addIdle();
- }
+ canvas->addIdle();
status = 1;
} else {
canvas->_xray = false;
@@ -1888,6 +1885,9 @@ void SPCanvas::paintXRayBuffer(Geom::IntRect const &paint_rect, Geom::IntRect co
// initialized.
if (_backing_store == nullptr)
return;
+ if (!canvas_rect.contains(paint_rect) && !canvas_rect.intersects(paint_rect)) {
+ return;
+ }
Geom::IntRect rect_moved = Geom::IntRect::from_xywh(_x0, _y0, _x0 + paint_rect.width(), _y0 + paint_rect.height());
SPCanvasBuf buf;
buf.buf = nullptr;
@@ -1943,6 +1943,7 @@ void SPCanvas::paintXRayBuffer(Geom::IntRect const &paint_rect, Geom::IntRect co
// Mark the painted rectangle un-clean to remove old x-ray when mouse change position
gtk_widget_queue_draw_area(GTK_WIDGET(this), paint_rect.left() - _x0, paint_rect.top() - _y0, paint_rect.width(),
paint_rect.height());
+ dirtyRect(paint_rect);
}
void SPCanvas::paintSpliter()
@@ -2424,6 +2425,7 @@ int SPCanvas::paint()
cairo_region_get_rectangle(to_draw, i, &crect);
if (!paintRect(crect.x, crect.y, crect.x + crect.width, crect.y + crect.height)) {
// Aborted
+ cairo_region_subtract_rectangle(_clean_region, &crect);
cairo_region_destroy(to_draw);
cairo_region_destroy(to_draw_outline);
return FALSE;
@@ -2442,6 +2444,7 @@ int SPCanvas::paint()
// Aborted
arena->drawing.setExact(exact);
arena->drawing.setRenderMode(rm);
+ cairo_region_subtract_rectangle(_clean_region, &crect);
cairo_region_destroy(to_draw);
cairo_region_destroy(to_draw_outline);
return FALSE;
@@ -2459,7 +2462,7 @@ int SPCanvas::paint()
arena->drawing.setExact(false);
Geom::IntRect canvas_rect = Geom::IntRect::from_xywh(_x0, _y0, allocation.width, allocation.height);
Geom::IntRect _xray_rect = Geom::IntRect::from_xywh(_xray_orig[0] - _xray_radius, _xray_orig[1] - _xray_radius,
- (_xray_radius * 2), (_xray_radius * 2));
+ (_xray_radius * 2), (_xray_radius * 2));
paintXRayBuffer(_xray_rect, canvas_rect);
arena->drawing.setExact(exact);
arena->drawing.setRenderMode(rm);
diff --git a/src/object/sp-namedview.cpp b/src/object/sp-namedview.cpp
index b17af346c..c22184d52 100644
--- a/src/object/sp-namedview.cpp
+++ b/src/object/sp-namedview.cpp
@@ -990,7 +990,13 @@ void sp_namedview_toggle_guides(SPDocument *doc, Inkscape::XML::Node *repr)
DocumentUndo::setUndoSensitive(doc, false);
sp_repr_set_boolean(repr, "showguides", v);
DocumentUndo::setUndoSensitive(doc, saved);
-
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ if (desktop) {
+ Inkscape::Verb *verb = Inkscape::Verb::get(SP_VERB_TOGGLE_GUIDES);
+ if (verb) {
+ desktop->_menu_update.emit(verb->get_code());
+ }
+ }
doc->setModifiedSinceSave();
}
diff --git a/src/ui/desktop/menubar.cpp b/src/ui/desktop/menubar.cpp
index d69783563..8d72d49ad 100644
--- a/src/ui/desktop/menubar.cpp
+++ b/src/ui/desktop/menubar.cpp
@@ -57,9 +57,34 @@ deselect_action(SPAction *action)
// Trigger action
static void
-item_activate(Gtk::MenuItem* menuitem, SPAction* action)
+item_activate(Gtk::MenuItem * menuitem, SPAction* action)
{
- sp_action_perform(action, nullptr);
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ bool freeze = prefs->getBool("/menu/freeze", false);
+ if (!freeze) {
+ prefs->setBool("/menu/freeze", true);
+ sp_action_perform(action, nullptr);
+ prefs->setBool("/menu/freeze", false);
+ }
+}
+
+void
+activate_checkmenu(unsigned int emited_verb, unsigned int recibe_verb, Gtk::CheckMenuItem* menuitem)
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ bool freeze = prefs->getBool("/menu/freeze", false);
+ if (!freeze) {
+ prefs->setBool("/menu/freeze", true);
+ if (emited_verb == recibe_verb)
+ {
+ if (menuitem->get_active()) {
+ menuitem->property_active() = false;
+ } else {
+ menuitem->property_active() = true;
+ }
+ }
+ prefs->setBool("/menu/freeze", false);
+ }
}
// Change label name (used in the Undo/Redo menu items).
@@ -252,7 +277,7 @@ build_menu_check_item_from_verb(SPAction* action)
// Set initial state before connecting signals.
checkitem_update(menuitem, action);
-
+
menuitem->signal_toggled().connect(
sigc::bind<Gtk::CheckMenuItem*, SPAction*>(sigc::ptr_fun(&item_activate), menuitem, action));
menuitem->signal_select().connect( sigc::bind<SPAction*>(sigc::ptr_fun(&select_action), action));
@@ -427,13 +452,15 @@ build_menu(Gtk::MenuShell* menu, Inkscape::XML::Node* xml, Inkscape::UI::View::V
Gtk::CheckMenuItem* menuitem = build_menu_check_item_from_verb(action);
if (menuitem) {
+ SP_ACTIVE_DESKTOP->_menu_update.connect(sigc::bind(sigc::ptr_fun(&activate_checkmenu), verb->get_code(), menuitem));
menu->append(*menuitem);
}
-
+
} else if (menu_ptr->attribute("radio") != nullptr) {
Gtk::MenuItem* menuitem = build_menu_item_from_verb(action, show_icons_curr, true, &group);
if (menuitem) {
+ // TODO: if necesary update a radio in the future we can folloe the previus checkbutton code
if (menu_ptr->attribute("default") != nullptr) {
auto radiomenuitem = dynamic_cast<Gtk::RadioMenuItem*>(menuitem);
if (radiomenuitem) {
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 7a9f32a0e..66446cf41 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -2035,22 +2035,22 @@ void ZoomVerb::perform(SPAction *action, void *data)
dt->toggleScrollbars();
break;
case SP_VERB_TOGGLE_COMMANDS_TOOLBAR:
- dt->toggleToolbar("commands");
+ dt->toggleToolbar("commands", SP_VERB_TOGGLE_COMMANDS_TOOLBAR);
break;
case SP_VERB_TOGGLE_SNAP_TOOLBAR:
- dt->toggleToolbar("snaptoolbox");
+ dt->toggleToolbar("snaptoolbox", SP_VERB_TOGGLE_SNAP_TOOLBAR);
break;
case SP_VERB_TOGGLE_TOOL_TOOLBAR:
- dt->toggleToolbar("toppanel");
+ dt->toggleToolbar("toppanel", SP_VERB_TOGGLE_TOOL_TOOLBAR);
break;
case SP_VERB_TOGGLE_TOOLBOX:
- dt->toggleToolbar("toolbox");
+ dt->toggleToolbar("toolbox", SP_VERB_TOGGLE_TOOLBOX);
break;
case SP_VERB_TOGGLE_PALETTE:
- dt->toggleToolbar("panels");
+ dt->toggleToolbar("panels", SP_VERB_TOGGLE_PALETTE);
break;
case SP_VERB_TOGGLE_STATUSBAR:
- dt->toggleToolbar("statusbar");
+ dt->toggleToolbar("statusbar", SP_VERB_TOGGLE_STATUSBAR);
break;
case SP_VERB_TOGGLE_GUIDES:
sp_namedview_toggle_guides(doc, repr);