void ElementDataGrid::OnUpdate() { Core::ElementDocument* document = GetOwnerDocument(); document->LockLayout(true); if (!new_data_source.Empty()) { root->SetDataSource(new_data_source); new_data_source = ""; } bool any_new_children = root->UpdateChildren(); if (any_new_children) { DispatchEvent("rowupdate", Rocket::Core::Dictionary()); } if (!body_visible && (!any_new_children || root->GetNumLoadedChildren() >= Rocket::Core::Math::RealToInteger(ResolveProperty("min-rows", 0)))) { body->SetProperty("display", "block"); body_visible = true; } document->LockLayout(false); }
void ElementDataGridRow::RemoveChildren(int first_row_removed, int num_rows_removed) { if (num_rows_removed == -1) { num_rows_removed = (int)children.size() - first_row_removed; } // prevent relayout of the document while removing rows Core::ElementDocument* document = parent_grid->GetOwnerDocument(); document->LockLayout(true); for (int i = num_rows_removed - 1; i >= 0; i--) { children[first_row_removed + i]->RemoveChildren(); parent_grid->RemoveRows(children[first_row_removed + i]->GetTableRelativeIndex()); } children.erase(children.begin() + first_row_removed, children.begin() + (first_row_removed + num_rows_removed)); for (int i = first_row_removed; i < (int) children.size(); i++) { children[i]->SetChildIndex(i); children[i]->DirtyTableRelativeIndex(); } document->LockLayout(false); Rocket::Core::Dictionary parameters; parameters.Set("first_row_removed", GetChildTableRelativeIndex(first_row_removed)); parameters.Set("num_rows_removed", num_rows_removed); parent_grid->DispatchEvent("rowremove", parameters); }
// Adds children underneath this row, and fetches their contents (and possible // children) from the row's data source. void ElementDataGridRow::AddChildren(int first_row_added, int num_rows_added) { if (first_row_added == -1) { first_row_added = (int)children.size(); } // prevent relayout of the document while adding rows Core::ElementDocument* document = parent_grid->GetOwnerDocument(); document->LockLayout(true); // We need to make a row for each new child, then pass through the cell // information and the child's data source (if one exists.) if (data_source) { for (int i = 0; i < num_rows_added; i++) { int row_index = first_row_added + i; // Make a new row: ElementDataGridRow* new_row = parent_grid->AddRow(this, row_index); children.insert(children.begin() + row_index, new_row); if (!row_expanded) { new_row->SetProperty("display", "none"); } } for (int i = first_row_added + num_rows_added; i < (int)children.size(); i++) { children[i]->SetChildIndex(i); children[i]->DirtyTableRelativeIndex(); } if (parent_row) { parent_row->ChildChanged(child_index); } } document->LockLayout(false); RefreshChildDependentCells(); DirtyRow(); Rocket::Core::Dictionary parameters; parameters.Set("first_row_added", GetChildTableRelativeIndex(first_row_added)); parameters.Set("num_rows_added", num_rows_added); parent_grid->DispatchEvent("rowadd", parameters); }
// Sets the context to be debugged. bool Plugin::SetContext(Core::Context* context) { // Remove the debug hook from the old context. if (debug_context != NULL && hook_element != NULL) { debug_context->UnloadDocument(hook_element); hook_element->RemoveReference(); hook_element = NULL; } // Add the debug hook into the new context. if (context != NULL) { Core::ElementDocument* element = context->CreateDocument("debug-hook"); if (element == NULL) return false; hook_element = dynamic_cast< ElementContextHook* >(element); if (hook_element == NULL) { element->RemoveReference(); context->UnloadDocument(element); return false; } hook_element->Initialise(this); } // Attach the info element to the new context. if (info_element != NULL) { if (debug_context != NULL) { debug_context->RemoveEventListener("click", info_element, true); debug_context->RemoveEventListener("mouseover", info_element, true); } if (context != NULL) { context->AddEventListener("click", info_element, true); context->AddEventListener("mouseover", info_element, true); } info_element->Reset(); } debug_context = context; return true; }
/// Called when source texture has changed. void ElementCircularBar::LoadTexture() { Core::ElementDocument* document = GetOwnerDocument(); Core::URL source_url(document == NULL ? "" : document->GetSourceURL()); Core::String source = GetProperty< Core::String >("gauge-src"); if (!gauge_texture.Load(source, source_url.GetPath())) { gauge_geometry.SetTexture(NULL); return; } gauge_geometry.SetTexture(&gauge_texture); actual_gauge_extent = gauge_texture.GetDimensions(GetRenderInterface()); }
// Renders any debug elements in the debug context. void Plugin::Render() { // Render the outlines of the debug context's elements. if (render_outlines && debug_context != NULL) { for (int i = 0; i < debug_context->GetNumDocuments(); ++i) { Core::ElementDocument* document = debug_context->GetDocument(i); if (document->GetId().Find("rkt-debug-") == 0) continue; std::stack< Core::Element* > element_stack; element_stack.push(document); while (!element_stack.empty()) { Core::Element* element = element_stack.top(); element_stack.pop(); if (element->IsVisible()) { for (int j = 0; j < element->GetNumBoxes(); ++j) { const Core::Box& box = element->GetBox(j); Geometry::RenderOutline(element->GetAbsoluteOffset(Core::Box::BORDER) + box.GetPosition(Core::Box::BORDER), box.GetSize(Core::Box::BORDER), Core::Colourb(255, 0, 0, 128), 1); } for (int j = 0; j < element->GetNumChildren(); ++j) element_stack.push(element->GetChild(j)); } } } } // Render the info element's boxes. if (info_element != NULL && info_element->IsVisible()) { info_element->RenderHoverElement(); info_element->RenderSourceElement(); } }