diff --git a/resources/default_tweaks.py b/resources/default_tweaks.py
index bda839b28f..aaeb992151 100644
--- a/resources/default_tweaks.py
+++ b/resources/default_tweaks.py
@@ -71,3 +71,5 @@ gui_pubdate_display_format = 'MMM yyyy'
# order until the title is edited. Double-clicking on a title and hitting return
# without changing anything is sufficient to change the sort.
title_series_sorting = 'library_order'
+
+
diff --git a/resources/quick_start.epub b/resources/quick_start.epub
index d5aeec5457..589fd1d0dc 100644
Binary files a/resources/quick_start.epub and b/resources/quick_start.epub differ
diff --git a/resources/recipes/china_press.recipe b/resources/recipes/china_press.recipe
new file mode 100644
index 0000000000..9ceea1a423
--- /dev/null
+++ b/resources/recipes/china_press.recipe
@@ -0,0 +1,71 @@
+from calibre.web.feeds.news import BasicNewsRecipe
+
+class AdvancedUserRecipe1277228948(BasicNewsRecipe):
+ title = u'China Press USA'
+ oldest_article = 7
+ max_articles_per_feed = 100
+
+ __author__ = 'rty'
+ __version__ = '1.0'
+ language = 'zh_CN'
+ pubisher = 'www.chinapressusa.com'
+ description = 'Overseas Chinese Network Newspaper in the USA'
+ category = 'News in Chinese, USA'
+ remove_javascript = True
+ use_embedded_content = False
+ no_stylesheets = True
+ #encoding = 'GB2312'
+ encoding = 'UTF-8'
+ conversion_options = {'linearize_tables':True}
+ masthead_url ='http://www.chinapressusa.com/common/images/logo.gif'
+ extra_css = '''
+ @font-face { font-family: "DroidFont", serif, sans-serif; src: url(res:///system/fonts/DroidSansFallback.ttf); }\n
+ body {
+ margin-right: 8pt;
+ font-family: 'DroidFont', serif;}
+ h1 {font-family: 'DroidFont', serif, sans-serif}
+ .show {font-family: 'DroidFont', serif, sans-serif}
+ '''
+ feeds = [
+ (u'\u65b0\u95fb\u9891\u9053', u'http://news.uschinapress.com/news.xml'),
+ (u'\u534e\u4eba\u9891\u9053', u'http://chinese.uschinapress.com/chinese.xml'),
+ (u'\u8bc4\u8bba\u9891\u9053', u'http://review.uschinapress.com/review.xml'),
+ ]
+ keep_only_tags = [
+ dict(name='div', attrs={'class':'show'}),
+ ]
+ remove_tags = [
+ # dict(name='table', attrs={'class':'xle'}),
+ dict(name='div', attrs={'class':'time'}),
+ ]
+ remove_tags_after = [
+ dict(name='div', attrs={'class':'bank17'}),
+ # dict(name='a', attrs={'class':'ab12'}),
+ ]
+
+
+ def append_page(self, soup, appendtag, position):
+ pager = soup.find('div',attrs={'id':'displaypagenum'})
+ if pager:
+ nexturl = self.INDEX + pager.a['href']
+ soup2 = self.index_to_soup(nexturl)
+ texttag = soup2.find('div', attrs={'class':'show'})
+ for it in texttag.findAll(style=True):
+ del it['style']
+ newpos = len(texttag.contents)
+ self.append_page(soup2,texttag,newpos)
+ texttag.extract()
+ appendtag.insert(position,texttag)
+
+
+ def preprocess_html(self, soup):
+ mtag = '\n'
+ soup.head.insert(0,mtag)
+
+ for item in soup.findAll(style=True):
+ del item['style']
+ self.append_page(soup, soup.body, 3)
+ pager = soup.find('div',attrs={'id':'displaypagenum'})
+ if pager:
+ pager.extract()
+ return soup
diff --git a/resources/recipes/nytimes.recipe b/resources/recipes/nytimes.recipe
index 527f19839c..3e02363f68 100644
--- a/resources/recipes/nytimes.recipe
+++ b/resources/recipes/nytimes.recipe
@@ -17,7 +17,7 @@ class NYTimes(BasicNewsRecipe):
title = 'New York Times Top Stories'
__author__ = 'GRiker'
language = 'en'
- requires_version = (0, 7, 3)
+ requires_version = (0, 7, 5)
description = 'Top Stories from the New York Times'
# List of sections typically included in Top Stories. Use a keyword from the
diff --git a/resources/recipes/nytimes_sub.recipe b/resources/recipes/nytimes_sub.recipe
index f63611f6e3..f8ad12afe9 100644
--- a/resources/recipes/nytimes_sub.recipe
+++ b/resources/recipes/nytimes_sub.recipe
@@ -13,14 +13,14 @@ Story
import re, string, time
from calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe
-from calibre.ebooks.BeautifulSoup import BeautifulSoup, BeautifulStoneSoup, NavigableString, Tag
+from calibre.ebooks.BeautifulSoup import BeautifulStoneSoup, NavigableString, Tag
class NYTimes(BasicNewsRecipe):
title = 'The New York Times'
__author__ = 'GRiker'
language = 'en'
- requires_version = (0, 7, 3)
+ requires_version = (0, 7, 5)
description = 'Daily news from the New York Times (subscription version)'
allSectionKeywords = ['The Front Page', 'International','National','Obituaries','Editorials',
diff --git a/src/calibre/customize/profiles.py b/src/calibre/customize/profiles.py
index 68345ca0da..a16520410f 100644
--- a/src/calibre/customize/profiles.py
+++ b/src/calibre/customize/profiles.py
@@ -36,7 +36,7 @@ class Plugin(_Plugin):
self.fnames = dict((name, sz) for name, _, sz in self.fsizes if name)
self.fnums = dict((num, sz) for _, num, sz in self.fsizes if num)
-
+# Input profiles {{{
class InputProfile(Plugin):
author = 'Kovid Goyal'
@@ -218,6 +218,8 @@ input_profiles = [InputProfile, SonyReaderInput, SonyReader300Input,
input_profiles.sort(cmp=lambda x,y:cmp(x.name.lower(), y.name.lower()))
+# }}}
+
class OutputProfile(Plugin):
author = 'Kovid Goyal'
@@ -239,6 +241,10 @@ class OutputProfile(Plugin):
# If True output should be optimized for a touchscreen interface
touchscreen = False
+ touchscreen_news_css = ''
+ # A list of extra (beyond CSS 2.1) modules supported by the device
+ # Format is a cssutils profile dictionary (see iPad for example)
+ extra_css_modules = []
@classmethod
def tags_to_string(cls, tags):
@@ -253,18 +259,21 @@ class iPadOutput(OutputProfile):
screen_size = (768, 1024)
comic_screen_size = (768, 1024)
dpi = 132.0
- timefmt = '%A, %d %b %Y'
- cssutils_addProfile = { 'name':'webkit',
- 'props': {
- '-webkit-border-bottom-left-radius':'{length}',
- '-webkit-border-bottom-right-radius':'{length}',
- '-webkit-border-top-left-radius':'{length}',
- '-webkit-border-top-right-radius':'{length}',
- '-webkit-border-radius': r'{border-width}(\s+{border-width}){0,3}|inherit',
- },
- 'macros': {'border-width': '{length}|medium|thick|thin'}}
+ extra_css_modules = [
+ {
+ 'name':'webkit',
+ 'props': { '-webkit-border-bottom-left-radius':'{length}',
+ '-webkit-border-bottom-right-radius':'{length}',
+ '-webkit-border-top-left-radius':'{length}',
+ '-webkit-border-top-right-radius':'{length}',
+ '-webkit-border-radius': r'{border-width}(\s+{border-width}){0,3}|inherit',
+ },
+ 'macros': {'border-width': '{length}|medium|thick|thin'}
+ }
+ ]
touchscreen = True
- touchscreen_css = u'''
+ # touchscreen_news_css {{{
+ touchscreen_news_css = u'''
/* hr used in articles */
.caption_divider {
border:#ccc 1px solid;
@@ -328,6 +337,7 @@ class iPadOutput(OutputProfile):
}
'''
+ # }}}
class SonyReaderOutput(OutputProfile):
diff --git a/src/calibre/devices/android/driver.py b/src/calibre/devices/android/driver.py
index 0bbdf0f22c..49c41b4e57 100644
--- a/src/calibre/devices/android/driver.py
+++ b/src/calibre/devices/android/driver.py
@@ -45,8 +45,8 @@ class ANDROID(USBMS):
'GT-I5700', 'SAMSUNG']
WINDOWS_MAIN_MEM = ['ANDROID_PHONE', 'A855', 'A853', 'INC.NEXUS_ONE',
'__UMS_COMPOSITE', '_MB200', 'MASS_STORAGE', '_-_CARD',
- 'PROD_GT-I9000']
- WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'PROD_GT-I9000_CARD']
+ 'PR OD_GT-I9000']
+ WINDOWS_CARD_A_MEM = ['ANDROID_PHONE', 'PR OD_GT-I9000_CARD']
OSX_MAIN_MEM = 'HTC Android Phone Media'
diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py
index 3b37289dab..77f33ccf3d 100644
--- a/src/calibre/devices/apple/driver.py
+++ b/src/calibre/devices/apple/driver.py
@@ -16,7 +16,7 @@ from calibre.ebooks.BeautifulSoup import BeautifulSoup
from calibre.ebooks.metadata import MetaInformation
from calibre.ebooks.metadata.epub import set_metadata
from calibre.library.server.utils import strftime
-from calibre.utils.config import Config, ConfigProxy, config_dir
+from calibre.utils.config import config_dir
from calibre.utils.date import isoformat, now, parse_date
from calibre.utils.logging import Log
from calibre.utils.zipfile import ZipFile
@@ -34,8 +34,15 @@ if isosx:
if iswindows:
import pythoncom, win32com.client
+class DriverBase(DeviceConfig, DevicePlugin):
+ # Needed for config_widget to work
+ FORMATS = ['epub', 'pdf']
-class ITUNES(DeviceConfig, DevicePlugin):
+ @classmethod
+ def _config_base_name(cls):
+ return 'iTunes'
+
+class ITUNES(DriverBase):
'''
Calling sequences:
Initialization:
@@ -84,16 +91,6 @@ class ITUNES(DeviceConfig, DevicePlugin):
OPEN_FEEDBACK_MESSAGE = _(
'Apple device detected, launching iTunes, please wait ...')
- FORMATS = ['epub','pdf']
-
- # Configuration
- HELP_MESSAGE = _('Configure Device')
- EXTRA_CUSTOMIZATION_MESSAGE = None
- EXTRA_CUSTOMIZATION_DEFAULT = None
- MUST_READ_METADATA = False
- SAVE_TEMPLATE = '{title}'
- SUPPORTS_SUB_DIRS = False
- SUPPORTS_USE_AUTHOR_SORT = False
# Product IDs:
# 0x1292:iPhone 3G
@@ -173,7 +170,6 @@ class ITUNES(DeviceConfig, DevicePlugin):
sources = None
update_msg = None
update_needed = False
- use_series_as_category = False
# Public methods
def add_books_to_metadata(self, locations, metadata, booklists):
@@ -522,29 +518,19 @@ class ITUNES(DeviceConfig, DevicePlugin):
'''
return (None,None)
- def config_widget(self):
+ @classmethod
+ def config_widget(cls):
'''
Return a QWidget with settings for the device interface
'''
- if DEBUG:
- self.log.info("ITUNES.config_widget()")
- from calibre.gui2.device_drivers.configwidget import ConfigWidget
- cw = ConfigWidget(self.settings(), self.FORMATS, self.SUPPORTS_SUB_DIRS,
- self.MUST_READ_METADATA, self.SUPPORTS_USE_AUTHOR_SORT,
- self.EXTRA_CUSTOMIZATION_MESSAGE)
+ cw = DriverBase.config_widget()
# Turn off the Save template
cw.opt_save_template.setVisible(False)
cw.label.setVisible(False)
-
# Repurpose the checkbox
- cw.opt_read_metadata.setText("Use Series as Genre in iTunes/iBooks")
+ cw.opt_read_metadata.setText(_("Use Series as Genre in iTunes/iBooks"))
return cw
- def customization_help(self,gui=False):
- if DEBUG:
- self.log.info("ITUNES.customization_help()")
- return _('Configure Device')
-
def delete_books(self, paths, end_session=True):
'''
Delete books at paths on device.
@@ -774,46 +760,6 @@ class ITUNES(DeviceConfig, DevicePlugin):
'''
self.report_progress = report_progress
- def save_settings(self, settings_widget):
- '''
- Should save settings to disk. Takes the widget created in config_widget
- and saves all settings to disk.
- '''
- if DEBUG:
- self.log.info("ITUNES.save_settings()")
- proxy = self._configProxy()
- proxy['format_map'] = settings_widget.format_map()
- if self.SUPPORTS_SUB_DIRS:
- proxy['use_subdirs'] = settings_widget.use_subdirs()
- if not self.MUST_READ_METADATA:
- proxy['read_metadata'] = settings_widget.read_metadata()
- if self.SUPPORTS_USE_AUTHOR_SORT:
- proxy['use_author_sort'] = settings_widget.use_author_sort()
- if self.EXTRA_CUSTOMIZATION_MESSAGE:
- ec = unicode(settings_widget.opt_extra_customization.text()).strip()
- if not ec:
- ec = None
- proxy['extra_customization'] = ec
- st = unicode(settings_widget.opt_save_template.text())
- proxy['save_template'] = st
-
- # Snag the read_metadata check box contents on the way by
- self.use_series_as_category = settings_widget.read_metadata()
-
- def settings(self):
- '''
- Should return an opts object. The opts object should have one attribute
- `format_map` which is an ordered list of formats for the device.
- '''
- if DEBUG:
- self.log.info("ITUNES.settings()")
- opts = self._config().parse()
-
- # Repurpose the read_metadata check box
- self.use_series_as_category = opts.read_metadata
-
- return opts
-
def sync_booklists(self, booklists, end_session=True):
'''
Update metadata on device.
@@ -1129,27 +1075,6 @@ class ITUNES(DeviceConfig, DevicePlugin):
return db_added, lb_added
- def _config(self):
- klass = self if isinstance(self, type) else self.__class__
- c = Config('device_drivers_%s' % klass.__name__, _('settings for device drivers'))
- c.add_opt('format_map', default=self.FORMATS,
- help=_('Ordered list of formats the device will accept'))
- c.add_opt('use_subdirs', default=True,
- help=_('Place files in sub directories if the device supports them'))
- c.add_opt('read_metadata', default=True,
- help=_('Use Series as Genre in iTunes/iBooks'))
- c.add_opt('use_author_sort', default=False,
- help=_('Use author sort instead of author'))
- c.add_opt('save_template', default=self._default_save_template(),
- help=_('Template to control how books are titled in iTunes/iBooks'))
- c.add_opt('extra_customization',
- default=self.EXTRA_CUSTOMIZATION_DEFAULT,
- help=_('Extra customization'))
- return c
-
- def _configProxy(self):
- return ConfigProxy(self._config())
-
def _cover_to_thumb(self, path, metadata, db_added, lb_added, format):
'''
assumes pythoncom wrapper for db_added
@@ -1300,11 +1225,6 @@ class ITUNES(DeviceConfig, DevicePlugin):
return this_book
- def _default_save_template(self):
- from calibre.library.save_to_disk import config
- return self.SAVE_TEMPLATE if self.SAVE_TEMPLATE else \
- config().parse().send_template
-
def _delete_iTunesMetadata_plist(self,fpath):
'''
Delete the plist file from the file to force recache
@@ -1776,7 +1696,7 @@ class ITUNES(DeviceConfig, DevicePlugin):
im = im.resize((int(width),int(height)), PILImage.ANTIALIAS)
thumb = cStringIO.StringIO()
im.convert('RGB').save(thumb,'JPEG')
- thumb_data = thmb.getvalue()
+ thumb_data = thumb.getvalue()
os.remove(tmp_thumb)
thumb.close()
@@ -2510,7 +2430,7 @@ class ITUNES(DeviceConfig, DevicePlugin):
# Set genre from series if available, else first alpha tag
# Otherwise iTunes grabs the first dc:subject from the opf metadata
- if self.use_series_as_category and metadata.series:
+ if metadata.series and self.settings().read_metadata:
if DEBUG:
self.log.info(" using Series name as Genre")
if lb_added:
@@ -2581,7 +2501,7 @@ class ITUNES(DeviceConfig, DevicePlugin):
# Otherwise iBooks uses first from opf
# iTunes balks on setting EpisodeNumber, but it sticks (9.1.1.12)
- if self.use_series_as_category and metadata.series:
+ if metadata.series and self.settings().read_metadata:
if DEBUG:
self.log.info(" using Series name as Genre")
if lb_added:
diff --git a/src/calibre/devices/interface.py b/src/calibre/devices/interface.py
index da8a2cb978..c417c501f4 100644
--- a/src/calibre/devices/interface.py
+++ b/src/calibre/devices/interface.py
@@ -59,7 +59,7 @@ class DevicePlugin(Plugin):
return cls.__name__
return cls.name
-
+ # Device detection {{{
def test_bcd_windows(self, device_id, bcd):
if bcd is None or len(bcd) == 0:
return True
@@ -152,6 +152,7 @@ class DevicePlugin(Plugin):
return True, dev
return False, None
+ # }}}
def reset(self, key='-1', log_packets=False, report_progress=None,
detected_device=None) :
@@ -372,14 +373,12 @@ class DevicePlugin(Plugin):
@classmethod
def settings(cls):
'''
- Should return an opts object. The opts object should have one attribute
+ Should return an opts object. The opts object should have at least one attribute
`format_map` which is an ordered list of formats for the device.
'''
raise NotImplementedError()
-
-
class BookList(list):
'''
A list of books. Each Book object must have the fields:
diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py
index d899c8e995..55790420f2 100644
--- a/src/calibre/devices/usbms/device.py
+++ b/src/calibre/devices/usbms/device.py
@@ -78,9 +78,6 @@ class Device(DeviceConfig, DevicePlugin):
STORAGE_CARD_VOLUME_LABEL = ''
STORAGE_CARD2_VOLUME_LABEL = None
- SUPPORTS_SUB_DIRS = False
- MUST_READ_METADATA = False
- SUPPORTS_USE_AUTHOR_SORT = False
EBOOK_DIR_MAIN = ''
EBOOK_DIR_CARD_A = ''
diff --git a/src/calibre/devices/usbms/deviceconfig.py b/src/calibre/devices/usbms/deviceconfig.py
index 5edefff743..e074387175 100644
--- a/src/calibre/devices/usbms/deviceconfig.py
+++ b/src/calibre/devices/usbms/deviceconfig.py
@@ -13,6 +13,10 @@ class DeviceConfig(object):
EXTRA_CUSTOMIZATION_MESSAGE = None
EXTRA_CUSTOMIZATION_DEFAULT = None
+ SUPPORTS_SUB_DIRS = False
+ MUST_READ_METADATA = False
+ SUPPORTS_USE_AUTHOR_SORT = False
+
#: If None the default is used
SAVE_TEMPLATE = None
@@ -23,9 +27,14 @@ class DeviceConfig(object):
config().parse().send_template
@classmethod
- def _config(cls):
+ def _config_base_name(cls):
klass = cls if isinstance(cls, type) else cls.__class__
- c = Config('device_drivers_%s' % klass.__name__, _('settings for device drivers'))
+ return klass.__name__
+
+ @classmethod
+ def _config(cls):
+ name = cls._config_base_name()
+ c = Config('device_drivers_%s' % name, _('settings for device drivers'))
c.add_opt('format_map', default=cls.FORMATS,
help=_('Ordered list of formats the device will accept'))
c.add_opt('use_subdirs', default=True,
diff --git a/src/calibre/ebooks/oeb/stylizer.py b/src/calibre/ebooks/oeb/stylizer.py
index 4560c608a5..3c84252ff4 100644
--- a/src/calibre/ebooks/oeb/stylizer.py
+++ b/src/calibre/ebooks/oeb/stylizer.py
@@ -127,9 +127,8 @@ class Stylizer(object):
else:
head = []
- # Add optional cssutils parsing profile from output_profile
- if hasattr(self.opts.output_profile, 'cssutils_addProfile'):
- profile = self.opts.output_profile.cssutils_addProfile
+ # Add cssutils parsing profiles from output_profile
+ for profile in self.opts.output_profile.extra_css_modules:
cssutils.profile.addProfile(profile['name'],
profile['props'],
profile['macros'])
diff --git a/src/calibre/gui2/convert/txt_input.ui b/src/calibre/gui2/convert/txt_input.ui
index 5a9527ebc5..186783c277 100644
--- a/src/calibre/gui2/convert/txt_input.ui
+++ b/src/calibre/gui2/convert/txt_input.ui
@@ -43,6 +43,9 @@
true
+
+ true
+
-
diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py
index 33191d1773..850396bc5d 100644
--- a/src/calibre/gui2/device.py
+++ b/src/calibre/gui2/device.py
@@ -10,7 +10,7 @@ from functools import partial
from binascii import unhexlify
from PyQt4.Qt import QMenu, QAction, QActionGroup, QIcon, SIGNAL, QPixmap, \
- Qt, pyqtSignal, QColor, QPainter
+ Qt, pyqtSignal, QColor, QPainter, QDialog
from PyQt4.QtSvg import QSvgRenderer
from calibre.customize.ui import available_input_formats, available_output_formats, \
@@ -814,7 +814,8 @@ class DeviceMixin(object): # {{{
if specific:
d = ChooseFormatDialog(self, _('Choose format to send to device'),
self.device_manager.device.settings().format_map)
- d.exec_()
+ if d.exec_() != QDialog.Accepted:
+ return
if d.format():
fmt = d.format().lower()
dest, sub_dest = dest.split(':')
diff --git a/src/calibre/gui2/dialogs/choose_format.ui b/src/calibre/gui2/dialogs/choose_format.ui
index 0ae0fa8b94..50dd4b4fc1 100644
--- a/src/calibre/gui2/dialogs/choose_format.ui
+++ b/src/calibre/gui2/dialogs/choose_format.ui
@@ -39,7 +39,7 @@
Qt::Horizontal
- QDialogButtonBox::Ok
+ QDialogButtonBox::Ok|QDialogButtonBox::Cancel
diff --git a/src/calibre/gui2/search_box.py b/src/calibre/gui2/search_box.py
index 35bf7374a0..ef0c6b1455 100644
--- a/src/calibre/gui2/search_box.py
+++ b/src/calibre/gui2/search_box.py
@@ -56,7 +56,8 @@ class SearchBox2(QComboBox):
To use this class:
* Call initialize()
- * Connect to the search() and cleared() signals from this widget
+ * Connect to the search() and cleared() signals from this widget.
+ * Connect to the cleared() signal to know when the box content changes
* Call search_done() after every search is complete
* Use clear() to clear back to the help message
'''
@@ -75,6 +76,7 @@ class SearchBox2(QComboBox):
type=Qt.DirectConnection)
self.line_edit.mouse_released.connect(self.mouse_released,
type=Qt.DirectConnection)
+ self.activated.connect(self.history_selected)
self.setEditable(True)
self.help_state = False
self.as_you_type = True
@@ -139,6 +141,9 @@ class SearchBox2(QComboBox):
def key_pressed(self, event):
self.normalize_state()
+ if self._in_a_search:
+ self.emit(SIGNAL('changed()'))
+ self._in_a_search = False
if event.key() in (Qt.Key_Return, Qt.Key_Enter):
self.do_search()
self.timer = self.startTimer(self.__class__.INTERVAL)
@@ -154,6 +159,10 @@ class SearchBox2(QComboBox):
self.timer = None
self.do_search()
+ def history_selected(self, text):
+ self.emit(SIGNAL('changed()'))
+ self.do_search()
+
@property
def smart_text(self):
text = unicode(self.currentText()).strip()
@@ -345,6 +354,7 @@ class SearchBoxMixin(object):
self.search.initialize('main_search_history', colorize=True,
help_text=_('Search (For Advanced Search click the button to the left)'))
self.connect(self.search, SIGNAL('cleared()'), self.search_box_cleared)
+ self.connect(self.search, SIGNAL('changed()'), self.search_box_changed)
self.connect(self.clear_button, SIGNAL('clicked()'), self.search.clear)
QObject.connect(self.advanced_search_button, SIGNAL('clicked(bool)'),
self.do_advanced_search)
@@ -364,6 +374,9 @@ class SearchBoxMixin(object):
self.saved_search.clear_to_help()
self.set_number_of_books_shown()
+ def search_box_changed(self):
+ self.tags_view.clear()
+
def do_advanced_search(self, *args):
d = SearchDialog(self)
if d.exec_() == QDialog.Accepted:
diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py
index c32b79fb7c..33ee25c433 100644
--- a/src/calibre/gui2/widgets.py
+++ b/src/calibre/gui2/widgets.py
@@ -957,16 +957,19 @@ class LayoutButton(QToolButton):
self.splitter = splitter
splitter.state_changed.connect(self.update_state)
+ self.setCursor(Qt.PointingHandCursor)
def set_state_to_show(self, *args):
self.setChecked(False)
label =_('Show')
self.setText(label + ' ' + self.label)
+ self.setToolTip(self.text())
def set_state_to_hide(self, *args):
self.setChecked(True)
label = _('Hide')
self.setText(label + ' ' + self.label)
+ self.setToolTip(self.text())
def update_state(self, *args):
if self.splitter.is_side_index_hidden:
diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py
index 78058a95ec..b1af210011 100644
--- a/src/calibre/web/feeds/news.py
+++ b/src/calibre/web/feeds/news.py
@@ -585,8 +585,8 @@ class BasicNewsRecipe(Recipe):
self.lrf = options.lrf
self.output_profile = options.output_profile
self.touchscreen = getattr(self.output_profile, 'touchscreen', False)
- if self.touchscreen and getattr(self.output_profile, 'touchscreen_css',False):
- self.extra_css += self.output_profile.touchscreen_css
+ if self.touchscreen:
+ self.template_css += self.output_profile.touchscreen_news_css
self.output_dir = os.path.abspath(self.output_dir)
if options.test:
@@ -664,7 +664,8 @@ class BasicNewsRecipe(Recipe):
templ = self.navbar.generate(False, f, a, feed_len,
not self.has_single_feed,
url, __appname__,
- center=self.center_navbar)
+ center=self.center_navbar,
+ extra_css=self.extra_css)
elem = BeautifulSoup(templ.render(doctype='xhtml').decode('utf-8')).find('div')
body.insert(0, elem)
if self.remove_javascript:
@@ -728,8 +729,6 @@ class BasicNewsRecipe(Recipe):
timefmt = self.timefmt
if self.touchscreen:
templ = templates.TouchscreenIndexTemplate()
- if getattr(self.output_profile,'timefmt',False):
- timefmt = self.output_profile.timefmt
return templ.generate(self.title, "mastheadImage.jpg", timefmt, feeds,
extra_css=css).render(doctype='xhtml')