You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							208 lines
						
					
					
						
							7.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							208 lines
						
					
					
						
							7.2 KiB
						
					
					
				
								/*
							 | 
						|
								 * This program source code file is part of KiCad, a free EDA CAD application.
							 | 
						|
								 *
							 | 
						|
								 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
							 | 
						|
								 *
							 | 
						|
								 * This program is free software: you can redistribute it and/or modify it
							 | 
						|
								 * under the terms of the GNU General Public License as published by the
							 | 
						|
								 * Free Software Foundation, either version 3 of the License, or (at your
							 | 
						|
								 * option) any later version.
							 | 
						|
								 *
							 | 
						|
								 * This program is distributed in the hope that it will be useful, but
							 | 
						|
								 * WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
							 | 
						|
								 * General Public License for more details.
							 | 
						|
								 *
							 | 
						|
								 * You should have received a copy of the GNU General Public License along
							 | 
						|
								 * with this program.  If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								#include <wx/aui/aui.h>
							 | 
						|
								#include <wx/aui/framemanager.h>
							 | 
						|
								#include <wx/bitmap.h>
							 | 
						|
								#include <wx/dc.h>
							 | 
						|
								#include <wx/settings.h>
							 | 
						|
								
							 | 
						|
								#include <kiplatform/ui.h>
							 | 
						|
								#include <pgm_base.h>
							 | 
						|
								#include <settings/common_settings.h>
							 | 
						|
								#include <widgets/wx_aui_art_providers.h>
							 | 
						|
								
							 | 
						|
								#if wxCHECK_VERSION( 3, 3, 0 )
							 | 
						|
								wxSize WX_AUI_TOOLBAR_ART::GetToolSize( wxReadOnlyDC& aDc, wxWindow* aWindow,
							 | 
						|
								                                        const wxAuiToolBarItem& aItem )
							 | 
						|
								#else
							 | 
						|
								wxSize WX_AUI_TOOLBAR_ART::GetToolSize( wxDC& aDc, wxWindow* aWindow,
							 | 
						|
								                                        const wxAuiToolBarItem& aItem )
							 | 
						|
								#endif
							 | 
						|
								{
							 | 
						|
								    // Based on the upstream wxWidgets implementation, but simplified for our application
							 | 
						|
								    int size = Pgm().GetCommonSettings()->m_Appearance.toolbar_icon_size;
							 | 
						|
								
							 | 
						|
								#ifdef __WXMSW__
							 | 
						|
								    size *= KIPLATFORM::UI::GetContentScaleFactor( aWindow );
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								    int width = size;
							 | 
						|
								    int height = size;
							 | 
						|
								
							 | 
						|
								    if( m_flags & wxAUI_TB_TEXT )
							 | 
						|
								    {
							 | 
						|
								        aDc.SetFont( m_font );
							 | 
						|
								        int tx, ty;
							 | 
						|
								
							 | 
						|
								        if( m_textOrientation == wxAUI_TBTOOL_TEXT_BOTTOM )
							 | 
						|
								        {
							 | 
						|
								            aDc.GetTextExtent( wxT( "ABCDHgj" ), &tx, &ty );
							 | 
						|
								            height += ty;
							 | 
						|
								
							 | 
						|
								            if( !aItem.GetLabel().empty() )
							 | 
						|
								            {
							 | 
						|
								                aDc.GetTextExtent( aItem.GetLabel(), &tx, &ty );
							 | 
						|
								                width = wxMax( width, tx + aWindow->FromDIP( 6 ) );
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								        else if( m_textOrientation == wxAUI_TBTOOL_TEXT_RIGHT && !aItem.GetLabel().empty() )
							 | 
						|
								        {
							 | 
						|
								            width += aWindow->FromDIP( 3 ); // space between left border and bitmap
							 | 
						|
								            width += aWindow->FromDIP( 3 ); // space between bitmap and text
							 | 
						|
								
							 | 
						|
								            if( !aItem.GetLabel().empty() )
							 | 
						|
								            {
							 | 
						|
								                aDc.GetTextExtent( aItem.GetLabel(), &tx, &ty );
							 | 
						|
								                width += tx;
							 | 
						|
								                height = wxMax( height, ty );
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    if( aItem.HasDropDown() )
							 | 
						|
								    {
							 | 
						|
								        int dropdownWidth = GetElementSize( wxAUI_TBART_DROPDOWN_SIZE );
							 | 
						|
								        width += dropdownWidth + aWindow->FromDIP( 4 );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return wxSize( width, height );
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								void WX_AUI_TOOLBAR_ART::DrawButton( wxDC& aDc, wxWindow* aWindow, const wxAuiToolBarItem& aItem,
							 | 
						|
								                                     const wxRect& aRect )
							 | 
						|
								{
							 | 
						|
								    // Taken from upstream implementation; modified to respect tool size
							 | 
						|
								    wxSize bmpSize = GetToolSize( aDc, aWindow, aItem );
							 | 
						|
								
							 | 
						|
								    int textWidth = 0, textHeight = 0;
							 | 
						|
								
							 | 
						|
								    if( m_flags & wxAUI_TB_TEXT )
							 | 
						|
								    {
							 | 
						|
								        aDc.SetFont( m_font );
							 | 
						|
								
							 | 
						|
								        int tx, ty;
							 | 
						|
								
							 | 
						|
								        aDc.GetTextExtent( wxT( "ABCDHgj" ), &tx, &textHeight );
							 | 
						|
								        textWidth = 0;
							 | 
						|
								        aDc.GetTextExtent( aItem.GetLabel(), &textWidth, &ty );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    int bmpX = 0, bmpY = 0;
							 | 
						|
								    int textX = 0, textY = 0;
							 | 
						|
								
							 | 
						|
								    double scale = KIPLATFORM::UI::GetPixelScaleFactor( aWindow );
							 | 
						|
								    const wxBitmapBundle& bundle = ( aItem.GetState() & wxAUI_BUTTON_STATE_DISABLED )
							 | 
						|
								                                   ? aItem.GetDisabledBitmapBundle()
							 | 
						|
								                                   : aItem.GetBitmapBundle();
							 | 
						|
								    wxBitmap bmp = bundle.GetBitmap( bmpSize * scale );
							 | 
						|
								
							 | 
						|
								    // wxBitmapBundle::GetBitmap thinks we need this rescaled to match the base size, which we don't
							 | 
						|
								    if( bmp.IsOk() )
							 | 
						|
								        bmp.SetScaleFactor( scale );
							 | 
						|
								
							 | 
						|
								    if( m_textOrientation == wxAUI_TBTOOL_TEXT_BOTTOM )
							 | 
						|
								    {
							 | 
						|
								        bmpX = aRect.x + ( aRect.width / 2 ) - ( bmpSize.x / 2 );
							 | 
						|
								
							 | 
						|
								        bmpY = aRect.y + ( ( aRect.height - textHeight ) / 2 ) - ( bmpSize.y / 2 );
							 | 
						|
								
							 | 
						|
								        textX = aRect.x + ( aRect.width / 2 ) - ( textWidth / 2 ) + 1;
							 | 
						|
								        textY = aRect.y + aRect.height - textHeight - 1;
							 | 
						|
								    }
							 | 
						|
								    else if( m_textOrientation == wxAUI_TBTOOL_TEXT_RIGHT )
							 | 
						|
								    {
							 | 
						|
								        bmpX = aRect.x + aWindow->FromDIP( 3 );
							 | 
						|
								
							 | 
						|
								        bmpY = aRect.y + ( aRect.height / 2 ) - ( bmpSize.y / 2 );
							 | 
						|
								
							 | 
						|
								        textX = bmpX + aWindow->FromDIP( 3 ) + bmpSize.x;
							 | 
						|
								        textY = aRect.y + ( aRect.height / 2 ) - ( textHeight / 2 );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    bool isThemeDark = KIPLATFORM::UI::IsDarkTheme();
							 | 
						|
								
							 | 
						|
								    if( !( aItem.GetState() & wxAUI_BUTTON_STATE_DISABLED ) )
							 | 
						|
								    {
							 | 
						|
								        if( aItem.GetState() & wxAUI_BUTTON_STATE_PRESSED )
							 | 
						|
								        {
							 | 
						|
								            aDc.SetPen( wxPen( m_highlightColour ) );
							 | 
						|
								            aDc.SetBrush( wxBrush( m_highlightColour.ChangeLightness( isThemeDark ? 20 : 150 ) ) );
							 | 
						|
								            aDc.DrawRectangle( aRect );
							 | 
						|
								        }
							 | 
						|
								        else if( ( aItem.GetState() & wxAUI_BUTTON_STATE_HOVER ) || aItem.IsSticky() )
							 | 
						|
								        {
							 | 
						|
								            aDc.SetPen( wxPen( m_highlightColour ) );
							 | 
						|
								            aDc.SetBrush( wxBrush( m_highlightColour.ChangeLightness( isThemeDark ? 40 : 170 ) ) );
							 | 
						|
								
							 | 
						|
								            // draw an even lighter background for checked item hovers (since
							 | 
						|
								            // the hover background is the same color as the check background)
							 | 
						|
								            if( aItem.GetState() & wxAUI_BUTTON_STATE_CHECKED )
							 | 
						|
								                aDc.SetBrush(
							 | 
						|
								                        wxBrush( m_highlightColour.ChangeLightness( isThemeDark ? 50 : 180 ) ) );
							 | 
						|
								
							 | 
						|
								            aDc.DrawRectangle( aRect );
							 | 
						|
								        }
							 | 
						|
								        else if( aItem.GetState() & wxAUI_BUTTON_STATE_CHECKED )
							 | 
						|
								        {
							 | 
						|
								            // it's important to put this code in an else statement after the
							 | 
						|
								            // hover, otherwise hovers won't draw properly for checked items
							 | 
						|
								            aDc.SetPen( wxPen( m_highlightColour ) );
							 | 
						|
								            aDc.SetBrush( wxBrush( m_highlightColour.ChangeLightness( isThemeDark ? 40 : 170 ) ) );
							 | 
						|
								            aDc.DrawRectangle( aRect );
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    if( bmp.IsOk() )
							 | 
						|
								        aDc.DrawBitmap( bmp, bmpX, bmpY, true );
							 | 
						|
								
							 | 
						|
								    // set the item's text color based on if it is disabled
							 | 
						|
								    aDc.SetTextForeground( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNTEXT ) );
							 | 
						|
								
							 | 
						|
								    if( aItem.GetState() & wxAUI_BUTTON_STATE_DISABLED )
							 | 
						|
								    {
							 | 
						|
								        aDc.SetTextForeground( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    if( ( m_flags & wxAUI_TB_TEXT ) && !aItem.GetLabel().empty() )
							 | 
						|
								    {
							 | 
						|
								        aDc.DrawText( aItem.GetLabel(), textX, textY );
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								WX_AUI_DOCK_ART::WX_AUI_DOCK_ART() : wxAuiDefaultDockArt()
							 | 
						|
								{
							 | 
						|
								#if defined( _WIN32 )
							 | 
						|
								    // Use normal control font, wx likes to use "small"
							 | 
						|
								    m_captionFont = *wxNORMAL_FONT;
							 | 
						|
								
							 | 
						|
								    // Increase the box the caption rests in size a bit
							 | 
						|
								    m_captionSize = ( wxNORMAL_FONT->GetPointSize() * 7 ) / 4 + 6;
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								    SetColour( wxAUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR,
							 | 
						|
								               wxSystemSettings::GetColour( wxSYS_COLOUR_BTNTEXT ) );
							 | 
						|
								    SetColour( wxAUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR,
							 | 
						|
								               wxSystemSettings::GetColour( wxSYS_COLOUR_BTNTEXT ) );
							 | 
						|
								
							 | 
						|
								    // Turn off the ridiculous looking gradient
							 | 
						|
								    m_gradientType = wxAUI_GRADIENT_NONE;
							 | 
						|
								}
							 |