Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/1678 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/78/1678/1 Template Manager: show folders with 4 previews inside a rounded rect The previous display had the inconvenient to be misleading if there was one or no template inside a folder. Change-Id: I16faa2556ca02380bd4dac0d821ecac45b98b8c3 --- M sfx2/inc/sfx2/templatecontaineritem.hxx M sfx2/source/control/templateabstractview.cxx M sfx2/source/control/templatecontaineritem.cxx M sfx2/source/control/templatelocalview.cxx M sfx2/source/control/thumbnailviewitem.cxx 5 files changed, 131 insertions(+), 63 deletions(-) diff --git a/sfx2/inc/sfx2/templatecontaineritem.hxx b/sfx2/inc/sfx2/templatecontaineritem.hxx index 2c2d18b..4768604 100644 --- a/sfx2/inc/sfx2/templatecontaineritem.hxx +++ b/sfx2/inc/sfx2/templatecontaineritem.hxx @@ -18,19 +18,26 @@ public: BitmapEx maPreview2; + BitmapEx maPreview3; + BitmapEx maPreview4; std::vector<TemplateItemProperties> maTemplates; TemplateContainerItem (ThumbnailView &rView); virtual ~TemplateContainerItem (); - const Point& getPrev2Pos () const { return maPrev2Pos; } - virtual void Paint (drawinglayer::processor2d::BaseProcessor2D *pProcessor, const ThumbnailItemAttributes *pAttrs); + + virtual void calculateItemsPosition (const long nThumbnailHeight, const long nDisplayHeight, + const long nPadding, sal_uInt32 nMaxTextLenght, + const ThumbnailItemAttributes *pAttrs); + + bool HasMissingPreview( ); + private: - Point maPrev2Pos; + Rectangle maThumbnailArea; }; #endif // TEMPLATEFOLDERVIEWITEM_HXX diff --git a/sfx2/source/control/templateabstractview.cxx b/sfx2/source/control/templateabstractview.cxx index f8f20f5..4439725 100644 --- a/sfx2/source/control/templateabstractview.cxx +++ b/sfx2/source/control/templateabstractview.cxx @@ -65,8 +65,10 @@ // Clear thumbnails pContainerItem->maPreview1.Clear(); pContainerItem->maPreview2.Clear(); + pContainerItem->maPreview3.Clear(); + pContainerItem->maPreview4.Clear(); - for (size_t i = 0, n = rTemplates.size(); i < n; ++i) + for (size_t i = 0, n = rTemplates.size(); i < n && pContainerItem->HasMissingPreview(); ++i) { if (isValid(rTemplates[i].aPath)) { @@ -83,6 +85,18 @@ TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75, TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75); } + else if ( pContainerItem->maPreview3.IsEmpty() ) + { + pContainerItem->maPreview3 = TemplateAbstractView::scaleImg(rTemplates[i].aThumbnail, + TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75, + TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75); + } + else if ( pContainerItem->maPreview4.IsEmpty() ) + { + pContainerItem->maPreview4 = TemplateAbstractView::scaleImg(rTemplates[i].aThumbnail, + TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75, + TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75); + } } } diff --git a/sfx2/source/control/templatecontaineritem.cxx b/sfx2/source/control/templatecontaineritem.cxx index d63ce8a..25fa5fe 100644 --- a/sfx2/source/control/templatecontaineritem.cxx +++ b/sfx2/source/control/templatecontaineritem.cxx @@ -8,6 +8,7 @@ */ #include <sfx2/templatecontaineritem.hxx> +#include <sfx2/templateabstractview.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx> #include <basegfx/polygon/b2dpolygon.hxx> @@ -35,16 +36,31 @@ { } +void TemplateContainerItem::calculateItemsPosition (const long nThumbnailHeight, const long nDisplayHeight, + const long nPadding, sal_uInt32 nMaxTextLenght, + const ThumbnailItemAttributes *pAttrs) +{ + ThumbnailViewItem::calculateItemsPosition( nThumbnailHeight, nDisplayHeight, nPadding, nMaxTextLenght, pAttrs); + Point aPos (maDrawArea.getX() + nPadding, maDrawArea.getY() + nPadding); + maThumbnailArea = Rectangle(aPos, Size(maDrawArea.GetWidth() - 2 * nPadding, nThumbnailHeight)); +} + void TemplateContainerItem::Paint (drawinglayer::processor2d::BaseProcessor2D *pProcessor, const ThumbnailItemAttributes *pAttrs) { int nCount = 0; - int nSeqSize = 2; + int nSeqSize = 3; if (!maPreview1.IsEmpty()) nSeqSize += 3; if (!maPreview2.IsEmpty()) + nSeqSize += 3; + + if (!maPreview3.IsEmpty()) + nSeqSize += 3; + + if (!maPreview4.IsEmpty()) nSeqSize += 3; BColor aFillColor = pAttrs->aFillColor; @@ -58,70 +74,83 @@ B2DPolyPolygon(Polygon(maDrawArea,5,5).getB2DPolygon()), aFillColor)); + // Create rounded rectangle border + aSeq[nCount++] = Primitive2DReference( new PolygonStrokePrimitive2D( + Polygon(maThumbnailArea,5,5).getB2DPolygon(), + LineAttribute(BColor(0.8, 0.8, 0.8), 2.0))); + + // Paint the thumbnails side by side on a 2x2 grid + long nThumbPadding = 4; + Size aThumbSize( ( maThumbnailArea.getWidth() - 3 * nThumbPadding ) / 2, ( maThumbnailArea.getHeight() - 3* nThumbPadding ) / 2 ); + // Draw thumbnail Point aPos = maPrev1Pos; - Size aImageSize = maPreview1.GetSizePixel(); - float fScaleX = 1.0f; - float fScaleY = 1.0f; - - if (!maPreview2.IsEmpty()) + for (int i=0; i<4; ++i) { - fScaleX = 0.8f; - fScaleY = 0.8f; + long nPosX = 0; + long nPosY = 0; + BitmapEx* pImage = NULL; - float fWidth = aImageSize.Width()*fScaleX; - float fHeight = aImageSize.Height()*fScaleY; - float fPosX = aPos.getX()+35*fScaleX; - float fPosY = aPos.getY()+20*fScaleY; + switch (i) + { + case 0: + pImage = &maPreview1; + break; + case 1: + pImage = &maPreview2; + nPosX = aThumbSize.getWidth() + nThumbPadding; + break; + case 2: + pImage = &maPreview3; + nPosY = aThumbSize.getHeight() + nThumbPadding; + break; + case 3: + pImage = &maPreview4; + nPosX = aThumbSize.getWidth() + nThumbPadding; + nPosY = aThumbSize.getHeight() + nThumbPadding; + break; + } - B2DPolygon aBounds; - aBounds.append(B2DPoint(fPosX,fPosY)); - aBounds.append(B2DPoint(fPosX+fWidth,fPosY)); - aBounds.append(B2DPoint(fPosX+fWidth,fPosY+fHeight)); - aBounds.append(B2DPoint(fPosX,fPosY+fHeight)); - aBounds.setClosed(true); + if (!pImage->IsEmpty()) + { + // Check the size of the picture and resize if needed + Size aImageSize = pImage->GetSizePixel(); + if (aImageSize.getWidth() > aThumbSize.getWidth() || aImageSize.getHeight() > aThumbSize.getHeight()) + { + // Resize the picture and store it for next times + *pImage = TemplateAbstractView::scaleImg( *pImage, aThumbSize.getWidth(), aThumbSize.getHeight() ); + aImageSize = pImage->GetSizePixel(); + } - aSeq[nCount++] = Primitive2DReference( new PolyPolygonColorPrimitive2D( - B2DPolyPolygon(aBounds), Color(COL_WHITE).getBColor())); - aSeq[nCount++] = Primitive2DReference( new FillBitmapPrimitive2D( - createScaleTranslateB2DHomMatrix(fScaleX,fScaleY,aPos.X(),aPos.Y()), - FillBitmapAttribute(maPreview2, - B2DPoint(35,20), - B2DVector(aImageSize.Width(),aImageSize.Height()), - false) - )); + float nOffX = (aThumbSize.getWidth() - aImageSize.getWidth()) / 2; + float nOffY = (aThumbSize.getHeight() - aImageSize.getHeight()) / 2; - // draw thumbnail borders - aSeq[nCount++] = Primitive2DReference(createBorderLine(aBounds)); - } + float fWidth = aImageSize.Width(); + float fHeight = aImageSize.Height(); + float fPosX = maThumbnailArea.Left() + nThumbPadding + nPosX + nOffX; + float fPosY = maThumbnailArea.Top() + nThumbPadding + nPosY + nOffY; - if (!maPreview1.IsEmpty()) - { - // draw thumbnail borders - float fWidth = aImageSize.Width()*fScaleX; - float fHeight = aImageSize.Height()*fScaleY; - float fPosX = aPos.getX(); - float fPosY = aPos.getY(); + B2DPolygon aBounds; + aBounds.append(B2DPoint(fPosX,fPosY)); + aBounds.append(B2DPoint(fPosX+fWidth,fPosY)); + aBounds.append(B2DPoint(fPosX+fWidth,fPosY+fHeight)); + aBounds.append(B2DPoint(fPosX,fPosY+fHeight)); + aBounds.setClosed(true); - B2DPolygon aBounds; - aBounds.append(B2DPoint(fPosX,fPosY)); - aBounds.append(B2DPoint(fPosX+fWidth,fPosY)); - aBounds.append(B2DPoint(fPosX+fWidth,fPosY+fHeight)); - aBounds.append(B2DPoint(fPosX,fPosY+fHeight)); - aBounds.setClosed(true); + aSeq[nCount++] = Primitive2DReference( new PolyPolygonColorPrimitive2D( + B2DPolyPolygon(aBounds), Color(COL_WHITE).getBColor())); + aSeq[nCount++] = Primitive2DReference( new FillBitmapPrimitive2D( + createScaleTranslateB2DHomMatrix(1.0,1.0,fPosX,fPosY), + FillBitmapAttribute(*pImage, + B2DPoint(0.0,0.0), + B2DVector(aImageSize.Width(),aImageSize.Height()), + false) + )); - aSeq[nCount++] = Primitive2DReference( new PolyPolygonColorPrimitive2D( - B2DPolyPolygon(aBounds), Color(COL_WHITE).getBColor())); - aSeq[nCount++] = Primitive2DReference( new FillBitmapPrimitive2D( - createScaleTranslateB2DHomMatrix(fScaleX,fScaleY,aPos.X(),aPos.Y()), - FillBitmapAttribute(maPreview1, - B2DPoint(0,0), - B2DVector(aImageSize.Width(),aImageSize.Height()), - false) - )); - - aSeq[nCount++] = Primitive2DReference(createBorderLine(aBounds)); + // draw thumbnail borders + aSeq[nCount++] = Primitive2DReference(createBorderLine(aBounds)); + } } // Draw centered text below thumbnail @@ -143,6 +172,11 @@ pProcessor->process(aSeq); } +bool TemplateContainerItem::HasMissingPreview( ) +{ + return maPreview1.IsEmpty() || maPreview2.IsEmpty() || maPreview3.IsEmpty() || maPreview4.IsEmpty(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sfx2/source/control/templatelocalview.cxx b/sfx2/source/control/templatelocalview.cxx index 16dcc88..7956101 100644 --- a/sfx2/source/control/templatelocalview.cxx +++ b/sfx2/source/control/templatelocalview.cxx @@ -626,9 +626,11 @@ { pItem->maPreview1.Clear(); pItem->maPreview2.Clear(); + pItem->maPreview3.Clear(); + pItem->maPreview4.Clear(); // Update folder thumbnails - for (size_t i = 0, n = pItem->maTemplates.size(); i < n && ( pItem->maPreview1.IsEmpty() || pItem->maPreview2.IsEmpty( ) ); ++i) + for (size_t i = 0, n = pItem->maTemplates.size(); i < n && pItem->HasMissingPreview(); ++i) { if ( pItem->maPreview1.IsEmpty( ) ) { @@ -636,12 +638,24 @@ TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75, TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75); } - else + else if ( pItem->maPreview2.IsEmpty() ) { pItem->maPreview2 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail, TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75, TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75); } + else if ( pItem->maPreview3.IsEmpty() ) + { + pItem->maPreview3 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail, + TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75, + TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75); + } + else if ( pItem->maPreview4.IsEmpty() ) + { + pItem->maPreview4 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail, + TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75, + TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75); + } } } diff --git a/sfx2/source/control/thumbnailviewitem.cxx b/sfx2/source/control/thumbnailviewitem.cxx index 3f1077e..e5a07db 100644 --- a/sfx2/source/control/thumbnailviewitem.cxx +++ b/sfx2/source/control/thumbnailviewitem.cxx @@ -88,7 +88,7 @@ maDrawArea = area; } -void ThumbnailViewItem::calculateItemsPosition (const long nThumbnailHeight, const long nDisplayHeight, +void ThumbnailViewItem::calculateItemsPosition (const long nThumbnailHeight, const long, const long nPadding, sal_uInt32 nMaxTextLenght, const ThumbnailItemAttributes *pAttrs) { @@ -107,8 +107,7 @@ maPrev1Pos = aPos; // Calculate text position - aPos.Y() = maDrawArea.getY() + nThumbnailHeight + nPadding; - aPos.Y() = aPos.Y() + aTextDev.getTextHeight() + (nDisplayHeight - aTextDev.getTextHeight())/2; + aPos.Y() = maDrawArea.getY() + nThumbnailHeight + nPadding + aTextDev.getTextHeight(); aPos.X() = maDrawArea.Left() + (aRectSize.Width() - aTextDev.getTextWidth(maTitle,0,nMaxTextLenght))/2; maTextPos = aPos; } -- To view, visit https://gerrit.libreoffice.org/1678 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I16faa2556ca02380bd4dac0d821ecac45b98b8c3 Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: libreoffice-4-0 Gerrit-Owner: Bosdonnat Cedric <cedric.bosdon...@free.fr> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice