source-engine/public/vgui_controls/DialogManager.h

197 lines
4.2 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef DIALOGMANAGER_H
#define DIALOGMANAGER_H
#ifdef _WIN32
#pragma once
#endif
#include <utllinkedlist.h>
#include <KeyValues.h>
#include <vgui_controls/PHandle.h>
namespace vgui
{
//-----------------------------------------------------------------------------
// Purpose: utility class, maps a set of ID's to dialogs
// used to manage sets of similar dialogs (object property dialogs, etc.)
//-----------------------------------------------------------------------------
template <class TDialog, class I = int>
class DialogManager
{
public:
// new dialog factory function
typedef TDialog *(*CreateNewDialogFunc_t)(I dialogID);
// constructor
DialogManager(CreateNewDialogFunc_t createDialogFunc);
// finds the dialog by the specified ID
TDialog *FindDialog(I dialogID, bool bCreate);
// opens the dialog; creating it if specified
TDialog *ActivateDialog(I dialogID, bool bCreate);
// closes all the dialogs
void CloseAll();
// closes and deletes all the dialogs
void CloseAndDeleteAll();
// returns number of active dialogs
int Count();
// sets parent to use
void SetParent( vgui::VPANEL parent );
private:
// checks if an index in the dialog list is valid; if it has been deleted, removes the entry
bool ValidateIndex(int index);
struct DialogItem_t
{
I id;
DHANDLE<TDialog> dlg;
};
CUtlLinkedList<DialogItem_t, int> m_Dialogs;
CreateNewDialogFunc_t m_CreateFunc;
vgui::VPANEL m_pVGUIParentPanel;
};
// constructor
template <class TDialog, class I>
inline DialogManager<TDialog, I>::DialogManager(CreateNewDialogFunc_t createDialogFunc)
{
m_CreateFunc = createDialogFunc;
m_pVGUIParentPanel = NULL;
}
// finds the dialog; creating it if necessary
template <class TDialog, class I>
inline TDialog *DialogManager<TDialog, I>::FindDialog(I dialogID, bool bCreate)
{
for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++)
{
if (ValidateIndex(i) && m_Dialogs[i].id == dialogID)
{
return m_Dialogs[i].dlg;
}
}
if (bCreate)
{
int newIndex = m_Dialogs.AddToTail();
if (m_CreateFunc)
{
m_Dialogs[newIndex].dlg = m_CreateFunc(dialogID);
}
else
{
m_Dialogs[newIndex].dlg = new TDialog(NULL, dialogID);
}
Assert(m_pVGUIParentPanel);
m_Dialogs[newIndex].dlg->SetParent( m_pVGUIParentPanel );
m_Dialogs[newIndex].id = dialogID;
return m_Dialogs[newIndex].dlg;
}
// dlg not found, not created
return NULL;
}
// opens the dialog; creating it if necessary
template <class TDialog, class I>
inline TDialog *DialogManager<TDialog, I>::ActivateDialog(I dialogID, bool bCreate)
{
TDialog *dlg = FindDialog(dialogID, bCreate);
if (dlg)
{
dlg->Activate();
}
return dlg;
}
// count
template <class TDialog, class I>
inline int DialogManager<TDialog, I>::Count()
{
// validate all the indexes first
for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++)
{
if (ValidateIndex(i))
{
}
}
// return the (remaining) count
return m_Dialogs.Count();
}
// closes all the dialogs
template <class TDialog, class I>
inline void DialogManager<TDialog, I>::CloseAll()
{
for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++)
{
if (ValidateIndex(i))
{
m_Dialogs[i].dlg->PostMessage(m_Dialogs[i].dlg, new KeyValues("Close"));
}
}
}
// closes and deletes all the dialogs
template <class TDialog, class I>
inline void DialogManager<TDialog, I>::CloseAndDeleteAll()
{
CloseAll();
for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++)
{
if (ValidateIndex(i))
{
m_Dialogs[i].dlg->MarkForDeletion();
}
}
m_Dialogs.RemoveAll();
}
// checks if a dialog is valid; if it has been deleted, removes the entry
template <class TDialog, class I>
inline bool DialogManager<TDialog, I>::ValidateIndex(int index)
{
if (m_Dialogs.IsValidIndex(index))
{
if (m_Dialogs[index].dlg.Get())
{
return true;
}
else
{
// entry has been deleted; removed
m_Dialogs.Remove(index);
}
}
return false;
}
template <class TDialog, class I>
inline void DialogManager<TDialog, I>::SetParent( vgui::VPANEL parent )
{
m_pVGUIParentPanel = parent;
}
} // namespace vgui
#endif // DIALOGMANAGER_H