summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2018-12-02 22:41:06 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2018-12-04 20:39:35 +0000
commit8bc273fe101cf980af17c9b0e26f7c2a18930cb7 (patch)
tree46244cab8faa8dcaa9920fda8019daeca18c1d93
parentAdd a few useful lookup functions. (diff)
downloadinkscape-8bc273fe101cf980af17c9b0e26f7c2a18930cb7.tar.gz
inkscape-8bc273fe101cf980af17c9b0e26f7c2a18930cb7.zip
Added XRay
-rw-r--r--share/keys/acd-canvas.xml1
-rw-r--r--share/keys/adobe-illustrator-cs2.xml1
-rw-r--r--share/keys/carbon.xml1
-rw-r--r--share/keys/corel-draw-x4.xml1
-rw-r--r--share/keys/corel-draw-x8.xml1
-rw-r--r--share/keys/inkscape.xml6
-rw-r--r--share/keys/right-handed-illustration.xml1
-rw-r--r--share/ui/menus.xml1
-rw-r--r--src/desktop.cpp18
-rw-r--r--src/desktop.h3
-rw-r--r--src/display/sp-canvas.cpp87
-rw-r--r--src/display/sp-canvas.h3
-rw-r--r--src/ui/interface.cpp6
-rw-r--r--src/verbs.cpp6
-rw-r--r--src/verbs.h1
15 files changed, 108 insertions, 29 deletions
diff --git a/share/keys/acd-canvas.xml b/share/keys/acd-canvas.xml
index 74749e037..c3ce321f0 100644
--- a/share/keys/acd-canvas.xml
+++ b/share/keys/acd-canvas.xml
@@ -299,6 +299,7 @@ Path -> Unsmooth - Ctrl+Alt+U
<bind key="L" modifiers="Ctrl,Alt" action="ViewModeToggle" />
<bind action="ViewColorModeToggle" />
<bind action="ViewSplitModeToggle" />
+ <bind action="ViewXRayToggle" />
<!-- LAYOUT MENU -->
<!-- Needs checking
diff --git a/share/keys/adobe-illustrator-cs2.xml b/share/keys/adobe-illustrator-cs2.xml
index bf9552235..1a7cb1435 100644
--- a/share/keys/adobe-illustrator-cs2.xml
+++ b/share/keys/adobe-illustrator-cs2.xml
@@ -268,6 +268,7 @@ Last Effect Alt+Shift+Ctrl+E
<bind key="Y" modifiers="Ctrl" action="ViewModeToggle" display="true" />
<bind action="ViewColorModeToggle" />
<bind action="ViewSplitModeToggle" />
+ <bind action="ViewXRayToggle" />
<bind key="equal" modifiers="Ctrl" action="ZoomIn" display="true"/>
<bind key="minus" modifiers="Ctrl" action="ZoomOut" display="true"/>
<bind key="0" modifiers="Ctrl" action="ZoomPage" display="true"/>
diff --git a/share/keys/carbon.xml b/share/keys/carbon.xml
index f5b66ca1a..4ae4b69ea 100644
--- a/share/keys/carbon.xml
+++ b/share/keys/carbon.xml
@@ -267,6 +267,7 @@ and tooltips. Only one binding for each action may have this attribute.
<bind action="ViewColorModeGrayscale" />
<bind key="KP_6" modifiers="Cmd" action="ViewSplitModeToggle" display="true" />
+ <bind key="KP_6" modifiers="Alt" action="ViewXRayToggle" display="true" />
<!-- Edit -->
diff --git a/share/keys/corel-draw-x4.xml b/share/keys/corel-draw-x4.xml
index ffd28765d..e523b87e2 100644
--- a/share/keys/corel-draw-x4.xml
+++ b/share/keys/corel-draw-x4.xml
@@ -159,6 +159,7 @@ See default.xml for more information.
<bind key="F9" modifiers="Shift" action="ViewModeToggle" display="true" />
<bind action="ViewColorModeToggle" />
<bind action="ViewSplitModeToggle" />
+ <bind action="ViewXRayToggle" />
<!-- Path actions -->
<bind key="q" modifiers="Ctrl" action="ObjectToPath" display="true"/>
diff --git a/share/keys/corel-draw-x8.xml b/share/keys/corel-draw-x8.xml
index b2d01b84b..717038212 100644
--- a/share/keys/corel-draw-x8.xml
+++ b/share/keys/corel-draw-x8.xml
@@ -132,6 +132,7 @@ in the style of Corel DRAW X8. See default.xml for more information.
<bind key="F9" modifiers="Shift" action="ViewModeToggle" display="true" />
<bind action="ViewColorModeToggle" />
<bind action="ViewSplitModeToggle" />
+<bind action="ViewXRayToggle" />
<bind key="F4" action="ZoomDrawing" display="true"/>
<bind key="F2" action="ZoomIn" display="true" />
diff --git a/share/keys/inkscape.xml b/share/keys/inkscape.xml
index a649b3e0e..7b674b04e 100644
--- a/share/keys/inkscape.xml
+++ b/share/keys/inkscape.xml
@@ -302,6 +302,12 @@ override) the bindings in the main default.xml.
<bind key="KP_6" modifiers="Primary" action="ViewSplitModeToggle" display="true" />
<bind key="KP_6" modifiers="Primary" action="ViewSplitModeToggle" />
+
+ <bind key="6" modifiers="Alt" action="ViewXRayToggle" display="true" />
+ <bind key="6" modifiers="Alt" action="ViewXRayToggle" />
+ <bind key="KP_6" modifiers="Alt" action="ViewXRayToggle" display="true" />
+ <bind key="KP_6" modifiers="Alt" action="ViewXRayToggle" />
+
<!-- Edit -->
<bind key="z" modifiers="Primary" action="EditUndo" display="true" />
diff --git a/share/keys/right-handed-illustration.xml b/share/keys/right-handed-illustration.xml
index 6e69e37b6..a68aaa428 100644
--- a/share/keys/right-handed-illustration.xml
+++ b/share/keys/right-handed-illustration.xml
@@ -237,6 +237,7 @@ Future improvements:
<bind key="KP_Begin" modifiers="Ctrl" action="ViewModeToggle" />
<bind action="ViewColorModeToggle" />
<bind action="ViewSplitModeToggle" />
+ <bind action="ViewXRayToggle" />
<!-- Edit -->
<bind key="z" modifiers="Ctrl" action="EditUndo" display="true"/>
diff --git a/share/ui/menus.xml b/share/ui/menus.xml
index 03eb2f84f..fe1117793 100644
--- a/share/ui/menus.xml
+++ b/share/ui/menus.xml
@@ -130,6 +130,7 @@
</submenu>
<separator/>
<verb verb-id="ViewSplitModeToggle" check="yes" />
+ <verb verb-id="ViewXRayToggle" check="yes" />
<verb verb-id="ToggleGrid" check="yes" />
<verb verb-id="ToggleGuides" check="yes" />
<verb verb-id="ViewCmsToggle" check="yes" />
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,