summaryrefslogtreecommitdiff
path: root/svtools
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2019-04-10 16:18:15 +0900
committerTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2019-04-11 20:55:37 +0900
commit85e56cd2b2fcbb5f74f01c20ed089acf7710489c (patch)
tree07f67c57dfb74c54b1f2de6e11a0b131dcafdfd1 /svtools
parent237169136883a5b312fadcec4c73aa183076828c (diff)
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@gmail.com> (cherry picked from commit 14abbc6e86ba234996dfed477a54030adeac2a52) Change-Id: I8542f47940a3b90114ea4bbbac57fd303ca3434b
Diffstat (limited to 'svtools')
-rw-r--r--svtools/source/contnr/svimpbox.cxx24
-rw-r--r--svtools/source/contnr/treelistbox.cxx12
-rw-r--r--svtools/source/contnr/viewdataentry.cxx2
-rw-r--r--svtools/source/inc/svimpbox.hxx2
4 files changed, 23 insertions, 17 deletions
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 );