Add 'Show similar books' item to eight click menu'

This commit is contained in:
Kovid Goyal 2008-12-15 13:34:17 -08:00
parent cb9bd2621a
commit e2232e64c3
4 changed files with 672 additions and 2 deletions

View File

@ -0,0 +1,581 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
<svg
xmlns:ns="http://ns.adobe.com/SaveForWeb/1.0/"
xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Layer_1"
width="128"
height="128"
viewBox="0 0 128 128"
overflow="visible"
enable-background="new 0 0 128 128"
xml:space="preserve"
sodipodi:version="0.32"
inkscape:version="0.45.1"
sodipodi:docname="edit-copy.svg"
sodipodi:docbase="/home/david/sandbox"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:export-filename="/home/david/sandbox/edit-copy.png"
inkscape:export-xdpi="22.5"
inkscape:export-ydpi="22.5"><defs
id="defs105"><linearGradient
id="linearGradient3291"><stop
style="stop-color:black;stop-opacity:1"
offset="0"
id="stop3293" /><stop
style="stop-color:black;stop-opacity:0"
offset="1"
id="stop3295" /></linearGradient><linearGradient
y2="0"
x2="28"
y1="57.5"
x1="28"
gradientUnits="userSpaceOnUse"
id="linearGradient18668">
<stop
id="stop18670"
style="stop-color:#fffccf;stop-opacity:1;"
offset="0" />
<stop
id="stop18672"
style="stop-color:white;stop-opacity:0;"
offset="1" />
</linearGradient><linearGradient
y2="0"
x2="28"
y1="57.5"
x1="28"
gradientUnits="userSpaceOnUse"
id="linearGradient15967">
<stop
id="stop15969"
style="stop-color:white;stop-opacity:1;"
offset="0" />
<stop
id="stop15971"
style="stop-color:white;stop-opacity:0;"
offset="1" />
</linearGradient><linearGradient
id="XMLID_2_"
gradientUnits="userSpaceOnUse"
x1="28"
y1="57.5"
x2="28"
y2="0">
<stop
offset="0"
style="stop-color:#FFEA00"
id="stop12" />
<stop
offset="1"
style="stop-color:#FFCC00"
id="stop14" />
</linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_9_"
id="linearGradient2391"
gradientUnits="userSpaceOnUse"
x1="94.3438"
y1="102.3447"
x2="86.5356"
y2="94.5366" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_10_"
id="linearGradient2393"
gradientUnits="userSpaceOnUse"
x1="95"
y1="103"
x2="86.5865"
y2="94.5865" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_11_"
id="linearGradient2395"
gradientUnits="userSpaceOnUse"
x1="95"
y1="103"
x2="87.293"
y2="95.293" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_12_"
id="linearGradient2397"
gradientUnits="userSpaceOnUse"
x1="96"
y1="104"
x2="88.0002"
y2="96.0002" /><radialGradient
inkscape:collect="always"
xlink:href="#XMLID_7_"
id="radialGradient2465"
gradientUnits="userSpaceOnUse"
cx="102"
cy="112.3047"
r="139.5585" /><radialGradient
inkscape:collect="always"
xlink:href="#XMLID_8_"
id="radialGradient2467"
gradientUnits="userSpaceOnUse"
cx="102"
cy="112.3047"
r="139.55859" />
<foreignObject
requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
x="0"
y="0"
width="1"
height="1"
id="foreignObject7">
<i:pgfRef
xlink:href="#adobe_illustrator_pgf">
</i:pgfRef>
</foreignObject>
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_2_"
id="linearGradient12378"
gradientUnits="userSpaceOnUse"
x1="28"
y1="57.5"
x2="28"
y2="0" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2309"
id="linearGradient14180"
gradientUnits="userSpaceOnUse"
x1="-74.820707"
y1="100.82378"
x2="-18.121965"
y2="100.82378" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2309"
id="linearGradient14189"
gradientUnits="userSpaceOnUse"
x1="-74.820707"
y1="100.82378"
x2="-18.121965"
y2="100.82378" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient15967"
id="linearGradient15973"
gradientUnits="userSpaceOnUse"
x1="27.719746"
y1="7.881104"
x2="27.719746"
y2="30.441185"
gradientTransform="translate(1.470416e-5,0)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2309"
id="linearGradient15977"
gradientUnits="userSpaceOnUse"
x1="-74.820707"
y1="100.82378"
x2="-18.121965"
y2="100.82378" /><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient15967"
id="radialGradient15986"
cx="26.954102"
cy="31.045055"
fx="26.954102"
fy="31.045055"
r="8.968153"
gradientTransform="matrix(0.754978,-2.959381e-2,0,0.905772,7.650275,10.87807)"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_2_"
id="linearGradient18657"
gradientUnits="userSpaceOnUse"
x1="28"
y1="57.5"
x2="28"
y2="0" />
<linearGradient
id="linearGradient18649"
gradientUnits="userSpaceOnUse"
x1="28"
y1="57.5"
x2="28"
y2="0">
<stop
offset="0"
style="stop-color:#FFEA00"
id="stop18651" />
<stop
offset="1"
style="stop-color:#FFCC00"
id="stop18653" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient18668"
id="linearGradient18674"
gradientUnits="userSpaceOnUse"
x1="-39.53125"
y1="78"
x2="-39.53125"
y2="51.1875" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient18668"
id="linearGradient18746"
gradientUnits="userSpaceOnUse"
x1="-39.53125"
y1="78"
x2="-39.53125"
y2="51.1875" /><radialGradient
inkscape:collect="always"
xlink:href="#XMLID_8_"
id="radialGradient2311"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.856383,0,0,0.8415585,11.191492,18.14026)"
cx="99.080742"
cy="109.33402"
r="139.55859"
fx="99.080742"
fy="109.33402" /><radialGradient
inkscape:collect="always"
xlink:href="#XMLID_7_"
id="radialGradient2314"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8749999,0,0,0.8571428,10.000003,17.142857)"
cx="102"
cy="112.3047"
r="139.5585" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_12_"
id="linearGradient2339"
gradientUnits="userSpaceOnUse"
x1="96"
y1="104"
x2="86.571632"
y2="94.104362"
gradientTransform="matrix(0.8749999,0,0,0.8571428,10.000003,17.142857)" /><filter
inkscape:collect="always"
id="filter6241"><feGaussianBlur
inkscape:collect="always"
stdDeviation="1.2065414"
id="feGaussianBlur6243" /></filter><radialGradient
inkscape:collect="always"
xlink:href="#XMLID_7_"
id="radialGradient6272"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8749999,0,0,0.8571428,10.000003,17.142857)"
cx="102"
cy="112.3047"
r="139.5585" /><radialGradient
inkscape:collect="always"
xlink:href="#XMLID_8_"
id="radialGradient6274"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.856383,0,0,0.8415585,11.191492,18.14026)"
cx="99.080742"
cy="109.33402"
fx="99.080742"
fy="109.33402"
r="139.55859" /><linearGradient
inkscape:collect="always"
xlink:href="#XMLID_12_"
id="linearGradient6276"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8749999,0,0,0.8571428,10.000003,17.142857)"
x1="96"
y1="104"
x2="86.571632"
y2="94.104362" /><filter
inkscape:collect="always"
id="filter3217"><feGaussianBlur
inkscape:collect="always"
stdDeviation="0.89955545"
id="feGaussianBlur3219" /></filter></defs><sodipodi:namedview
inkscape:window-height="670"
inkscape:window-width="1022"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
inkscape:zoom="4"
inkscape:cx="92.02737"
inkscape:cy="54.798944"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:current-layer="g6245"
showgrid="true"
gridspacingx="4px"
gridspacingy="4px"
gridempspacing="0"
inkscape:grid-points="false"
inkscape:grid-bbox="true"
inkscape:object-points="true" />
<metadata
id="metadata3">
<ns:sfw>
<ns:slices>
<ns:slice
y="0"
x="0"
height="128"
width="128"
sliceID="1316743234" />
</ns:slices>
<ns:sliceSourceBounds
y="0"
x="0"
height="128"
width="128"
bottomLeftOrigin="true" />
<ns:optimizationSettings>
<ns:targetSettings
targetSettingsID="0"
fileFormat="PNG24Format">
<ns:PNG24Format
transparency="true"
filtered="false"
matteColor="#FFFFFF"
noMatteColor="false"
interlaced="false">
</ns:PNG24Format>
</ns:targetSettings>
<ns:targetSettings
targetSettingsID="1696735251"
fileFormat="PNG24Format">
<ns:PNG24Format
transparency="true"
filtered="false"
matteColor="#FFFFFF"
noMatteColor="false"
interlaced="false">
</ns:PNG24Format>
</ns:targetSettings>
</ns:optimizationSettings>
</ns:sfw>
<rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata>
<radialGradient
id="XMLID_7_"
cx="102"
cy="112.3047"
r="139.5585"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#00537D"
id="stop16" />
<stop
offset="0.0151"
style="stop-color:#186389"
id="stop18" />
<stop
offset="0.0558"
style="stop-color:#558CA8"
id="stop20" />
<stop
offset="0.0964"
style="stop-color:#89AFC3"
id="stop22" />
<stop
offset="0.1357"
style="stop-color:#B3CCD8"
id="stop24" />
<stop
offset="0.1737"
style="stop-color:#D4E2E9"
id="stop26" />
<stop
offset="0.2099"
style="stop-color:#ECF2F5"
id="stop28" />
<stop
offset="0.2435"
style="stop-color:#FAFCFD"
id="stop30" />
<stop
offset="0.2722"
style="stop-color:#FFFFFF"
id="stop32" />
</radialGradient>
<radialGradient
id="XMLID_8_"
cx="102"
cy="112.3047"
r="139.55859"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#7a7d80;stop-opacity:1;"
id="stop37" />
<stop
offset="0.12617962"
style="stop-color:#c2c2c2;stop-opacity:1;"
id="stop47" />
<stop
offset="0.23250513"
style="stop-color:#FAFAFA"
id="stop49" />
<stop
offset="0.2722"
style="stop-color:#FFFFFF"
id="stop51" />
<stop
offset="0.5313"
style="stop-color:#FAFAFA"
id="stop53" />
<stop
offset="0.8449"
style="stop-color:#EBECEC"
id="stop55" />
<stop
offset="1"
style="stop-color:#E1E2E3"
id="stop57" />
</radialGradient>
<linearGradient
id="XMLID_9_"
gradientUnits="userSpaceOnUse"
x1="94.3438"
y1="102.3447"
x2="86.5356"
y2="94.5366">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop62" />
<stop
offset="1"
style="stop-color:#555753"
id="stop64" />
</linearGradient>
<linearGradient
id="XMLID_10_"
gradientUnits="userSpaceOnUse"
x1="95"
y1="103"
x2="86.5865"
y2="94.5865">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop69" />
<stop
offset="1"
style="stop-color:#555753"
id="stop71" />
</linearGradient>
<linearGradient
id="XMLID_11_"
gradientUnits="userSpaceOnUse"
x1="95"
y1="103"
x2="87.293"
y2="95.293">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop76" />
<stop
offset="1"
style="stop-color:#393B38"
id="stop78" />
</linearGradient>
<linearGradient
id="XMLID_12_"
gradientUnits="userSpaceOnUse"
x1="96"
y1="104"
x2="88.0002"
y2="96.0002">
<stop
offset="0"
style="stop-color:#888A85"
id="stop83" />
<stop
offset="0.0072"
style="stop-color:#8C8E89"
id="stop85" />
<stop
offset="0.0673"
style="stop-color:#ABACA9"
id="stop87" />
<stop
offset="0.1347"
style="stop-color:#C5C6C4"
id="stop89" />
<stop
offset="0.2115"
style="stop-color:#DBDBDA"
id="stop91" />
<stop
offset="0.3012"
style="stop-color:#EBEBEB"
id="stop93" />
<stop
offset="0.4122"
style="stop-color:#F7F7F6"
id="stop95" />
<stop
offset="0.5679"
style="stop-color:#FDFDFD"
id="stop97" />
<stop
offset="1"
style="stop-color:#FFFFFF"
id="stop99" />
</linearGradient>
<g
id="g6245"><g
id="g6263"
transform="translate(12,0)"
style="opacity:1"><path
sodipodi:nodetypes="cccccc"
id="path2350"
d="M 23,25 L 23,121 L 76.525498,121 C 76.989247,121 107,91.601715 107,91.147428 L 107,25 L 23,25 z "
style="opacity:0.6;fill:#000000;fill-opacity:1;filter:url(#filter3217)"
transform="matrix(1.047619,0,0,1.0416667,-2.0952381,-4.041666)" /><path
style="fill:url(#radialGradient6272)"
d="M 24.000002,24 L 24.000002,120 L 77.5255,120 C 77.989249,120 108,90.601715 108,90.147428 L 108,24 L 24.000002,24 z "
id="path34"
sodipodi:nodetypes="cccccc" /><path
style="fill:url(#radialGradient6274);fill-opacity:1"
d="M 26.606384,25.714285 C 26.134518,25.714285 25.750001,26.092145 25.750001,26.555844 L 25.750001,117.44415 C 25.750001,117.9087 26.134518,118.28572 26.606384,118.28572 L 77.280277,118.28572 C 77.505506,118.28572 77.726453,118.19652 77.885739,118.03914 L 105.99908,90.412457 C 106.15921,90.255085 106.25,90.038805 106.25,89.817475 L 106.25,26.555844 C 106.25,26.092145 105.86634,25.714285 105.39361,25.714285 L 26.606384,25.714285 z "
id="path59" /><path
d="M 76.5255,120 C 76.5255,120 88.18749,110.99999 92.99999,106.28571 C 97.81249,101.57142 107,90.147428 107,90.147428 C 107,90.147428 99,96 83,96 C 83,112 76.5255,120 76.5255,120 z "
id="path101"
style="opacity:0.5;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter6241)"
sodipodi:nodetypes="csccc" /><path
sodipodi:nodetypes="csccc"
style="fill:url(#linearGradient6276)"
id="path6233"
d="M 77.5255,120 C 77.5255,120 89.18749,110.99999 93.99999,106.28571 C 98.81249,101.57142 108,90.147428 108,90.147428 C 108,90.147428 100,96 84,96 C 84,112 77.5255,120 77.5255,120 z " /></g><use
x="0"
y="0"
xlink:href="#g6263"
id="use6270"
width="128"
height="128"
transform="translate(-28,-16)" /></g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -575,7 +575,7 @@ class BooksView(TableView):
self.setItemDelegateForColumn(col, self.rating_delegate) self.setItemDelegateForColumn(col, self.rating_delegate)
def set_context_menu(self, edit_metadata, send_to_device, convert, view, def set_context_menu(self, edit_metadata, send_to_device, convert, view,
save, open_folder, book_details): save, open_folder, book_details, similar_menu=None):
self.setContextMenuPolicy(Qt.DefaultContextMenu) self.setContextMenuPolicy(Qt.DefaultContextMenu)
self.context_menu = QMenu(self) self.context_menu = QMenu(self)
if edit_metadata is not None: if edit_metadata is not None:
@ -590,6 +590,8 @@ class BooksView(TableView):
self.context_menu.addAction(open_folder) self.context_menu.addAction(open_folder)
if book_details is not None: if book_details is not None:
self.context_menu.addAction(book_details) self.context_menu.addAction(book_details)
if similar_menu is not None:
self.context_menu.addMenu(similar_menu)
def contextMenuEvent(self, event): def contextMenuEvent(self, event):
self.context_menu.popup(event.globalPos()) self.context_menu.popup(event.globalPos())

View File

@ -234,10 +234,33 @@ class Main(MainWindow, Ui_MainWindow):
QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), self.do_advanced_search) QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'), self.do_advanced_search)
####################### Library view ######################## ####################### Library view ########################
similar_menu = QMenu(_('Similar books...'))
similar_menu.addAction(self.action_books_by_same_author)
similar_menu.addAction(self.action_books_in_this_series)
similar_menu.addAction(self.action_books_with_the_same_tags)
similar_menu.addAction(self.action_books_by_this_publisher)
self.action_books_by_same_author.setShortcut(Qt.ALT + Qt.Key_A)
self.action_books_in_this_series.setShortcut(Qt.ALT + Qt.Key_S)
self.action_books_by_this_publisher.setShortcut(Qt.ALT + Qt.Key_P)
self.action_books_with_the_same_tags.setShortcut(Qt.ALT+Qt.Key_T)
self.addAction(self.action_books_by_same_author)
self.addAction(self.action_books_by_this_publisher)
self.addAction(self.action_books_in_this_series)
self.addAction(self.action_books_with_the_same_tags)
self.similar_menu = similar_menu
self.connect(self.action_books_by_same_author, SIGNAL('triggered()'),
lambda : self.show_similar_books('author'))
self.connect(self.action_books_in_this_series, SIGNAL('triggered()'),
lambda : self.show_similar_books('series'))
self.connect(self.action_books_with_the_same_tags, SIGNAL('triggered()'),
lambda : self.show_similar_books('tag'))
self.connect(self.action_books_by_this_publisher, SIGNAL('triggered()'),
lambda : self.show_similar_books('publisher'))
self.library_view.set_context_menu(self.action_edit, self.action_sync, self.library_view.set_context_menu(self.action_edit, self.action_sync,
self.action_convert, self.action_view, self.action_convert, self.action_view,
self.action_save, self.action_open_containing_folder, self.action_save, self.action_open_containing_folder,
self.action_show_book_details) self.action_show_book_details,
similar_menu=similar_menu)
self.memory_view.set_context_menu(None, None, None, self.action_view, self.action_save, None, None) self.memory_view.set_context_menu(None, None, None, self.action_view, self.action_save, None, None)
self.card_view.set_context_menu(None, None, None, self.action_view, self.action_save, None, None) self.card_view.set_context_menu(None, None, None, self.action_view, self.action_save, None, None)
QObject.connect(self.library_view, SIGNAL('files_dropped(PyQt_PyObject)'), QObject.connect(self.library_view, SIGNAL('files_dropped(PyQt_PyObject)'),
@ -341,6 +364,34 @@ class Main(MainWindow, Ui_MainWindow):
error_dialog(self, _('Failed to start content server'), error_dialog(self, _('Failed to start content server'),
unicode(self.content_server.exception)).exec_() unicode(self.content_server.exception)).exec_()
def show_similar_books(self, type):
search, join = [], ' '
idx = self.library_view.currentIndex()
if not idx.isValid():
return
row = idx.row()
if type == 'series':
series = idx.model().db.series(row)
if series:
search = ['series:'+series]
elif type == 'publisher':
publisher = idx.model().db.publisher(row)
if publisher:
search = ['publisher:'+publisher]
elif type == 'tag':
tags = idx.model().db.tags(row)
if tags:
search = ['tag:'+t for t in tags.split(',')]
elif type == 'author':
authors = idx.model().db.authors(row)
if authors:
search = ['author:'+a.strip().replace('|', ',') for a in authors.split(',')]
join = ' or '
if search:
self.search.set_search_string(join.join(search))
def toggle_cover_flow(self, show): def toggle_cover_flow(self, show):
if show: if show:
self.library_view.setCurrentIndex(self.library_view.currentIndex()) self.library_view.setCurrentIndex(self.library_view.currentIndex())

View File

@ -581,6 +581,42 @@
<string>Show book details</string> <string>Show book details</string>
</property> </property>
</action> </action>
<action name="action_books_by_same_author" >
<property name="icon" >
<iconset resource="images.qrc" >
<normaloff>:/images/user_profile.svg</normaloff>:/images/user_profile.svg</iconset>
</property>
<property name="text" >
<string>Books by same author</string>
</property>
</action>
<action name="action_books_in_this_series" >
<property name="icon" >
<iconset resource="images.qrc" >
<normaloff>:/images/books_in_series.svg</normaloff>:/images/books_in_series.svg</iconset>
</property>
<property name="text" >
<string>Books in this series</string>
</property>
</action>
<action name="action_books_by_this_publisher" >
<property name="icon" >
<iconset resource="images.qrc" >
<normaloff>:/images/publisher.png</normaloff>:/images/publisher.png</iconset>
</property>
<property name="text" >
<string>Books by this publisher</string>
</property>
</action>
<action name="action_books_with_the_same_tags" >
<property name="icon" >
<iconset resource="images.qrc" >
<normaloff>:/images/tags.svg</normaloff>:/images/tags.svg</iconset>
</property>
<property name="text" >
<string>Books with the same tags</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>