Example #1
0
 def __init__(self, swf):
     super(ScaleformLayout, self).__init__()
     self.config = TutorialConfig()
     self.loader = TutorialUILoader(weakref.proxy(self), swf)
     self._guiRef = None
     self._movieView = None
     self._commands = ScaleformCommandsFactory()
     return
Example #2
0
 def __init__(self, swf):
     super(ScaleformLayout, self).__init__()
     self.config = TutorialConfig()
     self.loader = TutorialUILoader(weakref.proxy(self), swf)
     self._guiRef = None
     self._movieView = None
     self._commands = ScaleformCommandsFactory()
Example #3
0
 def __init__(self, effectPlayer):
     super(SfLobbyProxy, self).__init__()
     self.config = TutorialConfig()
     self.items = ItemsManager()
     self.effects = effectPlayer
Example #4
0
class SfLobbyProxy(GUIProxy, AppRef):
    __dispatcher = None

    def __init__(self, effectPlayer):
        super(SfLobbyProxy, self).__init__()
        self.config = TutorialConfig()
        self.items = ItemsManager()
        self.effects = effectPlayer

    @proto_getter(PROTO_TYPE.BW)
    def proto(self):
        return None

    def getViewSettings(self):
        raise Exception, 'Routine getViewSettings must be implemented'

    def init(self):
        result = False
        if self.app is not None:
            loader = self.app.loaderManager
            loader.onViewLoadInit += self.__onViewLoadInit
            loader.onViewLoadError += self.__onViewLoadError
            addSettings = g_entitiesFactories.addSettings
            try:
                for settings in self.getViewSettings():
                    addSettings(settings)

                self.app.varsManager.setTutorialRunning(True)
                result = True
            except Exception:
                LOG_CURRENT_EXCEPTION()

        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.findGUI()
            self.onGUILoaded()
        return result

    def fini(self, isItemsRevert = True):
        self.eManager.clear()
        self.effects.stopAll()
        if self.app is not None:
            loader = self.app.loaderManager
            loader.onViewLoadInit -= self.__onViewLoadInit
            loader.onViewLoadError -= self.__onViewLoadError
            removeSettings = g_entitiesFactories.removeSettings
            for settings in self.getViewSettings():
                removeSettings(settings.alias)

            self.app.varsManager.setTutorialRunning(False)
        return

    def clear(self):
        self.clearChapterInfo()
        self.effects.stopAll()

    def lock(self):
        self.showWaiting('update-scene', isSingle=True)

    def release(self):
        self.hideWaiting('update-scene')

    def loadConfig(self, filePath):
        self.config.loadConfig(filePath)

    def reloadConfig(self, filePath):
        self.config.reloadConfig(filePath)

    def getSceneID(self):
        sceneID = None
        container = self.app.containerManager.getContainer(ViewTypes.LOBBY_SUB)
        if container is not None:
            pyView = container.getView()
            if pyView is not None:
                sceneID = self.config.getSceneID(pyView.settings.alias)
        LOG_DEBUG('GUI.getSceneID', sceneID)
        return sceneID

    def goToScene(self, sceneID):
        method = self.config.getGoToSceneMethod(sceneID)
        if method:
            g_eventBus.handleEvent(events.LoadViewEvent(method), scope=EVENT_BUS_SCOPE.LOBBY)

    def playEffect(self, effectName, args, itemRef = None, containerRef = None):
        return self.effects.play(effectName, args)

    def stopEffect(self, effectName, effectID):
        self.effects.stop(effectName, effectID)

    def showWaiting(self, messageID, isSingle = False):
        Waiting.show('tutorial-{0:>s}'.format(messageID), isSingle=isSingle)

    def hideWaiting(self, messageID = None):
        if messageID is not None:
            Waiting.hide('tutorial-{0:>s}'.format(messageID))
        else:
            Waiting.close()
        return

    def showMessage(self, text, lookupType = None):
        guiType = None
        if type is not None:
            guiType = SystemMessages.SM_TYPE.lookup(lookupType)
        if guiType is None:
            guiType = SystemMessages.SM_TYPE.Information
        SystemMessages.pushMessage(text, type=guiType)
        return

    def showI18nMessage(self, key, *args, **kwargs):
        guiType = None
        if 'type' in kwargs:
            guiType = SystemMessages.SM_TYPE.lookup(kwargs['type'])
        if guiType is None:
            guiType = SystemMessages.SM_TYPE.Information
        kwargs['type'] = guiType
        SystemMessages.pushI18nMessage(key, *args, **kwargs)
        return

    def showServiceMessage(self, data, msgTypeName):
        msgType = None
        if msgTypeName is not None:
            msgType = getattr(SCH_CLIENT_MSG_TYPE, msgTypeName, None)
        if msgType is None:
            LOG_ERROR('Message type not found', msgType)
        if self.proto:
            self.proto.serviceChannel.pushClientMessage(data, msgType)
        return

    def isGuiDialogDisplayed(self):
        container = self.app.containerManager.getContainer(ViewTypes.TOP_WINDOW)
        result = False
        if container is not None:
            dialogCount = container.getViewCount(isModal=True)
            if dialogCount > 0:
                if self.effects.isStillRunning(GUI_EFFECT_NAME.SHOW_DIALOG):
                    dialogCount -= 1
                result = dialogCount > 0
        return result

    def isTutorialDialogDisplayed(self, dialogID):
        return self.effects.isStillRunning(GUI_EFFECT_NAME.SHOW_DIALOG, effectID=dialogID)

    def isTutorialWindowDisplayed(self, windowID):
        return self.effects.isStillRunning(GUI_EFFECT_NAME.SHOW_WINDOW, effectID=windowID)

    def findItem(self, itemID, criteria):
        if criteria is None:
            item = self.config.getItem(itemID)
            valuePath = None
            value = None
        else:
            parentID, valuePath, value = criteria
            item = self.config.getItem(parentID)
        return self.items.findTargetByCriteria(item['path'], valuePath, value)

    @classmethod
    def setDispatcher(cls, dispatcher):
        cls.__dispatcher = dispatcher

    @classmethod
    def getDispatcher(cls):
        return cls.__dispatcher

    def setChapterInfo(self, title, description):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setChapterInfo(title, description)
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def clearChapterInfo(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.clearChapterInfo()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def setTrainingRestartMode(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setTrainingRestartMode()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def setTrainingRunMode(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setTrainingRunMode()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def setPlayerXPLevel(self, level):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setPlayerXPLevel(level)
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def __onViewLoadInit(self, pyEntity):
        if pyEntity.settings.type is ViewTypes.LOBBY_SUB:
            pageName = pyEntity.settings.alias
            sceneID = self.config.getSceneID(pageName)
            LOG_DEBUG('GUI.onPageChanging', sceneID)
            if sceneID is None:
                self.clear()
                LOG_WARNING('Scene alias not found, page:', pageName)
            else:
                self.effects.stopAll()
                self.onPageChanging(sceneID)
        return

    def __onViewLoadError(self, name, msg, item):
        if item is not None:
            effectID = item.name
            for effectName in [GUI_EFFECT_NAME.SHOW_DIALOG, GUI_EFFECT_NAME.SHOW_WINDOW]:
                if self.effects.isStillRunning(effectName, effectID=effectID):
                    self.effects.stop(effectName, effectID=effectID)
                    break

        return
 def __init__(self):
     super(TutorialLayout, self).__init__()
     self.config = TutorialConfig()
     self._guiRef = None
     self._dispatcherRef = None
     return
class TutorialLayout(GUIProxy, UIInterface):

    def __init__(self):
        super(TutorialLayout, self).__init__()
        self.config = TutorialConfig()
        self._guiRef = None
        self._dispatcherRef = None
        return

    def __del__(self):
        LOG_DEBUG('TutorialLayout deleted')

    def populateUI(self, proxy):
        super(TutorialLayout, self).populateUI(proxy)
        self.uiHolder.addFsCallbacks({'Tutorial.MouseClicked': self.__dispatchMouseClickEvent})
        self.uiHolder.addExternalCallbacks({'Loader.LoadStart': self.__dispatchPageChangingEvent,
         'Tutorial.GetScreenSize': self.__onGetScreenSize})

    def dispossessUI(self):
        self.uiHolder.removeFsCallbacks('Tutorial.MouseClicked')
        self.uiHolder.removeExternalCallback('Loader.LoadStart', function=self.__dispatchPageChangingEvent)
        self.uiHolder.removeExternalCallback('Tutorial.GetScreenSize')
        super(TutorialLayout, self).dispossessUI()

    def init(self):
        try:
            window = WindowsManager.g_windowsManager.window
            self._guiRef = weakref.ref(window)
            proxy = window.proxy
            dispatcher = window.tutorialDispatcher
            if dispatcher is None:
                dispatcher = TutorialDispatcher()
                dispatcher.populateUI(proxy)
                window.tutorialDispatcher = dispatcher
            self._dispatcherRef = weakref.ref(dispatcher)
        except AttributeError:
            LOG_CURRENT_EXCEPTION()
            return False

        self.populateUI(proxy)
        try:
            movie = self.uiHolder.movie
            movie.invoke(('_root.tutorialLoader.loadTutorial', ['TutorialLayout.swf']))
            LOG_DEBUG("load 'TutorialLayout.swf'")
            self.setTrainingRunMode()
            self.call('common.closeAllWindows')
        except Exception:
            LOG_CURRENT_EXCEPTION()
            return False

        return True

    def clear(self):
        if self._guiRef is not None and self._guiRef() is not None:
            self.clearChapterInfo()
            self.call('Tutorial.Effects.Stop')
            self.call('Tutorial.Areas.Destroy', [False, True])
            self.call('Tutorial.Items.ResetAll')
            self.call('common.closeAllWindows')
        return

    def fini(self):
        self.eManager.clear()
        if self._guiRef is None or self._guiRef() is None:
            return
        else:
            try:
                self.call('common.closeAllWindows')
                movie = self.uiHolder.movie
                movie.invoke(('_root.tutorialLoader.unloadTutorial', []))
                LOG_DEBUG("unload 'TutorialLayout.swf'")
            except Exception:
                LOG_CURRENT_EXCEPTION()
                return False

            self.dispossessUI()
            return

    def loadConfig(self, filePath):
        self.config.loadConfig(filePath)

    def reloadConfig(self, filePath):
        self.config.reloadConfig(filePath)

    def updateLockedAreas(self, areas):
        getter = self.config.getArea
        args = []
        for area in areas:
            areaID = area.getID()
            props = getter(areaID)
            if props['path'] is None:
                LOG_ERROR('TUTORIAL. Target path for locked area not found ', areaID)
                continue
            args.extend([areaID,
             props['path'],
             props['lockedSymbol'],
             props['position'][0],
             props['position'][1],
             props['size'][0],
             props['size'][1],
             props['changeSize'],
             props['lockedPopUp']])

        self.call('Tutorial.LockedAreas.Update', args)
        return

    def updateActiveAreas(self, areas):
        areaGetter = self.config.getArea
        itemGetter = self.config.getItem
        args = []
        for area in areas:
            areaID = area.getID()
            props = areaGetter(area.getID())
            path = props['path']
            targetID = props['targetID']
            if path is None or targetID is None:
                targetID = area.getTargetID()
                item = itemGetter(targetID)
                if item is not None:
                    path = item['path']
                else:
                    LOG_ERROR('TUTORIAL. Target path for active area not found', areaID)
                    continue
            if targetID is None or path is None:
                LOG_WARNING('TUTORIAL. Target path or ID for active area not found', areaID, targetID, path)
                continue
            action = area.getAction(targetID)
            if action is not None:
                actionType = action.getType()
            else:
                actionType = 0
            args.extend([areaID,
             targetID,
             path,
             props['position'][0],
             props['position'][1],
             props['size'][0],
             props['size'][1],
             area.isUseMask(),
             area.getHideMaskMode(),
             props['changeSize'],
             actionType])

        self.call('Tutorial.ActiveAreas.Update', args)
        return

    def getSceneID(self):
        result = None
        if not Waiting.isVisible():
            guiPage = self.uiHolder.currentInterface
            result = self.config.getSceneID(guiPage)
        return result

    def goToScene(self, sceneID):
        method = self.config.getGoToSceneMethod(sceneID)
        if method is not None:
            self.uiHolder.movie.invoke((method,))
        return

    def playEffect(self, effectName, args, itemRef = None, containerRef = None):
        if itemRef is not None:
            item = self.config.getItem(itemRef)
            if item is None:
                LOG_ERROR('TUTORIAL. GUI Item not found', effectName, itemRef)
                return
            if args is None:
                args = []
            args.append(item['path'])
        if containerRef is not None:
            container = self.config.getItem(containerRef)
            if container is None:
                LOG_ERROR('TUTORIAL. GUI Item not found', effectName, containerRef)
                return
            if args is None:
                args = []
            args.append(container['path'])
        self.call('Tutorial.Effects.{0:>s}.Play'.format(effectName), args)
        return

    def stopEffect(self, effectName, effectID):
        self.call('Tutorial.Effects.{0:>s}.Stop'.format(effectName), [effectID])

    def showWaiting(self, messageID, isSingle = False):
        Waiting.show('tutorial-{0:>s}'.format(messageID), isSingle=isSingle)

    def hideWaiting(self, messageID):
        if Waiting.isVisible():
            Waiting.hide('tutorial-{0:>s}'.format(messageID))

    def showErrorMessage(self, key, *args, **kwargs):
        kwargs['type'] = SystemMessages.SM_TYPE.Error
        SystemMessages.g_instance.pushI18nMessage(key, *args, **kwargs)

    def setItemProps(self, itemRef, props, revert = False):
        item = self.config.getItem(itemRef)
        if item is None:
            LOG_ERROR('TUTORIAL. GUI Item not found', itemRef)
            return
        else:
            args = [itemRef, item['path'], revert]
            for name, value in props.iteritems():
                args.extend([name, value])

            self.call('Tutorial.Items.SetProps', args)
            return

    def isGuiDialogDisplayed(self):
        result = False
        try:
            result = self.uiHolder.movie.invoke(('_root.tutorialLoader.isGuiDialogDisplayed', []))
        except Exception:
            LOG_CURRENT_EXCEPTION()

        return result

    def isTutorialDialogDisplayed(self, dialogID):
        result = True
        try:
            result = self.uiHolder.movie.invoke(('_root.tutorialLoader.isTutorialDialogDisplayed', [dialogID]))
        except Exception:
            LOG_CURRENT_EXCEPTION()

        return result

    def findItem(self, itemID, criteria):
        itemPath = None
        if criteria is None:
            item = self.config.getItem(itemID)
            locked = True
            valuePath = None
            value = None
        else:
            parentID, valuePath, value = criteria
            item = self.config.getItem(parentID)
            locked = False
        try:
            itemPath = self.uiHolder.movie.invoke(('_root.tutorialLoader.findItem', [item['path'], valuePath, value]))
            if not locked:
                if itemPath is not None:
                    self.config.addItem(itemID, itemPath)
                else:
                    self.config.removeItem(itemID)
        except Exception:
            LOG_CURRENT_EXCEPTION()

        return itemPath

    def invokeCommand(self, command):
        name, args = command
        self.uiHolder.call(name, args[:])

    def getGuiRoot(self):
        try:
            root = WindowsManager.g_windowsManager.window
        except AttributeError:
            LOG_CURRENT_EXCEPTION()
            root = None

        return root

    @classmethod
    def defineDispatcher(cls):
        dispatcher = None
        try:
            window = WindowsManager.g_windowsManager.window
            dispatcher = getattr(window, 'tutorialDispatcher', None)
            if dispatcher is None and window is not None:
                dispatcher = TutorialDispatcher()
                dispatcher.populateUI(window.proxy)
                window.tutorialDispatcher = dispatcher
        except AttributeError:
            LOG_CURRENT_EXCEPTION()

        return dispatcher

    def setChapterInfo(self, title, description):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().setChapterInfo(title, description)
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def clearChapterInfo(self):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().clearChapterInfo()
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def setTrainingRestartMode(self):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().setTrainingRestartMode()
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def setTrainingRunMode(self):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().setTrainingRunMode()
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def __dispatchMouseClickEvent(self, targetID):
        self.onMouseClicked(GUIEvent(None, targetID))
        return

    def __dispatchPageChangingEvent(self, _, pageName):
        sceneID = self.config.getSceneID(pageName)
        if sceneID is None:
            self.clear()
            LOG_DEBUG('TUTORIAL. Scene alias not found, page:', pageName)
        else:
            self.call('Tutorial.Effects.Stop')
            self.onPageChanging(sceneID)
        return

    def __onGetScreenSize(self, *args):
        parser = CommandArgsParser(self.__onGetScreenSize.__name__)
        parser.parse(*args)
        parser.addArgs(list(GUI.screenResolution()))
        self.uiHolder.respond(parser.args())
Example #7
0
class ScaleformLayout(GUIProxy, UIInterface):

    def __init__(self, swf):
        super(ScaleformLayout, self).__init__()
        self.config = TutorialConfig()
        self.loader = TutorialUILoader(weakref.proxy(self), swf)
        self._guiRef = None
        self._movieView = None
        self._commands = ScaleformCommandsFactory()

    def _resolveGuiRoot(self):
        proxy = None
        try:
            window = GUIProxy.windowsManager().window
            self._guiRef = weakref.ref(window)
            proxy = window.proxy
        except AttributeError:
            LOG_CURRENT_EXCEPTION()

        return proxy

    def populateUI(self, proxy):
        super(ScaleformLayout, self).populateUI(proxy)
        self.loader.init(proxy)

    def dispossessUI(self):
        self.loader.fini()
        super(ScaleformLayout, self).dispossessUI()

    def init(self):
        proxy = self._resolveGuiRoot()
        result = False
        if proxy is not None:
            self.populateUI(proxy)
            if self.loader.load():
                result = True
        return result

    def _setMovieView(self, movie):
        if self._movieView is not None:
            self._movieView.script = None
        self._movieView = movie
        self._movieView.resync()
        self._movieView.script = self
        self.onGUILoaded()

    def fini(self, isItemsRevert = True):
        self.eManager.clear()
        if self._guiRef is None or self._guiRef() is None:
            return
        self.loader.unload(isItemsRevert=isItemsRevert)
        if self._movieView is not None:
            self._movieView.script = None
            self._movieView = None
        self.dispossessUI()

    def loadConfig(self, filePath):
        self.config.loadConfig(filePath)

    def reloadConfig(self, filePath):
        self.config.reloadConfig(filePath)

    def playEffect(self, effectName, args, itemRef = None, containerRef = None):
        if itemRef is not None:
            item = self.config.getItem(itemRef)
            if item is None:
                LOG_ERROR('GUI Item not found', effectName, itemRef)
                return
            if args is None:
                args = []
            args.append(item['path'])
        if containerRef is not None:
            container = self.config.getItem(containerRef)
            if container is None:
                LOG_ERROR('GUI Item not found', effectName, containerRef)
                return
            if args is None:
                args = []
            args.append(container['path'])
        return self._movieView.effects.play(effectName, args)

    def stopEffect(self, effectName, effectID):
        self._movieView.effects.stop(effectName, effectID)

    def setItemProps(self, itemRef, props, revert = False):
        item = self.config.getItem(itemRef)
        if item is None:
            LOG_ERROR('GUI Item not found', itemRef)
            return
        self._movieView.items.setProps(itemRef, item['path'], props, revert)

    def isGuiDialogDisplayed(self):
        return self._movieView.isGuiDialogOnStage()

    def isTutorialDialogDisplayed(self, dialogID):
        return self._movieView.isTutorialDialogOnStage(dialogID)

    def isTutorialWindowDisplayed(self, windowID):
        return self._movieView.isTutorialWindowOnStage(windowID)

    def findItem(self, itemID, criteria):
        if criteria is None:
            item = self.config.getItem(itemID)
            locked = True
            valuePath = None
            value = None
        else:
            parentID, valuePath, value = criteria
            item = self.config.getItem(parentID)
            locked = False
        itemPath = self._movieView.findTargetByCriteria(item['path'], valuePath, value)
        if not locked:
            if itemPath is not None:
                self.config.addItem(itemID, itemPath)
            else:
                self.config.removeItem(itemID)
        return itemPath

    def invokeCommand(self, data):
        self._commands.invoke(self.uiHolder, data)

    def getGuiRoot(self):
        try:
            root = GUIProxy.windowsManager().window
        except AttributeError:
            LOG_CURRENT_EXCEPTION()
            root = None

        return root

    def setChapterInfo(self, title, description):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setChapterInfo(title, description)
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')

    def clearChapterInfo(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.clearChapterInfo()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')

    def setTrainingRestartMode(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setTrainingRestartMode()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')

    def setTrainingRunMode(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setTrainingRunMode()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')

    def setPlayerXPLevel(self, level):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setPlayerXPLevel(level)
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')

    def gc_proxyMouseClick(self, targetID):
        self.onMouseClicked(GUIEvent(None, targetID))
Example #8
0
 def __init__(self):
     super(TutorialLayout, self).__init__()
     self.config = TutorialConfig()
     self._guiRef = None
     self._dispatcherRef = None
     return
Example #9
0
class TutorialLayout(GUIProxy, UIInterface):
    def __init__(self):
        super(TutorialLayout, self).__init__()
        self.config = TutorialConfig()
        self._guiRef = None
        self._dispatcherRef = None
        return

    def __del__(self):
        LOG_DEBUG('TutorialLayout deleted')

    def populateUI(self, proxy):
        super(TutorialLayout, self).populateUI(proxy)
        self.uiHolder.addFsCallbacks(
            {'Tutorial.MouseClicked': self.__dispatchMouseClickEvent})
        self.uiHolder.addExternalCallbacks({
            'Loader.LoadStart':
            self.__dispatchPageChangingEvent,
            'Tutorial.GetScreenSize':
            self.__onGetScreenSize
        })

    def dispossessUI(self):
        self.uiHolder.removeFsCallbacks('Tutorial.MouseClicked')
        self.uiHolder.removeExternalCallback(
            'Loader.LoadStart', function=self.__dispatchPageChangingEvent)
        self.uiHolder.removeExternalCallback('Tutorial.GetScreenSize')
        super(TutorialLayout, self).dispossessUI()

    def init(self):
        try:
            window = WindowsManager.g_windowsManager.window
            self._guiRef = weakref.ref(window)
            proxy = window.proxy
            dispatcher = window.tutorialDispatcher
            if dispatcher is None:
                dispatcher = TutorialDispatcher()
                dispatcher.populateUI(proxy)
                window.tutorialDispatcher = dispatcher
            self._dispatcherRef = weakref.ref(dispatcher)
        except AttributeError:
            LOG_CURRENT_EXCEPTION()
            return False

        self.populateUI(proxy)
        try:
            movie = self.uiHolder.movie
            movie.invoke(
                ('_root.tutorialLoader.loadTutorial', ['TutorialLayout.swf']))
            LOG_DEBUG("load 'TutorialLayout.swf'")
            self.setTrainingRunMode()
            self.call('common.closeAllWindows')
        except Exception:
            LOG_CURRENT_EXCEPTION()
            return False

        return True

    def clear(self):
        if self._guiRef is not None and self._guiRef() is not None:
            self.clearChapterInfo()
            self.call('Tutorial.Effects.Stop')
            self.call('Tutorial.Areas.Destroy', [False, True])
            self.call('Tutorial.Items.ResetAll')
            self.call('common.closeAllWindows')
        return

    def fini(self):
        self.eManager.clear()
        if self._guiRef is None or self._guiRef() is None:
            return
        else:
            try:
                self.call('common.closeAllWindows')
                movie = self.uiHolder.movie
                movie.invoke(('_root.tutorialLoader.unloadTutorial', []))
                LOG_DEBUG("unload 'TutorialLayout.swf'")
            except Exception:
                LOG_CURRENT_EXCEPTION()
                return False

            self.dispossessUI()
            return

    def loadConfig(self, filePath):
        self.config.loadConfig(filePath)

    def reloadConfig(self, filePath):
        self.config.reloadConfig(filePath)

    def updateLockedAreas(self, areas):
        getter = self.config.getArea
        args = []
        for area in areas:
            areaID = area.getID()
            props = getter(areaID)
            if props['path'] is None:
                LOG_ERROR('TUTORIAL. Target path for locked area not found ',
                          areaID)
                continue
            args.extend([
                areaID, props['path'], props['lockedSymbol'],
                props['position'][0], props['position'][1], props['size'][0],
                props['size'][1], props['changeSize'], props['lockedPopUp']
            ])

        self.call('Tutorial.LockedAreas.Update', args)
        return

    def updateActiveAreas(self, areas):
        areaGetter = self.config.getArea
        itemGetter = self.config.getItem
        args = []
        for area in areas:
            areaID = area.getID()
            props = areaGetter(area.getID())
            path = props['path']
            targetID = props['targetID']
            if path is None or targetID is None:
                targetID = area.getTargetID()
                item = itemGetter(targetID)
                if item is not None:
                    path = item['path']
                else:
                    LOG_ERROR(
                        'TUTORIAL. Target path for active area not found',
                        areaID)
                    continue
            if targetID is None or path is None:
                LOG_WARNING(
                    'TUTORIAL. Target path or ID for active area not found',
                    areaID, targetID, path)
                continue
            action = area.getAction(targetID)
            if action is not None:
                actionType = action.getType()
            else:
                actionType = 0
            args.extend([
                areaID, targetID, path, props['position'][0],
                props['position'][1], props['size'][0], props['size'][1],
                area.isUseMask(),
                area.getHideMaskMode(), props['changeSize'], actionType
            ])

        self.call('Tutorial.ActiveAreas.Update', args)
        return

    def getSceneID(self):
        result = None
        if not Waiting.isVisible():
            guiPage = self.uiHolder.currentInterface
            result = self.config.getSceneID(guiPage)
        return result

    def goToScene(self, sceneID):
        method = self.config.getGoToSceneMethod(sceneID)
        if method is not None:
            self.uiHolder.movie.invoke((method, ))
        return

    def playEffect(self, effectName, args, itemRef=None, containerRef=None):
        if itemRef is not None:
            item = self.config.getItem(itemRef)
            if item is None:
                LOG_ERROR('TUTORIAL. GUI Item not found', effectName, itemRef)
                return
            if args is None:
                args = []
            args.append(item['path'])
        if containerRef is not None:
            container = self.config.getItem(containerRef)
            if container is None:
                LOG_ERROR('TUTORIAL. GUI Item not found', effectName,
                          containerRef)
                return
            if args is None:
                args = []
            args.append(container['path'])
        self.call('Tutorial.Effects.{0:>s}.Play'.format(effectName), args)
        return

    def stopEffect(self, effectName, effectID):
        self.call('Tutorial.Effects.{0:>s}.Stop'.format(effectName),
                  [effectID])

    def showWaiting(self, messageID, isSingle=False):
        Waiting.show('tutorial-{0:>s}'.format(messageID), isSingle=isSingle)

    def hideWaiting(self, messageID):
        if Waiting.isVisible():
            Waiting.hide('tutorial-{0:>s}'.format(messageID))

    def showErrorMessage(self, key, *args, **kwargs):
        kwargs['type'] = SystemMessages.SM_TYPE.Error
        SystemMessages.g_instance.pushI18nMessage(key, *args, **kwargs)

    def setItemProps(self, itemRef, props, revert=False):
        item = self.config.getItem(itemRef)
        if item is None:
            LOG_ERROR('TUTORIAL. GUI Item not found', itemRef)
            return
        else:
            args = [itemRef, item['path'], revert]
            for name, value in props.iteritems():
                args.extend([name, value])

            self.call('Tutorial.Items.SetProps', args)
            return

    def isGuiDialogDisplayed(self):
        result = False
        try:
            result = self.uiHolder.movie.invoke(
                ('_root.tutorialLoader.isGuiDialogDisplayed', []))
        except Exception:
            LOG_CURRENT_EXCEPTION()

        return result

    def isTutorialDialogDisplayed(self, dialogID):
        result = True
        try:
            result = self.uiHolder.movie.invoke(
                ('_root.tutorialLoader.isTutorialDialogDisplayed', [dialogID]))
        except Exception:
            LOG_CURRENT_EXCEPTION()

        return result

    def findItem(self, itemID, criteria):
        itemPath = None
        if criteria is None:
            item = self.config.getItem(itemID)
            locked = True
            valuePath = None
            value = None
        else:
            parentID, valuePath, value = criteria
            item = self.config.getItem(parentID)
            locked = False
        try:
            itemPath = self.uiHolder.movie.invoke(
                ('_root.tutorialLoader.findItem',
                 [item['path'], valuePath, value]))
            if not locked:
                if itemPath is not None:
                    self.config.addItem(itemID, itemPath)
                else:
                    self.config.removeItem(itemID)
        except Exception:
            LOG_CURRENT_EXCEPTION()

        return itemPath

    def invokeCommand(self, command):
        name, args = command
        self.uiHolder.call(name, args[:])

    def getGuiRoot(self):
        try:
            root = WindowsManager.g_windowsManager.window
        except AttributeError:
            LOG_CURRENT_EXCEPTION()
            root = None

        return root

    @classmethod
    def defineDispatcher(cls):
        dispatcher = None
        try:
            window = WindowsManager.g_windowsManager.window
            dispatcher = getattr(window, 'tutorialDispatcher', None)
            if dispatcher is None and window is not None:
                dispatcher = TutorialDispatcher()
                dispatcher.populateUI(window.proxy)
                window.tutorialDispatcher = dispatcher
        except AttributeError:
            LOG_CURRENT_EXCEPTION()

        return dispatcher

    def setChapterInfo(self, title, description):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().setChapterInfo(title, description)
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def clearChapterInfo(self):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().clearChapterInfo()
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def setTrainingRestartMode(self):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().setTrainingRestartMode()
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def setTrainingRunMode(self):
        if self._dispatcherRef() is not None:
            self._dispatcherRef().setTrainingRunMode()
        else:
            LOG_ERROR('TUTORIAL. Tutorial dispatcher is not defined.')
        return

    def __dispatchMouseClickEvent(self, targetID):
        self.onMouseClicked(GUIEvent(None, targetID))
        return

    def __dispatchPageChangingEvent(self, _, pageName):
        sceneID = self.config.getSceneID(pageName)
        if sceneID is None:
            self.clear()
            LOG_DEBUG('TUTORIAL. Scene alias not found, page:', pageName)
        else:
            self.call('Tutorial.Effects.Stop')
            self.onPageChanging(sceneID)
        return

    def __onGetScreenSize(self, *args):
        parser = CommandArgsParser(self.__onGetScreenSize.__name__)
        parser.parse(*args)
        parser.addArgs(list(GUI.screenResolution()))
        self.uiHolder.respond(parser.args())
Example #10
0
class ScaleformLayout(GUIProxy, UIInterface):
    def __init__(self, swf):
        super(ScaleformLayout, self).__init__()
        self.config = TutorialConfig()
        self.loader = TutorialUILoader(weakref.proxy(self), swf)
        self._guiRef = None
        self._movieView = None
        self._commands = ScaleformCommandsFactory()
        return

    def _resolveGuiRoot(self):
        proxy = None
        try:
            window = GUIProxy.windowsManager().window
            self._guiRef = weakref.ref(window)
            proxy = window.proxy
        except AttributeError:
            LOG_CURRENT_EXCEPTION()

        return proxy

    def populateUI(self, proxy):
        super(ScaleformLayout, self).populateUI(proxy)
        self.loader.init(proxy)

    def dispossessUI(self):
        self.loader.fini()
        super(ScaleformLayout, self).dispossessUI()

    def init(self):
        proxy = self._resolveGuiRoot()
        result = False
        if proxy is not None:
            self.populateUI(proxy)
            if self.loader.load():
                result = True
        return result

    def _setMovieView(self, movie):
        if self._movieView is not None:
            self._movieView.script = None
        self._movieView = movie
        self._movieView.resync()
        self._movieView.script = self
        self.onGUILoaded()
        return

    def fini(self):
        self.eManager.clear()
        if self._guiRef is None or self._guiRef() is None:
            return
        else:
            self.loader.unload()
            if self._movieView is not None:
                self._movieView.script = None
                self._movieView = None
            self.dispossessUI()
            return

    def loadConfig(self, filePath):
        self.config.loadConfig(filePath)

    def reloadConfig(self, filePath):
        self.config.reloadConfig(filePath)

    def playEffect(self, effectName, args, itemRef=None, containerRef=None):
        if itemRef is not None:
            item = self.config.getItem(itemRef)
            if item is None:
                LOG_ERROR('GUI Item not found', effectName, itemRef)
                return
            if args is None:
                args = []
            args.append(item['path'])
        if containerRef is not None:
            container = self.config.getItem(containerRef)
            if container is None:
                LOG_ERROR('GUI Item not found', effectName, containerRef)
                return
            if args is None:
                args = []
            args.append(container['path'])
        return self._movieView.effects.play(effectName, args)

    def stopEffect(self, effectName, effectID):
        self._movieView.effects.stop(effectName, effectID)

    def setItemProps(self, itemRef, props, revert=False):
        item = self.config.getItem(itemRef)
        if item is None:
            LOG_ERROR('GUI Item not found', itemRef)
            return
        else:
            self._movieView.items.setProps(itemRef, item['path'], props,
                                           revert)
            return

    def isGuiDialogDisplayed(self):
        return self._movieView.isGuiDialogOnStage()

    def isTutorialDialogDisplayed(self, dialogID):
        return self._movieView.isTutorialDialogOnStage(dialogID)

    def isTutorialWindowDisplayed(self, windowID):
        return self._movieView.isTutorialWindowOnStage(windowID)

    def findItem(self, itemID, criteria):
        if criteria is None:
            item = self.config.getItem(itemID)
            locked = True
            valuePath = None
            value = None
        else:
            parentID, valuePath, value = criteria
            item = self.config.getItem(parentID)
            locked = False
        itemPath = self._movieView.findTargetByCriteria(
            item['path'], valuePath, value)
        if not locked:
            if itemPath is not None:
                self.config.addItem(itemID, itemPath)
            else:
                self.config.removeItem(itemID)
        return itemPath

    def invokeCommand(self, data):
        self._commands.invoke(self.uiHolder, data)

    def getGuiRoot(self):
        try:
            root = GUIProxy.windowsManager().window
        except AttributeError:
            LOG_CURRENT_EXCEPTION()
            root = None

        return root

    def setChapterInfo(self, title, description):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setChapterInfo(title, description)
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def clearChapterInfo(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.clearChapterInfo()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def setTrainingRestartMode(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setTrainingRestartMode()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def setTrainingRunMode(self):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setTrainingRunMode()
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def setPlayerXPLevel(self, level):
        dispatcher = self.getDispatcher()
        if dispatcher is not None:
            dispatcher.setPlayerXPLevel(level)
        else:
            LOG_ERROR('Tutorial dispatcher is not defined.')
        return

    def gc_proxyMouseClick(self, targetID):
        self.onMouseClicked(GUIEvent(None, targetID))
        return