Merge pull request #807 from mwhudson/controllerset-tweaks

make ControllerSet more re-usable
This commit is contained in:
Michael Hudson-Doyle 2020-08-23 23:07:12 +12:00 committed by GitHub
commit 59906e938a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 45 deletions

View File

@ -0,0 +1,57 @@
# Copyright 2020 Canonical, Ltd.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
class ControllerSet:
def __init__(self, controllers_mod, names, init_args=()):
self.controllers_mod = controllers_mod
self.controller_names = names[:]
self.init_args = init_args
self.index = -1
self.instances = []
def _get_controller_class(self, name):
cls_name = name+"Controller"
return getattr(self.controllers_mod, cls_name)
def load(self, name):
self.controller_names.remove(name)
klass = self._get_controller_class(name)
if hasattr(self, name):
c = 1
for instance in self.instances:
if isinstance(instance, klass):
c += 1
rep_cls = self._get_controller_class("Repeated")
inst = rep_cls(getattr(self, name), c)
name = inst.name
else:
inst = klass(*self.init_args)
setattr(self, name, inst)
self.instances.append(inst)
def load_all(self):
while self.controller_names:
self.load(self.controller_names[0])
@property
def cur(self):
if self.out_of_bounds():
return None
return self.instances[self.index]
def out_of_bounds(self):
return self.index < 0 or self.index >= len(self.instances)

View File

@ -32,6 +32,7 @@ from subiquitycore.controller import (
Skip,
)
from subiquitycore.palette import PALETTE_COLOR, PALETTE_MONO
from subiquitycore.controllerset import ControllerSet
from subiquitycore.prober import Prober
from subiquitycore.screen import is_linux_tty, make_screen
from subiquitycore.signals import Signal
@ -158,50 +159,6 @@ class AsyncioEventLoop(urwid.AsyncioEventLoop):
loop.default_exception_handler(context)
class ControllerSet:
def __init__(self, app, names):
self.app = app
self.controller_names = names[:]
self.index = -1
self.instances = []
self.controllers_mod = __import__(
'{}.controllers'.format(self.app.project), None, None, [''])
def _get_controller_class(self, name):
return getattr(self.controllers_mod, name+"Controller")
def load(self, name):
self.controller_names.remove(name)
log.debug("Importing controller: %s", name)
klass = self._get_controller_class(name)
if hasattr(self, name):
c = 1
for instance in self.instances:
if isinstance(instance, klass):
c += 1
rep_cls = self._get_controller_class("Repeated")
inst = rep_cls(getattr(self, name), c)
name = inst.name
else:
inst = klass(self.app)
setattr(self, name, inst)
self.instances.append(inst)
def load_all(self):
while self.controller_names:
self.load(self.controller_names[0])
@property
def cur(self):
if self.out_of_bounds():
return None
return self.instances[self.index]
def out_of_bounds(self):
return self.index < 0 or self.index >= len(self.instances)
class Application:
# A concrete subclass must set project and controllers attributes, e.g.:
@ -268,7 +225,10 @@ class Application:
self.prober = prober
self.new_event_loop()
self.urwid_loop = None
self.controllers = ControllerSet(self, self.controllers)
controllers_mod = __import__(
'{}.controllers'.format(self.project), None, None, [''])
self.controllers = ControllerSet(
controllers_mod, self.controllers, init_args=(self,))
self.context = Context.new(self)
def new_event_loop(self):