diff --git a/magneto/Makefile b/magneto/Makefile index bd5752b88..2f3dd897b 100644 --- a/magneto/Makefile +++ b/magneto/Makefile @@ -49,10 +49,10 @@ magneto-gtk3-install: magneto-kde-install: - mkdir -p $(DESTDIR)/$(LIBDIR)/entropy/magneto/magneto/kde + mkdir -p $(DESTDIR)/$(LIBDIR)/entropy/magneto/magneto/qt5 mkdir -p $(DESTDIR)$(PREFIX)/share/apps/magneto - install -m644 src/magneto/kde/*.py \ - $(DESTDIR)/$(LIBDIR)/entropy/magneto/magneto/kde/. + install -m644 src/magneto/qt5/*.py \ + $(DESTDIR)/$(LIBDIR)/entropy/magneto/magneto/qt5/. # install Magneto notification service install -m644 $(MISCDIR)/magneto.notifyrc \ $(DESTDIR)$(PREFIX)/share/apps/magneto/. diff --git a/magneto/src/magneto/core/interfaces.py b/magneto/src/magneto/core/interfaces.py index 9089e1c40..fc12775d4 100644 --- a/magneto/src/magneto/core/interfaces.py +++ b/magneto/src/magneto/core/interfaces.py @@ -513,6 +513,8 @@ class MagnetoCore(MagnetoCoreUI): def applet_doubleclick(self): if not self.current_state in [ "OKAY", "ERROR", "CRITICAL" ]: + const_debug_write("applet_doubleclick", + "not ready to show notice window: %s." % self.current_state) return self.trigger_notice_window() diff --git a/magneto/src/magneto/kde/__init__.py b/magneto/src/magneto/qt5/__init__.py similarity index 100% rename from magneto/src/magneto/kde/__init__.py rename to magneto/src/magneto/qt5/__init__.py diff --git a/magneto/src/magneto/kde/components.py b/magneto/src/magneto/qt5/components.py similarity index 85% rename from magneto/src/magneto/kde/components.py rename to magneto/src/magneto/qt5/components.py index 96459a4f4..1b138f3b4 100644 --- a/magneto/src/magneto/kde/components.py +++ b/magneto/src/magneto/qt5/components.py @@ -13,9 +13,10 @@ import os # Qt imports -from PyQt4.QtCore import SIGNAL -from PyQt4.QtGui import QPixmap, QHBoxLayout, QListView, QLabel, QWidget, \ - QStringListModel, QVBoxLayout, QPushButton, QIcon +from PyQt5.QtCore import QStringListModel +from PyQt5.QtWidgets import QHBoxLayout, QListView, QLabel, QWidget, \ + QVBoxLayout, QPushButton +from PyQt5.QtGui import QIcon # Entropy imports from entropy.i18n import _ @@ -24,8 +25,8 @@ from entropy.i18n import _ class AppletNoticeWindow(QWidget): def __init__(self, controller): + super(AppletNoticeWindow, self).__init__() - QWidget.__init__(self) self.__controller = controller self.__pkglist = [] @@ -58,8 +59,8 @@ class AppletNoticeWindow(QWidget): self.resize(400, 200) self.setWindowTitle(_("Application updates")) - self.connect(self.__close_button, SIGNAL("clicked()"), self.on_close) - self.connect(self.__launch_pm_button, SIGNAL("clicked()"), self.on_pm) + self.__close_button.clicked.connect(self.on_close) + self.__launch_pm_button.clicked.connect(self.on_pm) def closeEvent(self, event): """ diff --git a/magneto/src/magneto/kde/interfaces.py b/magneto/src/magneto/qt5/interfaces.py similarity index 61% rename from magneto/src/magneto/kde/interfaces.py rename to magneto/src/magneto/qt5/interfaces.py index 4b21ec508..efbaa5f75 100644 --- a/magneto/src/magneto/kde/interfaces.py +++ b/magneto/src/magneto/qt5/interfaces.py @@ -12,22 +12,20 @@ import os import sys -# PyQt4 imports -from PyQt4.QtCore import QTimer, SIGNAL -from PyQt4.QtGui import QIcon - -# PyKDE4 imports -from PyKDE4.kdecore import KAboutData, KCmdLineArgs, ki18n -from PyKDE4.kdeui import KApplication, KStatusNotifierItem, KIcon, \ - KMenu, KAction, KNotification +# PyQt5 imports +from PyQt5.QtCore import QTimer +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu, \ + QAction, QDialog # Magneto imports from magneto.core import config from magneto.core.interfaces import MagnetoCore -from magneto.kde.components import AppletNoticeWindow +from magneto.qt5.components import AppletNoticeWindow # Entropy imports from entropy.i18n import _ +from entropy.const import const_debug_write import entropy.dep @@ -38,40 +36,17 @@ class Magneto(MagnetoCore): """ def __init__(self): + self._app = QApplication([sys.argv[0]]) - app_name = "magneto" - catalog = "" - prog_name = ki18n("Magneto") - version = "1.0" - description = ki18n("System Update Status") - lic = KAboutData.License_GPL - cright = ki18n("(c) 2013 Fabio Erculiani") - text = ki18n("none") - home_page = "www.sabayon.org" - bug_mail = "lxnay@sabayon.org" - - self._kabout = KAboutData (app_name, catalog, prog_name, version, - description, lic, cright, text, home_page, bug_mail) - - argv = [sys.argv[0]] - KCmdLineArgs.init(argv, self._kabout) - self._app = KApplication() - - from dbus.mainloop.qt import DBusQtMainLoop + from dbus.mainloop.pyqt5 import DBusQtMainLoop super(Magneto, self).__init__(main_loop_class = DBusQtMainLoop) - self._window = KStatusNotifierItem() - # do not show "Quit" and use quitSelected() signal - self._window.setStandardActionsEnabled(False) - + self._window = QSystemTrayIcon(self._app) icon_name = self.icons.get("okay") - self._window.setIconByName(icon_name) - self._window.setStatus(KStatusNotifierItem.Passive) + self._window.setIcon(QIcon.fromTheme(icon_name)) + self._window.activated.connect(self.applet_activated) - self._window.connect(self._window, - SIGNAL("activateRequested(bool,QPoint)"), - self.applet_activated) - self._menu = KMenu(_("Magneto Entropy Updates Applet")) + self._menu = QMenu(_("Magneto Entropy Updates Applet")) self._window.setContextMenu(self._menu) self._menu_items = {} @@ -82,42 +57,45 @@ class Magneto(MagnetoCore): myid, _unused, mytxt, myslot_func = item name = self.get_menu_image(myid) - action_icon = KIcon(name) + action_icon = QIcon.fromTheme(name) - w = KAction(action_icon, mytxt, self._menu) + w = QAction(action_icon, mytxt, self._window, + triggered=myslot_func) self._menu_items[myid] = w - self._window.connect(w, SIGNAL("triggered()"), myslot_func) self._menu.addAction(w) self._menu.hide() def _first_check(self): - def _do_check(): self.send_check_updates_signal(startup_check = True) return False if self._dbus_service_available: + const_debug_write("_first_check", "spawning check.") QTimer.singleShot(10000, _do_check) def startup(self): - """ - Start user interface. - """ self._dbus_service_available = self.setup_dbus() if config.settings["APPLET_ENABLED"] and \ self._dbus_service_available: self.enable_applet(do_check = False) + const_debug_write("startup", "applet enabled, dbus service available.") else: + const_debug_write("startup", "applet disabled.") self.disable_applet() if not self._dbus_service_available: + const_debug_write("startup", "dbus not service available.") QTimer.singleShot(30000, self.show_service_not_available) else: + const_debug_write("startup", "spawning first check.") self._first_check() # Notice Window instance self._notice_window = AppletNoticeWindow(self) + self._window.show() + # Enter main loop self._app.exec_() @@ -127,7 +105,7 @@ class Magneto(MagnetoCore): def change_icon(self, icon_name): name = self.icons.get(icon_name) - self._window.setIconByName(name) + self._window.setIcon(QIcon.fromTheme(name)) def disable_applet(self, *args): super(Magneto, self).disable_applet() @@ -143,6 +121,8 @@ class Magneto(MagnetoCore): def show_alert(self, title, text, urgency = None, force = False, buttons = None): + # NOTE: there is no support for buttons via QSystemTrayIcon. + if ((title, text) == self.last_alert) and not force: return @@ -159,51 +139,31 @@ class Magneto(MagnetoCore): button_callback() def do_show(): - notification = KNotification("Updates") + if not self._window.supportsMessages(): + const_debug_write("show_alert", "messages not supported.") + return - # Keep a reference or the callback of the actions added - # below will never work. - # See: https://bugzilla.redhat.com/show_bug.cgi?id=241531 - self.__last_notification = notification - - notification.setFlags(KNotification.CloseOnTimeout) - notification.setText("%s
%s" % (title, text,)) - if buttons: - notification.setActions([x[1] for x in buttons]) - notification.connect( - notification, - SIGNAL("activated(unsigned int)"), _action_activate_cb) - - icon_name = "okay" - status = KStatusNotifierItem.Passive + icon_id = QSystemTrayIcon.Information if urgency == "critical": - icon_name = "critical" - status = KStatusNotifierItem.Active + icon_id = QSystemTrayIcon.Critical - name = self.icons.get(icon_name) - icon = KIcon(name) - self._window.setStatus(status) - - notification.setPixmap(icon.pixmap(48, 48)) - notification.sendEvent() + self._window.showMessage(title, text, icon_id) self.last_alert = (title, text) - # thread safety QTimer.singleShot(0, do_show) def update_tooltip(self, tip): def do_update(): - self._window.setToolTipTitle(tip) + self._window.setToolTip(tip) QTimer.singleShot(0, do_update) def applet_context_menu(self): - """ - No action for now. - """ - pass + """No action for now.""" - def applet_activated(self, active, pos): - if active: + def applet_activated(self, reason): + const_debug_write("applet_activated", "Applet activated: %s" % reason) + if reason == QSystemTrayIcon.DoubleClick: + const_debug_write("applet_activated", "Double click event.") self.applet_doubleclick() def hide_notice_window(self): @@ -213,9 +173,11 @@ class Magneto(MagnetoCore): def show_notice_window(self): if self.notice_window_shown: + const_debug_write("show_notice_window", "Notice window already shown.") return if not self.package_updates: + const_debug_write("show_notice_window", "No computed updates.") return entropy_ver = None @@ -243,8 +205,7 @@ class Magneto(MagnetoCore): critical_msg = "" if entropy_ver is not None: - critical_msg = "%s sys-apps/entropy " - "%s, %s %s. %s." % ( + critical_msg = "%s sys-apps/entropy %s, %s %s. %s." % ( _("Your system currently has an outdated version of"), _("installed"), _("the latest available version is"), diff --git a/magneto/src/magneto_app.py b/magneto/src/magneto_app.py index 63957b128..16f65a5ed 100755 --- a/magneto/src/magneto_app.py +++ b/magneto/src/magneto_app.py @@ -46,7 +46,7 @@ def _startup(unlock_callback): is_mate = desktop_session == "MATE" if "--kde" in sys.argv: - from magneto.kde.interfaces import Magneto + from magneto.qt5.interfaces import Magneto elif "--gtk" in sys.argv: from magneto.gtk.interfaces import Magneto elif "--gtk3" in sys.argv: @@ -55,7 +55,7 @@ def _startup(unlock_callback): if kde_env is not None: # this is KDE! try: - from magneto.kde.interfaces import Magneto + from magneto.qt5.interfaces import Magneto except (ImportError, RuntimeError,): # try GTK3, then GTK try: