Add donate button to tweak book

This commit is contained in:
Kovid Goyal 2013-12-09 21:20:34 +05:30
parent 30d522527b
commit 3926d5a276
3 changed files with 43 additions and 25 deletions

View File

@ -8,13 +8,13 @@ __copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
from PyQt4.Qt import (Qt, QAction, QLabel, QMenu, QMenuBar, QObject, from PyQt4.Qt import (Qt, QAction, QMenu, QMenuBar, QObject,
QToolBar, QToolButton, QSize, QVBoxLayout, QWidget) QToolBar, QToolButton, QSize)
from calibre.constants import isosx from calibre.gui2.throbber import create_donate_widget
from calibre.gui2 import gprefs from calibre.gui2 import gprefs
class ToolBar(QToolBar): # {{{ class ToolBar(QToolBar): # {{{
def __init__(self, donate, location_manager, parent): def __init__(self, donate, location_manager, parent):
QToolBar.__init__(self, parent) QToolBar.__init__(self, parent)
@ -54,7 +54,8 @@ class ToolBar(QToolBar): # {{{
def contextMenuEvent(self, ev): def contextMenuEvent(self, ev):
ac = self.actionAt(ev.pos()) ac = self.actionAt(ev.pos())
if ac is None: return if ac is None:
return
ch = self.widgetForAction(ac) ch = self.widgetForAction(ac)
sm = getattr(ch, 'showMenu', None) sm = getattr(ch, 'showMenu', None)
if callable(sm): if callable(sm):
@ -88,15 +89,7 @@ class ToolBar(QToolBar): # {{{
bar.setup_tool_button(bar, ac, QToolButton.MenuButtonPopup) bar.setup_tool_button(bar, ac, QToolButton.MenuButtonPopup)
ac.setVisible(False) ac.setVisible(False)
elif what == 'Donate': elif what == 'Donate':
self.d_widget = QWidget() self.d_widget = create_donate_widget(self.donate_button)
self.d_widget.setLayout(QVBoxLayout())
self.d_widget.layout().addWidget(self.donate_button)
if isosx:
self.d_widget.setStyleSheet('QWidget, QToolButton {background-color: none; border: none; }')
self.d_widget.layout().setContentsMargins(0,0,0,0)
self.d_widget.setContentsMargins(0,0,0,0)
self.d_widget.filler = QLabel(u'\u00a0')
self.d_widget.layout().addWidget(self.d_widget.filler)
bar.addWidget(self.d_widget) bar.addWidget(self.d_widget)
self.showing_donate = True self.showing_donate = True
elif what in self.gui.iactions: elif what in self.gui.iactions:
@ -125,8 +118,8 @@ class ToolBar(QToolBar): # {{{
aa = iac.qaction aa = iac.qaction
w = self.widgetForAction(aa) w = self.widgetForAction(aa)
m = aa.menu() m = aa.menu()
if (( (w is not None and w.geometry().contains(pos)) or if (((w is not None and w.geometry().contains(pos)) or
(m is not None and m.isVisible() and m.geometry().contains(pos)) ) and (m is not None and m.isVisible() and m.geometry().contains(pos))) and
getattr(iac, func)(event, md)): getattr(iac, func)(event, md)):
return True return True
return False return False
@ -151,8 +144,8 @@ class ToolBar(QToolBar): # {{{
for ac in self.location_manager.available_actions: for ac in self.location_manager.available_actions:
w = self.widgetForAction(ac) w = self.widgetForAction(ac)
if w is not None: if w is not None:
if ( md.hasFormat("application/calibre+from_library") or \ if (md.hasFormat("application/calibre+from_library") or
md.hasFormat("application/calibre+from_device") ) and \ md.hasFormat("application/calibre+from_device")) and \
w.geometry().contains(event.pos()) and \ w.geometry().contains(event.pos()) and \
isinstance(w, QToolButton) and not w.isChecked(): isinstance(w, QToolButton) and not w.isChecked():
allowed = True allowed = True
@ -200,7 +193,7 @@ class ToolBar(QToolBar): # {{{
# }}} # }}}
class MenuAction(QAction): # {{{ class MenuAction(QAction): # {{{
def __init__(self, clone, parent): def __init__(self, clone, parent):
QAction.__init__(self, clone.text(), parent) QAction.__init__(self, clone.text(), parent)
@ -211,7 +204,7 @@ class MenuAction(QAction): # {{{
self.setText(self.clone.text()) self.setText(self.clone.text())
# }}} # }}}
class MenuBar(QMenuBar): # {{{ class MenuBar(QMenuBar): # {{{
def __init__(self, location_manager, parent): def __init__(self, location_manager, parent):
QMenuBar.__init__(self, parent) QMenuBar.__init__(self, parent)

View File

@ -7,8 +7,9 @@ __docformat__ = 'restructuredtext en'
from PyQt4.Qt import QToolButton, QSize, QPropertyAnimation, Qt, \ from PyQt4.Qt import QToolButton, QSize, QPropertyAnimation, Qt, \
QMetaObject QMetaObject, QLabel, QVBoxLayout, QWidget
from calibre.constants import isosx
from calibre.gui2 import config from calibre.gui2 import config
class ThrobbingButton(QToolButton): class ThrobbingButton(QToolButton):
@ -44,7 +45,8 @@ class ThrobbingButton(QToolButton):
self.update() self.update()
def start_animation(self): def start_animation(self):
if config['disable_animations']: return if config['disable_animations']:
return
if self.animation.state() != self.animation.Stopped or not self.isVisible(): if self.animation.state() != self.animation.Stopped or not self.isVisible():
return return
size = self.normal_icon_size.width() size = self.normal_icon_size.width()
@ -57,9 +59,20 @@ class ThrobbingButton(QToolButton):
self.animation.stop() self.animation.stop()
self.animation_finished() self.animation_finished()
def create_donate_widget(button):
w = QWidget()
w.setLayout(QVBoxLayout())
w.layout().addWidget(button)
if isosx:
w.setStyleSheet('QWidget, QToolButton {background-color: none; border: none; }')
w.layout().setContentsMargins(0,0,0,0)
w.setContentsMargins(0,0,0,0)
w.filler = QLabel(u'\u00a0')
w.layout().addWidget(w.filler)
return w
if __name__ == '__main__': if __name__ == '__main__':
from PyQt4.Qt import QApplication, QWidget, QHBoxLayout, QIcon from PyQt4.Qt import QApplication, QHBoxLayout, QIcon
app = QApplication([]) app = QApplication([])
w = QWidget() w = QWidget()
w.setLayout(QHBoxLayout()) w.setLayout(QHBoxLayout())

View File

@ -11,12 +11,13 @@ from functools import partial
from PyQt4.Qt import ( from PyQt4.Qt import (
QDockWidget, Qt, QLabel, QIcon, QAction, QApplication, QWidget, QEvent, QDockWidget, Qt, QLabel, QIcon, QAction, QApplication, QWidget, QEvent,
QVBoxLayout, QStackedWidget, QTabWidget, QImage, QPixmap, pyqtSignal, QVBoxLayout, QStackedWidget, QTabWidget, QImage, QPixmap, pyqtSignal,
QMenu, QHBoxLayout) QMenu, QHBoxLayout, QTimer, QUrl)
from calibre.constants import __appname__, get_version from calibre.constants import __appname__, get_version
from calibre.gui2 import elided_text from calibre.gui2 import elided_text, open_url
from calibre.gui2.keyboard import Manager as KeyboardManager from calibre.gui2.keyboard import Manager as KeyboardManager
from calibre.gui2.main_window import MainWindow from calibre.gui2.main_window import MainWindow
from calibre.gui2.throbber import ThrobbingButton, create_donate_widget
from calibre.gui2.tweak_book import current_container, tprefs, actions from calibre.gui2.tweak_book import current_container, tprefs, actions
from calibre.gui2.tweak_book.file_list import FileListWidget from calibre.gui2.tweak_book.file_list import FileListWidget
from calibre.gui2.tweak_book.job import BlockingJob from calibre.gui2.tweak_book.job import BlockingJob
@ -438,6 +439,17 @@ class Main(MainWindow):
a = create(_('Book tool bar'), 'global').addAction a = create(_('Book tool bar'), 'global').addAction
for x in ('new_file', 'open_book', 'global_undo', 'global_redo', 'save', 'create_checkpoint', 'toc', 'check_book'): for x in ('new_file', 'open_book', 'global_undo', 'global_redo', 'save', 'create_checkpoint', 'toc', 'check_book'):
a(getattr(self, 'action_' + x)) a(getattr(self, 'action_' + x))
self.donate_button = b = ThrobbingButton(self)
b.clicked.connect(lambda : open_url(QUrl('http://calibre-ebook.com/donate')))
b.setAutoRaise(True)
self.donate_widget = w = create_donate_widget(b)
if hasattr(w, 'filler'):
w.filler.setVisible(False)
b.set_normal_icon_size(self.global_bar.iconSize().width(), self.global_bar.iconSize().height())
b.setIcon(QIcon(I('donate.png')))
b.setToolTip(_('Donate to support calibre development'))
QTimer.singleShot(10, b.start_animation)
self.global_bar.addWidget(w)
a = create(_('Polish book tool bar'), 'polish').addAction a = create(_('Polish book tool bar'), 'polish').addAction
for x in ('embed_fonts', 'subset_fonts', 'smarten_punctuation'): for x in ('embed_fonts', 'subset_fonts', 'smarten_punctuation'):