- Spritz:

- reworked action menu to allow reinstall, remove, purge, update, install, undo reinstall, undo remove, undo purge, undo update, undo install


git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@1100 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
(no author)
2008-01-27 16:43:39 +00:00
parent cc985ea1f0
commit 745b46aade
24 changed files with 659 additions and 145 deletions
+2 -1
View File
@@ -19,7 +19,7 @@ clean:
install:
mkdir -p $(DESTDIR)/usr/lib/entropy/spritz
mkdir -p $(DESTDIR)/usr/share/pixmaps/spritz
mkdir -p $(DESTDIR)/usr/share/pixmaps/spritz/packages
mkdir -p $(DESTDIR)/usr/share/applications
mkdir -p $(DESTDIR)/usr/bin
mkdir -p $(DESTDIR)/etc
@@ -27,6 +27,7 @@ install:
install -m644 COPYING $(DESTDIR)/usr/lib/entropy/spritz/.
install -m755 $(MISCDIR)/spritz $(DESTDIR)/usr/bin/.
install -m644 $(PIXDIR)/*.png $(DESTDIR)/usr/share/pixmaps/spritz/.
install -m644 $(PIXDIR)/packages/*.png $(DESTDIR)/usr/share/pixmaps/spritz/packages/.
install -m644 $(MISCDIR)/spritz.pam $(DESTDIR)/etc/pam.d/spritz
chmod +x $(DESTDIR)/usr/bin/spritz
install -m644 $(MISCDIR)/spritz.desktop $(DESTDIR)/usr/share/applications/.
Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 396 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 833 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 731 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

+10 -4
View File
@@ -28,7 +28,7 @@ except:
from ConfigParser import ConfigParser,SafeConfigParser
from misc import const,cleanMarkupSting,YumexConf
from misc import const,cleanMarkupSting,YumexConf,unicode2htmlentities
from i18n import _
class ConfimationDialog:
@@ -79,15 +79,21 @@ class ConfimationDialog:
def show_data( self, model, pkgs ):
model.clear()
for pkg in pkgs:
label = "<b>%s</b>" % str(pkg)
model.append( None, [label, pkg.description] )
label = "<b>%s</b>" % unicode2htmlentities(str(pkg))
desc = pkg.description
model.append( None, [label, desc] )
def show_data( self, model, pkgs ):
model.clear()
install = [x for x in pkgs if x.action == "i"]
update = [x for x in pkgs if x.action == "u"]
remove = [x for x in pkgs if x.action == "r"]
# install
reinstall = [x for x in pkgs if x.action == "rr"]
if reinstall:
label = "<b>%s</b>" % _("To be reinstalled")
level1 = model.append( None, [label, " "] )
for pkg in reinstall:
level2 = model.append( level1, [str(pkg), pkg.description] )
if install:
label = "<b>%s</b>" % _("To be installed")
level1 = model.append( None, [label, " "] )
+3 -1
View File
@@ -37,7 +37,7 @@ class QueueExecutor:
self.Spritz = SpritzApplication
self.Entropy = SpritzApplication.Equo
def run(self, install_queue, removal_queue):
def run(self, install_queue, removal_queue, do_purge_cache = []):
removalQueue = []
runQueue = []
if install_queue:
@@ -86,6 +86,8 @@ class QueueExecutor:
metaopts = {}
metaopts['removeconfig'] = rem_data[1]
if idpackage in do_purge_cache:
metaopts['removeconfig'] = True
Package = self.Entropy.Package()
Package.prepare((idpackage,),"remove", metaopts)
+11 -2
View File
@@ -34,9 +34,10 @@ class PackageWrapper:
self.idpackage = self.matched_atom[0]
self.Entropy = EquoConnection
self.available = avail
self.do_purge = False
def __str__(self):
return str(self.dbconn.retrieveAtom(self.idpackage))
return str(self.dbconn.retrieveAtom(self.idpackage)+"~"+str(self.dbconn.retrieveRevision(self.idpackage)))
def __cmp__(self, pkg):
n1 = str(self)
@@ -72,6 +73,13 @@ class PackageWrapper:
def getRevision(self):
return self.dbconn.retrieveRevision(self.idpackage)
def getSysPkg(self):
if not self.from_installed:
return False
# check if it's a system package
s = self.Entropy.validatePackageRemoval(self.idpackage)
return not s
# 0: from installed db, so it's installed for sure
# 1: not installed
# 2: updatable
@@ -84,7 +92,7 @@ class PackageWrapper:
if not matches:
return 1
else:
rc = self.Entropy.check_package_update(key+":"+slot)
rc, matched = self.Entropy.check_package_update(key+":"+slot)
if rc:
return 2
else:
@@ -202,4 +210,5 @@ class PackageWrapper:
arch = property(fget=getArch)
epoch = property(fget=getEpoch)
pkgtup = property(fget=getTup)
syspkg = property(fget=getSysPkg)
install_status = property(fget=getInstallStatus)
+2 -2
View File
@@ -274,11 +274,11 @@ class SpritzGUI:
self.etpbase = etpbase
self.queue = SpritzQueue()
self.queueView = YumexQueueView(self.ui.queueView,self.queue)
self.pkgView = EntropyPackageView(self.ui.viewPkg,self.queueView, self.ui)
self.pkgView = EntropyPackageView(self.ui.viewPkg,self.queueView, self.ui, self.etpbase)
self.queue.connect_objects(self.Entropy, self.etpbase, self.pkgView, self.ui)
#self.catView = YumexCategoryView(self.ui.tvCategory)
self.catsView = CategoriesView(self.ui.tvComps,self.queueView)
self.catPackages = EntropyPackageView(self.ui.tvCatPackages,self.queueView, self.ui)
self.catPackages = EntropyPackageView(self.ui.tvCatPackages,self.queueView, self.ui, self.etpbase)
self.catDesc = TextViewConsole(self.ui.catDesc)
self.repoView = EntropyRepoView(self.ui.viewRepo, self.Entropy, self.ui)
self.repoMirrorsView = EntropyRepositoryMirrorsView(self.addrepo_ui.mirrorsView)
+39 -28
View File
@@ -40,6 +40,10 @@ class const:
PIXMAPS_PATH = '/usr/share/pixmaps/spritz'
else:
PIXMAPS_PATH = MAIN_PATH+'/../gfx'
if MAIN_PATH == '/usr/lib/entropy/spritz':
ICONS_PATH = '/usr/share/pixmaps/spritz'
else:
ICONS_PATH = MAIN_PATH+'/pixmaps'
# package categories
PACKAGE_CATEGORIES = [
@@ -144,19 +148,16 @@ class SpritzQueue:
def __init__(self):
self.logger = logging.getLogger('yumex.YumexQueue')
self.packages = {}
self.packages['i'] = []
self.packages['u'] = []
self.packages['r'] = []
self.groups = {}
self.groups['i'] = []
self.groups['r'] = []
self.before = []
self.clear()
self.Entropy = None
self.etpbase = None
self.pkgView = None
self.queueView = None
import dialogs
self.dialogs = dialogs
self.before = []
def connect_objects(self, EquoConnection, etpbase, pkgView, ui):
self.Entropy = EquoConnection
@@ -169,6 +170,7 @@ class SpritzQueue:
self.packages['i'] = []
self.packages['u'] = []
self.packages['r'] = []
self.packages['rr'] = []
self.groups.clear()
self.groups['i'] = []
self.groups['r'] = []
@@ -181,19 +183,22 @@ class SpritzQueue:
return self.packages[action]
def total(self):
return len(self.packages['i'])+len(self.packages['u'])+len(self.packages['r'])
size = 0
for key in self.packages:
size += len(self.packages[key])
return size
def add(self, pkgs):
if type(pkgs) is not list:
pkgs = [pkgs]
action = [pkgs[0].action]
if action[0] in ("u","i"): # update/install
action = [pkgs[0].queued]
if action[0] in ("u","i","rr"): # update/install
action = ["u","i"]
tmpqueue = [x for x in pkgs if x not in self.packages['u']+self.packages['i']]
xlist = [x.matched_atom for x in self.packages['u']+self.packages['i']+tmpqueue]
action = ["u","i","rr"]
tmpqueue = [x for x in pkgs if x not in self.packages['u']+self.packages['i']+self.packages['rr']]
xlist = [x.matched_atom for x in self.packages['u']+self.packages['i']+self.packages['rr']+tmpqueue]
xlist = list(set(xlist))
status = self.elaborateInstall(xlist,action,False)
return status,0
@@ -223,12 +228,14 @@ class SpritzQueue:
install_todo = []
if runQueue:
#print "runQueue",runQueue
for dep_pkg in self.etpbase.getPackages('updates')+self.etpbase.getPackages('available'):
for matched_atom in runQueue:
if (dep_pkg.matched_atom == matched_atom) and \
(dep_pkg not in self.packages[actions[0]]+self.packages[actions[1]]) and \
(dep_pkg not in install_todo):
install_todo.append(dep_pkg)
for dep_pkg in self.etpbase.getPackages('updates') + \
self.etpbase.getPackages('available') + \
self.etpbase.getPackages('reinstallable'):
for matched_atom in runQueue:
if (dep_pkg.matched_atom == matched_atom) and \
(dep_pkg not in self.packages[actions[0]]+self.packages[actions[1]]+self.packages[actions[2]]) and \
(dep_pkg not in install_todo):
install_todo.append(dep_pkg)
# removalQueue
if removalQueue:
@@ -267,12 +274,10 @@ class SpritzQueue:
if ok:
for rem_pkg in remove_todo:
rem_pkg.set_select(False)
rem_pkg.queued = rem_pkg.action
if rem_pkg not in self.packages['r']:
self.packages['r'].append(rem_pkg)
for dep_pkg in install_todo:
dep_pkg.set_select(True)
dep_pkg.queued = dep_pkg.action
if dep_pkg not in self.packages[dep_pkg.action]:
self.packages[dep_pkg.action].append(dep_pkg)
@@ -320,7 +325,6 @@ class SpritzQueue:
if ok:
for rem_pkg in todo:
rem_pkg.set_select(False)
rem_pkg.queued = rem_pkg.action
if rem_pkg not in self.packages[rem_pkg.action]:
self.packages[rem_pkg.action].append(rem_pkg)
@@ -334,7 +338,6 @@ class SpritzQueue:
# check if it's a system package
valid = self.Entropy.validatePackageRemoval(pkg.matched_atom[0])
if not valid:
pkg.set_select(not pkg.selected)
pkg.queued = None
return valid
@@ -346,17 +349,17 @@ class SpritzQueue:
pkgs = [pkgs]
action = [pkgs[0].action]
if action[0] in ("u","i"): # update/install
if action[0] in ("u","i","rr"): # update/install
action = ["u","i"]
action = ["u","i","rr"]
xlist = [x.matched_atom for x in self.packages['u']+self.packages['i'] if x not in pkgs]
self.before = self.packages['u'][:]+self.packages['i'][:]
xlist = [x.matched_atom for x in self.packages['u']+self.packages['i']+self.packages['rr'] if x not in pkgs]
self.before = self.packages['u'][:]+self.packages['i'][:]+self.packages['rr'][:]
for pkg in self.before:
pkg.set_select(False)
pkg.queued = None
del self.packages['u'][:]
del self.packages['i'][:]
del self.packages['rr'][:]
if xlist:
@@ -374,7 +377,6 @@ class SpritzQueue:
self.before = self.packages[action[0]][:]
# clean, will be refilled
for pkg in self.before:
pkg.set_select(True)
pkg.queued = None
del self.packages[action[0]][:]
@@ -717,3 +719,12 @@ class fakeinfile:
def tell(self): raise IOError, (29, 'Illegal seek')
truncate = tell
from htmlentitydefs import codepoint2name
def unicode2htmlentities(u):
htmlentities = list()
for c in u:
if ord(c) < 128:
htmlentities.append(c)
else:
htmlentities.append('&%s;' % codepoint2name[ord(c)])
return ''.join(htmlentities)
+13 -4
View File
@@ -39,7 +39,6 @@ class EntropyPackage( PackageWrapper ):
def __init__( self, matched_atom, recentlimit, avail=True ):
global color_normal
PackageWrapper.__init__( self, matched_atom, avail )
self.selected = False
self.visible = True
self.queued = None
self.action = None
@@ -52,9 +51,6 @@ class EntropyPackage( PackageWrapper ):
else:
self.recent = False
def set_select( self, state ):
self.selected = state
def set_visible( self, state ):
self.visible = state
@@ -157,6 +153,8 @@ class EntropyPackages:
pkgs = []
pkgs.extend(self.getPackages('installed'))
pkgs.extend(self.getPackages('available'))
pkgs.extend(self.getPackages('reinstallable'))
pkgs.extend(self.getPackages('updates'))
return pkgs
def setFilter(self,fn = None):
@@ -224,6 +222,17 @@ class EntropyPackages:
yp.action = 'u'
yp.color = color_update
yield yp
elif mask == "reinstallable":
for idpackage in self.Entropy.clientDbconn.listAllIdpackages():
atom = self.Entropy.clientDbconn.retrieveAtom(idpackage)
upd, matched = self.Entropy.check_package_update(atom)
if not upd and matched:
if matched[0] != -1:
yp = EntropyPackage(matched, self.recent, False)
yp.selected = True
yp.action = 'rr'
yp.color = color_install
yield yp
def getByProperty( self, type, category ):
list = self.getPackages(type)
+229
View File
@@ -4263,4 +4263,233 @@ gz</property>
</child>
</widget>
<widget class="GtkMenu" id="packageInstalled">
<child>
<widget class="GtkImageMenuItem" id="reinstall">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Reinstall the selected package</property>
<property name="label" translatable="yes">Reinstall</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_reinstall_activate" last_modification_time="Sat, 26 Jan 2008 15:45:15 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image266">
<property name="visible">True</property>
<property name="stock">gtk-refresh</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="undoreinstall">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Undo Reinstall action</property>
<property name="label" translatable="yes">Undo Reinstall</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_undoreinstall_activate" last_modification_time="Sun, 27 Jan 2008 12:01:59 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image267">
<property name="visible">True</property>
<property name="stock">gtk-undo</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="remove">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Remove the selected package</property>
<property name="label" translatable="yes">Remove</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_remove_activate" last_modification_time="Sat, 26 Jan 2008 15:45:15 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image268">
<property name="visible">True</property>
<property name="stock">gtk-undo</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="undoremove">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Undo Remove action</property>
<property name="label" translatable="yes">Undo Remove</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_undoremove_activate" last_modification_time="Sun, 27 Jan 2008 12:02:23 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image269">
<property name="visible">True</property>
<property name="stock">gtk-undo</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="purge">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Remove the selected package and its configuration</property>
<property name="label" translatable="yes">Purge</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_purge_activate" last_modification_time="Sun, 27 Jan 2008 14:54:43 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image270">
<property name="visible">True</property>
<property name="stock">gtk-cancel</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="undopurge">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Undo Purge action</property>
<property name="label" translatable="yes">Undo Purge</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_undopurge_activate" last_modification_time="Sun, 27 Jan 2008 12:03:55 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image271">
<property name="visible">True</property>
<property name="stock">gtk-undo</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
</widget>
<widget class="GtkMenu" id="packageUpdates">
<child>
<widget class="GtkImageMenuItem" id="update">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Update the selected package</property>
<property name="label" translatable="yes">Update</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_update_activate" last_modification_time="Sun, 27 Jan 2008 15:02:09 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image281">
<property name="visible">True</property>
<property name="stock">gtk-refresh</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="undoupdate">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Undo Update action</property>
<property name="label" translatable="yes">Undo Update</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_undoupdate_activate" last_modification_time="Sun, 27 Jan 2008 15:02:28 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image282">
<property name="visible">True</property>
<property name="stock">gtk-undo</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
</widget>
<widget class="GtkMenu" id="packageInstall">
<child>
<widget class="GtkImageMenuItem" id="install">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Install the selected package</property>
<property name="label" translatable="yes">Install</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_install_activate" last_modification_time="Sun, 27 Jan 2008 15:25:36 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image287">
<property name="visible">True</property>
<property name="stock">gtk-refresh</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkImageMenuItem" id="undoinstall">
<property name="visible">True</property>
<property name="tooltip" translatable="yes">Undo Install action</property>
<property name="label" translatable="yes">Undo Install</property>
<property name="use_underline">True</property>
<signal name="activate" handler="on_undoinstall_activate" last_modification_time="Sun, 27 Jan 2008 15:25:58 GMT"/>
<child internal-child="image">
<widget class="GtkImage" id="image288">
<property name="visible">True</property>
<property name="stock">gtk-undo</property>
<property name="icon_size">1</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
</widget>
</child>
</widget>
</child>
</widget>
</glade-interface>
+8 -17
View File
@@ -67,9 +67,9 @@ class SpritzController(Controller):
self.pty = pty.openpty()
self.output = fakeoutfile(self.pty[1])
self.input = fakeinfile(self.pty[1])
sys.stdout = self.output
sys.stderr = self.output
sys.stdin = self.input
#sys.stdout = self.output
#sys.stderr = self.output
#sys.stdin = self.input
def quit(self, widget=None, event=None ):
@@ -460,11 +460,6 @@ class SpritzController(Controller):
def on_select_clicked(self,widget):
''' Package Add All button handler '''
if len(self.pkgView.store) > 50:
msg = _('You are about to add %s packages and their dependencies\n') % len(self.pkgView.store)
msg += _('Do you want to continue ?')
if not questionDialog(self.ui.main,msg):
return
busyCursor(self.ui.main)
self.pkgView.selectAll()
normalCursor(self.ui.main)
@@ -472,11 +467,6 @@ class SpritzController(Controller):
def on_deselect_clicked(self,widget):
''' Package Remove All button handler '''
self.on_clear_clicked(widget)
if len(self.pkgView.store) > 50:
msg = _('You are about to remove %s packages and their depends\n') % len(self.pkgView.store)
msg += _('Do you want to continue ?')
if not questionDialog(self.ui.main,msg):
return
busyCursor(self.ui.main)
self.pkgView.deselectAll()
normalCursor(self.ui.main)
@@ -535,7 +525,7 @@ class SpritzController(Controller):
flt.setFilterList(lst)
else:
flt.activate(False)
action = self.lastPkgPB
action = self.lastPkgPB
rb = self.packageRB[action]
self.on_pkgFilter_toggled(rb,action)
@@ -551,7 +541,7 @@ class SpritzController(Controller):
flt.setFilterList(lst)
else:
flt.activate(False)
action = self.lastPkgPB
action = self.lastPkgPB
rb = self.packageRB[action]
self.on_pkgFilter_toggled(rb,action)
@@ -605,7 +595,7 @@ class SpritzApplication(SpritzController,SpritzGUI):
if self.settings.debug:
self.spritzOptions.dump()
print self.spritzOptions.getArgs()
self.logger.info(_('Entropy Config Setuo'))
self.logger.info(_('Entropy Config Setup'))
self.spritzOptions.parseCmdOptions()
self.catsView.etpbase = self.etpbase
self.lastPkgPB = "updates"
@@ -818,9 +808,10 @@ class SpritzApplication(SpritzController,SpritzGUI):
queue = pkgs['i']+pkgs['u']
install_queue = [x.matched_atom for x in queue]
removal_queue = [x.matched_atom[0] for x in pkgs['r']]
do_purge_cache = set([x.matched_atom[0] for x in pkgs['r'] if x.do_purge])
if install_queue or removal_queue:
controller = QueueExecutor(self)
e,i = controller.run(install_queue[:], removal_queue[:])
e,i = controller.run(install_queue[:], removal_queue[:], do_purge_cache)
print e,i
# XXX let it sleep a bit to allow all other threads to flush
while gtk.events_pending():
+342 -86
View File
@@ -22,11 +22,14 @@ import gobject
import logging
import glob
import ConfigParser
from misc import const
from etpgui.widgets import UI
from etpgui import *
from entropyConstants import *
from i18n import _
TOGGLE_WIDTH = 12
class YumexCategoryView:
def __init__( self, treeview):
@@ -55,41 +58,328 @@ class YumexCategoryView:
for el in data:
self.model.append(None,[el,el])
class EntropyPackageView:
def __init__( self, treeview, qview, ui ):
def __init__( self, treeview, qview, ui, etpbase ):
self.selection_width = 20
self.loaded_widget = None
self.loaded_reinstallable = None
self.loaded_event = None
self.event_click_pos = 0,0
# default for installed packages
self.pkg_install_ok = "package-installed-updated.png"
self.pkg_install_updatable = "package-installed-outdated.png"
self.pkg_install_new = "package-available.png"
self.pkg_remove = "package-remove.png"
self.pkg_purge = "package-purge.png"
self.pkg_reinstall = "package-reinstall.png"
self.pkg_install = "package-install.png"
self.pkg_update = "package-upgrade.png"
self.pkg_downgrade = "package-downgrade.png"
self.pkg_undoinstall = "package-undoinstall.png"
self.img_pkg_install_ok = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_install_ok,self.pkg_install_ok)
self.img_pkg_install_updatable = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_install_updatable,self.pkg_install_updatable)
self.img_pkg_update = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_update,self.pkg_update)
self.img_pkg_downgrade = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_downgrade,self.pkg_downgrade)
self.img_pkg_install_new = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_install_new,self.pkg_install_new)
self.img_pkg_remove = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_remove,self.pkg_remove)
self.img_pkg_undoremove = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_undoremove,self.pkg_remove)
self.img_pkg_purge = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_purge,self.pkg_purge)
self.img_pkg_undopurge = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_undopurge,self.pkg_purge)
self.img_pkg_reinstall = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_reinstall,self.pkg_reinstall)
self.img_pkg_undoreinstall = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_undoreinstall,self.pkg_reinstall)
self.img_pkg_install = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_install,self.pkg_install)
self.img_pkg_undoinstall = gtk.Image()
self.set_pixbuf_to_image(self.img_pkg_undoinstall,self.pkg_undoinstall)
self.view = treeview
self.view.connect("button-release-event", self.load_menu)
self.headers = [_( "Package" ), _( "Ver" ), _( "Summary" ), _( "Repo" ), _( "Architecture" ), _( "Size" )]
self.store = self.setupView()
self.queue = qview.queue
self.queueView = qview
self.ui = ui
self.etpbase = etpbase
self.clearUpdates()
# installed packages right click menu
self.installed_menu_xml = gtk.glade.XML( const.GLADE_FILE, "packageInstalled",domain="yumex" )
self.installed_menu = self.installed_menu_xml.get_widget( "packageInstalled" )
self.installed_menu_xml.signal_autoconnect(self)
self.installed_reinstall = self.installed_menu_xml.get_widget( "reinstall" )
self.installed_undoreinstall = self.installed_menu_xml.get_widget( "undoreinstall" )
self.installed_purge = self.installed_menu_xml.get_widget( "purge" )
self.installed_undopurge = self.installed_menu_xml.get_widget( "undopurge" )
self.installed_remove = self.installed_menu_xml.get_widget( "remove" )
self.installed_undoremove = self.installed_menu_xml.get_widget( "undoremove" )
self.installed_reinstall.set_image(self.img_pkg_reinstall)
self.installed_undoreinstall.set_image(self.img_pkg_undoreinstall)
self.installed_remove.set_image(self.img_pkg_remove)
self.installed_undoremove.set_image(self.img_pkg_undoremove)
self.installed_purge.set_image(self.img_pkg_purge)
self.installed_undopurge.set_image(self.img_pkg_undopurge)
# updates right click menu
self.updates_menu_xml = gtk.glade.XML( const.GLADE_FILE, "packageUpdates",domain="yumex" )
self.updates_menu = self.updates_menu_xml.get_widget( "packageUpdates" )
self.updates_menu_xml.signal_autoconnect(self)
self.updates_update = self.updates_menu_xml.get_widget( "update" )
self.updates_undoupdate = self.updates_menu_xml.get_widget( "undoupdate" )
self.updates_update.set_image(self.img_pkg_update)
self.updates_undoupdate.set_image(self.img_pkg_downgrade)
# install right click menu
self.install_menu_xml = gtk.glade.XML( const.GLADE_FILE, "packageInstall",domain="yumex" )
self.install_menu = self.install_menu_xml.get_widget( "packageInstall" )
self.install_menu_xml.signal_autoconnect(self)
self.install_install = self.install_menu_xml.get_widget( "install" )
self.install_undoinstall = self.install_menu_xml.get_widget( "undoinstall" )
self.install_install.set_image(self.img_pkg_install)
self.updates_undoupdate.set_image(self.img_pkg_undoinstall)
def reset_install_menu(self):
self.install_install.show()
self.install_undoinstall.hide()
def hide_install_menu(self):
self.install_install.hide()
self.install_undoinstall.hide()
def reset_updates_menu(self):
self.updates_undoupdate.hide()
self.updates_update.show()
def hide_updates_menu(self):
self.updates_undoupdate.hide()
self.updates_update.hide()
def reset_installed_packages_menu(self):
self.installed_undoremove.hide()
self.installed_undoreinstall.hide()
self.installed_undopurge.hide()
self.installed_remove.show()
self.installed_reinstall.show()
self.installed_purge.show()
def hide_installed_packages_menu(self):
self.installed_undoremove.hide()
self.installed_undoreinstall.hide()
self.installed_undopurge.hide()
self.installed_remove.hide()
self.installed_reinstall.hide()
self.installed_purge.hide()
def load_menu(self, widget, event):
self.loaded_widget = widget
self.loaded_event = event
#if event.button != 3:
# return True
row,column, x, y = widget.get_path_at_pos(int(event.x),int(event.y))
self.event_click_pos = x,y
if column.get_title() != "S":
return True
model, iter = widget.get_selection().get_selected()
if iter:
obj = model.get_value( iter, 0 )
if obj.action in ["r"]: # installed packages listing
self.run_installed_menu_stuff(obj)
elif obj.action in ["u"]: # updatable packages listing
self.run_updates_menu_stuff(obj)
elif obj.action in ["i"]:
self.run_install_menu_stuff(obj)
def reposition_menu(self, menu):
# devo tradurre x=0,y=20 in posizioni assolute
abs_x, abs_y = self.loaded_event.get_root_coords()
#print abs_x,abs_y
#print self.loaded_event.x,self.loaded_event.y
abs_x -= self.loaded_event.x
event_y = self.loaded_event.y
# FIXME: find a better way to properly position menu
while event_y > self.selection_width+5:
event_y -= self.selection_width+4
abs_y += (self.selection_width-event_y)
return int(abs_x),int(abs_y),True
def run_install_menu_stuff(self, obj):
do_show = True
self.reset_install_menu()
if obj.queued:
self.hide_install_menu()
self.install_undoinstall.show()
self.install_menu.popup( None, None, self.reposition_menu, self.loaded_event.button, self.loaded_event.time )
def run_updates_menu_stuff(self, obj):
do_show = True
self.reset_updates_menu()
if obj.queued:
self.hide_updates_menu()
self.updates_undoupdate.show()
self.updates_menu.popup( None, None, self.reposition_menu, self.loaded_event.button, self.loaded_event.time)
def run_installed_menu_stuff(self, obj):
do_show = True
self.reset_installed_packages_menu()
if obj.queued:
self.hide_installed_packages_menu()
if obj.queued == "r" and not obj.do_purge:
self.installed_undoremove.show()
elif obj.queued == "rr":
self.installed_undoreinstall.show()
self.set_loaded_reinstallable(obj)
elif obj.queued == "r" and obj.do_purge:
self.installed_undopurge.show()
else:
# is it a system package ?
if obj.syspkg:
self.installed_remove.hide()
self.installed_purge.hide()
if str(obj) not in self.etpbase.getPackages("reinstallable"):
if obj.syspkg:
do_show = False
self.installed_reinstall.hide()
else:
self.set_loaded_reinstallable(obj)
if not self.loaded_reinstallable:
self.installed_reinstall.hide()
if do_show: self.installed_menu.popup( None, None, self.reposition_menu, self.loaded_event.button, self.loaded_event.time )
def set_loaded_reinstallable(self, obj):
reinstallables = self.etpbase.getPackages("reinstallable")
self.loaded_reinstallable = None
for to_obj in reinstallables:
if str(obj) == str(to_obj):
self.loaded_reinstallable = to_obj
break
def on_remove_activate(self, widget, do_purge = False):
busyCursor(self.ui.main)
model, iter = self.loaded_widget.get_selection().get_selected()
obj = self.store.get_value( iter, 0 )
oldqueued = obj.queued
oldpurge = obj.do_purge
obj.queued = "r"
if do_purge:
obj.do_purge = True
status, myaction = self.queue.add(obj)
if status != 0:
obj.queued = oldqueued
obj.do_purge = oldpurge
self.queueView.refresh()
normalCursor(self.ui.main)
def on_reinstall_activate(self, widget):
busyCursor(self.ui.main)
model, iter = self.loaded_widget.get_selection().get_selected()
obj = self.store.get_value( iter, 0 )
oldqueued = obj.queued
obj.queued = "rr"
oldqueued_reinstallable = self.loaded_reinstallable.queued
self.loaded_reinstallable.queued = "rr"
status, myaction = self.queue.add(self.loaded_reinstallable)
if status != 0:
obj.queued = oldqueued
self.loaded_reinstallable.queued = oldqueued_reinstallable
self.queueView.refresh()
normalCursor(self.ui.main)
def on_undoreinstall_activate(self, widget):
busyCursor(self.ui.main)
model, iter = self.loaded_widget.get_selection().get_selected()
obj = self.store.get_value( iter, 0 )
obj.queued = None
self.remove_queued(self.loaded_reinstallable)
self.queueView.refresh()
normalCursor(self.ui.main)
def on_undoremove_activate(self, widget):
busyCursor(self.ui.main)
model, iter = self.loaded_widget.get_selection().get_selected()
obj = self.store.get_value( iter, 0 )
self.remove_queued(obj)
obj.do_purge = False
self.queueView.refresh()
normalCursor(self.ui.main)
def remove_queued(self, obj):
oldqueued = obj.queued
obj.queued = None
status, myaction = self.queue.remove(obj)
if status != 0:
obj.queued = oldqueued
self.view.queue_draw()
return status
def on_purge_activate(self, widget):
self.on_remove_activate(widget, True)
def on_undopurge_activate(self, widget):
self.on_undoremove_activate(widget)
def on_update_activate(self, widget):
self.on_install_update_activate(widget, "u")
def on_undoupdate_activate(self, widget):
self.on_undoinstall_undoupdate_activate(widget)
def on_install_activate(self, widget):
self.on_install_update_activate(widget, "i")
def on_undoinstall_activate(self, widget):
self.on_undoinstall_undoupdate_activate(widget)
def on_install_update_activate(self, widget, action):
busyCursor(self.ui.main)
model, iter = self.loaded_widget.get_selection().get_selected()
obj = self.store.get_value( iter, 0 )
oldqueued = obj.queued
obj.queued = action
status, myaction = self.queue.add(obj)
if status != 0:
obj.queued = oldqueued
self.queueView.refresh()
normalCursor(self.ui.main)
def on_undoinstall_undoupdate_activate(self, widget):
busyCursor(self.ui.main)
model, iter = self.loaded_widget.get_selection().get_selected()
obj = self.store.get_value( iter, 0 )
self.remove_queued(obj)
self.queueView.refresh()
normalCursor(self.ui.main)
def setupView( self ):
store = gtk.ListStore( gobject.TYPE_PYOBJECT, str )
self.view.set_model( store )
# Setup selection column
cell1 = gtk.CellRendererToggle() # Selection
cell1.set_property( 'activatable', True )
column1 = gtk.TreeViewColumn( "", cell1 )
column1.set_cell_data_func( cell1, self.get_data_bool, 'selected' )
# Setup resent column
cell1 = gtk.CellRendererPixbuf() # new
self.set_pixbuf_to_cell(cell1, self.pkg_install_ok )
column1 = gtk.TreeViewColumn( "S", cell1 )
column1.set_cell_data_func( cell1, self.new_pixbuf )
column1.set_sizing( gtk.TREE_VIEW_COLUMN_FIXED )
column1.set_fixed_width( 20 )
column1.set_fixed_width( self.selection_width )
column1.set_sort_column_id( -1 )
self.view.append_column( column1 )
cell1.connect( "toggled", self.on_toggled )
column1.set_clickable( True )
# Setup resent column
cell2 = gtk.CellRendererPixbuf() # new
cell2.set_property( 'stock-id', gtk.STOCK_ADD )
column2 = gtk.TreeViewColumn( "", cell2 )
column2.set_cell_data_func( cell2, self.new_pixbuf )
column2.set_sizing( gtk.TREE_VIEW_COLUMN_FIXED )
column2.set_fixed_width( 20 )
column2.set_sort_column_id( -1 )
self.view.append_column( column2 )
column2.set_clickable( True )
column1.set_clickable( False )
self.create_text_column( _( "Package" ), 'name' , size=360)
self.create_text_column( _( "Rev." ), 'revision' , size=50 )
@@ -103,8 +393,15 @@ class EntropyPackageView:
self.view.set_reorderable( True )
return store
def set_pixbuf_to_cell(self, cell, filename):
pixbuf = gtk.gdk.pixbuf_new_from_file(const.PIXMAPS_PATH+"/packages/"+filename)
cell.set_property( 'pixbuf', pixbuf )
def set_pixbuf_to_image(self, img, filename):
img.set_from_file(const.PIXMAPS_PATH+"/packages/"+filename)
def create_text_column( self, hdr, property, size, sortcol = None):
"""
"""
Create a TreeViewColumn with text and set
the sorting properties and add it to the view
"""
@@ -124,38 +421,6 @@ class EntropyPackageView:
cell.set_property( 'text', getattr( obj, property ) )
cell.set_property('foreground',obj.color)
def get_data_bool( self, column, cell, model, iter, property ):
obj = model.get_value( iter, 0 )
cell.set_property( "visible", True )
if obj:
cell.set_property( "active", getattr( obj, property ) )
def on_toggled( self, widget, path ):
busyCursor(self.ui.main)
""" Package selection handler """
iter = self.store.get_iter( path )
obj = self.store.get_value( iter, 0 )
self.togglePackage(obj)
self.queueView.refresh()
normalCursor(self.ui.main)
def togglePackage(self,obj):
oldqueued = obj.queued
oldselected = obj.selected
if obj.queued == obj.action:
obj.queued = None
status, myaction = self.queue.remove(obj)
if status != 0:
obj.queued = oldqueued
obj.set_select(oldselected)
else:
obj.queued = obj.action
status, myaction = self.queue.add(obj)
if status != 0:
obj.queued = oldqueued
obj.set_select(oldselected)
def selectAll(self):
list = [x[0] for x in self.store if not x[0].queued == x[0].action]
if not list:
@@ -194,15 +459,6 @@ class EntropyPackageView:
for obj in xlist:
obj.set_select( False )
self.clearUpdates()
'''
for el in self.store:
obj = el[0]
if obj.queued == obj.action:
obj.queued = None
self.queue.remove(obj)
obj.set_select( not obj.selected )
'''
self.queueView.refresh()
self.view.queue_draw()
@@ -213,35 +469,31 @@ class EntropyPackageView:
"""
pkg = model.get_value( iter, 0 )
if pkg:
action = pkg.queued
if action:
if action in ( 'u', 'i' ):
icon = 'network-server'
if not pkg.queued:
if pkg.action == "r":
self.set_pixbuf_to_cell(cell, self.pkg_install_ok)
elif pkg.action == "i":
self.set_pixbuf_to_cell(cell, self.pkg_install_new)
else:
icon = 'edit-delete'
cell.set_property( 'visible', True )
cell.set_property( 'icon-name', icon )
self.set_pixbuf_to_cell(cell, self.pkg_install_updatable)
else:
cell.set_property( 'visible', pkg.recent )
cell.set_property( 'icon-name', 'document-new' )
if pkg.queued == "r" and not pkg.do_purge:
self.set_pixbuf_to_cell(cell, self.pkg_remove)
if pkg.queued == "r" and pkg.do_purge:
self.set_pixbuf_to_cell(cell, self.pkg_purge)
elif pkg.queued == "rr":
self.set_pixbuf_to_cell(cell, self.pkg_reinstall)
elif pkg.queued == "i":
self.set_pixbuf_to_cell(cell, self.pkg_install)
elif pkg.queued == "u":
self.set_pixbuf_to_cell(cell, self.pkg_update)
else:
cell.set_property( 'visible', False )
def get_selected( self, package=True ):
""" Get selected packages in current packageList """
selected = []
for row in self.store:
col = row[0]
if col:
pkg = row[0][0]
if pkg.selected:
selected.append( pkg )
return selected
class YumexQueueView:
""" Queue View Class"""
def __init__( self, widget,queue ):
def __init__( self, widget, queue ):
self.view = widget
self.model = self.setup_view()
self.queue = queue
@@ -274,7 +526,7 @@ class YumexQueueView:
pkg.queued = None
pkg.set_select( not pkg.selected )
f = lambda x: str( x ) not in rmvlist
for action in ['u', 'i', 'r']:
for action in ['u', 'i', 'r','rr']:
list = self.queue.get(action)
if list:
self.queue.packages[action] = filter( f, list )
@@ -283,7 +535,7 @@ class YumexQueueView:
def getPkgsFromList( self, rlist ):
rclist = []
f = lambda x: str( x ) in rlist
for action in ['u', 'i', 'r']:
for action in ['u', 'i', 'r','rr']:
list = self.queue.packages[action]
if list:
rclist += filter( f, list )
@@ -292,6 +544,10 @@ class YumexQueueView:
def refresh ( self ):
""" Populate view with data from queue """
self.model.clear()
label = _( "<b>Packages To Reinstall</b>" )
list = self.queue.packages['rr']
if len( list ) > 0:
self.populate_list( label, list )
label = _( "<b>Packages To Update</b>" )
list = self.queue.packages['u']
if len( list ) > 0: