summaryrefslogtreecommitdiff
path: root/utils/scenemanager/workspacebrowser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/scenemanager/workspacebrowser.cpp')
-rw-r--r--utils/scenemanager/workspacebrowser.cpp258
1 files changed, 258 insertions, 0 deletions
diff --git a/utils/scenemanager/workspacebrowser.cpp b/utils/scenemanager/workspacebrowser.cpp
new file mode 100644
index 0000000..31775e9
--- /dev/null
+++ b/utils/scenemanager/workspacebrowser.cpp
@@ -0,0 +1,258 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "workspacebrowser.h"
+#include "workspace.h"
+#include "project.h"
+#include <windows.h>
+#include "resource.h"
+#include "project.h"
+#include "vcdfile.h"
+#include "soundentry.h"
+#include "scene.h"
+#include "workspacemanager.h"
+
+enum
+{
+ IDC_WSB_TREE = 101,
+};
+
+class CBrowserTree : public mxTreeView
+{
+public:
+ CBrowserTree( mxWindow *parent, int id = 0 )
+ : mxTreeView( parent, 0, 0, 0, 0, id )
+ {
+ // SendMessage ( (HWND)getHandle(), WM_SETFONT, (WPARAM) (HFONT) GetStockObject (ANSI_FIXED_FONT), MAKELPARAM (TRUE, 0));
+ }
+};
+
+int CALLBACK CWorkspaceBrowser::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
+{
+ ITreeItem const *item1 = (ITreeItem *)lParam1;
+ ITreeItem const *item2 = (ITreeItem *)lParam2;
+
+ Assert( item1 && item2 );
+
+ if ( item1->GetOrdinal() < item2->GetOrdinal() )
+ return -1;
+ else if ( item1->GetOrdinal() > item2->GetOrdinal() )
+ return 1;
+
+ // Ok, just compare pointers... sigh
+ return ( item1 < item2 ) ? -1 : 1;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *parent -
+//-----------------------------------------------------------------------------
+CWorkspaceBrowser::CWorkspaceBrowser( mxWindow *parent, CWorkspaceManager *manager, int id ) :
+ BaseClass( parent, 0, 0, 0, 0, "Workspace Browser", id )
+{
+ m_pManager = manager;
+
+ SceneManager_MakeToolWindow( this, false );
+
+ m_pLastSelected = NULL;
+
+ m_pCurrentWorkspace = NULL;
+ m_pTree = new CBrowserTree( this, IDC_WSB_TREE );
+
+ HIMAGELIST list = GetWorkspaceManager()->CreateImageList();
+
+ // Associate the image list with the tree-view control.
+ m_pTree->setImageList( (void *)list );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *event -
+// Output : int
+//-----------------------------------------------------------------------------
+int CWorkspaceBrowser::handleEvent( mxEvent *event )
+{
+ int iret = 0;
+ switch ( event->event )
+ {
+ default:
+ break;
+ case mxEvent::Action:
+ {
+ switch ( event->action )
+ {
+ default:
+ break;
+ case IDC_WSB_TREE:
+ {
+ iret = 1;
+
+ bool rightmouse = ( event->flags == mxEvent::RightClicked ) ? true : false;
+ bool doubleclicked = ( event->flags == mxEvent::DoubleClicked ) ? true : false;
+
+ OnTreeItemSelected( event->x, event->y, rightmouse, doubleclicked );
+ }
+ break;
+ }
+ }
+ break;
+ case mxEvent::Size:
+ {
+ m_pTree->setBounds( 0, 0, w2(), h2() );
+
+ GetWorkspaceManager()->SetWorkspaceDirty();
+
+ iret = 1;
+ }
+ break;
+ case mxEvent::Close:
+ {
+ iret = 1;
+ }
+ break;
+ }
+
+ return iret;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : CWorkspace
+//-----------------------------------------------------------------------------
+CWorkspace *CWorkspaceBrowser::GetWorkspace()
+{
+ return m_pCurrentWorkspace;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CWorkspaceBrowser::PopulateTree()
+{
+ m_pLastSelected = NULL;
+
+ CWorkspace *w = m_pCurrentWorkspace;
+
+ if ( !w )
+ return;
+
+ // Add root element
+ char sz[ 128 ];
+ if ( w->GetProjectCount() == 1 )
+ {
+ Q_snprintf( sz, sizeof( sz ), "Workspace '%s': %i project", w->GetName(), w->GetProjectCount() );
+ }
+ else
+ {
+ Q_snprintf( sz, sizeof( sz ), "Workspace '%s': %i projects", w->GetName(), w->GetProjectCount() );
+ }
+
+
+ mxTreeViewItem *root = w->FindItem( m_pTree, NULL );
+ if ( !root )
+ {
+ root = m_pTree->add( NULL, sz );
+ }
+
+ // Reset the label
+ m_pTree->setLabel( root, sz );
+
+ m_pTree->setImages( root, w->GetIconIndex(), w->GetIconIndex() );
+ m_pTree->setUserData( root, w );
+
+ w->ValidateTree( m_pTree, root );
+
+ m_pTree->setOpen( root, true );
+
+ m_pTree->sortTree( root, true, CompareFunc, 0 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *w -
+//-----------------------------------------------------------------------------
+void CWorkspaceBrowser::SetWorkspace( CWorkspace *w )
+{
+ m_pCurrentWorkspace = w;
+
+ PopulateTree();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *project -
+//-----------------------------------------------------------------------------
+void CWorkspaceBrowser::AddProject( CProject *project )
+{
+ if ( !m_pCurrentWorkspace )
+ return;
+
+ m_pCurrentWorkspace->AddProject( project );
+
+ PopulateTree();
+}
+
+ITreeItem *CWorkspaceBrowser::GetSelectedItem()
+{
+ return m_pLastSelected;
+}
+
+CWorkspaceManager *CWorkspaceBrowser::GetManager()
+{
+ return m_pManager;
+}
+
+void CWorkspaceBrowser::OnTreeItemSelected( int x, int y, bool rightmouse, bool doubleclick )
+{
+ mxTreeViewItem *item = m_pTree->getSelectedItem();
+ if ( !item )
+ {
+ Con_Printf( "No item selected\n" );
+ return;
+ }
+
+ ITreeItem *p = (ITreeItem *)m_pTree->getUserData( item );
+ if ( !p )
+ {
+ Con_Printf( "No userdata for item\n" );
+ return;
+ }
+
+ m_pLastSelected = p;
+
+ GetManager()->UpdateMenus();
+
+ if ( p->GetSoundEntry() || p->GetWaveFile() )
+ {
+ GetManager()->OnSoundShowInBrowsers();
+ }
+
+ if ( !rightmouse )
+ {
+ if ( doubleclick )
+ {
+ GetManager()->OnDoubleClicked( GetSelectedItem() );
+ }
+ return;
+ }
+
+ POINT pt;
+ GetCursorPos( &pt );
+
+ ScreenToClient( (HWND)GetManager()->getHandle(), &pt );
+
+ GetManager()->ShowContextMenu( pt.x, pt.y, GetSelectedItem() );
+}
+
+void CWorkspaceBrowser::JumpTo( ITreeItem *item )
+{
+ mxTreeViewItem *found = item->FindItem( m_pTree, NULL, true );
+ if ( found )
+ {
+ m_pTree->scrollTo( found );
+ }
+} \ No newline at end of file