Entropy/Spritz:
- implement package sets add/removal feature - InputDialog: implement ListStore/TreeView for EquoInterface.inputBox() Entropy/TODO: - update TODO git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2901 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
@@ -3,7 +3,6 @@ TODO list
|
||||
- server-side db backup tool
|
||||
- implement pdepend support in dependencies sorting
|
||||
- add changelog to packages
|
||||
- split entropy.py into entropy package (move exceptionTools to something saner)
|
||||
- move etpConst['conflicting_tagged_packages'] elsewhere
|
||||
- move etpConst['filesystemdirs'] and etpConst['filesystemdirsmask'] to config file
|
||||
- automatic client db backup
|
||||
@@ -16,10 +15,10 @@ TODO list
|
||||
- implement packages.db.system_mask management
|
||||
|
||||
Spritz:
|
||||
- package sets add/remove tool
|
||||
- allow package remasking
|
||||
-
|
||||
|
||||
Proposed for Entropy >1.0 (require API changes):
|
||||
- entropy.py refactoring (incl. exceptionTools)
|
||||
- UGC: personal package sets
|
||||
- UGC: bug report documents?
|
||||
- UGC: bbcode docs?
|
||||
|
||||
+64
-3
@@ -5651,13 +5651,16 @@ class InputDialog:
|
||||
def __init__(self, parent, title, input_parameters, cancel = True):
|
||||
|
||||
mywin = gtk.Window()
|
||||
# avoids to taint the returning elements
|
||||
# when running nested
|
||||
self.parameters = self.parameters.copy()
|
||||
|
||||
mywin.set_title(_("Please fill the following form"))
|
||||
myvbox = gtk.VBox()
|
||||
mylabel = gtk.Label()
|
||||
mylabel.set_markup(cleanMarkupString(title))
|
||||
myhbox = gtk.HBox()
|
||||
myvbox.pack_start(mylabel)
|
||||
myvbox.pack_start(mylabel, expand = False, fill = False)
|
||||
mytable = gtk.Table(rows = len(input_parameters), columns = 2)
|
||||
self.identifiers_table = {}
|
||||
self.cb_table = {}
|
||||
@@ -5678,16 +5681,65 @@ class InputDialog:
|
||||
input_label.set_markup(text)
|
||||
|
||||
if input_type == "checkbox":
|
||||
|
||||
input_widget = gtk.CheckButton(text)
|
||||
input_widget.set_alignment(0.0,0.5)
|
||||
input_widget.set_active(passworded)
|
||||
|
||||
elif input_type == "combo":
|
||||
|
||||
input_widget = gtk.combo_box_new_text()
|
||||
for opt in combo_options:
|
||||
input_widget.append_text(opt)
|
||||
if combo_options:
|
||||
input_widget.set_active(0)
|
||||
mytable.attach(input_label, 0, 1, row_count, row_count+1)
|
||||
|
||||
elif input_type == "list":
|
||||
|
||||
myhbox_l = gtk.HBox()
|
||||
input_widget = gtk.ListStore(gobject.TYPE_STRING)
|
||||
view = gtk.TreeView()
|
||||
cell = gtk.CellRendererText()
|
||||
column = gtk.TreeViewColumn( text, cell, markup = 0 )
|
||||
column.set_resizable( True )
|
||||
column.set_sizing( gtk.TREE_VIEW_COLUMN_FIXED )
|
||||
column.set_expand(True)
|
||||
view.append_column( column )
|
||||
view.set_model(input_widget)
|
||||
for opt in combo_options:
|
||||
input_widget.append((opt,))
|
||||
myhbox_l.pack_start(view, expand = True, fill = True)
|
||||
|
||||
myvbox_l = gtk.VBox()
|
||||
add_button = gtk.Button()
|
||||
add_image = gtk.Image()
|
||||
add_image.set_from_stock("gtk-add", gtk.ICON_SIZE_BUTTON)
|
||||
add_button.add(add_image)
|
||||
rm_button = gtk.Button()
|
||||
rm_image = gtk.Image()
|
||||
rm_image.set_from_stock("gtk-remove", gtk.ICON_SIZE_BUTTON)
|
||||
rm_button.add(rm_image)
|
||||
myvbox_l.pack_start(add_button, expand = False, fill = False)
|
||||
myvbox_l.pack_start(rm_button, expand = False, fill = False)
|
||||
|
||||
def on_add_button(widget):
|
||||
mydata = inputDialog(mywin, _("Add atom"), [('atom',_('Atom'),input_cb,False)], True)
|
||||
if mydata == None: return
|
||||
atom = mydata.get('atom')
|
||||
input_widget.append((atom,))
|
||||
|
||||
def on_remove_button(widget):
|
||||
model, iterator = view.get_selection().get_selected()
|
||||
if iterator == None: return
|
||||
model.remove(iterator)
|
||||
|
||||
add_button.connect("clicked",on_add_button)
|
||||
rm_button.connect("clicked",on_remove_button)
|
||||
|
||||
myhbox_l.pack_start(myvbox_l, expand = False, fill = False)
|
||||
mytable.attach(myhbox_l, 0, 2, row_count, row_count+1)
|
||||
|
||||
elif input_type == "text":
|
||||
|
||||
def rescroll_output(adj, scroll):
|
||||
@@ -5710,13 +5762,16 @@ class InputDialog:
|
||||
scrolled_win.add_with_viewport(my_tv)
|
||||
mytable.attach(input_label, 0, 1, row_count, row_count+1)
|
||||
mytable.attach(scrolled_win, 1, 2, row_count, row_count+1)
|
||||
|
||||
else:
|
||||
continue
|
||||
|
||||
self.entry_text_table[input_id] = text
|
||||
self.identifiers_table[input_id] = input_widget
|
||||
if input_type in ["list"]:
|
||||
def input_cb(s): return s
|
||||
self.cb_table[input_widget] = input_cb
|
||||
if input_type != "text":
|
||||
if input_type not in ["text","list"]:
|
||||
mytable.attach(input_widget, 1, 2, row_count, row_count+1)
|
||||
|
||||
|
||||
@@ -5747,7 +5802,7 @@ class InputDialog:
|
||||
mycancel = gtk.Button(stock = "gtk-cancel")
|
||||
mycancel.connect('clicked', self.do_cancel )
|
||||
bbox.pack_start(mycancel)
|
||||
myvbox.pack_start(bbox)
|
||||
myvbox.pack_start(bbox, expand = False, fill = False)
|
||||
myvbox.set_spacing(10)
|
||||
myvbox.show()
|
||||
myhbox.pack_start(myvbox, padding = 10)
|
||||
@@ -5778,6 +5833,12 @@ class InputDialog:
|
||||
content = mywidget.get_active(),mywidget.get_active_text()
|
||||
elif isinstance(mywidget,gtk.TextBuffer):
|
||||
content = mywidget.get_text(mywidget.get_start_iter(),mywidget.get_end_iter(), True)
|
||||
elif isinstance(mywidget,(gtk.ListStore,gtk.TreeStore,)):
|
||||
myiter = mywidget.get_iter_first()
|
||||
content = []
|
||||
while myiter:
|
||||
content.append(mywidget.get_value(myiter, 0))
|
||||
myiter = mywidget.iter_next(myiter)
|
||||
else:
|
||||
continue
|
||||
verify_cb = self.cb_table.get(mywidget)
|
||||
|
||||
@@ -45,6 +45,8 @@ class DummyEntropyPackage:
|
||||
self.set_from = None
|
||||
self.set_cat_namedesc = None
|
||||
self.set_category = False
|
||||
self.set_install_incomplete = False
|
||||
self.set_remove_incomplete = False
|
||||
|
||||
class EntropyPackage:
|
||||
|
||||
@@ -67,6 +69,8 @@ class EntropyPackage:
|
||||
self.set_from = None
|
||||
self.set_cat_namedesc = None
|
||||
self.set_category = False
|
||||
self.set_install_incomplete = False
|
||||
self.set_remove_incomplete = False
|
||||
|
||||
self.matched_atom = matched_atom
|
||||
self.installed_match = None
|
||||
|
||||
+18
-13
@@ -226,18 +226,20 @@ class EntropyPackages:
|
||||
def _pkg_get_pkgset_matches_installed_matches(self, set_deps):
|
||||
set_matches = []
|
||||
set_installed_matches = []
|
||||
install_incomplete = False
|
||||
remove_incomplete = False
|
||||
for set_dep in set_deps:
|
||||
if set_dep.startswith(etpConst['packagesetprefix']):
|
||||
set_matches.append((set_dep,None,))
|
||||
set_installed_matches.append((set_dep,None,))
|
||||
else:
|
||||
set_match = self.Entropy.atomMatch(set_dep)
|
||||
if set_match[0] != -1:
|
||||
set_matches.append(set_match)
|
||||
if set_match[0] != -1: set_matches.append(set_match)
|
||||
else: install_incomplete = True
|
||||
set_installed_match = self.Entropy.clientDbconn.atomMatch(set_dep)
|
||||
if set_match[0] != -1:
|
||||
set_installed_matches.append(set_installed_match)
|
||||
return set_matches,set_installed_matches
|
||||
if set_match[0] != -1: set_installed_matches.append(set_installed_match)
|
||||
else: remove_incomplete = True
|
||||
return set_matches, set_installed_matches, install_incomplete, remove_incomplete
|
||||
|
||||
def _pkg_get_pkgset_set_from_desc(self, set_from):
|
||||
my_set_from = _('Set from')
|
||||
@@ -264,7 +266,7 @@ class EntropyPackages:
|
||||
pkgsets = self.getPackageSets()
|
||||
for set_from, set_name, set_deps in pkgsets:
|
||||
|
||||
set_matches, set_installed_matches = self._pkg_get_pkgset_matches_installed_matches(set_deps)
|
||||
set_matches, set_installed_matches, install_incomplete, remove_incomplete = self._pkg_get_pkgset_matches_installed_matches(set_deps)
|
||||
if not (set_matches and set_installed_matches): continue
|
||||
cat_namedesc = self._pkg_get_pkgset_set_from_desc(set_from)
|
||||
set_objects = []
|
||||
@@ -277,10 +279,8 @@ class EntropyPackages:
|
||||
yp.set_matches = set_matches
|
||||
yp.set_installed_matches = set_installed_matches
|
||||
|
||||
# add myself, to make sure we have an element in cache
|
||||
#yp, new = gp_call("%s%s" % (etpConst['packagesetprefix'],set_name,),True)
|
||||
#update_yp(yp)
|
||||
|
||||
myobjs = []
|
||||
broken = False
|
||||
for match in set_matches:
|
||||
# set dependency
|
||||
if match[1] == None:
|
||||
@@ -290,9 +290,14 @@ class EntropyPackages:
|
||||
try:
|
||||
yp, new = gp_call(match,True)
|
||||
except exceptionTools.RepositoryError:
|
||||
continue
|
||||
update_yp(yp)
|
||||
objects.append(yp)
|
||||
broken = True
|
||||
break
|
||||
myobjs.append(yp)
|
||||
if broken: continue
|
||||
|
||||
for yp in myobjs: yp.set_names.clear()
|
||||
for yp in myobjs: update_yp(yp)
|
||||
objects += myobjs
|
||||
|
||||
return objects
|
||||
|
||||
|
||||
+1934
-1831
File diff suppressed because it is too large
Load Diff
+69
-1
@@ -2128,6 +2128,9 @@ class SpritzApplication(Controller):
|
||||
else:
|
||||
self.ui.maskedWarningBox.hide()
|
||||
|
||||
if action == "pkgsets": self.ui.pkgsetsButtonBox.show()
|
||||
else: self.ui.pkgsetsButtonBox.hide()
|
||||
|
||||
if action == "queued": self.ui.queueReviewAndInstallBox.show()
|
||||
else: self.ui.queueReviewAndInstallBox.hide()
|
||||
|
||||
@@ -2433,6 +2436,72 @@ class SpritzApplication(Controller):
|
||||
def on_noticeBoardMenuItem_activate(self, widget):
|
||||
self.showNoticeBoard()
|
||||
|
||||
def on_pkgsetAddButton_clicked(self, widget):
|
||||
|
||||
current_sets = self.Equo.packageSetList()
|
||||
def fake_callback(s):
|
||||
if (s not in current_sets) and (" " not in s) and (not s.startswith(etpConst['packagesetprefix'])):
|
||||
return True
|
||||
return False
|
||||
|
||||
def lv_callback(atom):
|
||||
c_id, c_rc = self.Equo.clientDbconn.atomMatch(atom)
|
||||
if c_id != -1: return True
|
||||
c_id, c_rc = self.Equo.atomMatch(atom)
|
||||
if c_id != -1: return True
|
||||
return False
|
||||
|
||||
input_params = [
|
||||
('name',_("Package Set name"),fake_callback,False),
|
||||
('atoms',('list',(_('Package atoms'),[],),),lv_callback,False)
|
||||
]
|
||||
|
||||
data = self.Equo.inputBox(
|
||||
_('Choose what Package Set you want to add'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
|
||||
rc, msg = self.Equo.add_user_package_set(data.get("name"), data.get("atoms"))
|
||||
if rc != 0:
|
||||
okDialog(self.ui.main,"%s: %s" % (_("Error"),msg,))
|
||||
return
|
||||
|
||||
self.etpbase.clearPackagesSingle("pkgsets")
|
||||
self.addPackages()
|
||||
|
||||
def on_pkgsetRemoveButton_clicked(self, widget):
|
||||
|
||||
def mymf(m):
|
||||
set_from, set_name, set_deps = m
|
||||
if set_from == etpConst['userpackagesetsid']:
|
||||
return set_name
|
||||
return 0
|
||||
avail_pkgsets = [x for x in map(mymf,self.Equo.packageSetList()) if x != 0]
|
||||
|
||||
def fake_callback(s):
|
||||
return True
|
||||
input_params = [
|
||||
('pkgset',('combo',(_('Removable Package Set'),avail_pkgsets),),fake_callback,False)
|
||||
]
|
||||
|
||||
data = self.Equo.inputBox(
|
||||
_('Choose what Package Set you want to remove'),
|
||||
input_params,
|
||||
cancel_button = True
|
||||
)
|
||||
if data == None: return
|
||||
x_id,set_name = data.get("pkgset")
|
||||
|
||||
rc, msg = self.Equo.remove_user_package_set(set_name)
|
||||
if rc != 0:
|
||||
okDialog(self.ui.main,"%s: %s" % (_("Error"),msg,))
|
||||
return
|
||||
|
||||
self.etpbase.clearPackagesSingle("pkgsets")
|
||||
self.addPackages()
|
||||
|
||||
def on_deptestButton_clicked(self, widget):
|
||||
self.switchNotebookPage("output")
|
||||
self.uiLock(True)
|
||||
@@ -2556,7 +2625,6 @@ class SpritzApplication(Controller):
|
||||
|
||||
do_stop()
|
||||
|
||||
|
||||
def on_color_reset(self, widget):
|
||||
# get parent
|
||||
parent = widget.get_parent()
|
||||
|
||||
+7
-4
@@ -771,8 +771,13 @@ class EntropyPackageView:
|
||||
pkgsets, exp_matches, objs, set_objs, exp_atoms = self._get_pkgset_data(self.selected_objs, add = install)
|
||||
|
||||
if not objs+set_objs: return
|
||||
q_cache = {}
|
||||
|
||||
install_incomplete = [x for x in self.selected_objs if x.set_install_incomplete]
|
||||
remove_incomplete = [x for x in self.selected_objs if x.set_remove_incomplete]
|
||||
if (install and install_incomplete) or ((not install) and remove_incomplete):
|
||||
okDialog(self.ui.main,_("There are incomplete package sets, continue at your own risk"))
|
||||
|
||||
q_cache = {}
|
||||
for obj in objs+set_objs:
|
||||
q_cache[obj.matched_atom] = obj.queued
|
||||
if install:
|
||||
@@ -1113,13 +1118,11 @@ class EntropyPackageView:
|
||||
mydummy = DummyEntropyPackage(namedesc = cat_text, dummy_type = SpritzConf.dummy_category, onlyname = category)
|
||||
mydummy.color = SpritzConf.color_package_category
|
||||
if pkgsets:
|
||||
|
||||
set_from, set_name, set_deps = self.Equo.packageSetMatch(category)[0]
|
||||
mydummy.set_category = category
|
||||
mydummy.set_from = set_from
|
||||
mydummy.set_matches, mydummy.set_installed_matches = self.etpbase._pkg_get_pkgset_matches_installed_matches(set_deps)
|
||||
mydummy.set_matches, mydummy.set_installed_matches, mydummy.set_install_incomplete, mydummy.set_remove_incomplete = self.etpbase._pkg_get_pkgset_matches_installed_matches(set_deps)
|
||||
mydummy.namedesc = "<b><big>%s</big></b>\n<small>%s</small>" % (category,cleanMarkupString(self.etpbase._pkg_get_pkgset_set_from_desc(set_from)),)
|
||||
|
||||
self.dummyCats[category] = mydummy
|
||||
parent = self.store.append( None, (mydummy,) )
|
||||
for po in categories[category]:
|
||||
|
||||
Reference in New Issue
Block a user