summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2019-04-10 16:18:15 +0900
committerTomaž Vajngerl <quikee@gmail.com>2019-04-10 17:51:26 +0200
commit14abbc6e86ba234996dfed477a54030adeac2a52 (patch)
tree481553de4583cc1064bc757bf83509ffe6c0e458 /vcl
parentcf09ec89a45c4e3435db4ca18f531a2333cc49df (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. Change-Id: I8542f47940a3b90114ea4bbbac57fd303ca3434b Reviewed-on: https://gerrit.libreoffice.org/70521 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/treelist/svimpbox.cxx25
-rw-r--r--vcl/source/treelist/treelistbox.cxx12
-rw-r--r--vcl/source/treelist/viewdataentry.cxx2
3 files changed, 23 insertions, 16 deletions
diff --git a/vcl/source/treelist/svimpbox.cxx b/vcl/source/treelist/svimpbox.cxx
index 7b3daeb913c2..d199ff286a64 100644
--- a/vcl/source/treelist/svimpbox.cxx
+++ b/vcl/source/treelist/svimpbox.cxx
@@ -2874,23 +2874,20 @@ 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( 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/vcl/source/treelist/treelistbox.cxx b/vcl/source/treelist/treelistbox.cxx
index 5bd2a6fb3d0b..ec393afa707a 100644
--- a/vcl/source/treelist/treelistbox.cxx
+++ b/vcl/source/treelist/treelistbox.cxx
@@ -687,7 +687,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
@@ -2585,7 +2585,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();
@@ -2772,6 +2771,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 || rEntry.GetTextColor())
{
rRenderContext.SetTextColor(aBackupTextColor);
diff --git a/vcl/source/treelist/viewdataentry.cxx b/vcl/source/treelist/viewdataentry.cxx
index b6eb6d79562c..855108d3e5e9 100644
--- a/vcl/source/treelist/viewdataentry.cxx
+++ b/vcl/source/treelist/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)
{
}