diff --git a/src/libprs500/gui2/main.py b/src/libprs500/gui2/main.py index 9692b04bae..ac11f6c1a8 100644 --- a/src/libprs500/gui2/main.py +++ b/src/libprs500/gui2/main.py @@ -12,16 +12,20 @@ ## You should have received a copy of the GNU General Public License along ## with this program; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.Warning -from libprs500 import sanitize_file_name +from libprs500.ebooks.BeautifulSoup import BeautifulSoup +from libprs500.gui2 import qstring_to_unicode +import re +import urllib +import shutil import os, sys, textwrap, cStringIO, collections, traceback from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, \ - QSettings, QVariant, QSize, QThread + QSettings, QVariant, QSize, QThread, QTimer from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \ QToolButton, QDialog from PyQt4.QtSvg import QSvgRenderer -from libprs500 import __version__, __appname__, islinux +from libprs500 import __version__, __appname__, islinux, sanitize_file_name from libprs500.ptempfile import PersistentTemporaryFile from libprs500.ebooks.metadata.meta import get_metadata from libprs500.ebooks.lrf.web.convert_from import main as web2lrf @@ -42,6 +46,7 @@ from libprs500.gui2.dialogs.jobs import JobsDialog from libprs500.gui2.dialogs.conversion_error import ConversionErrorDialog from libprs500.gui2.dialogs.lrf_single import LRFSingleDialog from libprs500.gui2.dialogs.password import PasswordDialog +from libprs500.gui2.dialogs.config import ConfigDialog from libprs500.gui2.lrf_renderer.main import file_renderer from libprs500.gui2.lrf_renderer.main import option_parser as lrfviewerop from libprs500.library.database import DatabaseLocked @@ -86,9 +91,11 @@ class Main(MainWindow, Ui_MainWindow): self.location_view.location_changed) ####################### Vanity ######################## - self.vanity_template = self.vanity.text().arg(__version__) - self.vanity.setText(self.vanity_template.arg(' ')) - + self.vanity_template = qstring_to_unicode(self.vanity.text().arg(__version__)).replace('%2', '%(version)s').replace('%3', '%(device)s') + self.latest_version = ' ' + self.vanity.setText(self.vanity_template%dict(version=' ', device=' ')) + self.device_info = ' ' + QTimer.singleShot(1000, self.check_for_updates) ####################### Status Bar ##################### self.status_bar = StatusBar(self.jobs_dialog) self.setStatusBar(self.status_bar) @@ -143,7 +150,10 @@ class Main(MainWindow, Ui_MainWindow): self.tool_bar.widgetForAction(self.action_edit).setPopupMode(QToolButton.MenuButtonPopup) self.tool_bar.widgetForAction(self.action_sync).setPopupMode(QToolButton.MenuButtonPopup) self.tool_bar.widgetForAction(self.action_convert).setPopupMode(QToolButton.MenuButtonPopup) - self.tool_bar.setContextMenuPolicy(Qt.PreventContextMenu) + self.tool_bar.setContextMenuPolicy(Qt.PreventContextMenu) + + QObject.connect(self.config_button, SIGNAL('clicked(bool)'), self.do_config) + ####################### Library view ######################## self.library_view.set_database(self.database_path) for func, target in [ @@ -206,6 +216,8 @@ class Main(MainWindow, Ui_MainWindow): self.device_manager.device_removed() self.location_view.model().update_devices() self.action_sync.setEnabled(False) + self.vanity.setText(self.vanity_template%dict(version=self.latest_version, device=' ')) + self.device_info = ' ' if self.current_view() != self.library_view: self.status_bar.reset_info() self.location_selected('library') @@ -219,7 +231,8 @@ class Main(MainWindow, Ui_MainWindow): return info, cp, fs = result self.location_view.model().update_devices(cp, fs) - self.vanity.setText(self.vanity_template.arg('Connected '+' '.join(info[:-1]))) + self.device_info = 'Connected '+' '.join(info[:-1]) + self.vanity.setText(self.vanity_template%dict(version=self.latest_version, device=self.device_info)) func = self.device_manager.books_func() self.job_manager.run_device_job(self.metadata_downloaded, func) @@ -649,6 +662,41 @@ class Main(MainWindow, Ui_MainWindow): ############################################################################ + ############################### Do config ################################## + + def do_config(self): + if self.job_manager.has_jobs(): + d = error_dialog(self, 'Cannot configure', 'Cannot configure while there are running jobs.') + d.exec_() + return + d = ConfigDialog(self) + d.exec_() + if d.result() == d.Accepted: + if os.path.dirname(self.database_path) != d.database_location: + try: + self.db.close() + src = open(self.database_path, 'rb') + newloc = os.path.join(d.database_location, os.path.basename(self.database_path)) + dest = open(newloc, 'wb') + self.status_bar.showMessage('Copying database to '+newloc) + shutil.copy(src, dest) + src.close() + dest.close() + self.database_path = newloc + except Exception, err: + d = error_dialog(self, 'Could not move database', unicode(err)) + d.exec_() + finally: + self.status_bar.clearMessage() + self.search.clear_to_help() + self.status_bar.reset_info() + self.library_view.set_database(self.database_path) + self.library_view.sortByColumn(3, Qt.DescendingOrder) + self.library_view.resizeRowsToContents() + + + ############################################################################ + ############################################################################ def location_selected(self, location): ''' @@ -747,8 +795,19 @@ class Main(MainWindow, Ui_MainWindow): self.write_settings() e.accept() - - + def check_for_updates(self): + src = urllib.urlopen('http://pypi.python.org/pypi/libprs500').read() + soup = BeautifulSoup(src) + meta = soup.find('link', rel='meta', title='DOAP') + if meta: + src = meta['href'] + match = re.search(r'version=(\S+)', src) + if match: + version = match.group(1) + if version != __version__: + self.latest_version = '%s'%('Latest version: '+version,) + self.vanity.setText(self.vanity_template%(dict(version=self.latest_version, device=self.device_info))) + self.vanity.update() def main(args=sys.argv): from PyQt4.Qt import QApplication diff --git a/src/libprs500/gui2/main.ui b/src/libprs500/gui2/main.ui index a2f1cb761f..4a60841dda 100644 --- a/src/libprs500/gui2/main.ui +++ b/src/libprs500/gui2/main.ui @@ -105,7 +105,7 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For help visit <a href="https://libprs500.kovidgoyal.net/wiki/WikiStart#Usage"><span style=" text-decoration: underline; color:#0000ff;">libprs500.kovidgoyal.net</span></a><br /><br /><span style=" font-weight:600;">libprs500</span>: %1 by <span style=" font-weight:600;">Kovid Goyal</span> <br />%2</p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For help visit <a href="https://libprs500.kovidgoyal.net/wiki/WikiStart#Usage"><span style=" text-decoration: underline; color:#0000ff;">libprs500.kovidgoyal.net</span></a><br /><br /><span style=" font-weight:600;">libprs500</span>: %1 by <span style=" font-weight:600;">Kovid Goyal</span> %2<br />%3</p></body></html> Qt::RichText @@ -149,6 +149,12 @@ p, li { white-space: pre-wrap; } true + + + 1 + 0 + + false @@ -182,6 +188,39 @@ p, li { white-space: pre-wrap; } + + + + Qt::Vertical + + + + + + + Qt::Horizontal + + + + 20 + 20 + + + + + + + + Configuration + + + ... + + + :/images/config.svg + + + @@ -436,13 +475,13 @@ p, li { white-space: pre-wrap; } - BooksView - QTableView + SearchBox + QLineEdit
library.h
- SearchBox - QLineEdit + BooksView + QTableView
library.h
@@ -467,12 +506,12 @@ p, li { white-space: pre-wrap; } clear() - 853 - 61 + 787 + 215 - 784 - 58 + 755 + 213