workspacemanager.cpp

来自「hl2 source code. Do not use it illegal.」· C++ 代码 · 共 1,903 行 · 第 1/3 页

CPP
1,903
字号
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	CScene *scene = item->GetScene();
	if ( !scene )
		return;

	// Show file io
	const char *fullpath = mxGetOpenFileName( 
		0, 
		".", 
		"*.vcd" );

	if ( !fullpath || !fullpath[ 0 ] )
		return;

	// Strip game directory and slash
	char vcd_name[ 512 ];
	filesystem->FullPathToRelativePath( fullpath, vcd_name );

	StripExtension( vcd_name );
	DefaultExtension( vcd_name, ".vcd" );

	if ( scene->FindVCD( vcd_name ) )
	{
		Con_Printf( "File '%s' is already in scene '%s'\n", vcd_name, scene->GetName() );
		return;
	}

	CVCDFile *vcd = new CVCDFile( scene, vcd_name );

	scene->AddVCD( vcd );

	GetBrowser()->PopulateTree();

	OnUpdateTitle();
}

void CWorkspaceManager::OnModifySceneComments()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	CScene *scene = item->GetScene();
	if ( !scene )
		return;

	CInputParams params;
	memset( &params, 0, sizeof( params ) );
	Q_snprintf( params.m_szDialogTitle, sizeof( params.m_szDialogTitle ), "Edit comments for '%s'", scene->GetName() );
	Q_strcpy( params.m_szPrompt, "Comments:" );
	Q_strncpy( params.m_szInputText, scene->GetComments(), sizeof( params.m_szInputText ) );

	if ( !InputProperties( &params ) )
		return;

	if ( !Q_strcmp( params.m_szInputText, scene->GetComments() ) )
		return;

	scene->SetComments( params.m_szInputText );

	GetBrowser()->PopulateTree();

	OnUpdateTitle();
}

void CWorkspaceManager::OnModifyVCDComments()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	CVCDFile *file = item->GetVCDFile();
	if ( !file )
		return;

	CInputParams params;
	memset( &params, 0, sizeof( params ) );
	Q_snprintf( params.m_szDialogTitle, sizeof( params.m_szDialogTitle ), "Edit comments for '%s'", file->GetName() );
	Q_strcpy( params.m_szPrompt, "Comments:" );
	Q_strncpy( params.m_szInputText, file->GetComments(), sizeof( params.m_szInputText ) );

	if ( !InputProperties( &params ) )
		return;

	if ( !Q_strcmp( params.m_szInputText, file->GetComments() ) )
		return;

	file->SetComments( params.m_szInputText );

	GetBrowser()->PopulateTree();

	OnUpdateTitle();
}

void CWorkspaceManager::OnSceneRemoveVCD()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	CVCDFile *file = item->GetVCDFile();
	if ( !file )
		return;

	CScene *scene = file->GetOwnerScene();
	if ( !scene )
		return;

	scene->RemoveVCD( file );

	GetBrowser()->PopulateTree();

	OnUpdateTitle();
}

void CWorkspaceManager::ShowContextMenu( int x, int y, ITreeItem *p )
{
	CWorkspace *w = p->GetWorkspace();
	if ( w )
	{
		ShowContextMenu_Workspace( x, y, w );
		return;
	}

	CProject *proj = p->GetProject();
	if ( proj )
	{
		ShowContextMenu_Project( x, y, proj );
		return;
	}

	CScene *scene = p->GetScene();
	if ( scene )
	{
		ShowContextMenu_Scene( x, y, scene );
		return;
	}

	CVCDFile *vcd = p->GetVCDFile();
	if ( vcd )
	{
		ShowContextMenu_VCD( x, y, vcd );
		return;
	}

	CSoundEntry *sound = p->GetSoundEntry();
	if ( sound )
	{
		ShowContextMenu_SoundEntry( x, y, sound );
		return;
	}

	CWaveFile *wave = p->GetWaveFile();
	if ( wave )
	{
		ShowContextMenu_WaveFile( x, y, wave );
		return;
	}

	Con_Printf( "unknown tree item type\n" );
	Assert( 0 );
}

void CWorkspaceManager::ShowContextMenu_Workspace( int x, int y, CWorkspace *ws )
{
	if ( !ws )
		return;

	// New project and insert project
	mxPopupMenu *pop = new mxPopupMenu();

	pop->add ("Create New Project...", IDC_WSM_PROJECT_PRJ_NEW );
	pop->add ("Insert Project...", IDC_WSM_PROJECT_PRJ_INSERT );
	pop->addSeparator();
	pop->add( "VSS Properties...", IDC_WSM_FILE_WS_VSSPROPERTIES );

	if ( !filesystem->IsFileWritable( ws->GetFileName() ) )
	{
		pop->add( va( "Checkout '%s'", ws->GetName() ), IDC_WSM_SELECTION_CHECKOUT );
	}
	else
	{
		pop->add( va( "Checkin '%s'", ws->GetName() ), IDC_WSM_SELECTION_CHECKIN );
	}

	pop->popup( this, x, y );
}

void CWorkspaceManager::ShowContextMenu_Project( int x, int y, CProject *project )
{
	// New scene, edit comments
	mxPopupMenu *pop = new mxPopupMenu();

	pop->add ("Create New Scene...", IDC_WSM_PROJECT_SCENE_NEW );
	pop->addSeparator();
	pop->add ("Remove Project...", IDC_WSM_PROJECT_PRJ_REMOVE );
	pop->addSeparator();
	pop->add( "Edit comments...", IDC_WSM_PROJECT_PRJ_MODIFYCOMMENTS );
	if ( !project->IsFirstChild() || !project->IsLastChild() )
	{
		pop->addSeparator();
		if( !project->IsFirstChild() )
		{
			pop->add( va( "Move '%s' Up", project->GetName() ), IDC_WSM_SELECTION_MOVEUP );
		}
		if( !project->IsLastChild() ) 
		{
			pop->add( va( "Move '%s' Down", project->GetName() ), IDC_WSM_SELECTION_MOVEDOWN );
		}
	}
	pop->addSeparator();

	if ( !filesystem->IsFileWritable( project->GetFileName() ) )
	{
		pop->add( va( "Checkout '%s'", project->GetName() ), IDC_WSM_SELECTION_CHECKOUT );
	}
	else
	{
		pop->add( va( "Checkin '%s'", project->GetName() ), IDC_WSM_SELECTION_CHECKIN );
	}

	pop->popup( this, x, y );
}

void CWorkspaceManager::ShowContextMenu_Scene( int x, int y, CScene *scene )
{
	// New scene, edit comments
	mxPopupMenu *pop = new mxPopupMenu();

	pop->add( va( "Add VCD to '%s'...", scene->GetName() ), IDC_WSM_SCENE_VCD_ADD );
	pop->addSeparator();
	pop->add ("Remove Scene", IDC_WSM_SCENE_REMOVE );
	pop->addSeparator();
	pop->add( va( "Edit comments..." ), IDC_WSM_SCENE_EDIT_COMMENTS );
	if ( !scene->IsFirstChild() || !scene->IsLastChild() )
	{
		pop->addSeparator();
		if( !scene->IsFirstChild() )
		{
			pop->add( va( "Move '%s' Up", scene->GetName() ), IDC_WSM_SELECTION_MOVEUP );
		}
		if( !scene->IsLastChild() ) 
		{
			pop->add( va( "Move '%s' Down", scene->GetName() ), IDC_WSM_SELECTION_MOVEDOWN );
		}
	}

	pop->popup( this, x, y );
}

void CWorkspaceManager::ShowContextMenu_VCD( int x, int y, CVCDFile *vcd )
{
	// New scene, edit comments
	mxPopupMenu *pop = new mxPopupMenu();

	pop->add( va( "Remove VCD" ), IDC_WSM_SCENE_VCD_REMOVE );
	pop->addSeparator();
	pop->add( va( "Edit comments..." ), IDC_WSM_VCD_EDIT_COMMENTS );
	if ( !vcd->IsFirstChild() || !vcd->IsLastChild() )
	{
		pop->addSeparator();
		if( !vcd->IsFirstChild() )
		{
			pop->add( va( "Move '%s' Up", vcd->GetName() ), IDC_WSM_SELECTION_MOVEUP );
		}
		if( !vcd->IsLastChild() ) 
		{
			pop->add( va( "Move '%s' Down", vcd->GetName() ), IDC_WSM_SELECTION_MOVEDOWN );
		}
	}
	pop->addSeparator();
	if ( !filesystem->IsFileWritable( vcd->GetName() ) )
	{
		pop->add( va( "Checkout '%s'", vcd->GetName() ), IDC_WSM_SELECTION_CHECKOUT );
	}
	else
	{
		pop->add( va( "Checkin '%s'", vcd->GetName() ), IDC_WSM_SELECTION_CHECKIN );
	}

	pop->popup( this, x, y );
}

void CWorkspaceManager::ShowContextMenu_SoundEntry( int x, int y, CSoundEntry *entry )
{
	// New scene, edit comments
	mxPopupMenu *pop = new mxPopupMenu();

	pop->add ("&Play", IDC_WSM_SOUNDENTRY_PLAY );
	// pop->add( "&Jump To", IDC_WSM_SOUNDENTRY_SHOWINBROWSERS );
	pop->addSeparator();

	pop->add( "Properties...", IDC_WSM_SOUNDENTRY_PROPERTIES );

	pop->popup( this, x, y );
}

void CWorkspaceManager::ShowContextMenu_WaveFile( int x, int y, CWaveFile *entry )
{
	// New scene, edit comments
	mxPopupMenu *pop = new mxPopupMenu();

	pop->add ("&Play", IDC_WSM_SOUNDENTRY_PLAY );
	// pop->add( "&Jump To", IDC_WSM_SOUNDENTRY_SHOWINBROWSERS );

	if ( entry->GetVoiceDuck() )
	{
		pop->add ("Disable &voice duck", IDC_WSM_SOUNDENTRY_TOGGLEVOICEDUCK );
	}
	else
	{
		pop->add ("Enable &voice duck", IDC_WSM_SOUNDENTRY_TOGGLEVOICEDUCK );
	}
	pop->add( "&Edit sentence text...", IDC_WSM_SOUNDENTRY_EDITTEXT );
	pop->addSeparator();
	if ( !filesystem->IsFileWritable( entry->GetFileName() ) )
	{
		pop->add( va( "Checkout '%s'", entry->GetName() ), IDC_WSM_SELECTION_CHECKOUT );
	}
	else
	{
		pop->add( va( "Checkin '%s'", entry->GetName() ), IDC_WSM_SELECTION_CHECKIN );
	}
	pop->addSeparator();
	pop->add( "Properties...", IDC_WSM_WAVEFILE_PROPERTIES );

	pop->popup( this, x, y );
}


void CWorkspaceManager::OnChangeVSSProperites()
{
	CWorkspace *ws = GetBrowser()->GetWorkspace();
	if ( !ws )
	{
		return;
	}

	CVSSParams params;
	memset( &params, 0, sizeof( params ) );
	Q_snprintf( params.m_szDialogTitle, sizeof( params.m_szDialogTitle ), "VSS Properites" );
	Q_strcpy( params.m_szUserName, ws->GetVSSUserName() );
	Q_strcpy( params.m_szProject, ws->GetVSSProject() );

	if ( !VSSProperties( &params ) )
		return;

	if ( !params.m_szUserName[ 0 ] )
	{
		Con_Printf( "You must enter a user name\n" );
		return;
	}

	if ( !params.m_szProject[ 0 ] )
	{
		Con_Printf( "You must enter a project name\n" );
		return;
	}

	ws->SetVSSUserName( params.m_szUserName );
	ws->SetVSSProject( params.m_szProject );

	ws->SetDirty( true );

	Con_Printf( "VSS user = '%s', project = '%s'\n",
		ws->GetVSSUserName(), ws->GetVSSProject() );
}

void CWorkspaceManager::OnCheckoutWorkspace()
{
	CWorkspace *ws = GetBrowser()->GetWorkspace();
	if ( !ws )
	{
		return;
	}

	ws->Checkout();
}

void CWorkspaceManager::OnCheckinWorkspace()
{
	CWorkspace *ws = GetBrowser()->GetWorkspace();
	if ( !ws )
	{
		return;
	}

	ws->Checkin();
}


#define CX_ICON  16
#define CY_ICON  16 

HIMAGELIST CWorkspaceManager::CreateImageList()
{
	HIMAGELIST list;
	
	list = ImageList_Create( CX_ICON, CY_ICON, 
		FALSE, NUM_IMAGES, 0 );

    // Load the icon resources, and add the icons to the image list. 
    HICON hicon;
	int slot;
	int c = 0;
	
	hicon = LoadIcon( GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_WORKSPACE)); 
	slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon( GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_WORKSPACE_CHECKEDOUT)); 
	slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_PROJECT)); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_PROJECT_CHECKEDOUT)); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_SCENE)); 
	slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

//	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_SCENE_CHECKEDOUT)); 
//	slot = ImageList_AddIcon(list, hicon); 
//	Assert( slot == c++ );
//	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_VCD)); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_VCD_CHECKEDOUT )); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_WAV)); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_WAV_CHECKEDOUT)); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_SPEAK)); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	hicon = LoadIcon(GetModuleHandle( 0 ), MAKEINTRESOURCE(IDI_SPEAK_CHECKEDOUT)); 
    slot = ImageList_AddIcon(list, hicon); 
	Assert( slot == c++ );
	DeleteObject( hicon );

	return list;
}
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CWorkspaceManager::RefreshBrowsers()
{
	GetBrowser()->PopulateTree();

	GetSoundBrowser()->RepopulateTree();
	GetWaveBrowser()->RepopulateTree();
}

void CWorkspaceManager::OnSoundShowInBrowsers()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	CSoundEntry *se = item->GetSoundEntry();
	if ( se )
	{
		GetSoundBrowser()->JumpToItem( se );
		return;
	}

	CWaveFile *wave = item->GetWaveFile();
	if ( wave )
	{
		GetWaveBrowser()->JumpToItem( wave );
		if ( wave->GetOwnerSoundEntry() )
		{
			GetSoundBrowser()->JumpToItem( wave->GetOwnerSoundEntry()  );
		}
	}
}

void CWorkspaceManager::OnCheckout()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	item->Checkout();

	GetBrowser()->PopulateTree();

	OnUpdateTitle();
}

void CWorkspaceManager::OnCheckin()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	item->Checkin();

	GetBrowser()->PopulateTree();

	OnUpdateTitle();
}

void CWorkspaceManager::OnMoveUp()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	ITreeItem *parent = item->GetParentItem();
	if ( !parent )
		return;

	parent->MoveChildUp( item );

	parent->SetDirty( true );

	GetBrowser()->PopulateTree();

	OnUpdateTitle();

	GetBrowser()->JumpTo( item );
}

void CWorkspaceManager::OnMoveDown()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	ITreeItem *parent = item->GetParentItem();
	if ( !parent )
		return;

	parent->MoveChildDown( item );

	parent->SetDirty( true );

	GetBrowser()->PopulateTree();

	OnUpdateTitle();

	GetBrowser()->JumpTo( item );
}

void CWorkspaceManager::SetWorkspaceDirty()
{
	CWorkspace *ws = GetBrowser()->GetWorkspace();
	if ( ws )
	{
		ws->SetDirty( true );
	}
	OnUpdateTitle();
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CWorkspaceManager::OnSoundProperties()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	CSoundEntry *entry = item->GetSoundEntry();
	if ( !entry )
		return;

	CSoundParams params;
	memset( &params, 0, sizeof( params ) );

	Q_snprintf( params.m_szDialogTitle, sizeof( params.m_szDialogTitle ), "Sound Properties" );

	params.items.AddToTail( entry );

	SoundProperties( &params );
}



//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CWorkspaceManager::OnWaveProperties()
{
	ITreeItem *item = GetBrowser()->GetSelectedItem();
	if ( !item )
		return;

	CWaveFile *wave = item->GetWaveFile();
	if ( !wave )
		return;

	CWaveParams params;
	memset( &params, 0, sizeof( params ) );

	Q_snprintf( params.m_szDialogTitle, sizeof( params.m_szDialogTitle ), "Wave Properties" );

	params.items.AddToTail( wave );

	WaveProperties( &params );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?