[Libreoffice-commits] core.git: include/svtools sd/source svtools/source

Michael Meeks michael.meeks at collabora.com
Thu Nov 12 02:25:33 PST 2015


 include/svtools/valueset.hxx                    |   10 ++
 sd/source/ui/animations/SlideTransitionPane.cxx |   17 ++---
 svtools/source/control/valueimp.hxx             |    1 
 svtools/source/control/valueset.cxx             |   81 ++++++++++++++++++++----
 4 files changed, 88 insertions(+), 21 deletions(-)

New commits:
commit 014b0674a17845ac320a4d3de6c7497ad803f17d
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Tue Nov 10 23:01:48 2015 +0000

    Encourage ValueSet to render a legend as well as an icon.
    
    Change-Id: I83688a70b864bddb2af0a0a5b34968099c49d112
    Reviewed-on: https://gerrit.libreoffice.org/19913
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/include/svtools/valueset.hxx b/include/svtools/valueset.hxx
index b51587b..d63146c 100644
--- a/include/svtools/valueset.hxx
+++ b/include/svtools/valueset.hxx
@@ -307,12 +307,17 @@ public:
     void            DoubleClick();
     virtual void    UserDraw( const UserDrawEvent& rUDEvt );
 
+    /// Insert @rImage item.
     void            InsertItem(sal_uInt16 nItemId, const Image& rImage, size_t nPos = VALUESET_APPEND);
+    /// Insert @rImage item with @rStr as either a legend or tooltip depending on @bShowLegend.
     void            InsertItem(sal_uInt16 nItemId, const Image& rImage,
-                               const OUString& rStr, size_t nPos = VALUESET_APPEND);
+                               const OUString& rStr, size_t nPos = VALUESET_APPEND, bool bShowLegend = false);
+    /// Insert an @rColor item with @rStr tooltip.
     void            InsertItem(sal_uInt16 nItemId, const Color& rColor,
                                const OUString& rStr, size_t nPos = VALUESET_APPEND);
+    /// Insert an User Drawn item.
     void            InsertItem(sal_uInt16 nItemId, size_t nPos = VALUESET_APPEND);
+    /// Insert an User Drawn item with @rStr tooltip.
     void            InsertItem(sal_uInt16 nItemId, const OUString& rStr, size_t nPos = VALUESET_APPEND);
     void            RemoveItem(sal_uInt16 nItemId);
 
@@ -336,8 +341,9 @@ public:
         return mnUserVisLines;
     }
     void           SetItemWidth( long nItemWidth = 0 );
-
     void           SetItemHeight( long nLineHeight = 0 );
+    Size           GetLargestItemSize();
+    void           RecalculateItemSizes();
 
     void           SelectItem( sal_uInt16 nItemId );
     sal_uInt16     GetSelectItemId() const
diff --git a/sd/source/ui/animations/SlideTransitionPane.cxx b/sd/source/ui/animations/SlideTransitionPane.cxx
index dc16de9..e223d11 100644
--- a/sd/source/ui/animations/SlideTransitionPane.cxx
+++ b/sd/source/ui/animations/SlideTransitionPane.cxx
@@ -52,9 +52,6 @@
 
 #include <algorithm>
 
-#define TRANSITION_THUMB_WIDTH 64
-#define TRANSITION_THUMB_HEIGHT 40
-
 using namespace ::com::sun::star;
 
 using ::com::sun::star::uno::Reference;
@@ -389,8 +386,6 @@ public:
         set_hexpand( true );
         set_vexpand( true );
         SetExtraSpacing( 2 );
-        SetItemWidth( TRANSITION_THUMB_WIDTH );
-        SetItemHeight( TRANSITION_THUMB_HEIGHT );
     }
     virtual ~TransitionPane() { disposeOnce(); }
 
@@ -444,8 +439,11 @@ SlideTransitionPane::SlideTransitionPane(
         mxView.set( mxModel->getCurrentController(), uno::UNO_QUERY );
 
     // dummy list box of slide transitions for startup.
-    mpVS_TRANSITION_ICONS->InsertItem( 0, Image( BitmapEx( "sd/cmd/transition-none.png" ) ),
-                                       SD_RESSTR( STR_SLIDETRANSITION_NONE ) );
+    mpVS_TRANSITION_ICONS->InsertItem(
+        0, Image( BitmapEx( "sd/cmd/transition-none.png" ) ),
+        SD_RESSTR( STR_SLIDETRANSITION_NONE ),
+        VALUESET_APPEND, /* show legend */ true );
+    mpVS_TRANSITION_ICONS->RecalculateItemSizes();
 
     // set defaults
     mpCB_AUTO_PREVIEW->Check();      // automatic preview on
@@ -1123,7 +1121,9 @@ IMPL_LINK_NOARG_TYPED(SlideTransitionPane, LateInitCallback, Timer *, void)
                 if ( aIcon.IsEmpty() ) // need a fallback
                     aIcon = BitmapEx( "sd/cmd/transition-none.png" );
 
-                mpVS_TRANSITION_ICONS->InsertItem( nPresetOffset + 1, Image( aIcon ), sLabel );
+                mpVS_TRANSITION_ICONS->InsertItem(
+                    nPresetOffset + 1, Image( aIcon ), sLabel,
+                    VALUESET_APPEND, /* show legend */ true );
 
                 m_aNumVariants[ pPreset->getSetId() ] = 1;
             }
@@ -1134,6 +1134,7 @@ IMPL_LINK_NOARG_TYPED(SlideTransitionPane, LateInitCallback, Timer *, void)
         }
         nPresetOffset++;
     }
+    mpVS_TRANSITION_ICONS->RecalculateItemSizes();
 
     SAL_INFO( "sd.transitions", "Item transition offsets in ValueSet:");
     for( size_t i = 0; i < mpVS_TRANSITION_ICONS->GetItemCount(); ++i )
diff --git a/svtools/source/control/valueimp.hxx b/svtools/source/control/valueimp.hxx
index eef2fcf..93c1ae4 100644
--- a/svtools/source/control/valueimp.hxx
+++ b/svtools/source/control/valueimp.hxx
@@ -42,6 +42,7 @@ enum ValueSetItemType
 {
     VALUESETITEM_NONE,
     VALUESETITEM_IMAGE,
+    VALUESETITEM_IMAGE_AND_TEXT,
     VALUESETITEM_COLOR,
     VALUESETITEM_USERDRAW
 };
diff --git a/svtools/source/control/valueset.cxx b/svtools/source/control/valueset.cxx
index 5696b8a..b62d6ce 100644
--- a/svtools/source/control/valueset.cxx
+++ b/svtools/source/control/valueset.cxx
@@ -308,7 +308,9 @@ void ValueSet::ImplFormatItem(vcl::RenderContext& rRenderContext, ValueSetItem*
                 Size  aRectSize = aRect.GetSize();
                 Point aPos(aRect.Left(), aRect.Top());
                 aPos.X() += (aRectSize.Width() - aImageSize.Width()) / 2;
-                aPos.Y() += (aRectSize.Height() - aImageSize.Height()) / 2;
+
+                if (pItem->meType != VALUESETITEM_IMAGE_AND_TEXT)
+                    aPos.Y() += (aRectSize.Height() - aImageSize.Height()) / 2;
 
                 DrawImageFlags  nImageStyle  = DrawImageFlags::NONE;
                 if (!IsEnabled())
@@ -323,6 +325,26 @@ void ValueSet::ImplFormatItem(vcl::RenderContext& rRenderContext, ValueSetItem*
                 }
                 else
                     maVirDev->DrawImage(aPos, pItem->maImage, nImageStyle);
+
+                if (pItem->meType == VALUESETITEM_IMAGE_AND_TEXT)
+                {
+                    maVirDev->SetFont(rRenderContext.GetFont());
+                    maVirDev->SetTextColor((nStyle & WB_MENUSTYLEVALUESET) ? rStyleSettings.GetMenuTextColor() : rStyleSettings.GetWindowTextColor());
+                    maVirDev->SetTextFillColor();
+
+                    long nTxtWidth = maVirDev->GetTextWidth(pItem->maText);
+
+                    if (nTxtWidth > aRect.GetWidth())
+                        maVirDev->SetClipRegion(vcl::Region(aRect));
+
+                    maVirDev->DrawText(Point(aRect.Left() +
+                                             (aRect.GetWidth() - nTxtWidth) / 2,
+                                             aRect.Bottom() - maVirDev->GetTextHeight()),
+                                       pItem->maText);
+
+                    if (nTxtWidth > aRect.GetWidth())
+                        maVirDev->SetClipRegion();
+                }
             }
         }
 
@@ -1584,11 +1606,12 @@ void ValueSet::InsertItem( sal_uInt16 nItemId, const Image& rImage, size_t nPos
 }
 
 void ValueSet::InsertItem( sal_uInt16 nItemId, const Image& rImage,
-                           const OUString& rText, size_t nPos )
+                           const OUString& rText, size_t nPos,
+                           bool bShowLegend )
 {
     ValueSetItem* pItem = new ValueSetItem( *this );
     pItem->mnId     = nItemId;
-    pItem->meType   = VALUESETITEM_IMAGE;
+    pItem->meType   = bShowLegend ? VALUESETITEM_IMAGE_AND_TEXT : VALUESETITEM_IMAGE;
     pItem->maImage  = rImage;
     pItem->maText   = rText;
     ImplInsertItem( pItem, nPos );
@@ -1805,6 +1828,27 @@ void ValueSet::SetItemHeight( long nNewItemHeight )
     }
 }
 
+/**
+ * An inelegant method; sets the item width & height such that
+ * all of the included items and their labels fit; if we can
+ * calculate that.
+ */
+void ValueSet::RecalculateItemSizes()
+{
+    Size aLargestItem = GetLargestItemSize();
+
+    if ( mnUserItemWidth != aLargestItem.Width() ||
+         mnUserItemHeight != aLargestItem.Height() )
+    {
+        mnUserItemWidth = aLargestItem.Width();
+        mnUserItemHeight = aLargestItem.Height();
+        mbFormat = true;
+        queue_resize();
+        if ( IsReallyVisible() && IsUpdateMode() )
+            Invalidate();
+    }
+}
+
 void ValueSet::SelectItem( sal_uInt16 nItemId )
 {
     size_t nItemPos = 0;
@@ -2286,9 +2330,9 @@ void ValueSet::SetHighlightHdl( const Link<ValueSet*,void>& rLink )
     maHighlightHdl = rLink;
 }
 
-Size ValueSet::GetOptimalSize() const
+Size ValueSet::GetLargestItemSize()
 {
-    Size aLargestItemSize;
+    Size aLargestItem;
 
     for (size_t i = 0, n = mItemList.size(); i < n; ++i)
     {
@@ -2296,18 +2340,33 @@ Size ValueSet::GetOptimalSize() const
         if (!pItem->mbVisible)
             continue;
 
-        if (pItem->meType != VALUESETITEM_IMAGE)
+        if (pItem->meType != VALUESETITEM_IMAGE &&
+            pItem->meType != VALUESETITEM_IMAGE_AND_TEXT)
         {
-            //handle determining an optimal size for this case
+            // handle determining an optimal size for this case
             continue;
         }
 
-        Size aImageSize = pItem->maImage.GetSizePixel();
-        aLargestItemSize.Width() = std::max(aLargestItemSize.Width(), aImageSize.Width());
-        aLargestItemSize.Height() = std::max(aLargestItemSize.Height(), aImageSize.Height());
+        Size aSize = pItem->maImage.GetSizePixel();
+        if (pItem->meType == VALUESETITEM_IMAGE_AND_TEXT)
+        {
+            aSize.Height() += 3 * NAME_LINE_HEIGHT +
+                maVirDev->GetTextHeight();
+            aSize.Width() = std::max(aSize.Width(),
+                                     maVirDev->GetTextWidth(pItem->maText) + NAME_OFFSET);
+        }
+
+        aLargestItem.Width() = std::max(aLargestItem.Width(), aSize.Width());
+        aLargestItem.Height() = std::max(aLargestItem.Height(), aSize.Height());
     }
 
-    return CalcWindowSizePixel(aLargestItemSize);
+    return aLargestItem;
+}
+
+Size ValueSet::GetOptimalSize() const
+{
+    return CalcWindowSizePixel(
+        const_cast<ValueSet *>(this)->GetLargestItemSize());
 }
 
 void ValueSet::SetEdgeBlending(bool bNew)


More information about the Libreoffice-commits mailing list