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: //----------------------------------------------------------------------------- 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; }
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 ); } } } }
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: //----------------------------------------------------------------------------- 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; }