summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Merry <dev@randomguy3.me.uk>2013-08-04 15:00:58 +0100
committerAlex Merry <dev@randomguy3.me.uk>2013-08-04 15:00:58 +0100
commit5ccc1c9d048f9ea026f914837636311bd49dc769 (patch)
treeb0c840114f5e87095efcbbfae1f9647b560d4728
parent999787db751b1cf7911457e86b9c537dc2bccf33 (diff)
GTK: holding down ctrl pans, regardless of tool
If the user presses the LMB whilst holding ctrl, we bypass the tool and enter panning mode, where dragging the mouse moves around the graph, until the LMB is released.
-rw-r--r--tikzit/src/gtk/GraphEditorPanel.m66
1 files changed, 46 insertions, 20 deletions
diff --git a/tikzit/src/gtk/GraphEditorPanel.m b/tikzit/src/gtk/GraphEditorPanel.m
index c87e53e..c1fdffd 100644
--- a/tikzit/src/gtk/GraphEditorPanel.m
+++ b/tikzit/src/gtk/GraphEditorPanel.m
@@ -29,11 +29,17 @@
@class GraphRenderer;
@class WidgetSurface;
+static const InputMask zoomPanMask = ControlMask;
+
/**
- * Mostly just a multiplexer
+ * Mostly just a multiplexer, but also handles zoom and pan
+ * when ctrl is held
*/
@interface GraphInputHandler : NSObject<InputDelegate> {
GraphEditorPanel *panel;
+ NSPoint dragOrigin;
+ NSPoint oldGraphOrigin;
+ BOOL zoomPanActive;
}
- (id) initForPanel:(GraphEditorPanel*)p;
@end
@@ -68,6 +74,9 @@
[super dealloc];
}
+- (GraphRenderer*) renderer {
+ return renderer;
+}
- (TikzDocument*) document {
return [renderer document];
}
@@ -135,12 +144,19 @@
[super dealloc];
}
-// FIXME: use a local copy of HandTool to implement CTRL-dragging
+// FIXME: share code with HandTool?
- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask {
- [panel grabTool];
- id<Tool> tool = [panel activeTool];
- if ([tool respondsToSelector:@selector(mousePressAt:withButton:andMask:)]) {
- [tool mousePressAt:pos withButton:button andMask:mask];
+ if (mask == zoomPanMask && button == LeftButton) {
+ dragOrigin = pos;
+ oldGraphOrigin = [[[panel renderer] transformer] origin];
+ zoomPanActive = YES;
+ } else {
+ zoomPanActive = NO;
+ [panel grabTool];
+ id<Tool> tool = [panel activeTool];
+ if ([tool respondsToSelector:@selector(mousePressAt:withButton:andMask:)]) {
+ [tool mousePressAt:pos withButton:button andMask:mask];
+ }
}
}
@@ -153,33 +169,43 @@
}
- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask {
- if (![panel hasTool])
- return;
- id<Tool> tool = [panel activeTool];
- if ([tool respondsToSelector:@selector(mouseReleaseAt:withButton:andMask:)]) {
- [tool mouseReleaseAt:pos withButton:button andMask:mask];
+ if (zoomPanActive && button == LeftButton) {
+ zoomPanActive = NO;
+ } else if ([panel hasTool]) {
+ id<Tool> tool = [panel activeTool];
+ if ([tool respondsToSelector:@selector(mouseReleaseAt:withButton:andMask:)]) {
+ [tool mouseReleaseAt:pos withButton:button andMask:mask];
+ }
}
}
- (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)buttons andMask:(InputMask)mask {
- if (![panel hasTool])
- return;
- id<Tool> tool = [panel activeTool];
- if ([tool respondsToSelector:@selector(mouseMoveTo:withButtons:andMask:)]) {
- [tool mouseMoveTo:pos withButtons:buttons andMask:mask];
+ if (zoomPanActive && (buttons & LeftButton)) {
+ NSPoint newGraphOrigin = oldGraphOrigin;
+ newGraphOrigin.x += pos.x - dragOrigin.x;
+ newGraphOrigin.y += pos.y - dragOrigin.y;
+ [[[panel renderer] transformer] setOrigin:newGraphOrigin];
+ [[panel renderer] invalidateGraph];
+ } else if ([panel hasTool]) {
+ id<Tool> tool = [panel activeTool];
+ if ([tool respondsToSelector:@selector(mouseMoveTo:withButtons:andMask:)]) {
+ [tool mouseMoveTo:pos withButtons:buttons andMask:mask];
+ }
}
}
- (void) mouseScrolledAt:(NSPoint)pos inDirection:(ScrollDirection)dir withMask:(InputMask)mask {
- id<Tool> tool = [panel activeTool];
- if (mask == ControlMask) {
+ if (mask == zoomPanMask) {
if (dir == ScrollUp) {
[panel zoomInAboutPoint:pos];
} else if (dir == ScrollDown) {
[panel zoomOutAboutPoint:pos];
}
- } else if ([panel hasTool] && [tool respondsToSelector:@selector(mouseScrolledAt:inDirection:withMask:)]) {
- [tool mouseScrolledAt:pos inDirection:dir withMask:mask];
+ } else {
+ id<Tool> tool = [panel activeTool];
+ if ([panel hasTool] && [tool respondsToSelector:@selector(mouseScrolledAt:inDirection:withMask:)]) {
+ [tool mouseScrolledAt:pos inDirection:dir withMask:mask];
+ }
}
}