mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add some hrlp text to the create vl dialog and remove the tooltips from the vl menu as they were creating rendering artefacts on my linux machine
This commit is contained in:
parent
2b0afb54eb
commit
d7d840aa52
@ -6,15 +6,18 @@ Created on 10 Jun 2010
|
|||||||
|
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from PyQt4.Qt import (Qt, QMenu, QPoint, QIcon, QDialog, QGridLayout, QLabel,
|
from PyQt4.Qt import (
|
||||||
QLineEdit, QDialogButtonBox, QEvent, QToolTip)
|
Qt, QMenu, QPoint, QIcon, QDialog, QGridLayout, QLabel, QLineEdit,
|
||||||
|
QDialogButtonBox, QSize)
|
||||||
|
|
||||||
from calibre.gui2 import error_dialog, question_dialog
|
from calibre.gui2 import error_dialog, question_dialog
|
||||||
from calibre.gui2.widgets import ComboBoxWithHelp
|
from calibre.gui2.widgets import ComboBoxWithHelp
|
||||||
from calibre.utils.icu import sort_key
|
from calibre.utils.icu import sort_key
|
||||||
from calibre.utils.pyparsing import ParseException
|
from calibre.utils.pyparsing import ParseException
|
||||||
from calibre.utils.search_query_parser import saved_searches
|
from calibre.utils.search_query_parser import saved_searches
|
||||||
|
|
||||||
class CreateVirtualLibrary(QDialog):
|
class CreateVirtualLibrary(QDialog): # {{{
|
||||||
|
|
||||||
def __init__(self, gui, existing_names):
|
def __init__(self, gui, existing_names):
|
||||||
QDialog.__init__(self, None, Qt.WindowSystemMenuHint | Qt.WindowTitleHint)
|
QDialog.__init__(self, None, Qt.WindowSystemMenuHint | Qt.WindowTitleHint)
|
||||||
|
|
||||||
@ -22,22 +25,49 @@ class CreateVirtualLibrary(QDialog):
|
|||||||
self.existing_names = existing_names
|
self.existing_names = existing_names
|
||||||
|
|
||||||
self.setWindowTitle(_('Create virtual library'))
|
self.setWindowTitle(_('Create virtual library'))
|
||||||
|
self.setWindowIcon(QIcon(I('lt.png')))
|
||||||
|
|
||||||
gl = QGridLayout()
|
gl = QGridLayout()
|
||||||
self.setLayout(gl)
|
self.setLayout(gl)
|
||||||
gl.addWidget(QLabel(_('Virtual library name')), 0, 0)
|
self.la1 = la1 = QLabel(_('Virtual library &name:'))
|
||||||
|
gl.addWidget(la1, 0, 0)
|
||||||
self.vl_name = QLineEdit()
|
self.vl_name = QLineEdit()
|
||||||
self.vl_name.setMinimumWidth(400)
|
la1.setBuddy(self.vl_name)
|
||||||
gl.addWidget(self.vl_name, 0, 1)
|
gl.addWidget(self.vl_name, 0, 1)
|
||||||
gl.addWidget(QLabel(_('Search expression')), 1, 0)
|
|
||||||
|
self.la2 = la2 = QLabel(_('&Search expression:'))
|
||||||
|
gl.addWidget(la2, 1, 0)
|
||||||
self.vl_text = QLineEdit()
|
self.vl_text = QLineEdit()
|
||||||
|
la2.setBuddy(self.vl_text)
|
||||||
gl.addWidget(self.vl_text, 1, 1)
|
gl.addWidget(self.vl_text, 1, 1)
|
||||||
self.vl_text.setText(self.build_full_search_string())
|
self.vl_text.setText(self.build_full_search_string())
|
||||||
bb = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
|
||||||
bb.accepted.connect(self.accepted)
|
|
||||||
bb.rejected.connect(self.rejected)
|
|
||||||
gl.addWidget(bb, 2, 0, 1, 0)
|
|
||||||
|
|
||||||
search_templates = [
|
self.hl = hl = QLabel(_('''
|
||||||
|
<h2>Virtual Libraries</h2>
|
||||||
|
|
||||||
|
<p>Using <i>virtual libraries</i> you can restrict calibre to only show
|
||||||
|
you books that match a search. When a virtual library is in effect, calibre
|
||||||
|
behaves as though the library contains only the matched books. The Tag Browser
|
||||||
|
display only the tags/authors/series/etc. that belong to the matched books and any searches
|
||||||
|
you do will only search within the books in the virtual library. This
|
||||||
|
is a good way to partition your large library into smaller and easier to work with subsets.</p>
|
||||||
|
|
||||||
|
<p>For example you can use a Virtual Library to only show you books with the Tag <i>"Unread"</i>
|
||||||
|
or only books by <i>"My Favorite Author"</i> or only books in a particular series.</p>
|
||||||
|
'''))
|
||||||
|
hl.setWordWrap(True)
|
||||||
|
hl.setFrameStyle(hl.StyledPanel)
|
||||||
|
gl.addWidget(hl, 0, 3, 3, 1)
|
||||||
|
|
||||||
|
bb = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
||||||
|
bb.accepted.connect(self.accept)
|
||||||
|
bb.rejected.connect(self.reject)
|
||||||
|
gl.addWidget(bb, 3, 0, 1, 0)
|
||||||
|
|
||||||
|
self.resize(self.sizeHint()+QSize(150, 25))
|
||||||
|
|
||||||
|
def build_full_search_string(self):
|
||||||
|
search_templates = (
|
||||||
'',
|
'',
|
||||||
'{cl}',
|
'{cl}',
|
||||||
'{cr}',
|
'{cr}',
|
||||||
@ -46,11 +76,10 @@ class CreateVirtualLibrary(QDialog):
|
|||||||
'(({cl}) and ({sb}))',
|
'(({cl}) and ({sb}))',
|
||||||
'(({cr}) and ({sb}))',
|
'(({cr}) and ({sb}))',
|
||||||
'(({cl}) and ({cr}) and ({sb}))'
|
'(({cl}) and ({cr}) and ({sb}))'
|
||||||
]
|
)
|
||||||
|
|
||||||
def build_full_search_string(self):
|
|
||||||
sb = self.gui.search.current_text
|
sb = self.gui.search.current_text
|
||||||
db = self.gui.library_view.model().db
|
db = self.gui.current_db
|
||||||
cr = db.data.get_search_restriction()
|
cr = db.data.get_search_restriction()
|
||||||
cl = db.data.get_base_restriction()
|
cl = db.data.get_base_restriction()
|
||||||
dex = 0
|
dex = 0
|
||||||
@ -60,10 +89,10 @@ class CreateVirtualLibrary(QDialog):
|
|||||||
dex += 2
|
dex += 2
|
||||||
if cl:
|
if cl:
|
||||||
dex += 1
|
dex += 1
|
||||||
template = self.search_templates[dex]
|
template = search_templates[dex]
|
||||||
return template.format(cl=cl, cr=cr, sb=sb)
|
return template.format(cl=cl, cr=cr, sb=sb)
|
||||||
|
|
||||||
def accepted(self):
|
def accept(self):
|
||||||
n = unicode(self.vl_name.text())
|
n = unicode(self.vl_name.text())
|
||||||
if not n:
|
if not n:
|
||||||
error_dialog(self.gui, _('No name'),
|
error_dialog(self.gui, _('No name'),
|
||||||
@ -94,42 +123,17 @@ class CreateVirtualLibrary(QDialog):
|
|||||||
det_msg=e.msg, show=True)
|
det_msg=e.msg, show=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
if not recs:
|
if not recs and not question_dialog(
|
||||||
if question_dialog(self.gui, _('Search found no books'),
|
self.gui, _('Search found no books'),
|
||||||
_('The search found no books, so the virtual library '
|
_('The search found no books, so the virtual library '
|
||||||
'will be empty. Do you really want to use that search?'),
|
'will be empty. Do you really want to use that search?'),
|
||||||
default_yes=False) == self.Rejected:
|
default_yes=False):
|
||||||
return
|
return
|
||||||
|
|
||||||
self.library_name = n
|
self.library_name = n
|
||||||
self.library_search = v
|
self.library_search = v
|
||||||
self.accept()
|
QDialog.accept(self)
|
||||||
|
# }}}
|
||||||
def rejected(self):
|
|
||||||
self.reject()
|
|
||||||
|
|
||||||
class VirtLibMenu(QMenu):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
QMenu.__init__(self)
|
|
||||||
self.show_tt_for = []
|
|
||||||
|
|
||||||
def event(self, e):
|
|
||||||
QMenu.event(self, e)
|
|
||||||
if e.type() == QEvent.ToolTip:
|
|
||||||
a = self.activeAction()
|
|
||||||
if a and a in self.show_tt_for:
|
|
||||||
tt = a.toolTip()
|
|
||||||
if tt:
|
|
||||||
QToolTip.showText(e.globalPos(), tt)
|
|
||||||
return True
|
|
||||||
|
|
||||||
def clear(self):
|
|
||||||
self.show_tt_for = []
|
|
||||||
QMenu.clear(self)
|
|
||||||
|
|
||||||
def show_tooltip_for_action(self, a):
|
|
||||||
self.show_tt_for.append(a)
|
|
||||||
|
|
||||||
class SearchRestrictionMixin(object):
|
class SearchRestrictionMixin(object):
|
||||||
|
|
||||||
@ -139,7 +143,7 @@ class SearchRestrictionMixin(object):
|
|||||||
self.checked = QIcon(I('ok.png'))
|
self.checked = QIcon(I('ok.png'))
|
||||||
self.empty = QIcon()
|
self.empty = QIcon()
|
||||||
|
|
||||||
self.virtual_library_menu = VirtLibMenu()
|
self.virtual_library_menu = QMenu()
|
||||||
|
|
||||||
self.virtual_library.clicked.connect(self.virtual_library_clicked)
|
self.virtual_library.clicked.connect(self.virtual_library_clicked)
|
||||||
|
|
||||||
@ -161,8 +165,7 @@ class SearchRestrictionMixin(object):
|
|||||||
db = self.library_view.model().db
|
db = self.library_view.model().db
|
||||||
virt_libs = db.prefs.get('virtual_libraries', {})
|
virt_libs = db.prefs.get('virtual_libraries', {})
|
||||||
cd = CreateVirtualLibrary(self, virt_libs.keys())
|
cd = CreateVirtualLibrary(self, virt_libs.keys())
|
||||||
ret = cd.exec_()
|
if cd.exec_() == cd.Accepted:
|
||||||
if ret == cd.Accepted:
|
|
||||||
self.add_virtual_library(db, cd.library_name, cd.library_search)
|
self.add_virtual_library(db, cd.library_name, cd.library_search)
|
||||||
self.apply_virtual_library(cd.library_name)
|
self.apply_virtual_library(cd.library_name)
|
||||||
|
|
||||||
@ -180,9 +183,8 @@ class SearchRestrictionMixin(object):
|
|||||||
a = m.addAction(_('Create Virtual Library'))
|
a = m.addAction(_('Create Virtual Library'))
|
||||||
a.triggered.connect(self.do_create)
|
a.triggered.connect(self.do_create)
|
||||||
a.setToolTip(_('Create a new virtual library from the results of a search'))
|
a.setToolTip(_('Create a new virtual library from the results of a search'))
|
||||||
m.show_tooltip_for_action(a)
|
|
||||||
|
|
||||||
self.rm_menu = a = VirtLibMenu()
|
self.rm_menu = a = QMenu()
|
||||||
a.setTitle(_('Remove Virtual Library'))
|
a.setTitle(_('Remove Virtual Library'))
|
||||||
a.aboutToShow.connect(self.build_virtual_library_list)
|
a.aboutToShow.connect(self.build_virtual_library_list)
|
||||||
m.addMenu(a)
|
m.addMenu(a)
|
||||||
@ -212,7 +214,6 @@ class SearchRestrictionMixin(object):
|
|||||||
a = m.addAction(self.checked if vl == current_lib else self.empty, vl)
|
a = m.addAction(self.checked if vl == current_lib else self.empty, vl)
|
||||||
a.setToolTip(virt_libs[vl])
|
a.setToolTip(virt_libs[vl])
|
||||||
a.triggered.connect(partial(self.apply_virtual_library, library=vl))
|
a.triggered.connect(partial(self.apply_virtual_library, library=vl))
|
||||||
m.show_tooltip_for_action(a)
|
|
||||||
|
|
||||||
p = QPoint(0, self.virtual_library.height())
|
p = QPoint(0, self.virtual_library.height())
|
||||||
self.virtual_library_menu.popup(self.virtual_library.mapToGlobal(p))
|
self.virtual_library_menu.popup(self.virtual_library.mapToGlobal(p))
|
||||||
@ -238,7 +239,6 @@ class SearchRestrictionMixin(object):
|
|||||||
def add_action(name, search):
|
def add_action(name, search):
|
||||||
a = m.addAction(name)
|
a = m.addAction(name)
|
||||||
a.setToolTip(search)
|
a.setToolTip(search)
|
||||||
m.show_tooltip_for_action(a)
|
|
||||||
a.triggered.connect(partial(self.remove_vl_triggered, name=name))
|
a.triggered.connect(partial(self.remove_vl_triggered, name=name))
|
||||||
|
|
||||||
for n in sorted(virt_libs.keys(), key=sort_key):
|
for n in sorted(virt_libs.keys(), key=sort_key):
|
||||||
@ -368,3 +368,14 @@ class SearchRestrictionMixin(object):
|
|||||||
self.search_count.setStyleSheet(
|
self.search_count.setStyleSheet(
|
||||||
'QLabel { background-color: transparent; }')
|
'QLabel { background-color: transparent; }')
|
||||||
self.search_count.setText(t)
|
self.search_count.setText(t)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
from calibre.gui2 import Application
|
||||||
|
from calibre.gui2.preferences import init_gui
|
||||||
|
app = Application([])
|
||||||
|
app
|
||||||
|
gui = init_gui()
|
||||||
|
d = CreateVirtualLibrary(gui, [])
|
||||||
|
d.exec_()
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user