from PySide6.QtCore import QPointF, QRect, Qt, QPoint
from PySide6.QtGui import QPen, QColor
from BaseMod.camera.cameraHistory import AddCamera, RemoveCamera, CameraMove, CameraQuadMove, MoveCameraOrder
from BaseMod.camera.cameraRenderable import RenderCamera
from RWS.Core import camw, camh, CELLSIZE
from RWS.Modify import Editor
from RWS.Renderable import RenderRect
"""class CameraHandles(RenderList):
def __init__(self, module, depth, rendercamera: RenderCamera):
super().__init__(module, depth)
self.camera = rendercamera.camera
self.rendercamera = rendercamera
self.poshandle = Handle(module)
self.renderables.append(self.poshandle)
self.poshandle.setPos(self.camera.pos)
self.poshandle.handle_offset = QPointF(camw / 2 * CELLSIZE, camh / 2 * CELLSIZE)
self.poshandle.posChangedRelative.connect(self.movepos)
self.poshandle.mouseReleased.connect(self.changepos) # todo add history, make selection grouping
def changepos(self, x):
# when we finish moving
index = self.viewport.level.l_cameras.index(self.camera)
if self not in self.module.selected:
self.module.cameraui.select_camera(index)
return
self.module.level.add_history(CameraMove(self.module.level.history, self.module, self.rendercamera.module,
self.module.selected, x - self.poshandle.handle.reserved_pos))
self.camera.pos = x
def movepos(self, x):
# when we move
self.rendercamera.setPos(x + self.poshandle.offset)
for i in self.module.selected:
if i == self:
continue
i: CameraHandles
i.rendercamera.setPos(x + i.poshandle.offset)
i.poshandle.handle.movehandle(x)
"""
"""
class CameraGroup(QGraphicsItemGroup):
def __init__(self, module, handles: list[CameraHandles], parent=None):
super().__init__(parent)
self.handles = handles
self.module = module
for i in self.handles:
self.addToGroup(i.poshandle.handle)
self.setAcceptTouchEvents(True)
self.setAcceptHoverEvents(True)
self.setAcceptedMouseButtons(Qt.MouseButton.LeftButton)
def mouseMoveEvent(self, event):
for i in self.handles:
i.poshandle.setPos(i.poshandle.offset + event.pos())
def mousePressEvent(self, event):
event.accept()
for i in self.handles:
i.poshandle.handle.mousePressEvent(event)
"""
[docs]
class CameraEditor(Editor):
[docs]
def __init__(self, mod):
super().__init__(mod)
self.cameraui = None
self.selectrect = RenderRect(self, 0, QRect(), pen=QPen(QColor(255, 255, 255), 3, Qt.PenStyle.DashLine))
self.selectrect.drawrect.setOpacity(0)
self.selectpos = QPoint()
self.selected: list[RenderCamera] = []
[docs]
def init_scene_items(self, viewport):
self.reset_selection()
self.add_handles()
super().init_scene_items(viewport)
# module = self.viewport.modulenames["cameras"]
# for i in range(40000):
# print(i)
# module.add_new_camera(0, QPointF(random.randrange(0, 4000), random.randrange(0, 4000)))
# #self.add_camera()
# self.add_handles()
[docs]
def remove_items_from_scene(self, viewport):
self.reset_selection()
self.clear_handles()
super().remove_items_from_scene(viewport)
[docs]
def clear_handles(self):
# for i in self.handles:
# i.remove_graphics(self.viewport)
# i.remove_myself()
# self.handles.clear()
if self.viewport is None:
return
for i in self.cameras:
i.edit_camera(False)
[docs]
def move_up(self, selection):
self.level.add_history(MoveCameraOrder, self, self.viewport.modulenames["cameras"], True, selection)
[docs]
def move_down(self, selection):
self.level.add_history(MoveCameraOrder, self, self.viewport.modulenames["cameras"], False, selection)
[docs]
def move_event(self):
super().move_event()
if self.control and self.selectpos != QPoint(0, 0):
self.selectrect.setRect(QRect.span(self.selectpos, self.editor_pos))
self.selectrect.drawrect.setOpacity(1)
self.reset_selection()
for i in self.cameras:
if self.selectrect.rect.contains(i.camera.pos.toPoint() + QPoint(camw / 2 * CELLSIZE, camh / 2 * CELLSIZE)):
self.selected.append(i)
i.paintselected()
for i in self.selected:
indx = self.cameras.index(i)
self.cameraui.select_camera(indx, False)
[docs]
def mouse_left_release(self):
self.selectpos = QPoint()
self.selectrect.drawrect.setOpacity(0)
[docs]
def mouse_left_press(self):
if self.control:
self.selectpos = self.editor_pos
self.reset_selection()
[docs]
def reset_selection(self, reset_ui=True):
self.selected = []
if self.viewport is None:
return
for i in self.cameras:
i.paintselected(False)
if reset_ui:
self.cameraui.reset_selection()
[docs]
def select_indexes(self, selection):
for i, v in enumerate(self.cameras):
if i in selection:
self.selected.append(v)
v.paintselected()
[docs]
def add_camera(self):
module = self.viewport.modulenames["cameras"]
self.level.add_history(AddCamera, self, module, len(module.cameras),
self.editor_pos.toPointF() - QPointF(camw / 2 * CELLSIZE, camh / 2 * CELLSIZE))
self.add_handles()
[docs]
def remove_cameras(self, cameras: list[int]):
module = self.viewport.modulenames["cameras"]
self.level.add_history(RemoveCamera, self, module, cameras)
self.add_handles()
# group = CameraGroup(self, self.handles)
# self.viewport.scene().addItem(group)
[docs]
def add_handles(self):
# for i, v in enumerate(self.level.l_cameras):
# self.handles.append(CameraHandles(self, 0, self.viewport.modulenames["cameras"].cameras[i]))
# if init:
# for i in self.handles:
# i.init_graphics(self.viewport)
if self.viewport is None: # for the undo/redo stuff
return
for i in self.cameras:
i.edit_camera()
i.poshandle.posChangedRelative.connect(self.move_selected(i))
i.poshandle.mouseReleased.connect(self.finishmove(i))
for k in range(4):
i.quadhandles[k].posChangedRelative.connect(self.quad_moved(i, k))
i.quadhandles[k].mouseReleased.connect(self.finishmovequad(i, k))
self.cameraui.add_cameras()
[docs]
def quad_moved(self, camera, quad):
if camera not in self.selected:
self.reset_selection()
self.selected = [camera]
camera.paintselected()
def move(x):
if camera not in self.selected:
self.reset_selection()
self.selected = [camera]
camera.paintselected()
self.cameraui.select_camera(self.cameras.index(camera), False)
for i in self.selected:
if i == camera:
continue
i.quadhandles[quad].handle.movehandle(x, True)
return move
[docs]
def finishmovequad(self, camera, quad):
module = self.viewport.modulenames["cameras"]
def move(x):
self.level.add_history(CameraQuadMove, self, module, quad, self.cameraindexes)
return move
[docs]
def move_selected(self, camera: RenderCamera):
if camera not in self.selected:
self.reset_selection()
self.selected = [camera]
camera.paintselected()
def move(x):
if camera not in self.selected:
self.reset_selection()
self.selected = [camera]
camera.paintselected()
self.cameraui.select_camera(self.cameras.index(camera), False)
for i in self.selected:
if i == camera:
continue
i.poshandle.handle.movehandle(x, True)
return move
[docs]
def finishmove(self, camera):
module = self.viewport.modulenames["cameras"]
def move(x):
self.level.add_history(CameraMove, self, module, self.cameraindexes, x - camera.poshandle.previous_pos)
return move
@property
def cameras(self) -> list[RenderCamera]:
return self.viewport.modulenames["cameras"].cameras
@property
def cameraindexes(self) -> list[int]:
return [self.viewport.modulenames["cameras"].cameras.index(i) for i in self.selected]