summaryrefslogtreecommitdiffstats
path: root/share/extensions/jessyink_key_bindings.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:24:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:24:48 +0000
commitcca66b9ec4e494c1d919bff0f71a820d8afab1fa (patch)
tree146f39ded1c938019e1ed42d30923c2ac9e86789 /share/extensions/jessyink_key_bindings.py
parentInitial commit. (diff)
downloadinkscape-cca66b9ec4e494c1d919bff0f71a820d8afab1fa.tar.xz
inkscape-cca66b9ec4e494c1d919bff0f71a820d8afab1fa.zip
Adding upstream version 1.2.2.upstream/1.2.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'share/extensions/jessyink_key_bindings.py')
-rwxr-xr-xshare/extensions/jessyink_key_bindings.py193
1 files changed, 193 insertions, 0 deletions
diff --git a/share/extensions/jessyink_key_bindings.py b/share/extensions/jessyink_key_bindings.py
new file mode 100755
index 0000000..2d28a95
--- /dev/null
+++ b/share/extensions/jessyink_key_bindings.py
@@ -0,0 +1,193 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, 2009 Hannes Hochreiner
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see http://www.gnu.org/licenses/.
+#
+"""Effect to add key bindings to jessyInk slide show"""
+
+import inkex
+from inkex import Group, Script
+from jessyink_install import JessyInkMixin
+
+KEY_CODES = (
+ "LEFT",
+ "RIGHT",
+ "DOWN",
+ "UP",
+ "HOME",
+ "END",
+ "ENTER",
+ "SPACE",
+ "PAGE_UP",
+ "PAGE_DOWN",
+ "ESCAPE",
+)
+
+
+class KeyBindings(JessyInkMixin, inkex.EffectExtension):
+ """Add key bindings to slide show"""
+
+ modes = ("slide", "index", "drawing")
+
+ def set_options(self, namespace, opt_str, value):
+ """Sort through all the options and combine them"""
+ slot, action = opt_str.split("_", 1)
+ keycodes = getattr(namespace, f"{slot}KeyCodes", {})
+ charcodes = getattr(namespace, f"{slot}CharCodes", {})
+ if value:
+ for val in value.split(","):
+ val = val.strip()
+ if val in KEY_CODES:
+ keycodes[val + "_KEY"] = self.actions[slot][action]
+ elif len(val) == 1:
+ charcodes[val] = self.actions[slot][action]
+ setattr(namespace, f"{slot}KeyCodes", keycodes)
+ setattr(namespace, f"{slot}CharCodes", charcodes)
+
+ actions = {
+ "slide": {
+ "export": "slideUpdateExportLayer();",
+ "addSlide": "slideAddSlide(activeSlide);",
+ "resetTimer": "slideResetTimer();",
+ "setDuration": "slideQueryDuration();",
+ "backWithEffects": "dispatchEffects(-1);",
+ "nextWithEffects": "dispatchEffects(1);",
+ "backWithoutEffects": "skipEffects(-1);",
+ "nextWithoutEffects": "skipEffects(1);",
+ "switchToIndexMode": "toggleSlideIndex();",
+ "switchToDrawingMode": "slideSwitchToDrawingMode();",
+ "toggleProgressBar": "slideToggleProgressBarVisibility();",
+ "firstSlide": "slideSetActiveSlide(0);",
+ "lastSlide": "slideSetActiveSlide(slides.length - 1);",
+ },
+ "drawing": {
+ "undo": "drawingUndo();",
+ "switchToSlideMode": "drawingSwitchToSlideMode();",
+ "pathWidthDefault": "drawingResetPathWidth();",
+ "pathWidth1": "drawingSetPathWidth(1.0);",
+ "pathWidth3": "drawingSetPathWidth(3.0);",
+ "pathWidth5": "drawingSetPathWidth(5.0);",
+ "pathWidth7": "drawingSetPathWidth(7.0);",
+ "pathWidth9": "drawingSetPathWidth(9.0);",
+ "pathColourBlue": 'drawingSetPathColour("blue");',
+ "pathColourCyan": 'drawingSetPathColour("cyan");',
+ "pathColourGreen": 'drawingSetPathColour("green");',
+ "pathColourBlack": 'drawingSetPathColour("black");',
+ "pathColourMagenta": 'drawingSetPathColour("magenta");',
+ "pathColourOrange": 'drawingSetPathColour("orange");',
+ "pathColourRed": 'drawingSetPathColour("red");',
+ "pathColourWhite": 'drawingSetPathColour("white");',
+ "pathColourYellow": 'drawingSetPathColour("yellow");',
+ },
+ "index": {
+ "selectSlideToLeft": "indexSetPageSlide(activeSlide - 1);",
+ "selectSlideToRight": "indexSetPageSlide(activeSlide + 1);",
+ "selectSlideAbove": "indexSetPageSlide(activeSlide - INDEX_COLUMNS);",
+ "selectSlideBelow": "indexSetPageSlide(activeSlide + INDEX_COLUMNS);",
+ "previousPage": "indexSetPageSlide(activeSlide - INDEX_COLUMNS * INDEX_COLUMNS);",
+ "nextPage": "indexSetPageSlide(activeSlide + INDEX_COLUMNS * INDEX_COLUMNS);",
+ "firstSlide": "indexSetPageSlide(0);",
+ "lastSlide": "indexSetPageSlide(slides.length - 1);",
+ "switchToSlideMode": "toggleSlideIndex();",
+ "decreaseNumberOfColumns": "indexDecreaseNumberOfColumns();",
+ "increaseNumberOfColumns": "indexIncreaseNumberOfColumns();",
+ "setNumberOfColumnsToDefault": "indexResetNumberOfColumns();",
+ },
+ }
+
+ def add_arguments(self, pars):
+ pars.add_argument("--tab")
+ for slot, actions in self.actions.items():
+ for action in actions:
+ pars.add_argument(f"--{slot}_{action}")
+
+ def effect(self):
+ self.is_installed()
+
+ for name in list(self.options.__dict__):
+ if "_" in name:
+ self.set_options(self.options, name, self.options.__dict__.pop(name))
+
+ # Remove old master slide property
+ for node in self.svg.xpath(
+ "//svg:g[@jessyink:customKeyBindings='customKeyBindings']"
+ ):
+ node.delete()
+
+ # Set custom key bindings.
+ node_text = """function getCustomKeyBindingsSub()
+{
+ var keyDict = new Object();
+ keyDict[SLIDE_MODE] = new Object();
+ keyDict[INDEX_MODE] = new Object();
+ keyDict[DRAWING_MODE] = new Object();
+"""
+
+ for key, value in self.options.slideKeyCodes.items():
+ node_text += f" keyDict[SLIDE_MODE][{key}] = function() {{ {value} }};\n"
+
+ for key, value in self.options.drawingKeyCodes.items():
+ node_text += (
+ f" keyDict[DRAWING_MODE][{key}] = function() {{ {value} }};\n"
+ )
+
+ for key, value in self.options.indexKeyCodes.items():
+ node_text += f" keyDict[INDEX_MODE][{key}] = function() {{ {value} }};\n"
+
+ # Set custom char bindings.
+ node_text += """ return keyDict;
+}
+
+function getCustomCharBindingsSub()
+{
+ var charDict = new Object();
+ charDict[SLIDE_MODE] = new Object();
+ charDict[INDEX_MODE] = new Object();
+ charDict[DRAWING_MODE] = new Object();
+"""
+
+ for key, value in self.options.slideCharCodes.items():
+ node_text += (
+ f' charDict[SLIDE_MODE]["{key}"] = function() {{ {value} }};\n'
+ )
+
+ for key, value in self.options.drawingCharCodes.items():
+ node_text += (
+ f' charDict[DRAWING_MODE]["{key}"] = function() {{ {value} }};\n'
+ )
+
+ for key, value in self.options.indexCharCodes.items():
+ node_text += (
+ f' charDict[INDEX_MODE]["{key}"] = function() {{ {value} }};\n'
+ )
+
+ node_text += " return charDict;" + "\n"
+ node_text += "}" + "\n"
+
+ # Create new script node
+ group = self.svg.add(Group())
+ script = group.add(Script())
+ script.text = node_text
+ group.set("jessyink:customKeyBindings", "customKeyBindings")
+ group.set(
+ "onload",
+ "this.getCustomCharBindings = function() { "
+ "return getCustomCharBindingsSub(); }; "
+ "this.getCustomKeyBindings = function() { return getCustomKeyBindingsSub(); };",
+ )
+
+
+if __name__ == "__main__":
+ KeyBindings().run()