summaryrefslogtreecommitdiff
path: root/public/toolutils/BaseToolSystem.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/toolutils/BaseToolSystem.h')
-rw-r--r--public/toolutils/BaseToolSystem.h326
1 files changed, 326 insertions, 0 deletions
diff --git a/public/toolutils/BaseToolSystem.h b/public/toolutils/BaseToolSystem.h
new file mode 100644
index 0000000..26f38ca
--- /dev/null
+++ b/public/toolutils/BaseToolSystem.h
@@ -0,0 +1,326 @@
+//========= 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