X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ea57084d103187771c0306a6e1684e32244d6101..dc1efb1d9f4e4ce7d8f889dad3aaab7026b73058:/utils/ogl/src/composit.cpp diff --git a/utils/ogl/src/composit.cpp b/utils/ogl/src/composit.cpp index 366777b25f..c1865a0ff1 100644 --- a/utils/ogl/src/composit.cpp +++ b/utils/ogl/src/composit.cpp @@ -37,13 +37,11 @@ // construct themselves. wxExprDatabase *GlobalwxExprDatabase = NULL; -// Popup menu for editing divisions -wxMenu *oglPopupDivisionMenu = NULL; /* * Division control point */ - + class wxDivisionControlPoint: public wxControlPoint { DECLARE_DYNAMIC_CLASS(wxDivisionControlPoint) @@ -101,8 +99,8 @@ void wxCompositeShape::OnDraw(wxDC& dc) if (m_shadowMode != SHADOW_NONE) { if (m_shadowBrush) - dc.SetBrush(m_shadowBrush); - dc.SetPen(g_oglTransparentPen); + dc.SetBrush(* m_shadowBrush); + dc.SetPen(* g_oglTransparentPen); if (m_cornerRadius != 0.0) dc.DrawRoundedRectangle(WXROUND(x1 + m_shadowOffsetX), WXROUND(y1 + m_shadowOffsetY), @@ -168,7 +166,7 @@ void wxCompositeShape::OnDragLeft(bool draw, double x, double y, int keys, int a wxClientDC dc(GetCanvas()); GetCanvas()->PrepareDC(dc); - dc.SetLogicalFunction(wxXOR); + dc.SetLogicalFunction(OGLRBLF); wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT); dc.SetPen(dottedPen); dc.SetBrush((* wxTRANSPARENT_BRUSH)); @@ -187,7 +185,7 @@ void wxCompositeShape::OnBeginDragLeft(double x, double y, int keys, int attachm Erase(dc); - dc.SetLogicalFunction(wxXOR); + dc.SetLogicalFunction(OGLRBLF); wxPen dottedPen(wxColour(0, 0, 0), 1, wxDOT); dc.SetPen(dottedPen); @@ -228,7 +226,7 @@ void wxCompositeShape::OnEndDragLeft(double x, double y, int keys, int attachmen double offsetY = yy - objectStartY; Move(dc, GetX() + offsetX, GetY() + offsetY); - + if (m_canvas && !m_canvas->GetQuickEditMode()) m_canvas->Redraw(dc); } @@ -284,7 +282,7 @@ void wxCompositeShape::SetSize(double w, double h, bool recursive) object->Show(FALSE); object->Move(dc, newX, newY); object->Show(TRUE); - + // Now set the scaled size object->GetBoundingBoxMin(&xBound, &yBound); object->SetSize(object->GetFixedWidth() ? xBound : xScale*xBound, @@ -376,8 +374,8 @@ void wxCompositeShape::Copy(wxShape& copy) wxShape *object = (wxShape *)node->Data(); wxShape *newObject = object->CreateNewCopy(FALSE, FALSE); if (newObject->GetId() == 0) - newObject->SetId(NewId()); - + newObject->SetId(wxNewId()); + newObject->SetParent(&compositeCopy); compositeCopy.m_children.Append(newObject); @@ -405,7 +403,7 @@ void wxCompositeShape::Copy(wxShape& copy) wxShape *constrainedObject = (wxShape *)node2->Data(); wxShape *newConstrained = (wxShape *)(oglObjectCopyMapping.Find((long)constrainedObject)->Data()); newConstrainedList.Append(newConstrained); - node2 = node2->Next(); + node2 = node2->Next(); } wxOGLConstraint *newConstraint = new wxOGLConstraint(constraint->m_constraintType, newConstraining, @@ -459,7 +457,7 @@ wxOGLConstraint *wxCompositeShape::AddConstraint(wxOGLConstraint *constraint) { m_constraints.Append(constraint); if (constraint->m_constraintId == 0) - constraint->m_constraintId = NewId(); + constraint->m_constraintId = wxNewId(); return constraint; } @@ -467,7 +465,7 @@ wxOGLConstraint *wxCompositeShape::AddConstraint(int type, wxShape *constraining { wxOGLConstraint *constraint = new wxOGLConstraint(type, constraining, constrained); if (constraint->m_constraintId == 0) - constraint->m_constraintId = NewId(); + constraint->m_constraintId = wxNewId(); m_constraints.Append(constraint); return constraint; } @@ -478,7 +476,7 @@ wxOGLConstraint *wxCompositeShape::AddConstraint(int type, wxShape *constraining l.Append(constrained); wxOGLConstraint *constraint = new wxOGLConstraint(type, constraining, l); if (constraint->m_constraintId == 0) - constraint->m_constraintId = NewId(); + constraint->m_constraintId = wxNewId(); m_constraints.Append(constraint); return constraint; } @@ -726,7 +724,7 @@ void wxCompositeShape::ReadConstraints(wxExpr *clause, wxExprDatabase *database) m_constrainingObject = (wxShape *)objExpr1->GetClientData(); else wxFatalError("Couldn't find constraining image of composite.", "Object graphics error"); - + int i = 0; wxExpr *currentIdExpr = constrainedExpr->Nth(i); while (currentIdExpr) @@ -841,7 +839,7 @@ wxDivisionShape::~wxDivisionShape() void wxDivisionShape::OnDraw(wxDC& dc) { - dc.SetBrush(wxTRANSPARENT_BRUSH); + dc.SetBrush(* wxTRANSPARENT_BRUSH); dc.SetBackgroundMode(wxTRANSPARENT); double x1 = (double)(GetX() - (GetWidth()/2.0)); @@ -856,18 +854,18 @@ void wxDivisionShape::OnDraw(wxDC& dc) if (m_leftSide) { - dc.SetPen(m_leftSidePen); + dc.SetPen(* m_leftSidePen); dc.DrawLine(WXROUND(x1), WXROUND(y2), WXROUND(x1), WXROUND(y1)); } if (m_topSide) { - dc.SetPen(m_topSidePen); + dc.SetPen(* m_topSidePen); dc.DrawLine(WXROUND(x1), WXROUND(y1), WXROUND(x2), WXROUND(y1)); } // For testing purposes, draw a rectangle so we know // how big the division is. -// SetBrush(wxCYAN_BRUSH); +// SetBrush(* wxCYAN_BRUSH); // wxRectangleShape::OnDraw(dc); } @@ -938,7 +936,7 @@ void wxDivisionShape::OnEndDragLeft(double x, double y, int keys, int attachment } return; } - + wxClientDC dc(GetCanvas()); GetCanvas()->PrepareDC(dc); @@ -1080,7 +1078,7 @@ bool wxDivisionShape::Divide(int direction) double newYPos2 = (double)(y1 + (3.0*GetHeight()/4.0)); wxDivisionShape *newDivision = compositeParent->OnCreateDivision(); newDivision->Show(TRUE); - + Erase(dc); // Anything adjoining the bottom of this division now adjoins the @@ -1109,7 +1107,7 @@ bool wxDivisionShape::Divide(int direction) // Division is now receiving mouse events _before_ the contained object, // because it was added last (on top of all others) - // Add after the image that visualizes the container + // Add after the image that visualizes the container compositeParent->AddChild(newDivision, compositeParent->FindContainerImage()); m_handleSide = DIVISION_SIDE_BOTTOM; @@ -1131,7 +1129,7 @@ bool wxDivisionShape::Divide(int direction) double newYPos2 = GetY(); wxDivisionShape *newDivision = compositeParent->OnCreateDivision(); newDivision->Show(TRUE); - + Erase(dc); // Anything adjoining the left of this division now adjoins the @@ -1320,7 +1318,7 @@ bool wxDivisionShape::AdjustLeft(double left, bool test) GetCanvas()->PrepareDC(dc); Move(dc, newX, GetY()); - + return TRUE; } @@ -1341,7 +1339,7 @@ bool wxDivisionShape::AdjustTop(double top, bool test) GetCanvas()->PrepareDC(dc); Move(dc, GetX(), newY); - + return TRUE; } @@ -1362,7 +1360,7 @@ bool wxDivisionShape::AdjustRight(double right, bool test) GetCanvas()->PrepareDC(dc); Move(dc, newX, GetY()); - + return TRUE; } @@ -1383,7 +1381,7 @@ bool wxDivisionShape::AdjustBottom(double bottom, bool test) GetCanvas()->PrepareDC(dc); Move(dc, GetX(), newY); - + return TRUE; } @@ -1415,7 +1413,7 @@ void wxDivisionControlPoint::OnBeginDragLeft(double x, double y, int keys, int a originalY = division->GetY(); originalW = division->GetWidth(); originalH = division->GetHeight(); - + wxControlPoint::OnBeginDragLeft(x, y, keys, attachment); } @@ -1453,7 +1451,7 @@ void wxDivisionControlPoint::OnEndDragLeft(double x, double y, int keys, int att success = FALSE; else division->ResizeAdjoining(DIVISION_SIDE_LEFT, x, FALSE); - + break; } case DIVISION_SIDE_TOP: @@ -1464,7 +1462,7 @@ void wxDivisionControlPoint::OnEndDragLeft(double x, double y, int keys, int att success = FALSE; else division->ResizeAdjoining(DIVISION_SIDE_TOP, y, FALSE); - + break; } case DIVISION_SIDE_RIGHT: @@ -1475,7 +1473,7 @@ void wxDivisionControlPoint::OnEndDragLeft(double x, double y, int keys, int att success = FALSE; else division->ResizeAdjoining(DIVISION_SIDE_RIGHT, x, FALSE); - + break; } case DIVISION_SIDE_BOTTOM: @@ -1486,7 +1484,7 @@ void wxDivisionControlPoint::OnEndDragLeft(double x, double y, int keys, int att success = FALSE; else division->ResizeAdjoining(DIVISION_SIDE_BOTTOM, y, FALSE); - + break; } } @@ -1564,7 +1562,7 @@ bool wxDivisionShape::ResizeAdjoining(int side, double newPos, bool test) } node = node->Next(); } - + return TRUE; } @@ -1572,10 +1570,32 @@ bool wxDivisionShape::ResizeAdjoining(int side, double newPos, bool test) * Popup menu for editing divisions * */ - -void oglGraphicsDivisionMenuProc(wxMenu& menu, wxCommandEvent& event) +class OGLPopupDivisionMenu : public wxMenu { +public: + OGLPopupDivisionMenu() : wxMenu() { + Append(DIVISION_MENU_SPLIT_HORIZONTALLY, "Split horizontally"); + Append(DIVISION_MENU_SPLIT_VERTICALLY, "Split vertically"); + AppendSeparator(); + Append(DIVISION_MENU_EDIT_LEFT_EDGE, "Edit left edge"); + Append(DIVISION_MENU_EDIT_TOP_EDGE, "Edit top edge"); + } + + void OnMenu(wxCommandEvent& event); + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(OGLPopupDivisionMenu, wxMenu) + EVT_CUSTOM_RANGE(wxEVT_COMMAND_MENU_SELECTED, + DIVISION_MENU_SPLIT_HORIZONTALLY, + DIVISION_MENU_EDIT_BOTTOM_EDGE, + OGLPopupDivisionMenu::OnMenu) +END_EVENT_TABLE() + + +void OGLPopupDivisionMenu::OnMenu(wxCommandEvent& event) { - wxDivisionShape *division = (wxDivisionShape *)menu.GetClientData(); + wxDivisionShape *division = (wxDivisionShape *)GetClientData(); switch (event.GetInt()) { case DIVISION_MENU_SPLIT_HORIZONTALLY: @@ -1628,7 +1648,7 @@ void wxDivisionShape::EditEdge(int side) GraphicsForm *form = new GraphicsForm("Containers"); int lineWidth = currentPen->GetWidth(); - + form->Add(wxMakeFormShort("Width", &lineWidth, wxFORM_DEFAULT, NULL, NULL, wxVERTICAL, 150)); form->Add(wxMakeFormString("Colour", pColour, wxFORM_CHOICE, @@ -1696,7 +1716,7 @@ void wxDivisionShape::EditEdge(int side) else if (strcmp(*pStyle, "Dot Dash") == 0) lineStyle = wxDOT_DASH; } - + wxPen *newPen = wxThePenList->FindOrCreatePen(*pColour, lineWidth, lineStyle); if (!pen) pen = wxBLACK_PEN; @@ -1714,6 +1734,8 @@ void wxDivisionShape::EditEdge(int side) // Popup menu void wxDivisionShape::PopupMenu(double x, double y) { + wxMenu* oglPopupDivisionMenu = new OGLPopupDivisionMenu; + oglPopupDivisionMenu->SetClientData((void *)this); if (m_leftSide) oglPopupDivisionMenu->Enable(DIVISION_MENU_EDIT_LEFT_EDGE, TRUE); @@ -1723,7 +1745,7 @@ void wxDivisionShape::PopupMenu(double x, double y) oglPopupDivisionMenu->Enable(DIVISION_MENU_EDIT_TOP_EDGE, TRUE); else oglPopupDivisionMenu->Enable(DIVISION_MENU_EDIT_TOP_EDGE, FALSE); - + int x1, y1; m_canvas->ViewStart(&x1, &y1); @@ -1737,6 +1759,7 @@ void wxDivisionShape::PopupMenu(double x, double y) int mouse_y = (int)(dc.LogicalToDeviceY((long)(y - y1*unit_y))); m_canvas->PopupMenu(oglPopupDivisionMenu, mouse_x, mouse_y); + delete oglPopupDivisionMenu; } void wxDivisionShape::SetLeftSideColour(const wxString& colour)