usbinstall.py: switch to PyQt6 and major code refactoring
This commit is contained in:
parent
5135626ca1
commit
972ecbcdf9
@ -2,287 +2,33 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright 2011 michiamophil (openmamba user :-)
|
# Copyright 2011 michiamophil (openmamba user :-)
|
||||||
# Copyright 2011-2020 Silvan Calarco
|
# Copyright 2011-2024 Silvan Calarco
|
||||||
# ChangeLog:
|
|
||||||
# (michiamophil on 11/11/11) Rewritten all the graphic code and removed gui.py
|
|
||||||
|
|
||||||
|
|
||||||
from PyQt4 import QtGui, QtCore
|
|
||||||
from subprocess import Popen
|
from subprocess import Popen
|
||||||
import signal
|
import gettext
|
||||||
import gettext # To translate
|
from PyQt6 import QtCore
|
||||||
|
from PyQt6.QtCore import QRect
|
||||||
|
from PyQt6.QtGui import QIcon, QPixmap
|
||||||
|
from PyQt6.QtWidgets import QApplication, QComboBox, QDialog,\
|
||||||
|
QFileDialog, QFrame, QLabel,\
|
||||||
|
QLineEdit, QMessageBox, QProgressBar, QPushButton
|
||||||
from gi.repository import GLib
|
from gi.repository import GLib
|
||||||
import dbus
|
import dbus
|
||||||
import dbus.service
|
import dbus.service
|
||||||
from dbus.mainloop.glib import DBusGMainLoop
|
from dbus.mainloop.glib import DBusGMainLoop
|
||||||
DBusGMainLoop(set_as_default=True)
|
DBusGMainLoop(set_as_default=True)
|
||||||
#import dbus.glib
|
|
||||||
|
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
translator = gettext.translation('usbinstall', '/usr/share/locale')
|
||||||
#1)-------------------------------(VARIABILI)----------------------------------------
|
_ = translator.gettext
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
||||||
# Icons
|
|
||||||
img_help = "/usr/share/icons/gnome/24x24/status/dialog-question.png"
|
|
||||||
img_fOpen = "/usr/share/icons/gnome/32x32/actions/document-open.png"
|
|
||||||
img_refresh = "/usr/share/icons/gnome/24x24/actions/view-refresh.png"
|
|
||||||
img_pach1 = "/usr/share/openmamba/usbinstall/img/pach1.png"
|
|
||||||
img_cloud = "/usr/share/openmamba/usbinstall/img/nuvola.png"
|
|
||||||
img_exit = "/usr/share/openmamba/usbinstall/img/exit.png"
|
|
||||||
window_icon = "/usr/share/icons/hicolor/32x32/apps/mamba.png"
|
|
||||||
# Global path
|
|
||||||
path_cpio = ""
|
|
||||||
path_iso = ""
|
|
||||||
path_dev = ""
|
|
||||||
# General vars
|
|
||||||
dev_model = ""
|
|
||||||
a_path_dev = [] # Array of choosen devices
|
|
||||||
a_dev_model = [] # Their models.
|
|
||||||
step = 1
|
|
||||||
choose_type = "" # Type of dialog in choose_file()
|
|
||||||
#1)###############################(VARIABILI)########################################
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
||||||
#2)-------------------------------(WINDOW CODE)--------------------------------------
|
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
||||||
# Contains program's graphic
|
|
||||||
class create_window(QtGui.QDialog):
|
|
||||||
# Call when is called create_window()
|
|
||||||
def __init__(self):
|
|
||||||
super(create_window, self).__init__() # Register eventClose()
|
|
||||||
self.add_elements()
|
|
||||||
|
|
||||||
# Write window and objects
|
|
||||||
def add_elements(self):
|
|
||||||
# Window proprieties
|
|
||||||
self.resize(500, 405)
|
|
||||||
self.setWindowIcon(QtGui.QIcon(window_icon))
|
|
||||||
# Background image
|
|
||||||
self.i_back = QtGui.QLabel(self)
|
|
||||||
self.i_back.setGeometry(QtCore.QRect(10, 10, 480, 300))
|
|
||||||
# Description label
|
|
||||||
self.l_descr = QtGui.QLabel(self)
|
|
||||||
self.l_descr.setGeometry(QtCore.QRect(10, 317, 351, 31))
|
|
||||||
# Orizontal line
|
|
||||||
self.line = QtGui.QFrame(self)
|
|
||||||
self.line.setGeometry(QtCore.QRect(10, 350, 481, 20))
|
|
||||||
self.line.setFrameShape(QtGui.QFrame.HLine)
|
|
||||||
self.line.setFrameShadow(QtGui.QFrame.Sunken)
|
|
||||||
# "Next" button
|
|
||||||
self.b_next = QtGui.QPushButton(self)
|
|
||||||
self.b_next.setGeometry(QtCore.QRect(400, 370, 90, 29))
|
|
||||||
self.b_next.setText(_("Go on"))
|
|
||||||
# "Go Back" button
|
|
||||||
self.b_back = QtGui.QPushButton(self)
|
|
||||||
self.b_back.setGeometry(QtCore.QRect(300, 370, 90, 29))
|
|
||||||
# "Help" button
|
|
||||||
self.b_help = QtGui.QPushButton(QtGui.QIcon(img_help), "", self)
|
|
||||||
self.b_help.setGeometry(QtCore.QRect(464, 320, 26, 26))
|
|
||||||
self.b_help.setIconSize(QtCore.QSize(24, 24))
|
|
||||||
self.b_help.setFlat(True)
|
|
||||||
# Path line edit
|
|
||||||
self.t_file = QtGui.QLineEdit(self)
|
|
||||||
self.t_file.setGeometry(QtCore.QRect(212, 321, 222, 25))
|
|
||||||
# Pach line edit
|
|
||||||
self.pach1 = QtGui.QLabel(self)
|
|
||||||
self.pach1.setGeometry(QtCore.QRect(430, 320, 32, 27))
|
|
||||||
self.pach1.setPixmap(QtGui.QPixmap(img_pach1))
|
|
||||||
# Open file button
|
|
||||||
self.b_open_file = QtGui.QPushButton(QtGui.QIcon(img_fOpen), "", self)
|
|
||||||
self.b_open_file.setGeometry(QtCore.QRect(431, 320, 31, 27))
|
|
||||||
self.b_open_file.setFlat(True)
|
|
||||||
# Help dialog image
|
|
||||||
self.i_cloud = QtGui.QLabel(self)
|
|
||||||
self.i_cloud.setGeometry(QtCore.QRect(289, 200, 211, 121))
|
|
||||||
self.i_cloud.setPixmap(QtGui.QPixmap(img_cloud))
|
|
||||||
self.i_cloud.hide()
|
|
||||||
# Help dialog text
|
|
||||||
self.l_cloud = QtGui.QLabel(self)
|
|
||||||
self.l_cloud.setGeometry(QtCore.QRect(298, 200, 181, 101))
|
|
||||||
self.l_cloud.setOpenExternalLinks(True)
|
|
||||||
self.l_cloud.setWordWrap(True)
|
|
||||||
self.l_cloud.hide()
|
|
||||||
# Help dialog exit
|
|
||||||
self.b_cloud = QtGui.QPushButton(QtGui.QIcon(img_exit), "", self)
|
|
||||||
self.b_cloud.setGeometry(QtCore.QRect(471, 202, 14, 14))
|
|
||||||
self.b_cloud.setFlat(True)
|
|
||||||
self.b_cloud.hide()
|
|
||||||
# Refresh button
|
|
||||||
self.b_refresh = QtGui.QPushButton(QtGui.QIcon(img_refresh), "", self)
|
|
||||||
self.b_refresh.setGeometry(QtCore.QRect(435, 320, 26, 26))
|
|
||||||
self.b_refresh.setIconSize(QtCore.QSize(24, 24))
|
|
||||||
self.b_refresh.setFlat(True)
|
|
||||||
# List of usb (combobox)
|
|
||||||
self.c_usb = QtGui.QComboBox(self)
|
|
||||||
self.c_usb.setGeometry(QtCore.QRect(158, 320, 271, 25))
|
|
||||||
# Progressbar
|
|
||||||
self.p_install = QtGui.QProgressBar(self)
|
|
||||||
self.p_install.setGeometry(QtCore.QRect(10, 354, 480, 36))
|
|
||||||
self.p_install.hide()
|
|
||||||
# Show the window
|
|
||||||
self.show()
|
|
||||||
|
|
||||||
# Intercept close event
|
|
||||||
def closeEvent(self, event):
|
|
||||||
msg = QtGui.QMessageBox.question(window, _("Attention"), _("Are you sure to abort?"), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
|
|
||||||
# Exit if was pressed yes button
|
|
||||||
if msg == QtGui.QMessageBox.Yes:
|
|
||||||
end_forced()
|
|
||||||
else:
|
|
||||||
event.ignore()
|
|
||||||
|
|
||||||
#2)###############################(WINDOW CODE)######################################
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
||||||
#3)-----------------------------(EVENTS HANDLER)-------------------------------------
|
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
||||||
# Add SIGNINT event
|
|
||||||
#signal.signal(signal.SIGINT, zz)
|
|
||||||
|
|
||||||
def add_events():
|
|
||||||
app.connect(window.b_next, QtCore.SIGNAL('clicked()'), go_on) # Event n°1
|
|
||||||
app.connect(window.b_back, QtCore.SIGNAL('clicked()'), go_back) # Event n°2
|
|
||||||
app.connect(window.b_open_file, QtCore.SIGNAL('clicked()'), choose_file) # Event n°3
|
|
||||||
app.connect(window.b_help, QtCore.SIGNAL('clicked()'), manage_cloud) # Event n°4
|
|
||||||
app.connect(window.b_cloud, QtCore.SIGNAL('clicked()'), close_cloud) # Event n°5
|
|
||||||
app.connect(window.b_refresh, QtCore.SIGNAL('clicked()'), get_list) # Event n°6
|
|
||||||
app.connect(window.c_usb, QtCore.SIGNAL("activated(int)"), set_usb) # Event n°7
|
|
||||||
|
|
||||||
# Event n°1
|
|
||||||
def go_on():
|
|
||||||
global step, path_cpio, path_iso, path_dev, dev_model
|
|
||||||
cloud_hide()
|
|
||||||
# Step 1 to 2
|
|
||||||
if step == 1:
|
|
||||||
if path_iso == "":
|
|
||||||
msg_warn(_("An openmamba's iso is required"))
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
step += 1
|
|
||||||
step2()
|
|
||||||
# Step 2 to 3
|
|
||||||
elif step == 2:
|
|
||||||
if path_dev == "":
|
|
||||||
msg_warn(_("You must choose a usb key"))
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
msg = QtGui.QMessageBox.question(window, _("Attention"), _("All data on the key ") + dev_model + _(" will be lost. \n")+ _("Are you sure to continue?"),
|
|
||||||
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
|
|
||||||
# Go on only if was pressed yes button
|
|
||||||
if msg == QtGui.QMessageBox.Yes:
|
|
||||||
step += 1
|
|
||||||
step3()
|
|
||||||
else:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Event n°2
|
|
||||||
def go_back():
|
|
||||||
global step
|
|
||||||
step -= 1
|
|
||||||
cloud_hide()
|
|
||||||
obj_chang_hide()
|
|
||||||
# Step 1 to 0 -> exit
|
|
||||||
if step == 0:
|
|
||||||
app.exit(1)
|
|
||||||
print (_("Application terminated by pressing \"cancel\" button"))
|
|
||||||
# Step 2 to 1
|
|
||||||
elif step == 1:
|
|
||||||
step1()
|
|
||||||
# Step 3 to 2
|
|
||||||
elif step == 2:
|
|
||||||
step2()
|
|
||||||
|
|
||||||
# Event n°3
|
|
||||||
def choose_file():
|
|
||||||
global path_cpio, path_iso, choose_type
|
|
||||||
# if step is 1
|
|
||||||
if choose_type == "iso":
|
|
||||||
nfileName = QtGui.QFileDialog.getOpenFileName(window, _("Choose the iso file"), "/home", "File .iso (*.iso)")
|
|
||||||
path_iso = nfileName
|
|
||||||
window.t_file.setText(nfileName)
|
|
||||||
|
|
||||||
# Event n°4
|
|
||||||
def manage_cloud():
|
|
||||||
global step
|
|
||||||
if step == 1:
|
|
||||||
aiuto = _("The file .iso contains the operating system. You can download it from <a style=\"color: green; \"href=\"http://www.openmamba.org/distribution/download.html?lang=en\">here</a>")
|
|
||||||
elif step == 2:
|
|
||||||
aiuto = _("Choose an usb key for the installation. <span style=\"color:red;\">All data will be lost</span>")
|
|
||||||
window.l_cloud.setText(aiuto)
|
|
||||||
cloud_show()
|
|
||||||
|
|
||||||
# Event n°5
|
|
||||||
def close_cloud():
|
|
||||||
cloud_hide()
|
|
||||||
|
|
||||||
# Event n°6
|
|
||||||
def get_list():
|
|
||||||
global a_path_dev, a_dev_model
|
|
||||||
|
|
||||||
# Clear array and comboBox
|
|
||||||
a_path_dev = []
|
|
||||||
a_dev_model = []
|
|
||||||
window.c_usb.clear()
|
|
||||||
i = 0
|
|
||||||
|
|
||||||
# Get list form dbus
|
|
||||||
bus = dbus.SystemBus()
|
|
||||||
ud_manager_obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2')
|
|
||||||
ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.DBus.ObjectManager')
|
|
||||||
for k,v in ud_manager.GetManagedObjects().items():
|
|
||||||
device_block = v.get('org.freedesktop.UDisks2.Block', {})
|
|
||||||
device_partitiontable = v.get('org.freedesktop.UDisks2.PartitionTable', {})
|
|
||||||
device = device_block.get('Device')
|
|
||||||
drive = device_block.get('Drive')
|
|
||||||
if not device or not drive or not device_partitiontable:
|
|
||||||
continue
|
|
||||||
device = bytearray(device).replace(b'\x00', b'').decode('utf-8')
|
|
||||||
device_drive = bus.get_object('org.freedesktop.UDisks2', drive)
|
|
||||||
try:
|
|
||||||
removable = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Removable', dbus_interface='org.freedesktop.DBus.Properties')
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
size = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Size', dbus_interface='org.freedesktop.DBus.Properties')
|
|
||||||
if removable and size > 891289600 and not device_block.get('ReadOnly') and \
|
|
||||||
not device_block.get('HintSystem') and device_block.get('HintPartitionable'):
|
|
||||||
connectionbus = device_drive.Get('org.freedesktop.UDisks2.Drive', 'ConnectionBus', dbus_interface='org.freedesktop.DBus.Properties')
|
|
||||||
model = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Model', dbus_interface='org.freedesktop.DBus.Properties')
|
|
||||||
vendor = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Vendor', dbus_interface='org.freedesktop.DBus.Properties')
|
|
||||||
if removable:
|
|
||||||
a_path_dev.append(device)
|
|
||||||
a_dev_model.append(vendor + " " + model)
|
|
||||||
# And add element to comboBox
|
|
||||||
window.c_usb.addItem(a_dev_model[i] + " (" + "{0:.2f}".format(size / 1024.0 / 1024.0 / 1024.0) + " GiB)")
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
# First dev is default
|
|
||||||
if len(a_path_dev) != 0:
|
|
||||||
set_usb(0)
|
|
||||||
else:
|
|
||||||
print (_("No usb available > 1 Gb"))
|
|
||||||
|
|
||||||
# Event n°7
|
|
||||||
def set_usb(i):
|
|
||||||
global path_dev, dev_model, a_path_dev, a_dev_model
|
|
||||||
path_dev = a_path_dev[i]
|
|
||||||
dev_model = a_dev_model[i]
|
|
||||||
#3)#############################(EVENTS HANDLER)#####################################
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
||||||
#4)-------------------------------(DBUS CODE)----------------------------------------
|
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
|
||||||
# Class for dbus_start()
|
# Class for dbus_start()
|
||||||
class set_dbus(dbus.service.Object):
|
class set_dbus(dbus.service.Object):
|
||||||
def __init__(self, bus_name, object_path='/org/openmamba/usbinstall'):
|
window = None
|
||||||
|
|
||||||
|
def __init__(self, bus_name, window, object_path='/org/openmamba/usbinstall'):
|
||||||
dbus.service.Object.__init__(self, bus_name, object_path)
|
dbus.service.Object.__init__(self, bus_name, object_path)
|
||||||
|
self.window = window
|
||||||
|
|
||||||
@dbus.service.method('org.openmamba.usbinstall')
|
@dbus.service.method('org.openmamba.usbinstall')
|
||||||
def Set_progressBar(self, p):
|
def Set_progressBar(self, p):
|
||||||
@ -292,10 +38,10 @@ class set_dbus(dbus.service.Object):
|
|||||||
@dbus.service.method('org.openmamba.usbinstall')
|
@dbus.service.method('org.openmamba.usbinstall')
|
||||||
def Exit(self, errMsg):
|
def Exit(self, errMsg):
|
||||||
if errMsg == "":
|
if errMsg == "":
|
||||||
end_with_success()
|
window.end_with_success()
|
||||||
else:
|
else:
|
||||||
msg = QtGui.QMessageBox.critical(window, _("Script Error"), _(errMsg))
|
window.msg = QMessageBox.critical(window, _("Script Error"), _(errMsg))
|
||||||
end_forced()
|
window.end_forced()
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@dbus.service.method('org.openmamba.usbinstall')
|
@dbus.service.method('org.openmamba.usbinstall')
|
||||||
@ -303,114 +49,340 @@ class set_dbus(dbus.service.Object):
|
|||||||
window.l_descr.setText(descr)
|
window.l_descr.setText(descr)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def dbus_start():
|
|
||||||
bus_name = dbus.service.BusName('org.openmamba.usbinstall', bus=dbus.SystemBus())
|
|
||||||
dbus_loop = set_dbus(bus_name)
|
|
||||||
bus = dbus.SystemBus(mainloop=dbus_loop)
|
|
||||||
#4)###############################(DBUS CODE)########################################
|
|
||||||
|
|
||||||
|
# Contains program's graphic
|
||||||
|
class MainWindow(QDialog):
|
||||||
|
# Icons
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
img_help = "/usr/share/icons/gnome/24x24/status/dialog-question.png"
|
||||||
#5)------------------------------(PROGRAM CODE)--------------------------------------
|
img_fOpen = "/usr/share/icons/gnome/32x32/actions/document-open.png"
|
||||||
#=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
|
img_refresh = "/usr/share/icons/gnome/24x24/actions/view-refresh.png"
|
||||||
# Show all cloud objects
|
img_pach1 = "/usr/share/openmamba/usbinstall/img/pach1.png"
|
||||||
def cloud_show():
|
img_cloud = "/usr/share/openmamba/usbinstall/img/nuvola.png"
|
||||||
window.i_cloud.show()
|
img_exit = "/usr/share/openmamba/usbinstall/img/exit.png"
|
||||||
window.b_cloud.show()
|
# Background images
|
||||||
window.l_cloud.show()
|
img_background1 = "/usr/share/openmamba/usbinstall/img/back1.png"
|
||||||
|
img_background2 = "/usr/share/openmamba/usbinstall/img/back2.png"
|
||||||
# Hide all cloud objects
|
img_background3 = "/usr/share/openmamba/usbinstall/img/back3.png"
|
||||||
def cloud_hide():
|
# Global path
|
||||||
window.i_cloud.hide()
|
|
||||||
window.b_cloud.hide()
|
|
||||||
window.l_cloud.hide()
|
|
||||||
|
|
||||||
# Warning dialog abbreviation
|
|
||||||
def msg_warn(txt):
|
|
||||||
msg = QtGui.QMessageBox.warning(window, _("Attention"), txt)
|
|
||||||
|
|
||||||
# Called when b_next was pressed
|
|
||||||
def set_objs(i_back, title, descr):
|
|
||||||
|
|
||||||
window.i_back.setPixmap(QtGui.QPixmap(i_back))
|
|
||||||
window.setWindowTitle(title)
|
|
||||||
window.l_descr.setText(descr)
|
|
||||||
|
|
||||||
|
|
||||||
def step1():
|
|
||||||
global choose_type, path_iso
|
|
||||||
choose_type = "iso"
|
|
||||||
path_iso = ""
|
path_iso = ""
|
||||||
window.t_file.setText(path_iso) # Clean path box
|
path_dev = ""
|
||||||
window.b_back.setText(_("Cancel"))
|
# General vars
|
||||||
set_objs("/usr/share/openmamba/usbinstall/img/back1.png", _("Step 1/3 - choice of ISO file"), _("Choose the openmamba ISO file")+":")
|
dev_model = ""
|
||||||
obj_chang_hide()
|
a_path_dev = [] # Array of choosen devices
|
||||||
list_obj1() # Show a set of object
|
a_dev_model = [] # Their models.
|
||||||
|
step = 1
|
||||||
|
choose_type = "" # Type of dialog in choose_file()
|
||||||
|
|
||||||
def step2():
|
# Call when is called create_window()
|
||||||
set_objs("/usr/share/openmamba/usbinstall/img/back2.png", _("Step 2/3 - choice of USB key"), _("Choose the USB key")+":")
|
def __init__(self):
|
||||||
obj_chang_hide()
|
super().__init__()
|
||||||
list_obj2()
|
self.add_elements()
|
||||||
get_list() # Get available devices
|
self.add_events()
|
||||||
|
|
||||||
def step3():
|
# Write window and objects
|
||||||
global process_sh
|
def add_elements(self):
|
||||||
set_objs("/usr/share/openmamba/usbinstall/img/back3.png", _("Step 3/3 - installation of openmamba to USB"), _("Installation in progress..."))
|
# Window proprieties
|
||||||
# Hide all unnecessary objects
|
self.resize(500, 405)
|
||||||
obj_chang_hide()
|
self.setWindowIcon(QIcon.fromTheme("openmamba"))
|
||||||
window.b_help.hide()
|
# Background image
|
||||||
window.line.hide()
|
self.i_back = QLabel(self)
|
||||||
window.b_back.hide()
|
self.i_back.setGeometry(QRect(10, 10, 480, 300))
|
||||||
window.b_next.hide()
|
# Description label
|
||||||
# Show the progressBar
|
self.l_descr = QLabel(self)
|
||||||
window.p_install.show()
|
self.l_descr.setGeometry(QRect(10, 317, 351, 31))
|
||||||
dbus_start()
|
# Orizontal line
|
||||||
process_sh = Popen(["pkexec", "/usr/sbin/usbinstall", path_dev, path_iso, "-d"])
|
self.line = QFrame(self)
|
||||||
|
self.line.setGeometry(QRect(10, 350, 481, 20))
|
||||||
|
self.line.setFrameShape(QFrame.Shape.HLine)
|
||||||
|
self.line.setFrameShadow(QFrame.Shadow.Sunken)
|
||||||
|
# "Next" button
|
||||||
|
self.b_next = QPushButton(self)
|
||||||
|
self.b_next.setGeometry(QRect(400, 370, 90, 29))
|
||||||
|
self.b_next.setText(_("Go on"))
|
||||||
|
# "Go Back" button
|
||||||
|
self.b_back = QPushButton(self)
|
||||||
|
self.b_back.setGeometry(QRect(300, 370, 90, 29))
|
||||||
|
# "Help" button
|
||||||
|
self.b_help = QPushButton(QIcon(self.img_help), "", self)
|
||||||
|
self.b_help.setGeometry(QRect(464, 320, 26, 26))
|
||||||
|
self.b_help.setIconSize(QtCore.QSize(24, 24))
|
||||||
|
self.b_help.setFlat(True)
|
||||||
|
# Path line edit
|
||||||
|
self.t_file = QLineEdit(self)
|
||||||
|
self.t_file.setGeometry(QRect(212, 321, 222, 25))
|
||||||
|
# Pach line edit
|
||||||
|
self.pach1 = QLabel(self)
|
||||||
|
self.pach1.setGeometry(QRect(430, 320, 32, 27))
|
||||||
|
self.pach1.setPixmap(QPixmap(self.img_pach1))
|
||||||
|
# Open file button
|
||||||
|
self.b_open_file = QPushButton(QIcon(self.img_fOpen), "", self)
|
||||||
|
self.b_open_file.setGeometry(QRect(431, 320, 31, 27))
|
||||||
|
self.b_open_file.setFlat(True)
|
||||||
|
# Help dialog image
|
||||||
|
self.i_cloud = QLabel(self)
|
||||||
|
self.i_cloud.setGeometry(QRect(289, 200, 211, 121))
|
||||||
|
self.i_cloud.setPixmap(QPixmap(self.img_cloud))
|
||||||
|
self.i_cloud.hide()
|
||||||
|
# Help dialog text
|
||||||
|
self.l_cloud = QLabel(self)
|
||||||
|
self.l_cloud.setStyleSheet("QLabel { color : blue; }");
|
||||||
|
self.l_cloud.setGeometry(QRect(298, 200, 181, 101))
|
||||||
|
self.l_cloud.setOpenExternalLinks(True)
|
||||||
|
self.l_cloud.setWordWrap(True)
|
||||||
|
self.l_cloud.hide()
|
||||||
|
# Help dialog exit
|
||||||
|
self.b_cloud = QPushButton(QIcon(self.img_exit), "", self)
|
||||||
|
self.b_cloud.setGeometry(QRect(471, 202, 14, 14))
|
||||||
|
self.b_cloud.setFlat(True)
|
||||||
|
self.b_cloud.hide()
|
||||||
|
# Refresh button
|
||||||
|
self.b_refresh = QPushButton(QIcon(self.img_refresh), "", self)
|
||||||
|
self.b_refresh.setGeometry(QRect(435, 320, 26, 26))
|
||||||
|
self.b_refresh.setIconSize(QtCore.QSize(24, 24))
|
||||||
|
self.b_refresh.setFlat(True)
|
||||||
|
# List of usb (combobox)
|
||||||
|
self.c_usb = QComboBox(self)
|
||||||
|
self.c_usb.setGeometry(QRect(158, 320, 271, 25))
|
||||||
|
# Progressbar
|
||||||
|
self.p_install = QProgressBar(self)
|
||||||
|
self.p_install.setGeometry(QRect(10, 354, 480, 36))
|
||||||
|
self.p_install.hide()
|
||||||
|
# Show the window
|
||||||
|
self.show()
|
||||||
|
|
||||||
# Show a list of object (step 1)
|
# Intercept close event
|
||||||
def list_obj1():
|
def closeEvent(self, event):
|
||||||
window.t_file.show()
|
msg = QMessageBox.question(window, _("Attention"), _("Are you sure to abort?"),
|
||||||
window.pach1.show()
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No)
|
||||||
window.b_open_file.show()
|
# Exit if was pressed yes button
|
||||||
|
if msg == QMessageBox.StandardButton.Yes:
|
||||||
|
self.end_forced()
|
||||||
|
else:
|
||||||
|
event.ignore()
|
||||||
|
|
||||||
# Show a list of object (step 2)
|
# Events handler
|
||||||
def list_obj2():
|
def add_events(self):
|
||||||
window.c_usb.show()
|
self.b_next.clicked.connect(self.go_on)
|
||||||
window.b_refresh.show()
|
self.b_back.clicked.connect(self.go_back)
|
||||||
|
self.b_open_file.clicked.connect(self.choose_file)
|
||||||
|
self.b_help.clicked.connect(self.manage_cloud)
|
||||||
|
self.b_cloud.clicked.connect(self.close_cloud)
|
||||||
|
self.b_refresh.clicked.connect(self.get_list)
|
||||||
|
self.c_usb.activated.connect(self.set_usb)
|
||||||
|
|
||||||
# Hide all object that when b_next or b_back was pressed are changing
|
# Event n°1
|
||||||
def obj_chang_hide():
|
def go_on(self):
|
||||||
window.t_file.hide()
|
self.cloud_hide()
|
||||||
window.pach1.hide()
|
# Step 1 to 2
|
||||||
window.b_open_file.hide()
|
if self.step == 1:
|
||||||
window.c_usb.hide()
|
if self.path_iso == "":
|
||||||
window.b_refresh.hide()
|
self.msg_warn(_("An openmamba's iso is required"))
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.step += 1
|
||||||
|
self.step2()
|
||||||
|
# Step 2 to 3
|
||||||
|
elif self.step == 2:
|
||||||
|
if self.path_dev == "":
|
||||||
|
self.msg_warn(_("You must choose a usb key"))
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
msg = QMessageBox.question(window, _("Attention"), _("All data on the key ") +
|
||||||
|
self.dev_model + _(" will be lost. \n")+ _("Are you sure to continue?"),
|
||||||
|
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
||||||
|
QMessageBox.StandardButton.No)
|
||||||
|
# Go on only if was pressed yes button
|
||||||
|
if msg == QMessageBox.StandardButton.Yes:
|
||||||
|
self.step += 1
|
||||||
|
self.step3()
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
def end_with_success():
|
# Event n°2
|
||||||
global process_sh, mainloop
|
def go_back(self):
|
||||||
msg = QtGui.QMessageBox.information(window, _("Information"), _("Installation process completed"))
|
self.step -= 1
|
||||||
mainloop.quit()
|
self.cloud_hide()
|
||||||
app.exit(0)
|
self.obj_chang_hide()
|
||||||
print (_("Installation process completed"))
|
# Step 1 to 0 -> exit
|
||||||
|
if self.step == 0:
|
||||||
|
app.exit(1)
|
||||||
|
print (_("Application terminated by pressing \"cancel\" button"))
|
||||||
|
# Step 2 to 1
|
||||||
|
elif self.step == 1:
|
||||||
|
self.step1()
|
||||||
|
# Step 3 to 2
|
||||||
|
elif self.step == 2:
|
||||||
|
self.step2()
|
||||||
|
|
||||||
|
# Event n°3
|
||||||
|
def choose_file(self):
|
||||||
|
# if step is 1
|
||||||
|
if self.choose_type == "iso":
|
||||||
|
nfileName = QFileDialog.getOpenFileName(window, _("Choose the iso file"), "/home", "File .iso (*.iso)")
|
||||||
|
self.path_iso = nfileName[0]
|
||||||
|
self.t_file.setText(nfileName[0])
|
||||||
|
|
||||||
|
# Event n°4
|
||||||
|
def manage_cloud(self):
|
||||||
|
if self.step == 1:
|
||||||
|
aiuto = _("The file .iso contains the operating system. You can download it from <a style=\"color: green; \"href=\"http://www.openmamba.org/distribution/download.html?lang=en\">here</a>")
|
||||||
|
elif self.step == 2:
|
||||||
|
aiuto = _("Choose an usb key for the installation. <span style=\"color:red;\">All data will be lost</span>")
|
||||||
|
self.l_cloud.setText(aiuto)
|
||||||
|
self.cloud_show()
|
||||||
|
|
||||||
|
# Event n°5
|
||||||
|
def close_cloud(self):
|
||||||
|
self.cloud_hide()
|
||||||
|
|
||||||
|
# Event n°6
|
||||||
|
def get_list(self):
|
||||||
|
# Clear array and comboBox
|
||||||
|
self.a_path_dev.clear()
|
||||||
|
self.a_dev_model.clear()
|
||||||
|
self.c_usb.clear()
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
# Get list form dbus
|
||||||
|
bus = dbus.SystemBus()
|
||||||
|
ud_manager_obj = bus.get_object('org.freedesktop.UDisks2', '/org/freedesktop/UDisks2')
|
||||||
|
ud_manager = dbus.Interface(ud_manager_obj, 'org.freedesktop.DBus.ObjectManager')
|
||||||
|
for k,v in ud_manager.GetManagedObjects().items():
|
||||||
|
device_block = v.get('org.freedesktop.UDisks2.Block', {})
|
||||||
|
device_partitiontable = v.get('org.freedesktop.UDisks2.PartitionTable', {})
|
||||||
|
device = device_block.get('Device')
|
||||||
|
drive = device_block.get('Drive')
|
||||||
|
if not device or not drive or not device_partitiontable:
|
||||||
|
continue
|
||||||
|
device = bytearray(device).replace(b'\x00', b'').decode('utf-8')
|
||||||
|
device_drive = bus.get_object('org.freedesktop.UDisks2', drive)
|
||||||
|
try:
|
||||||
|
removable = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Removable',
|
||||||
|
dbus_interface='org.freedesktop.DBus.Properties')
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
size = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Size',
|
||||||
|
dbus_interface='org.freedesktop.DBus.Properties')
|
||||||
|
if removable and size > 891289600 and not device_block.get('ReadOnly') and \
|
||||||
|
not device_block.get('HintSystem') and device_block.get('HintPartitionable'):
|
||||||
|
model = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Model',
|
||||||
|
dbus_interface='org.freedesktop.DBus.Properties')
|
||||||
|
vendor = device_drive.Get('org.freedesktop.UDisks2.Drive', 'Vendor',
|
||||||
|
dbus_interface='org.freedesktop.DBus.Properties')
|
||||||
|
if removable:
|
||||||
|
self.a_path_dev.append(device)
|
||||||
|
self.a_dev_model.append(vendor + " " + model)
|
||||||
|
# And add element to comboBox
|
||||||
|
self.c_usb.addItem(self.a_dev_model[i] + " (" +
|
||||||
|
"{0:.2f}".format(size / 1024.0 / 1024.0 / 1024.0) + " GiB)")
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
# First dev is default
|
||||||
|
if len(self.a_path_dev) != 0:
|
||||||
|
self.set_usb(0)
|
||||||
|
else:
|
||||||
|
print (_("No usb available > 1 Gb"))
|
||||||
|
|
||||||
|
# Event n°7
|
||||||
|
def set_usb(self, i):
|
||||||
|
self.path_dev = self.a_path_dev[i]
|
||||||
|
dev_model = self.a_dev_model[i]
|
||||||
|
|
||||||
|
# Show all cloud objects
|
||||||
|
def cloud_show(self):
|
||||||
|
self.i_cloud.show()
|
||||||
|
self.b_cloud.show()
|
||||||
|
self.l_cloud.show()
|
||||||
|
|
||||||
|
# Hide all cloud objects
|
||||||
|
def cloud_hide(self):
|
||||||
|
self.i_cloud.hide()
|
||||||
|
self.b_cloud.hide()
|
||||||
|
self.l_cloud.hide()
|
||||||
|
|
||||||
|
# Warning dialog abbreviation
|
||||||
|
def msg_warn(self, txt):
|
||||||
|
self.msg = QMessageBox.warning(window, _("Attention"), txt)
|
||||||
|
|
||||||
|
# Called when b_next was pressed
|
||||||
|
def set_objs(self, i_back, title, descr):
|
||||||
|
self.i_back.setPixmap(QPixmap(i_back))
|
||||||
|
self.setWindowTitle(title)
|
||||||
|
self.l_descr.setText(descr)
|
||||||
|
|
||||||
|
def step1(self):
|
||||||
|
self.choose_type = "iso"
|
||||||
|
self.t_file.setText(self.path_iso) # Clean path box
|
||||||
|
self.b_back.setText(_("Cancel"))
|
||||||
|
self.set_objs(self.img_background1,
|
||||||
|
_("Step 1/3 - choice of ISO file"), _("Choose the openmamba ISO file")+":")
|
||||||
|
self.obj_chang_hide()
|
||||||
|
self.list_obj1() # Show a set of object
|
||||||
|
|
||||||
|
def step2(self):
|
||||||
|
self.set_objs(self.img_background2,
|
||||||
|
_("Step 2/3 - choice of USB key"), _("Choose the USB key")+":")
|
||||||
|
self.b_back.setText(_("Back"))
|
||||||
|
self.obj_chang_hide()
|
||||||
|
self.list_obj2()
|
||||||
|
self.get_list() # Get available devices
|
||||||
|
|
||||||
|
def step3(self):
|
||||||
|
self.set_objs(self.img_background3,
|
||||||
|
_("Step 3/3 - installation of openmamba to USB"),
|
||||||
|
_("Installation in progress..."))
|
||||||
|
# Hide all unnecessary objects
|
||||||
|
self.obj_chang_hide()
|
||||||
|
self.b_help.hide()
|
||||||
|
self.line.hide()
|
||||||
|
self.b_back.hide()
|
||||||
|
self.b_next.hide()
|
||||||
|
# Show the progressBar
|
||||||
|
self.p_install.show()
|
||||||
|
bus_name = dbus.service.BusName('org.openmamba.usbinstall', bus=dbus.SystemBus())
|
||||||
|
self.dbus_loop = set_dbus(bus_name, self)
|
||||||
|
self.bus = dbus.SystemBus(mainloop=self.dbus_loop)
|
||||||
|
|
||||||
|
print("calling pkexec /usr/sbin/usbinstall " + self.path_dev + " " + self.path_iso + " -d")
|
||||||
|
self.process_sh = Popen(["pkexec", "/usr/sbin/usbinstall",
|
||||||
|
self.path_dev, self.path_iso, "-d"])
|
||||||
|
|
||||||
|
# Show a list of object (step 1)
|
||||||
|
def list_obj1(self):
|
||||||
|
self.t_file.show()
|
||||||
|
self.pach1.show()
|
||||||
|
self.b_open_file.show()
|
||||||
|
|
||||||
|
# Show a list of object (step 2)
|
||||||
|
def list_obj2(self):
|
||||||
|
self.c_usb.show()
|
||||||
|
self.b_refresh.show()
|
||||||
|
|
||||||
|
# Hide all object that when b_next or b_back was pressed are changing
|
||||||
|
def obj_chang_hide(self):
|
||||||
|
self.t_file.hide()
|
||||||
|
self.pach1.hide()
|
||||||
|
self.b_open_file.hide()
|
||||||
|
self.c_usb.hide()
|
||||||
|
self.b_refresh.hide()
|
||||||
|
|
||||||
|
def end_with_success(self):
|
||||||
|
self.msg = QMessageBox.information(window, _("Information"),
|
||||||
|
_("Installation process completed"))
|
||||||
|
mainloop.quit()
|
||||||
|
app.exit(0)
|
||||||
|
print (_("Installation process completed"))
|
||||||
|
|
||||||
|
def end_forced(self):
|
||||||
|
mainloop.quit()
|
||||||
|
#print _("Installation aborted")
|
||||||
|
app.exit(1)
|
||||||
|
|
||||||
def end_forced():
|
|
||||||
global process_sh, mainloop
|
|
||||||
mainloop.quit()
|
|
||||||
#print _("Installation aborted")
|
|
||||||
app.exit(1)
|
|
||||||
|
|
||||||
# Program start
|
# Program start
|
||||||
app = QtGui.QApplication(['usbinstall'])
|
|
||||||
gettext.install('usbinstall', '/usr/share/locale')
|
|
||||||
window = create_window()
|
|
||||||
mainloop = GLib.MainLoop()
|
|
||||||
|
|
||||||
def run():
|
|
||||||
add_events()
|
|
||||||
step1()
|
|
||||||
return app.exec_()
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
run()
|
app = QApplication(['usbinstall'])
|
||||||
#5)##############################(PROGRAM CODE)######################################
|
window = MainWindow()
|
||||||
|
mainloop = GLib.MainLoop()
|
||||||
|
window.step1()
|
||||||
|
app.exec()
|
||||||
|
Loading…
Reference in New Issue
Block a user