diff options
author | Joas Souza <joassouzasantos@gmail.com> | 2018-01-04 11:28:00 -0300 |
---|---|---|
committer | Luiza Pagliari <lpagliari@gmail.com> | 2018-01-04 12:28:00 -0200 |
commit | 454f539561a8d9de51ed107a29d974eb79198bc6 (patch) | |
tree | 6c1847daa5cb131e2bfe4bc520e995234d883269 /src | |
parent | f1fcd16894e562903caf02b30ac238592dac0bf8 (diff) | |
download | etherpad-lite-454f539561a8d9de51ed107a29d974eb79198bc6.zip |
Select formatting button on selection (#3301)
[feat] Select button when selection is on formatted text
Diffstat (limited to 'src')
-rw-r--r-- | src/static/js/AttributeManager.js | 14 | ||||
-rw-r--r-- | src/static/js/ace2_inner.js | 38 |
2 files changed, 40 insertions, 12 deletions
diff --git a/src/static/js/AttributeManager.js b/src/static/js/AttributeManager.js index 0342408c..53b233e0 100644 --- a/src/static/js/AttributeManager.js +++ b/src/static/js/AttributeManager.js @@ -400,7 +400,19 @@ AttributeManager.prototype = _(AttributeManager.prototype).extend({ this.removeAttributeOnLine(lineNum, attributeName) : this.setAttributeOnLine(lineNum, attributeName, attributeValue); - } + }, + + hasAttributeOnSelectionOrCaretPosition: function(attributeName) { + var hasSelection = ((this.rep.selStart[0] !== this.rep.selEnd[0]) || (this.rep.selEnd[1] !== this.rep.selStart[1])); + var hasAttrib; + if (hasSelection) { + hasAttrib = this.getAttributeOnSelection(attributeName); + }else { + var attributesOnCaretPosition = this.getAttributesOnCaret(); + hasAttrib = _.contains(_.flatten(attributesOnCaretPosition), attributeName); + } + return hasAttrib; + }, }); module.exports = AttributeManager; diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 83f947ba..df9c9642 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -75,6 +75,9 @@ function Ace2Inner(){ var EDIT_BODY_PADDING_TOP = 8; var EDIT_BODY_PADDING_LEFT = 8; + var FORMATTING_STYLES = ['bold', 'italic', 'underline', 'strikethrough']; + var SELECT_BUTTON_CLASS = 'selected'; + var caughtErrors = []; var thisAuthor = ''; @@ -2472,17 +2475,11 @@ function Ace2Inner(){ } } - if (selectionAllHasIt) - { - documentAttributeManager.setAttributesOnRange(rep.selStart, rep.selEnd, [ - [attributeName, ''] - ]); - } - else - { - documentAttributeManager.setAttributesOnRange(rep.selStart, rep.selEnd, [ - [attributeName, 'true'] - ]); + + var attributeValue = selectionAllHasIt ? '' : 'true'; + documentAttributeManager.setAttributesOnRange(rep.selStart, rep.selEnd, [[attributeName, attributeValue]]); + if (attribIsFormattingStyle(attributeName)) { + updateStyleButtonState(attributeName, !selectionAllHasIt); // italic, bold, ... } } editorInfo.ace_toggleAttributeOnSelection = toggleAttributeOnSelection; @@ -2911,6 +2908,9 @@ function Ace2Inner(){ rep.selFocusAtStart = newSelFocusAtStart; currentCallStack.repChanged = true; + // select the formatting buttons when there is the style applied on selection + selectFormattingButtonIfLineHasStyleApplied(rep); + hooks.callAll('aceSelectionChanged', { rep: rep, callstack: currentCallStack, @@ -2939,6 +2939,22 @@ function Ace2Inner(){ return (eventType === 'setup') || (eventType === 'setBaseText') || (eventType === 'importText'); } + function updateStyleButtonState(attribName, hasStyleOnRepSelection) { + var $formattingButton = parent.parent.$('[data-key="' + attribName + '"]').find('a'); + $formattingButton.toggleClass(SELECT_BUTTON_CLASS, hasStyleOnRepSelection); + } + + function attribIsFormattingStyle(attributeName) { + return _.contains(FORMATTING_STYLES, attributeName); + } + + function selectFormattingButtonIfLineHasStyleApplied (rep) { + _.each(FORMATTING_STYLES, function (style) { + var hasStyleOnRepSelection = documentAttributeManager.hasAttributeOnSelectionOrCaretPosition(style); + updateStyleButtonState(style, hasStyleOnRepSelection); + }) + } + function doCreateDomLine(nonEmpty) { if (browser.msie && (!nonEmpty)) |