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.
196 lines
4.2 KiB
196 lines
4.2 KiB
//========= 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
|
|
|