diff --git a/builder/remix_builder.py b/builder/remix_builder.py new file mode 100644 index 000000000..5d9dfc037 --- /dev/null +++ b/builder/remix_builder.py @@ -0,0 +1,73 @@ +class Product(object): + pass + +class Building(Product): + def __init__(self, type): + self.type = type + self.floor = None + self.size = None + + def __repr__(self): + return "Building/{0.type}\n\tFloor: {0.floor}\n\tSize: {0.size}".format(self) + +class Builder(object): + def __init__(self): + self.building = None + + def new_building(self): + self.building = Building(self.type) + + def build_floor(self): + raise NotImplementedError + + def build_size(self): + raise NotImplementedError + +class HouseBuilder(Builder): + type = "House" + + def build_floor(self): + self.building.floor = "One" + + def build_size(self): + self.building.size = "Big" + +class FlatBuilder(Builder): + type = "Flat" + + def build_floor(self): + self.building.floor = "Three" + + def build_size(self): + self.building.size = "Small" + +class Director(object): + def __init__(self): + self.builder = None + + def construct_building(self): + self.builder.new_building() + self.builder.build_floor() + self.builder.build_size() + + def get_building(self): + return self.builder.building + +if __name__ == '__main__': + director = Director() + + director.builder = HouseBuilder() + + director.construct_building() + + building = director.get_building() + + print building + + director.builder = FlatBuilder() + + director.construct_building() + + building = director.get_building() + + print building diff --git a/command/sceneitems.py b/command/sceneitems.py new file mode 100644 index 000000000..ae0b0b23d --- /dev/null +++ b/command/sceneitems.py @@ -0,0 +1,137 @@ +from collections import deque + +class Item(object): + def __init__(self, name, color='red', pos=(0, 0)): + self.name = name + self.color = color + self.pos = pos + + def __repr__(self): + return "".format(self.name, self.color, *self.pos) + + def setColor(self, color): + self.color = color + + def setPos(self, pos): + self.pos = pos + +class Scene(object): + def __init__(self): + self.items = [] + + def addItem(self, item): + self.items.append(item) + + def removeItem(self, item): + self.items.remove(item) + +## + +class CommandQueue(object): + def __init__(self): + self._undo = deque() + self._redo = deque() + + def undo_queue(self, command): + self._undo.append(command) + print self._undo + + def redo_queue(self, command): + self._redo.append(command) + print self._redo + + def undo(self): + command = self._undo.pop() + print self._undo + self.redo_queue(command) + return command + + def redo(self): + command = self._redo.pop() + print self._redo + self.undo_queue(command) + return command + +cq = CommandQueue() +cq.undo() +cq.redo() +cq.undo_queue("add-item") +cq.undo_queue("set-color") +cq.undo_queue("set-pos") +cq.undo() +cq.redo() + +## +class Command(object): + def __repr__(self): + return "".format(self.cmd_type) + +class AddItemCommand(Command): + cmd_type = 'add-item' + + def __init__(self, ctx): + self.ctx = ctx + self.item = None + + def redo(self): + self.item = Item('unnamed') + self.ctx.scene.addItem(self.item) + self.ctx.item = self.item + + def undo(self): + self.ctx.scene.removeItem(self.item) + self.item = None + self.ctx.item = None + +class SetColorCommand(Command): + cmd_type = 'set-color' + + def __init__(self, ctx, color): + self.ctx = ctx + self.color = color + self.prevColor = self.ctx.item.color + + def redo(self): + self.ctx.item.setColor(self.color) + + def undo(self): + self.ctx.item.setColor(self.prevColor) +## + +scene = Scene() +ctx = Context() +commandqueue = CommandQueue() + +ctx.scene = scene + +addItemCmd = AddItemCommand(ctx) +addItemCmd.redo() +ctx.scene.items +ctx.item +commandqueue.undo_queue(addItemCmd) + +# ctx.scene.items +# ctx.item = ctx.scene.items[0] + +setColorCmd = SetColorCommand(ctx, 'blue') +setColorCmd.redo() +ctx.item +commandqueue.undo_queue(setColorCmd) + +cmd = commandqueue.undo() +cmd.undo() +ctx.item + +cmd = commandqueue.undo() +cmd.undo() +ctx.scene.items +ctx.item + +commandqueue.undo() + +commandqueue.redo().redo() +ctx.item +ctx.scene.items + +commandqueue.redo().redo() +ctx.item