summaryrefslogtreecommitdiffstats
path: root/textw
diff options
context:
space:
mode:
Diffstat (limited to 'textw')
-rw-r--r--textw/packages.py167
1 files changed, 140 insertions, 27 deletions
diff --git a/textw/packages.py b/textw/packages.py
index aa4886150..0ad181bb9 100644
--- a/textw/packages.py
+++ b/textw/packages.py
@@ -42,6 +42,88 @@ class PackageGroupWindow:
return INSTALL_OK
class IndividualPackageWindow:
+ def get_rpm_desc (self, header):
+ desc = string.replace (header[rpm.RPMTAG_DESCRIPTION], "\n\n", "\x00")
+ desc = string.replace (desc, "\n", " ")
+ desc = string.replace (desc, "\x00", "\n\n")
+ return desc
+
+ def printHelp(self, screen, header):
+ sg = Grid(2, 2)
+ bb = ButtonBar (screen, ((_("OK"), "ok"),))
+
+ sg.setField (Label (_("Package:")), 0, 0, (0, 0, 4, 0))
+ sg.setField (Label ("%s-%s-%s" % (header[rpm.RPMTAG_NAME],
+ header[rpm.RPMTAG_VERSION],
+ header[rpm.RPMTAG_RELEASE])),
+ 1, 0)
+ sg.setField (Label (_("Size:")), 0, 1, (0, 0, 4, 0))
+ sg.setField (Label ("%.1f KBytes" % (header[rpm.RPMTAG_SIZE] / 1024.0)),
+ 1, 1)
+
+ txt = TextboxReflowed(60, self.get_rpm_desc(header), maxHeight = 10)
+
+ g = GridForm (screen, header[rpm.RPMTAG_NAME], 1, 3)
+ g.add (sg, 0, 0, (0, 0, 0, 1))
+ g.add (txt, 0, 1, (0, 0, 0, 1))
+ g.add (bb, 0, 2, growx = 1)
+
+ g.runOnce()
+
+ def printSize(self, size):
+ if not size:
+ return " "
+ size = size / 1024
+ return "%3d.%dM" % (size / 1024, (((size * 10) / 1024) % 10))
+
+ def printTotal(self):
+ size = self.total / 1024
+ self.lbl.setText("%4d.%dM" % (size / 1024, (((size * 10) / 1024) % 10)))
+
+ def printNum(self, group):
+ if self.groupCount[group] == self.groupSelCount[group]:
+ return "*"
+ elif self.groupSelCount[group]:
+ return "o"
+ else:
+ return " "
+
+ def ctSet(self, header, isOn):
+ header.selected = isOn
+ key = header[rpm.RPMTAG_GROUP]
+ if isOn:
+ self.groupSize[key] = self.groupSize[key] + header[rpm.RPMTAG_SIZE]
+ self.total = self.total + header[rpm.RPMTAG_SIZE]
+ self.groupSelCount[key] = self.groupSelCount[key] + 1
+ self.ct.setEntry(header, "%-*s %s" % (self.length,
+ header[rpm.RPMTAG_NAME],
+ self.printSize(header[rpm.RPMTAG_SIZE])))
+ else:
+ self.groupSize[key] = self.groupSize[key] - header[rpm.RPMTAG_SIZE]
+ self.total = self.total - header[rpm.RPMTAG_SIZE]
+ self.groupSelCount[key] = self.groupSelCount[key] - 1
+ self.ct.setEntry(header, "%-*s" % (self.length + 7, header[rpm.RPMTAG_NAME]))
+ self.ct.setEntry(key, "[%s] %-*s %s" % (self.printNum(key),
+ self.length - 1, key,
+ self.printSize(self.groupSize[key])))
+ self.printTotal()
+
+ def ctCallback(self):
+ data = self.ct.getCurrent()
+ (branch, isOn) = self.ct.getEntryValue(data)
+ if not branch:
+ if data.selected and not isOn:
+ self.ctSet(data, 0)
+ elif isOn and not data.selected:
+ self.ctSet(data, 1)
+ else:
+ for header in self.groups[data]:
+ (branch, isOn) = self.ct.getEntryValue(header)
+ if header.selected and not isOn:
+ self.ctSet(header, 0)
+ elif isOn and not header.selected:
+ self.ctSet(header, 1)
+
def __call__(self, screen, todo, individual):
if not individual.get():
return
@@ -49,7 +131,13 @@ class IndividualPackageWindow:
todo.getCompsList()
ct = CheckboxTree(height = 10, scroll = 1)
- groups = {}
+ self.ct = ct
+ self.groups = {}
+ self.groupSize = {}
+ self.groupCount = {}
+ self.groupSelCount = {}
+ self.length = 0
+ self.total = 0
# go through all the headers and grok out the group names, placing
# packages in lists in the groups dictionary.
@@ -58,9 +146,20 @@ class IndividualPackageWindow:
header = todo.hdList.packages[key]
# don't show this package if it is in the base group
if not todo.comps["Base"].items.has_key (header):
- if not groups.has_key (header[rpm.RPMTAG_GROUP]):
- groups[header[rpm.RPMTAG_GROUP]] = []
- groups[header[rpm.RPMTAG_GROUP]].append (header)
+ group = header[rpm.RPMTAG_GROUP]
+ if not self.groups.has_key (group):
+ self.groups[group] = []
+ self.groupSize[group] = 0
+ self.groupCount[group] = 0
+ self.groupSelCount[group] = 0
+ self.groups[group].append (header)
+ self.length = max((self.length, len(header[rpm.RPMTAG_NAME])))
+ self.groupCount[group] = self.groupCount[group] + 1
+ if header.selected:
+ self.groupSize[group] = self.groupSize[group] + header[rpm.RPMTAG_SIZE]
+ self.groupSelCount[group] = self.groupSelCount[group] + 1
+ else:
+ self.total = self.total + header[rpm.RPMTAG_SIZE]
# now insert the groups into the list, then each group's packages
# after sorting the list
@@ -71,40 +170,54 @@ class IndividualPackageWindow:
return 0
return 1
- keys = groups.keys ()
+ keys = self.groups.keys ()
keys.sort ()
+ for key in keys:
+ self.length = max((self.length, 1+len(key)))
+ self.total = self.total + self.groupSize[key]
+
index = 0
for key in keys:
- groups[key].sort (cmpHdrName)
- ct.append (key)
- for header in groups[key]:
- ct.addItem (header[rpm.RPMTAG_NAME], (index, snackArgs["append"]),
+ self.groups[key].sort (cmpHdrName)
+ name = "[%s] %-*s %s" % (self.printNum(key), self.length - 1, key, self.printSize(self.groupSize[key]))
+ ct.append (name, key)
+ for header in self.groups[key]:
+ if header.selected:
+ name = "%-*s %s" % (self.length, header[rpm.RPMTAG_NAME], self.printSize(header[rpm.RPMTAG_SIZE]))
+ else:
+ name = "%-*s" % (self.length + 7, header[rpm.RPMTAG_NAME])
+ ct.addItem (name, (index, snackArgs["append"]),
header, header.selected)
index = index + 1
+ ct.setCallback(self.ctCallback)
+
bb = ButtonBar (screen, ((_("OK"), "ok"), (_("Back"), "back")))
- g = GridForm (screen, _("Package Group Selection"), 1, 2)
- g.add (ct, 0, 0, (0, 0, 0, 1))
- g.add (bb, 0, 1, growx = 1)
+ self.lbl = Label ("")
+ self.printTotal()
+
+ g = GridForm (screen, _("Package Group Selection"), 1, 3)
+ g.add (ct, 0, 0, (0, 0, 0, 0))
+ g.add (self.lbl, 0, 1, (self.length + 5, 0, 0, 1))
+ g.add (bb, 0, 2, growx = 1)
+
g.addHotKey("F1")
- result = g.run()
- while result == "F1":
- h = ct.getCurrent()
- if type(h) != type(""):
- ButtonChoiceWindow(screen, h['name'], h['description'],
- buttons = [ _('Ok') ], x = 5, y = 5)
- result = g.run()
+ screen.pushHelpLine (_(" <Space>,<+>,<-> selection | <F1> package description | <F12> next screen"))
+
+ while 1:
+ result = g.run ()
+ if result != "F1":
+ break
+ header = self.ct.getCurrent()
+ (branch, isOn) = self.ct.getEntryValue(header)
+ if not branch:
+ self.printHelp(screen, header)
+
screen.popWindow()
-
- # turn off all the packages
- for key in todo.hdList.packages.keys ():
- todo.hdList.packages[key].selected = 0
-
- # turn on all the packages we selected
- for package in ct.getSelection ():
- package.selected = 1
+
+ screen.pushHelpLine (_(" <Tab>/<Alt-Tab> between elements | <Space> selects | <F12> next screen"))
rc = bb.buttonPressed (result)