diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-06-20 17:14:30 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-06-20 16:23:25 +0000 |
commit | ada901d2c412f8a1b1ae668e883114ccb9c69277 (patch) | |
tree | 79affe208a3b51be9b60db1f319f6648c5cffd62 /libreofficekit | |
parent | 92712332f32988e7827520f3480aaef9dfd5804a (diff) |
lokdocview: handle LOK_CALLBACK_INVALIDATE_VIEW_CURSOR
It's similar to the normal cursor, but it's colored and does not blink.
Change-Id: I6a869a98f46979946f320905426e016fe011cbc6
Reviewed-on: https://gerrit.libreoffice.org/26522
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'libreofficekit')
-rw-r--r-- | libreofficekit/source/gtk/lokdocview.cxx | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/libreofficekit/source/gtk/lokdocview.cxx b/libreofficekit/source/gtk/lokdocview.cxx index d4ca4a9861d6..90f01d9ac1f6 100644 --- a/libreofficekit/source/gtk/lokdocview.cxx +++ b/libreofficekit/source/gtk/lokdocview.cxx @@ -72,6 +72,9 @@ struct LOKDocViewPrivateImpl gint m_nParts; /// Position and size of the visible cursor. GdkRectangle m_aVisibleCursor; + /// Position and size of the view cursors. The current view can only see + /// them, can't modify them. Key is the view id. + std::map<std::uintptr_t, GdkRectangle> m_aViewCursors; /// Cursor overlay is visible or hidden (for blinking). gboolean m_bCursorOverlayVisible; /// Cursor is visible or hidden (e.g. for graphic selection). @@ -1031,6 +1034,7 @@ callback (gpointer pData) priv->m_aVisibleCursor.y, priv->m_aVisibleCursor.width, priv->m_aVisibleCursor.height); + std::cerr << "debug, LOK_CALLBACK_INVALIDATE_VISIBLE_CURSOR: i am " << priv->m_nViewId << ", i got " << pCallback->m_aPayload << " for myself" << std::endl; gtk_widget_queue_draw(GTK_WIDGET(pDocView)); } break; @@ -1162,7 +1166,13 @@ callback (gpointer pData) } case LOK_CALLBACK_INVALIDATE_VIEW_CURSOR: { - // TODO: Implement me + std::stringstream aStream(pCallback->m_aPayload); + boost::property_tree::ptree aTree; + boost::property_tree::read_json(aStream, aTree); + std::uintptr_t nViewId = aTree.get<std::uintptr_t>("viewId"); + const std::string& rRectangle = aTree.get<std::string>("rectangle"); + priv->m_aViewCursors[nViewId] = payloadToRectangle(pDocView, rRectangle.c_str()); + gtk_widget_queue_draw(GTK_WIDGET(pDocView)); break; } default: @@ -1402,6 +1412,32 @@ renderDocument(LOKDocView* pDocView, cairo_t* pCairo) return FALSE; } +static const GdkRGBA& getDarkColor(std::uintptr_t nViewId) +{ + static std::map<std::uintptr_t, GdkRGBA> aColorMap; + auto it = aColorMap.find(nViewId); + if (it != aColorMap.end()) + return it->second; + + // Based on tools/colordata.hxx, COL_AUTHOR1_DARK..COL_AUTHOR9_DARK. + static std::vector<GdkRGBA> aColors = + { + {((double)198)/255, ((double)146)/255, ((double)0)/255, 0}, + {((double)6)/255, ((double)70)/255, ((double)162)/255, 0}, + {((double)87)/255, ((double)157)/255, ((double)28)/255, 0}, + {((double)105)/255, ((double)43)/255, ((double)157)/255, 0}, + {((double)197)/255, ((double)0)/255, ((double)11)/255, 0}, + {((double)0)/255, ((double)128)/255, ((double)128)/255, 0}, + {((double)140)/255, ((double)132)/255, ((double)0)/255, 0}, + {((double)43)/255, ((double)85)/255, ((double)107)/255, 0}, + {((double)209)/255, ((double)118)/255, ((double)0)/255, 0}, + }; + static int nColorCounter = 0; + GdkRGBA aColor = aColors[nColorCounter++ % aColors.size()]; + aColorMap[nViewId] = aColor; + return aColorMap[nViewId]; +} + static gboolean renderOverlay(LOKDocView* pDocView, cairo_t* pCairo) { @@ -1422,6 +1458,27 @@ renderOverlay(LOKDocView* pDocView, cairo_t* pCairo) cairo_fill(pCairo); } + // View cursors: they do not blink and are colored. + if (priv->m_bEdit && !priv->m_aViewCursors.empty()) + { + for (auto& rPair : priv->m_aViewCursors) + { + GdkRectangle& rCursor = rPair.second; + if (rCursor.width < 30) + // Set a minimal width if it would be 0. + rCursor.width = 30; + + const GdkRGBA& rDark = getDarkColor(priv->m_nViewId); + cairo_set_source_rgb(pCairo, rDark.red, rDark.green, rDark.blue); + cairo_rectangle(pCairo, + twipToPixel(rCursor.x, priv->m_fZoom), + twipToPixel(rCursor.y, priv->m_fZoom), + twipToPixel(rCursor.width, priv->m_fZoom), + twipToPixel(rCursor.height, priv->m_fZoom)); + cairo_fill(pCairo); + } + } + if (priv->m_bEdit && priv->m_bCursorVisible && !isEmptyRectangle(priv->m_aVisibleCursor) && priv->m_aTextSelectionRectangles.empty()) { // Have a cursor, but no selection: we need the middle handle. |