//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef DIALOGMANAGER_H #define DIALOGMANAGER_H #ifdef _WIN32 #pragma once #endif #include #include #include 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 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 dlg; }; CUtlLinkedList m_Dialogs; CreateNewDialogFunc_t m_CreateFunc; vgui::VPANEL m_pVGUIParentPanel; }; // constructor template inline DialogManager::DialogManager(CreateNewDialogFunc_t createDialogFunc) { m_CreateFunc = createDialogFunc; m_pVGUIParentPanel = NULL; } // finds the dialog; creating it if necessary template inline TDialog *DialogManager::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 inline TDialog *DialogManager::ActivateDialog(I dialogID, bool bCreate) { TDialog *dlg = FindDialog(dialogID, bCreate); if (dlg) { dlg->Activate(); } return dlg; } // count template inline int DialogManager::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 inline void DialogManager::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 inline void DialogManager::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 inline bool DialogManager::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 inline void DialogManager::SetParent( vgui::VPANEL parent ) { m_pVGUIParentPanel = parent; } } // namespace vgui #endif // DIALOGMANAGER_H