Poodletooth-iLand/toontown/margins/MarginManager.py

77 lines
2.3 KiB
Python
Raw Normal View History

2015-03-03 22:10:12 +00:00
from pandac.PandaModules import PandaNode
import random
from toontown.margins.MarginCell import MarginCell
class MarginManager(PandaNode):
def __init__(self):
PandaNode.__init__(self, 'margins')
self.cells = set()
self.visibles = set()
def addCell(self, x, y, a2dMarker):
cell = MarginCell()
cell.reparentTo(a2dMarker)
cell.setPos(x, 0, y)
cell.setScale(0.2)
cell.setActive(True)
self.cells.add(cell)
self.reorganize()
return cell
def removeCell(self, cell):
if cell in self.cells:
self.cells.remove(cell)
self.reorganize()
def addVisible(self, visible):
self.visibles.add(visible)
self.reorganize()
def removeVisible(self, visible):
if visible in self.visibles:
self.visibles.remove(visible)
self.reorganize()
def getActiveCells(self):
return [cell for cell in self.cells if cell.getActive()]
def reorganize(self):
# First, get all of the active cells:
activeCells = self.getActiveCells()
# Next, get all of the visibles sorted by priority:
visibles = list(self.visibles)
visibles.sort(key=lambda visible: visible.getPriority(), reverse=True)
# We can only display so many visibles, so truncate them based on the
# number of active cells:
visibles = visibles[:len(activeCells)]
# Now, let's build a list of empty cells:
emptyCells = []
for cell in activeCells:
content = cell.getContent()
if content in visibles:
# This cell is already displaying something we want to see.
# Ignore it:
visibles.remove(content)
continue
elif content is not None:
# This cell isn't displaying anything interesting, so let's
# empty it:
cell.setContent(None)
emptyCells.append(cell)
# Assign the visibles to their cells:
for visible in visibles:
cell = visible.getLastCell()
if cell not in emptyCells:
cell = random.choice(emptyCells)
cell.setContent(visible)
emptyCells.remove(cell)