summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoas Souza <joassouzasantos@gmail.com>2018-01-04 11:28:00 -0300
committerLuiza Pagliari <lpagliari@gmail.com>2018-01-04 12:28:00 -0200
commit454f539561a8d9de51ed107a29d974eb79198bc6 (patch)
tree6c1847daa5cb131e2bfe4bc520e995234d883269 /src
parentf1fcd16894e562903caf02b30ac238592dac0bf8 (diff)
downloadetherpad-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.js14
-rw-r--r--src/static/js/ace2_inner.js38
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))