2025-06-04 03:22:50 +02:00

151 lines
5.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. =======
//
// Purpose:
//
//=============================================================================
#ifndef DMEDEMO2_H
#define DMEDEMO2_H
#ifdef _WIN32
#pragma once
#endif
#include "datamodel/dmelement.h"
#include "datamodel/dmattributevar.h"
//-----------------------------------------------------------------------------
// Demo 2: Defining editable versions of the in-game classes
//
// This is a tricky thing to get right. You want to design for several things:
// 1) Ease of data change
// 2) Separation of editable state from user interface
// 3) Ease of discoverability of data from just looking at the output file
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Dme version of a quad
// Very straightforward, this is identical to the in-game representation
// with the exception of the 'name' attribute all DmElements have.
//-----------------------------------------------------------------------------
class CDmeQuadV2 : public CDmElement
{
DEFINE_ELEMENT( CDmeQuadV2, CDmElement );
public:
CDmaVar< int > m_X0;
CDmaVar< int > m_Y0;
CDmaVar< int > m_X1;
CDmaVar< int > m_Y1;
CDmaColor m_Color;
};
//-----------------------------------------------------------------------------
// Dme version of a list of quads
// Note that we hide the list of quads here and instead provide a set of
// service functions limited to the types of editing operations we expect
// to perform on the quad list
//
// Also note when you need to edit an array of struct data,
// it often results in easier to use code if you create a dme class which
// represents the array of structs (CDmeQuadListV2 in this case) with utility
// methods as opposed to simply using CDmaElementArray< CDmeQuadV2 > in
// containing classes (CDmeQuadDocV2 in this case)
//
// You also want to avoid using parallel arrays of CDmaIntArrays<> etc
// for each field of the struct. It sucks having to add an element into
// each array every time you add a struct
//-----------------------------------------------------------------------------
class CDmeQuadListV2 : public CDmElement
{
DEFINE_ELEMENT( CDmeQuadListV2, CDmElement );
public:
// List management
void AddQuad( CDmeQuadV2 *pQuad );
CDmeQuadV2 *FindQuadByName( const char *pName );
void RemoveQuad( CDmeQuadV2 *pQuad );
void RemoveAllQuads();
// Render order management
void MoveToFront( CDmeQuadV2 *pQuad );
void MoveToBack( CDmeQuadV2 *pQuad );
private:
CDmaElementArray< CDmeQuadV2 > m_Quads;
};
//-----------------------------------------------------------------------------
// Dme version of a the editor 'document'
//
// The interface here is designed to be able to be used directly from
// python. I'm currently hiding direct access to CDmeQuadV2 to here to
// make python usage easier, but python can handle it if we pass CDmeQuadV2s
// in the interface. We may well want to start passing them around once
// we get to the VGUI-based editor.
//
// Early editors we wrote didn't clearly separate data from UI at the doc
// level which resulted in a bunch of complexity as our tools got bigger.
// Actually making a Dm element which contains a notion of selection in it
// I believe will reduce this problem in the future (this is still an untested
// theory in-house, although other 3rd party editors use this technique also).
//
// Remember that only attributes can be saved and have undo support.
// If you want to add members to a Dme element which are not saved and
// never need undo, you can either use normal non-CDma members,
// or mark attributes to not be saved. In this case, I make the
// selection state be an attribute to get undo but mark the selection
// attribute to not save it to the file.
//-----------------------------------------------------------------------------
class CDmeQuadDocV2 : public CDmElement
{
DEFINE_ELEMENT( CDmeQuadDocV2, CDmElement );
public:
// Adds quad, resets selection to new quad
void AddQuad( const char *pName, int x0, int y0, int x1, int y1 );
// Clears selection
void ClearSelection();
// Adds quad to selection
void AddQuadToSelection( const char *pName );
// Deletes selected quads
void DeleteSelectedQuads();
// Changes quad color
void SetSelectedQuadColor( int r, int g, int b, int a );
// Moves quads
void MoveSelectedQuads( int dx, int dy );
// Resizes selected quad (works only when 1 quad is selected)
void ResizeSelectedQuad( int nWidth, int nHeight );
// Moves selected quad to front/back (works only when 1 quad is selected)
void MoveSelectedToFront();
void MoveSelectedToBack();
private:
CDmaElement< CDmeQuadListV2 > m_Quads;
CDmaElementArray< CDmeQuadV2 > m_SelectedQuads;
};
//-----------------------------------------------------------------------------
// Usage in python (works from the debugger!)
//-----------------------------------------------------------------------------
// 1) Python at commandline
// 2) import vs
// 3) vs.dm.SetUndoEnabled( 0 )
// 4) doc = vs.CreateElement( DmeQuadDocV2, root, -1 )
// 5) … doc stuff, e.g. doc.AddQuad( 'quad1', 5, 5, 30, 40 )
// 6) vs.dm.SaveToFile( file name, , keyvalues2, dmx, doc )
#endif // DMEDEMO2_H