diff options
author | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-01-14 16:50:03 +0100 |
---|---|---|
committer | Cédric Bosdonnat <cedric.bosdonnat@free.fr> | 2013-01-16 14:17:42 +0100 |
commit | 34856077702907aed5568ff3d4b98888ced37edf (patch) | |
tree | 6fc55a02d5c448bf64c06217c40a27f540ab1957 /sfx2 | |
parent | c56651e76c2dc8068d53406dcdd6cb6bd1bd9bce (diff) |
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
Reviewed-on: https://gerrit.libreoffice.org/1678
Reviewed-by: Noel Power <noel.power@suse.com>
Tested-by: Noel Power <noel.power@suse.com>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/inc/sfx2/templatecontaineritem.hxx | 13 | ||||
-rw-r--r-- | sfx2/source/control/templateabstractview.cxx | 16 | ||||
-rw-r--r-- | sfx2/source/control/templatecontaineritem.cxx | 156 | ||||
-rw-r--r-- | sfx2/source/control/templatelocalview.cxx | 18 | ||||
-rw-r--r-- | sfx2/source/control/thumbnailviewitem.cxx | 5 |
5 files changed, 138 insertions, 70 deletions
diff --git a/sfx2/inc/sfx2/templatecontaineritem.hxx b/sfx2/inc/sfx2/templatecontaineritem.hxx index 2c2d18bafb51..476860433c47 100644 --- a/sfx2/inc/sfx2/templatecontaineritem.hxx +++ b/sfx2/inc/sfx2/templatecontaineritem.hxx @@ -18,19 +18,26 @@ class TemplateContainerItem : public ThumbnailViewItem 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 27d37a8eca5c..0679e634ae2d 100644 --- a/sfx2/source/control/templateabstractview.cxx +++ b/sfx2/source/control/templateabstractview.cxx @@ -66,8 +66,10 @@ bool ViewFilter_Application::operator () (const ThumbnailViewItem *pItem) // 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)) { @@ -84,6 +86,18 @@ bool ViewFilter_Application::operator () (const ThumbnailViewItem *pItem) 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 d63ce8a8150b..25fa5fe89920 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,11 +36,20 @@ TemplateContainerItem::~TemplateContainerItem () { } +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; @@ -47,6 +57,12 @@ void TemplateContainerItem::Paint (drawinglayer::processor2d::BaseProcessor2D *p if (!maPreview2.IsEmpty()) nSeqSize += 3; + if (!maPreview3.IsEmpty()) + nSeqSize += 3; + + if (!maPreview4.IsEmpty()) + nSeqSize += 3; + BColor aFillColor = pAttrs->aFillColor; Primitive2DSequence aSeq(nSeqSize); @@ -58,70 +74,83 @@ void TemplateContainerItem::Paint (drawinglayer::processor2d::BaseProcessor2D *p B2DPolyPolygon(Polygon(maDrawArea,5,5).getB2DPolygon()), aFillColor)); - // Draw thumbnail - Point aPos = maPrev1Pos; - Size aImageSize = maPreview1.GetSizePixel(); + // Create rounded rectangle border + aSeq[nCount++] = Primitive2DReference( new PolygonStrokePrimitive2D( + Polygon(maThumbnailArea,5,5).getB2DPolygon(), + LineAttribute(BColor(0.8, 0.8, 0.8), 2.0))); - float fScaleX = 1.0f; - float fScaleY = 1.0f; + // 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 ); - if (!maPreview2.IsEmpty()) - { - fScaleX = 0.8f; - fScaleY = 0.8f; - - float fWidth = aImageSize.Width()*fScaleX; - float fHeight = aImageSize.Height()*fScaleY; - float fPosX = aPos.getX()+35*fScaleX; - float fPosY = aPos.getY()+20*fScaleY; - - 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(fScaleX,fScaleY,aPos.X(),aPos.Y()), - FillBitmapAttribute(maPreview2, - B2DPoint(35,20), - B2DVector(aImageSize.Width(),aImageSize.Height()), - false) - )); - - // draw thumbnail borders - aSeq[nCount++] = Primitive2DReference(createBorderLine(aBounds)); - } + // Draw thumbnail + Point aPos = maPrev1Pos; - if (!maPreview1.IsEmpty()) + for (int i=0; i<4; ++i) { - // 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); - - 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)); + long nPosX = 0; + long nPosY = 0; + BitmapEx* pImage = NULL; + + 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; + } + + 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(); + } + + float nOffX = (aThumbSize.getWidth() - aImageSize.getWidth()) / 2; + float nOffY = (aThumbSize.getHeight() - aImageSize.getHeight()) / 2; + + float fWidth = aImageSize.Width(); + float fHeight = aImageSize.Height(); + float fPosX = maThumbnailArea.Left() + nThumbPadding + nPosX + nOffX; + float fPosY = maThumbnailArea.Top() + nThumbPadding + nPosY + nOffY; + + 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) + )); + + // draw thumbnail borders + aSeq[nCount++] = Primitive2DReference(createBorderLine(aBounds)); + } } // Draw centered text below thumbnail @@ -143,6 +172,11 @@ void TemplateContainerItem::Paint (drawinglayer::processor2d::BaseProcessor2D *p 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 16b1b448c2ef..a2e9ff1037ee 100644 --- a/sfx2/source/control/templatelocalview.cxx +++ b/sfx2/source/control/templatelocalview.cxx @@ -592,9 +592,11 @@ static void lcl_updateThumbnails (TemplateContainerItem *pItem) { 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( ) ) { @@ -602,12 +604,24 @@ static void lcl_updateThumbnails (TemplateContainerItem *pItem) 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 3f1077ee718b..e5a07dbfd26d 100644 --- a/sfx2/source/control/thumbnailviewitem.cxx +++ b/sfx2/source/control/thumbnailviewitem.cxx @@ -88,7 +88,7 @@ void ThumbnailViewItem::setDrawArea (const Rectangle &area) 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 @@ void ThumbnailViewItem::calculateItemsPosition (const long nThumbnailHeight, con 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; } |