from .aptdaemon import APT
from AptUrl.Helpers import _
from AptUrl import Helpers
from AptUrl.UI import AbstractUI
import tempfile
import subprocess
import apt_pkg
import sys
import os
from gi.repository import GObject
from gi.repository import Gdk
from gi.repository import Gtk
import gi
gi.require_version('Gtk', '3.0')
GObject.threads_init()
APTURL_UI_FILE = os.environ.get(
# Set this envar to use a test .ui file.
'APTURL_UI_FILE',
# System file to use if the envar is not set.
'/usr/share/apturl/apturl-gtk.ui'
)
class GtkUI(AbstractUI):
def __init__(self):
Gtk.init_check(sys.argv)
# create empty dialog
self.dia_xml = Gtk.Builder()
self.dia_xml.set_translation_domain("apturl")
self.dia_xml.add_from_file(APTURL_UI_FILE)
self.dia = self.dia_xml.get_object('confirmation_dialog')
self.dia.start_available = lambda: Gtk.main_quit()
self.dia.start_error = lambda: Gtk.main_quit()
self.dia.exit = lambda: Gtk.main_quit()
self.dia.realize()
self.require_update = False
# generic dialogs
def _get_dialog(self, dialog_type, summary, msg="",
buttons=Gtk.ButtonsType.CLOSE):
" internal helper for dialog construction "
d = Gtk.MessageDialog(parent=self.dia,
flags=Gtk.DialogFlags.MODAL,
type=dialog_type,
buttons=buttons)
d.set_title("")
d.set_markup("%s\n\n%s" % (summary, msg))
d.set_icon_name("package-x-generic")
d.set_keep_above(True)
d.realize()
d.get_window().set_functions(Gdk.WMFunction.MOVE)
return d
def error(self, summary, msg=""):
d = self._get_dialog(Gtk.MessageType.ERROR, summary, msg)
d.run()
d.destroy()
return False
def message(self, summary, msg="", title=""):
d = self._get_dialog(Gtk.MessageType.INFO, summary, msg)
d.set_title(title)
d.run()
d.destroy()
return True
def yesNoQuestion(self, summary, msg, title="", default='no'):
d = self._get_dialog(Gtk.MessageType.QUESTION, summary, msg,
buttons=Gtk.ButtonsType.YES_NO)
d.set_title(title)
res = d.run()
d.destroy()
if res != Gtk.ResponseType.YES:
return False
return True
def askInstallPackage(self, package, summary, description, homepage):
# populate the dialog
dia = self.dia
dia_xml = self.dia_xml
header = _("Install additional software?")
body = _("Do you want to install package '%s'?") % package
dia.set_title(package)
header_label = dia_xml.get_object('header_label')
header_label.set_markup("%s" % header)
body_label = dia_xml.get_object('body_label')
body_label.set_label(body)
description_text_view = dia_xml.get_object('description_text_view')
tbuf = Gtk.TextBuffer()
desc = "%s\n\n%s" % (summary, Helpers.format_description(description))
tbuf.set_text(desc)
description_text_view.set_buffer(tbuf)
dia.set_icon_name("package-x-generic")
# check if another package manager is already running
# FIXME: just checking for the existance of the file is
# not sufficient, it need to be tested if it can
# be locked via apt_pkg.get_lock()
# - but that needs to run as root
# - a dbus helper might be the best answer here
# args = (update_button_status, dia_xml.get_object("yes_button"),
# dia_xml.get_object("infolabel"))
# args[0](*args[1:])
# timer_id = GObject.timeout_add(750, *args )
# show the dialog
res = dia.run()
# GObject.source_remove(timer_id)
if res != Gtk.ResponseType.YES:
dia.hide()
return False
return True
# progress etc
def doUpdate(self):
self.require_update = True
def doInstall(self, apturl, extra_pkg_names=[]):
self.dia.hide()
packages = []
packages.append(apturl.package)
packages += extra_pkg_names
self.install_packages(packages)
def install_packages(self, package_names):
self.apt = APT(None)
self.package_names = package_names
self.busy = True
if self.require_update:
self.apt.set_finished_callback(
self.on_update_before_install_finished)
self.apt.update_cache()
else:
self.on_update_before_install_finished()
while self.busy:
while Gtk.events_pending():
Gtk.main_iteration()
def on_update_before_install_finished(self, transaction=None, exit_state=None):
self.apt.set_finished_callback(self.on_install_finished)
self.apt.set_cancelled_callback(self.on_install_finished)
self.apt.install_packages(self.package_names)
def on_install_finished(self, transaction=None, exit_state=None):
del self.package_names
del self.apt
self.busy = False
self.dia.exit()
if __name__ == "__main__":
ui = GtkUI()
ui.error("foo", "bar")