source-engine/public/toolutils/BaseToolSystem.h

327 lines
12 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Core Movie Maker UI API
//
//=============================================================================
#ifndef BASETOOLSYSTEM_H
#define BASETOOLSYSTEM_H
#ifdef _WIN32
#pragma once
#endif
#include "tier1/interface.h"
#include "toolframework/itoolsystem.h"
#include "vgui/IScheme.h"
#include "vgui_controls/EditablePanel.h"
#include "vgui_controls/PHandle.h"
#include "toolutils/recentfilelist.h"
#include "vgui/keycode.h"
#include "vgui_controls/fileopenstatemachine.h"
// #defines
#define TOGGLE_WINDOWED_KEY_CODE KEY_F11
#define TOGGLE_WINDOWED_KEY_NAME "F11"
#define TOGGLE_INPUT_KEY_CODE KEY_F10
#define TOGGLE_INPUT_KEY_NAME "F10"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class KeyValues;
class CToolUI;
class CToolMenuButton;
class CMiniViewport;
class IGlobalFlexController;
namespace vgui
{
class Panel;
class Menu;
class CKeyBoardEditorDialog;
class CKeyBindingHelpDialog;
enum KeyBindingContextHandle_t;
class IScheme;
}
//-----------------------------------------------------------------------------
// Save document types
//-----------------------------------------------------------------------------
enum SaveDocumentCloseType_t
{
SAVEDOC_QUIT_AFTER_SAVE = 0,
SAVEDOC_CLOSE_AFTER_SAVE,
SAVEDOC_LEAVEOPEN_AFTER_SAVE,
SAVEDOC_POSTCOMMAND_AFTER_SAVE, // Closes, then posts a command
SAVEDOC_LEAVEOPEN_POSTCOMMAND_AFTER_SAVE, // Leaves open, then posts a command
};
//-----------------------------------------------------------------------------
// The toolsystem panel is the main panel in which the tool "ui" lives.
// The tool "ui" encapsulates the main menu and a client area in which the
// tools are drawn.
// Usually, the workspace is the size of the entire screen
// and the ui can be smaller than the toolsystem panel. The reason these are decoupled
// is so that you can get the 'action' menu no matter where you click on the screen
//-----------------------------------------------------------------------------
class CBaseToolSystem : public vgui::EditablePanel, public IToolSystem, public vgui::IFileOpenStateMachineClient
{
DECLARE_CLASS_SIMPLE( CBaseToolSystem, vgui::EditablePanel );
public:
// Methods inherited from IToolSystem
virtual bool Init( );
virtual void Shutdown();
virtual bool ServerInit( CreateInterfaceFn serverFactory );
virtual bool ClientInit( CreateInterfaceFn clientFactory );
virtual void ServerShutdown();
virtual void ClientShutdown();
virtual bool CanQuit();
virtual void PostMessage( HTOOLHANDLE hEntity, KeyValues *message );
virtual void Think( bool finalTick );
virtual void ServerLevelInitPreEntity();
virtual void ServerLevelInitPostEntity();
virtual void ServerLevelShutdownPreEntity();
virtual void ServerLevelShutdownPostEntity();
virtual void ServerFrameUpdatePreEntityThink();
virtual void ServerFrameUpdatePostEntityThink();
virtual void ServerPreClientUpdate();
virtual void ServerPreSetupVisibility();
virtual const char* GetEntityData( const char *pActualEntityData );
virtual void ClientLevelInitPreEntity();
virtual void ClientLevelInitPostEntity();
virtual void ClientLevelShutdownPreEntity();
virtual void ClientLevelShutdownPostEntity();
virtual void ClientPreRender();
virtual void ClientPostRender();
virtual void OnToolActivate();
virtual void OnToolDeactivate();
virtual bool TrapKey( ButtonCode_t key, bool down );
virtual void AdjustEngineViewport( int& x, int& y, int& width, int& height );
virtual bool SetupEngineView( Vector &origin, QAngle &angles, float &fov );
virtual bool SetupAudioState( AudioState_t &audioState );
virtual bool ShouldGameRenderView();
virtual bool IsThirdPersonCamera();
virtual bool IsToolRecording();
virtual IMaterialProxy *LookupProxy( const char *proxyName );
virtual bool GetSoundSpatialization( int iUserData, int guid, SpatializationInfo_t& info );
virtual void HostRunFrameBegin();
virtual void HostRunFrameEnd();
virtual void RenderFrameBegin();
virtual void RenderFrameEnd();
virtual void VGui_PreRender( int paintMode );
virtual void VGui_PostRender( int paintMode );
virtual void VGui_PreSimulate();
virtual void VGui_PostSimulate();
// Inherited from vgui::Panel
virtual void OnMousePressed( vgui::MouseCode code );
virtual void OnThink();
virtual void ApplySchemeSettings( vgui::IScheme *pScheme);
// Inherited from IFileOpenStateMachineClient
virtual void SetupFileOpenDialog( vgui::FileOpenDialog *pDialog, bool bOpenFile, const char *pFileFormat, KeyValues *pContextKeyValues ) { Assert(0); }
virtual bool OnReadFileFromDisk( const char *pFileName, const char *pFileFormat, KeyValues *pContextKeyValues ) { Assert(0); return false; }
virtual bool OnWriteFileToDisk( const char *pFileName, const char *pFileFormat, KeyValues *pContextKeyValues ) { Assert(0); return false; }
MESSAGE_FUNC_INT( OnUnhandledMouseClick, "UnhandledMouseClick", code );
public:
// Other methods
// NOTE: This name here is 'general' strictly so 'general' shows up in the keybinding dialog
CBaseToolSystem( char const *toolName = "#ToolGeneral" );
// Gets the action target to sent to panels so that the tool system's OnCommand is called
vgui::Panel *GetActionTarget();
// Gets at the action menu
vgui::Menu *GetActionMenu();
// Returns the client area
vgui::Panel* GetClientArea();
// Adds a menu button to the main menu bar
void AddMenuButton( CToolMenuButton *pMenuButton );
// Returns the current map name
char const *MapName() const;
// Derived classes implement this to create an action menu
// that appears if you right-click in the tool workspace
virtual vgui::Menu *CreateActionMenu( vgui::Panel *pParent ) { return NULL; }
// Derived classes implement this to create a custom menubar
virtual vgui::MenuBar *CreateMenuBar( CBaseToolSystem *pParent );
// Derived classes implement this to create status bar, can return NULL for no status bar in tool...
virtual vgui::Panel *CreateStatusBar( vgui::Panel *pParent );
virtual CMiniViewport *CreateMiniViewport( vgui::Panel *parent );
virtual void UpdateMenu( vgui::Menu *menu );
virtual void ShowMiniViewport( bool state );
void SetMiniViewportBounds( int x, int y, int width, int height );
void SetMiniViewportText( const char *pText );
void GetMiniViewportEngineBounds( int &x, int &y, int &width, int &height );
vgui::Panel *GetMiniViewport( void );
virtual void ComputeMenuBarTitle( char *buf, size_t buflen );
// Usage mode
void SetMode( bool bGameInputEnabled, bool bFullscreen );
bool IsFullscreen() const;
bool IsGameInputEnabled() const;
void EnableFullscreenToolMode( bool bEnable );
// Is this the active tool?
bool IsActiveTool( ) const;
// Returns the tool that had focus most recently
Panel *GetMostRecentlyFocusedTool();
void PostMessageToAllTools( KeyValues *message );
protected:
virtual void PaintBackground();
// Derived classes must implement this to specify where in the
// registry to store registry settings
virtual const char *GetRegistryName() = 0;
// Derived classes must return the key bindings context
virtual const char *GetBindingsContextFile() = 0;
// Derived classes implement this to do stuff when the tool is shown or hidden
virtual void OnModeChanged() {}
// Derived classes can implement this to get a new scheme to be applied to this tool
virtual vgui::HScheme GetToolScheme() { return 0; }
// Derived classes can implement this to get notified when files are saved/loaded
virtual void OnFileOperationCompleted( const char *pFileType, bool bWroteFile, vgui::FileOpenStateMachine::CompletionState_t state, KeyValues *pContextKeyValues ) {}
// Used to open a specified file, and deal with all the lovely dialogs
void OpenFile( const char *pOpenFileType, const char *pSaveFileName = NULL, const char *pSaveFileType = NULL, int nFlags = 0, KeyValues *pKeyValues = NULL );
void OpenFile( const char *pOpenFileName, const char *pOpenFileType, const char *pSaveFileName = NULL, const char *pSaveFileType = NULL, int nFlags = 0, KeyValues *pKeyValues = NULL );
// Used to save a specified file, and deal with all the lovely dialogs
// Pass in NULL to get a dialog to choose a filename to save
// Posts the keyvalues
void SaveFile( const char *pFileName, const char *pFileType, int nFlags, KeyValues *pKeyValues = NULL );
KEYBINDING_FUNC_NODECLARE( editkeybindings, KEY_E, vgui::MODIFIER_SHIFT | vgui::MODIFIER_CONTROL | vgui::MODIFIER_ALT, OnEditKeyBindings, "#editkeybindings_help", 0 );
KEYBINDING_FUNC( keybindinghelp, KEY_H, 0, OnKeyBindingHelp, "#keybindinghelp_help", 0 );
virtual char const *GetBackgroundTextureName();
virtual char const *GetLogoTextureName() = 0;
virtual bool HasDocument();
virtual void ToggleForceToolCamera();
// Shows, hides the tool ui (menu, client area, status bar)
void SetToolUIVisible( bool bVisible );
// Deals with keybindings
void LoadKeyBindings();
void ShowKeyBindingsEditor( vgui::Panel *panel, vgui::KeyBindingContextHandle_t handle );
void ShowKeyBindingsHelp( vgui::Panel *panel, vgui::KeyBindingContextHandle_t handle, vgui::KeyCode boundKey, int modifiers );
vgui::KeyBindingContextHandle_t GetKeyBindingsHandle();
// Registers tool window
void RegisterToolWindow( vgui::PHandle hPanel );
void UnregisterAllToolWindows();
void PostMessageToActiveTool( char const *msg, float delay = 0.0f );
void PostMessageToActiveTool( KeyValues *pKeyValues, float flDelay = 0.0f );
protected:
// Recent file list
CRecentFileList m_RecentFiles;
private:
// Shows/hides the tool
bool ShowUI( bool bVisible );
// Updates UI visibility
void UpdateUIVisibility();
// Create, destroy action menu
void InitActionMenu();
void ShutdownActionMenu();
// Positions the action menu when it's time to pop it up
void PositionActionMenu();
// Messages related to saving a file
MESSAGE_FUNC_PARAMS( OnFileStateMachineFinished, "FileStateMachineFinished", kv );
// Handlers for standard menus
MESSAGE_FUNC( OnClearRecent, "OnClearRecent" );
MESSAGE_FUNC( OnEditKeyBindings, "OnEditKeyBindings" );
// The root toolsystem panel which should cover the entire screen
// here to allow us to do action menus anywhere
// The tool UI
CToolUI *m_pToolUI;
// The action menu
vgui::DHANDLE<vgui::Menu> m_hActionMenu;
bool m_bGameInputEnabled;
bool m_bFullscreenMode;
bool m_bIsActive;
bool m_bFullscreenToolModeEnabled;
vgui::DHANDLE< CMiniViewport > m_hMiniViewport;
vgui::FileOpenStateMachine *m_pFileOpenStateMachine;
IMaterial *m_pBackground;
IMaterial *m_pLogo;
// Keybindings
vgui::KeyBindingContextHandle_t m_KeyBindingsHandle;
vgui::DHANDLE< vgui::CKeyBoardEditorDialog > m_hKeyBindingsEditor;
vgui::DHANDLE< vgui::CKeyBindingHelpDialog > m_hKeyBindingsHelp;
CUtlVector< vgui::PHandle > m_Tools;
vgui::PHandle m_MostRecentlyFocused;
};
//-----------------------------------------------------------------------------
// Inline methods
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Is this the active tool?
//-----------------------------------------------------------------------------
inline bool CBaseToolSystem::IsActiveTool( ) const
{
return m_bIsActive;
}
//-----------------------------------------------------------------------------
// Mode query
//-----------------------------------------------------------------------------
inline bool CBaseToolSystem::IsFullscreen( ) const
{
return m_bFullscreenMode;
}
inline bool CBaseToolSystem::IsGameInputEnabled() const
{
// NOTE: IsActive check here is a little bogus.
// It's necessary to get the IFM to play nice with other tools, though.
// Is there a better way of doing it?
return m_bGameInputEnabled || !m_bIsActive;
}
#endif // BASETOOLSYSTEM_H