from PySide.QtCore import *
from PySide.QtGui import *

class BaseWidget( QDockWidget ):

    def __init__( self, dbgCore, mainWindow, title = "", visible = False ):
        QDockWidget.__init__( self )
        self.setWindowTitle( title )
        self.setVisible( visible )
        mainWindow.addDockWidget( Qt.LeftDockWidgetArea, self )

        self.dbgCore=dbgCore
        self.mainWnd = mainWindow
        dbgCore.targetBreak.connect( self.onDbgBreak )
        dbgCore.targetRunning.connect( self.onDbgRun )
        dbgCore.targetAttached.connect( self.onDbgAttach )
        dbgCore.targetDetached.connect( self.onDbgDetach )    

    def addMenuTriggerAction( self, actionName ):
        self.action = QAction( actionName, self.mainWnd )
        self.action.triggered.connect(self.onTriggerAction) 
        self.action.setDisabled( True )
        self.mainWnd.viewMenu.addAction(self.action)

    def onDbgBreak(self):
        pass

    def onDbgRun(self):
        pass

    def onDbgAttach(self):
        pass

    def onDbgDetach(self):
        pass

    def onTriggerAction(self):
        self.setVisible( not self.isVisible() )


class DebugWidget( BaseWidget ):

    def __init__( self, dbgCore, mainWindow, title = "", visible = False ):
        BaseWidget.__init__( self, dbgCore, mainWindow, title, visible )
        self.action = None

    def onDbgAttach(self):
        if self.action != None:
            self.action.setDisabled( True )
        self.setDisabled( True )

    def onDbgDetach(self):
        if self.action != None:
            self.action.setDisabled( True )
        self.setDisabled( True )

    def onDbgBreak(self):
        if self.action != None:
            self.action.setDisabled( False )
        self.setDisabled( False )
        self.updateView()

    def onDbgRun(self):
        if self.action != None:
            self.action.setDisabled( True )
        self.setDisabled( True )

    def updateView(self):
        pass


class BaseController(QObject):

    def __init__(self,dbgCore,mainWindow):
        QObject.__init__(self,mainWindow)
        self.dbgCore=dbgCore
        self.mainWnd = mainWindow
        dbgCore.targetBreak.connect( self.onDbgBreak )
        dbgCore.targetRunning.connect( self.onDbgRun )
        dbgCore.targetAttached.connect( self.onDbgAttach )
        dbgCore.targetDetached.connect( self.onDbgDetach )    

    def onDbgBreak(self):
        self.onStateChange()

    def onDbgRun(self):
        self.onStateChange()

    def onDbgAttach(self):
        self.onStateChange()

    def onDbgDetach(self):
        self.onStateChange()

    def onStateChange(self):
        pass