From 745b46aadefed5bb925b4882eb48a1adfb4c6c6d Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@cd1c1023-2f26-0410-ae45-c471fc1f0318> Date: Sun, 27 Jan 2008 16:43:39 +0000 Subject: [PATCH] - 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 --- spritz/Makefile | 3 +- .../gfx/packages/package-available-locked.png | Bin 0 -> 605 bytes spritz/gfx/packages/package-available.png | Bin 0 -> 353 bytes spritz/gfx/packages/package-broken.png | Bin 0 -> 359 bytes spritz/gfx/packages/package-downgrade.png | Bin 0 -> 719 bytes spritz/gfx/packages/package-install.png | Bin 0 -> 674 bytes .../gfx/packages/package-installed-locked.png | Bin 0 -> 638 bytes .../packages/package-installed-outdated.png | Bin 0 -> 520 bytes .../packages/package-installed-updated.png | Bin 0 -> 396 bytes spritz/gfx/packages/package-new.png | Bin 0 -> 482 bytes spritz/gfx/packages/package-purge.png | Bin 0 -> 833 bytes spritz/gfx/packages/package-reinstall.png | Bin 0 -> 655 bytes spritz/gfx/packages/package-remove.png | Bin 0 -> 731 bytes spritz/gfx/packages/package-undoinstall.png | Bin 0 -> 385 bytes spritz/gfx/packages/package-upgrade.png | Bin 0 -> 641 bytes spritz/src/dialogs.py | 14 +- spritz/src/entropyapi.py | 4 +- spritz/src/etpgui/packages.py | 13 +- spritz/src/gui.py | 4 +- spritz/src/misc.py | 67 +-- spritz/src/packages.py | 17 +- spritz/src/spritz.glade | 229 ++++++++++ spritz/src/spritz.py | 25 +- spritz/src/views.py | 428 ++++++++++++++---- 24 files changed, 659 insertions(+), 145 deletions(-) create mode 100644 spritz/gfx/packages/package-available-locked.png create mode 100644 spritz/gfx/packages/package-available.png create mode 100644 spritz/gfx/packages/package-broken.png create mode 100644 spritz/gfx/packages/package-downgrade.png create mode 100644 spritz/gfx/packages/package-install.png create mode 100644 spritz/gfx/packages/package-installed-locked.png create mode 100644 spritz/gfx/packages/package-installed-outdated.png create mode 100644 spritz/gfx/packages/package-installed-updated.png create mode 100644 spritz/gfx/packages/package-new.png create mode 100644 spritz/gfx/packages/package-purge.png create mode 100644 spritz/gfx/packages/package-reinstall.png create mode 100644 spritz/gfx/packages/package-remove.png create mode 100644 spritz/gfx/packages/package-undoinstall.png create mode 100644 spritz/gfx/packages/package-upgrade.png 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 0000000000000000000000000000000000000000..a33aac8b8b1b2eb00632afb05e5e6b13c8a4a23c GIT binary patch literal 605 zcmV-j0;2tiP)1shBoq=TrnMERh|z^qcW!(EUFuT0wR<=2bX6#Q0I>)@fLlRa z34+g1EV`98=|9rk%uVi@Imbm}o9s%@>daaE=6v6LXpUjaK@p}hC6+1lQ;tJc=` zrey#a7zThuq1Wqi*6+>S)|hY5Xf~;26~N&p^9(>uF#}DJ!{bAS!-72T128IwL=n9A zgi+we;xgVlaQ*^dW|$dgc^}op>FF`|?>*pJZ4NVIRF3$yx68u9bq+cQEVUN#m5C2y zfMTYEFrd@f=jO^SYSro(4AiPMZm-^<+ucWEi2pN`enx`Q`Td!ry-(Det8}}h%u)qTYUfaj=O8mXC?To0(uB>4`LUK1u6v^14#;!1X3(W zrQxzVW;SJ_DynWAh)b5KPQQXNK3^W7rn5mR!YQ~W_!X#BaTahIaF*jV;4R=8QlUkZ zlXD5@CN`Fz^7HF^vbj1UBSeH!6e+7noF}F_m@&w6+7Dl%GXPVT+UqQ}*D;vn+$Oyn rcjj>JLgarBGGJrp00000NkvXXu0mjfEb<9A literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-available.png b/spritz/gfx/packages/package-available.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9cd605a28e57d65161f593baf1cc33cdfd7fb4 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4I0@J&kkL<^t@XMsm# zF;K^K5N34Jm|X!BWH0gbb!ETC!oqK;`S;PDXF#EMo-U3d7N_S<_U1cez~gd1#8&&w zPUoeo)ENrH`MZz&+_GktXxZeCHn%hEx3PbCcr0?-)1!4c`>MYsf97gnEKOzJ@Z(MK8rU#A|cis%e3W;*_6nbH&w zKk>W^n>vNRSL|Z;Ke5*5^vwv-(}#qeDp-zZGANgpF|GNftjFQDZn}4f%B5|8#TQ#~ z?0Oi(b)MJvX7J+WhGHK6LQ+cU@ki#ndR;XTVsY{dIqz5FxFR`Z<)b&hQZuX+=Za~{ uXG89ZJ6T-G@yGywpsQ;4+y literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-broken.png b/spritz/gfx/packages/package-broken.png new file mode 100644 index 0000000000000000000000000000000000000000..b43ea0838d28776e1d33cf0e9fe8263289732273 GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4G(G#ND2Uh)+IMK}vQ zB8!1Ku7fb6lg8`{pdfpRr>`sfH5L|rGoGKz|D^$izIeJghFF}QJL#-1iy=?zesy2t z)taqL856i!3l{TS2=Wms?hv+~>FPB5v_|sppMPEQKd{cRDc{Hcpl0XYd9(iQxPPAc zK-6Id&NEek_nw6B=MMh=Se~yTO8c7Ph13^}9A??F3q;-v^i6hS*EPJrYNFckOsMMO zhJ~(niQ2NBldm!ccyYdZ^=p|zD&t~>GiQs~Oqa2{AMiP{?nzP6ZQB(Ww^U5 C4~r-O literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-downgrade.png b/spritz/gfx/packages/package-downgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..a456b96daa0291d7431b229516a5843f4bc32fb6 GIT binary patch literal 719 zcmV;=0xR8bViKll0^e~mw2n6hCk1{qB>DJqyy2u!O*3zsEZO|&H zm~ER{8A1!IttGXnVVoQlAw!&;F&jB`Md|& z5KCi#3Sh?#vY3q$1BxHJs4Cmj7(P3Q!Qk31jfc}n+oiH}6d?o>prUNJvA|&OdxY(> z`5;PFRWMg_UPG<$o#Ba1g1~X0GEz@fmHGZC?D?(+Ydp*B#Q+#Ul>q@5L^2gv148^6 zPsQEO$Gky}L7tnXZq7zu??m5WrFADX;OwD z&<5DRmVoVgL3O+b`kMj5mN!%lgFyHf(Q5)cCt0P!5t zKxwYq`y~W~>R{D(ptZx-+5JpxxP%kSBz!W!G*EaEK}Icv>v#bO<6q-%BN%9f)og_E zlFPoKFXX2>k?j&NIIiPUc3^g6d;*LB;r~eT)eq8K5O;cSBDnwn002ovPDHLkV1jFn BIT8Q> literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-install.png b/spritz/gfx/packages/package-install.png new file mode 100644 index 0000000000000000000000000000000000000000..186eddec0b7977f274ba54456998a70826a834b2 GIT binary patch literal 674 zcmV;T0$u%yP)w8$@#GU@{fBt#*oO92WM^g{RfdmJu z2``WszdZpW00>}NP|APA>+d0O=r|5yHF2jBFPrCrH1Gxbm73lt|xc&Rm{jvwDH_JebBR zrm@Q4K$yXSepC%Sx>p< zUCU#dUHfz3Bu!CO{Qh=^MxS!==C9`He58^YhR4=v3wAe?_zwdS0a38ChFH$YuGEJ# zXK&>31$x|l!P@_WJqTnkD(7!m|KCIB>D1$gcN&ex^g-A8FXZ^4`}eeKm;e9(07*qo IM6N<$f*bWP&Hw-a literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-installed-locked.png b/spritz/gfx/packages/package-installed-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..76d10eab61625c197b9a97e70f3e283a870873a6 GIT binary patch literal 638 zcmV-^0)hRBP)-Nn_x#krs$ zMbuJJ1Zycch%Tms=+IKrYK%$lP4D-8=Q!BbbZdLI1LwS)_u)O}#>4C!Pz8$Yy{03e zdimP9{VX#-`*}P9ipCfW0g8~55~p;M6FRYDc&>XFpKsDJbqoO*1t>)TqC!YSMsr+{ zDGqa<5A`PiWPO29a*Pe#rYlY6gL`yoAnF15CmwLyDZn zuC_Q+xk9Nu!gBu`oTdN-0ID9;aD+>IUtOY5$&!RW@#?Uo{NNK*)~Ky4QqA9DLps|R z1X~tFg(AZ^(;?LkstOvQ;xQWVrTYxj5OIJ$iik>&1r^4cqpW|M;`qQp%pcEnJ%)3F zwH9j~tyUW^k62i|&)~&Tnnzc983?)h5+jp$AbpFs>o_0dZ3pMOcpKwvjB{<0w9M<5 z@9{Uo-U~c^*&@gqxEi=R>Jr2zh>P(y!P^+`5`3zdD39)hD2Nz9cO4?#WDsmw5MfUO zekVjv5;wpcf?x>33`S#U3Bqq?9fG#0roc*<#ooxZdmWO%w`~gumkF^_EYe}tO z(+t-2<9r@e>9pGnp1sOfo%t`I>X<1!MhCzcMd{(8fa&F9K%Z{65ing_Xp94;eLUo= YzoqCWO4CsYR{#J207*qoM6N<$f`F$ItN;K2 literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-installed-outdated.png b/spritz/gfx/packages/package-installed-outdated.png new file mode 100644 index 0000000000000000000000000000000000000000..699b2997178722bf5cf0f17ca34d4cf7a073cc9a GIT binary patch literal 520 zcmV+j0{8uiP)_v=m88mxhj#AICq)Pe4#W5z)DcC{h!IhzKSE z#g^}OUW&cF+Y}V!s?}=d&71G-+3UB>d*BFI@c-Xw1dd+5dhyTZnROh54f9C?;ExBs zrx{xX&fcA$L||cNLxT_|kQp;t4x3w^#g4ro09L7E-X<>EU4Z=v;Br7kA)jO%OxHY( zEzg@BVmJn1H!Tr=`I&A3$O4}2S&``vJCi&)gk$3LP0?pBeB$wBI|@h%VHnEIZU}Jq zVrMW|&Ksw4AnyeLX{fzP#&t?OO3N%@kkXRtE36I9*9})~%OW}(H?Go@-(5tc+Ci!aRupBlz-2q->$ZL!!G zXX|AT8+kc^^_OLU4aBMyOg#e|&4`?g4B?nrAHq0gTw!aaV}y20000< KMNUMnLSTZwh}p&f literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-installed-updated.png b/spritz/gfx/packages/package-installed-updated.png new file mode 100644 index 0000000000000000000000000000000000000000..43c7b5c091db292e5cdf418347338d23fb20c6ce GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4G(G#ND2Uh)+IMK}vQ zB8!1Ku7fb6lg8`{pdfpRr>`sfH5L{DUdxs{h6W4_jFO%%jv*GO=T6=o$m}TK5+AH3 z6rjn&bF-r81IGj&ktVK~E`|*qO)M8oj=i~aPFC#JuGM#M`}?1tZEL&#&VDBMg!BJz zSF+2<&zH-yJoEeM=Mwfes)71H8(hkqR@hBnHpk)(!y!hCa2q$Vgq%hmN3HAIE-rV7 z3Ep}w+u+=_XEIloENiGe%JI-fMoMo_kZ|6+MV19TjW$o_WnbQKKrBe7TB^Ax*|>2h ztFT4U*?UU_1a+S=gg=ZuHM7C$#mfh~l4qP9*~K64*9QYqF8Z zm}U6#z#*47IpeH_zFenSJ@%XFi53pUHhDs9=rNm o^NMB7pRXVP&S`PygY&+>ObmBcC3BbSg2I}?)78&qol`;+04+hAng9R* literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-new.png b/spritz/gfx/packages/package-new.png new file mode 100644 index 0000000000000000000000000000000000000000..7eec1a08d27de1e9062c40e23dfc8f802526bd53 GIT binary patch literal 482 zcmV<80UiE{P)JR*i1-GAg`y8&dO-vW3qkP*1UrL|5%3982nNJ9 zpzn}U&Cap7cayt8Epm%x?=t6S&dl1?&BYJO<4gVso*f*MdU%FLhxTxGb-otb;T@4H=GC@!oE-^I81 za?X3sd0wrxCv*+itOJ|dJ6yEZo{$G%d{u~3ciQxSzQ5bf_1deH^jjDJH&VZ{^1Q?C zpQ8&s^D;Jkx`Ogcc`Cb;JQ`esQNP2)R&RKABu2rt(QjQ063r+YPMQ?myzlX4%R01- z!}8-Z1P8Oc+O?ROeHCcBjt;PVze!-!CVDMJK4cRcuxP9w^eq9#*ILwejPY!HnDpL{ zh+ntS6gcxE>b{5q9v*-PXv{qxT5C^e3W)J;^=e&X%^tv#b0$^46v$N-Nq5(vDueW2 z8A2D*<>TXTXuK3<^mHkcZDoA+^)TLq?URwpr6JqElaY&5@AimDoq^s@Sb87{?Vt-O zuu@|@@2;YvsPo!TkS-8@SO7qm%BA@DDeF5k{Bt&jW@t2jJ4Ldy%r6kq<>n71hyXNw zV-m@0jBE`u(N?msgH^B5HxPddf(OzC@HuSQviAQtyjT5Kh9(Ul<}>yP-OrKuL$J!M zBOnCD>@<#PB43-xS(|iADbsr@aMqQ~dn611DIFp|T6{j#gi58c@AWYiR*WC1L?(j7 zf08V{=@I?gqWZGMvUeX%1>l}~ zlm4GIlKXWwCPrxVcK;Rq`uXZy3>YxR0MK1;a&^6ds$plSpN?O)1vUMNpg1&5zD>h749#uAjh56BBF@euz;u_v`L008w=yYYx9{|-xnrb6Wc~f!M z%M6cR!%8pt!W0kRe?w1FP!%)+%aab%yN2XOi#xe009Pi{K#U`a6OGg<6#KX>>zXJ`90D}q`qbMdguyAV#j32A@ poTy>57%;!~W^WEi{l|AM{szM4C){P`iZ=iN002ovPDHLkV1it|7X|S5s6?bx&;l?_)QgRC`L)U9Y5 zh7$yzr|}3l?KZMIL__?nVk;h}?n92iSOzhg%~Li@cMcG5vZ!A+v`o8*K(f1{3@Epd z?Dw%ao8#EH&~`sTyerFkw;z;H2wLz*W7)9S=OfwgNACiNrWk^?n^hPq!_n78nkR}h zO%zKu1zZISeKxTh0oNWy8?l4TL3uiUgGC{q%Qk$>pZai zbISk`7f^_Stsq1P{6q&TN^uLIR9S!+5P|LW@d6|BAJ=<<@E#U&>>r}*Inru literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-undoinstall.png b/spritz/gfx/packages/package-undoinstall.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a9244244a4d0368f0b244cdcf52cfc146d7c52 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`wd2Eeg)o)6_?%tO=0wOaSX9Iy>#+! zKPE?!w*8V9*K9D{*5a+IdhM05eIdV4EvYP_rQhT@_d!;_ z2FVXAL@zrZef!;N*K*&2|EE;<3v@Y%Rj}JJUJQuf;ulpvc<{6Ma>o};@&`)K{Cjcc z=WWN*XYpkX;t$f6f7^ZXj-Ek4R`z}`W4DGx1}z2lJxo96&Y5n~>g~|5;W%G`;F09+ z<`pddEz2VovFtgTaQXHAst270e0;_ZmW*a*h9ZirIkL$blUSlzJviNiUwpe&UH_c7 XzA40ERkhV}P~dsG`njxgN@xNAc@UA7 literal 0 HcmV?d00001 diff --git a/spritz/gfx/packages/package-upgrade.png b/spritz/gfx/packages/package-upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..67b88d236ea184674c96ce55da12c2be58e537b3 GIT binary patch literal 641 zcmV-{0)G98P)H7xtlf29Bb0uD(; zK~y-)os(@#lTjGQf9KwPJDm^1nX(9>f%8o$451sEV#uU-eZanfpCCdZh>Nn%!_k4aL)PvumAOAo<8eZ1PZ_q|8EOEP$)i`xDA-)7h7{4 zFl3D3dgB%t<9))XHEw{7dmr`yLVeg4CZ&qQEEW@&RS>(KrC}E4u(>GIy!{EmPAWUQcI0 zUDz#xv4azi2U8qo(++T4b#9V3>;7vvg)}{1n-B1NAj#-yK;PvNpYGqGSnel^_n3MZ zP^o4CSbdXbyWoKc7{$15aRf*G-P}7jObrY&zEee{Mqm<@kGtqj{-koA=AyqF4FDAs zg-(J>D#6BRMDk0GRBu2!s|@scoSyXXqmt&b7PFDFAkFSnm++1%DCa#s&nJDx%0Ayru8_b}QSzqScf8-PIt_C~JQ9WkvBXmdE!HgAlpwP`C@*jYWB1BP!g bkW2pn5G@QV%~G$~00000NkvXXu0mjfd;=DV literal 0 HcmV?d00001 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 + + + + + True + Reinstall the selected package + Reinstall + True + + + + + True + gtk-refresh + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + Undo Reinstall action + Undo Reinstall + True + + + + + True + gtk-undo + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + Remove the selected package + Remove + True + + + + + True + gtk-undo + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + Undo Remove action + Undo Remove + True + + + + + True + gtk-undo + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + Remove the selected package and its configuration + Purge + True + + + + + True + gtk-cancel + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + Undo Purge action + Undo Purge + True + + + + + True + gtk-undo + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + + + + True + Update the selected package + Update + True + + + + + True + gtk-refresh + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + Undo Update action + Undo Update + True + + + + + True + gtk-undo + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + + + + True + Install the selected package + Install + True + + + + + True + gtk-refresh + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + Undo Install action + Undo Install + True + + + + + True + gtk-undo + 1 + 0.5 + 0.5 + 0 + 0 + + + + + + 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: