loleaflet/dist/toolbar/toolbar.js     |    2 -
 loleaflet/src/core/LOUtil.js          |   20 +-----------
 loleaflet/src/layer/tile/TileLayer.js |   14 ++++----
 loleaflet/src/map/Map.js              |   15 +++++++--
 loolwsd/LOOLKit.cpp                   |   53 ++++++++++++++++++++++++++++++++--
 5 files changed, 72 insertions(+), 32 deletions(-)

New commits:
commit 0ad39593d02e139e5f0bba0b8262d7c12563663a
Author: Pranav Kant <[email protected]>
Date:   Thu Oct 6 20:07:53 2016 +0530

    loleaflet: Use view colors directly from core
    
    Change-Id: I2fdffd6dd0823a77ff52e40150a81db4b261ec81

diff --git a/loleaflet/dist/toolbar/toolbar.js 
b/loleaflet/dist/toolbar/toolbar.js
index fc35a45..9003281 100644
--- a/loleaflet/dist/toolbar/toolbar.js
+++ b/loleaflet/dist/toolbar/toolbar.js
@@ -1346,7 +1346,7 @@ map.on('addview', function(e) {
        }, 3000);
 
        var username = e.username;
-       var color = L.LOUtil.getViewIdHexColor(e.viewId);
+       var color = L.LOUtil.rgbToHex(e.color);
        if (e.viewId === map._docLayer._viewId) {
                username = _('You');
                color = '#000';
diff --git a/loleaflet/src/core/LOUtil.js b/loleaflet/src/core/LOUtil.js
index 24c516b..4ebb9d1 100644
--- a/loleaflet/src/core/LOUtil.js
+++ b/loleaflet/src/core/LOUtil.js
@@ -3,20 +3,6 @@
  */
 
 L.LOUtil = {
-       // Based on core.git's colordata.hxx: 
COL_AUTHOR1_DARK...COL_AUTHOR9_DARK
-       // consisting of arrays of RGB values
-       // Maybe move the color logic to separate file when it becomes complex
-       darkColors: [
-               [198, 146, 0],
-               [87, 157,  28],
-               [105,  43, 157],
-               [197,   0,  11],
-               [0, 128, 128],
-               [140, 132,  0],
-               [53,  85, 107],
-               [209, 118,   0]
-       ],
-
        startSpinner: function (spinnerCanvas, spinnerSpeed) {
                var spinnerInterval;
                spinnerCanvas.width = 50;
@@ -42,9 +28,7 @@ L.LOUtil = {
                return spinnerInterval;
        },
 
-       getViewIdHexColor: function(viewId) {
-               var color = this.darkColors[(viewId + 1) % 
this.darkColors.length];
-               var hex = color[2] | (color[1] << 8) | (color[0] << 16);
-               return '#' + ('000000' + hex.toString(16)).slice(-6);
+       rgbToHex: function(color) {
+               return '#' + ('000000' + color.toString(16)).slice(-6);
        }
 };
diff --git a/loleaflet/src/layer/tile/TileLayer.js 
b/loleaflet/src/layer/tile/TileLayer.js
index a5aad09..452a93c 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -682,7 +682,7 @@ L.TileLayer = L.GridLayer.extend({
 
                if 
(!this._isEmptyRectangle(this._cellViewCursors[viewId].bounds) && 
this._selectedPart === viewPart) {
                        if (!cellViewCursorMarker) {
-                               var borderColor = 
L.LOUtil.getViewIdHexColor(viewId);
+                               var borderColor = 
L.LOUtil.rgbToHex(this._map.getViewColor(viewId));
                                cellViewCursorMarker = 
L.rectangle(this._cellViewCursors[viewId].bounds, {fill: false, color: 
borderColor, weight: 2});
                                this._cellViewCursors[viewId].marker = 
cellViewCursorMarker;
                                
cellViewCursorMarker.bindPopup(this._map.getViewName(viewId), {autoClose: 
false, autoPan: false, borderColor: borderColor});
@@ -714,8 +714,8 @@ L.TileLayer = L.GridLayer.extend({
                this._onUpdateViewCursor(viewId);
        },
 
-       _addView: function(viewId, username) {
-               this._map.addView(viewId, username);
+       _addView: function(viewId, username, color) {
+               this._map.addView(viewId, username, color);
 
                //TODO: We can initialize color and other properties here.
                if (typeof this._viewCursors[viewId] !== 'undefined') {
@@ -755,7 +755,7 @@ L.TileLayer = L.GridLayer.extend({
                var viewIds = [];
                for (var viewInfoIdx in viewInfo) {
                        if (!(parseInt(viewInfo[viewInfoIdx].id) in 
this._map._viewInfo)) {
-                               this._addView(viewInfo[viewInfoIdx].id, 
viewInfo[viewInfoIdx].username);
+                               this._addView(viewInfo[viewInfoIdx].id, 
viewInfo[viewInfoIdx].username, viewInfo[viewInfoIdx].color);
                        }
                        viewIds.push(viewInfo[viewInfoIdx].id);
                }
@@ -1235,7 +1235,7 @@ L.TileLayer = L.GridLayer.extend({
                   (this._docType === 'text' || this._selectedPart === 
viewPart)) {
                        if (!viewCursorMarker) {
                                var viewCursorOptions = {
-                                       color: 
L.LOUtil.getViewIdHexColor(viewId),
+                                       color: 
L.LOUtil.rgbToHex(this._map.getViewColor(viewId)),
                                        blink: false,
                                        header: true, // we want a 'hat' to our 
view cursors (which will contain view user names)
                                        headerTimeout: 3000, // hide after some 
interval
@@ -1272,7 +1272,7 @@ L.TileLayer = L.GridLayer.extend({
 
                        viewSelection = new L.Polygon(viewPolygons, {
                                pointerEvents: 'none',
-                               fillColor: L.LOUtil.getViewIdHexColor(viewId),
+                               fillColor: 
L.LOUtil.rgbToHex(this._map.getViewColor(viewId)),
                                fillOpacity: 0.25,
                                weight: 2,
                                opacity: 0.25
@@ -1293,7 +1293,7 @@ L.TileLayer = L.GridLayer.extend({
                if (!this._isEmptyRectangle(viewBounds) &&
                   (this._docType === 'text' || this._selectedPart === 
viewPart)) {
                        if (!viewMarker) {
-                               var color = L.LOUtil.getViewIdHexColor(viewId);
+                               var color = 
L.LOUtil.rgbToHex(this._map.getViewColor(viewId));
                                viewMarker = L.rectangle(viewBounds, {
                                        pointerEvents: 'auto',
                                        fill: false,
diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 7d2dfac..38619f6 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -120,14 +120,17 @@ L.Map = L.Evented.extend({
 
                // View info (user names and view ids)
                this._viewInfo = {};
+
+               // View color map
+               this._viewColors = {};
        },
 
 
        // public methods that modify map state
 
-       addView: function(viewid, username) {
-               this._viewInfo[viewid] = username;
-               this.fire('addview', {viewId: viewid, username: username});
+       addView: function(viewid, username, color) {
+               this._viewInfo[viewid] = {'username': username, 'color': color};
+               this.fire('addview', {viewId: viewid, username: username, 
color: color});
        },
 
        removeView: function(viewid) {
@@ -137,7 +140,11 @@ L.Map = L.Evented.extend({
        },
 
        getViewName: function(viewid) {
-               return this._viewInfo[viewid];
+               return this._viewInfo[viewid].username;
+       },
+
+       getViewColor: function(viewid) {
+               return this._viewInfo[viewid].color;
        },
 
        // replaced by animation-powered implementation in Map.PanAnimation.js
commit 587c0e5222def90659ec5959352c56eed0df27b5
Author: Pranav Kant <[email protected]>
Date:   Thu Oct 6 20:08:24 2016 +0530

    loolwsd: Forward 'color' property in 'viewinfo' message to client
    
    Change-Id: Id7d28a46cacd662aeb371805509e5a81b90b9c90

diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index 852be7a..089b695 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -874,7 +874,7 @@ private:
         }
 
         return viewInfo;
-    };
+    }
 
     std::mutex& getMutex() override
     {
@@ -891,6 +891,7 @@ private:
     {
         // Store the list of viewid, username mapping in a map
         std::map<int, std::string> viewInfoMap = getViewInfo();
+        std::map<std::string, int> viewColorsMap = getViewColors();
         std::unique_lock<std::mutex> lock(_mutex);
 
         // Double check if list of viewids from core and our list matches,
@@ -901,7 +902,7 @@ private:
         {
             Object::Ptr viewInfoObj = new Object();
             viewInfoObj->set("id", viewId);
-
+            int color = 0;
             if (viewInfoMap.find(viewId) == viewInfoMap.end())
             {
                 Log::error("No username found for viewId [" + 
std::to_string(viewId) + "].");
@@ -910,7 +911,12 @@ private:
             else
             {
                 viewInfoObj->set("username", viewInfoMap[viewId]);
+                if (viewColorsMap.find(viewInfoMap[viewId]) != 
viewColorsMap.end())
+                {
+                    color = viewColorsMap[viewInfoMap[viewId]];
+                }
             }
+            viewInfoObj->set("color", color);
 
             viewInfoArray->set(arrayIndex++, viewInfoObj);
         }
@@ -931,6 +937,49 @@ private:
 
 private:
 
+    // Get the color value for all author names from the core
+    std::map<std::string, int> getViewColors()
+    {
+        std::string colorValues;
+        std::map<std::string, int> viewColors;
+
+        {
+            auto lock(_loKitDocument->getLock());
+
+            char* pValues = 
_loKitDocument->getCommandValues(".uno:TrackedChangeAuthors");
+            colorValues = std::string(pValues == nullptr ? "" : pValues);
+            std::free(pValues);
+        }
+
+        try
+        {
+            if (!colorValues.empty())
+            {
+                Poco::JSON::Parser parser;
+                auto root = 
parser.parse(colorValues).extract<Poco::JSON::Object::Ptr>();
+                if (root->get("authors").type() == 
typeid(Poco::JSON::Array::Ptr))
+                {
+                    auto authorsArray = 
root->get("authors").extract<Poco::JSON::Array::Ptr>();
+                    for (auto& authorVar: *authorsArray)
+                    {
+                        auto authorObj = 
authorVar.extract<Poco::JSON::Object::Ptr>();
+                        auto authorName = 
authorObj->get("name").convert<std::string>();
+                        auto colorValue = 
authorObj->get("color").convert<int>();
+                        viewColors[authorName] = colorValue;
+                    }
+                }
+            }
+        }
+        catch(const Exception& exc)
+        {
+            Log::error() << "Poco Exception: " << exc.displayText()
+                         << (exc.nested() ? " (" + exc.nested()->displayText() 
+ ")" : "")
+                         << Log::end;
+        }
+
+        return viewColors;
+    }
+
     std::shared_ptr<lok::Document> load(const std::string& sessionId,
                                         const std::string& uri,
                                         const std::string& userName,
_______________________________________________
Libreoffice-commits mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to