1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-06-24 06:13:17 +00:00
This commit is contained in:
Jermolene 2018-11-06 15:29:16 +00:00
commit d7914e3f3e
5 changed files with 116 additions and 5 deletions

View File

@ -138,6 +138,17 @@ function KeyboardManager(options) {
}); });
// Save the platform-specific name of the "meta" key // Save the platform-specific name of the "meta" key
this.metaKeyName = $tw.platform.isMac ? "cmd-" : "win-"; this.metaKeyName = $tw.platform.isMac ? "cmd-" : "win-";
this.shortcutKeysList = [], // Stores the shortcut-key descriptors
this.shortcutActionList = [], // Stores the corresponding action strings
this.shortcutParsedList = []; // Stores the parsed key descriptors
this.lookupNames = ["shortcuts"];
this.lookupNames.push($tw.platform.isMac ? "shortcuts-mac" : "shortcuts-not-mac")
this.lookupNames.push($tw.platform.isWindows ? "shortcuts-windows" : "shortcuts-not-windows");
this.lookupNames.push($tw.platform.isLinux ? "shortcuts-linux" : "shortcuts-not-linux");
this.updateShortcutLists(this.getShortcutTiddlerList());
$tw.wiki.addEventListener("change",function(changes) {
self.handleShortcutChanges(changes);
});
} }
/* /*
@ -229,10 +240,9 @@ KeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options)
result.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options)); result.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));
} }
}; };
lookupName("shortcuts"); $tw.utils.each(self.lookupNames,function(platformDescriptor) {
lookupName($tw.platform.isMac ? "shortcuts-mac" : "shortcuts-not-mac"); lookupName(platformDescriptor);
lookupName($tw.platform.isWindows ? "shortcuts-windows" : "shortcuts-not-windows"); });
lookupName($tw.platform.isLinux ? "shortcuts-linux" : "shortcuts-not-linux");
} }
} else { } else {
result.push(self.parseKeyDescriptor(keyDescriptor)); result.push(self.parseKeyDescriptor(keyDescriptor));
@ -274,6 +284,70 @@ KeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {
return false; return false;
}; };
KeyboardManager.prototype.getShortcutTiddlerList = function() {
return $tw.wiki.getTiddlersWithTag("$:/tags/KeyboardShortcut");
};
KeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {
this.shortcutTiddlers = tiddlerList;
for(var i=0; i<tiddlerList.length; i++) {
var title = tiddlerList[i],
tiddlerFields = $tw.wiki.getTiddler(title).fields;
this.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;
this.shortcutActionList[i] = tiddlerFields.text;
this.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;
}
};
KeyboardManager.prototype.handleKeydownEvent = function(event) {
var key, action;
for(var i=0; i<this.shortcutTiddlers.length; i++) {
if(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {
key = this.shortcutParsedList[i];
action = this.shortcutActionList[i];
}
}
if(key !== undefined) {
event.preventDefault();
event.stopPropagation();
$tw.rootWidget.invokeActionString(action,$tw.rootWidget);
return true;
}
return false;
};
KeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {
var shortcutConfigTiddlers = [],
handled = false;
$tw.utils.each(this.lookupNames,function(platformDescriptor) {
var descriptorString = "$:/config/" + platformDescriptor + "/";
Object.keys(changedTiddlers).forEach(function(configTiddler) {
var configString = configTiddler.substr(0, configTiddler.lastIndexOf("/") + 1);
if(configString === descriptorString) {
shortcutConfigTiddlers.push(configTiddler);
handled = true;
}
});
});
if(handled) {
return $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);
} else {
return false;
}
};
KeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {
var newList = this.getShortcutTiddlerList();
var hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :
($tw.utils.hopArray(changedTiddlers,newList) ? true :
(this.detectNewShortcuts(changedTiddlers))
);
// Re-cache shortcuts if something changed
if(hasChanged) {
this.updateShortcutLists(newList);
}
};
exports.KeyboardManager = KeyboardManager; exports.KeyboardManager = KeyboardManager;
})(); })();

View File

@ -87,6 +87,14 @@ exports.startup = function() {
}); });
// Kick off the keyboard manager // Kick off the keyboard manager
$tw.keyboardManager = new $tw.KeyboardManager(); $tw.keyboardManager = new $tw.KeyboardManager();
// Listen for shortcuts
if($tw.browser) {
$tw.utils.addEventListeners(document,[{
name: "keydown",
handlerObject: $tw.keyboardManager,
handlerMethod: "handleKeydownEvent"
}]);
}
// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers // Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers
$tw.rootWidget = new widget.widget({ $tw.rootWidget = new widget.widget({
type: "widget", type: "widget",

View File

@ -33,8 +33,16 @@ exports.startup = function() {
height = paramObject.height || "600", height = paramObject.height || "600",
variables = $tw.utils.extend({},paramObject,{currentTiddler: title}); variables = $tw.utils.extend({},paramObject,{currentTiddler: title});
// Open the window // Open the window
var srcWindow = window.open("","external-" + title,"scrollbars,width=" + width + ",height=" + height), var srcWindow,
srcDocument;
// In case that popup blockers deny opening a new window
try {
srcWindow = window.open("","external-" + title,"scrollbars,width=" + width + ",height=" + height),
srcDocument = srcWindow.document; srcDocument = srcWindow.document;
}
catch(e) {
return;
}
windows[title] = srcWindow; windows[title] = srcWindow;
// Check for reopening the same window // Check for reopening the same window
if(srcWindow.haveInitialisedWindow) { if(srcWindow.haveInitialisedWindow) {
@ -70,6 +78,12 @@ exports.startup = function() {
widgetNode.refresh(changes); widgetNode.refresh(changes);
}; };
$tw.wiki.addEventListener("change",refreshHandler); $tw.wiki.addEventListener("change",refreshHandler);
// Listen for keyboard shortcuts
$tw.utils.addEventListeners(srcDocument,[{
name: "keydown",
handlerObject: $tw.keyboardManager,
handlerMethod: "handleKeydownEvent"
}]);
srcWindow.haveInitialisedWindow = true; srcWindow.haveInitialisedWindow = true;
}); });
// Close open windows when unloading main window // Close open windows when unloading main window

View File

@ -149,6 +149,18 @@ exports.isArrayEqual = function(array1,array2) {
}); });
}; };
/*
Determine whether an array-item is an object-property
*/
exports.hopArray = function(object,array) {
for(var i=0; i<array.length; i++) {
if($tw.utils.hop(object,array[i])) {
return true;
}
}
return false;
};
/* /*
Push entries onto an array, removing them first if they already exist in the array Push entries onto an array, removing them first if they already exist in the array
array: array to modify (assumed to be free of duplicates) array: array to modify (assumed to be free of duplicates)

View File

@ -468,6 +468,9 @@ NavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {
// Update the story to insert the new draft at the top and remove any existing tiddler // Update the story to insert the new draft at the top and remove any existing tiddler
if(storyList.indexOf(draftTitle) === -1) { if(storyList.indexOf(draftTitle) === -1) {
var slot = storyList.indexOf(event.navigateFromTitle); var slot = storyList.indexOf(event.navigateFromTitle);
if(slot === -1) {
slot = this.getAttribute("openLinkFromOutsideRiver","top") === "bottom" ? storyList.length - 1 : slot;
}
storyList.splice(slot + 1,0,draftTitle); storyList.splice(slot + 1,0,draftTitle);
} }
if(storyList.indexOf(title) !== -1) { if(storyList.indexOf(title) !== -1) {