Implement #3834 (Feature Request - Active Job Count in Tray Tooltip)

This commit is contained in:
Kovid Goyal 2009-10-28 14:18:17 -06:00
parent d3b61d9094
commit b5fcc2466b
2 changed files with 40 additions and 3 deletions

View File

@ -11,7 +11,7 @@ from Queue import Empty, Queue
from PyQt4.Qt import QAbstractTableModel, QVariant, QModelIndex, Qt, \ from PyQt4.Qt import QAbstractTableModel, QVariant, QModelIndex, Qt, \
QTimer, SIGNAL, QIcon, QDialog, QAbstractItemDelegate, QApplication, \ QTimer, SIGNAL, QIcon, QDialog, QAbstractItemDelegate, QApplication, \
QSize, QStyleOptionProgressBarV2, QString, QStyle QSize, QStyleOptionProgressBarV2, QString, QStyle, QToolTip
from calibre.utils.ipc.server import Server from calibre.utils.ipc.server import Server
from calibre.utils.ipc.job import ParallelJob from calibre.utils.ipc.job import ParallelJob
@ -57,6 +57,28 @@ class JobManager(QAbstractTableModel):
else: else:
return QVariant(section+1) return QVariant(section+1)
def show_tooltip(self, arg):
widget, pos = arg
QToolTip.showText(pos, self.get_tooltip())
def get_tooltip(self):
running_jobs = [j for j in self.jobs if j.run_state == j.RUNNING]
waiting_jobs = [j for j in self.jobs if j.run_state == j.WAITING]
lines = [_('There are %d running jobs:')%len(running_jobs)]
for job in running_jobs:
desc = job.description
if not desc:
desc = _('Unknown job')
p = 100. if job.is_finished else job.percent
lines.append('%s: %.0f%% done'%(desc, p))
lines.extend(['', _('There are %d waiting jobs:')%len(waiting_jobs)])
for job in waiting_jobs:
desc = job.description
if not desc:
desc = _('Unknown job')
lines.append(desc)
return '\n'.join(['calibre', '']+ lines)
def data(self, index, role): def data(self, index, role):
try: try:
if role not in (Qt.DisplayRole, Qt.DecorationRole): if role not in (Qt.DisplayRole, Qt.DecorationRole):

View File

@ -11,7 +11,7 @@ from PyQt4.Qt import Qt, SIGNAL, QObject, QCoreApplication, QUrl, QTimer, \
QModelIndex, QPixmap, QColor, QPainter, QMenu, QIcon, \ QModelIndex, QPixmap, QColor, QPainter, QMenu, QIcon, \
QToolButton, QDialog, QDesktopServices, QFileDialog, \ QToolButton, QDialog, QDesktopServices, QFileDialog, \
QSystemTrayIcon, QApplication, QKeySequence, QAction, \ QSystemTrayIcon, QApplication, QKeySequence, QAction, \
QMessageBox, QStackedLayout QMessageBox, QStackedLayout, QHelpEvent
from PyQt4.QtSvg import QSvgRenderer from PyQt4.QtSvg import QSvgRenderer
from calibre import prints, patheq from calibre import prints, patheq
@ -89,6 +89,18 @@ class Listener(Thread):
except: except:
pass pass
class SystemTrayIcon(QSystemTrayIcon):
def __init__(self, icon, parent):
QSystemTrayIcon.__init__(self, icon, parent)
def event(self, ev):
if ev.type() == ev.ToolTip:
evh = QHelpEvent(ev)
self.emit(SIGNAL('tooltip_requested(PyQt_PyObject)'),
(self, evh.globalPos()))
return True
return QSystemTrayIcon.event(self, ev)
class Main(MainWindow, Ui_MainWindow, DeviceGUI): class Main(MainWindow, Ui_MainWindow, DeviceGUI):
'The main GUI' 'The main GUI'
@ -144,8 +156,11 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI):
self.device_connected = False self.device_connected = False
self.viewers = collections.deque() self.viewers = collections.deque()
self.content_server = None self.content_server = None
self.system_tray_icon = QSystemTrayIcon(QIcon(I('library.png')), self) self.system_tray_icon = SystemTrayIcon(QIcon(I('library.png')), self)
self.system_tray_icon.setToolTip('calibre') self.system_tray_icon.setToolTip('calibre')
self.connect(self.system_tray_icon,
SIGNAL('tooltip_requested(PyQt_PyObject)'),
self.job_manager.show_tooltip)
if not config['systray_icon']: if not config['systray_icon']:
self.system_tray_icon.hide() self.system_tray_icon.hide()
else: else: