kicad/libs/kiplatform/include/kiplatform/ui.h

178 lines
6.7 KiB
C++

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020 Ian McInerney <Ian.S.McInerney at ieee.org>
* Copyright (C) 2020 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/>.
*/
#ifndef KIPLATFORM_UI_H_
#define KIPLATFORM_UI_H_
#include <wx/cursor.h>
class wxChoice;
class wxNonOwnedWindow;
class wxWindow;
namespace KIPLATFORM
{
namespace UI
{
/**
* Determine if the desktop interface is currently using a dark theme or a light theme.
*
* @return true if a dark theme is being used.
*/
bool IsDarkTheme();
wxColour GetDialogBGColour();
/**
* Pass the current focus to the window. On OSX this will forcefully give the focus to
* the desired window, while on MSW and GTK it will simply call the wxWidgets SetFocus()
* function.
*
* @param aWindow is the window to pass focus to
*/
void ForceFocus( wxWindow* aWindow );
/**
* Check to see if the given window is the currently active window (e.g. the window
* in the foreground the user is interacting with).
*
* @param aWindow is the window to check
*/
bool IsWindowActive( wxWindow* aWindow );
/**
* Move a window's parent to be the top-level window and force the window to be on top.
*
* This only has an affect for OSX, it is a NOP for GTK and MSW.
*
* Apple in its infinite wisdom will raise a disabled window before even passing
* us the event, so we have no way to stop it. Instead, we must set an order on
* the windows so that the quasi-modal will be pushed in front of the disabled
* window when it is raised.
*
* @param aWindow is the window to reparent
*/
void ReparentQuasiModal( wxNonOwnedWindow* aWindow );
/*
* An ugly hack to fix an issue on OSX: cmd+c closes the dialog instead of copying the
* text if a button with wxID_CANCEL is used in a wxStdDialogButtonSizer created by
* wxFormBuilder: the label is &Cancel, and this accelerator key has priority over the
* standard copy accelerator.
* Note: problem also exists in other languages; for instance cmd+a closes dialogs in
* German because the button is &Abbrechen.
*/
void FixupCancelButtonCmdKeyCollision( wxWindow* aWindow );
/**
* Checks if we designated a stock cursor for this OS as "OK" or else we may need to load a custom one
*
* @param aCursor is wxStockCursor we want to see if its acceptable
*/
bool IsStockCursorOk( wxStockCursor aCursor );
/**
* Configure a wxChoice control to support a lot of entries by disabling functionality that makes
* adding new items become very expensive.
*
* @param aChoice is the choice box to modify
*/
void LargeChoiceBoxHack( wxChoice* aChoice );
/**
* Configure a wxChoice control to ellipsize the shown text in the button with the ellipses
* placed at the end of the string.
*
* @param aChoice is the choice box to ellipsize
*/
void EllipsizeChoiceBox( wxChoice* aChoice );
/**
* Tries to determine the pixel scaling factor currently in use for the window. Under wx3.0, GTK
* fails to properly detect the scale factor.
* @param aWindow pointer to the window to check
* @return Pixel scale factor in use, defaulting to the wxWidgets method
*/
double GetPixelScaleFactor( const wxWindow* aWindow );
/**
* Tries to determine the content scaling factor currently in use for the window.
* The content scaling factor is typically settable by the user and may differ from the
* pixel scaling factor.
*/
double GetContentScaleFactor( const wxWindow* aWindow );
/**
* Tries to determine the size of the viewport of a scrollable widget (wxDataViewCtrl, wxGrid)
* that won't be obscured by scrollbars.
* @param aWindow pointer to the scrollable widget to check
* @return Viewport size that won't be obscured by scrollbars
*/
wxSize GetUnobscuredSize( const wxWindow* aWindow );
/**
* Used to set overlay/non-overlay scrolling mode in a window.
* Implemented only on GTK.
*/
void SetOverlayScrolling( const wxWindow* aWindow, bool overlay );
/**
* If the user has disabled icons system-wide, we check that here
*/
bool AllowIconsInMenus();
/**
* Returns the mouse position in screen coordinates.
* If we've just warped the cursor, returns the new coordinates.
*/
wxPoint GetMousePosition();
/**
* Move the mouse cursor to a specific position relative to the window
* @param aWindow Window in which to position to mouse cursor
* @param aX destination x position
* @param aY destination y position
* @return true if the warp was successful
*/
bool WarpPointer( wxWindow* aWindow, int aX, int aY );
/**
* Configures the IME mode of a given control handle
*/
void ImmControl( wxWindow* aWindow, bool aEnable );
/**
* On Wayland, restricts the pointer movement to a rectangle slightly bigger than the given `wxWindow`.
* This way, the cursor doesn't exit the (bigger) application window and we retain control on it.
* Required to make the infinite mouse-drag work with fast movement.
* See https://gitlab.com/kicad/code/kicad/-/issues/7207#note_1562089503
* @param aWindow Window in which to position to mouse cursor
*/
void InfiniteDragPrepareWindow( wxWindow* aWindow );
/**
* On Wayland, allows the cursor to freely move again after a drag (see `InfiniteDragPrepareWindow`).
*/
void InfiniteDragReleaseWindow();
}
}
#endif // KIPLATFORM_UI_H_