mirror of
https://github.com/dhewm/dhewm3.git
synced 2025-04-19 08:58:56 +00:00
Various changes to Decl Browser.
- fix PathTreeCtrl node allocation, add selection & tooltips - Decl New dialog is mostly working - fix: Decl Browser no longer adds an extra root node - Decl Browser has a bug searching: still need to enter "*/" to skip the implicit root node ImGui issue: only one window is displayed by ImGui? repro: editDecls, then select any particle under particles, click New, enter a name, click OK.
This commit is contained in:
parent
3ae2d2c8f6
commit
926263bde0
9 changed files with 242 additions and 240 deletions
|
@ -1310,18 +1310,6 @@ static void Com_EditParticles_f(const idCmdArgs& args) {
|
|||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef ID_ALLOW_TOOLS
|
||||
/*
|
||||
==================
|
||||
Com_EditSounds_f
|
||||
==================
|
||||
*/
|
||||
static void Com_EditSounds_f( const idCmdArgs &args ) {
|
||||
SoundEditorInit( NULL );
|
||||
cvarSystem->SetCVarInteger( "g_editEntityMode", 2 );
|
||||
}
|
||||
|
||||
/*
|
||||
==================
|
||||
Com_EditDecls_f
|
||||
|
@ -1352,6 +1340,17 @@ static void Com_EditScripts_f( const idCmdArgs &args ) {
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef ID_ALLOW_TOOLS
|
||||
/*
|
||||
==================
|
||||
Com_EditSounds_f
|
||||
==================
|
||||
*/
|
||||
static void Com_EditSounds_f( const idCmdArgs &args ) {
|
||||
SoundEditorInit( NULL );
|
||||
cvarSystem->SetCVarInteger( "g_editEntityMode", 2 );
|
||||
}
|
||||
|
||||
#endif // ID_ALLOW_TOOLS
|
||||
|
||||
/*
|
||||
|
|
|
@ -220,6 +220,11 @@ void ScriptEditorInit(const idDict* spawnArgs)
|
|||
|
||||
impl::SetReleaseToolMouse(true);
|
||||
|
||||
if ( spawnArgs ) {
|
||||
const char *str = spawnArgs->GetString( "script" );
|
||||
ScriptEditor::Instance().OpenFile( str );
|
||||
}
|
||||
|
||||
D3::ImGuiHooks::OpenWindow(D3::ImGuiHooks::D3_ImGuiWin_ScriptEditor);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,9 +32,9 @@ If you have questions concerning this license or the applicable additional terms
|
|||
#include "framework/FileSystem.h"
|
||||
|
||||
#include "PathTreeCtrl.h"
|
||||
#include "DeclBrowser.h"
|
||||
#include "DeclEditor.h"
|
||||
#include "DeclNew.h"
|
||||
#include "DeclEditor.h"
|
||||
#include "DeclBrowser.h"
|
||||
|
||||
const int DECLTYPE_SHIFT = 24;
|
||||
const int DECLINDEX_MASK = ( 1 << DECLTYPE_SHIFT ) - 1;
|
||||
|
@ -47,20 +47,12 @@ const int DECLTYPE_GUI = 127;
|
|||
|
||||
namespace ImGuiTools {
|
||||
|
||||
/*
|
||||
toolTip_t DialogDeclBrowser::toolTips[] = {
|
||||
{ IDC_DECLBROWSER_TREE, "decl browser" },
|
||||
{ IDC_DECLBROWSER_EDIT_SEARCH_NAMES, "search for declarations with matching name, use meta characters: *, ? and [abc...]" },
|
||||
{ IDC_DECLBROWSER_EDIT_SEARCH_TEXT, "search for declarations containing text" },
|
||||
{ IDC_DECLBROWSER_BUTTON_FIND, "find declarations matching the search strings" },
|
||||
{ IDC_DECLBROWSER_BUTTON_EDIT, "edit selected declaration" },
|
||||
{ IDC_DECLBROWSER_BUTTON_NEW, "create new declaration" },
|
||||
{ IDC_DECLBROWSER_BUTTON_RELOAD, "reload declarations" },
|
||||
{ IDOK, "ok" },
|
||||
{ IDCANCEL, "cancel" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
*/
|
||||
bool DeclBrowserOnToolTipNotify( void *data, PathTreeNode *item, idStr &tooltipText ) {
|
||||
return reinterpret_cast<DeclBrowser *>(data)->OnToolTipNotify( item, tooltipText );
|
||||
}
|
||||
void DeclBrowserOnTreeSelChanged( void *data ) {
|
||||
reinterpret_cast<DeclBrowser *>(data)->OnTreeSelChanged();
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
|
@ -84,6 +76,7 @@ DeclBrowser::DeclBrowser()
|
|||
, numListedDecls(0)
|
||||
, findNameString()
|
||||
, findTextString()
|
||||
, declNewDlg()
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -106,34 +99,44 @@ void DeclBrowser::Draw() {
|
|||
impl::SetReleaseToolMouse( true );
|
||||
|
||||
if ( ImGui::BeginChild( "Decl Tree", ImVec2( 300, 400 ) ) ) {
|
||||
declTree.Draw();
|
||||
ImGui::SetItemTooltip( "decl browser" );
|
||||
declTree.Draw( DeclBrowserOnToolTipNotify, DeclBrowserOnTreeSelChanged, this );
|
||||
ImGui::EndChild();
|
||||
}
|
||||
|
||||
if ( ImGui::InputTextStr( "Search names", &findNameEdit ) ) {
|
||||
}
|
||||
ImGui::SetItemTooltip( "search for declarations with matching name, use meta characters: *, ? and [abc...]" );
|
||||
if ( ImGui::InputTextStr( "Search text", &findTextEdit ) ) {
|
||||
}
|
||||
ImGui::SetItemTooltip( "search for declarations containing text" );
|
||||
if ( ImGui::Button( "Find" ) ) {
|
||||
OnBnClickedFind();
|
||||
}
|
||||
ImGui::SetItemTooltip( "find declarations matching the search strings" );
|
||||
ImGui::SameLine();
|
||||
if ( ImGui::Button( "Edit" ) ) {
|
||||
OnBnClickedEdit();
|
||||
}
|
||||
ImGui::SetItemTooltip( "edit selected declaration" );
|
||||
ImGui::SameLine();
|
||||
if ( ImGui::Button( "New" ) ) {
|
||||
OnBnClickedNew();
|
||||
}
|
||||
ImGui::SetItemTooltip( "create new declaration" );
|
||||
ImGui::SameLine();
|
||||
if ( ImGui::Button( "Reload" ) ) {
|
||||
ReloadDeclarations();
|
||||
}
|
||||
ImGui::SetItemTooltip( "reload declarations" );
|
||||
ImGui::SameLine();
|
||||
if ( ImGui::Button( "Close" ) ) {
|
||||
showTool = false;
|
||||
}
|
||||
|
||||
if ( declNewDlg.Draw() ) {
|
||||
OnBnClickedNewAccepted();
|
||||
}
|
||||
}
|
||||
ImGui::End();
|
||||
|
||||
|
@ -265,7 +268,7 @@ void DeclBrowser::GetDeclName( PathTreeNode *item, idStr &typeName, idStr &declN
|
|||
idStr itemName;
|
||||
|
||||
declName.Clear();
|
||||
for( parent = declTree.GetParentItem( item ); parent; parent = declTree.GetParentItem( parent ) ) {
|
||||
for( parent = declTree.GetParentItem( item ); parent && parent != declTree.GetRootItem(); parent = declTree.GetParentItem( parent ) ) {
|
||||
itemName = declTree.GetItemText( item );
|
||||
declName = itemName + "/" + declName;
|
||||
item = parent;
|
||||
|
@ -284,6 +287,10 @@ const idDecl *DeclBrowser::GetDeclFromTreeItem( PathTreeNode *item ) const {
|
|||
declType_t type;
|
||||
const idDecl *decl;
|
||||
|
||||
if ( !item ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ( declTree.GetChildItem( item ) ) {
|
||||
return NULL;
|
||||
}
|
||||
|
@ -336,33 +343,28 @@ void DeclBrowser::EditSelected( void ) const {
|
|||
case DECL_AF: {
|
||||
decl = declManager->DeclByIndex( type, index, false );
|
||||
spawnArgs.Set( "articulatedFigure", decl->GetName() );
|
||||
//AFEditorInit( &spawnArgs );
|
||||
ImGuiTools::AfEditorInit(); // TODO: pass spawnArgs
|
||||
break;
|
||||
}
|
||||
case DECL_PARTICLE: {
|
||||
decl = declManager->DeclByIndex( type, index, false );
|
||||
spawnArgs.Set( "model", decl->GetName() );
|
||||
//ParticleEditorInit( &spawnArgs );
|
||||
ImGuiTools::ParticleEditorInit( &spawnArgs );
|
||||
break;
|
||||
}
|
||||
case DECL_PDA: {
|
||||
decl = declManager->DeclByIndex( type, index, false );
|
||||
spawnArgs.Set( "pda", decl->GetName() );
|
||||
//PDAEditorInit( &spawnArgs );
|
||||
ImGuiTools::PDAEditorInit( &spawnArgs );
|
||||
break;
|
||||
}
|
||||
case DECLTYPE_SCRIPT:
|
||||
case DECLTYPE_GUI: {
|
||||
idStr typeName, declName;
|
||||
GetDeclName( item, typeName, declName );
|
||||
/*
|
||||
ScriptEditor* scriptEditor;
|
||||
scriptEditor = new ScriptEditor;
|
||||
scriptEditor->Create( IDD_DIALOG_SCRIPTEDITOR, GetParent() );
|
||||
scriptEditor->OpenFile( typeName + "/" + declName + ( ( type == DECLTYPE_SCRIPT ) ? ".script" : ".gui" ) );
|
||||
scriptEditor->ShowWindow( SW_SHOW );
|
||||
scriptEditor->SetFocus();
|
||||
*/
|
||||
idStr fileName = typeName + "/" + declName + ( ( type == DECLTYPE_SCRIPT ) ? ".script" : ".gui" );
|
||||
spawnArgs.Set( "script", fileName );
|
||||
ImGuiTools::ScriptEditorInit( &spawnArgs );
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
|
@ -442,10 +444,6 @@ DeclBrowser::Reset
|
|||
*/
|
||||
void DeclBrowser::Reset() {
|
||||
|
||||
//GetClientRect( initialRect );
|
||||
|
||||
//baseDeclTree.Create( 0, initialRect, this, IDC_DECLBROWSER_BASE_TREE );
|
||||
|
||||
InitBaseDeclTree();
|
||||
|
||||
findNameString = "*";
|
||||
|
@ -469,82 +467,28 @@ void DeclBrowser::ReloadDeclarations( void ) {
|
|||
OnBnClickedFind();
|
||||
}
|
||||
|
||||
/*
|
||||
BEGIN_MESSAGE_MAP(DialogDeclBrowser, CDialog)
|
||||
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
|
||||
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
|
||||
ON_WM_DESTROY()
|
||||
ON_WM_ACTIVATE()
|
||||
ON_WM_MOVE()
|
||||
ON_WM_SIZE()
|
||||
ON_WM_SIZING()
|
||||
ON_WM_SETFOCUS()
|
||||
ON_NOTIFY(TVN_SELCHANGED, IDC_DECLBROWSER_TREE, OnTreeSelChanged)
|
||||
ON_NOTIFY(NM_DBLCLK, IDC_DECLBROWSER_TREE, OnTreeDblclk)
|
||||
ON_BN_CLICKED(IDC_DECLBROWSER_BUTTON_FIND, OnBnClickedFind)
|
||||
ON_BN_CLICKED(IDC_DECLBROWSER_BUTTON_EDIT, OnBnClickedEdit)
|
||||
ON_BN_CLICKED(IDC_DECLBROWSER_BUTTON_NEW, OnBnClickedNew)
|
||||
ON_BN_CLICKED(IDC_DECLBROWSER_BUTTON_RELOAD, OnBnClickedReload)
|
||||
ON_BN_CLICKED(IDOK, OnBnClickedOk)
|
||||
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
|
||||
END_MESSAGE_MAP()
|
||||
*/
|
||||
|
||||
// DeclBrowser message handlers
|
||||
|
||||
/*
|
||||
================
|
||||
DialogDeclBrowser::OnToolTipNotify
|
||||
DeclBrowser::OnToolTipNotify
|
||||
================
|
||||
*//*
|
||||
BOOL DialogDeclBrowser::OnToolTipNotify( UINT id, NMHDR *pNMHDR, LRESULT *pResult ) {
|
||||
// need to handle both ANSI and UNICODE versions of the message
|
||||
#ifdef _UNICODE
|
||||
TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR;
|
||||
#else
|
||||
TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR;
|
||||
#endif
|
||||
|
||||
if ( pNMHDR->hwndFrom == declTree.GetSafeHwnd() ) {
|
||||
CString toolTip;
|
||||
const idDecl *decl = GetDeclFromTreeItem( (HTREEITEM) pNMHDR->idFrom );
|
||||
*/
|
||||
bool DeclBrowser::OnToolTipNotify( PathTreeNode *item, idStr &tooltipText ) const {
|
||||
if ( item ) {
|
||||
const idDecl *decl = GetDeclFromTreeItem( item );
|
||||
|
||||
if ( !decl ) {
|
||||
return FALSE;
|
||||
return false;
|
||||
}
|
||||
|
||||
toolTip = va( "%s, line: %d", decl->GetFileName(), decl->GetLineNum() );
|
||||
tooltipText = va( "%s, line: %d", decl->GetFileName(), decl->GetLineNum() );
|
||||
|
||||
#ifndef _UNICODE
|
||||
if( pNMHDR->code == TTN_NEEDTEXTA ) {
|
||||
delete m_pchTip;
|
||||
m_pchTip = new TCHAR[toolTip.GetLength() + 2];
|
||||
lstrcpyn( m_pchTip, toolTip, toolTip.GetLength() + 1 );
|
||||
pTTTW->lpszText = (WCHAR*)m_pchTip;
|
||||
} else {
|
||||
delete m_pwchTip;
|
||||
m_pwchTip = new WCHAR[toolTip.GetLength() + 2];
|
||||
_mbstowcsz( m_pwchTip, toolTip, toolTip.GetLength() + 1 );
|
||||
pTTTW->lpszText = (WCHAR*)m_pwchTip;
|
||||
}
|
||||
#else
|
||||
if( pNMHDR->code == TTN_NEEDTEXTA ) {
|
||||
delete m_pchTip;
|
||||
m_pchTip = new TCHAR[toolTip.GetLength() + 2];
|
||||
_wcstombsz( m_pchTip, toolTip, toolTip.GetLength() + 1 );
|
||||
pTTTA->lpszText = (LPTSTR)m_pchTip;
|
||||
} else {
|
||||
delete m_pwchTip;
|
||||
m_pwchTip = new WCHAR[toolTip.GetLength() + 2];
|
||||
lstrcpyn( m_pwchTip, toolTip, toolTip.GetLength() + 1 );
|
||||
pTTTA->lpszText = (LPTSTR) m_pwchTip;
|
||||
}
|
||||
#endif
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
return DefaultOnToolTipNotify( toolTips, id, pNMHDR, pResult );
|
||||
}*/
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
|
@ -615,37 +559,36 @@ void DeclBrowser::OnBnClickedNew() {
|
|||
PathTreeNode *item;
|
||||
idStr typeName, declName;
|
||||
const idDecl *decl;
|
||||
DeclNew newDeclDlg;
|
||||
|
||||
newDeclDlg.SetDeclTree( &baseDeclTree );
|
||||
declNewDlg.SetDeclTree( &baseDeclTree );
|
||||
|
||||
item = declTree.GetSelectedItem();
|
||||
if ( item ) {
|
||||
GetDeclName( item, typeName, declName );
|
||||
newDeclDlg.SetDefaultType( typeName );
|
||||
newDeclDlg.SetDefaultName( declName );
|
||||
declNewDlg.SetDefaultType( typeName );
|
||||
declNewDlg.SetDefaultName( declName );
|
||||
}
|
||||
|
||||
decl = GetSelectedDecl();
|
||||
if ( decl ) {
|
||||
newDeclDlg.SetDefaultFile( decl->GetFileName() );
|
||||
declNewDlg.SetDefaultFile( decl->GetFileName() );
|
||||
}
|
||||
/*
|
||||
if ( newDeclDlg.DoModal() != IDOK ) {
|
||||
return;
|
||||
}
|
||||
*/
|
||||
decl = newDeclDlg.GetNewDecl();
|
||||
|
||||
declNewDlg.Start();
|
||||
}
|
||||
|
||||
void DeclBrowser::OnBnClickedNewAccepted() {
|
||||
const idDecl *decl = declNewDlg.GetNewDecl();
|
||||
|
||||
if ( decl ) {
|
||||
declName = declManager->GetDeclNameFromType( decl->GetType() );
|
||||
idStr declName = declManager->GetDeclNameFromType( decl->GetType() );
|
||||
declName += "/";
|
||||
declName += decl->GetName();
|
||||
|
||||
int id = GetIdFromTypeAndIndex( decl->GetType(), decl->Index() );
|
||||
|
||||
baseDeclTree.InsertPathIntoTree( declName, id );
|
||||
item = declTree.InsertPathIntoTree( declName, id );
|
||||
PathTreeNode *item = declTree.InsertPathIntoTree( declName, id );
|
||||
declTree.SelectItem( item );
|
||||
|
||||
EditSelected();
|
||||
|
@ -664,26 +607,4 @@ void DeclBrowser::OnBnClickedReload() {
|
|||
ReloadDeclarations();
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
DeclBrowser::OnBnClickedOk
|
||||
================
|
||||
*/
|
||||
void DeclBrowser::OnBnClickedOk() {
|
||||
// with a modeless dialog once it is closed and re-activated windows seems
|
||||
// to enjoy mapping ENTER back to the default button ( OK ) even if you have
|
||||
// it NOT set as the default.. in this case use cancel button exit and ignore
|
||||
// default IDOK handling.
|
||||
// OnOK();
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
DeclBrowser::OnBnClickedCancel
|
||||
================
|
||||
*/
|
||||
void DeclBrowser::OnBnClickedCancel() {
|
||||
//OnCancel();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,6 +32,7 @@ If you have questions concerning this license or the applicable additional terms
|
|||
#include "../../edit_public.h"
|
||||
|
||||
#include "PathTreeCtrl.h"
|
||||
#include "DeclNew.h"
|
||||
|
||||
namespace ImGuiTools {
|
||||
|
||||
|
@ -45,6 +46,8 @@ public:
|
|||
|
||||
void ReloadDeclarations( void );
|
||||
bool CompareDecl( PathTreeNode *item, const char *name ) const;
|
||||
bool OnToolTipNotify( PathTreeNode *item, idStr &tooltipText ) const;
|
||||
void OnTreeSelChanged();
|
||||
|
||||
void Reset();
|
||||
void Draw();
|
||||
|
@ -57,15 +60,12 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
//bool OnToolTipNotify( UINT id, NMHDR *pNMHDR, LRESULT *pResult );
|
||||
void OnTreeSelChanged();
|
||||
void OnTreeDblclk();
|
||||
void OnBnClickedFind();
|
||||
void OnBnClickedEdit();
|
||||
void OnBnClickedNew();
|
||||
void OnBnClickedNewAccepted();
|
||||
void OnBnClickedReload();
|
||||
void OnBnClickedOk();
|
||||
void OnBnClickedCancel();
|
||||
|
||||
private:
|
||||
bool isShown;
|
||||
|
@ -81,16 +81,13 @@ private:
|
|||
bool reloadButtonEnabled;
|
||||
bool cancelButtonEnabled;
|
||||
|
||||
//static toolTip_t toolTips[];
|
||||
|
||||
//CRect initialRect;
|
||||
PathTreeCtrl baseDeclTree;
|
||||
int numListedDecls;
|
||||
idStr findNameString;
|
||||
idStr findTextString;
|
||||
|
||||
//TCHAR * m_pchTip;
|
||||
//WCHAR * m_pwchTip;
|
||||
DeclNew declNewDlg;
|
||||
|
||||
private:
|
||||
void AddDeclTypeToTree( declType_t type, const char *root, PathTreeCtrl &tree );
|
||||
|
|
|
@ -28,8 +28,9 @@ If you have questions concerning this license or the applicable additional terms
|
|||
|
||||
#include "../util/ImGui_IdWidgets.h"
|
||||
|
||||
#include "DeclBrowser.h"
|
||||
#include "PathTreeCtrl.h"
|
||||
#include "DeclEditor.h"
|
||||
#include "DeclBrowser.h"
|
||||
|
||||
namespace ImGuiTools {
|
||||
|
||||
|
|
|
@ -30,51 +30,32 @@ If you have questions concerning this license or the applicable additional terms
|
|||
|
||||
#include "framework/FileSystem.h"
|
||||
|
||||
#include "DeclBrowser.h"
|
||||
#include "PathTreeCtrl.h"
|
||||
#include "DeclNew.h"
|
||||
#include "DeclBrowser.h"
|
||||
|
||||
namespace ImGuiTools {
|
||||
|
||||
/*
|
||||
toolTip_t DialogDeclNew::toolTips[] = {
|
||||
{ IDC_DECLNEW_COMBO_NEW_TYPE, "select the declaration type to create" },
|
||||
{ IDC_DECLNEW_EDIT_NEW_NAME, "enter a name for the new declaration" },
|
||||
{ IDC_DECLNEW_EDIT_NEW_FILE, "enter the name of the file to add the declaration to" },
|
||||
{ IDC_DECLNEW_BUTTON_NEW_FILE, "select existing file to add the declaration to" },
|
||||
{ IDOK, "create new declaration" },
|
||||
{ IDCANCEL, "cancel" },
|
||||
{ 0, NULL }
|
||||
};*/
|
||||
|
||||
|
||||
/*
|
||||
================
|
||||
DeclNew::DialogDeclNew
|
||||
DeclNew::DeclNew
|
||||
================
|
||||
*/
|
||||
DeclNew::DeclNew()
|
||||
: declTree(NULL)
|
||||
: typeList()
|
||||
, typeListSel(-1)
|
||||
, nameEdit()
|
||||
, fileEdit()
|
||||
, errorText()
|
||||
, declTree(NULL)
|
||||
, defaultType()
|
||||
, defaultName()
|
||||
, newDecl(NULL)
|
||||
, state(DONE)
|
||||
, selectDlg( DECL_AF, "af", ".af", "AFs" )
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
DeclNew::DoDataExchange
|
||||
================
|
||||
*//*
|
||||
void DialogDeclNew::DoDataExchange(CDataExchange* pDX) {
|
||||
CDialog::DoDataExchange(pDX);
|
||||
//{{AFX_DATA_MAP(DialogDeclNew)
|
||||
DDX_Control(pDX, IDC_DECLNEW_COMBO_NEW_TYPE, typeList);
|
||||
DDX_Control(pDX, IDC_DECLNEW_EDIT_NEW_NAME, nameEdit);
|
||||
DDX_Control(pDX, IDC_DECLNEW_EDIT_NEW_FILE, fileEdit);
|
||||
DDX_Control(pDX, IDC_DECLNEW_BUTTON_NEW_FILE, fileButton);
|
||||
DDX_Control(pDX, IDOK, okButton);
|
||||
DDX_Control(pDX, IDCANCEL, cancelButton);
|
||||
//}}AFX_DATA_MAP
|
||||
}*/
|
||||
|
||||
/*
|
||||
================
|
||||
DeclNew::InitTypeList
|
||||
|
@ -87,6 +68,7 @@ void DeclNew::InitTypeList( void ) {
|
|||
for ( i = 0; i < declManager->GetNumDeclTypes(); i++ ) {
|
||||
typeList.Append( declManager->GetDeclNameFromType( (declType_t)i ) );
|
||||
}
|
||||
typeListSel = -1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -95,26 +77,98 @@ DeclNew::Reset
|
|||
================
|
||||
*/
|
||||
void DeclNew::Reset() {
|
||||
|
||||
InitTypeList();
|
||||
|
||||
//SetSafeComboBoxSelection( &typeList, defaultType.c_str(), -1 );
|
||||
typeListSel = typeList.FindIndex( defaultType );
|
||||
nameEdit = defaultName;
|
||||
fileEdit = defaultFile;
|
||||
newDecl = NULL;
|
||||
state = DONE;
|
||||
}
|
||||
|
||||
/*
|
||||
BEGIN_MESSAGE_MAP(DialogDeclNew, CDialog)
|
||||
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
|
||||
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
|
||||
ON_WM_DESTROY()
|
||||
ON_WM_ACTIVATE()
|
||||
ON_WM_SETFOCUS()
|
||||
ON_BN_CLICKED(IDC_DECLNEW_BUTTON_NEW_FILE, OnBnClickedFile)
|
||||
ON_BN_CLICKED(IDOK, OnBnClickedOk)
|
||||
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
|
||||
END_MESSAGE_MAP()
|
||||
*/
|
||||
void DeclNew::Start() {
|
||||
Reset();
|
||||
|
||||
state = NAME;
|
||||
|
||||
ImGui::OpenPopup("New Declaration");
|
||||
}
|
||||
|
||||
bool DeclNew::Draw() {
|
||||
if ( state == DONE ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool accepted = false;
|
||||
bool canceled = false;
|
||||
|
||||
if ( ImGui::BeginPopupModal( "New Declaration", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) {
|
||||
ImGui::TextColored( ImVec4( 1, 0, 0, 1 ), errorText );
|
||||
|
||||
const char *previewValue = typeListSel == -1 ? NULL : typeList[typeListSel].c_str();
|
||||
|
||||
if ( ImGui::BeginCombo( "Type##typeListSelect", previewValue ) ) {
|
||||
ImGui::SetItemTooltip( "select the declaration type to create" );
|
||||
|
||||
for ( int i = 0; i < typeList.Num(); i++ ) {
|
||||
bool selected = ( i == typeListSel );
|
||||
|
||||
ImGui::PushID( i );
|
||||
if ( ImGui::Selectable( typeList[i].c_str(), selected ) ) {
|
||||
typeListSel = i;
|
||||
}
|
||||
if ( selected ) {
|
||||
ImGui::SetItemDefaultFocus();
|
||||
}
|
||||
ImGui::PopID();
|
||||
}
|
||||
|
||||
ImGui::EndCombo();
|
||||
}
|
||||
|
||||
if ( ImGui::InputTextStr( "Name", &nameEdit ) ) {
|
||||
|
||||
}
|
||||
ImGui::SetItemTooltip( "enter a name for the new declaration" );
|
||||
if ( ImGui::InputTextStr( "File", &fileEdit ) ) {
|
||||
|
||||
}
|
||||
ImGui::SetItemTooltip( "enter the name of the file to add the declaration to" );
|
||||
ImGui::SameLine();
|
||||
if ( ImGui::Button( "..." ) ) {
|
||||
//selectDlg.Start();
|
||||
OnBnClickedFile();
|
||||
}
|
||||
ImGui::SetItemTooltip( "select existing file to add the declaration to" );
|
||||
|
||||
if ( selectDlg.Draw() ) {
|
||||
// accepted
|
||||
//fileEdit = fileSystem->OSPathToRelativePath( dlgFile.m_ofn.lpstrFile );
|
||||
fileEdit = selectDlg.GetDecl()->GetFileName();
|
||||
}
|
||||
|
||||
if ( ImGui::Button( "OK" ) ) {
|
||||
OnBnClickedOk();
|
||||
if ( newDecl ) {
|
||||
accepted = true;
|
||||
state = DONE;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
}
|
||||
ImGui::SetItemTooltip( "create new declaration" );
|
||||
ImGui::SameLine();
|
||||
if ( ImGui::Button( "Cancel" ) ) {
|
||||
accepted = false;
|
||||
state = DONE;
|
||||
ImGui::CloseCurrentPopup();
|
||||
}
|
||||
ImGui::SetItemTooltip( "cancel" );
|
||||
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
|
||||
return accepted;
|
||||
}
|
||||
|
||||
// DeclNew message handlers
|
||||
|
||||
|
@ -126,16 +180,17 @@ DeclNew::OnBnClickedFile
|
|||
void DeclNew::OnBnClickedFile() {
|
||||
idStr typeName, folder, ext;
|
||||
idStr path;
|
||||
const char *errorTitle = "Error selecting file.";
|
||||
|
||||
if ( 1/*GetSafeComboBoxSelection(&typeList, typeName, -1) == -1*/) {
|
||||
//MessageBox( "Select a declaration type first.", errorTitle, MB_OK );
|
||||
errorText.Clear();
|
||||
|
||||
if ( typeListSel == -1 ) {
|
||||
errorText = "Select a declaration type first.";
|
||||
return;
|
||||
}
|
||||
|
||||
declType_t type = declManager->GetDeclTypeFromName( typeName );
|
||||
if ( type >= declManager->GetNumDeclTypes() ) {
|
||||
//MessageBox( "Unknown declaration type.", errorTitle, MB_OK | MB_ICONERROR );
|
||||
errorText = "Unknown declaration type.";
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -156,12 +211,7 @@ void DeclNew::OnBnClickedFile() {
|
|||
path = fileSystem->RelativePathToOSPath( folder );
|
||||
path += "\\*";
|
||||
|
||||
/*
|
||||
CFileDialog dlgFile( TRUE, "decl", path, 0, ext, this );
|
||||
if ( dlgFile.DoModal() == IDOK ) {
|
||||
path = fileSystem->OSPathToRelativePath( dlgFile.m_ofn.lpstrFile );
|
||||
fileEdit = path;
|
||||
}*/
|
||||
selectDlg.Start();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -171,38 +221,40 @@ DeclNew::OnBnClickedOk
|
|||
*/
|
||||
void DeclNew::OnBnClickedOk() {
|
||||
idStr typeName, declName, fileName;
|
||||
const char *errorTitle = "Error creating declaration.";
|
||||
|
||||
errorText.Clear();
|
||||
|
||||
if ( !declTree ) {
|
||||
//MessageBox( "No declaration tree available.", errorTitle, MB_OK | MB_ICONERROR );
|
||||
errorText = "No declaration tree available.";
|
||||
return;
|
||||
}
|
||||
|
||||
if ( 1/*GetSafeComboBoxSelection(&typeList, typeName, -1) == -1*/) {
|
||||
//MessageBox( "No declaration type selected.", errorTitle, MB_OK | MB_ICONERROR );
|
||||
if ( typeListSel == -1 ) {
|
||||
errorText = "No declaration type selected.";
|
||||
return;
|
||||
}
|
||||
typeName = typeList[typeListSel];
|
||||
|
||||
declName = nameEdit;
|
||||
if ( declName.Length() == 0 ) {
|
||||
//MessageBox( "No declaration name specified.", errorTitle, MB_OK | MB_ICONERROR );
|
||||
errorText = "No declaration name specified.";
|
||||
return;
|
||||
}
|
||||
|
||||
fileName = fileEdit;
|
||||
if ( fileName.Length() == 0 ) {
|
||||
//MessageBox( "No file name specified.", errorTitle, MB_OK | MB_ICONERROR );
|
||||
errorText = "No file name specified.";
|
||||
return;
|
||||
}
|
||||
|
||||
if ( declTree->FindItem( idStr( typeName + "/" + declName ) ) ) {
|
||||
//MessageBox( "Declaration already exists.", errorTitle, MB_OK | MB_ICONERROR );
|
||||
errorText = "Declaration already exists.";
|
||||
return;
|
||||
}
|
||||
|
||||
declType_t type = declManager->GetDeclTypeFromName( typeName );
|
||||
if ( type >= declManager->GetNumDeclTypes() ) {
|
||||
//MessageBox( "Unknown declaration type.", errorTitle, MB_OK | MB_ICONERROR );
|
||||
errorText = "Unknown declaration type.";
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ If you have questions concerning this license or the applicable additional terms
|
|||
|
||||
namespace ImGuiTools {
|
||||
|
||||
// DialogDeclNew dialog
|
||||
// DeclNew dialog
|
||||
|
||||
class DeclNew {
|
||||
|
||||
|
@ -45,6 +45,8 @@ public:
|
|||
idDecl * GetNewDecl( void ) const { return newDecl; }
|
||||
|
||||
void Reset();
|
||||
void Start();
|
||||
bool Draw();
|
||||
|
||||
private:
|
||||
void OnBnClickedFile();
|
||||
|
@ -52,21 +54,23 @@ private:
|
|||
void OnBnClickedCancel();
|
||||
|
||||
private:
|
||||
enum state_t { DONE = 0, NAME };
|
||||
|
||||
idStrList typeList;
|
||||
int typeListSel;
|
||||
idStr nameEdit;
|
||||
idStr fileEdit;
|
||||
bool fileButtonEnabled;
|
||||
bool okButtonEnabled;
|
||||
bool cancelButtonEnabled;
|
||||
|
||||
//static toolTip_t toolTips[];
|
||||
idStr errorText;
|
||||
|
||||
PathTreeCtrl * declTree;
|
||||
idStr defaultType;
|
||||
idStr defaultName;
|
||||
idStr defaultFile;
|
||||
idDecl * newDecl;
|
||||
state_t state;
|
||||
|
||||
DeclNewSelect selectDlg;
|
||||
|
||||
private:
|
||||
void InitTypeList( void );
|
||||
|
|
|
@ -71,6 +71,10 @@ void PathTreeCtrl::SelectItem( PathTreeNode *item ) {
|
|||
}
|
||||
|
||||
PathTreeNode *PathTreeCtrl::InsertItem( const idStr &name, PathTreeNode *parent, PathTreeNode *after ) {
|
||||
if ( !parent && name.IsEmpty() ) {
|
||||
// do not insert the root node again
|
||||
return root;
|
||||
}
|
||||
PathTreeNode *newNode = nodeAllocator.Alloc();
|
||||
int id = numNodes++;
|
||||
newNode->Init( id );
|
||||
|
@ -96,12 +100,12 @@ int PathTreeCtrl::GetItemData( PathTreeNode *item ) const {
|
|||
return item->GetItem();
|
||||
}
|
||||
|
||||
void PathTreeCtrl::Draw() {
|
||||
void PathTreeCtrl::Draw( treeItemTooltip_t tooltip, treeItemSelected_t selected, void *data ) {
|
||||
PathTreeNode *parentNode = GetRootItem();
|
||||
PathTreeNode *node;
|
||||
|
||||
for ( node = GetChildItem( parentNode ) ; node ; node = GetNextSiblingItem( node ) ) {
|
||||
DrawNode( node );
|
||||
DrawNode( node, tooltip, selected, data );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -275,9 +279,10 @@ int PathTreeCtrl::SearchTree( treeItemCompare_t compare, void *data, PathTreeCtr
|
|||
return numItems;
|
||||
}
|
||||
|
||||
void PathTreeCtrl::DrawNode( PathTreeNode *node ) {
|
||||
void PathTreeCtrl::DrawNode( PathTreeNode *node, treeItemTooltip_t tooltip, treeItemSelected_t selected, void *data ) {
|
||||
PathTreeNode *item;
|
||||
ImGuiTreeNodeFlags flags = 0;
|
||||
idStr tooltipText;
|
||||
|
||||
if ( node == selectedItem ) {
|
||||
flags |= ImGuiTreeNodeFlags_Selected;
|
||||
|
@ -290,10 +295,19 @@ void PathTreeCtrl::DrawNode( PathTreeNode *node ) {
|
|||
if ( ImGui::TreeNodeEx( ( const void * )node->GetID(), flags, "%s", node->GetLabel().c_str() ) ) {
|
||||
if ( ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen() ) {
|
||||
SelectItem( node );
|
||||
selected( data );
|
||||
}
|
||||
if ( ImGui::IsItemHovered() ) {
|
||||
tooltipText.Clear();
|
||||
if ( tooltip( data, node, tooltipText ) ) {
|
||||
ImGui::BeginTooltip();
|
||||
ImGui::TextUnformatted( tooltipText.c_str() );
|
||||
ImGui::EndTooltip();
|
||||
}
|
||||
}
|
||||
|
||||
for ( item = GetChildItem( node ); item; item = GetNextSiblingItem( item ) ) {
|
||||
DrawNode( item );
|
||||
DrawNode( item, tooltip, selected, data );
|
||||
}
|
||||
|
||||
if ( GetChildItem( node ) ) {
|
||||
|
|
|
@ -46,8 +46,15 @@ namespace ImGuiTools {
|
|||
class PathTreeNode {
|
||||
public:
|
||||
PathTreeNode()
|
||||
: label()
|
||||
, item(0)
|
||||
, node()
|
||||
, id(-1)
|
||||
{
|
||||
Init(0);
|
||||
|
||||
}
|
||||
~PathTreeNode() {
|
||||
Shutdown();
|
||||
}
|
||||
|
||||
void Init(int _id)
|
||||
|
@ -61,30 +68,26 @@ public:
|
|||
void Shutdown()
|
||||
{
|
||||
node.RemoveFromHierarchy();
|
||||
label.FreeData();
|
||||
label.Clear();
|
||||
id = 0;
|
||||
}
|
||||
|
||||
~PathTreeNode() {
|
||||
|
||||
}
|
||||
|
||||
ID_INLINE int GetItem() {
|
||||
ID_INLINE int GetItem() {
|
||||
return item;
|
||||
}
|
||||
ID_INLINE void SetItem( int _item ) {
|
||||
ID_INLINE void SetItem( int _item ) {
|
||||
item = _item;
|
||||
}
|
||||
ID_INLINE void SetLabel( const char *_label ) {
|
||||
ID_INLINE void SetLabel( const char *_label ) {
|
||||
label = _label;
|
||||
}
|
||||
ID_INLINE idStr & GetLabel() {
|
||||
ID_INLINE idStr & GetLabel() {
|
||||
return label;
|
||||
}
|
||||
ID_INLINE idHierarchy<PathTreeNode>& GetNode() {
|
||||
return node;
|
||||
}
|
||||
ID_INLINE int GetID() {
|
||||
ID_INLINE int GetID() {
|
||||
return id;
|
||||
}
|
||||
|
||||
|
@ -128,14 +131,20 @@ ID_INLINE void idPathTreeStack::Push( PathTreeNode *item, const char *name ) {
|
|||
}
|
||||
|
||||
typedef bool (*treeItemCompare_t)( void *data, PathTreeNode *item, const char *name );
|
||||
typedef bool (*treeItemTooltip_t)( void *data, PathTreeNode *item, idStr &tooltipText );
|
||||
typedef void (*treeItemSelected_t)( void *data );
|
||||
|
||||
class PathTreeCtrl {
|
||||
public:
|
||||
PathTreeCtrl()
|
||||
: nodeAllocator()
|
||||
, root()
|
||||
, selectedItem(NULL) {
|
||||
, selectedItem(NULL)
|
||||
, numNodes(0)
|
||||
{
|
||||
root = nodeAllocator.Alloc();
|
||||
root->Init(0);
|
||||
numNodes++;
|
||||
}
|
||||
~PathTreeCtrl() {
|
||||
DeleteAllItems();
|
||||
|
@ -153,7 +162,7 @@ public:
|
|||
PathTreeNode * GetSelectedItem() const;
|
||||
void SelectItem( PathTreeNode *item );
|
||||
|
||||
void Draw();
|
||||
void Draw( treeItemTooltip_t tooltip, treeItemSelected_t selected, void *data );
|
||||
|
||||
PathTreeNode * FindItem( const idStr &pathName );
|
||||
PathTreeNode * InsertPathIntoTree( const idStr &pathName, const int id );
|
||||
|
@ -161,7 +170,7 @@ public:
|
|||
int SearchTree( treeItemCompare_t compare, void *data, PathTreeCtrl &result );
|
||||
|
||||
private:
|
||||
void DrawNode( PathTreeNode *item );
|
||||
void DrawNode( PathTreeNode *item, treeItemTooltip_t tooltip, treeItemSelected_t selected, void *data );
|
||||
void DeleteAllItemsOfNode( PathTreeNode *item );
|
||||
|
||||
idBlockAlloc<PathTreeNode,256> nodeAllocator;
|
||||
|
|
Loading…
Reference in a new issue