diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/desktop.cpp | 18 | ||||
| -rw-r--r-- | src/desktop.h | 3 | ||||
| -rw-r--r-- | src/display/sp-canvas.cpp | 87 | ||||
| -rw-r--r-- | src/display/sp-canvas.h | 3 | ||||
| -rw-r--r-- | src/ui/interface.cpp | 6 | ||||
| -rw-r--r-- | src/verbs.cpp | 6 | ||||
| -rw-r--r-- | src/verbs.h | 1 |
7 files changed, 95 insertions, 29 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp index 68eca8cdf..b13f24e67 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -123,6 +123,7 @@ SPDesktop::SPDesktop() _display_mode(Inkscape::RENDERMODE_NORMAL) , _display_color_mode(Inkscape::COLORMODE_NORMAL) , _split_canvas(false) + , _xray(false) , _widget(nullptr) , _guides_message_context(nullptr) , _active(false) @@ -1618,6 +1619,23 @@ void SPDesktop::toggleSplitMode() } } +void SPDesktop::toggleXRay() +{ + Gtk::Window *parent = getToplevel(); + if (parent) { + _xray = !_xray; + if (_split_canvas && _xray) { + return toggleSplitMode(); + } + SPDesktopWidget *dtw = static_cast<SPDesktopWidget *>(parent->get_data("desktopwidget")); + GtkAllocation allocation; + gtk_widget_get_allocation(GTK_WIDGET(dtw->canvas), &allocation); + SPCanvas *canvas = getCanvas(); + canvas->requestRedraw(canvas->_x0, canvas->_y0, canvas->_x0 + allocation.width, + canvas->_y0 + allocation.height); + } +} + void SPDesktop::showGrids(bool show, bool dirty_document) { grids_visible = show; diff --git a/src/desktop.h b/src/desktop.h index ddac3fb67..64a76a9a4 100644 --- a/src/desktop.h +++ b/src/desktop.h @@ -403,7 +403,9 @@ public: void toggleGrids(); void toggleSplitMode(); + void toggleXRay(); bool splitMode() const { return _split_canvas; }; + bool xrayMode() const { return _xray; }; void toggleSnapGlobal(); bool gridsEnabled() const { return grids_visible; }; void showGrids(bool show, bool dirty_document = true); @@ -537,6 +539,7 @@ private: std::list<DesktopAffine> transforms_past; std::list<DesktopAffine> transforms_future; bool _split_canvas; + bool _xray; bool _quick_zoom_enabled; ///< Signifies that currently we're in quick zoom mode DesktopAffine _quick_zoom_affine; ///< The transform of the screen before quick zoom diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index dfad167ce..a0abe8d7e 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -361,6 +361,27 @@ void sp_canvas_item_dispose(GObject *object) G_OBJECT_CLASS(sp_canvas_item_parent_class)->dispose(object); } +void sp_reset_spliter(SPCanvas * canvas) { + canvas->_spliter = Geom::OptIntRect(); + canvas->_spliter_area = Geom::OptIntRect(); + canvas->_spliter_control = Geom::OptIntRect(); + canvas->_spliter_top = Geom::OptIntRect(); + canvas->_spliter_bottom = Geom::OptIntRect(); + canvas->_spliter_left = Geom::OptIntRect(); + canvas->_spliter_right = Geom::OptIntRect(); + canvas->_spliter_control_pos = Geom::Point(); + canvas->_spliter_in_control_pos = Geom::Point(); + canvas->_split_value = 0.5; + canvas->_split_vertical = true; + canvas->_split_inverse = false; + canvas->_split_hover_vertical = false; + canvas->_split_hover_horizontal = false; + canvas->_split_hover = false; + canvas->_split_pressed = false; + canvas->_split_control_pressed = false; + canvas->_split_dragging = false; +} + void sp_canvas_item_real_destroy(SPCanvasItem *object) { g_signal_handlers_destroy(object); @@ -1001,6 +1022,8 @@ static void sp_canvas_init(SPCanvas *canvas) canvas->_split_pressed = false; canvas->_split_control_pressed = false; canvas->_split_dragging = false; + canvas->_xray_value = 100; + canvas->_xray_clip = false; canvas->_changecursor = 0; bool _is_dragging; @@ -1717,17 +1740,10 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event) double hide_vert = 1 / (allocation.height / (double)cursor_pos[Geom::Y]); double value = canvas->_split_vertical ? hide_horiz : hide_vert; if (hide_horiz < 0.03 || hide_horiz > 0.97 || hide_vert < 0.03 || hide_vert > 0.97) { - SPDesktop *desktop = SP_ACTIVE_DESKTOP; if (desktop && desktop->event_context) { desktop->event_context->sp_event_context_update_cursor(); desktop->toggleSplitMode(); - canvas->_split_pressed = false; - canvas->_split_hover = false; - canvas->_split_hover_vertical = false; - canvas->_split_hover_horizontal = false; - canvas->_split_value = 0.5; - canvas->_split_vertical = true; - canvas->_split_inverse = false; + sp_reset_spliter(canvas); } } else { canvas->_split_value = value; @@ -1739,6 +1755,12 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event) canvas->addIdle(); status = 1; } else { + if (desktop && desktop->event_context && desktop->xrayMode()) { + sp_reset_spliter(canvas); + canvas->dirtyAll(); + canvas->addIdle(); + status = 1; + } canvas->_state = event->state; canvas->pickCurrentItem(reinterpret_cast<GdkEvent *>(event)); status = canvas->emitEvent(reinterpret_cast<GdkEvent *>(event)); @@ -1753,6 +1775,8 @@ int SPCanvas::handle_motion(GtkWidget *widget, GdkEventMotion *event) bool contains = canvas->_spliter_area.contains(cursor_pos); bool setoutline = canvas->_split_inverse ? !contains : contains; arena->drawing.setOutlineSensitive(setoutline); + } else if (desktop->xrayMode()) { + arena->drawing.setOutlineSensitive(true); } else { arena->drawing.setOutlineSensitive(false); } @@ -1807,7 +1831,9 @@ void SPCanvas::paintSingleBuffer(Geom::IntRect const &paint_rect, Geom::IntRect paint_rect.height() * _device_scale, stride); cairo_surface_set_device_scale(imgs, _device_scale, _device_scale); - +/* if (_xray_clip) { + + } */ buf.ct = cairo_create(imgs); cairo_save(buf.ct); @@ -2306,24 +2332,7 @@ int SPCanvas::paint() coord2y = allocation.y + allocation.height - hruler_gap; _spliter_area = Geom::OptIntRect(coord1x, coord1y, coord2x, coord2y); } else { - canvas->_spliter = Geom::OptIntRect(); - canvas->_spliter_area = Geom::OptIntRect(); - canvas->_spliter_control = Geom::OptIntRect(); - canvas->_spliter_top = Geom::OptIntRect(); - canvas->_spliter_bottom = Geom::OptIntRect(); - canvas->_spliter_left = Geom::OptIntRect(); - canvas->_spliter_right = Geom::OptIntRect(); - canvas->_spliter_control_pos = Geom::Point(); - canvas->_spliter_in_control_pos = Geom::Point(); - canvas->_split_value = 0.5; - canvas->_split_vertical = true; - canvas->_split_inverse = false; - canvas->_split_hover_vertical = false; - canvas->_split_hover_horizontal = false; - canvas->_split_hover = false; - canvas->_split_pressed = false; - canvas->_split_control_pressed = false; - canvas->_split_dragging = false; + sp_reset_spliter(canvas); } cairo_rectangle_int_t crect = { _x0, _y0, int(allocation.width * split_x), int(allocation.height * split_y) }; split_x = !_split_vertical ? 0 : _split_value; @@ -2377,6 +2386,30 @@ int SPCanvas::paint() arena->drawing.setExact(exact); arena->drawing.setRenderMode(rm); canvas->paintSpliter(); + } else if (desktop && desktop->xrayMode()) { + _xray_clip = true; + Geom::Point xray_orig = desktop->point(); + xray_orig *= desktop->current_zoom(); + arena = SP_CANVAS_ARENA(desktop->drawing); + Inkscape::RenderMode rm = arena->drawing.renderMode(); + arena->drawing.setRenderMode(Inkscape::RENDERMODE_OUTLINE); + bool exact = arena->drawing.getExact(); + arena->drawing.setExact(false); + if (!paintRect(xray_orig[0]-_xray_value, + xray_orig[1]-_xray_value, + xray_orig[0]-_xray_value + (_xray_value * 2), + xray_orig[1]-_xray_value + (_xray_value * 2))) + { + // Aborted + arena->drawing.setExact(exact); + arena->drawing.setRenderMode(rm); + cairo_region_destroy(to_draw); + cairo_region_destroy(to_draw_outline); + return FALSE; + }; + arena->drawing.setExact(exact); + arena->drawing.setRenderMode(rm); + _xray_clip = false; } // we've had a full unaborted redraw, reset the full redraw counter diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h index 24980e743..04ba8496e 100644 --- a/src/display/sp-canvas.h +++ b/src/display/sp-canvas.h @@ -194,7 +194,8 @@ public: bool _split_pressed; bool _split_control_pressed; bool _split_dragging; - + double _xray_value; + bool _xray_clip; bool _is_dragging; guint _changecursor; double _dx0; diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp index 084174173..aa322250b 100644 --- a/src/ui/interface.cpp +++ b/src/ui/interface.cpp @@ -623,8 +623,12 @@ static gboolean checkitem_update(GtkWidget *widget, cairo_t * /*cr*/, gpointer u } else if (!strcmp(action->id, "ViewCmsToggle")) { ison = dt->colorProfAdjustEnabled(); - } else if (!strcmp(action->id, "ViewSplitModeToggle")) { + } + else if (!strcmp(action->id, "ViewSplitModeToggle")) { ison = dt->splitMode(); + } + else if (!strcmp(action->id, "ViewXRayToggle")) { + ison = dt->xrayMode(); } else { ison = getViewStateFromPref(view, pref); } diff --git a/src/verbs.cpp b/src/verbs.cpp index c93088147..8fa8132aa 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -2149,6 +2149,9 @@ void ZoomVerb::perform(SPAction *action, void *data) case SP_VERB_VIEW_TOGGLE_SPLIT: dt->toggleSplitMode(); break; + case SP_VERB_VIEW_TOGGLE_XRAY: + dt->toggleXRay(); + break; case SP_VERB_VIEW_CMS_TOGGLE: dt->toggleColorProfAdjust(); break; @@ -3125,6 +3128,9 @@ Verb *Verb::_base_verbs[] = { new ZoomVerb(SP_VERB_VIEW_TOGGLE_SPLIT, "ViewSplitModeToggle", N_("Toggle _Split View Mode"), N_("Split canvas in 2 to show outline"), nullptr), + new ZoomVerb(SP_VERB_VIEW_TOGGLE_XRAY, "ViewXRayToggle", N_("Toggle _XRay Mode"), + N_("XRay arround cursor"), nullptr), + new ZoomVerb(SP_VERB_VIEW_CMS_TOGGLE, "ViewCmsToggle", N_("Color-managed view"), N_("Toggle color-managed display for this document window"), INKSCAPE_ICON("color-management")), diff --git a/src/verbs.h b/src/verbs.h index 7aa62ff01..595d2aacf 100644 --- a/src/verbs.h +++ b/src/verbs.h @@ -304,6 +304,7 @@ enum { // SP_VERB_VIEW_COLOR_MODE_PRINT_COLORS_PREVIEW, SP_VERB_VIEW_COLOR_MODE_TOGGLE, SP_VERB_VIEW_TOGGLE_SPLIT, + SP_VERB_VIEW_TOGGLE_XRAY, SP_VERB_VIEW_CMS_TOGGLE, SP_VERB_VIEW_ICON_PREVIEW, |
