Я пытаюсь создать часть пользовательского интерфейса, состоящую из сетки перетаскиваемых пэдов, которые можно перетаскивать друг на друга.
Когда пэд упал на другой, они должны поменяться местами.
Я хочу, чтобы объекты классов Pad
и Pads
как можно больше не обращали внимания друг на друга, поэтому я подумал о применении шаблона наблюдателя с этими двумя классами, унаследованными от классов Observer
и Observable
соответственно.
Я придумал такой шаблонный код:
class Observable:
def __init__(self):
self.observers = []
def subscribe(self, observer):
self.observers.append(observer)
def unsubscribe(self, observer):
self.observers.remove(observer)
def notify(self, data):
for observer in self.observers:
observer.receive(data)
class Observer:
def receive(self, data):
print('{} received {}'.format(self.id, data))
class Pads(Observable):
def __init__(self, n_pads):
super().__init__()
self.pads = []
for i in range(1, n_pads + 1):
pad = Pad(i)
self.pads.append(pad)
self.subscribe(pad)
def swap(self, src_pad, target_pad):
a = self.pads.index(src_pad)
b = self.pads.index(target_pad)
self.pads[a], self.pads[b] = self.pads[b], self.pads[a]
print('Swapped pad {} with pad {}'.format(src_pad.id, target_pad.id))
class Pad(Observer):
def __init__(self, id):
self.id = id
def drop_on(self, target_pad):
print('Dropped pad {} on pad {}'.format(self.id, target_pad.id))
# how to call 'swap' of 'Pads'class automatically here?
pads = Pads(16)
some_pad = pads.pads[8]
another_pad = pads.pads[11]
some_pad.drop_on(another_pad)
# I do not want to call this manually. Instead, I want it to happen
# automatically after "some_pad.drop_on(another_pad)"
pads.swap(some_pad, another_pad)
однако я не знаю, как двигаться дальше.
Полагаю, мне нужно реализовать метод notify
класса Observable
таким образом, чтобы метод swap
класса Pads
автоматически вызывался всякий раз, когда drop_on
метод Pad
называется.
Может кто-нибудь подсказать мне, как этого добиться?