class HardwareList(DropWidget, DragContainer, VerticalPanel):
    def __init__(self):
        VerticalPanel.__init__(self, StyleName='drophere')
        DropWidget.__init__(self)
        DragContainer.__init__(self)

    def changeTexts(self):
        for category in self.tabs.getChildren():
            category.changeTexts()

        for i in range(1, self.tabs.getTabBar().panel.getWidgetCount() - 1):
            self.tabs.getTabBar().panel.getWidget(
                i).getFocusablePanel().getWidget().changeTexts()

    def onLoad(self):
        self.tabs = TabPanel(FlowTabBar())
        self.tabs.getTabBar().addStyleName('shortcuts')
        self.tabs.getDeckPanel().addStyleName('blockDrawer')
        #------------------------------------------------------------------------------------------
        self.input = CategoriesHardware.Input()
        self.tabs.add(self.input,
                      CategoriesHardware.TabTitle(_('Input'), 'input_btn'))
        #------------------------------------------------------------------------------------------
        self.output = CategoriesHardware.Output()
        self.tabs.add(self.output,
                      CategoriesHardware.TabTitle(_('Output'), 'output_btn'))
        #------------------------------------------------------------------------------------------
        self.tabs.selectTab(0)
        panel = Element(Element=DOM.createDiv(), Width='100%', Height='100%')
        panel.append(self.tabs)
        #------------------------------------------------------------------------------------------
        self.trashCan = Widget(Element=DOM.createDiv(),
                               StyleName='trashCanClose')
        panel.append(self.trashCan)
        self.add(panel)
        #------------------------------------------------------------------------------------------
        bottom = Element(Element=DOM.createDiv(), StyleName='drawer_bottom')
        resize = ResizeWidget(self.parent, 200, 600)
        resize.addStyleName('float_right')
        bottom.append(resize)
        self.add(bottom)
        self.setCellHeight(bottom, '20px')

    def reload(self):
        pass

    def onDragStart(self, event):
        setDragStartPosition(event)

    def onDragEnd(self, event):
        getWorkspace().setMovingBlock(None)

    def onDragOver(self, event):
        if getWorkspace().getMovingBlock() is None: return
        dt = event.dataTransfer
        dt.dropEffect = 'copy'
        if hasattr(getWorkspace().getMovingBlock(), 'original'):
            if not getWorkspace().getMovingBlock().original:
                self.addStyleName('dragover')
                self.trashCan.setStyleName('trashCanOpen')
        DOM.eventPreventDefault(event)

    def onDragLeave(self, event):
        dt = event.dataTransfer
        dt.dropEffect = 'none'
        if hasattr(getWorkspace().getMovingBlock(), 'original'):
            if not getWorkspace().getMovingBlock().original:
                self.removeStyleName('dragover')
                self.trashCan.setStyleName('trashCanClose trashCanCloseFadeIn')

    def onDrop(self, event):
        if getWorkspace().getMovingBlock() is None: return
        self.removeStyleName('dragover')
        if hasattr(getWorkspace().getMovingBlock(), 'original'):
            if not getWorkspace().getMovingBlock().original:
                getWorkspace().getMovingBlock().removeFromParent()
                del hardwares[getWorkspace().getMovingBlock().getCompleteText(
                )]  # remove da lista de componentes
                getWorkspace().setMovingBlock(None)

                from edu.uca.util.Serializable import stateChange
                stateChange()

                self.trashCan.setStyleName("trashCanClose")

        DOM.eventPreventDefault(event)
Exemple #2
0
class BlockList(DropWidget, DragContainer, VerticalPanel):

    _blockDragListeners = []

    def __init__(self):
        VerticalPanel.__init__(self, StyleName='drophere')
        DropWidget.__init__(self)
        DragContainer.__init__(self)

    def changeTexts(self):
        for category in self.tabs.getChildren():
            category.changeTexts()

        for i in range(1, self.tabs.getTabBar().panel.getWidgetCount() - 1):
            self.tabs.getTabBar().panel.getWidget(
                i).getFocusablePanel().getWidget().changeTexts()

    def onLoad(self):
        self.tabs = TabPanel(FlowTabBar())
        # self.tabs.getTabBar().addStyleName('shortcuts') === gwt-TabBar
        # self.tabs.getDeckPanel().addStyleName('blockDrawer') === gwt-TabPanelBottom{
        #------------------------------------------------------------------------------------------
        self.control = CategoriesBlock.Control()
        self.tabs.add(self.control,
                      CategoriesBlock.TabTitle(_('Control'), 'control_btn'))
        #------------------------------------------------------------------------------------------
        self.operators = CategoriesBlock.Operators()
        self.tabs.add(
            self.operators,
            CategoriesBlock.TabTitle(_('Operators'), 'operators_btn'))
        #------------------------------------------------------------------------------------------
        self.input = CategoriesBlock.Input()
        self.tabs.add(self.input,
                      CategoriesBlock.TabTitle(_('Input'), 'input_btn'))
        #------------------------------------------------------------------------------------------
        self.output = CategoriesBlock.Output()
        self.tabs.add(self.output,
                      CategoriesBlock.TabTitle(_('Output'), 'output_btn'))
        #------------------------------------------------------------------------------------------
        self.utilities = CategoriesBlock.Setup()
        self.tabs.add(self.utilities,
                      CategoriesBlock.TabTitle(_('Utilities'), 'config_btn'))
        #------------------------------------------------------------------------------------------
        self.variables = CategoriesBlock.Variables()
        self.tabs.add(
            self.variables,
            CategoriesBlock.TabTitle(_('Variables'), 'variables_btn'))
        #------------------------------------------------------------------------------------------
        self.tabs.selectTab(0)
        panel = Element(Element=DOM.createDiv(), Width='100%', Height='100%')
        panel.append(self.tabs)
        #------------------------------------------------------------------------------------------
        self.trashCan = Widget(Element=DOM.createDiv(),
                               StyleName='trashCanClose')
        panel.append(self.trashCan)
        self.add(panel)
        #------------------------------------------------------------------------------------------
        bottom = Element(Element=DOM.createDiv(), StyleName='drawer_bottom')
        resize = ResizeWidget(self.parent, 200, 510)
        resize.addStyleName('float_right')
        bottom.append(resize)
        self.add(bottom)
        self.setCellHeight(bottom, '20px')

    def refreshComponentBlocks(self, components):
        self.input.removeAllSubComp()
        self.output.removeAllSubComp()
        listName = set([])
        for comp in components:
            if hasattr(comp, 'listBlockName'):
                for name in comp.listBlockName:
                    if not listName.__contains__(name):
                        listName.add(name)
                        block = getattr(ArduinoBlocks, name)()
                        block.changeTexts()
                        if comp.mode == INPUT:
                            self.input.getSubComp(comp.text).addBlock(block)
                        elif comp.mode == OUTPUT:
                            self.output.getSubComp(comp.text).addBlock(block)
        self.input.changeTexts()
        self.output.changeTexts()

    def reload(self):
        self.showMainBlock()
        for cat in self.tabs.children:
            cat.reload()

    def onDragStart(self, event):
        #print "Left: onDragStart"
        setDragStartPosition(
            event
        )  #verificar se realmente � necess�rio REMOVI (talvez tenha que colocar para undo)
        for listener in self._blockDragListeners:
            listener.onBlockDragStart(event, getWorkspace().getMovingBlock())

    def onDragEnd(self, event):
        for listener in self._blockDragListeners:
            listener.onBlockDragEnd(event, getWorkspace().getMovingBlock())
        getWorkspace().setMovingBlock(None)

    def onDragEnter(self, event):
        DOM.eventPreventDefault(event)

    def onDragOver(self, event):
        if getWorkspace().getMovingBlock() is None: return
        dt = event.dataTransfer
        dt.dropEffect = 'copy'
        if not getWorkspace().getMovingBlock().original:
            self.addStyleName('dragover')
            self.trashCan.setStyleName('trashCanOpen')

        DOM.eventPreventDefault(event)

    def onDragLeave(self, event):
        #print "Left: onDragLeave"
        if getWorkspace().getMovingBlock() is None: return
        dt = event.dataTransfer
        dt.dropEffect = 'none'
        if not getWorkspace().getMovingBlock().original:
            self.removeStyleName('dragover')
            self.trashCan.setStyleName('trashCanClose trashCanCloseFadeIn')

    def onDrop(self, event):
        #print "Left: onDrop"
        if getWorkspace().getMovingBlock() is None: return
        self.removeStyleName('dragover')
        if not getWorkspace().getMovingBlock().original:

            #do = (self.removeBlocks, [getWorkspace().getMovingBlock()])
            self.removeBlocks(getWorkspace().getMovingBlock())  #
            #history.add(do, getWorkspace().getUndo()) # � preciso saber de onde vem

            for listener in self._blockDragListeners:
                listener.onBlockDragEnd(event, getWorkspace().getMovingBlock())
            getWorkspace().getMovingBlock().onDragEnd()  #finaliza - para undo
            getWorkspace().setMovingBlock(None)

            from edu.uca.util.Serializable import stateChange
            stateChange()

            self.trashCan.setStyleName("trashCanClose")

    def removeBlocks(
            self, root):  # remove o bloco e seus subblocos da lista de blocos
        if root is None: return
        getWorkspace().removeBlock(root)  # Tentando remover um bloco original
        for holder in root.holderArguments:
            self.removeBlocks(holder.subBlock)
        for holder in root.holderChildren:
            self.removeBlocks(holder.subBlock)
        if root.holderSiblingDown is not None:
            self.removeBlocks(root.holderSiblingDown.subBlock)
        if isinstance(root, MainBlock):
            self.showMainBlock()
            getWorkspace().setMainBlock(None)
        root.removeFromParent()

#--------------------------------------------------------------------------------------------------------------

    def hideMainBlock(self):
        self.control.hideMainBlock()

    def showMainBlock(self):
        self.control.showMainBlock()

#--------------------------------------------------------------------------------------------------------------

    def addBlockDragListener(self, listener):
        self._blockDragListeners.append(listener)

    def removeBlockDragListener(self, listener):
        self._blockDragListeners.remove(listener)