You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
4.2 KiB
197 lines
4.2 KiB
5 years ago
|
//========= 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
|