mirror of
https://github.com/piskelapp/piskel.git
synced 2023-08-10 21:12:52 +03:00
feature : add keyboard shortcuts : added help panel displayed on shift+?
This commit is contained in:
parent
c033d65cde
commit
e0b76f5329
77
css/cheatsheet.css
Normal file
77
css/cheatsheet.css
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#cheatsheet-wrapper {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 10000;
|
||||||
|
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
padding: 50px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cheatsheet-container {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 20px 10%;
|
||||||
|
border-radius: 3px;
|
||||||
|
background: rgba(0,0,0,0.9);
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cheatsheet-container h3 {
|
||||||
|
font-size:24px;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cheatsheet-section {
|
||||||
|
float: left;
|
||||||
|
width : 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cheatsheet-shortcut {
|
||||||
|
overflow: hidden;
|
||||||
|
margin: 10px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cheatsheet-icon.tool-icon {
|
||||||
|
float: left;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
height: 30px;
|
||||||
|
width: 30px;
|
||||||
|
margin: 0 20px 0 0;
|
||||||
|
|
||||||
|
background-size: 20px 20px;
|
||||||
|
background-position: 5px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cheatsheet-description {
|
||||||
|
font-family:Courier;
|
||||||
|
color: white;
|
||||||
|
font-size : 13px;
|
||||||
|
margin-left: 20px;
|
||||||
|
line-height : 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cheatsheet-key {
|
||||||
|
display : inline-block;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
padding: 0 10px;
|
||||||
|
|
||||||
|
border : 1px solid gold;
|
||||||
|
border-radius: 2px;
|
||||||
|
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
text-align: center;
|
||||||
|
font-family:Courier;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size : 18px;
|
||||||
|
color: gold;
|
||||||
|
}
|
@ -12,6 +12,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="css/forms.css">
|
<link rel="stylesheet" type="text/css" href="css/forms.css">
|
||||||
<link rel="stylesheet" type="text/css" href="css/settings.css">
|
<link rel="stylesheet" type="text/css" href="css/settings.css">
|
||||||
<link rel="stylesheet" type="text/css" href="css/tools.css">
|
<link rel="stylesheet" type="text/css" href="css/tools.css">
|
||||||
|
<link rel="stylesheet" type="text/css" href="css/cheatsheet.css">
|
||||||
<link rel="stylesheet" type="text/css" href="css/bootstrap/bootstrap.css">
|
<link rel="stylesheet" type="text/css" href="css/bootstrap/bootstrap.css">
|
||||||
<link rel="stylesheet" type="text/css" href="css/bootstrap/bootstrap-tooltip-custom.css">
|
<link rel="stylesheet" type="text/css" href="css/bootstrap/bootstrap-tooltip-custom.css">
|
||||||
<link rel="stylesheet" type="text/css" href="css/preview-film-section.css">
|
<link rel="stylesheet" type="text/css" href="css/preview-film-section.css">
|
||||||
@ -53,9 +54,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
<iframe src="templates/cheatsheet.html" onload="iframeloader.onLoad(event)" data-iframe-loader="display"></iframe>
|
||||||
<script type="text/javascript" src="piskel-boot.js"></script>
|
<script type="text/javascript" src="piskel-boot.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -46,5 +46,7 @@ var Events = {
|
|||||||
CUT: "CUT",
|
CUT: "CUT",
|
||||||
COPY: "COPY",
|
COPY: "COPY",
|
||||||
PASTE: "PASTE",
|
PASTE: "PASTE",
|
||||||
SELECT_TOOL : "SELECT_TOOL"
|
SELECT_TOOL : "SELECT_TOOL",
|
||||||
|
TOGGLE_HELP : "TOGGLE_HELP",
|
||||||
|
SWAP_COLORS : "SWAP_COLORS"
|
||||||
};
|
};
|
@ -57,6 +57,9 @@
|
|||||||
this.toolController = new pskl.controller.ToolController();
|
this.toolController = new pskl.controller.ToolController();
|
||||||
this.toolController.init();
|
this.toolController.init();
|
||||||
|
|
||||||
|
this.cheatsheetService = new pskl.service.keyboard.CheatsheetService();
|
||||||
|
this.cheatsheetService.init();
|
||||||
|
|
||||||
this.paletteController = new pskl.controller.PaletteController();
|
this.paletteController = new pskl.controller.PaletteController();
|
||||||
this.paletteController.init();
|
this.paletteController.init();
|
||||||
|
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
this.updateColorPicker_(color, $('#secondary-color-picker'));
|
this.updateColorPicker_(color, $('#secondary-color-picker'));
|
||||||
}, this));
|
}, this));
|
||||||
|
|
||||||
|
$.subscribe(Events.SWAP_COLORS, this.onSwapColorsEvent_.bind(this));
|
||||||
|
|
||||||
// Initialize colorpickers:
|
// Initialize colorpickers:
|
||||||
var colorPicker = $('#color-picker');
|
var colorPicker = $('#color-picker');
|
||||||
colorPicker.val(Constants.DEFAULT_PEN_COLOR);
|
colorPicker.val(Constants.DEFAULT_PEN_COLOR);
|
||||||
@ -43,6 +45,15 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ns.PaletteController.prototype.onSwapColorsEvent_ = function () {
|
||||||
|
// TODO : juliandescottes : oooooh huge crap ... palette controller doesn't know which colors are selected !!
|
||||||
|
// JC Denton commented : 'what a shame'
|
||||||
|
var primaryColor = pskl.app.drawingController.primaryColor;
|
||||||
|
var secondaryColor = pskl.app.drawingController.secondaryColor;
|
||||||
|
$.publish(Events.PRIMARY_COLOR_SELECTED, [secondaryColor]);
|
||||||
|
$.publish(Events.SECONDARY_COLOR_SELECTED, [primaryColor]);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
|
@ -109,7 +109,7 @@
|
|||||||
*/
|
*/
|
||||||
ns.ToolController.prototype.createToolMarkup_ = function() {
|
ns.ToolController.prototype.createToolMarkup_ = function() {
|
||||||
var currentTool, toolMarkup = '', extraClass;
|
var currentTool, toolMarkup = '', extraClass;
|
||||||
// TODO(vincz): Tools rendering order is not enforced by the data stucture (this.toolInstances), fix that.
|
|
||||||
for(var i = 0 ; i < this.tools.length ; i++) {
|
for(var i = 0 ; i < this.tools.length ; i++) {
|
||||||
var tool = this.tools[i];
|
var tool = this.tools[i];
|
||||||
var instance = tool.instance;
|
var instance = tool.instance;
|
||||||
|
@ -9,7 +9,11 @@
|
|||||||
"x" : Events.CUT,
|
"x" : Events.CUT,
|
||||||
"c" : Events.COPY,
|
"c" : Events.COPY,
|
||||||
"v" : Events.PASTE
|
"v" : Events.PASTE
|
||||||
}
|
},
|
||||||
|
"shift" : {
|
||||||
|
"?" : Events.TOGGLE_HELP
|
||||||
|
},
|
||||||
|
"x" : Events.SWAP_COLORS
|
||||||
};
|
};
|
||||||
|
|
||||||
// See ToolController
|
// See ToolController
|
||||||
@ -41,6 +45,8 @@
|
|||||||
if(charkey) {
|
if(charkey) {
|
||||||
if (this.isCtrlKeyPressed_(evt)) {
|
if (this.isCtrlKeyPressed_(evt)) {
|
||||||
eventToTrigger = this.keyboardActions_.ctrl[charkey];
|
eventToTrigger = this.keyboardActions_.ctrl[charkey];
|
||||||
|
} else if (this.isShiftKeyPressed_(evt)) {
|
||||||
|
eventToTrigger = this.keyboardActions_.shift[charkey];
|
||||||
} else {
|
} else {
|
||||||
eventToTrigger = this.keyboardActions_[charkey];
|
eventToTrigger = this.keyboardActions_[charkey];
|
||||||
}
|
}
|
||||||
@ -56,6 +62,10 @@
|
|||||||
return this.isMac_() ? evt.metaKey : evt.ctrlKey;
|
return this.isMac_() ? evt.metaKey : evt.ctrlKey;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ns.KeyboardEventService.prototype.isShiftKeyPressed_ = function (evt) {
|
||||||
|
return evt.shiftKey;
|
||||||
|
};
|
||||||
|
|
||||||
ns.KeyboardEventService.prototype.isMac_ = function () {
|
ns.KeyboardEventService.prototype.isMac_ = function () {
|
||||||
return navigator.appVersion.indexOf("Mac") != -1;
|
return navigator.appVersion.indexOf("Mac") != -1;
|
||||||
};
|
};
|
||||||
|
88
js/service/keyboard/CheatsheetService.js
Normal file
88
js/service/keyboard/CheatsheetService.js
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
(function () {
|
||||||
|
var ns = $.namespace('pskl.service.keyboard');
|
||||||
|
|
||||||
|
ns.CheatsheetService = function () {
|
||||||
|
this.isDisplayed_ = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.CheatsheetService.prototype.init = function () {
|
||||||
|
this.cheatsheetEl_ = document.getElementById('cheatsheet-wrapper');
|
||||||
|
if (!this.cheatsheetEl_) {
|
||||||
|
throw 'cheatsheetEl_ DOM element could not be retrieved';
|
||||||
|
}
|
||||||
|
this.initMarkup_();
|
||||||
|
$.subscribe(Events.TOGGLE_HELP, this.toggleCheatsheet_.bind(this));
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.CheatsheetService.prototype.toggleCheatsheet_ = function () {
|
||||||
|
if (this.isDisplayed_) {
|
||||||
|
this.hideCheatsheet_();
|
||||||
|
} else {
|
||||||
|
this.showCheatsheet_();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.CheatsheetService.prototype.showCheatsheet_ = function () {
|
||||||
|
this.cheatsheetEl_.style.display = 'block';
|
||||||
|
this.isDisplayed_ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ns.CheatsheetService.prototype.hideCheatsheet_ = function () {
|
||||||
|
this.cheatsheetEl_.style.display = 'none';
|
||||||
|
this.isDisplayed_ = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.CheatsheetService.prototype.initMarkup_ = function () {
|
||||||
|
this.initMarkupForTools_();
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
ns.CheatsheetService.prototype.initMarkupForTools_ = function () {
|
||||||
|
var shortcutTemplate = pskl.utils.Template.get('cheatsheet-shortcut-template');
|
||||||
|
|
||||||
|
var toolShortcutsContainer = $('.cheatsheet-tool-shortcuts', this.cheatsheetEl_).get(0);
|
||||||
|
var tools = pskl.app.toolController.tools;
|
||||||
|
for (var i = 0 ; i < tools.length ; i++) {
|
||||||
|
var tool = tools[i];
|
||||||
|
var shortcutEl = pskl.utils.Template.createFromHTML(
|
||||||
|
pskl.utils.Template.replace(shortcutTemplate, {
|
||||||
|
shortcutIcon : 'tool-icon ' + tool.instance.toolId,
|
||||||
|
shortcutDescription : tool.instance.helpText,
|
||||||
|
shortcutKey : tool.shortcut
|
||||||
|
})
|
||||||
|
);
|
||||||
|
toolShortcutsContainer.appendChild(shortcutEl);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.initMarkupForMisc_ = function () {
|
||||||
|
var shortcutTemplate = pskl.utils.Template.get('cheatsheet-shortcut-template');
|
||||||
|
|
||||||
|
var miscShortcutsContainer = $('.cheatsheet-misc-shortcuts', this.cheatsheetEl_).get(0);
|
||||||
|
var toDescriptor = function (shortcut, description) {
|
||||||
|
return {shortcut:shortcut, description:description};
|
||||||
|
};
|
||||||
|
var miscKeys = [
|
||||||
|
toDescriptor('X', 'Swap primary/secondary colors'),
|
||||||
|
toDescriptor('ctrl + X', 'Cut selection'),
|
||||||
|
toDescriptor('ctrl + C', 'Copy selection'),
|
||||||
|
toDescriptor('ctrl + V', 'Paste selection'),
|
||||||
|
toDescriptor('ctrl + Z', 'Undo'),
|
||||||
|
toDescriptor('ctrl + Y', 'Redo')
|
||||||
|
];
|
||||||
|
for (var i = 0 ; i < miscKeys.length ; i++) {
|
||||||
|
var key = miscKeys[i];
|
||||||
|
var shortcutEl = pskl.utils.Template.createFromHTML(
|
||||||
|
pskl.utils.Template.replace(shortcutTemplate, {
|
||||||
|
shortcutIcon : '',
|
||||||
|
shortcutDescription : key.description,
|
||||||
|
shortcutKey : key.shortcut
|
||||||
|
})
|
||||||
|
);
|
||||||
|
miscShortcutsContainer.appendChild(shortcutEl);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
@ -1,5 +1,7 @@
|
|||||||
(function () {
|
(function () {
|
||||||
var specialKeys = {};
|
var specialKeys = {
|
||||||
|
191 : "?"
|
||||||
|
};
|
||||||
|
|
||||||
var ns = $.namespace('pskl.service.keyboard');
|
var ns = $.namespace('pskl.service.keyboard');
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ exports.scripts = [
|
|||||||
"js/service/LocalStorageService.js",
|
"js/service/LocalStorageService.js",
|
||||||
"js/service/HistoryService.js",
|
"js/service/HistoryService.js",
|
||||||
"js/service/keyboard/KeycodeTranslator.js",
|
"js/service/keyboard/KeycodeTranslator.js",
|
||||||
|
"js/service/keyboard/CheatsheetService.js",
|
||||||
"js/service/KeyboardEventService.js",
|
"js/service/KeyboardEventService.js",
|
||||||
"js/service/ImageUploadService.js",
|
"js/service/ImageUploadService.js",
|
||||||
|
|
||||||
|
19
templates/cheatsheet.html
Normal file
19
templates/cheatsheet.html
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<div id="cheatsheet-wrapper" style="display:none">
|
||||||
|
<div class="cheatsheet-container">
|
||||||
|
<div class="cheatsheet-section">
|
||||||
|
<h3>Tool shortcuts</h3>
|
||||||
|
<ul class="cheatsheet-tool-shortcuts"></ul>
|
||||||
|
</div>
|
||||||
|
<div class="cheatsheet-section">
|
||||||
|
<h3>Misc shortcuts</h3>
|
||||||
|
<ul class="cheatsheet-misc-shortcuts"></ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/template" id="cheatsheet-shortcut-template">
|
||||||
|
<li class="cheatsheet-shortcut">
|
||||||
|
<div class="cheatsheet-icon {{shortcutIcon}}"></div>
|
||||||
|
<span class="cheatsheet-key">{{shortcutKey}}</span>
|
||||||
|
<span class="cheatsheet-description">{{shortcutDescription}}</span>
|
||||||
|
</li>
|
||||||
|
</script>
|
Loading…
Reference in New Issue
Block a user