//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool BuildGroup::MouseReleased(MouseCode code, Panel *panel) { if ( !m_hBuildDialog.Get() ) { if ( panel->GetParent() ) { EditablePanel *ep = dynamic_cast< EditablePanel * >( panel->GetParent() ); if ( ep ) { BuildGroup *bg = ep->GetBuildGroup(); if ( bg && bg != this ) { bg->MouseReleased( code, panel ); } } } return false; } Assert(panel); _dragging=false; input()->SetMouseCapture(null); return true; }
bool BuildGroup::KeyCodeReleased(KeyCode code, Panel *panel ) { if ( !m_hBuildDialog.Get() ) { if ( panel->GetParent() ) { EditablePanel *ep = dynamic_cast< EditablePanel * >( panel->GetParent() ); if ( ep ) { BuildGroup *bg = ep->GetBuildGroup(); if ( bg && bg != this ) { bg->KeyCodeTyped( code, panel ); } } } return false; } // If holding key while dragging, simulate moving cursor so shift/ctrl key changes take effect if ( _dragging && panel != GetContextPanel() ) { int x, y; input()->GetCursorPos( x, y ); CursorMoved( x, y, panel ); } return true; }
//----------------------------------------------------------------------------- // Purpose: Overrides build mode so it edits the sub panel //----------------------------------------------------------------------------- void ToolWindow::ActivateBuildMode() { // no subpanel, no build mode EditablePanel *panel = dynamic_cast<EditablePanel *>(GetActivePage()); if (!panel) return; panel->ActivateBuildMode(); }
//----------------------------------------------------------------------------- // Purpose: Passes build mode activation down into the pages //----------------------------------------------------------------------------- void CServerBrowserDialog::ActivateBuildMode() { // no subpanel, no build mode EditablePanel *panel = dynamic_cast<EditablePanel *>(m_pTabPanel->GetActivePage()); if (!panel) return; panel->ActivateBuildMode(); }
//----------------------------------------------------------------------------- // Purpose: Overrides build mode so it edits the sub panel //----------------------------------------------------------------------------- void PropertyDialog::ActivateBuildMode() { // no subpanel, no build mode EditablePanel *panel = dynamic_cast<EditablePanel *>(GetActivePage()); if (!panel) return; panel->ActivateBuildMode(); }
//----------------------------------------------------------------------------- // Purpose: dialog variables //----------------------------------------------------------------------------- KeyValues *BuildGroup::GetDialogVariables() { EditablePanel *edit = dynamic_cast<EditablePanel *>(m_pParentPanel); if (edit) { return edit->GetDialogVariables(); } return NULL; }
//----------------------------------------------------------------------------- // Purpose: allow the build mode editor to edit the current sub panel //----------------------------------------------------------------------------- void CGamePanelInfo::ActivateBuildMode() { // BaseClass::ActivateBuildMode(); // return; // no subpanel, no build mode EditablePanel *pg = dynamic_cast<EditablePanel *>(m_pDetailsSheet->GetActivePage()); if (pg) { pg->ActivateBuildMode(); } }
//----------------------------------------------------------------------------- // Purpose: reloads the control settings from file //----------------------------------------------------------------------------- void BuildGroup::ReloadControlSettings() { bool bWasVisible = false; if (m_hBuildDialog.Get()) { bWasVisible = m_hBuildDialog->IsVisible(); m_hBuildDialog->DeletePanel(); m_hBuildDialog = nullptr; } // loop though objects in the current control group and remove them all // the 0th panel is always the contextPanel which is not deletable for( int i = 1; i < _panelDar.Count(); i++ ) { if (!_panelDar[i].Get()) // this can happen if we had two of the same handle in the list { _panelDar.Remove(i); --i; continue; } // only delete deletable panels, as the only deletable panels // are the ones created using the resource file if ( _panelDar[i].Get()->IsBuildModeDeletable()) { delete _panelDar[i].Get(); _panelDar.Remove(i); --i; } } if (m_pResourceName[0]) { EditablePanel *edit = dynamic_cast<EditablePanel *>(m_pParentPanel); if (edit) { edit->LoadControlSettings(m_pResourceName, m_pResourcePathID); } else { LoadControlSettings(m_pResourceName, m_pResourcePathID); } } _controlGroup.RemoveAll(); m_hBuildDialog = CreateBuildDialog(); if (bWasVisible) ActivateBuildDialog(); }
//----------------------------------------------------------------------------- // Purpose: Handle key presses, through tabs. //----------------------------------------------------------------------------- void PropertySheet::OnKeyCodeTyped(KeyCode code) { bool shift = (input()->IsKeyDown(KEY_LSHIFT) || input()->IsKeyDown(KEY_RSHIFT)); bool ctrl = (input()->IsKeyDown(KEY_LCONTROL) || input()->IsKeyDown(KEY_RCONTROL)); bool alt = (input()->IsKeyDown(KEY_LALT) || input()->IsKeyDown(KEY_RALT)); if ( ctrl && shift && alt && code == KEY_B) { // enable build mode EditablePanel *ep = dynamic_cast< EditablePanel * >( GetActivePage() ); if ( ep ) { ep->ActivateBuildMode(); return; } } if ( IsKBNavigationEnabled() ) { switch (code) { // for now left and right arrows just open or close submenus if they are there. case KEY_RIGHT: { ChangeActiveTab(_activeTabIndex+1); break; } case KEY_LEFT: { ChangeActiveTab(_activeTabIndex-1); break; } default: BaseClass::OnKeyCodeTyped(code); break; } } else { BaseClass::OnKeyCodeTyped(code); } }
//============================================================================= void ControllerOptionsButtons::RecalculateBindingLabels( void ) { // Populate the bindings labels with the currently bound keys EditablePanel *pContainer = dynamic_cast<EditablePanel *>( FindChildByName( "LabelContainer" ) ); if ( !pContainer ) return; // for every button on the controller for ( int i=0;i<sizeof(sControllerBindings) / sizeof( ControllerBindingMap );i++ ) { // what is it bound to? vgui::KeyCode code = sControllerBindings[i].m_keyCode; //int nJoystick = m_iActiveUserSlot; code = ButtonCodeToJoystickButtonCode( code, m_iActiveUserSlot ); const char *pBinding = engine->Key_BindingForKey( code ); if ( !pBinding ) { // key is not bound to anything pContainer->SetControlString( sControllerBindings[i].m_pszLabelName, L"<Not Bound>" ); continue; } // find the localized string for this binding and set the label text for( int j=0;j<sizeof( sBindingToDisplay ) / sizeof( BindingDisplayMap );j++ ) { const BindingDisplayMap *entry = &( sBindingToDisplay[ j ] ); if ( Q_strstr( pBinding, entry->pszBinding ) ) { Label *pLabel = dynamic_cast< Label * >( pContainer->FindChildByName( sControllerBindings[i].m_pszLabelName ) ); if ( pLabel ) { pLabel->SetText( entry->pszDisplay ); } } } } }
bool BuildGroup::KeyTyped( wchar_t unichar, Panel *panel ) { if ( !m_hBuildDialog.Get() ) { if ( panel->GetParent() ) { EditablePanel *ep = dynamic_cast< EditablePanel * >( panel->GetParent() ); if ( ep ) { BuildGroup *bg = ep->GetBuildGroup(); if ( bg && bg != this ) { bg->KeyTyped( unichar, panel ); } } } return false; } return true; }
//----------------------------------------------------------------------------- // Purpose: changes which control settings are currently loaded //----------------------------------------------------------------------------- void BuildGroup::ChangeControlSettingsFile(const char *controlResourceName) { // clear any current state _controlGroup.RemoveAll(); _currentPanel = m_pParentPanel; // load the new state, via the dialog if possible EditablePanel *edit = dynamic_cast<EditablePanel *>(m_pParentPanel); if (edit) { edit->LoadControlSettings(controlResourceName, m_pResourcePathID); } else { LoadControlSettings(controlResourceName, m_pResourcePathID); } // force it to update KeyValues *keyval = new KeyValues("SetActiveControl"); keyval->SetPtr("PanelPtr", GetCurrentPanel()); ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), keyval, NULL); }
virtual void OnShowMenu(Menu *menu) { menu->DeleteAllItems(); if ( !m_hContext.Get() ) return; if ( m_bParents ) { Panel *p = m_hContext->GetParent(); while ( p ) { EditablePanel *ep = dynamic_cast < EditablePanel * >( p ); if ( ep && ep->GetBuildGroup() ) { KeyValues *kv = new KeyValues( "Panel" ); kv->SetPtr( "ptr", p ); char const *text = ep->GetName() ? ep->GetName() : "unnamed"; menu->AddMenuItem( text, new KeyValues("SetText", "text", text), GetParent(), kv ); } p = p->GetParent(); } } else { int i; int c = m_hContext->GetChildCount(); for ( i = 0; i < c; ++i ) { EditablePanel *ep = dynamic_cast < EditablePanel * >( m_hContext->GetChild( i ) ); if ( ep && ep->IsVisible() && ep->GetBuildGroup() ) { KeyValues *kv = new KeyValues( "Panel" ); kv->SetPtr( "ptr", ep ); char const *text = ep->GetName() ? ep->GetName() : "unnamed"; menu->AddMenuItem( text, new KeyValues("SetText", "text", text), GetParent(), kv ); } } } }
//----------------------------------------------------------------------------- // Purpose: Checks to see if any text has changed //----------------------------------------------------------------------------- void BuildModeDialog::OnTextChanged( Panel *panel ) { if (panel == m_pFileSelectionCombo) { // reload file if it's changed char newFile[512]; m_pFileSelectionCombo->GetText(newFile, sizeof(newFile)); if (stricmp(newFile, m_pBuildGroup->GetResourceName()) != 0) { // file has changed, reload SetActiveControl(NULL); m_pBuildGroup->ChangeControlSettingsFile(newFile); } return; } if (panel == m_pAddNewControlCombo) { char buf[40]; m_pAddNewControlCombo->GetText(buf, 40); if (stricmp(buf, "None") != 0) { OnNewControl(buf); // reset box back to None m_pAddNewControlCombo->ActivateItemByRow( 0 ); } } if ( panel == m_pEditableChildren ) { KeyValues *kv = m_pEditableChildren->GetActiveItemUserData(); if ( kv ) { EditablePanel *ep = reinterpret_cast< EditablePanel * >( kv->GetPtr( "ptr" ) ); if ( ep ) { ep->ActivateBuildMode(); } } } if ( panel == m_pEditableParents ) { KeyValues *kv = m_pEditableParents->GetActiveItemUserData(); if ( kv ) { EditablePanel *ep = reinterpret_cast< EditablePanel * >( kv->GetPtr( "ptr" ) ); if ( ep ) { ep->ActivateBuildMode(); } } } if (m_pCurrentPanel && m_pCurrentPanel->IsBuildModeEditable()) { m_pApplyButton->SetEnabled(true); } if (_autoUpdate) { ApplyDataToControls(); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool BuildGroup::KeyCodeTyped(KeyCode code, Panel *panel) { if ( !m_hBuildDialog.Get() ) { if ( panel->GetParent() ) { EditablePanel *ep = dynamic_cast< EditablePanel * >( panel->GetParent() ); if ( ep ) { BuildGroup *bg = ep->GetBuildGroup(); if ( bg && bg != this ) { bg->KeyCodeTyped( code, panel ); } } } return false; } Assert(panel); int dx=0; int dy=0; bool shift = ( input()->IsKeyDown(KEY_LSHIFT) || input()->IsKeyDown(KEY_RSHIFT) ); bool ctrl = ( input()->IsKeyDown(KEY_LCONTROL) || input()->IsKeyDown(KEY_RCONTROL) ); bool alt = (input()->IsKeyDown(KEY_LALT) || input()->IsKeyDown(KEY_RALT)); if ( ctrl && shift && alt && code == KEY_B) { // enable build mode EditablePanel *ep = dynamic_cast< EditablePanel * >( panel ); if ( ep ) { ep->ActivateBuildMode(); } return true; } switch (code) { case KEY_LEFT: { dx-=_snapX; break; } case KEY_RIGHT: { dx+=_snapX; break; } case KEY_UP: { dy-=_snapY; break; } case KEY_DOWN: { dy+=_snapY; break; } case KEY_DELETE: { // delete the panel we have selected ivgui()->PostMessage (m_hBuildDialog->GetVPanel(), new KeyValues ("DeletePanel"), NULL); break; } } if (ctrl) { switch (code) { case KEY_Z: { ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("Undo"), NULL); break; } case KEY_C: { ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("Copy"), NULL); break; } case KEY_V: { ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("Paste"), NULL); break; } } } if(dx||dy) { //TODO: make this stuff actually snap int x,y,wide,tall; panel->GetBounds(x,y,wide,tall); if(shift) { panel->SetSize(wide+dx,tall+dy); } else { panel->SetPos(x+dx,y+dy); } ApplySnap(panel); panel->Repaint(); if (panel->GetVParent() != NULL) { panel->PostMessage(panel->GetVParent(), new KeyValues("Repaint")); } // update the build dialog if (m_hBuildDialog) { // post that it's active KeyValues *keyval = new KeyValues("SetActiveControl"); keyval->SetPtr("PanelPtr", GetCurrentPanel()); ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), keyval, NULL); // post that it's been changed ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("PanelMoved"), NULL); } } // If holding key while dragging, simulate moving cursor so shift/ctrl key changes take effect if ( _dragging && panel != GetContextPanel() ) { int x, y; input()->GetCursorPos( x, y ); CursorMoved( x, y, panel ); } return true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool BuildGroup::MousePressed(MouseCode code, Panel *panel) { Assert(panel); if ( !m_hBuildDialog.Get() ) { if ( panel->GetParent() ) { EditablePanel *ep = dynamic_cast< EditablePanel * >( panel->GetParent() ); if ( ep ) { BuildGroup *bg = ep->GetBuildGroup(); if ( bg && bg != this ) { bg->MousePressed( code, panel ); } } } return false; } // if people click on the base build dialog panel. if (panel == m_hBuildDialog) { // hide the click menu if its up ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("HideNewControlMenu"), NULL); return true; } // don't select unnamed items if (strlen(panel->GetName()) < 1) return true; bool shift = ( input()->IsKeyDown(KEY_LSHIFT) || input()->IsKeyDown(KEY_RSHIFT) ); if (!shift) { _controlGroup.RemoveAll(); } // Show new ctrl menu if they click on the bg (not on a subcontrol) if ( code == MOUSE_RIGHT && panel == GetContextPanel()) { // trigger a drop down menu to create new controls ivgui()->PostMessage (m_hBuildDialog->GetVPanel(), new KeyValues("ShowNewControlMenu"), NULL); } else { // don't respond if we click on ruler numbers if (_showRulers) // rulers are visible { for ( int i=0; i < 4; i++) { if ( panel == _rulerNumber[i]) return true; } } _dragging = true; _dragMouseCode = code; ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("HideNewControlMenu"), NULL); int x, y; input()->GetCursorPos(x, y); _dragStartCursorPos[0] = x; _dragStartCursorPos[1] = y; input()->SetMouseCapture(panel->GetVPanel()); _groupDeltaX.RemoveAll(); _groupDeltaY.RemoveAll(); // basepanel is the panel that all the deltas will be calculated from. // it is the last panel we clicked in because if we move the panels as a group // it would be from that one Panel *basePanel = NULL; // find the panel we clicked in, that is the base panel // it might already be in the group for (int i=0; i< _controlGroup.Count(); ++i) { if (panel == _controlGroup[i].Get()) { basePanel = panel; break; } } // if its not in the group we just added this panel. get it in the group if (basePanel == NULL) { PHandle temp; temp = panel; _controlGroup.AddToTail(temp); basePanel = panel; } basePanel->GetPos(x,y); _dragStartPanelPos[0]=x; _dragStartPanelPos[1]=y; basePanel->GetSize( _dragStartPanelSize[ 0 ], _dragStartPanelSize[ 1 ] ); // figure out the deltas of the other panels from the base panel for (int i=0; i<_controlGroup.Count(); ++i) { int cx, cy; _controlGroup[i].Get()->GetPos(cx, cy); _groupDeltaX.AddToTail(cx - x); _groupDeltaY.AddToTail(cy - y); } // if this panel wasn't already selected update the buildmode dialog controls to show its info if(_currentPanel != panel) { _currentPanel = panel; if ( m_hBuildDialog ) { // think this is taken care of by SetActiveControl. //ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("ApplyDataToControls"), NULL); KeyValues *keyval = new KeyValues("SetActiveControl"); keyval->SetPtr("PanelPtr", GetCurrentPanel()); ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), keyval, NULL); } } // store undo information upon panel selection. ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), new KeyValues("StoreUndo"), NULL); panel->RequestFocus(); } return true; }
//----------------------------------------------------------------------------- // Purpose: respond to cursor movments //----------------------------------------------------------------------------- bool BuildGroup::CursorMoved(int x, int y, Panel *panel) { Assert(panel); if ( !m_hBuildDialog.Get() ) { if ( panel->GetParent() ) { EditablePanel *ep = dynamic_cast< EditablePanel * >( panel->GetParent() ); if ( ep ) { BuildGroup *bg = ep->GetBuildGroup(); if ( bg && bg != this ) { bg->CursorMoved( x, y, panel ); } } } return false; } // no moving uneditable panels // commented out because this has issues with panels moving // to front and obscuring other panels //if (!panel->IsBuildModeEditable()) // return; if (_dragging) { input()->GetCursorPos(x, y); if (_dragMouseCode == MOUSE_RIGHT) { int newW = max( 1, _dragStartPanelSize[ 0 ] + x - _dragStartCursorPos[0] ); int newH = max( 1, _dragStartPanelSize[ 1 ] + y - _dragStartCursorPos[1] ); bool shift = ( input()->IsKeyDown(KEY_LSHIFT) || input()->IsKeyDown(KEY_RSHIFT) ); bool ctrl = ( input()->IsKeyDown(KEY_LCONTROL) || input()->IsKeyDown(KEY_RCONTROL) ); if ( shift ) { newW = _dragStartPanelSize[ 0 ]; } if ( ctrl ) { newH = _dragStartPanelSize[ 1 ]; } panel->SetSize( newW, newH ); ApplySnap(panel); } else { for (int i=0; i < _controlGroup.Count(); ++i) { // now fix offset of member panels with respect to the one we are dragging Panel *groupMember = _controlGroup[i].Get(); groupMember->SetPos(_dragStartPanelPos[0] + _groupDeltaX[i] +(x-_dragStartCursorPos[0]), _dragStartPanelPos[1] + _groupDeltaY[i] +(y-_dragStartCursorPos[1])); ApplySnap(groupMember); } } // update the build dialog if (m_hBuildDialog) { KeyValues *keyval = new KeyValues("UpdateControlData"); keyval->SetPtr("panel", GetCurrentPanel()); ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), keyval, NULL); keyval = new KeyValues("EnableSaveButton"); ivgui()->PostMessage(m_hBuildDialog->GetVPanel(), keyval, NULL); } panel->Repaint(); panel->CallParentFunction(new KeyValues("Repaint")); } return true; }