void LinkEvent::ReplaceLinkByLinkedEvents(gd::Project & project, EventsList & eventList, unsigned int indexOfTheEventInThisList) { //Finding what to link to. const EventsList * eventsToInclude = NULL; gd::ExternalEvents * linkedExternalEvents = NULL; if ( project.HasExternalEventsNamed(GetTarget()) ) { linkedExternalEvents = &project.GetExternalEvents(GetTarget()); eventsToInclude = &project.GetExternalEvents(GetTarget()).GetEvents(); } else if ( project.HasLayoutNamed(GetTarget()) ) eventsToInclude = &project.GetLayout(GetTarget()).GetEvents(); if ( eventsToInclude != NULL ) { unsigned int firstEvent = IncludeAllEvents() ? 0 : GetIncludeStart(); unsigned int lastEvent = IncludeAllEvents() ? eventsToInclude->size() - 1 : GetIncludeEnd(); //Check bounds if ( firstEvent >= eventsToInclude->size() ) { std::cout << "Unable to get events from a link ( Invalid start )" << std::endl; linkWasInvalid = true; return; } if ( lastEvent >= eventsToInclude->size() ) { std::cout << "Unable to get events from a link ( Invalid end )" << std::endl; linkWasInvalid = true; return; } if ( firstEvent > lastEvent ) { std::cout << "Unable to get events from a link ( End is before start )" << std::endl; linkWasInvalid = true; return; } //Insert an empty event to replace the link event ( we'll delete the link event at the end ) //( If we just erase the link event without adding a blank event to replace it, //the first event inserted by the link will not be preprocessed ( and it can be annoying if it require preprocessing, such as another link event ). ) gd::EmptyEvent emptyEvent; eventList.InsertEvent(emptyEvent, indexOfTheEventInThisList); eventList.InsertEvents(*eventsToInclude, firstEvent, lastEvent, indexOfTheEventInThisList+1); //Delete the link event ( which is now at the end of the list of events we've just inserted ) eventList.RemoveEvent(indexOfTheEventInThisList + 1 + static_cast<unsigned>(lastEvent-firstEvent)+1); } else { std::cout << "Unable to get events from a link." << std::endl; linkWasInvalid = true; //Delete the link event eventList.RemoveEvent(indexOfTheEventInThisList); return; } linkWasInvalid = false; }
/** * Render the event in the bitmap */ void LinkEvent::Render(wxDC & dc, int x, int y, unsigned int width, gd::EventsEditorItemsAreas & areas, gd::EventsEditorSelection & selection, const gd::Platform & platform) { #if !defined(GD_NO_WX_GUI) gd::EventsRenderingHelper * renderingHelper = gd::EventsRenderingHelper::Get(); dc.SetBrush( wxBrush( wxColour( 255, 255, 255 ) ) ); dc.SetPen( wxPen( wxColour( 0, 0, 0 ), 1) ); wxRect rect(x+1, y, width-2, GetRenderedHeight(width, platform)-2); dc.DrawRectangle(rect); dc.DrawBitmap( gd::SkinHelper::GetIcon("events", 24), x+4, y + 1, true); dc.SetTextBackground( wxColour( 255, 255, 255 ) ); if ( !IsDisabled() ) dc.SetTextForeground( wxColour( 0, 0, 0 ) ); else dc.SetTextForeground( wxColour( 160, 160, 160 ) ); dc.SetFont(renderingHelper->GetNiceFont()); dc.DrawText( _("Link to ")+GetTarget(), x+32, y + 3 ); if ( !IncludeAllEvents() ) { wxRect textRect = dc.GetTextExtent(_("Link to ")+GetTarget()); dc.DrawText( _("Include only events ")+gd::String::From(GetIncludeStart()+1)+_(" to ")+gd::String::From(GetIncludeEnd()+1), x+textRect.GetWidth()+32+10, y + 5 ); } #endif }
/** * Render the event in the bitmap */ void LinkEvent::Render(wxDC & dc, int x, int y, unsigned int width, gd::EventsEditorItemsAreas & areas, gd::EventsEditorSelection & selection, const gd::Platform & platform) { #if !defined(GD_NO_WX_GUI) dc.SetBrush( wxBrush( wxColour( 255, 255, 255 ) ) ); dc.SetPen( wxPen( wxColour( 0, 0, 0 ), 1) ); wxRect rect(x+1, y, width, GetRenderedHeight(width, platform)-2); dc.DrawRectangle(rect); dc.DrawBitmap( gd::SkinHelper::GetIcon("events", 24), x+4, y + 1, true); dc.SetTextBackground( wxColour( 255, 255, 255 ) ); if ( !IsDisabled() ) dc.SetTextForeground( wxColour( 0, 0, 0 ) ); else dc.SetTextForeground( wxColour( 160, 160, 160 ) ); dc.SetFont( wxFont( 12, wxDEFAULT, wxNORMAL, wxNORMAL ) ); dc.DrawText( _("Link to ")+GetTarget(), x+32, y + 3 ); wxRect lien = dc.GetTextExtent(_("Link to ")+GetTarget()); dc.SetFont( wxFont( 10, wxDEFAULT, wxNORMAL, wxNORMAL ) ); if ( IncludeAllEvents() ) dc.DrawText( _("Include all events"), x+lien.GetWidth()+32+10, y + 5 ); else dc.DrawText( _("Include events ")+ToString(GetIncludeStart()+1)+_(" to ")+ToString(GetIncludeEnd()+1), x+lien.GetWidth()+32+10, y + 5 ); #endif }
void LinkEvent::SerializeTo(SerializerElement & element) const { element.AddChild("include") .SetAttribute("includeAll", IncludeAllEvents()) .SetAttribute("start", (int)GetIncludeStart()) .SetAttribute("end", (int)GetIncludeEnd()); element.AddChild("target").SetValue(GetTarget()); }