summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat@free.fr>2013-01-14 16:50:03 +0100
committerCédric Bosdonnat <cedric.bosdonnat@free.fr>2013-01-16 14:17:42 +0100
commit34856077702907aed5568ff3d4b98888ced37edf (patch)
tree6fc55a02d5c448bf64c06217c40a27f540ab1957 /sfx2
parentc56651e76c2dc8068d53406dcdd6cb6bd1bd9bce (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.hxx13
-rw-r--r--sfx2/source/control/templateabstractview.cxx16
-rw-r--r--sfx2/source/control/templatecontaineritem.cxx156
-rw-r--r--sfx2/source/control/templatelocalview.cxx18
-rw-r--r--sfx2/source/control/thumbnailviewitem.cxx5
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;
}