diff --git a/spritz/Makefile b/spritz/Makefile
index 453801315..8c7467f47 100644
--- a/spritz/Makefile
+++ b/spritz/Makefile
@@ -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/.
diff --git a/spritz/gfx/packages/package-available-locked.png b/spritz/gfx/packages/package-available-locked.png
new file mode 100644
index 000000000..a33aac8b8
Binary files /dev/null and b/spritz/gfx/packages/package-available-locked.png differ
diff --git a/spritz/gfx/packages/package-available.png b/spritz/gfx/packages/package-available.png
new file mode 100644
index 000000000..fb9cd605a
Binary files /dev/null and b/spritz/gfx/packages/package-available.png differ
diff --git a/spritz/gfx/packages/package-broken.png b/spritz/gfx/packages/package-broken.png
new file mode 100644
index 000000000..b43ea0838
Binary files /dev/null and b/spritz/gfx/packages/package-broken.png differ
diff --git a/spritz/gfx/packages/package-downgrade.png b/spritz/gfx/packages/package-downgrade.png
new file mode 100644
index 000000000..a456b96da
Binary files /dev/null and b/spritz/gfx/packages/package-downgrade.png differ
diff --git a/spritz/gfx/packages/package-install.png b/spritz/gfx/packages/package-install.png
new file mode 100644
index 000000000..186eddec0
Binary files /dev/null and b/spritz/gfx/packages/package-install.png differ
diff --git a/spritz/gfx/packages/package-installed-locked.png b/spritz/gfx/packages/package-installed-locked.png
new file mode 100644
index 000000000..76d10eab6
Binary files /dev/null and b/spritz/gfx/packages/package-installed-locked.png differ
diff --git a/spritz/gfx/packages/package-installed-outdated.png b/spritz/gfx/packages/package-installed-outdated.png
new file mode 100644
index 000000000..699b29971
Binary files /dev/null and b/spritz/gfx/packages/package-installed-outdated.png differ
diff --git a/spritz/gfx/packages/package-installed-updated.png b/spritz/gfx/packages/package-installed-updated.png
new file mode 100644
index 000000000..43c7b5c09
Binary files /dev/null and b/spritz/gfx/packages/package-installed-updated.png differ
diff --git a/spritz/gfx/packages/package-new.png b/spritz/gfx/packages/package-new.png
new file mode 100644
index 000000000..7eec1a08d
Binary files /dev/null and b/spritz/gfx/packages/package-new.png differ
diff --git a/spritz/gfx/packages/package-purge.png b/spritz/gfx/packages/package-purge.png
new file mode 100644
index 000000000..63b6bed8d
Binary files /dev/null and b/spritz/gfx/packages/package-purge.png differ
diff --git a/spritz/gfx/packages/package-reinstall.png b/spritz/gfx/packages/package-reinstall.png
new file mode 100644
index 000000000..b9aa6a007
Binary files /dev/null and b/spritz/gfx/packages/package-reinstall.png differ
diff --git a/spritz/gfx/packages/package-remove.png b/spritz/gfx/packages/package-remove.png
new file mode 100644
index 000000000..11ccb8285
Binary files /dev/null and b/spritz/gfx/packages/package-remove.png differ
diff --git a/spritz/gfx/packages/package-undoinstall.png b/spritz/gfx/packages/package-undoinstall.png
new file mode 100644
index 000000000..a6a924424
Binary files /dev/null and b/spritz/gfx/packages/package-undoinstall.png differ
diff --git a/spritz/gfx/packages/package-upgrade.png b/spritz/gfx/packages/package-upgrade.png
new file mode 100644
index 000000000..67b88d236
Binary files /dev/null and b/spritz/gfx/packages/package-upgrade.png differ
diff --git a/spritz/src/dialogs.py b/spritz/src/dialogs.py
index c3f2b29b6..163452bdc 100644
--- a/spritz/src/dialogs.py
+++ b/spritz/src/dialogs.py
@@ -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 = "%s" % str(pkg)
- model.append( None, [label, pkg.description] )
+ label = "%s" % 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 = "%s" % _("To be reinstalled")
+ level1 = model.append( None, [label, " "] )
+ for pkg in reinstall:
+ level2 = model.append( level1, [str(pkg), pkg.description] )
if install:
label = "%s" % _("To be installed")
level1 = model.append( None, [label, " "] )
diff --git a/spritz/src/entropyapi.py b/spritz/src/entropyapi.py
index 47c84e605..ee7a323d9 100644
--- a/spritz/src/entropyapi.py
+++ b/spritz/src/entropyapi.py
@@ -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)
diff --git a/spritz/src/etpgui/packages.py b/spritz/src/etpgui/packages.py
index 0c539893f..f3d7d68de 100644
--- a/spritz/src/etpgui/packages.py
+++ b/spritz/src/etpgui/packages.py
@@ -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)
\ No newline at end of file
diff --git a/spritz/src/gui.py b/spritz/src/gui.py
index dc12d458b..58e9de201 100644
--- a/spritz/src/gui.py
+++ b/spritz/src/gui.py
@@ -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)
diff --git a/spritz/src/misc.py b/spritz/src/misc.py
index 00692f695..87c76d7d2 100644
--- a/spritz/src/misc.py
+++ b/spritz/src/misc.py
@@ -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)
\ No newline at end of file
diff --git a/spritz/src/packages.py b/spritz/src/packages.py
index b8303c8ab..c5eeb46a7 100644
--- a/spritz/src/packages.py
+++ b/spritz/src/packages.py
@@ -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)
diff --git a/spritz/src/spritz.glade b/spritz/src/spritz.glade
index b0f50c4dd..e5e558314 100644
--- a/spritz/src/spritz.glade
+++ b/spritz/src/spritz.glade
@@ -4263,4 +4263,233 @@ gz
+
+
+
+
+
+
diff --git a/spritz/src/spritz.py b/spritz/src/spritz.py
index 1b8f19c3b..915919bc7 100644
--- a/spritz/src/spritz.py
+++ b/spritz/src/spritz.py
@@ -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():
diff --git a/spritz/src/views.py b/spritz/src/views.py
index 5e40b5a4f..00bf38ec1 100644
--- a/spritz/src/views.py
+++ b/spritz/src/views.py
@@ -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 = _( "Packages To Reinstall" )
+ list = self.queue.packages['rr']
+ if len( list ) > 0:
+ self.populate_list( label, list )
label = _( "Packages To Update" )
list = self.queue.packages['u']
if len( list ) > 0: