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

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

initial release

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