Kaydet (Commit) 8eb1fb9e authored tarafından Isamu Mogi's avatar Isamu Mogi Kaydeden (comit) Fridrich Strba

Add mouse rollover effect to menubar on KDE and Windows

- Add mouse rollover handling code to vcl::MenuBarWindow and vcl::Menu
- Add member variable of rollover color to StyleSettings and ImplStyleData
- Add rollover color definitions for each platforms

Change-Id: I9ececd8a7089918ac63c5f2027c0c2f361a9d227
Reviewed-on: https://gerrit.libreoffice.org/3856Reviewed-by: 's avatarFridrich Strba <fridrich@documentfoundation.org>
Tested-by: 's avatarFridrich Strba <fridrich@documentfoundation.org>
üst d910bee3
......@@ -155,7 +155,7 @@ protected:
SAL_DLLPRIVATE sal_uInt16 ImplGetFirstVisible() const;
SAL_DLLPRIVATE sal_uInt16 ImplGetPrevVisible( sal_uInt16 nPos ) const;
SAL_DLLPRIVATE sal_uInt16 ImplGetNextVisible( sal_uInt16 nPos ) const;
SAL_DLLPRIVATE void ImplPaint( Window* pWin, sal_uInt16 nBorder, long nOffY = 0, MenuItemData* pThisDataOnly = 0, sal_Bool bHighlighted = sal_False, bool bLayout = false ) const;
SAL_DLLPRIVATE void ImplPaint( Window* pWin, sal_uInt16 nBorder, long nOffY = 0, MenuItemData* pThisDataOnly = 0, sal_Bool bHighlighted = sal_False, bool bLayout = false, bool bRollover = false ) const;
SAL_DLLPRIVATE void ImplSelect();
SAL_DLLPRIVATE void ImplCallHighlight( sal_uInt16 nHighlightItem );
SAL_DLLPRIVATE void ImplCallEventListeners( sal_uLong nEvent, sal_uInt16 nPos );
......
......@@ -278,12 +278,14 @@ private:
Color maLightColor;
Color maLinkColor;
Color maMenuBarColor;
Color maMenuBarRolloverColor;
Color maMenuBorderColor;
Color maMenuColor;
Color maMenuHighlightColor;
Color maMenuHighlightTextColor;
Color maMenuTextColor;
Color maMenuBarTextColor;
Color maMenuBarRolloverTextColor;
Color maMonoColor;
Color maRadioCheckTextColor;
Color maShadowColor;
......@@ -581,6 +583,10 @@ public:
{ CopyData(); mpData->maMenuBarColor = rColor; }
const Color& GetMenuBarColor() const
{ return mpData->maMenuBarColor; }
void SetMenuBarRolloverColor( const Color& rColor )
{ CopyData(); mpData->maMenuBarRolloverColor = rColor; }
const Color& GetMenuBarRolloverColor() const
{ return mpData->maMenuBarRolloverColor; }
void SetMenuBorderColor( const Color& rColor )
{ CopyData(); mpData->maMenuBorderColor = rColor; }
const Color& GetMenuBorderColor() const
......@@ -593,6 +599,10 @@ public:
{ CopyData(); mpData->maMenuBarTextColor = rColor; }
const Color& GetMenuBarTextColor() const
{ return mpData->maMenuBarTextColor; }
void SetMenuBarRolloverTextColor( const Color& rColor )
{ CopyData(); mpData->maMenuBarRolloverTextColor = rColor; }
const Color& GetMenuBarRolloverTextColor() const
{ return mpData->maMenuBarRolloverTextColor; }
void SetMenuHighlightColor( const Color& rColor )
{ CopyData(); mpData->maMenuHighlightColor = rColor; }
const Color& GetMenuHighlightColor() const
......
......@@ -1314,6 +1314,7 @@ void AquaSalFrame::UpdateSettings( AllSettings& rSettings )
aStyleSettings.GetMenuTextColor(), mpWindow ) );
aStyleSettings.SetMenuTextColor( aMenuTextColor );
aStyleSettings.SetMenuBarTextColor( aMenuTextColor );
aStyleSettings.SetMenuBarRolloverTextColor( aMenuTextColor );
aStyleSettings.SetCursorBlinkTime( 500 );
......
......@@ -282,12 +282,14 @@ ImplStyleData::ImplStyleData( const ImplStyleData& rData ) :
maLightColor( rData.maLightColor ),
maLinkColor( rData.maLinkColor ),
maMenuBarColor( rData.maMenuBarColor ),
maMenuBarRolloverColor( rData.maMenuBarRolloverColor ),
maMenuBorderColor( rData.maMenuBorderColor ),
maMenuColor( rData.maMenuColor ),
maMenuHighlightColor( rData.maMenuHighlightColor ),
maMenuHighlightTextColor( rData.maMenuHighlightTextColor ),
maMenuTextColor( rData.maMenuTextColor ),
maMenuBarTextColor( rData.maMenuBarTextColor ),
maMenuBarRolloverTextColor( rData.maMenuBarRolloverTextColor ),
maMonoColor( rData.maMonoColor ),
maRadioCheckTextColor( rData.maRadioCheckTextColor ),
maShadowColor( rData.maShadowColor ),
......@@ -420,9 +422,11 @@ void ImplStyleData::SetStandardStyles()
maDeactiveBorderColor = Color( COL_LIGHTGRAY );
maMenuColor = Color( COL_LIGHTGRAY );
maMenuBarColor = Color( COL_LIGHTGRAY );
maMenuBarRolloverColor = Color( COL_BLUE );
maMenuBorderColor = Color( COL_LIGHTGRAY );
maMenuTextColor = Color( COL_BLACK );
maMenuBarTextColor = Color( COL_BLACK );
maMenuBarRolloverTextColor = Color( COL_WHITE );
maMenuHighlightColor = Color( COL_BLUE );
maMenuHighlightTextColor = Color( COL_WHITE );
maHighlightColor = Color( COL_BLUE );
......@@ -930,9 +934,11 @@ sal_Bool StyleSettings::operator ==( const StyleSettings& rSet ) const
(mpData->maDeactiveBorderColor == rSet.mpData->maDeactiveBorderColor) &&
(mpData->maMenuColor == rSet.mpData->maMenuColor) &&
(mpData->maMenuBarColor == rSet.mpData->maMenuBarColor) &&
(mpData->maMenuBarRolloverColor == rSet.mpData->maMenuBarRolloverColor) &&
(mpData->maMenuBorderColor == rSet.mpData->maMenuBorderColor) &&
(mpData->maMenuTextColor == rSet.mpData->maMenuTextColor) &&
(mpData->maMenuBarTextColor == rSet.mpData->maMenuBarTextColor) &&
(mpData->maMenuBarRolloverTextColor == rSet.mpData->maMenuBarRolloverTextColor) &&
(mpData->maMenuHighlightColor == rSet.mpData->maMenuHighlightColor) &&
(mpData->maMenuHighlightTextColor == rSet.mpData->maMenuHighlightTextColor) &&
(mpData->maHighlightColor == rSet.mpData->maHighlightColor) &&
......
......@@ -2613,7 +2613,7 @@ static String getShortenedString( const String& i_rLong, Window* i_pWin, long i_
return aNonMnem;
}
void Menu::ImplPaint( Window* pWin, sal_uInt16 nBorder, long nStartY, MenuItemData* pThisItemOnly, sal_Bool bHighlighted, bool bLayout ) const
void Menu::ImplPaint( Window* pWin, sal_uInt16 nBorder, long nStartY, MenuItemData* pThisItemOnly, sal_Bool bHighlighted, bool bLayout, bool bRollover ) const
{
// for symbols: nFontHeight x nFontHeight
long nFontHeight = pWin->GetTextHeight();
......@@ -2648,8 +2648,13 @@ void Menu::ImplPaint( Window* pWin, sal_uInt16 nBorder, long nStartY, MenuItemDa
MenuItemData* pData = pItemList->GetDataFromPos( n );
if ( ImplIsVisible( n ) && ( !pThisItemOnly || ( pData == pThisItemOnly ) ) )
{
if ( pThisItemOnly && bHighlighted )
pWin->SetTextColor( rSettings.GetMenuHighlightTextColor() );
if ( pThisItemOnly )
{
if ( bIsMenuBar && bRollover )
pWin->SetTextColor( rSettings.GetMenuBarRolloverTextColor() );
else if ( bHighlighted )
pWin->SetTextColor( rSettings.GetMenuHighlightTextColor() );
}
Point aPos( aTopLeft );
aPos.Y() += nBorder;
......@@ -5391,7 +5396,7 @@ void MenuBarWindow::MouseButtonDown( const MouseEvent& rMEvt )
{
mbAutoPopup = sal_True;
sal_uInt16 nEntry = ImplFindEntry( rMEvt.GetPosPixel() );
if ( ( nEntry != ITEMPOS_INVALID ) && ( nEntry != nHighlightedItem ) )
if ( ( nEntry != ITEMPOS_INVALID ) && !pActivePopup )
{
ChangeHighlightItem( nEntry, sal_False );
}
......@@ -5408,10 +5413,15 @@ void MenuBarWindow::MouseButtonUp( const MouseEvent& )
void MenuBarWindow::MouseMove( const MouseEvent& rMEvt )
{
// only highlight during Move if if was already highlighted.
if ( rMEvt.IsSynthetic() || rMEvt.IsLeaveWindow() || rMEvt.IsEnterWindow() || ( nHighlightedItem == ITEMPOS_INVALID ) )
if ( rMEvt.IsSynthetic() || rMEvt.IsEnterWindow() )
return;
if ( rMEvt.IsLeaveWindow() && !pActivePopup )
{
ChangeHighlightItem( ITEMPOS_INVALID, sal_False );
return;
}
if( bIgnoreFirstMove )
{
bIgnoreFirstMove = sal_False;
......@@ -5421,7 +5431,12 @@ void MenuBarWindow::MouseMove( const MouseEvent& rMEvt )
sal_uInt16 nEntry = ImplFindEntry( rMEvt.GetPosPixel() );
if ( ( nEntry != ITEMPOS_INVALID )
&& ( nEntry != nHighlightedItem ) )
{
if ( ! pActivePopup )
mbAutoPopup = sal_False;
ChangeHighlightItem( nEntry, sal_False );
}
}
void MenuBarWindow::ChangeHighlightItem( sal_uInt16 n, sal_Bool bSelectEntry, sal_Bool bAllowRestoreFocus, sal_Bool bDefaultToDocument)
......@@ -5525,6 +5540,7 @@ void MenuBarWindow::HighlightItem( sal_uInt16 nPos, sal_Bool bHighlight )
Rectangle aRect = Rectangle( Point( nX, 1 ), Size( pData->aSz.Width(), GetOutputSizePixel().Height()-2 ) );
Push( PUSH_CLIPREGION );
IntersectClipRegion( aRect );
bool bRollover = bHighlight && ( !pActivePopup && !mbAutoPopup );
if ( bHighlight )
{
if( IsNativeControlSupported( CTRL_MENUBAR, PART_MENU_ITEM ) &&
......@@ -5550,15 +5566,23 @@ void MenuBarWindow::HighlightItem( sal_uInt16 nPos, sal_Bool bHighlight )
ImplAddNWFSeparator( this, aControlValue );
// draw selected item
ControlState nState = CTRL_STATE_ENABLED;
if ( bRollover )
nState |= CTRL_STATE_ROLLOVER;
else
nState |= CTRL_STATE_SELECTED;
DrawNativeControl( CTRL_MENUBAR, PART_MENU_ITEM,
aRect,
CTRL_STATE_ENABLED | CTRL_STATE_SELECTED,
nState,
aControlValue,
OUString() );
}
else
{
SetFillColor( GetSettings().GetStyleSettings().GetMenuHighlightColor() );
if ( bRollover )
SetFillColor( GetSettings().GetStyleSettings().GetMenuBarRolloverColor() );
else
SetFillColor( GetSettings().GetStyleSettings().GetMenuHighlightColor() );
SetLineColor();
DrawRect( aRect );
}
......@@ -5588,7 +5612,7 @@ void MenuBarWindow::HighlightItem( sal_uInt16 nPos, sal_Bool bHighlight )
Erase( aRect );
}
Pop();
pMenu->ImplPaint( this, 0, 0, pData, bHighlight );
pMenu->ImplPaint( this, 0, 0, pData, bHighlight, false, bRollover );
}
return;
}
......
......@@ -3061,7 +3061,7 @@ sal_Bool GtkSalGraphics::NWPaintGTKMenubar(
if( nPart == PART_MENU_ITEM )
{
if( nState & (CTRL_STATE_SELECTED|CTRL_STATE_ROLLOVER) )
if( nState & CTRL_STATE_SELECTED )
{
gtk_widget_style_get( gWidgetData[m_nXScreen].gMenuItemMenubarWidget,
"selected_shadow_type", &selected_shadow_type,
......@@ -3106,7 +3106,7 @@ sal_Bool GtkSalGraphics::NWPaintGTKMenubar(
else if( nPart == PART_MENU_ITEM )
{
if( nState & (CTRL_STATE_SELECTED|CTRL_STATE_ROLLOVER) )
if( nState & CTRL_STATE_SELECTED )
{
gtk_paint_box( gWidgetData[m_nXScreen].gMenuItemMenubarWidget->style,
gdkDrawable,
......@@ -3860,6 +3860,7 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings )
aBackColor = getColor( pMenubarStyle->bg[GTK_STATE_NORMAL] );
aStyleSet.SetMenuBarColor( aBackColor );
aStyleSet.SetMenuBarRolloverColor( aBackColor );
aBackColor = getColor( pMenuStyle->bg[GTK_STATE_NORMAL] );
aTextColor = getColor( pMenuTextStyle->fg[GTK_STATE_NORMAL] );
aStyleSet.SetMenuColor( aBackColor );
......@@ -3867,13 +3868,16 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings )
aTextColor = getColor( pMenubarStyle->fg[GTK_STATE_NORMAL] );
aStyleSet.SetMenuBarTextColor( aTextColor );
aStyleSet.SetMenuBarRolloverTextColor( aTextColor );
#if OSL_DEBUG_LEVEL > 1
std::fprintf( stderr, "==\n" );
std::fprintf( stderr, "MenuColor = %x (%d)\n", (int)aStyleSet.GetMenuColor().GetColor(), aStyleSet.GetMenuColor().GetLuminance() );
std::fprintf( stderr, "MenuTextColor = %x (%d)\n", (int)aStyleSet.GetMenuTextColor().GetColor(), aStyleSet.GetMenuTextColor().GetLuminance() );
std::fprintf( stderr, "MenuBarColor = %x (%d)\n", (int)aStyleSet.GetMenuBarColor().GetColor(), aStyleSet.GetMenuBarColor().GetLuminance() );
std::fprintf( stderr, "MenuBarRolloverColor = %x (%d)\n", (int)aStyleSet.GetMenuBarRolloverColor().GetColor(), aStyleSet.GetMenuRolloverBarColor().GetLuminance() );
std::fprintf( stderr, "MenuBarTextColor = %x (%d)\n", (int)aStyleSet.GetMenuBarTextColor().GetColor(), aStyleSet.GetMenuBarTextColor().GetLuminance() );
std::fprintf( stderr, "MenuBarRolloverTextColor = %x (%d)\n", (int)aStyleSet.GetMenuBarRolloverTextColor().GetColor(), aStyleSet.GetMenuBarRolloverTextColor().GetLuminance() );
std::fprintf( stderr, "LightColor = %x (%d)\n", (int)aStyleSet.GetLightColor().GetColor(), aStyleSet.GetLightColor().GetLuminance() );
std::fprintf( stderr, "ShadowColor = %x (%d)\n", (int)aStyleSet.GetShadowColor().GetColor(), aStyleSet.GetShadowColor().GetLuminance() );
std::fprintf( stderr, "DarkShadowColor = %x (%d)\n", (int)aStyleSet.GetDarkShadowColor().GetColor(), aStyleSet.GetDarkShadowColor().GetLuminance() );
......
......@@ -1175,10 +1175,12 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings )
gtk_style_context_get_background_color( mpMenuBarStyle, GTK_STATE_FLAG_NORMAL, &background_color );
aBackColor = getColor( background_color );
aStyleSet.SetMenuBarColor( aBackColor );
aStyleSet.SetMenuBarRolloverColor( aBackColor );
gtk_style_context_get_color( mpMenuBarStyle, GTK_STATE_FLAG_NORMAL, &text_color );
aTextColor = getColor( text_color );
aStyleSet.SetMenuBarTextColor( aTextColor );
aStyleSet.SetMenuBarRolloverTextColor( aTextColor );
// menu items
gtk_style_context_get_color( mpMenuStyle, GTK_STATE_FLAG_NORMAL, &color );
......
......@@ -777,6 +777,9 @@ sal_Bool WidgetPainter::drawStyledWidget( QWidget *pWidget,
int nMenuItem = ( nStyle & QStyle::Style_Enabled )? m_nMenuBarEnabledItem: m_nMenuBarDisabledItem;
QMenuItem *pMenuItem = static_cast<QMenuBar*>( pWidget )->findItem( nMenuItem );
if ( nStyle & QStyle::Style_MouseOver )
nStyle |= QStyle::Style_Active;
if ( nStyle & QStyle::Style_Selected )
nStyle |= QStyle::Style_Active | QStyle::Style_Down | QStyle::Style_HasFocus;
......@@ -1983,6 +1986,7 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
aStyleSettings.SetMenuBarColor( aMenuBack );
aStyleSettings.SetMenuHighlightColor( toColor ( qMenuCG.highlight() ) );
aStyleSettings.SetMenuBarRolloverColor( toColor ( qMenuCG.highlight() ) );
// Menu items higlight text color, theme specific
if ( kapp->style().inherits( "HighContrastStyle" ) ||
......@@ -1998,10 +2002,15 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
// set special menubar higlight text color
if ( kapp->style().inherits( "HighContrastStyle" ) )
{
ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.highlightedText() );
aStyleSettings.SetMenuBarRolloverTextColor( toColor( qMenuCG.highlightedText() ) );
}
else
{
ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
aStyleSettings.SetMenuBarRolloverTextColor( aMenuFore );
}
// Font
aFont = toFont( pMenuBar->font(), rSettings.GetUILanguageTag().getLocale() );
aStyleSettings.SetMenuFont( aFont );
......
......@@ -303,14 +303,21 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings )
style.SetMenuBarColor( aMenuBack );
style.SetMenuHighlightColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) );
style.SetMenuBarRolloverColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) );
style.SetMenuHighlightTextColor( aMenuFore );
// set special menubar higlight text color
if ( kapp->style()->inherits( "HighContrastStyle" ) )
{
ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.color( QPalette::HighlightedText ) );
style.SetMenuBarRolloverTextColor( toColor( qMenuCG.color( QPalette::HighlightedText ) ) );
}
else
{
ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
style.SetMenuBarRolloverTextColor( aMenuFore );
}
// Font
aFont = toFont( pMenuBar->font(), rSettings.GetUILanguageTag().getLocale() );
......
......@@ -297,6 +297,9 @@ sal_Bool KDESalGraphics::drawNativeControl( ControlType type, ControlPart part,
if (part == PART_MENU_ITEM)
{
QStyleOptionMenuItem option;
if ( nControlState & CTRL_STATE_ROLLOVER )
option.state |= QStyle::State_Selected;
draw( QStyle::CE_MenuBarItem, &option, m_image,
vclStateValue2StateFlag(nControlState, value) );
}
......
......@@ -973,10 +973,24 @@ sal_Bool ImplDrawNativeControl( HDC hDC, HTHEME hTheme, RECT rc,
}
else if( nPart == PART_MENU_ITEM )
{
if( (nState & CTRL_STATE_ENABLED) )
iState = (nState & CTRL_STATE_SELECTED) ? MBI_HOT : MBI_NORMAL;
if( nState & CTRL_STATE_ENABLED )
{
if( nState & CTRL_STATE_SELECTED )
iState = MBI_PUSHED;
else if( nState & CTRL_STATE_ROLLOVER )
iState = MBI_HOT;
else
iState = MBI_NORMAL;
}
else
iState = (nState & CTRL_STATE_SELECTED) ? MBI_DISABLEDHOT : MBI_DISABLED;
{
if( nState & CTRL_STATE_SELECTED )
iState = MBI_DISABLEDPUSHED;
else if( nState & CTRL_STATE_ROLLOVER )
iState = MBI_DISABLEDHOT;
else
iState = MBI_DISABLED;
}
return ImplDrawTheme( hTheme, hDC, MENU_BARITEM, iState, rc, aCaption );
}
}
......@@ -1506,6 +1520,7 @@ void WinSalGraphics::updateSettingsNative( AllSettings& rSettings )
{
// in aero menuitem highlight text is drawn in the same color as normal
aStyleSettings.SetMenuHighlightTextColor( aStyleSettings.GetMenuTextColor() );
aStyleSettings.SetMenuBarRolloverTextColor( aStyleSettings.GetMenuTextColor() );
pSVData->maNWFData.mnMenuFormatBorderX = 2;
pSVData->maNWFData.mnMenuFormatBorderY = 2;
pSVData->maNWFData.maMenuBarHighlightTextColor = aStyleSettings.GetMenuTextColor();
......
......@@ -2774,11 +2774,13 @@ void WinSalFrame::UpdateSettings( AllSettings& rSettings )
GetSalData()->mbThemeMenuSupport = FALSE;
aStyleSettings.SetMenuColor( ImplWinColorToSal( GetSysColor( COLOR_MENU ) ) );
aStyleSettings.SetMenuBarColor( aStyleSettings.GetMenuColor() );
aStyleSettings.SetMenuBarRolloverColor( aStyleSettings.GetHighlightColor() );
aStyleSettings.SetMenuBorderColor( aStyleSettings.GetLightBorderColor() ); // overriden below for flat menus
aStyleSettings.SetUseFlatBorders( FALSE );
aStyleSettings.SetUseFlatMenus( FALSE );
aStyleSettings.SetMenuTextColor( ImplWinColorToSal( GetSysColor( COLOR_MENUTEXT ) ) );
aStyleSettings.SetMenuBarTextColor( ImplWinColorToSal( GetSysColor( COLOR_MENUTEXT ) ) );
aStyleSettings.SetMenuBarRolloverTextColor( ImplWinColorToSal( GetSysColor( COLOR_HIGHLIGHTTEXT ) ) );
aStyleSettings.SetActiveColor( ImplWinColorToSal( GetSysColor( COLOR_ACTIVECAPTION ) ) );
aStyleSettings.SetActiveTextColor( ImplWinColorToSal( GetSysColor( COLOR_CAPTIONTEXT ) ) );
aStyleSettings.SetDeactiveColor( ImplWinColorToSal( GetSysColor( COLOR_INACTIVECAPTION ) ) );
......@@ -2793,6 +2795,7 @@ void WinSalFrame::UpdateSettings( AllSettings& rSettings )
aStyleSettings.SetUseFlatMenus( TRUE );
aStyleSettings.SetMenuBarColor( ImplWinColorToSal( GetSysColor( COLOR_MENUBAR ) ) );
aStyleSettings.SetMenuHighlightColor( ImplWinColorToSal( GetSysColor( COLOR_MENUHILIGHT ) ) );
aStyleSettings.SetMenuBarRolloverColor( ImplWinColorToSal( GetSysColor( COLOR_MENUHILIGHT ) ) );
aStyleSettings.SetMenuBorderColor( ImplWinColorToSal( GetSysColor( COLOR_3DSHADOW ) ) );
// flat borders for our controls etc. as well in this mode (ie, no 3d borders)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment