source: air-manager/trunk/fuentes/air-manager/src/ManageBox.py @ 7331

Last change on this file since 7331 was 7331, checked in by Juanma, 2 years ago

initial release

File size: 5.6 KB
Line 
1import gi
2gi.require_version('Gtk', '3.0')
3from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
4import Core
5import os
6import subprocess
7import airmanager.airmanager as installer
8import threading
9
10RSRC="/usr/share/air-manager/rsrc/"
11
12CSS_FILE=RSRC + "air-manager.css"
13
14class ManageBox(Gtk.ScrolledWindow):
15        def __init__(self):
16                self.dbg=True
17                Gtk.ScrolledWindow.__init__(self)
18#               self.override_background_color(Gtk.StateFlags.NORMAL,Gdk.RGBA(255,255,255,1))
19                self.grid=Gtk.Grid()
20                self.set_css_info()
21                self.core=Core.Core.get_core()
22                self.airinstaller=installer.AirManager()       
23                self.listbox=Gtk.ListBox()
24                self.listbox.set_selection_mode(Gtk.SelectionMode.NONE)
25                layout=Gtk.Layout()
26                vadjustment=layout.get_vadjustment()
27                vscrollbar=Gtk.Scrollbar(orientation=Gtk.Orientation.VERTICAL,adjustment=vadjustment)
28#               self.grid.attach(vscrollbar,1,0,1,1)
29                self.grid.attach(self.listbox,0,1,1,1)
30                self._load_installed_apps()
31
32                self.check_window=Gtk.Window()
33                self.check_window.set_position(Gtk.WindowPosition.CENTER)
34                self.check_window.set_decorated(False)
35                self.check_window.set_modal(True)
36                self.check_window.set_keep_above(True)
37                check_box=Gtk.VBox()
38                check_label=Gtk.Label("Removing file...")
39                check_label.set_margin_top(5)
40                check_label.set_margin_bottom(10)
41                check_label.set_margin_right(30)
42                check_label.set_margin_left(30)
43                self.check_pbar=Gtk.ProgressBar()
44                self.check_pbar.set_margin_top(5)
45                self.check_pbar.set_margin_bottom(10)
46                self.check_pbar.set_margin_right(30)
47                self.check_pbar.set_margin_left(30)
48                check_box.add(check_label)
49                check_box.add(self.check_pbar)
50                check_label.set_name("MSG_LABEL")
51                self.check_window.add(check_box)
52                self.add(self.grid)
53                GObject.threads_init()
54
55        def _debug(self,msg):
56                if self.dbg:
57                        print("UninstallBox: %s"%msg)
58
59        def set_css_info(self):
60                self.style_provider=Gtk.CssProvider()
61
62                f=Gio.File.new_for_path(CSS_FILE)
63                self.style_provider.load_from_file(f)
64
65                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
66        #def set_css_info       
67
68        def _load_installed_apps(self):
69                img_remove=RSRC+'trash.svg'
70                img_run=RSRC+'run.svg'
71                spacing=6
72                total_apps=len(self.airinstaller.get_installed_apps())
73                count=0
74                for child in self.listbox.get_children():
75                        if type(child)==type(Gtk.ListBoxRow()):
76                                for row_child in child.get_children():
77                                        child.remove(row_child)
78                                self.listbox.remove(child)
79                for app,data in self.airinstaller.get_installed_apps().items():
80                        count+=1
81#                       listrow=Gtk.Box(spacing=12,hexpand=True)
82                        listrow=Gtk.Grid(row_spacing=6,hexpand=True,column_spacing=12)
83                        listrow.set_margin_left(12)
84                        listrow.set_margin_right(12)
85                        listrow.set_margin_top(6)
86                        listrow.set_margin_bottom(6)
87                        img_icon=Gtk.Image.new_from_file(self._get_desktop_icon(data["desktop"]))
88                        label=Gtk.Label(app)
89                        label.set_name("LIST_LABEL")
90                        label.set_margin_bottom(spacing)
91                        img_trash=Gtk.Image.new_from_file(img_remove)
92                        btn_remove=Gtk.Button()
93                        btn_remove.add(img_trash)
94                        btn_remove.props.expand=False
95                        btn_remove.props.halign=Gtk.Align.END
96                        btn_remove.set_name("BTN_REMOVE")
97                        btn_remove.connect('clicked',self._remove_air,data)
98                        img_exe=Gtk.Image.new_from_file(img_run)
99                        btn_run=Gtk.Button()
100                        btn_run.add(img_exe)
101                        btn_run.props.expand=True
102                        btn_run.props.halign=Gtk.Align.END
103                        btn_run.set_name("BTN_RUN")
104                        btn_run.connect('clicked',self._run_air,data)
105                        info_box=Gtk.Box(spacing=12,hexpand=True)
106                        info_box.add(label)
107                        info_box.add(btn_run)
108                        info_box.add(btn_remove)
109                        listrow.attach(img_icon,1,1,1,1)
110                        listrow.attach(info_box,2,1,1,1)
111                        listrow.set_name("LIST_ROW")
112                        self.listbox.insert(listrow,-1)
113                        if count<total_apps:
114                                separator=Gtk.Separator()
115                                separator.set_name("LIST_SEPARATOR")
116#                               listrow.attach(separator,2,2,1,1)
117                                separator.set_margin_left(66)
118                                separator.set_margin_top(0)
119                                separator.set_margin_bottom(0)
120                                self.listbox.insert(separator,-1)
121
122        def _get_desktop_icon(self,desktop):
123                icon=''
124                if os.path.isfile(desktop):
125                        f=open(desktop,'r')
126                        flines=f.readlines()
127                        for fline in flines:
128                                fline=fline.strip()
129                                if fline.startswith("Icon"):
130                                        icon=fline
131                                        icon=icon.replace('Icon=','')
132                                        break
133                        if not os.path.isfile(icon):
134                                icon='/usr/share/icons/hicolor/48x48/apps/'+icon
135                                if not icon.endswith('.png'):
136                                        icon=icon+'.png'
137                if not os.path.isfile(icon):
138                        icon='/usr/share/icons/hicolor/48x48/apps/air.png'
139
140                return icon
141
142        def _run_air(self,*args):
143                air_data=args[-1]
144                app_name=os.path.basename(air_data['desktop'])
145                try:
146                        self._debug("Launching %s (%s)"%(app_name,air_data['desktop']))
147                        sw_run_err=subprocess.check_call(['gtk-launch',app_name])
148                except Exception as e:
149                        self._debug(e)
150
151        def _remove_air(self,*args):
152                self.listbox.set_sensitive(False)
153                self.remove_t=threading.Thread(target=self._remove_air_th,args=[*args])
154                self.remove_t.start()
155                self.check_window.show_all()
156                GLib.timeout_add(100,self.pulsate_install)
157
158        def _remove_air_th(self,*args):
159                self.check_pbar.pulse()
160                air_data=args[-1]
161                sw_remove_err=1
162#               sw_remove=self.airinstaller.remove_air_app(air_data)
163                try:
164                        sw_remove_err=subprocess.check_call(['pkexec','/usr/bin/air-helper-installer.py','remove',air_data['air_id'],air_data['desktop']])
165                except Exception as e:
166                        self._debug(e)
167                if sw_remove_err:
168                        self._debug("Removed KO")
169                else:
170                        self._debug("Removed OK")
171
172        def pulsate_install(self):
173                if self.remove_t.is_alive():
174                        self.check_pbar.pulse()
175                        return True
176
177                else:
178                        self._load_installed_apps()
179                        self.show_all()
180                        self.listbox.set_sensitive(True)
181                        self.check_window.hide()
182                        return False
183        #def pulsate_install           
Note: See TracBrowser for help on using the repository browser.