Entropy/Spritz:
- put voting feature inside the applications TreeView (which means a LOT of work) git-svn-id: http://svn.sabayonlinux.org/projects/entropy/trunk@2372 cd1c1023-2f26-0410-ae45-c471fc1f0318
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 141 B |
+21
-9
@@ -31,10 +31,13 @@ class PkgInfoMenu:
|
||||
|
||||
def __init__(self, Entropy, pkg, window):
|
||||
|
||||
self.pkg_pixmap = const.PIXMAPS_PATH+'/package-x-generic.png'
|
||||
self.ugc_small_pixmap = const.PIXMAPS_PATH+'/ugc.png'
|
||||
self.ugc_pixmap = const.PIXMAPS_PATH+'/ugc/icon.png'
|
||||
self.refresh_pixmap = const.PIXMAPS_PATH+'/ugc/refresh.png'
|
||||
self.pkg_pixmap = const.pkg_pixmap
|
||||
self.ugc_small_pixmap = const.ugc_small_pixmap
|
||||
self.ugc_pixmap = const.ugc_pixmap
|
||||
self.refresh_pixmap = const.refresh_pixmap
|
||||
self.star_normal_pixmap = const.star_normal_pixmap
|
||||
self.star_selected_pixmap = const.star_selected_pixmap
|
||||
self.star_empty_pixmap = const.star_empty_pixmap
|
||||
|
||||
self.pkg = pkg
|
||||
self.vote = 0
|
||||
@@ -47,6 +50,8 @@ class PkgInfoMenu:
|
||||
self.pkginfo_ui = UI( const.GLADE_FILE, 'pkgInfo', 'entropy' )
|
||||
self.pkginfo_ui.signal_autoconnect(self._getAllMethods())
|
||||
self.pkginfo_ui.pkgInfo.set_transient_for(self.window)
|
||||
self.pkginfo_ui.pkgInfo.add_events(gtk.gdk.BUTTON_PRESS_MASK)
|
||||
self.pkginfo_ui.pkgInfo.connect('button-press-event', self.on_button_press)
|
||||
self.setupPkgPropertiesView()
|
||||
|
||||
def _getAllMethods(self):
|
||||
@@ -81,6 +86,13 @@ class PkgInfoMenu:
|
||||
except gobject.GError:
|
||||
pass
|
||||
|
||||
def on_button_press(self, widget, event):
|
||||
self.pkginfo_ui.pkgInfo.begin_move_drag(
|
||||
event.button,
|
||||
int(event.x_root),
|
||||
int(event.y_root),
|
||||
event.time)
|
||||
|
||||
def on_showContentButton_clicked( self, widget ):
|
||||
content = self.pkg.contentExt
|
||||
for x in content:
|
||||
@@ -309,10 +321,10 @@ class PkgInfoMenu:
|
||||
|
||||
|
||||
def set_stars(self, count, hover = False):
|
||||
pix_path = const.PIXMAPS_PATH+'/star.png'
|
||||
if hover:
|
||||
pix_path = const.PIXMAPS_PATH+'/star_selected.png'
|
||||
pix_path_empty = const.PIXMAPS_PATH+'/star_empty.png'
|
||||
pix_path = self.star_normal_pixmap
|
||||
if hover: pix_path = self.star_selected_pixmap
|
||||
pix_path_empty = self.star_empty_pixmap
|
||||
|
||||
widgets = [
|
||||
self.pkginfo_ui.vote1,
|
||||
self.pkginfo_ui.vote2,
|
||||
@@ -1340,7 +1352,7 @@ class MessageDialog:
|
||||
defaultchoice = 0
|
||||
|
||||
dialog.set_title(title)
|
||||
dialog.format_secondary_markup(cleanMarkupString(text))
|
||||
#dialog.format_secondary_markup(cleanMarkupString(text))
|
||||
dialog.set_position (gtk.WIN_POS_CENTER)
|
||||
dialog.set_default_response(defaultchoice)
|
||||
dialog.show_all ()
|
||||
|
||||
@@ -29,6 +29,9 @@ class DummyEntropyPackage:
|
||||
self.namedesc = namedesc
|
||||
self.queued = None
|
||||
self.repoid = ''
|
||||
self.name = ''
|
||||
self.vote = -1
|
||||
self.voted = 0
|
||||
self.color = None
|
||||
self.action = None
|
||||
self.dbconn = None
|
||||
@@ -47,6 +50,7 @@ class EntropyPackage:
|
||||
self.available = avail
|
||||
self.do_purge = False
|
||||
self.masked = None
|
||||
self.voted = 0
|
||||
self.color = SpritzConf.color_normal
|
||||
|
||||
if matched_atom[1] == 0:
|
||||
@@ -91,15 +95,8 @@ class EntropyPackage:
|
||||
else:
|
||||
repo = self.matched_atom[1]
|
||||
key = self.entropyTools.dep_getkey(atom)
|
||||
vote = EquoConnection.UGC.UGCCache.get_package_vote(repo,key)
|
||||
ugc_string = "["
|
||||
if isinstance(vote,float):
|
||||
vote = int(vote)
|
||||
vote_stars = "★"*vote
|
||||
vote_spaces = "☆"*(5-vote)
|
||||
ugc_string += vote_stars+vote_spaces
|
||||
downloads = EquoConnection.UGC.UGCCache.get_package_downloads(repo,key)
|
||||
ugc_string += ":%s] " % (downloads,)
|
||||
ugc_string = "<small>[%s]</small> " % (downloads,)
|
||||
|
||||
t = ugc_string+'/'.join(atom.split("/")[1:])
|
||||
if self.masked:
|
||||
@@ -277,6 +274,9 @@ class EntropyPackage:
|
||||
if not atom: return None
|
||||
return EquoConnection.UGC.UGCCache.get_package_vote(self.matched_atom[1],self.entropyTools.dep_getkey(atom))
|
||||
|
||||
def getUGCPackageVoted(self):
|
||||
return self.voted
|
||||
|
||||
def getUGCPackageDownloads(self):
|
||||
if self.from_installed: return False
|
||||
atom = self.getName()
|
||||
@@ -380,4 +380,5 @@ class EntropyPackage:
|
||||
syspkg = property(fget=getSysPkg)
|
||||
install_status = property(fget=getInstallStatus)
|
||||
vote = property(fget=getUGCPackageVote)
|
||||
voted = property(fget=getUGCPackageVoted)
|
||||
downloads = property(fget=getUGCPackageDownloads)
|
||||
|
||||
@@ -26,6 +26,220 @@ import sys, os
|
||||
from spritz_setup import const
|
||||
import vte
|
||||
|
||||
def hex2float(myhex):
|
||||
ret = []
|
||||
for i in range(4):
|
||||
ic = int(myhex[i])
|
||||
ret.append( ic / 255.0 )
|
||||
return ret
|
||||
|
||||
class TransparentWindow(gtk.Window):
|
||||
__gsignals__ = {
|
||||
'expose-event': 'override',
|
||||
'screen-changed': 'override',
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
import cairo
|
||||
self.cairo = cairo
|
||||
gtk.Window.__init__(self)
|
||||
self.set_app_paintable(True)
|
||||
self.set_decorated(False)
|
||||
self.add_events(gtk.gdk.BUTTON_PRESS_MASK)
|
||||
self.connect('button-press-event', self.on_button_press)
|
||||
self.do_screen_changed()
|
||||
|
||||
def on_button_press(self, widget, event):
|
||||
self.begin_move_drag(
|
||||
event.button,
|
||||
int(event.x_root),
|
||||
int(event.y_root),
|
||||
event.time)
|
||||
|
||||
def render_rect(self, cr, x, y, w, h, o):
|
||||
# Crea un rettangolo con i bordi arrotondati
|
||||
x0 = x
|
||||
y0 = y
|
||||
rect_width = w
|
||||
rect_height = h
|
||||
radius = 10 + o
|
||||
|
||||
x1 = x0 + rect_width
|
||||
y1 = y0 + rect_height
|
||||
cr.move_to(x0, y0 + radius)
|
||||
cr.curve_to(x0, y0, x0, y0, x0 + radius, y0)
|
||||
cr.line_to(x1 - radius, y0)
|
||||
cr.curve_to(x1, y0, x1, y0, x1, y0 + radius)
|
||||
cr.line_to(x1 , y1)
|
||||
cr.line_to (x0 , y1)
|
||||
cr.close_path()
|
||||
|
||||
def do_expose_event(self, event):
|
||||
cr = self.window.cairo_create()
|
||||
|
||||
if self.supports_alpha:
|
||||
cr.set_source_rgba(1.0, 1.0, 1.0, 0.0)
|
||||
else:
|
||||
cr.set_source_rgb(1.0, 1.0, 1.0)
|
||||
|
||||
cr.set_operator(self.cairo.OPERATOR_SOURCE)
|
||||
cr.paint()
|
||||
|
||||
|
||||
(width, height) = self.get_size()
|
||||
cr.move_to(0, 0)
|
||||
cr.set_line_width(1.0)
|
||||
|
||||
cr.set_operator(self.cairo.OPERATOR_OVER)
|
||||
|
||||
pat = self.cairo.LinearGradient(0.0, 0.0, 0.0, height)
|
||||
|
||||
ex_list = [0xA1, 0xA8, 0xBB, 0xEC]
|
||||
col = hex2float(ex_list)
|
||||
pat.add_color_stop_rgba(0.0, col[0], col[1], col[2], col[3])
|
||||
|
||||
ex_list = [0x14, 0x1E, 0x3C, 0xF3]
|
||||
col = hex2float(ex_list)
|
||||
pat.add_color_stop_rgba(1.0, col[0], col[1], col[2], col[3])
|
||||
|
||||
self.render_rect(cr, 0, 0, width, height, 10)
|
||||
cr.set_source(pat)
|
||||
cr.fill()
|
||||
|
||||
ex_list = [0xFF, 0xFF, 0xFF, 0x4e]
|
||||
col = hex2float(ex_list)
|
||||
cr.set_source_rgba(col[0], col[1], col[2], col[3])
|
||||
self.render_rect(cr, 1.5, 1.5, width - 3 , height - 3, 10)
|
||||
cr.stroke()
|
||||
|
||||
# border
|
||||
ex_list = [0x00, 0x15, 0x1F, 0xe0]
|
||||
col = hex2float(ex_list)
|
||||
cr.set_source_rgba(col[0], col[1], col[2], col[3])
|
||||
self.render_rect(cr, 0.5, 0.5, width - 1 , height - 1, 10)
|
||||
cr.stroke()
|
||||
|
||||
ex_list = [0xFF, 0xFF, 0xFF, 0xFF]
|
||||
col = hex2float(ex_list)
|
||||
cr.set_source_rgba(col[0], col[1], col[2], col[3])
|
||||
self.render_rect(cr, 0, 0, width , height, 10)
|
||||
cr.stroke()
|
||||
|
||||
pat = self.cairo.LinearGradient(0.0, 0.0, 0.0, height)
|
||||
cr.set_source(pat)
|
||||
ex_list = [0xFF, 0xFF, 0xFF, 0xbb]
|
||||
col = hex2float(ex_list)
|
||||
pat.add_color_stop_rgba(0.0, col[0], col[1], col[2], col[3])
|
||||
|
||||
ex_list = [0x00, 0x00, 0x10, 0xaa]
|
||||
col = hex2float(ex_list)
|
||||
pat.add_color_stop_rgba(0.2, col[0], col[1], col[2], col[3])
|
||||
self.render_rect(cr, 0, 0, width, 20, 10)
|
||||
cr.fill()
|
||||
|
||||
children = self.get_children()
|
||||
for c in children: self.propagate_expose(c, event)
|
||||
|
||||
def do_screen_changed(self, old_screen=None):
|
||||
screen = self.get_screen()
|
||||
if self.is_composited():
|
||||
colormap = screen.get_rgba_colormap()
|
||||
self.supports_alpha = True
|
||||
else:
|
||||
# no alpha support
|
||||
colormap = screen.get_rgb_colormap()
|
||||
self.supports_alpha = False
|
||||
self.set_colormap(colormap)
|
||||
|
||||
class CellRendererStars(gtk.GenericCellRenderer):
|
||||
__gproperties__ = {
|
||||
"custom": (gobject.TYPE_OBJECT, "Custom",
|
||||
"Custom", gobject.PARAM_READWRITE),
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
self.__gobject_init__()
|
||||
self.value = -1
|
||||
self.value_voted = 0
|
||||
|
||||
def do_set_property(self, pspec, value):
|
||||
setattr(self, pspec.name, value)
|
||||
|
||||
def do_get_property(self, pspec):
|
||||
return getattr(self, pspec.name)
|
||||
|
||||
def on_render(self, window, widget, background_area, cell_area, expose_area, flags):
|
||||
(x_offset, y_offset, width, height) = self.on_get_size(widget, cell_area)
|
||||
widget.style.paint_box(window,
|
||||
gtk.STATE_NORMAL,
|
||||
gtk.SHADOW_IN,
|
||||
None, widget, "trough",
|
||||
cell_area.x+x_offset,
|
||||
cell_area.y+y_offset,
|
||||
width, height)
|
||||
if ((self.value > -1) and (self.value < 6)) or (self.value_voted > 0):
|
||||
|
||||
xt = widget.style.xthickness
|
||||
empty = gtk.Image()
|
||||
empty.set_from_file(const.empty_background)
|
||||
empty_buf = empty.get_pixbuf()
|
||||
|
||||
if self.value_voted:
|
||||
star = gtk.Image()
|
||||
star.set_from_file(const.star_selected_pixmap)
|
||||
else:
|
||||
star = gtk.Image()
|
||||
star.set_from_file(const.star_normal_pixmap)
|
||||
|
||||
star_empty = gtk.Image()
|
||||
star_empty.set_from_file(const.star_empty_pixmap)
|
||||
|
||||
star_buf = star.get_pixbuf()
|
||||
star_empty_buf = star_empty.get_pixbuf()
|
||||
|
||||
w, h = star_buf.get_width(),star_buf.get_height()
|
||||
myval = self.value
|
||||
if self.value_voted:
|
||||
myval = self.value_voted
|
||||
empty_buf = empty_buf.scale_simple(w*5,h+12,gtk.gdk.INTERP_BILINEAR)
|
||||
myvals = [0,w,w*2,w*3,w*4]
|
||||
cnt = 0
|
||||
while myval:
|
||||
star_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt], 6)
|
||||
myval -= 1
|
||||
cnt += 1
|
||||
myval = 5 - cnt
|
||||
while myval:
|
||||
star_empty_buf.copy_area(0, 0, w, h, empty_buf, myvals[cnt], 6)
|
||||
myval -= 1
|
||||
cnt += 1
|
||||
|
||||
if empty_buf: window.draw_pixbuf(None, empty_buf, 0, 0, cell_area.x+x_offset+xt, cell_area.y+y_offset+xt, -1, -1)
|
||||
|
||||
|
||||
def on_get_size(self, widget, cell_area):
|
||||
xpad = self.get_property("xpad")
|
||||
ypad = self.get_property("ypad")
|
||||
if cell_area:
|
||||
width = cell_area.width
|
||||
height = cell_area.height
|
||||
x_offset = xpad
|
||||
y_offset = ypad
|
||||
else:
|
||||
width = self.get_property("width")
|
||||
height = self.get_property("height")
|
||||
if width == -1: width = 100
|
||||
if height == -1: height = 30
|
||||
width += xpad*2
|
||||
height += ypad*2
|
||||
x_offset = 0
|
||||
y_offset = 0
|
||||
return x_offset, y_offset, width, height
|
||||
|
||||
|
||||
gobject.type_register(CellRendererStars)
|
||||
|
||||
|
||||
class SpritzConsole(vte.Terminal):
|
||||
|
||||
def __init__(self, settings):
|
||||
|
||||
+43
-30
@@ -807,7 +807,16 @@
|
||||
</widget>
|
||||
</child>
|
||||
<child>
|
||||
<placeholder/>
|
||||
<widget class="GtkLabel" id="UGCMessageLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0.99000000953674316</property>
|
||||
<property name="yalign">1</property>
|
||||
<property name="label" translatable="yes"><small>Powered by User Generated Content</small></property>
|
||||
<property name="use_markup">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
@@ -954,7 +963,7 @@
|
||||
<property name="visible">True</property>
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label">Hello world</property>
|
||||
<property name="use_markup">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
@@ -4445,10 +4454,10 @@ gz</property>
|
||||
</widget>
|
||||
<widget class="GtkWindow" id="pkgInfo">
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
<property name="border_width">8</property>
|
||||
<property name="title" translatable="yes">Package Information</property>
|
||||
<property name="modal">True</property>
|
||||
<property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
|
||||
<property name="window_position">GTK_WIN_POS_CENTER_ALWAYS</property>
|
||||
<property name="default_width">600</property>
|
||||
<property name="decorated">False</property>
|
||||
<signal name="delete_event" handler="on_pkgInfo_delete_event"/>
|
||||
<child>
|
||||
<widget class="GtkVBox" id="vbox2">
|
||||
@@ -4648,6 +4657,35 @@ gz</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkAlignment" id="alignment2">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">1</property>
|
||||
<property name="yalign">0</property>
|
||||
<property name="xscale">0</property>
|
||||
<property name="yscale">0</property>
|
||||
<property name="right_padding">10</property>
|
||||
<child>
|
||||
<widget class="GtkButton" id="closeInfo">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="response_id">0</property>
|
||||
<signal name="clicked" handler="on_closeInfo_clicked"/>
|
||||
<signal name="delete_event" handler="on_closeInfo_delete_event"/>
|
||||
<child>
|
||||
<widget class="GtkImage" id="image14">
|
||||
<property name="visible">True</property>
|
||||
<property name="stock">gtk-close</property>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
@@ -5849,31 +5887,6 @@ gz</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkHButtonBox" id="hbuttonbox1">
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
<property name="layout_style">GTK_BUTTONBOX_END</property>
|
||||
<child>
|
||||
<widget class="GtkButton" id="closeInfo">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
|
||||
<property name="label">gtk-close</property>
|
||||
<property name="use_stock">True</property>
|
||||
<property name="response_id">0</property>
|
||||
<signal name="clicked" handler="on_closeInfo_clicked"/>
|
||||
<signal name="delete_event" handler="on_closeInfo_delete_event"/>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="padding">7</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
|
||||
+23
-15
@@ -1071,6 +1071,7 @@ class SpritzApplication(SpritzController,SpritzGUI):
|
||||
|
||||
# init flags
|
||||
self.ugcTask = None
|
||||
self.spawning_ugc = False
|
||||
self.Preferences = None
|
||||
self.skipMirrorNow = False
|
||||
self.abortQueueNow = False
|
||||
@@ -1117,29 +1118,33 @@ class SpritzApplication(SpritzController,SpritzGUI):
|
||||
fn = packages_install[0]
|
||||
self.on_installPackageItem_activate(None,fn)
|
||||
|
||||
|
||||
def setupUgc(self):
|
||||
self.ugcTask = entropyTools.TimeScheduled(self.spawnUgcUpdate, 120)
|
||||
self.ugcTask.start()
|
||||
|
||||
def spawnUgcUpdate(self):
|
||||
try:
|
||||
while (self.spawning_ugc or self.isWorking):
|
||||
time.sleep(1)
|
||||
|
||||
if self.isWorking: return
|
||||
self.isWorking = True
|
||||
gtkEventThread.startProcessing()
|
||||
connected = entropyTools.get_remote_data(etpConst['conntestlink'])
|
||||
if (connected == False) or (self.Equo.UGC == None):
|
||||
self.isWorking = False
|
||||
gtkEventThread.endProcessing()
|
||||
return
|
||||
for repo in self.Equo.validRepositories:
|
||||
try:
|
||||
self.isWorking = True
|
||||
self.spawning_ugc = True
|
||||
gtkEventThread.startProcessing()
|
||||
connected = entropyTools.get_remote_data(etpConst['conntestlink'])
|
||||
if (connected == False) or (self.Equo.UGC == None):
|
||||
self.isWorking = False
|
||||
self.spawning_ugc = False
|
||||
gtkEventThread.endProcessing()
|
||||
return
|
||||
for repo in self.Equo.validRepositories:
|
||||
self.Equo.update_ugc_cache(repo)
|
||||
except:
|
||||
pass
|
||||
|
||||
self.isWorking = False
|
||||
gtkEventThread.endProcessing()
|
||||
self.isWorking = False
|
||||
self.spawning_ugc = False
|
||||
gtkEventThread.endProcessing()
|
||||
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
def setupPreferences(self):
|
||||
@@ -1526,6 +1531,9 @@ class SpritzApplication(SpritzController,SpritzGUI):
|
||||
self.progress.set_mainLabel(_('Errors updating repositories.'))
|
||||
self.progress.set_subLabel(_('Please check logs below for more info'))
|
||||
else:
|
||||
t = entropyTools.parallelTask(self.spawnUgcUpdate)
|
||||
t.parallel_wait()
|
||||
t.start()
|
||||
if repoConn.alreadyUpdated == 0:
|
||||
self.progress.set_mainLabel(_('Repositories updated successfully'))
|
||||
else:
|
||||
|
||||
@@ -39,6 +39,15 @@ class const:
|
||||
else:
|
||||
ICONS_PATH = MAIN_PATH+'/pixmaps'
|
||||
|
||||
pkg_pixmap = PIXMAPS_PATH+'/package-x-generic.png'
|
||||
ugc_small_pixmap = PIXMAPS_PATH+'/ugc.png'
|
||||
ugc_pixmap = PIXMAPS_PATH+'/ugc/icon.png'
|
||||
refresh_pixmap = PIXMAPS_PATH+'/ugc/refresh.png'
|
||||
star_normal_pixmap = PIXMAPS_PATH+'/star.png'
|
||||
star_selected_pixmap = PIXMAPS_PATH+'/star_selected.png'
|
||||
star_empty_pixmap = PIXMAPS_PATH+'/star_empty.png'
|
||||
empty_background = PIXMAPS_PATH+'/empty.png'
|
||||
|
||||
# package categories
|
||||
PACKAGE_CATEGORIES = [
|
||||
"None",
|
||||
|
||||
+97
-16
@@ -20,7 +20,7 @@
|
||||
import gtk
|
||||
import gobject
|
||||
from spritz_setup import const, cleanMarkupString, SpritzConf
|
||||
from etpgui.widgets import UI
|
||||
from etpgui.widgets import UI,CellRendererStars
|
||||
from packages import DummyEntropyPackage
|
||||
from entropyapi import EquoConnection
|
||||
from etpgui import *
|
||||
@@ -62,6 +62,7 @@ class EntropyPackageView:
|
||||
|
||||
self.Equo = EquoConnection
|
||||
self.pkgcolumn_text = _("Selection")
|
||||
self.stars_col_size = 100
|
||||
self.selection_width = 34
|
||||
self.show_reinstall = True
|
||||
self.show_purge = True
|
||||
@@ -70,6 +71,10 @@ class EntropyPackageView:
|
||||
self.loaded_event = None
|
||||
self.main_window = main_window
|
||||
self.event_click_pos = 0,0
|
||||
# UGC pixmaps
|
||||
self.star_normal_pixmap = const.star_normal_pixmap
|
||||
self.star_selected_pixmap = const.star_selected_pixmap
|
||||
self.star_empty_pixmap = const.star_empty_pixmap
|
||||
# default for installed packages
|
||||
self.pkg_install_ok = "package-installed-updated.png"
|
||||
self.pkg_install_updatable = "package-installed-outdated.png"
|
||||
@@ -115,6 +120,8 @@ class EntropyPackageView:
|
||||
treeview.set_fixed_height_mode(True)
|
||||
self.view = treeview
|
||||
self.view.connect("button-release-event", self.load_menu)
|
||||
self.view.connect("enter-notify-event",self.treeview_enter_notify)
|
||||
self.view.connect("leave-notify-event",self.treeview_leave_notify)
|
||||
#self.view.connect("button-press-event", self.load_properties_button)
|
||||
self.store = self.setupView()
|
||||
self.queue = qview.queue
|
||||
@@ -160,6 +167,12 @@ class EntropyPackageView:
|
||||
self.install_install.set_image(self.img_pkg_install)
|
||||
self.updates_undoupdate.set_image(self.img_pkg_undoinstall)
|
||||
|
||||
def treeview_enter_notify(self, widget, event):
|
||||
self.main_window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.CROSSHAIR))
|
||||
|
||||
def treeview_leave_notify(self, widget, event):
|
||||
self.main_window.window.set_cursor(None)
|
||||
|
||||
def reset_install_menu(self):
|
||||
self.install_install.show()
|
||||
self.install_undoinstall.hide()
|
||||
@@ -223,25 +236,33 @@ class EntropyPackageView:
|
||||
else:
|
||||
self.enable_properties_menu(None)
|
||||
|
||||
if event.x < 10:
|
||||
event_x = event.x
|
||||
if event_x < 10:
|
||||
return
|
||||
|
||||
try:
|
||||
row, column, x, y = widget.get_path_at_pos(int(event.x),int(event.y))
|
||||
row, column, x, y = widget.get_path_at_pos(int(event_x),int(event.y))
|
||||
except TypeError:
|
||||
return
|
||||
|
||||
self.event_click_pos = x,y
|
||||
if column.get_title() != self.pkgcolumn_text:
|
||||
return
|
||||
|
||||
if obj:
|
||||
if obj.action in ["r","rr"]: # 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)
|
||||
if column.get_title() == self.pkgcolumn_text:
|
||||
if obj:
|
||||
if obj.action in ["r","rr"]: # 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)
|
||||
else:
|
||||
distance = 0
|
||||
for col in self.view.get_columns()[0:2]:
|
||||
distance += col.get_width()
|
||||
if (event_x > distance) and (event_x < (distance+self.stars_col_size)):
|
||||
vote = int((event_x - distance)/self.stars_col_size*5)+1
|
||||
obj.voted = vote
|
||||
# submit vote
|
||||
self.spawn_vote_submit(obj)
|
||||
|
||||
def reposition_menu(self, menu):
|
||||
# devo tradurre x=0,y=20 in posizioni assolute
|
||||
@@ -438,7 +459,7 @@ class EntropyPackageView:
|
||||
self.view.set_model( store )
|
||||
|
||||
myheight = 35
|
||||
# Setup resent column
|
||||
# selection pixmap
|
||||
cell1 = gtk.CellRendererPixbuf()
|
||||
cell1.set_property('height', myheight)
|
||||
self.set_pixbuf_to_cell(cell1, self.pkg_install_ok )
|
||||
@@ -451,10 +472,72 @@ class EntropyPackageView:
|
||||
column1.set_clickable( False )
|
||||
|
||||
self.create_text_column( _( "Package" ), 'namedesc' , size=300, expand = True, set_height = myheight)
|
||||
|
||||
# vote event box
|
||||
cell2 = CellRendererStars()
|
||||
cell2.set_property('height', myheight)
|
||||
column2 = gtk.TreeViewColumn( _("Rating"), cell2 )
|
||||
column2.set_resizable( True )
|
||||
column2.set_cell_data_func( cell2, self.get_stars_rating )
|
||||
column2.set_sizing( gtk.TREE_VIEW_COLUMN_FIXED )
|
||||
column2.set_fixed_width( self.stars_col_size )
|
||||
column2.set_expand(False)
|
||||
column2.set_sort_column_id( -1 )
|
||||
self.view.append_column( column2 )
|
||||
|
||||
self.create_text_column( _( "Repository" ), 'repoid', size = 130, set_height = myheight)
|
||||
|
||||
return store
|
||||
|
||||
def get_stars_rating( self, column, cell, model, myiter ):
|
||||
obj = model.get_value( myiter, 0 )
|
||||
if not obj: return
|
||||
try:
|
||||
voted = getattr( obj, 'voted' )
|
||||
except self.Equo.dbapi2.ProgrammingError:
|
||||
return
|
||||
#print obj.name,mydata
|
||||
if voted:
|
||||
cell.value_voted = int(voted)
|
||||
return
|
||||
try:
|
||||
mydata = getattr( obj, 'vote' )
|
||||
except self.Equo.dbapi2.ProgrammingError:
|
||||
return
|
||||
cell.value = int(mydata)
|
||||
cell.value_voted = int(voted)
|
||||
self.queueView.refresh()
|
||||
self.view.queue_draw()
|
||||
|
||||
def spawn_vote_submit(self, obj):
|
||||
if self.Equo.UGC == None:
|
||||
obj.voted = 0
|
||||
return
|
||||
repository = obj.repoid
|
||||
if not self.Equo.UGC.is_repository_eapi3_aware(repository):
|
||||
obj.voted = 0
|
||||
return
|
||||
atom = obj.name
|
||||
key = self.Equo.entropyTools.dep_getkey(atom)
|
||||
|
||||
status, err_msg = self.Equo.UGC.add_vote(repository, key, obj.voted)
|
||||
if status:
|
||||
msg = "<small><span foreground='#339101'><b>%s</b></span>: %s</small>" % (_("Vote registered successfully"),obj.voted,)
|
||||
else:
|
||||
msg = "<small><span foreground='#FF0000'><b>%s</b></span>: %s</small>" % (_("Error registering vote"),err_msg,)
|
||||
|
||||
self.ui.UGCMessageLabel.set_markup(msg)
|
||||
t = self.Equo.entropyTools.parallelTask(self.refresh_vote_info, obj)
|
||||
t.parallel_wait()
|
||||
t.start()
|
||||
|
||||
|
||||
def refresh_vote_info(self, obj):
|
||||
time.sleep(5)
|
||||
obj.voted = 0
|
||||
self.queueView.refresh()
|
||||
self.view.queue_draw()
|
||||
|
||||
def clear(self):
|
||||
self.store.clear()
|
||||
|
||||
@@ -511,8 +594,6 @@ class EntropyPackageView:
|
||||
self.view.expand_all()
|
||||
|
||||
|
||||
|
||||
|
||||
def atom_search(self, model, column, key, iterator):
|
||||
obj = model.get_value( iterator, 0 )
|
||||
if obj:
|
||||
|
||||
Reference in New Issue
Block a user