class ContainerManager(ContainerManagerMeta): """ Class of container manager. """ def __init__(self, loader, *containers): super(ContainerManager, self).__init__() self.onViewAddedToContainer = Event() proxy = weakref.proxy(self) self.__containers = {} for container in containers: raise isinstance(container, AbstractViewContainer) or AssertionError self.__containers[container.getViewType()] = container(proxy) self._loadingViews = dict() self.__loader = loader self.__loader.onViewLoaded += self.__loader_onViewLoaded self.__scopeController = GlobalScopeController() self.__scopeController.create() def load(self, alias, name=None, *args, **kwargs): """ Loads view to container. :param alias: :param name: :param args: :param kwargs: :return: """ if name is None: name = alias isViewExists = self.as_getViewS(name) if not isViewExists and (alias, name) not in self._loadingViews: pyEntity = self.__loader.loadView(alias, name, *args, **kwargs) self.__scopeController.addLoadingView(pyEntity, False) curType = pyEntity.settings.type if self.canCancelPreviousLoading(curType): result = [] for kev, val in self._loadingViews.iteritems(): if val.settings.type == pyEntity.settings.type: result.append(val) if result: self.__cancelLoadingForPyEntities(result) self._loadingViews[alias, name] = pyEntity return def canCancelPreviousLoading(self, containerType): container = self.getContainer(containerType) if container is not None: return container.canCancelPreviousLoading() else: return False return def addContainer(self, viewType, name, container=None): result = True if viewType not in self.__containers: if container is None: self.__containers[viewType] = DefaultContainer( viewType, weakref.proxy(self)) self.as_registerContainerS(viewType, name) elif isinstance(container, AbstractViewContainer): self.__containers[viewType] = container self.as_registerContainerS(viewType, name) else: LOG_ERROR('Container must be implemented IViewContainer', container) result = False else: LOG_ERROR('Container already registered', viewType) result = False return result def removeContainer(self, viewType): self.__scopeController.removeSubScopeController( ScopeTemplates.VIEW_TYPES_TO_SCOPES[viewType].getScopeType()) result = True if viewType in self.__containers: container = self.__containers[viewType] container.destroy() self.as_unregisterContainerS(viewType) del self.__containers[viewType] else: result = False return result def getContainer(self, viewType): if viewType in self.__containers: return self.__containers[viewType] else: return None def isModalViewsIsExists(self): for viewType in _POPUPS_CONTAINERS: container = self.getContainer(viewType) if container is not None and container.getViewCount(isModal=True): return True return False def getView(self, viewType, criteria=None): container = self.getContainer(viewType) if container is not None: view = container.getView(criteria=criteria) else: raise Exception('Container for %s view is None!' % viewType) return view def isViewAvailable(self, viewType, criteria=None): container = self.getContainer(viewType) if container is not None: return container.getView(criteria=criteria) is not None else: return False return def showContainers(self, *viewTypes): self.as_showContainersS(viewTypes) def hideContainers(self, *viewTypes): self.as_hideContainersS(viewTypes) def isContainerShown(self, viewType): return self.as_isContainerShownS(viewType) def closePopUps(self): self.as_closePopUpsS() def clear(self): for viewType in _POPUPS_CONTAINERS: container = self.getContainer(viewType) if container is not None: container.clear() return def removeLoadingView(self, alias, uniqueName): self._loadingViews.pop((alias, uniqueName), None) return def _dispose(self): if self.__loader is not None: self.__loader.onViewLoaded -= self.__loader_onViewLoaded self.__loader = None for viewType in _CONTAINERS_DESTROY_ORDER: if viewType in self.__containers: container = self.__containers.pop(viewType) LOG_DEBUG('CONTAINER: {}/{}'.format(container, viewType)) container.destroy() if len(self.__containers): LOG_ERROR('No all containers are destructed.') self.__containers.clear() self.onViewAddedToContainer.clear() self.__scopeController.destroy() self.__scopeController = None self._loadingViews.clear() self._loadingViews = None super(ContainerManager, self)._dispose() return def __cancelLoadingForPyEntities(self, pyEntities): for curEntity in pyEntities: self._loadingViews.pop( (curEntity.settings.alias, curEntity.uniqueName)) self.__loader.cancelLoadingByName(curEntity.uniqueName) curEntity.destroy() def __loader_onViewLoaded(self, pyView): viewType = pyView.settings.type if viewType is None: LOG_ERROR('Type of view is not defined', pyView.settings) viewKey = (pyView.alias, pyView.uniqueName) if viewKey in self._loadingViews: self._loadingViews.pop(viewKey) if viewType in self.__containers: if ViewTypes.DEFAULT == viewType: self.closePopUps() if self.__scopeController.isViewLoading(pyView): container = self.__containers[viewType] if container.add(pyView): self.__scopeController.addView(pyView, False) self.as_showS(pyView.uniqueName, 0, 0) pyView.create() subContainerType = pyView.getSubContainerType() if subContainerType is not None: self.addContainer(subContainerType, pyView.uniqueName) LOG_DEBUG('View added to container', pyView) self.onViewAddedToContainer(container, pyView) else: LOG_DEBUG( '"%s" view cancelled to load, because its scope has been destroyed.' % str(pyView)) self.as_hideS(pyView.uniqueName) pyView.destroy() else: LOG_ERROR('Type "%s" of view "%s" is not supported' % (viewType, pyView)) return
class ContainerManager(ContainerManagerMeta): """ Class of container manager. """ def __init__(self, loader, *containers): super(ContainerManager, self).__init__() self.onViewAddedToContainer = Event() proxy = weakref.proxy(self) self.__containers = {} for container in containers: raise isinstance(container, AbstractViewContainer) or AssertionError self.__containers[container.getViewType()] = container(proxy) self._loadingViews = dict() self.__loader = loader self.__loader.onViewLoaded += self.__loader_onViewLoaded self.__scopeController = GlobalScopeController() self.__scopeController.create() def load(self, alias, name = None, *args, **kwargs): """ Loads view to container. :param alias: :param name: :param args: :param kwargs: :return: """ if name is None: name = alias isViewExists = self.as_getViewS(name) if not isViewExists and (alias, name) not in self._loadingViews: pyEntity = self.__loader.loadView(alias, name, *args, **kwargs) self.__scopeController.addLoadingView(pyEntity, False) curType = pyEntity.settings.type if self.canCancelPreviousLoading(curType): result = [] for kev, val in self._loadingViews.iteritems(): if val.settings.type == pyEntity.settings.type: result.append(val) if result: self.__cancelLoadingForPyEntities(result) self._loadingViews[alias, name] = pyEntity return def canCancelPreviousLoading(self, containerType): container = self.getContainer(containerType) if container is not None: return container.canCancelPreviousLoading() else: return False return def addContainer(self, viewType, name, container = None): result = True if viewType not in self.__containers: if container is None: self.__containers[viewType] = DefaultContainer(viewType, weakref.proxy(self)) self.as_registerContainerS(viewType, name) elif isinstance(container, AbstractViewContainer): self.__containers[viewType] = container self.as_registerContainerS(viewType, name) else: LOG_ERROR('Container must be implemented IViewContainer', container) result = False else: LOG_ERROR('Container already registered', viewType) result = False return result def removeContainer(self, viewType): self.__scopeController.removeSubScopeController(ScopeTemplates.VIEW_TYPES_TO_SCOPES[viewType].getScopeType()) result = True if viewType in self.__containers: container = self.__containers[viewType] container.destroy() self.as_unregisterContainerS(viewType) del self.__containers[viewType] else: result = False return result def getContainer(self, viewType): if viewType in self.__containers: return self.__containers[viewType] else: return None def isModalViewsIsExists(self): for viewType in _POPUPS_CONTAINERS: container = self.getContainer(viewType) if container is not None and container.getViewCount(isModal=True): return True return False def getView(self, viewType, criteria = None): container = self.getContainer(viewType) if container is not None: view = container.getView(criteria=criteria) else: raise Exception('Container for %s view is None!' % viewType) return view def isViewAvailable(self, viewType, criteria = None): container = self.getContainer(viewType) if container is not None: return container.getView(criteria=criteria) is not None else: return False return def showContainers(self, *viewTypes): self.as_showContainersS(viewTypes) def hideContainers(self, *viewTypes): self.as_hideContainersS(viewTypes) def isContainerShown(self, viewType): return self.as_isContainerShownS(viewType) def closePopUps(self): self.as_closePopUpsS() def clear(self): for viewType in _POPUPS_CONTAINERS: container = self.getContainer(viewType) if container is not None: container.clear() return def removeLoadingView(self, alias, uniqueName): self._loadingViews.pop((alias, uniqueName), None) return def _dispose(self): if self.__loader is not None: self.__loader.onViewLoaded -= self.__loader_onViewLoaded self.__loader = None for viewType in _CONTAINERS_DESTROY_ORDER: if viewType in self.__containers: container = self.__containers.pop(viewType) LOG_DEBUG('CONTAINER: {}/{}'.format(container, viewType)) container.destroy() if len(self.__containers): LOG_ERROR('No all containers are destructed.') self.__containers.clear() self.onViewAddedToContainer.clear() self.__scopeController.destroy() self.__scopeController = None self._loadingViews.clear() self._loadingViews = None super(ContainerManager, self)._dispose() return def __cancelLoadingForPyEntities(self, pyEntities): for curEntity in pyEntities: self._loadingViews.pop((curEntity.settings.alias, curEntity.uniqueName)) self.__loader.cancelLoadingByName(curEntity.uniqueName) curEntity.destroy() def __loader_onViewLoaded(self, pyView): viewType = pyView.settings.type if viewType is None: LOG_ERROR('Type of view is not defined', pyView.settings) viewKey = (pyView.alias, pyView.uniqueName) if viewKey in self._loadingViews: self._loadingViews.pop(viewKey) if viewType in self.__containers: if ViewTypes.DEFAULT == viewType: self.closePopUps() if self.__scopeController.isViewLoading(pyView): container = self.__containers[viewType] if container.add(pyView): self.__scopeController.addView(pyView, False) self.as_showS(pyView.uniqueName, 0, 0) pyView.create() subContainerType = pyView.getSubContainerType() if subContainerType is not None: self.addContainer(subContainerType, pyView.uniqueName) LOG_DEBUG('View added to container', pyView) self.onViewAddedToContainer(container, pyView) else: LOG_DEBUG('"%s" view cancelled to load, because its scope has been destroyed.' % str(pyView)) self.as_hideS(pyView.uniqueName) pyView.destroy() else: LOG_ERROR('Type "%s" of view "%s" is not supported' % (viewType, pyView)) return
class ContainerManager(ContainerManagerMeta): onViewAddedToContainer = Event() __DESTROY_ORDER = (ViewTypes.DEFAULT, ViewTypes.LOBBY_SUB, ViewTypes.WINDOW, ViewTypes.BROWSER, ViewTypes.TOP_WINDOW, ViewTypes.WAITING, ViewTypes.CURSOR, ViewTypes.SERVICE_LAYOUT) __CONTAINERS_TO_CLEAR = (ViewTypes.WINDOW, ViewTypes.BROWSER, ViewTypes.TOP_WINDOW) def __init__(self, loader): super(ContainerManager, self).__init__() proxy = weakref.proxy(self) self.__containers = {ViewTypes.DEFAULT: _DefaultContainer(proxy), ViewTypes.CURSOR: _DefaultContainer(proxy), ViewTypes.WAITING: _DefaultContainer(proxy), ViewTypes.WINDOW: _PopUpContainer(proxy), ViewTypes.BROWSER: _PopUpContainer(proxy), ViewTypes.TOP_WINDOW: _PopUpContainer(proxy), ViewTypes.SERVICE_LAYOUT: _DefaultContainer(proxy)} self._loadingViews = dict() self.__loader = loader self.__loader.onViewLoaded += self.__loader_onViewLoaded self.__scopeController = GlobalScopeController() self.__scopeController.create() def load(self, alias, name = None, *args, **kwargs): if name is None: name = alias isViewExists = self.as_getViewS(name) if not isViewExists and (alias, name) not in self._loadingViews: pyEntity = self.__loader.loadView(alias, name, *args, **kwargs) self.__scopeController.addLoadingView(pyEntity, False) curType = pyEntity.settings.type if self.canCancelPreviousLoading(curType): result = [] for kev, val in self._loadingViews.iteritems(): if val.settings.type == pyEntity.settings.type: result.append(val) if len(result) > 0: self.__cancelLoadingForPyEntities(result) self._loadingViews[alias, name] = pyEntity return def __cancelLoadingForPyEntities(self, pyEntities): for curEntity in pyEntities: self._loadingViews.pop((curEntity.settings.alias, curEntity.uniqueName)) self.__loader.cancelLoadingByName(curEntity.uniqueName) curEntity.destroy() def canCancelPreviousLoading(self, containerType): container = self.getContainer(containerType) if container is not None: return container.canCancelPreviousLoading() else: return False return def addContainer(self, containerType, name, container = None): result = True if containerType not in self.__containers: if container is None: self.__containers[containerType] = _DefaultContainer(weakref.proxy(self)) self.as_registerContainerS(containerType, name) elif isinstance(container, IViewContainer): self.__containers[containerType] = container self.as_registerContainerS(containerType, name) else: LOG_ERROR('Container must be implemented IViewContainer', container) result = False else: LOG_ERROR('Container already registered', containerType) result = False return result def removeContainer(self, viewType): self.__scopeController.removeSubScopeController(ScopeTemplates.VIEW_TYPES_TO_SCOPES[viewType].getScopeType()) result = True if viewType in self.__containers: container = self.__containers[viewType] container.destroy() self.as_unregisterContainerS(viewType) del self.__containers[viewType] else: result = False return result def getContainer(self, viewType): if viewType in self.__containers: return self.__containers[viewType] else: return None def isModalViewsIsExists(self): if self.getContainer(ViewTypes.TOP_WINDOW).getViewCount(isModal=True) > 0: return True elif self.getContainer(ViewTypes.BROWSER).getViewCount(isModal=True) > 0: return True else: return self.getContainer(ViewTypes.WINDOW).getViewCount(isModal=True) > 0 def getView(self, viewType, criteria = None): view = None container = self.getContainer(viewType) if container is not None: view = container.getView(criteria=criteria) else: raise Exception('Container for %s view is None!' % viewType) return view def isViewAvailable(self, viewType, criteria = None): container = self.getContainer(viewType) if container is not None: return container.getView(criteria=criteria) is not None else: return False return def closePopUps(self): self.as_closePopUpsS() def clear(self): for c in self.__CONTAINERS_TO_CLEAR: self.getContainer(c).clear() def _dispose(self): if self.__loader is not None: self.__loader.onViewLoaded -= self.__loader_onViewLoaded self.__loader = None for viewType in self.__DESTROY_ORDER: if viewType in self.__containers: container = self.__containers.pop(viewType) LOG_DEBUG('CONTAINER: ' + str(container) + '/' + viewType) container.destroy() if len(self.__containers): LOG_ERROR('No all containers are destructed.') self.__containers.clear() self.onViewAddedToContainer.clear() self.__scopeController.destroy() self.__scopeController = None self._loadingViews.clear() self._loadingViews = None super(ContainerManager, self)._dispose() return def __loader_onViewLoaded(self, pyView): viewType = pyView.settings.type if viewType is None: LOG_ERROR('Type of view is not defined', pyView.settings) viewKey = (pyView.alias, pyView.uniqueName) if viewKey in self._loadingViews: self._loadingViews.pop(viewKey) if viewType in self.__containers: if ViewTypes.DEFAULT == viewType: self.closePopUps() if self.__scopeController.isViewLoading(pyView): container = self.__containers[viewType] if container.add(pyView): self.__scopeController.addView(pyView, False) self.as_showS(pyView.uniqueName, 0, 0) pyView.create() subContainerType = pyView.getSubContainerType() if subContainerType is not None: self.addContainer(subContainerType, pyView.uniqueName) LOG_DEBUG('View added to container', pyView) self.onViewAddedToContainer(container, pyView) else: LOG_DEBUG('"%s" view cancelled to load, because its scope has been destroyed.' % str(pyView)) self.as_hideS(pyView.uniqueName) pyView.destroy() else: LOG_ERROR('Type "%s" of view "%s" is not supported' % (viewType, pyView)) return
class ContainerManager(ContainerManagerMeta): onViewAddedToContainer = Event() __DESTROY_ORDER = (ViewTypes.DEFAULT, ViewTypes.LOBBY_SUB, ViewTypes.WINDOW, ViewTypes.BROWSER, ViewTypes.TOP_WINDOW, ViewTypes.WAITING, ViewTypes.CURSOR, ViewTypes.SERVICE_LAYOUT) __CONTAINERS_TO_CLEAR = (ViewTypes.WINDOW, ViewTypes.BROWSER, ViewTypes.TOP_WINDOW) def __init__(self, loader): super(ContainerManager, self).__init__() proxy = weakref.proxy(self) self.__containers = { ViewTypes.DEFAULT: _DefaultContainer(proxy), ViewTypes.CURSOR: _DefaultContainer(proxy), ViewTypes.WAITING: _DefaultContainer(proxy), ViewTypes.WINDOW: _PopUpContainer(proxy), ViewTypes.BROWSER: _PopUpContainer(proxy), ViewTypes.TOP_WINDOW: _PopUpContainer(proxy), ViewTypes.SERVICE_LAYOUT: _DefaultContainer(proxy) } self._loadingViews = dict() self.__loader = loader self.__loader.onViewLoaded += self.__loader_onViewLoaded self.__scopeController = GlobalScopeController() self.__scopeController.create() def load(self, alias, name=None, *args, **kwargs): if name is None: name = alias isViewExists = self.as_getViewS(name) if not isViewExists and (alias, name) not in self._loadingViews: pyEntity = self.__loader.loadView(alias, name, *args, **kwargs) self.__scopeController.addLoadingView(pyEntity, False) curType = pyEntity.settings.type if self.canCancelPreviousLoading(curType): result = [] for kev, val in self._loadingViews.iteritems(): if val.settings.type == pyEntity.settings.type: result.append(val) if len(result) > 0: self.__cancelLoadingForPyEntities(result) self._loadingViews[alias, name] = pyEntity def __cancelLoadingForPyEntities(self, pyEntities): for curEntity in pyEntities: self._loadingViews.pop( (curEntity.settings.alias, curEntity.uniqueName)) self.__loader.cancelLoadingByName(curEntity.uniqueName) curEntity.destroy() def canCancelPreviousLoading(self, containerType): container = self.getContainer(containerType) if container is not None: return container.canCancelPreviousLoading() else: return False def addContainer(self, containerType, name, container=None): result = True if containerType not in self.__containers: if container is None: self.__containers[containerType] = _DefaultContainer( weakref.proxy(self)) self.as_registerContainerS(containerType, name) elif isinstance(container, IViewContainer): self.__containers[containerType] = container self.as_registerContainerS(containerType, name) else: LOG_ERROR('Container must be implemented IViewContainer', container) result = False else: LOG_ERROR('Container already registered', containerType) result = False return result def removeContainer(self, viewType): self.__scopeController.removeSubScopeController( ScopeTemplates.VIEW_TYPES_TO_SCOPES[viewType].getScopeType()) result = True if viewType in self.__containers: container = self.__containers[viewType] container.destroy() self.as_unregisterContainerS(viewType) del self.__containers[viewType] else: result = False return result def getContainer(self, viewType): if viewType in self.__containers: return self.__containers[viewType] def isModalViewsIsExists(self): if self.getContainer( ViewTypes.TOP_WINDOW).getViewCount(isModal=True) > 0: return True elif self.getContainer( ViewTypes.BROWSER).getViewCount(isModal=True) > 0: return True else: return self.getContainer( ViewTypes.WINDOW).getViewCount(isModal=True) > 0 def getView(self, viewType, criteria=None): view = None container = self.getContainer(viewType) if container is not None: view = container.getView(criteria=criteria) else: raise Exception('Container for %s view is None!' % viewType) return view def isViewAvailable(self, viewType, criteria=None): container = self.getContainer(viewType) if container is not None: return container.getView(criteria=criteria) is not None else: return False def closePopUps(self): self.as_closePopUpsS() def clear(self): for c in self.__CONTAINERS_TO_CLEAR: self.getContainer(c).clear() def _dispose(self): if self.__loader is not None: self.__loader.onViewLoaded -= self.__loader_onViewLoaded self.__loader = None for viewType in self.__DESTROY_ORDER: if viewType in self.__containers: container = self.__containers.pop(viewType) LOG_DEBUG('CONTAINER: ' + str(container) + '/' + viewType) container.destroy() if len(self.__containers): LOG_ERROR('No all containers are destructed.') self.__containers.clear() self.onViewAddedToContainer.clear() self.__scopeController.destroy() self.__scopeController = None self._loadingViews.clear() self._loadingViews = None super(ContainerManager, self)._dispose() def __loader_onViewLoaded(self, pyView): viewType = pyView.settings.type if viewType is None: LOG_ERROR('Type of view is not defined', pyView.settings) viewKey = (pyView.alias, pyView.uniqueName) if viewKey in self._loadingViews: self._loadingViews.pop(viewKey) if viewType in self.__containers: if ViewTypes.DEFAULT == viewType: self.closePopUps() if self.__scopeController.isViewLoading(pyView): container = self.__containers[viewType] if container.add(pyView): self.__scopeController.addView(pyView, False) self.as_showS(pyView.uniqueName, 0, 0) pyView.create() subContainerType = pyView.getSubContainerType() if subContainerType is not None: self.addContainer(subContainerType, pyView.uniqueName) LOG_DEBUG('View added to container', pyView) self.onViewAddedToContainer(container, pyView) else: LOG_DEBUG( '"%s" view cancelled to load, because its scope has been destroyed.' % str(pyView)) self.as_hideS(pyView.uniqueName) pyView.destroy() else: LOG_ERROR('Type "%s" of view "%s" is not supported' % (viewType, pyView))