diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-07-27 23:01:20 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-07-28 08:55:03 +0000 |
| commit | c95148c6586247aecc863d1e7847d4a75d676189 (patch) | |
| tree | 64256051494df2298b94273f7a69b9466175261d /src | |
| parent | Merge branch 'master' of gitlab.com:asiersarasua/inkscape (diff) | |
| download | inkscape-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.cpp | 62 | ||||
| -rw-r--r-- | src/desktop.h | 5 | ||||
| -rw-r--r-- | src/display/sp-canvas.cpp | 17 | ||||
| -rw-r--r-- | src/object/sp-namedview.cpp | 8 | ||||
| -rw-r--r-- | src/ui/desktop/menubar.cpp | 35 | ||||
| -rw-r--r-- | src/verbs.cpp | 12 |
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); |
