class ViewMain(QMainWindow):
    """This Class Provides the Graphical Interface for Game"""

    # Use Constants To Avoid Magic Numbers
    
    # Declare stack widget names
    MAIN_PAGE = 0
    SETTINGS_PAGE = 1
    GAME_PAGE = 2
    INSTRUCTIONS_PAGE = 3
    CREDITS_PAGE = 4
    STORY_PAGE = 5
    SCORE_PAGE = 6

    finished = pyqtSignal()
    
    def __init__(self, parent=None):
        """Initialize the abstracted class instance"""
        super(ViewMain, self).__init__(parent)

        # Init Data Members
        self.gui  = Gui(self)
        self.game = None
        self.connectGui()

        self.gameWasLoaded = False
        self.useLoadWorkaround = True

        # Dictionary of Graphics Objects
        self.graphicsObjects = {}
        
        # Overlays
        self.overlays = {}
        
        self.currStackIndex = self.MAIN_PAGE
        self.gui.soundManager.playCurrMusic()
        #self.gui.soundManager.setVolume(0)
        
        # Timer initialization and setup for normal popups
        self.popupTimelineStart = QTimeLine(200)
        self.popupTimelineStart.setFrameRange(0,100)
        self.popupTimelineEnd = QTimeLine(200)
        self.popupTimelineEnd.setFrameRange(0,100)
        self.popupTimelineWait = QTimeLine()
        self.popupTimelineWait.setFrameRange(0,100)
        self.popupClue = False
        self.popupStory = False
        
        # Initialization and setup for animated popups
        self.popupAnimationOpen = QPropertyAnimation(self.gui.popup,"geometry")
        self.popupAnimationOpen.setDuration(200)
        self.popupAnimationOpen.setStartValue(QRect(0, 591, 0, 0))
        self.popupAnimationOpen.setEndValue(QRect(25, 25, 750, 450))
        self.popupAnimationClose = QPropertyAnimation(self.gui.popup,"geometry")
        self.popupAnimationClose.setDuration(200)
        self.popupAnimationClose.setStartValue(QRect(25, 25, 750, 450))
        self.popupAnimationClose.setEndValue(QRect(0, 591, 0, 0))
        self.popupAnimationWait = QTimeLine()
        
        self.toMain = False
        #self.gui.personView.centerOn(0,0)
        self.gui.mapView.centerOn(0,0)
        
########################################
### Signals and slots connected here ###
########################################

        # Connections for normal popups
        self.popupTimelineStart.frameChanged.connect(self.drawPopup)
        self.popupTimelineStart.finished.connect(self.popupWait)
        self.popupTimelineEnd.frameChanged.connect(self.erasePopup)   
        self.popupTimelineWait.finished.connect(self.enableErasePopup) 
        self.popupTimelineEnd.finished.connect(self.writeClue)
        
        # Connections for animated popups
        self.popupAnimationOpen.finished.connect(self.popupAnimationWait.start)
        self.popupAnimationWait.finished.connect(self.popupAnimationClose.start)
        self.popupAnimationClose.finished.connect(self.popupAnimationCleanup)
        self.finished.connect(self.writeStory)
    
    def connectGui(self):
        """Connect signals for Gui"""
        self.gui.actionQuit.triggered.connect(self.close)
        self.gui.quitButton.released.connect(self.close)
        self.gui.settingsButton.released.connect(self.setSettings)
        self.gui.actionSettings.triggered.connect(self.setSettings)
        self.gui.loadButton.released.connect(self.loadFileDialog)
        self.gui.actionSave_Game.triggered.connect(self.saveFileDialog)
        self.gui.doneButton.released.connect(self.goBack)
        self.gui.startButton.released.connect(self.enterName)
        self.gui.actionMain_Menu.triggered.connect(self.setMain)
        self.gui.actionHelp.triggered.connect(self.setInstructions)
        self.gui.instrButton.released.connect(self.setInstructions)
        self.gui.doneButton2.released.connect(self.goBack)
        self.gui.doneButton3.released.connect(self.goBack)
        self.gui.doneButtonScore.released.connect(self.scoreButton)
        self.gui.actionCredits.triggered.connect(self.setCredits)
        self.gui.latLongCheck.stateChanged.connect(self.latLong)
        self.gui.colorCheck.stateChanged.connect(self.colorize)
        self.gui.legendCheck.stateChanged.connect(self.legend)
        self.gui.searchButton.released.connect(self.doSearch)
        self.gui.nextButton.released.connect(self.storyButton)
        self.gui.volumeSlider.sliderMoved.connect(self.setVol)
        
    def connectGame(self):
        """Connect signals for Game"""
        self.game.places.passLoc.connect(self.addGraphicsObject)
        self.game.frameTimer.timeout.connect(self.frameUpdate)
        self.game.frameTimer.timeout.connect(self.game.story.frameTime)
        self.game.story.clueTrouble.connect(self.giveHint)

########################################
###### Custom slots defined here #######
########################################

    def setSettings(self):
        """Change to the settings page in the stack widget"""
        self.setStackWidgetIndex(self.SETTINGS_PAGE)
        
    def setInstructions(self):
        """Change to the instructions page in the stack widget"""
        self.setStackWidgetIndex(self.INSTRUCTIONS_PAGE)

    def setCredits(self):
        """Change to the credits page in the stack widget"""
        self.setStackWidgetIndex(self.CREDITS_PAGE)
        
    def goBack(self):
        """Return to the last primary page in the stack"""
        self.setStackWidgetIndex(self.gui.stackIndex)
        if self.gui.stackIndex == self.GAME_PAGE:
            self.gui.background.setPixmap(self.gui.backgroundPixmapSettings)
        else:
            self.gui.background.setPixmap(self.gui.backgroundPixmapMenu)
    
    def scoreButton(self):
        """Set widget to main menu after winning the game"""
        self.setStackWidgetIndex(self.MAIN_PAGE)
        self.gui.stackIndex = self.MAIN_PAGE
        
    def scoreWidget(self):
        """change to score widget"""
        self.game.loadScores()
        if self.game.topTen:
            text = "Congratulations "+ self.game.playerName+ \
                   ".\nYou make the Top Ten List !!"
        else:
            text = "Congratulations "+ self.game.playerName + \
                   ".\nYour score is "+ `self.game.story.score` + "!!"
        self.gui.scores.setText(text)
        self.displayHighScores()
        self.setStackWidgetIndex(self.SCORE_PAGE)
    
    def displayHighScores(self):
        """After player wins the game, we want to display
           the 10th high scores on screen
        """
        text = ""
        markCurr = 0 # Mark curr player if he made to the top ten list
        debug("len of scoreLIst is: ", len(self.game.scoreList))
        for prevPlayer in self.game.scoreList:
            prevName = prevPlayer[0]
            prevScore = prevPlayer[1]
            if (markCurr == 0 and prevName == self.game.playerName \
            and prevScore == self.game.story.score):
                markCurr = 1
                text = text + prevPlayer[0] + 40*"."  + `prevPlayer[1]` + "  *****" + "\n"
            else:
                text = text + prevPlayer[0] + 40*"."  + `prevPlayer[1]` + "\n"
        self.gui.topTenScores.setText(text)
        self.game.writeScoreToFile() 
 

    def enterName(self):
        """Name enter dialog"""
        playerName, ok = QInputDialog.getText(self, 'Enter Name Dialog', 
            'Please enter your name:')

        if ok and playerName!="":
            self.newGame()
            self.game.playerName = playerName
        else:
            pass
            
    def loadFileDialog(self):
        """pop up the loading dialog for players to choose saved file"""
        fd = QFileDialog()
        filename = fd.getOpenFileName(None, "Load Saved Game",
                                      "saves", "MapMaster Save files (*.save)")

        if isfile(filename):
            self.loadGame(filename)
        
            self.gameWasLoaded = True
            self.filename = filename
        else:
            debug("invalid file")

    def loadGame(self, filename):
        """pop up the loading dialog for players to choose saved file"""

        self.setStackWidgetIndex(self.GAME_PAGE)
        self.game = Game() 
        self.connectGame()
        self.game.load(filename)
        debug("Initializing the saved game...")
        
        
        self.overlays['latLongOverlay'] = self.addOverlay(
                    normpath("images/latOverlayNew.png"))
        self.overlays['colorOverlay'] = self.addOverlay(
                    normpath("images/colorOverlay.png"))
        self.overlays['legendOverlay'] = self.addOverlay(
                    normpath("images/legendOverlayNew.png"))

        self.gui.scoreBox.setText((str)(self.game.story.score))
        self.gui.clueView.setText(self.game.story.currClue['text'])
        self.gui.stackIndex = self.GAME_PAGE

    def saveFileDialog(self,toMain = False):
        """Dialog to save a game"""
        filename = QFileDialog.getSaveFileName(None, "Save Game", "saves", 
                                               "MapMaster Save files (*.save)")        
        if filename == "":
            return False
        else:
            if ".save" not in filename:
                debug(".save is not in the file, add one..")
                filename = filename + ".save"
            debug("correctly save data to file...",filename)
            self.game.save(filename)    
              
                        
    def newGame(self):
        """Start a new game"""
        self.gui.background.setPixmap(self.gui.backgroundPixmapSettings)
        self.setStackWidgetIndex(self.STORY_PAGE)
        self.gui.stackIndex = self.STORY_PAGE
        
        # Create game instance and start the game
        self.game = Game()
        self.connectGame()
        self.game.new()
        debug("Starting a new game")
        
        self.overlays['latLongOverlay'] = self.addOverlay(
                        normpath("images/latOverlayNew.png"))
        self.overlays['colorOverlay'] = self.addOverlay(
                        normpath("images/colorOverlay.png"))
        self.overlays['legendOverlay'] = self.addOverlay(
                        normpath("images/legendOverlayNew.png"))
        self.gui.clueView.setText(self.game.story.currClue['text'])
        self.gui.scoreBox.setText((str)(0))

        self.gameWasLoaded = False
        
    def storyButton(self):
        """Continue from the story page to the game page"""
        self.setStackWidgetIndex(self.GAME_PAGE)
        self.gui.stackIndex = self.GAME_PAGE

    def setMain(self):
        """Create a message box when player want to go back to main menu
           from the middle of the game. Make sure that player save the game.
        """
        quit_msg = "Go back to Main Menu will lose all the game, are you sure?"
        reply = QMessageBox()
        reply.setWindowTitle("Back to Main")
        reply.setText(quit_msg)
        reply.setStandardButtons(
             QMessageBox.Ok | QMessageBox.Save |  QMessageBox.Cancel)
        reply.setDefaultButton(QMessageBox.Save)
        ret = reply.exec_()
        
        if ret == QMessageBox.Ok:
            debug( "Go back to main menu" )
            self.gui.background.setPixmap(self.gui.backgroundPixmapMenu)
            self.setStackWidgetIndex(self.MAIN_PAGE)
            self.gui.stackIndex = self.MAIN_PAGE
        elif ret == QMessageBox.Cancel:
            debug("cancel back to main menu action...")
            pass
        else:
            if (self.saveFileDialog() == False):
                debug("Not save yet, go back to game...")
                pass
            else:
                debug("save and back to main menu...")
                self.gui.background.setPixmap(self.gui.backgroundPixmapMenu)
                self.setStackWidgetIndex(self.MAIN_PAGE)
                self.gui.stackIndex = self.MAIN_PAGE
        
    def setStackWidgetIndex(self, index):
        """Allow to switch between widgets."""
        if index == self.MAIN_PAGE:
            self.gui.background.setPixmap(self.gui.backgroundPixmapMenu)
        else:
            self.gui.background.setPixmap(self.gui.backgroundPixmapSettings)
    
        self.gui.stackedWidget.setCurrentIndex(index)
        self.currStackIndex = index
        self.gui.soundManager.switchSongs(index)
    
    def latLong(self):
        """Turn on/off latitude graphic overlays in the mapView"""
        if self.gui.latLongCheck.isChecked():
            debug("Lat/long overlay on")
        else:
            debug("Lat/long overlay off")
        self.overlays['latLongOverlay'].setVisible(
                                        self.gui.latLongCheck.isChecked())
    
    def colorize(self):
        """Turn on/off color coding graphic overlays in the mapView"""
        if self.gui.colorCheck.isChecked():
            debug("Color overlay on")
        else:
            debug("Color overlay off")
        self.overlays['colorOverlay'].setVisible(
                                        self.gui.colorCheck.isChecked())
                                        
    def legend(self):
        """Turn on/off legend graphic overlays in the mapView"""
        if self.gui.legendCheck.isChecked():
            debug("Legend overlay on")
        else:
            debug("Legend overlay off")
        self.overlays['legendOverlay'].setVisible(
                                        self.gui.legendCheck.isChecked())

    def setVol(self):
        """Set volumn level for the game"""
        self.gui.soundManager.setVolume(self.gui.volumeSlider.sliderPosition())
        
    def doSearch(self):
        """Begins searching for a clue"""
        self.popupClue = True
        self.popupMessage("Searching...", 2*ONE_SECOND)
    
    def writeClue(self):
        """Handles the result of searching for a clue"""
        self.popupStory = False
        if self.popupClue:
            clueResult = self.game.story.searchForClue(
                                        self.game.character.getCenter())
            self.handleClueResult(clueResult[0], clueResult[1])
            self.popupClue = False
            if clueResult[0] == 'ClueFound':
                self.popupMessageAnimated(
                        'You found a clue!\n' + clueResult[1], 4*ONE_SECOND)
                self.gui.soundManager.playSound("success")
            elif clueResult[0] == 'ClueFailed':
                self.popupMessage(clueResult[1], 2*ONE_SECOND)
                self.gui.soundManager.playSound("failure")
            elif clueResult[0] == 'GameOver':
                self.popupMessage(clueResult[1], 5*ONE_SECOND) 
                self.gui.soundManager.playSound("victory")
                QTimer.singleShot(4*ONE_SECOND, self.scoreWidget)
            else:
                None

    def writeStory(self):
        """Handles drawing story"""
        if self.game.story.currClue['story'] != 'none':
            self.popupStory = True
            self.popupMessage(self.game.story.currClue['story'], 5*ONE_SECOND)
           
    def drawPopup(self, value):
        """Draws the popup to the screen"""
        debug("Called drawPopup")
        if self.popupStory:
            self.gui.popupStoryImage.setOpacity(value/100.0)
        else:
            self.gui.popupImage.setOpacity(value/100.0)
        self.gui.popupText.setOpacity(value/100.0)
        
    def enableErasePopup(self):
        """Starts the timeline for erasePopup"""
        debug("Enabled erase popup")
        self.popupTimelineEnd.start()
        
    def erasePopup(self, value):
        """Erases the popup from the screen"""
        debug("Called erase popup")
        if self.popupStory:
            self.gui.popupStoryImage.setOpacity(1-(value/100.0))
        else:
            self.gui.popupImage.setOpacity(1-(value/100.0))
        self.gui.popupText.setOpacity(1-(value/100.0))
        
    def popupWait(self):
        """Keeps the popup on the screeen"""
        debug("Entered popupWait")
        self.popupTimelineWait.start()
        
    def popupMessageAnimated(self, text, time):
        """Uses an animated popup to display text for some time"""
        self.gui.popupText.setPlainText('')
        self.gui.popup.setGeometry(QRect(0, 591, 0, 0))
        self.gui.popupImage.setOpacity(1)
        self.popupAnimationWait.setDuration(time)
        self.popupAnimationOpen.start()
        self.gui.popupText.setPlainText(text)
        self.gui.popupText.setOpacity(1)
        
    def popupAnimationCleanup(self):
        """Returns the popup to its original state after it finishes"""
        self.gui.popupImage.setOpacity(0)
        self.gui.popupText.setOpacity(0)
        self.gui.popup.setGeometry(QRect(25, 25, 750, 450))
        self.finished.emit()
        
    def handleClueResult(self, action, text):
        """Performs the writing to gui after a clue was found"""
        if action == 'ClueFound':
            self.gui.clueView.setText(text)
            self.gui.scoreBox.setText(`self.game.story.score`)
        elif action == 'GameOver':
            self.gui.clueView.setText(text)
        else:
            None
            
    def giveHint(self):
        """If the player has been stuck on a clue, give a hint"""
        text = self.game.story.troubleFindingClue()
        self.popupMessage(text, 5*ONE_SECOND)
    
    def popupMessage(self, text, time):
        """Displays the given text for the given time in a popup"""
        self.gui.popupText.setPlainText(text)
        self.popupTimelineWait.setDuration(time)
        self.popupTimelineStart.start()
       
    def keyPressEvent(self, event):
        """Get keyboard events no matter what widget has focus"""
        if self.game and (self.gui.stackIndex == self.GAME_PAGE):
            self.game.keyPress(event)

        #Work around to make load work.
        if self.useLoadWorkaround and self.gameWasLoaded:
            self.game = Game() 
            self.connectGame()
            self.game.load(self.filename)
            
            debug("use work round")
            self.useLoadWorkaround = False

            self.overlays['latLongOverlay'] = self.addOverlay(
                    normpath("images/latOverlayNew.png"))
            self.overlays['colorOverlay'] = self.addOverlay(
                        normpath("images/colorOverlay.png"))
            self.overlays['legendOverlay'] = self.addOverlay(
                        normpath("images/legendOverlayNew.png"))
        
    
    def keyReleaseEvent(self, event):
        """Get keyboard events no matter what widget has focus"""
        if self.game and (self.gui.stackIndex == self.GAME_PAGE):
            key = event.key()
            if key==Qt.Key_Space or key==Qt.Key_Enter or key==Qt.Key_Return:
                self.doSearch()
            elif key==Qt.Key_L:
                debug('Character location is ' 
                        + `self.game.character.getCenter()`)
            else:
                self.game.keyRelease(event)
    
    def closeEvent(self, event):
        """Remapping the close event to a message box"""
        quit_msg = "Are you sure you want to quit?"
        reply = QMessageBox()
        reply.setWindowTitle("Quit Game")
        reply.setText(quit_msg)
        reply.setStandardButtons(
            QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
        reply.setDefaultButton(QMessageBox.Save)
        ret = reply.exec_()
        
        if ret == QMessageBox.Discard:
            debug("Accepting close event")
            event.accept()
        elif ret == QMessageBox.Cancel:
            event.ignore()
        else:
            if (self.saveFileDialog() == False):
                debug("Not quit yet, go back to game...")
                event.ignore()
            else:
                debug("Accepting close event")
                event.accept()

    def addGraphicsObject(self, name, xval, yval, objType):
        """Add graphics object to the person veiw and map view properly and
        leave a graphics object in ViewMain to handle it. """
        debug("Receiving passLoc")
        graphic = Graphic(xval, yval, str(name), str(objType))
        graphic.createInitial(self.gui.personView, self.gui.mapView)
        self.graphicsObjects[name] = graphic
        self.game.places.locList[str(name)].changePos.connect(
                                        self.updateGraphicsObject)
        debug("Connecting Loc to Graphic for " + name)
        
        self.game.places.locList[str(name)].emitter()
        
    def updateGraphicsObject(self, xpos, ypos, name):
        """Changes the position of the character on the screen"""
        self.graphicsObjects[name].update(xpos, ypos)
        
    def addOverlay(self, filename):
        """Adds an overlay to the map view"""
        obj = self.gui.mapView.scene.addPixmap(QPixmap(filename))
        obj.setX(-195)
        obj.setY(-250)
        obj.setVisible(False)
        return obj
        
    def frameUpdate(self):
        """One tick of the game clock sent to the character"""
        self.game.character.frameUpdate(self.game.FRAME_RATE)
class ViewMain(QMainWindow):
    """This Class Provides the Graphical Interface for Game"""

    # Use Constants To Avoid Magic Numbers
    
    # Declare stack widget names
    MAIN_PAGE = 0
    SETTINGS_PAGE = 1
    GAME_PAGE = 2
    INSTRUCTIONS_PAGE = 3
    CREDITS_PAGE = 4
    STORY_PAGE = 5
    
    def __init__(self, parent=None):
        """Initialize the abstracted class instance"""
        super(ViewMain, self).__init__(parent)

        # Init Data Members
        self.gui  = Gui(self)
        self.game = None
        self.connectGui()
        self.messageFade = None

        # Dictionary of Graphics Objects
        self.graphicsObjects = {}
        
        # Overlays
        self.overlays = {}
        
        self.currStackIndex = self.MAIN_PAGE
        self.gui.soundManager.playCurrMusic()
        self.gui.soundManager.setVolume(0)
        
        self.popupTimelineStart = QTimeLine(200)
        self.popupTimelineStart.setFrameRange(0,100)
        self.popupTimelineEnd = QTimeLine(200)
        self.popupTimelineEnd.setFrameRange(0,100)
        self.popupTimelineWait = QTimeLine()
        self.popupTimelineWait.setFrameRange(0,100)
        self.popupClue = False
        
        self.toMain = False
        #self.gui.personView.centerOn(0,0)
        #self.gui.mapView.centerOn(0,0)
        
########################################
### Signals and slots connected here ###
########################################

        self.popupTimelineStart.frameChanged.connect(self.drawPopup)
        self.popupTimelineStart.finished.connect(self.popupWait)
        self.popupTimelineEnd.frameChanged.connect(self.erasePopup)   
        self.popupTimelineWait.finished.connect(self.enableErasePopup) 
    
    def connectGui(self):
        """Connect signals for Gui"""
        self.gui.actionQuit.triggered.connect(self.close)
        self.gui.quitButton.released.connect(self.close)
        self.gui.settingsButton.released.connect(self.setSettings)
        self.gui.actionSettings.triggered.connect(self.setSettings)
        self.gui.loadButton.released.connect(self.loadFileDialog)
        self.gui.actionSave_Game.triggered.connect(self.saveFileDialog)
        self.gui.doneButton.released.connect(self.goBack)
        self.gui.startButton.released.connect(self.newGame)
        self.gui.actionMain_Menu.triggered.connect(self.setMain)
        self.gui.actionHelp.triggered.connect(self.setInstructions)
        self.gui.instrButton.released.connect(self.setInstructions)
        self.gui.doneButton2.released.connect(self.goBack)
        self.gui.doneButton3.released.connect(self.goBack)
        self.gui.actionCredits.triggered.connect(self.setCredits)
        self.gui.latLongCheck.stateChanged.connect(self.latLong)
        self.gui.colorCheck.stateChanged.connect(self.colorize)
        self.gui.legendCheck.stateChanged.connect(self.legend)
        self.gui.searchButton.released.connect(self.doSearch)
        self.gui.nextButton.released.connect(self.storyButton)
        self.gui.volumeSlider.sliderMoved.connect(self.setVol)
        
    def connectGame(self):
        # character (emits when updates) , emits newpos
        # places (emits when loc added), emits loc and signal
        # - viewMain connects that signal between the location obj and 
        # - the graphics obj
        # story (emits when working on a clue for too long), emits nothing
        # story (emits signal updating search progress), emits 0-1
        # story (emits signal for message fade), emits 1-0
        self.game.places.passLoc.connect(self.addGraphicsObject)
        self.game.story.searchTime.connect(self.enableErasePopup)
        self.game.story.clueResult.connect(self.handleClueResult)
        self.game.frameTimer.timeout.connect(self.frameUpdate)

########################################
###### Custom slots defined here #######
########################################

    def setSettings(self):
        self.setStackWidgetIndex(self.SETTINGS_PAGE)
        
    def setInstructions(self):
        self.setStackWidgetIndex(self.INSTRUCTIONS_PAGE)

    def setCredits(self):
        self.setStackWidgetIndex(self.CREDITS_PAGE)
        
    def goBack(self):
        self.setStackWidgetIndex(self.gui.stackIndex)
        if self.gui.stackIndex == self.GAME_PAGE:
            self.gui.background.setPixmap(self.gui.backgroundPixmapSettings)
        else:
            self.gui.background.setPixmap(self.gui.backgroundPixmapMenu)
            #Should be something here later
    
    def loadFileDialog(self):
        
        fd = QFileDialog()
        filename = fd.getOpenFileName(None, "Load Saved Game",
                                      "saves", "MapMaster Save files (*.save)")
        
        if isfile(filename):
            self.setStackWidgetIndex(self.GAME_PAGE)
            self.game = Game() 
            self.connectGame()
            self.game.load(filename)
            debug("Initializing the saved game...")
            
            
            self.overlays['latLongOverlay'] = self.addOverlay(
                        normpath("images/latOverlay.png"))
            self.overlays['colorOverlay'] = self.addOverlay(
                        normpath("images/colorOverlay.png"))
            self.overlays['legendOverlay'] = self.addOverlay(
                        normpath("images/legendOverlay.png"))

            self.gui.scoreBox.setText((str)(self.game.story.score))
            self.gui.clueView.setText(self.game.story.currClue['text'])
            self.gui.stackIndex = self.GAME_PAGE

    def saveFileDialog(self,toMain = False):
        filename = QFileDialog.getSaveFileName(None, "Save Game", "saves", 
                                               "MapMaster Save files (*.save)")
        if filename == "":
            return False
        else:
            if ".save" not in filename:
                debug(".save is not in the file, add one..")
                filename = filename + ".save"
            debug("correctly save data to file...",filename)
            self.game.save(filename)    
               
                        
    def newGame(self):
        self.gui.background.setPixmap(self.gui.backgroundPixmapSettings)
        self.setStackWidgetIndex(self.STORY_PAGE)
        self.gui.stackIndex = self.GAME_PAGE
        
        # Create game instance and start the game
        self.game = Game()
        debug("Initialized a new game")
        self.connectGame()
        self.game.new()
        debug("Starting a new game")
        
        self.overlays['latLongOverlay'] = self.addOverlay(
                        normpath("images/latOverlay.png"))
        self.overlays['colorOverlay'] = self.addOverlay(
                        normpath("images/colorOverlay.png"))
        self.overlays['legendOverlay'] = self.addOverlay(
                        normpath("images/legendOverlay.png"))
        self.gui.clueView.setText(self.game.story.currClue['text'])
        
    def storyButton(self):
        self.setStackWidgetIndex(self.GAME_PAGE)
        
    def setMain(self):
        if (self.saveFileDialog() == False):
            pass
        else:
            self.gui.background.setPixmap(self.gui.backgroundPixmapMenu)
            self.setStackWidgetIndex(self.MAIN_PAGE)
            self.gui.stackIndex = self.MAIN_PAGE
        
    def setStackWidgetIndex(self, index):
        if index == self.MAIN_PAGE:
            self.gui.background.setPixmap(self.gui.backgroundPixmapMenu)
        else:
            self.gui.background.setPixmap(self.gui.backgroundPixmapSettings)
    
        self.gui.stackedWidget.setCurrentIndex(index)
        self.currStackIndex = index
        self.gui.soundManager.switchSongs(index)
    
    def latLong(self):
        if self.gui.latLongCheck.isChecked():
            debug("Lat/long overlay on")
        else:
            debug("Lat/long overlay off")
        self.overlays['latLongOverlay'].setVisible(
                                        self.gui.latLongCheck.isChecked())
    
    def colorize(self):
        if self.gui.colorCheck.isChecked():
            debug("Color overlay on")
        else:
            debug("Color overlay off")
        self.overlays['colorOverlay'].setVisible(
                                        self.gui.colorCheck.isChecked())
                                        
    def legend(self):
        if self.gui.legendCheck.isChecked():
            debug("Legend overlay on")
        else:
            debug("Legend overlay off")
        self.overlays['legendOverlay'].setVisible(
                                        self.gui.legendCheck.isChecked())

    def setVol(self):
        self.gui.soundManager.setVolume(self.gui.volumeSlider.sliderPosition())
        
    def doSearch(self):
        self.game.story.searchForClue(self.game.character.getCenter())
        self.popupClue = True
        self.gui.popupText.setPlainText("Searching...")
        self.popupTimelineStart.start()
        
        
    def drawPopup(self, value):
        debug("Called drawPopup")
        self.gui.popupImage.setOpacity(value/100.0)
        self.gui.popupText.setOpacity(value/100.0)
        
    def enableErasePopup(self):
        debug("Enabled erase popup")
        self.popupClue = False
        self.popupTimelineEnd.start()
        
    def erasePopup(self, value):
        debug("Called erase popup")
        self.gui.popupImage.setOpacity(1-(value/100.0))
        self.gui.popupText.setOpacity(1-(value/100.0))
        
    def popupWait(self):
        debug("Entered popupWait")
        if not self.popupClue:
            self.popupTimelineWait.start()
        
    # FIXME This needs time actions
    def handleClueResult(self, action, text):
        if action == 'ClueFound':
            #self.popupMessage("You found a clue!", 2000)
            self.gui.clueView.setText(text)
            self.gui.scoreBox.setText(`self.game.story.score`)
        elif action == 'GameOver':
            self.gui.clueView.setText(text)
        else:
            None
    
    def popupMessage(self, text, time):
        self.gui.popupText.setPlainText(text)
        self.popupTimelineWait.setDuration(time)
        self.popupTimelineStart.start()
        
    def keyPressEvent(self, event):
        """Get keyboard events no matter what widget has focus"""
        if self.game:
            self.game.keyPress(event)
    
    def keyReleaseEvent(self, event):
        """Get keyboard events no matter what widget has focus"""
        if self.game:
            key = event.key()
            if key == Qt.Key_Space or key == Qt.Key_Enter or key == Qt.Key_Return:
                self.doSearch()
            else:
                self.game.keyRelease(event)
    
    def closeEvent(self, event):
        """Remapping the close event to a message box"""
        quit_msg = "Are you sure you want to quit?"
        reply = QMessageBox()
        reply.setWindowTitle("Quit Game")
        reply.setText(quit_msg)
        reply.setStandardButtons(
            QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
        reply.setDefaultButton(QMessageBox.Save)
        ret = reply.exec_()
        
        if ret == QMessageBox.Discard:
            print "Accepting close event"
            event.accept()
        elif ret == QMessageBox.Cancel:
            event.ignore()
        else:
            if (self.saveFileDialog() == False):
                debug("Not quit yet, go back to game...")
                event.ignore()
            else:
                print "Accepting close event"
                event.accept()

    def addGraphicsObject(self, name, xval, yval, objType):
        """Add graphics object to the person veiw and map view properly and
        leave a graphics object in ViewMain to handle it. """
        debug("Receiving passLoc")
        graphic = Graphic(xval, yval, str(name), str(objType))
        graphic.createInitial(self.gui.personView, self.gui.mapView)
        self.graphicsObjects[name] = graphic
        self.game.places.locList[str(name)].changePos.connect(
                                        self.updateGraphicsObject)
        debug("Connecting Loc to Graphic for " + name)
        
        self.game.places.locList[str(name)].emitter()
        
        #self.graphicsObjects.append(graphic)
    def updateGraphicsObject(self, xpos, ypos, name):
        #debug("Updating the graphics object")
        self.graphicsObjects[name].update(xpos, ypos)
        
    def addOverlay(self, filename):
        obj = self.gui.mapView.scene.addPixmap(QPixmap(filename))
        obj.setX(-195)
        obj.setY(-250)
        obj.setVisible(False)
        return obj
        
    def frameUpdate(self):
        #debug('Frame update sent to character')
        self.game.character.frameUpdate(self.game.FRAME_RATE)