[Libreoffice-commits] core.git: 7 commits - vcl/inc vcl/source vcl/unx

Jan-Marek Glogowski glogow at fbihome.de
Thu Sep 22 18:21:54 UTC 2016


 vcl/inc/svdata.hxx                  |    1 
 vcl/source/window/dockingarea.cxx   |    2 -
 vcl/source/window/menu.cxx          |   18 ++++++++++---
 vcl/source/window/menubarwindow.cxx |   16 ++++++++++--
 vcl/source/window/status.cxx        |    3 +-
 vcl/unx/kde4/KDEData.cxx            |    2 +
 vcl/unx/kde4/KDESalFrame.cxx        |   21 +++++++---------
 vcl/unx/kde4/KDESalGraphics.cxx     |   47 ++++++++++++++++++++++++++++--------
 8 files changed, 81 insertions(+), 29 deletions(-)

New commits:
commit c6fc963c534bc9069ef975246e5d619777b9f570
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Thu Sep 22 18:35:38 2016 +0200

    KDE4 enable and handle rollover menubar
    
    Change-Id: Ice2657c8e8ecccb67d1b14292514a42ff37caa39

diff --git a/vcl/unx/kde4/KDEData.cxx b/vcl/unx/kde4/KDEData.cxx
index 71267a0..1caf6e8 100644
--- a/vcl/unx/kde4/KDEData.cxx
+++ b/vcl/unx/kde4/KDEData.cxx
@@ -46,6 +46,8 @@ void KDEData::initNWF()
     pSVData->maNWFData.mbDockingAreaSeparateTB = true;
     // no borders for menu, theming does that
     pSVData->maNWFData.mbFlatMenu = true;
+    // Qt theme engines may support a rollover menubar
+    pSVData->maNWFData.mbRolloverMenubar = true;
 
     // Styled menus need additional space
     QStyle *style = QApplication::style();
diff --git a/vcl/unx/kde4/KDESalFrame.cxx b/vcl/unx/kde4/KDESalFrame.cxx
index a1086ba..23a7805 100644
--- a/vcl/unx/kde4/KDESalFrame.cxx
+++ b/vcl/unx/kde4/KDESalFrame.cxx
@@ -208,6 +208,10 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
         }
     }
 
+    // Menu
+    std::unique_ptr<KMenuBar> pMenuBar = std::unique_ptr<KMenuBar>( new KMenuBar() );
+    QPalette qMenuCG = pMenuBar->palette();
+
     Color aFore = toColor( pal.color( QPalette::Active, QPalette::WindowText ) );
     Color aBack = toColor( pal.color( QPalette::Active, QPalette::Window ) );
     Color aText = toColor( pal.color( QPalette::Active, QPalette::Text ) );
@@ -215,6 +219,9 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
     Color aButn = toColor( pal.color( QPalette::Active, QPalette::ButtonText ) );
     Color aMid = toColor( pal.color( QPalette::Active, QPalette::Mid ) );
     Color aHigh = toColor( pal.color( QPalette::Active, QPalette::Highlight ) );
+    Color aHighText = toColor( pal.color( QPalette::Active, QPalette::HighlightedText ) );
+
+    style.SetSkipDisabledInMenus( TRUE );
 
     // Foreground
     style.SetRadioCheckTextColor( aFore );
@@ -257,7 +264,7 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
 
     // Selection
     style.SetHighlightColor( aHigh );
-    style.SetHighlightTextColor( toColor(pal.color( QPalette::HighlightedText))  );
+    style.SetHighlightTextColor( aHighText );
 
     // Tooltip
     style.SetHelpColor( toColor( QToolTip::palette().color( QPalette::Active, QPalette::ToolTipBase )));
@@ -269,7 +276,6 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
     style.SetAppFont( aFont );
 
     style.SetMenuFont( aFont ); // will be changed according to pMenuBar
-    //style.SetToolFont( aFont ); //already set above
     style.SetLabelFont( aFont );
     style.SetInfoFont( aFont );
     style.SetRadioCheckFont( aFont );
@@ -291,13 +297,6 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
     int flash_time = QApplication::cursorFlashTime();
     style.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME );
 
-    // Menu
-    style.SetSkipDisabledInMenus( TRUE );
-    std::unique_ptr<KMenuBar> pMenuBar = std::unique_ptr<KMenuBar>( new KMenuBar() );
-
-    // Color
-    QPalette qMenuCG = pMenuBar->palette();
-
     // Menu text and background color, theme specific
     Color aMenuFore = toColor( qMenuCG.color( QPalette::WindowText ) );
     Color aMenuBack = toColor( qMenuCG.color( QPalette::Window ) );
@@ -307,7 +306,7 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
     style.SetMenuColor( aMenuBack );
     style.SetMenuBarColor( aMenuBack );
     style.SetMenuHighlightColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) );
-    style.SetMenuHighlightTextColor( aMenuFore );
+    style.SetMenuHighlightTextColor( toColor ( qMenuCG.color( QPalette::HighlightedText ) ) );
 
     // set special menubar higlight text color
     if ( QApplication::style()->inherits( "HighContrastStyle" ) )
commit 843b9d5dba5098c2676491dda66bed31e57f4329
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Thu Sep 22 18:27:49 2016 +0200

    VCL add support for rollover menubars
    
    KDE theme engines can explicitly support rollover menubars via
    styleHint( QStyle::SH_MenuBar_MouseTracking ).
    
    So this adds support for this feature to the vcl::Menu.
    
    Change-Id: Ica923ff2d06cfd54e548ba858b3d90f70d9c255a

diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index a1a76a1..128cebf 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -278,6 +278,7 @@ struct ImplSVNWFData
     bool                    mbDDListBoxNoTextArea:1;
     bool                    mbEnableAccel:1;                // whether or not accelerators are shown
     bool                    mbAutoAccel:1;                  // whether accelerators are only shown when Alt is held down
+    bool                    mbRolloverMenubar:1;            // theming engine supports rollover in menubar
 };
 
 struct BlendFrameCache
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index b185a16..579e993 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -1804,11 +1804,21 @@ void Menu::ImplPaint(vcl::RenderContext& rRenderContext,
             {
                 if (IsMenuBar())
                 {
-                    if (bRollover)
-                        rRenderContext.SetTextColor(rSettings.GetMenuBarRolloverTextColor());
-                    else if (bHighlighted)
-                        rRenderContext.SetTextColor(rSettings.GetMenuBarHighlightTextColor());
+                    if (!ImplGetSVData()->maNWFData.mbRolloverMenubar)
+                    {
+                        if (bRollover)
+                            rRenderContext.SetTextColor(rSettings.GetMenuBarRolloverTextColor());
+                        else if (bHighlighted)
+                            rRenderContext.SetTextColor(rSettings.GetMenuBarHighlightTextColor());
+                    }
                     else
+                    {
+                        if (bHighlighted)
+                            rRenderContext.SetTextColor(rSettings.GetMenuBarHighlightTextColor());
+                        else if (bRollover)
+                            rRenderContext.SetTextColor(rSettings.GetMenuBarRolloverTextColor());
+                    }
+                    if (!bRollover && !bHighlighted)
                         rRenderContext.SetTextColor(rSettings.GetMenuBarTextColor());
                 }
                 else if (bHighlighted)
diff --git a/vcl/source/window/menubarwindow.cxx b/vcl/source/window/menubarwindow.cxx
index 812fff4..6ab3f8b 100644
--- a/vcl/source/window/menubarwindow.cxx
+++ b/vcl/source/window/menubarwindow.cxx
@@ -592,7 +592,17 @@ void MenuBarWindow::HighlightItem(vcl::RenderContext& rRenderContext, sal_uInt16
                 Rectangle aRect = Rectangle(Point(nX, 1), Size(pData->aSz.Width(), GetOutputSizePixel().Height() - 2));
                 rRenderContext.Push(PushFlags::CLIPREGION);
                 rRenderContext.IntersectClipRegion(aRect);
-                bool bRollover = nPos != nHighlightedItem;
+                bool bRollover, bHighlight;
+                if (!ImplGetSVData()->maNWFData.mbRolloverMenubar)
+                {
+                    bHighlight = true;
+                    bRollover = nPos != nHighlightedItem;
+                }
+                else
+                {
+                    bRollover = nPos == nRolloveredItem;
+                    bHighlight = nPos == nHighlightedItem;
+                }
                 if (rRenderContext.IsNativeControlSupported(ControlType::Menubar, ControlPart::MenuItem) &&
                     rRenderContext.IsNativeControlSupported(ControlType::Menubar, ControlPart::Entire))
                 {
@@ -630,7 +640,7 @@ void MenuBarWindow::HighlightItem(vcl::RenderContext& rRenderContext, sal_uInt16
                     rRenderContext.DrawRect(aRect);
                 }
                 rRenderContext.Pop();
-                pMenu->ImplPaint(rRenderContext, 0, 0, pData, true/*bHighlight*/, false, bRollover);
+                pMenu->ImplPaint(rRenderContext, 0, 0, pData, bHighlight, false, bRollover);
             }
             return;
         }
@@ -875,6 +885,8 @@ void MenuBarWindow::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
     pMenu->ImplPaint(rRenderContext, 0);
     if (nHighlightedItem != ITEMPOS_INVALID)
         HighlightItem(rRenderContext, nHighlightedItem);
+    else if (ImplGetSVData()->maNWFData.mbRolloverMenubar && nRolloveredItem != ITEMPOS_INVALID)
+        HighlightItem(rRenderContext, nRolloveredItem);
 
     // in high contrast mode draw a separating line on the lower edge
     if (!rRenderContext.IsNativeControlSupported( ControlType::Menubar, ControlPart::Entire) &&
commit 0de3368e4d82d579b8e2550391e142607cbb6aa8
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Thu Sep 22 17:42:01 2016 +0200

    tdf#97721 KDE4 no PRESSED state for checkboxes
    
    Selecting radio and check boxes is handled via
    QStyleOptionMenuItem::checked. Actually forwarding the
    QStyle::State_Sunken creates strange artifacts in all
    menus.
    
    Change-Id: Ia0b0864b9bec5961023b4f25315a8acf1fae4683

diff --git a/vcl/unx/kde4/KDESalGraphics.cxx b/vcl/unx/kde4/KDESalGraphics.cxx
index 9cdd627..cd02e38 100644
--- a/vcl/unx/kde4/KDESalGraphics.cxx
+++ b/vcl/unx/kde4/KDESalGraphics.cxx
@@ -343,7 +343,7 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
             QRect rect( menuItemRect.topLeft() - widgetRect.topLeft(),
                 widgetRect.size().expandedTo( menuItemRect.size()));
             draw( QStyle::CE_MenuItem, &option, m_image.get(),
-                  vclStateValue2StateFlag(nControlState, value), rect );
+                  vclStateValue2StateFlag(nControlState & ~ControlState::PRESSED, value), rect );
         }
         else if( part == ControlPart::Entire )
         {
commit c04ce0acbb68f9770e29c2e25fb74c2eb7aa2e11
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Mon Sep 19 22:47:37 2016 +0200

    KDE4 no more progress bar flickering
    
    This will always redraw the progress bar over the last one.
    It stops the flickering at least in KDE4 from re-painting the
    background, but obvously will break any transparent or alaiasing
    effect, if it was used.
    
    There is actually a mbProgressNeedsErase in the global settings,
    so actually use it when setting a new progress value.
    
    Change-Id: Ic62784da4f6d08bf0e03a9e04848a5cc687ee236

diff --git a/vcl/source/window/status.cxx b/vcl/source/window/status.cxx
index 0035714..70778b0 100644
--- a/vcl/source/window/status.cxx
+++ b/vcl/source/window/status.cxx
@@ -1352,7 +1352,8 @@ void StatusBar::SetProgressValue( sal_uInt16 nNewPercent )
     &&   IsReallyVisible()
     &&   (!mnPercent || (mnPercent != nNewPercent)) )
     {
-        Invalidate(maPrgsFrameRect);
+        bool bNeedErase = ImplGetSVData()->maNWFData.mbProgressNeedsErase;
+        Invalidate(maPrgsFrameRect, bNeedErase ? InvalidateFlags::NONE : InvalidateFlags::NoErase);
         Flush();
     }
     mnPercent = nNewPercent;
commit 78b944747e374c9245173072cf78e67118344d10
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Mon Sep 19 22:31:17 2016 +0200

    tdf#94172 KDE4 fix gradient toolbars
    
    Bug introduced by commit 4f5fe008a3d5f0b5ddfa656299306cff9d57d802.
    The code was moved from ImplInitSettings to ApplySettings and somehow
    a not (!) got lost.
    
    Change-Id: Ie3fa4fb99d030d106aab712cd6bdafada8c6d423

diff --git a/vcl/source/window/dockingarea.cxx b/vcl/source/window/dockingarea.cxx
index 1806519..a1de6bc 100644
--- a/vcl/source/window/dockingarea.cxx
+++ b/vcl/source/window/dockingarea.cxx
@@ -149,7 +149,7 @@ void DockingAreaWindow::ApplySettings(vcl::RenderContext& rRenderContext)
 
         rRenderContext.SetBackground(aWallpaper);
     }
-    else if (rRenderContext.IsNativeControlSupported(ControlType::Toolbar, ControlPart::Entire))
+    else if (!rRenderContext.IsNativeControlSupported(ControlType::Toolbar, ControlPart::Entire))
     {
         Wallpaper aWallpaper;
         aWallpaper.SetStyle(WallpaperStyle::ApplicationGradient);
commit 987a4a994edf1512aaa7a92721c4b6e829806b62
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Mon Sep 19 22:24:12 2016 +0200

    tdf#94112 KDE4 use disabled WindowText color
    
    Libre office just has a general disabled color. Instead of the
    general QPalette::Mid, use the color QPalette::WindowText of
    the palette QPalette::Disabled.
    
    Change-Id: Ie6943b455d3e6545289b241ee4ab85128f4fd7ab

diff --git a/vcl/unx/kde4/KDESalFrame.cxx b/vcl/unx/kde4/KDESalFrame.cxx
index 9edeb11..a1086ba 100644
--- a/vcl/unx/kde4/KDESalFrame.cxx
+++ b/vcl/unx/kde4/KDESalFrame.cxx
@@ -243,7 +243,7 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
     style.SetTabHighlightTextColor( aButn );
 
     // Disable color
-    style.SetDisableColor( aMid );
+    style.SetDisableColor( toColor( pal.color( QPalette::Disabled, QPalette::WindowText ) ) );
 
     // Workspace
     style.SetWorkspaceColor( aMid );
commit 3c923db82a649ecec83f6231f97a847d0b8e19ce
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Wed Oct 29 15:54:29 2014 +0100

    KDE4 Switch default image color to transparent...
    
    ... and just fill the painted image once at the beginning.
    
    Also adapt background based on the control information from Qt4.
    
    Change-Id: I39c03b2ca779381920e2597b4bea7973fea6ae2a

diff --git a/vcl/unx/kde4/KDESalGraphics.cxx b/vcl/unx/kde4/KDESalGraphics.cxx
index 76f8a58..9cdd627 100644
--- a/vcl/unx/kde4/KDESalGraphics.cxx
+++ b/vcl/unx/kde4/KDESalGraphics.cxx
@@ -220,13 +220,46 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
     {
         m_image.reset(new QImage( widgetRect.width(), widgetRect.height(), QImage::Format_ARGB32 ) );
     }
-    m_image->fill(KApplication::palette().color(QPalette::Window).rgb());
+
+    // Default image color - just once
+    switch (type)
+    {
+        case ControlType::MenuPopup:
+            if( part == ControlPart::MenuItemCheckMark || part == ControlPart::MenuItemRadioMark )
+            {
+                // it is necessary to fill the background transparently first, as this
+                // is painted after menuitem highlight, otherwise there would be a grey area
+                m_image->fill( Qt::transparent );
+                break;
+            }
+            SAL_FALLTHROUGH; // QPalette::Window
+        case ControlType::Menubar:
+        case ControlType::WindowBackground:
+            m_image->fill( KApplication::palette().color(QPalette::Window).rgb() );
+            break;
+        case ControlType::Tooltip:
+            m_image->fill(KApplication::palette().color(QPalette::ToolTipBase).rgb());
+            break;
+        case ControlType::Pushbutton:
+            m_image->fill(KApplication::palette().color(QPalette::Button).rgb());
+            break;
+        case ControlType::Scrollbar:
+            if ((part == ControlPart::DrawBackgroundVert)
+                || (part == ControlPart::DrawBackgroundHorz))
+            {
+                m_image->fill( KApplication::palette().color(QPalette::Window).rgb() );
+                break;
+            }
+            SAL_FALLTHROUGH; // Qt::transparent
+        default:
+            m_image->fill( Qt::transparent );
+            break;
+    }
 
     QRegion* localClipRegion = nullptr;
 
     if (type == ControlType::Pushbutton)
     {
-        m_image->fill( Qt::transparent );
         QStyleOptionButton option;
         draw( QStyle::CE_PushButton, &option, m_image.get(),
               vclStateValue2StateFlag(nControlState, value) );
@@ -309,7 +342,6 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
             QRect menuItemRect( region2QRect( menuVal->maItemRect ));
             QRect rect( menuItemRect.topLeft() - widgetRect.topLeft(),
                 widgetRect.size().expandedTo( menuItemRect.size()));
-            m_image->fill( Qt::transparent );
             draw( QStyle::CE_MenuItem, &option, m_image.get(),
                   vclStateValue2StateFlag(nControlState, value), rect );
         }
@@ -328,7 +360,6 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
     }
     else if ( (type == ControlType::Toolbar) && (part == ControlPart::Button) )
     {
-        m_image->fill( Qt::transparent );
         QStyleOptionToolButton option;
 
         option.arrowType = Qt::NoArrow;
@@ -396,7 +427,6 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
                       vclStateValue2StateFlag(nControlState, value) );
                 break;
             case ControlPart::ButtonDown:
-                m_image->fill( Qt::transparent );
                 option.subControls = QStyle::SC_ComboBoxArrow;
                 draw( QStyle::CC_ComboBox, &option, m_image.get(),
                       vclStateValue2StateFlag(nControlState, value) );
@@ -407,7 +437,6 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
     }
     else if (type == ControlType::ListNode)
     {
-        m_image->fill( Qt::transparent );
         QStyleOption option;
         option.state = QStyle::State_Item | QStyle::State_Children;
 
@@ -419,7 +448,6 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
     }
     else if (type == ControlType::Checkbox)
     {
-        m_image->fill( Qt::transparent );
         QStyleOptionButton option;
         draw( QStyle::CE_CheckBox, &option, m_image.get(),
                vclStateValue2StateFlag(nControlState, value) );
@@ -482,7 +510,6 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
     }
     else if (type == ControlType::Radiobutton)
     {
-        m_image->fill( Qt::transparent );
         QStyleOptionButton option;
         draw( QStyle::CE_RadioButton, &option, m_image.get(),
               vclStateValue2StateFlag(nControlState, value) );
@@ -504,7 +531,7 @@ bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
     }
     else if (type == ControlType::WindowBackground)
     {
-        m_image->fill(KApplication::palette().color(QPalette::Window).rgb());
+        // Nothing to do - see "Default image color" switch ^^
     }
     else if (type == ControlType::Fixedline)
     {


More information about the Libreoffice-commits mailing list