source: air-manager/trunk/fuentes/air-installer/src/air_installer.py @ 7351

Last change on this file since 7351 was 7351, checked in by Juanma, 17 months ago

Fix paths

  • Property svn:executable set to *
File size: 6.7 KB
Line 
1#!/usr/bin/python3
2###
3
4import sys
5import subprocess
6import os
7import gi
8import threading
9import tempfile
10import time
11import airmanager.airmanager as installer
12gi.require_version('Gtk', '3.0')
13from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
14
15import gettext
16gettext.textdomain('air-installer')
17_ = gettext.gettext
18
19RSRC="/usr/share/air-manager/rsrc"
20CSS_FILE=RSRC + "air-manager.css"
21GTK_SPACING=6
22
23class confirmDialog(Gtk.Window):
24        def __init__(self,air_file):
25                self._load_gui(air_file)
26        #def __init__
27
28        def _debug(self,msg):
29                print("air_installer: %s"%msg)
30        #def _debug
31
32        def _load_gui(self,air_file):
33                air_file_path=os.path.abspath(air_file)
34                self._debug("Installing %s (%s)"%(air_file,air_file_path))
35                file_name=os.path.basename(air_file)
36                Gtk.Window.__init__(self,title=_("Install air app"))
37                self.set_position(Gtk.WindowPosition.CENTER)
38                style_provider=Gtk.CssProvider()
39                css=b"""
40                #label #label_install{
41                        padding: 6px;
42                        margin:6px;
43                        font: 12px Roboto;
44                }
45                #label_install:insensitive{
46                        padding: 6px;
47                        margin:6px;
48                        font: 12px Roboto;
49                        color:white;
50                        background-image:-gtk-gradient (linear, left top, left bottom, from (#7ea8f2),to (#7ea8f2));
51                        box-shadow: -0.5px 3px 2px #aaaaaa;
52                }
53                #frame{
54                        padding: 6px;
55                        margin:6px;
56                        font: 12px Roboto;
57                        background:white;
58                }
59                """
60                style_provider.load_from_data(css)
61                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
62                self.pb=GdkPixbuf.Pixbuf()
63                self.box=Gtk.Grid(row_spacing=6,column_spacing=6)
64                self.add(self.box)
65                img_banner=Gtk.Image()
66                img_banner.set_from_file(RSRC+"/air-installer.png")
67                self.box.attach(img_banner,0,0,1,1)
68                self.pulse=Gtk.Spinner()
69                self.box.attach(self.pulse,0,1,2,2)
70               
71                img_info=Gtk.Image()
72                img_info.set_from_stock(Gtk.STOCK_SAVE,Gtk.IconSize.DIALOG)
73
74                self.lbl_info=Gtk.Label('')
75                self.lbl_info.set_name('label_install')
76                self.lbl_info.set_max_width_chars(20)
77                self.lbl_info.set_width_chars(20)
78                self.lbl_info.set_line_wrap(True)
79                lbl_text=_("Install <b>%s</b>")%file_name
80                self.lbl_info.set_markup(lbl_text)
81                self.lbl_info.set_margin_bottom(GTK_SPACING)
82                self.lbl_info.set_margin_left(GTK_SPACING)
83                self.lbl_info.set_margin_right(GTK_SPACING)
84                self.lbl_info.set_margin_top(GTK_SPACING)
85
86                self.box_info=Gtk.Box()
87                self.box_info.add(self.lbl_info)
88                self.box_info.add(img_info)
89
90                self.btn_install=Gtk.Button()
91                self.btn_install.add(self.box_info)
92
93                img_icon=Gtk.Image()
94                img_icon.set_from_file(RSRC+"/air-installer_icon.png")
95                self.pb=img_icon.get_pixbuf()
96                air_info=installer.AirManager().get_air_info(air_file_path)
97                if 'pb' in air_info.keys():
98                        if air_info['pb']:
99                                img_icon.set_from_pixbuf(air_info['pb'])
100                                self.pb=air_info['pb']
101
102                lbl_text=_("<b>Select icon</b> for %s")%file_name
103                lbl_icon=Gtk.Label()
104                lbl_icon.set_markup(lbl_text)
105                lbl_icon.set_name('label')
106                lbl_icon.set_max_width_chars(20)
107                lbl_icon.set_width_chars(20)
108                lbl_icon.set_line_wrap(True)
109
110                self.box_icon=Gtk.Box(spacing=6)
111                self.box_icon.add(lbl_icon)
112                self.box_icon.add(img_icon)
113
114                self.btn_icon=Gtk.Button()
115                self.btn_icon.add(self.box_icon)
116
117                self.box_button=Gtk.HBox(spacing=6)
118                self.box_button.props.halign=Gtk.Align.END
119                self.box.set_margin_bottom(GTK_SPACING)
120                self.box.set_margin_left(GTK_SPACING)
121                self.box.set_margin_top(GTK_SPACING)
122
123                btn_cancel=Gtk.Button.new_from_stock(Gtk.STOCK_CLOSE)
124
125                self.box_button.add(btn_cancel)
126                self.box.attach_next_to(self.btn_icon,img_banner,Gtk.PositionType.BOTTOM,1,1)
127                self.box.attach_next_to(self.btn_install,self.btn_icon,Gtk.PositionType.BOTTOM,1,1)
128                self.box.attach_next_to(self.box_button,self.btn_install,Gtk.PositionType.BOTTOM,1,1)
129
130                self.btn_install.connect("clicked",self._begin_install_file,air_file_path)
131                self.btn_icon.connect("clicked",self._set_app_icon,img_icon)
132                btn_cancel.connect("clicked",Gtk.main_quit)
133                self.connect("destroy",Gtk.main_quit)
134                self.show_all()
135                Gtk.main()
136        #def _load_gui
137
138        def _set_app_icon(self,widget,img_icon):
139               
140                def _update_preview(*arg):
141                        if dw.get_preview_filename():
142                                if os.path.isfile(dw.get_preview_filename()):
143                                        pb=GdkPixbuf.Pixbuf.new_from_file_at_scale(dw.get_preview_filename(),64,-1,True)
144                                        img_preview.set_from_pixbuf(pb)
145                                        img_preview.show()
146                        else:
147                                img_preview.hide()
148                dw=Gtk.FileChooserDialog(_("Select icon"),None,Gtk.FileChooserAction.OPEN,(Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL,Gtk.STOCK_OPEN,Gtk.ResponseType.OK))
149                dw.set_action(Gtk.FileChooserAction.OPEN)
150                img_preview=Gtk.Image()
151                img_preview.set_margin_right(GTK_SPACING)
152                file_filter=Gtk.FileFilter()
153                file_filter.add_pixbuf_formats()
154                file_filter.set_name(_("images"))
155                dw.add_filter(file_filter)
156                dw.set_preview_widget(img_preview)
157                img_preview.show()
158                dw.set_use_preview_label(False)
159                dw.set_preview_widget_active(True)
160                dw.connect("update-preview",_update_preview)
161                new_icon=dw.run()
162                if new_icon==Gtk.ResponseType.OK:
163                        pb=GdkPixbuf.Pixbuf.new_from_file_at_scale(dw.get_filename(),64,-1,True)
164                        img_icon.set_from_pixbuf(pb)
165                        self.pb=pb
166                dw.destroy()
167        #def _set_app_icon
168
169        def _begin_install_file(self,widget,air_file):
170                self.box_button.set_sensitive(False)
171                self.btn_install.set_sensitive(False)
172                self.btn_icon.set_sensitive(False)
173                self._debug("Launching install thread ")
174                self.pulse.start()
175                subprocess.check_call(['/usr/bin/xhost','+'])
176                th=threading.Thread(target=self._install_file,args=[air_file])
177                th.start()
178                self.box_button.set_sensitive(True)
179        #def _begin_install_file
180
181        def _install_file(self,air_file):
182                err=False
183                try:
184                        self._debug("Installing")
185                        tmp_icon=tempfile.mkstemp()[1]
186                        self._debug(tmp_icon)
187                        #Copy the icon to temp folder
188                        self.pb.savev(tmp_icon,'png',[""],[""])
189                        try:
190                                ins=subprocess.check_call(['pkexec','/usr/bin/air-helper-installer.py','install',air_file,tmp_icon])
191                                os.path.remove(tmp_icon)
192                        except subprocess.CalledProcessError as e:
193                                self._debug(e)
194                                err=True
195                        except Exception as e:
196                                self._debug(e)
197                except Exception as e:
198                        self._debug(e)
199                        err=True
200                self.pulse.stop()
201                self.pulse.set_visible(False)
202                if err:
203                        self.btn_install.set_sensitive(True)
204                        self.btn_icon.set_sensitive(True)
205                if not err:
206                        msg=_("Package <b>%s</b> succesfully installed")%air_file
207                        self.lbl_info.set_markup(msg)
208                        self.box_button.show()
209                        self.box_icon.hide()
210                subprocess.check_call(['/usr/bin/xhost','-'])
211        #def _install_file
212
213#Main
214AIR_FOLDER="/opt/adobe-air-sdk/"
215air_file=sys.argv[1]
216
217if AIR_FOLDER in os.path.dirname(air_file):
218        #Launch the air file
219        air_basename=os.path.basename(air_file)
220        air_basename=air_basename.replace('.air','')
221        subprocess.call(['gtk-launch',air_basename])
222
223else:
224
225        dialog=confirmDialog(air_file)
226        #install the air file
227#       os.execle("pkexec","/usr/share/air-installer/air-helper-installer.py",air_file)
228
Note: See TracBrowser for help on using the repository browser.