void CEditorRoot::OnAskPageClose( KeyValues *pKV ) { Panel *pPageTab = (Panel*)pKV->GetPtr( "PageTab" ); CNodeView *pGraph = GetFlowGraph( pKV->GetInt( "TabIndex" ) ); if ( pPageTab == NULL || pGraph == NULL ) { Assert( 0 ); return; } ConfirmTabClose( pPageTab->GetVPanel() ); #if 0 if ( !m_bWarnOnClose || !pGraph->IsSaveDirty() ) ConfirmTabClose( pPageTab->GetVPanel() ); else { const char *pszShadername = pGraph->GetShadername(); char shortName[MAX_PATH*4]; KeyValues *pKVResponse_Yes = new KeyValues( "ResponseGraphSave", "DoSave", 1 ); KeyValues *pKVResponse_No = new KeyValues( "ResponseGraphSave", "DoSave", 0 ); if ( pszShadername == NULL ) { pKVResponse_No->deleteThis(); pKVResponse_No = new KeyValues( "ResponseGraphSave", "DoSave", 2 ); } else { Q_FileBase( pszShadername, shortName, sizeof( shortName ) ); } pKVResponse_Yes->SetPtr( "PageTab", pPageTab ); pKVResponse_No->SetPtr( "PageTab", pPageTab ); pKVResponse_Yes->SetPtr( "Graph", pGraph ); pKVResponse_No->SetPtr( "Graph", pGraph ); vgui::PromptSimple *prompt = new vgui::PromptSimple( this, "Unsaved changes" ); prompt->MoveToCenterOfScreen(); if ( pszShadername != NULL ) prompt->SetText( VarArgs( "The graph %s has unsaved changes. Save now?", shortName ) ); else prompt->SetText( "This graph has not been saved yet, are you sure that you want to close it?" ); prompt->AddButton( "Yes", pKVResponse_Yes ); prompt->AddButton( "No", pKVResponse_No ); prompt->MakeReadyForUse(); prompt->InvalidateLayout( true, true ); } #endif }
//----------------------------------------------------------------------------- // Purpose: catches the opencontextmenu event //----------------------------------------------------------------------------- void PropertySheet::OnOpenContextMenu( KeyValues *params ) { // tell parent KeyValues *kv = params->MakeCopy(); PostActionSignal( kv ); Panel *page = reinterpret_cast< Panel * >( params->GetPtr( "page" ) ); if ( page ) { PostMessage( page->GetVPanel(), params->MakeCopy() ); } }
void CEditorRoot::OnResponseGraphSave( KeyValues *pKV ) { int iResponse = pKV->GetInt( "DoSave" ); const bool bSave = iResponse == 1; const bool bAbort = iResponse == 2; if ( bAbort ) return; Panel *pPageTab = (Panel*)pKV->GetPtr( "PageTab" ); CNodeView *pGraph = (CNodeView*)pKV->GetPtr( "Graph" ); if ( bSave && pGraph != NULL ) pGraph->SaveToFile(); ConfirmTabClose( pPageTab->GetVPanel() ); }
//----------------------------------------------------------------------------- // Purpose: Get the panel that currently has keyfocus //----------------------------------------------------------------------------- VPANEL EditablePanel::GetCurrentKeyFocus() { Panel *focus = m_NavGroup.GetCurrentFocus(); if (focus == this) return NULL; if (focus) { if (focus->IsPopup()) return BaseClass::GetCurrentKeyFocus(); // chain down the editpanel hierarchy VPANEL subFocus = focus->GetCurrentKeyFocus(); if (subFocus) return subFocus; // hit a leaf panel, return that return focus->GetVPanel(); } return BaseClass::GetCurrentKeyFocus(); }
//----------------------------------------------------------------------------- // Purpose: Sets the focus to the previous panel in the tab order // Input : *panel - panel currently with focus //----------------------------------------------------------------------------- bool FocusNavGroup::RequestFocusPrev(VPANEL panel) { if(panel==NULL) return false; _currentFocus = NULL; int newPosition = 9999999; if (panel) { newPosition = ipanel()->GetTabPosition(panel); } bool bFound = false; bool bRepeat = true; Panel *best = NULL; while (1) { newPosition--; if (newPosition > 0) { int bestPosition = 0; // look for the next tab position for (int i = 0; i < _mainPanel->GetChildCount(); i++) { Panel *child = _mainPanel->GetChild(i); if (child && child->IsVisible() && child->IsEnabled() && child->GetTabPosition()) { int tabPosition = child->GetTabPosition(); if (tabPosition == newPosition) { // we've found the right tab best = child; bestPosition = newPosition; // don't loop anymore since we've found the correct panel break; } else if (tabPosition < newPosition && tabPosition > bestPosition) { // record the match since this is the closest so far bestPosition = tabPosition; best = child; } } } if (!bRepeat) break; if (best) break; } else { // reset new position for next loop newPosition = 9999999; } // haven't found an item if (!_topLevelFocus) { // check to see if we should push the focus request up if (_mainPanel->GetVParent() && _mainPanel->GetVParent() != surface()->GetEmbeddedPanel()) { // we're not a top level panel, so forward up the request instead of looping if (ipanel()->RequestFocusPrev(_mainPanel->GetVParent(), _mainPanel->GetVPanel())) { bFound = true; SetCurrentDefaultButton(NULL); break; } } } // not found an item, loop back newPosition = 9999999; bRepeat = false; } if (best) { _currentFocus = best->GetVPanel(); best->RequestFocus(-1); bFound = true; if (!CanButtonBeDefault(best->GetVPanel())) { if (_defaultButton) { SetCurrentDefaultButton(_defaultButton); } else { SetCurrentDefaultButton(NULL); // we need to ask the parent to set its default button if (_mainPanel->GetVParent()) { ivgui()->PostMessage(_mainPanel->GetVParent(), new KeyValues("FindDefaultButton"), NULL); } } } else { SetCurrentDefaultButton(best->GetVPanel()); } } return bFound; }
//----------------------------------------------------------------------------- // Purpose: Sets the focus to the previous panel in the tab order // Input : *panel - panel currently with focus //----------------------------------------------------------------------------- bool FocusNavGroup::RequestFocusNext(VPANEL panel) { // basic recursion guard, in case user has set up a bad focus hierarchy static int stack_depth = 0; stack_depth++; _currentFocus = NULL; int newPosition = 0; if (panel) { newPosition = ipanel()->GetTabPosition(panel); } bool bFound = false; bool bRepeat = true; Panel *best = NULL; while (1) { newPosition++; int bestPosition = 999999; // look for the next tab position for (int i = 0; i < _mainPanel->GetChildCount(); i++) { Panel *child = _mainPanel->GetChild(i); if ( !child ) continue; if (child && child->IsVisible() && child->IsEnabled() && child->GetTabPosition()) { int tabPosition = child->GetTabPosition(); if (tabPosition == newPosition) { // we've found the right tab best = child; bestPosition = newPosition; // don't loop anymore since we've found the correct panel break; } else if (tabPosition > newPosition && tabPosition < bestPosition) { // record the match since this is the closest so far bestPosition = tabPosition; best = child; } } } if (!bRepeat) break; if (best) break; // haven't found an item // check to see if we should push the focus request up if (!_topLevelFocus) { if (_mainPanel->GetVParent() && _mainPanel->GetVParent() != surface()->GetEmbeddedPanel()) { // we're not a top level panel, so forward up the request instead of looping if (stack_depth < 15) { if (ipanel()->RequestFocusNext(_mainPanel->GetVParent(), _mainPanel->GetVPanel())) { bFound = true; SetCurrentDefaultButton(NULL); break; } // if we find one then we break, otherwise we loop } } } // loop back newPosition = 0; bRepeat = false; } if (best) { _currentFocus = best->GetVPanel(); best->RequestFocus(1); bFound = true; if (!CanButtonBeDefault(best->GetVPanel())) { if (_defaultButton) { SetCurrentDefaultButton(_defaultButton); } else { SetCurrentDefaultButton(NULL); // we need to ask the parent to set its default button if (_mainPanel->GetVParent()) { ivgui()->PostMessage(_mainPanel->GetVParent(), new KeyValues("FindDefaultButton"), NULL); } } } else { SetCurrentDefaultButton(best->GetVPanel()); } } stack_depth--; return bFound; }