[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.0' - include/svtools svtools/source

Tomaž Vajngerl (via logerrit) logerrit at kemper.freedesktop.org
Thu Apr 11 12:18:38 UTC 2019


 include/svtools/viewdataentry.hxx       |    7 +++++++
 svtools/source/contnr/svimpbox.cxx      |   24 ++++++++++--------------
 svtools/source/contnr/treelistbox.cxx   |   12 ++++++++++--
 svtools/source/contnr/viewdataentry.cxx |    2 ++
 svtools/source/inc/svimpbox.hxx         |    2 +-
 5 files changed, 30 insertions(+), 17 deletions(-)

New commits:
commit 85e56cd2b2fcbb5f74f01c20ed089acf7710489c
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Wed Apr 10 16:18:15 2019 +0900
Commit:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
CommitDate: Thu Apr 11 20:55:37 2019 +0900

    tdf#82009 TreeList move painting of drag target into Paint func.
    
    When we drag a entry in TreeListBox, we execute a PaintDDCursor
    which paints a "cursor" of a possible drag target (for example
    to show where the entry will be moved to if we want to change the
    order). The problem with this fuction is that it paints a line
    directlly at that location, and that it uses invert raster
    operation to draw a line. So to hide the line it just needs to
    draw again. On MacOS this invertion causes a problem and draws
    the whole area black, which is the cause of this bug.
    
    So instead of inverting the drawing of the drag target cursor
    has now been moved into the main Paint method, where it redraws
    the whole entry, and if present, also the drag target cursor.
    This means that all we need to do is Invalidate the entry,
    which then just gets redrawn in a normal Paint pass.
    
    One exception is still MacOS, which doesn't invalidate the entry,
    but redraws the entry directly. DnD is MacOS is a bit different
    as it is not async (if I understand correctly) so the invalidate
    has no effect.
    
    Reviewed-on: https://gerrit.libreoffice.org/70521
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
    (cherry picked from commit 14abbc6e86ba234996dfed477a54030adeac2a52)
    
    Change-Id: I8542f47940a3b90114ea4bbbac57fd303ca3434b

diff --git a/include/svtools/viewdataentry.hxx b/include/svtools/viewdataentry.hxx
index 1a61b3f6c13a..91c51d39dc9a 100644
--- a/include/svtools/viewdataentry.hxx
+++ b/include/svtools/viewdataentry.hxx
@@ -51,6 +51,8 @@ class SVT_DLLPUBLIC SvViewDataEntry
     bool mbExpanded:1;
     bool mbFocused:1;
     bool mbSelectable:1;
+    bool mbDragTarget:1;
+
     tools::Rectangle maPaintRectangle;
 
 public:
@@ -63,11 +65,16 @@ public:
     bool IsExpanded() const { return mbExpanded;}
     bool HasFocus() const { return mbFocused;}
     bool IsSelectable() const { return mbSelectable;}
+    bool IsDragTarget() const { return mbDragTarget;}
     void SetFocus( bool bFocus );
     void SetSelected( bool bSelected );
     void SetHighlighted( bool bHighlighted );
     void SetExpanded( bool bExpanded );
     void SetSelectable( bool bSelectable );
+    void SetDragTarget( bool bDragTarget )
+    {
+        mbDragTarget = bDragTarget;
+    }
 
     void Init(size_t nSize);
 
diff --git a/svtools/source/contnr/svimpbox.cxx b/svtools/source/contnr/svimpbox.cxx
index 6153f987efd3..2432a74246d9 100644
--- a/svtools/source/contnr/svimpbox.cxx
+++ b/svtools/source/contnr/svimpbox.cxx
@@ -2879,23 +2879,19 @@ IMPL_LINK_NOARG(SvImpLBox, BeginDragHdl, Timer *, void)
     pView->StartDrag( 0, aAsyncBeginDragPos );
 }
 
-void SvImpLBox::PaintDDCursor( SvTreeListEntry* pInsertionPos )
+void SvImpLBox::PaintDDCursor(SvTreeListEntry* pEntry, bool bShow)
 {
-    long nY;
-    if( pInsertionPos )
+    if (pEntry)
     {
-        nY = GetEntryLine( pInsertionPos );
-        nY += pView->GetEntryHeight();
+        SvViewDataEntry* pViewData = pView->GetViewData(pEntry);
+        pViewData->SetDragTarget(bShow);
+#ifdef MACOSX
+        // in MacOS we need to draw directly (as we are synchronuous) or no invalidation happens
+        pView->PaintEntry1(*pEntry, GetEntryLine(pEntry), *pView);
+#else
+        InvalidateEntry(pEntry);
+#endif
     }
-    else
-        nY = 1;
-    RasterOp eOldOp = pView->GetRasterOp();
-    pView->SetRasterOp( RasterOp::Invert );
-    Color aOldLineColor = pView->GetLineColor();
-    pView->SetLineColor( Color( COL_BLACK ) );
-    pView->DrawLine( Point( 0, nY ), Point( aOutputSize.Width(), nY ) );
-    pView->SetLineColor( aOldLineColor );
-    pView->SetRasterOp( eOldOp );
 }
 
 void SvImpLBox::Command( const CommandEvent& rCEvt )
diff --git a/svtools/source/contnr/treelistbox.cxx b/svtools/source/contnr/treelistbox.cxx
index 45a789633a87..f41e907c11c4 100644
--- a/svtools/source/contnr/treelistbox.cxx
+++ b/svtools/source/contnr/treelistbox.cxx
@@ -701,7 +701,7 @@ void SvTreeListBox::ImplShowTargetEmphasis( SvTreeListEntry* pEntry, bool bShow)
         return;
     if ( !bShow && !(nImpFlags & SvTreeListBoxFlags::TARGEMPH_VIS) )
         return;
-    pImpl->PaintDDCursor( pEntry );
+    pImpl->PaintDDCursor( pEntry, bShow);
     if( bShow )
         nImpFlags |= SvTreeListBoxFlags::TARGEMPH_VIS;
     else
@@ -2657,7 +2657,6 @@ void SvTreeListBox::InvalidateEntry(SvTreeListEntry* pEntry)
 
 void SvTreeListBox::PaintEntry1(SvTreeListEntry& rEntry, long nLine, vcl::RenderContext& rRenderContext)
 {
-
     tools::Rectangle aRect; // multi purpose
 
     bool bHorSBar = pImpl->HasHorScrollBar();
@@ -2850,6 +2849,15 @@ void SvTreeListBox::PaintEntry1(SvTreeListEntry& rEntry, long nLine, vcl::Render
         nCurTab++;
     }
 
+    if (pViewDataEntry->IsDragTarget())
+    {
+        rRenderContext.Push();
+        rRenderContext.SetLineColor(rSettings.GetDeactiveColor());
+        rRenderContext.SetFillColor(rSettings.GetDeactiveColor());
+        rRenderContext.DrawRect(tools::Rectangle(Point(0, nLine + nTempEntryHeight - 2), Size(nWidth, 2)));
+        rRenderContext.Pop();
+    }
+
     if (bCurFontIsSel)
     {
         rRenderContext.SetTextColor(aBackupTextColor);
diff --git a/svtools/source/contnr/viewdataentry.cxx b/svtools/source/contnr/viewdataentry.cxx
index 53795b414db2..f9fcc630ce79 100644
--- a/svtools/source/contnr/viewdataentry.cxx
+++ b/svtools/source/contnr/viewdataentry.cxx
@@ -26,6 +26,7 @@ SvViewDataEntry::SvViewDataEntry() :
     mbExpanded(false),
     mbFocused(false),
     mbSelectable(true),
+    mbDragTarget(false),
     maPaintRectangle()
 {
 }
@@ -37,6 +38,7 @@ SvViewDataEntry::SvViewDataEntry( const SvViewDataEntry& rData ) :
     mbExpanded(rData.mbExpanded),
     mbFocused(false),
     mbSelectable(rData.mbSelectable),
+    mbDragTarget(false),
     maPaintRectangle(rData.maPaintRectangle)
 {
 }
diff --git a/svtools/source/inc/svimpbox.hxx b/svtools/source/inc/svimpbox.hxx
index 1c56643c11ee..d14d9129ccdb 100644
--- a/svtools/source/inc/svimpbox.hxx
+++ b/svtools/source/inc/svimpbox.hxx
@@ -288,7 +288,7 @@ public:
     void                MakeVisible( SvTreeListEntry* pEntry, bool bMoveToTop = false );
     void                ScrollToAbsPos( long nPos );
 
-    void                PaintDDCursor( SvTreeListEntry* );
+    void                PaintDDCursor(SvTreeListEntry* pEntry, bool bShow);
 
     // Images
     inline Image&       implGetImageLocation( const ImageType _eType );


More information about the Libreoffice-commits mailing list