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 __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 __init__(self, effectPlayer): super(SfLobbyProxy, self).__init__() self.config = TutorialConfig() self.items = ItemsManager() self.effects = effectPlayer
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())
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))
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())
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