/*========================================================================= Program: Visualization Toolkit Module: vtkAbstractContextItem.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkAbstractContextItem.h" #include "vtkContextMouseEvent.h" #include "vtkContextScenePrivate.h" #include "vtkObjectFactory.h" // STL headers #include //------------------------------------------------------------------------------ vtkAbstractContextItem::vtkAbstractContextItem() { this->Scene = nullptr; this->Parent = nullptr; this->Children = new vtkContextScenePrivate(this); this->Visible = true; this->Interactive = true; } //------------------------------------------------------------------------------ vtkAbstractContextItem::~vtkAbstractContextItem() { delete this->Children; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::Paint(vtkContext2D* painter) { this->Children->PaintItems(painter); return true; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::PaintChildren(vtkContext2D* painter) { this->Children->PaintItems(painter); return true; } //------------------------------------------------------------------------------ void vtkAbstractContextItem::Update() {} //------------------------------------------------------------------------------ vtkIdType vtkAbstractContextItem::AddItem(vtkAbstractContextItem* item) { return this->Children->AddItem(item); } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::RemoveItem(vtkAbstractContextItem* item) { return this->Children->RemoveItem(item); } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::RemoveItem(vtkIdType index) { if (index >= 0 && index < static_cast(this->Children->size())) { return this->Children->RemoveItem(index); } else { return false; } } //------------------------------------------------------------------------------ vtkAbstractContextItem* vtkAbstractContextItem::GetItem(vtkIdType index) { if (index >= 0 && index < static_cast(this->Children->size())) { return this->Children->at(index); } else { return nullptr; } } //------------------------------------------------------------------------------ vtkIdType vtkAbstractContextItem::GetItemIndex(vtkAbstractContextItem* item) { vtkContextScenePrivate::const_iterator it = std::find(this->Children->begin(), this->Children->end(), item); if (it == this->Children->end()) { return -1; } return it - this->Children->begin(); } //------------------------------------------------------------------------------ vtkIdType vtkAbstractContextItem::GetNumberOfItems() { return static_cast(this->Children->size()); } //------------------------------------------------------------------------------ void vtkAbstractContextItem::ClearItems() { this->Children->Clear(); } //------------------------------------------------------------------------------ vtkIdType vtkAbstractContextItem::Raise(vtkIdType index) { return this->StackAbove(index, this->GetNumberOfItems() - 1); } //------------------------------------------------------------------------------ vtkIdType vtkAbstractContextItem::StackAbove(vtkIdType index, vtkIdType under) { vtkIdType res = index; if (index == under || index < 0) { return res; } vtkIdType start = 0; vtkIdType middle = 0; vtkIdType end = 0; if (under == -1) { start = 0; middle = index; end = index + 1; res = 0; } else if (index > under) { start = under + 1; middle = index; end = index + 1; res = start; } else // if (index < under) { start = index; middle = index + 1; end = under + 1; res = end - 1; } std::rotate(this->Children->begin() + start, this->Children->begin() + middle, this->Children->begin() + end); return res; } //------------------------------------------------------------------------------ vtkIdType vtkAbstractContextItem::Lower(vtkIdType index) { return this->StackUnder(index, 0); } //------------------------------------------------------------------------------ vtkIdType vtkAbstractContextItem::StackUnder(vtkIdType child, vtkIdType above) { return this->StackAbove(child, above - 1); } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::Hit(const vtkContextMouseEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::MouseEnterEvent(const vtkContextMouseEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::MouseMoveEvent(const vtkContextMouseEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::MouseLeaveEvent(const vtkContextMouseEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::MouseButtonPressEvent(const vtkContextMouseEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::MouseButtonReleaseEvent(const vtkContextMouseEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::MouseDoubleClickEvent(const vtkContextMouseEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::MouseWheelEvent(const vtkContextMouseEvent&, int) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::KeyPressEvent(const vtkContextKeyEvent&) { return false; } //------------------------------------------------------------------------------ bool vtkAbstractContextItem::KeyReleaseEvent(const vtkContextKeyEvent&) { return false; } //------------------------------------------------------------------------------ vtkAbstractContextItem* vtkAbstractContextItem::GetPickedItem(const vtkContextMouseEvent& mouse) { vtkContextMouseEvent childMouse = mouse; childMouse.SetPos(this->MapFromParent(mouse.GetPos())); childMouse.SetLastPos(this->MapFromParent(mouse.GetLastPos())); for (vtkContextScenePrivate::const_reverse_iterator it = this->Children->rbegin(); it != this->Children->rend(); ++it) { vtkAbstractContextItem* item = (*it)->GetPickedItem(childMouse); if (item) { return item; } } return this->Hit(mouse) ? this : nullptr; } //------------------------------------------------------------------------------ void vtkAbstractContextItem::ReleaseGraphicsResources() { for (vtkContextScenePrivate::const_iterator it = this->Children->begin(); it != this->Children->end(); ++it) { (*it)->ReleaseGraphicsResources(); } } //------------------------------------------------------------------------------ void vtkAbstractContextItem::SetScene(vtkContextScene* scene) { this->Scene = scene; this->Children->SetScene(scene); } //------------------------------------------------------------------------------ void vtkAbstractContextItem::SetParent(vtkAbstractContextItem* parent) { this->Parent = parent; } //------------------------------------------------------------------------------ vtkVector2f vtkAbstractContextItem::MapToParent(const vtkVector2f& point) { return point; } //------------------------------------------------------------------------------ vtkVector2f vtkAbstractContextItem::MapFromParent(const vtkVector2f& point) { return point; } //------------------------------------------------------------------------------ vtkVector2f vtkAbstractContextItem::MapToScene(const vtkVector2f& point) { if (this->Parent) { vtkVector2f p = this->MapToParent(point); p = this->Parent->MapToScene(p); return p; } else { return this->MapToParent(point); } } //------------------------------------------------------------------------------ vtkVector2f vtkAbstractContextItem::MapFromScene(const vtkVector2f& point) { if (this->Parent) { vtkVector2f p = this->Parent->MapFromScene(point); p = this->MapFromParent(p); return p; } else { return this->MapFromParent(point); } } //------------------------------------------------------------------------------ void vtkAbstractContextItem::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); }