[PATCH 3/4] Add the ability to select software in text UI.

Vratislav Podzimek vpodzime at redhat.com
Fri May 17 13:43:05 UTC 2013


On Thu, 2013-05-16 at 11:54 -0400, Samantha N. Bueno wrote:
> ---
>  pyanaconda/ui/tui/spokes/software.py | 185 +++++++++++++++++++++++++++++++++++
>  1 file changed, 185 insertions(+)
>  create mode 100644 pyanaconda/ui/tui/spokes/software.py
> 
> diff --git a/pyanaconda/ui/tui/spokes/software.py b/pyanaconda/ui/tui/spokes/software.py
> new file mode 100644
> index 0000000..b80dd6f
> --- /dev/null
> +++ b/pyanaconda/ui/tui/spokes/software.py
> @@ -0,0 +1,185 @@
> +# Software selection text spoke
> +#
> +# Copyright (C) 2013  Red Hat, Inc.
> +#
> +# This copyrighted material is made available to anyone wishing to use,
> +# modify, copy, or redistribute it subject to the terms and conditions of
> +# the GNU General Public License v.2, or (at your option) any later version.
> +# This program is distributed in the hope that it will be useful, but WITHOUT
> +# ANY WARRANTY expressed or implied, including the implied warranties of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
> +# Public License for more details.  You should have received a copy of the
> +# GNU General Public License along with this program; if not, write to the
> +# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> +# 02110-1301, USA.  Any Red Hat trademarks that are incorporated in the
> +# source code or documentation are not subject to the GNU General Public
> +# License and may only be used or replicated with the express permission of
> +# Red Hat, Inc.
> +#
> +# Red Hat Author(s): Samantha N. Bueno <sbueno at redhat.com>
> +#
> +
> +from pyanaconda.flags import flags
> +from pyanaconda.ui.tui.spokes import NormalTUISpoke
> +from pyanaconda.ui.tui.simpleline import TextWidget, ColumnWidget, CheckboxWidget
> +from pyanaconda.threads import threadMgr, AnacondaThread
> +from pyanaconda.packaging import MetadataError, DependencyError
> +from pyanaconda.i18n import _
> +
> +
> +__all__ = ["SoftwareSpoke"]
> +
> +
> +class SoftwareSpoke(NormalTUISpoke):
> +    """ Spoke used to read new value of text to represent source repo. """
> +    title = _("Software selection")
> +    category = "software"
> +
> +    def __init__(self, app, data, storage, payload, instclass):
> +        NormalTUISpoke.__init__(self, app, data, storage, payload, instclass)
> +        self._ready = False
> +        self.errors = []
> +        self._tx_id = None
> +        # default to first selection (Gnome) in list of environments
> +        self._selection = 0
> +        self.environment = None
> +
> +        # for detecting later whether any changes have been made
> +        self._origEnv = None
> +
> +    def initialize(self):
> +        NormalTUISpoke.initialize(self)
> +        threadMgr.add(AnacondaThread(name="AnaSoftwareWatcher", target=self._initialize))
> +
> +    def _initialize(self):
> +        """ Private initialize. """
> +        threadMgr.wait("AnaPayloadThread")
> +        if flags.automatedInstall and self.data.packages.seen:
> +            threadMgr.wait("AnaPayloadMDThread")
Tthe names of the threads should go into pyanaconda.constants.

> +        else:
> +            try:
> +                env = self.payload.environments
> +            except MetadataError:
> +                self.errors.append(_("No installation source available"))
> +                return
> +        self.payload.release()
> +
> +        self._ready = True
> +
> +    @property
> +    def status(self):
> +        """ something """
> +        if self.errors:
> +            return _("Error checking software selection")
> +        if not self.ready:
> +            return _("Processing...")
> +        if not self.txid_valid:
> +            return _("Source changed - please verify")
> +
> +        ## FIXME:
> +        # quite ugly, but env isn't getting set to gnome (or anything) by
> +        # default, and it really should be so we can maintain consistency
> +        # with graphical behavior
> +        if self._selection >= 0 and not self.environment:
> +            self.environment = self.payload.environments[self._selection]
> +
> +        if not self.environment:
> +            # Ks installs with %packages will have an env selected, unless
> +            # they did an install without a desktop environment. This should
> +            # catch that one case.
> +            if flags.automatedInstall and self.data.packages.seen:
> +                return _("Custom software selected")
> +            return _("Nothing selected")
> +
> +        return self.payload.environmentDescription(self.environment)[0]
> +
> +    @property
> +    def completed(self):
> +        """ Always true. """
> +        processingDone = not threadMgr.get("AnaCheckSoftwareThread") and \
> +                         not self.errors and self.txid_valid
> +
> +        if flags.automatedInstall:
> +            return processingDone and self.data.packages.seen
> +        else:
> +            return self.environment is not None and processingDone
> +
> +    def refresh(self, args=None):
> +        """ Refresh screen. """
> +        NormalTUISpoke.refresh(self, args)
> +
> +        environments = self.payload.environments
> +
> +        displayed = []
> +        for env in environments:
> +            displayed.append(CheckboxWidget(title="%s" % env, completed=(environments.index(env) == self._selection)))
> +        print(_("Choose a desktop environment."))
> +
> +        def _prep(i, w):
> +            """ Do some format magic for display. """
> +            num = TextWidget("%2d)" % (i + 1))
> +            return ColumnWidget([(4, [num]), (None, [w])], 1)
> +
> +        # split list of DE's into two columns
> +        mid = len(environments) / 2
> +        left = [_prep(i, w) for i, w in enumerate(displayed) if i <= mid]
> +        right = [_prep(i, w) for i, w in enumerate(displayed) if i > mid]
> +
> +        cw = ColumnWidget([(38, left), (38, right)], 2)
> +        self._window.append(cw)
> +
> +        return True
> +
> +    def input(self, args, key):
> +        """ Handle the input; this chooses the desktop environment. """
> +        if key.lower() == "c" and self._selection - 1 in range(len(self.payload.environments)):
It's better to use 'xrange' though it will make no real difference here.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list