Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


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.bosdonnat@free.fr>


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.