#!usr/bin/env python3 # This file is a part of Lector, a Qt based ebook reader # Copyright (C) 2018 BasioMeusPuga # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . from PyQt5 import QtWidgets, QtCore class BookToolBar(QtWidgets.QToolBar): def __init__(self, parent=None): super(BookToolBar, self).__init__(parent) self._translate = QtCore.QCoreApplication.translate # Spacer spacer = QtWidgets.QWidget() spacer.setSizePolicy( QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) self.setMovable(False) self.setIconSize(QtCore.QSize(22, 22)) self.setFloatable(False) self.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) self.setObjectName('LibraryToolBar') image_factory = self.window().QImageFactory # Buttons self.fontButton = QtWidgets.QAction( image_factory.get_image('gtk-select-font'), self._translate('BookToolBar', 'View settings'), self) self.fullscreenButton = QtWidgets.QAction( image_factory.get_image('view-fullscreen'), self._translate('BookToolBar', 'Fullscreen (F11)'), self) self.addBookmarkButton = QtWidgets.QAction( image_factory.get_image('bookmark-new'), self._translate('BookToolBar', 'Add bookmark'), self) self.bookmarkButton = QtWidgets.QAction( image_factory.get_image('bookmarks'), self._translate('BookToolBar', 'Bookmarks (Ctrl + B)'), self) self.bookmarkButton.setObjectName('bookmarkButton') self.resetProfile = QtWidgets.QAction( image_factory.get_image('reload'), self._translate('BookToolBar', 'Reset profile'), self) # Add buttons self.addAction(self.fontButton) self.fontButton.setCheckable(True) self.fontButton.triggered.connect(self.toggle_font_settings) self.addSeparator() self.addAction(self.addBookmarkButton) self.addAction(self.bookmarkButton) self.bookmarkButton.setCheckable(True) self.addSeparator() self.addAction(self.fullscreenButton) # Font modification font_sizes = [str(i) for i in range(8, 48, 2)] font_sizes.extend(['56', '64', '72']) self.fontSizeBox = QtWidgets.QComboBox(self) self.fontSizeBox.setObjectName('fontSizeBox') self.fontSizeBox.setToolTip(self._translate('BookToolBar', 'Font size')) self.fontSizeBox.addItems(font_sizes) self.fontSizeBox.setEditable(True) self.paddingUp = QtWidgets.QAction( image_factory.get_image('format-indent-less'), self._translate('BookToolBar', 'Increase padding'), self) self.paddingUp.setObjectName('paddingUp') self.paddingDown = QtWidgets.QAction( image_factory.get_image('format-indent-more'), self._translate('BookToolBar', 'Decrease padding'), self) self.paddingDown.setObjectName('paddingDown') self.lineSpacingUp = QtWidgets.QAction( image_factory.get_image('format-line-spacing-triple'), self._translate('BookToolBar', 'Increase line spacing'), self) self.lineSpacingUp.setObjectName('lineSpacingUp') self.lineSpacingDown = QtWidgets.QAction( image_factory.get_image('format-line-spacing-double'), self._translate('BookToolBar', 'Decrease line spacing'), self) self.lineSpacingDown.setObjectName('lineSpacingDown') self.alignLeft = QtWidgets.QAction( image_factory.get_image('format-justify-left'), self._translate('BookToolBar', 'Left align text'), self) self.alignLeft.setObjectName('alignLeft') self.alignLeft.setCheckable(True) self.alignRight = QtWidgets.QAction( image_factory.get_image('format-justify-right'), self._translate('BookToolBar', 'Right align text'), self) self.alignRight.setObjectName('alignRight') self.alignRight.setCheckable(True) self.alignCenter = QtWidgets.QAction( image_factory.get_image('format-justify-center'), self._translate('BookToolBar', 'Center align text'), self) self.alignCenter.setObjectName('alignCenter') self.alignCenter.setCheckable(True) self.alignJustify = QtWidgets.QAction( image_factory.get_image('format-justify-fill'), self._translate('BookToolBar', 'Justify text'), self) self.alignJustify.setObjectName('alignJustify') self.alignJustify.setCheckable(True) self.alignButtons = QtWidgets.QActionGroup(self) self.alignButtons.setExclusive(True) self.alignButtons.addAction(self.alignLeft) self.alignButtons.addAction(self.alignRight) self.alignButtons.addAction(self.alignCenter) self.alignButtons.addAction(self.alignJustify) self.fontBox = QtWidgets.QFontComboBox() self.fontBox.setFontFilters(QtWidgets.QFontComboBox.ScalableFonts) self.fontBox.setObjectName('fontBox') self.colorBoxFG = FixedPushButton(self) self.colorBoxFG.setObjectName('fgColor') self.colorBoxFG.setToolTip('Text color') self.colorBoxBG = FixedPushButton(self) self.colorBoxBG.setToolTip(self._translate('BookToolBar', 'Background color')) self.colorBoxBG.setObjectName('bgColor') profiles = ['Profile 1', 'Profile 2', 'Profile 3'] self.profileBox = QtWidgets.QComboBox(self) self.profileBox.addItems(profiles) self.profileAction = self.addWidget(self.profileBox) self.fontSeparator1 = self.addSeparator() self.fontBoxAction = self.addWidget(self.fontBox) self.fontSizeBoxAction = self.addWidget(self.fontSizeBox) self.fontSeparator2 = self.addSeparator() self.fgColorAction = self.addWidget(self.colorBoxFG) self.bgColorAction = self.addWidget(self.colorBoxBG) self.fontSeparator3 = self.addSeparator() self.addAction(self.lineSpacingUp) self.addAction(self.lineSpacingDown) self.fontSeparator4 = self.addSeparator() self.addAction(self.paddingUp) self.addAction(self.paddingDown) self.fontSeparator4 = self.addSeparator() self.addAction(self.alignLeft) self.addAction(self.alignRight) self.addAction(self.alignCenter) self.addAction(self.alignJustify) self.fontActions = [ self.fontBoxAction, self.fontSizeBoxAction, self.fgColorAction, self.bgColorAction, self.lineSpacingUp, self.lineSpacingDown, self.paddingUp, self.paddingDown, self.alignLeft, self.alignRight, self.alignCenter, self.alignJustify, self.profileAction, self.fontSeparator1, self.fontSeparator2, self.fontSeparator3, self.fontSeparator4, self.resetProfile] for i in self.fontActions: i.setVisible(False) # Comic view modification self.zoomIn = QtWidgets.QAction( image_factory.get_image('zoom-in'), self._translate('BookToolBar', 'Zoom in'), self) self.zoomIn.setObjectName('zoomIn') self.zoomOut = QtWidgets.QAction( image_factory.get_image('zoom-out'), self._translate('BookToolBar', 'Zoom Out'), self) self.zoomOut.setObjectName('zoomOut') self.fitWidth = QtWidgets.QAction( image_factory.get_image('zoom-fit-width'), self._translate('BookToolBar', 'Fit Width'), self) self.fitWidth.setObjectName('fitWidth') self.fitWidth.setCheckable(True) self.bestFit = QtWidgets.QAction( image_factory.get_image('zoom-fit-best'), self._translate('BookToolBar', 'Best Fit'), self) self.bestFit.setObjectName('bestFit') self.bestFit.setCheckable(True) self.originalSize = QtWidgets.QAction( image_factory.get_image('zoom-original'), self._translate('BookToolBar', 'Original size'), self) self.originalSize.setObjectName('originalSize') self.originalSize.setCheckable(True) self.comicBGColor = FixedPushButton(self) self.comicBGColor.setToolTip(self._translate('BookToolBar', 'Background color')) self.comicBGColor.setObjectName('comicBGColor') self.comicSeparator1 = self.addSeparator() self.addAction(self.zoomIn) self.addAction(self.zoomOut) self.addAction(self.fitWidth) self.addAction(self.bestFit) self.addAction(self.originalSize) self.comicSeparator2 = self.addSeparator() self.comicBGColorAction = self.addWidget(self.comicBGColor) self.comicActions = [ self.comicBGColorAction, self.zoomIn, self.zoomOut, self.fitWidth, self.bestFit, self.originalSize, self.comicSeparator1, self.comicSeparator2] for i in self.comicActions: i.setVisible(False) # Other booktoolbar widgets self.searchBar = FixedLineEdit(self) self.searchBar.setPlaceholderText( self._translate('BookToolBar', 'Search...')) self.searchBar.setSizePolicy(sizePolicy) self.searchBar.setContentsMargins(10, 0, 0, 0) self.searchBar.setObjectName('searchBar') # Sorter self.tocBox = FixedComboBox(self) self.tocBox.setObjectName('sortingBox') self.tocBox.setToolTip( self._translate('BookToolBar', 'Table of Contents')) # All of these will be put after the spacer # This means that the buttons in the left side of # the toolbar have to split up and added here self.boxSpacer = self.addWidget(spacer) self.tocBoxAction = self.addWidget(self.tocBox) self.searchBarAction = self.addWidget(self.searchBar) self.bookActions = [ self.addBookmarkButton, self.bookmarkButton, self.fullscreenButton, self.tocBoxAction, self.searchBarAction] for i in self.bookActions: i.setVisible(True) self.addAction(self.resetProfile) def toggle_font_settings(self): if self.fontButton.isChecked(): self.customize_view_on() else: self.customize_view_off() def customize_view_on(self): if self.parent().tabWidget.widget( self.parent().tabWidget.currentIndex()).metadata['images_only']: # The following might seem redundant, # but it's necessary for tab switching for i in self.comicActions: i.setVisible(True) for i in self.fontActions: i.setVisible(False) else: for i in self.fontActions: i.setVisible(True) for i in self.comicActions: i.setVisible(False) for i in self.bookActions: i.setVisible(False) def customize_view_off(self): self.fontButton.setChecked(False) for i in self.fontActions: i.setVisible(False) for i in self.comicActions: i.setVisible(False) for i in self.bookActions: i.setVisible(True) class LibraryToolBar(QtWidgets.QToolBar): def __init__(self, parent=None): super(LibraryToolBar, self).__init__(parent) self._translate = QtCore.QCoreApplication.translate spacer = QtWidgets.QWidget() spacer.setSizePolicy( QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) self.setMovable(False) self.setIconSize(QtCore.QSize(22, 22)) self.setFloatable(False) self.setContextMenuPolicy(QtCore.Qt.PreventContextMenu) self.setObjectName("LibraryToolBar") image_factory = self.window().QImageFactory # Buttons self.addButton = QtWidgets.QAction( image_factory.get_image('add'), self._translate('LibraryToolBar', 'Add book'), self) self.deleteButton = QtWidgets.QAction( image_factory.get_image('remove'), self._translate('LibraryToolBar', 'Delete book'), self) self.colorButton = QtWidgets.QAction( image_factory.get_image('color-picker'), self._translate('LibraryToolBar', 'Library background color'), self) self.colorButton.setObjectName('libraryBackground') self.settingsButton = QtWidgets.QAction( image_factory.get_image('settings'), self._translate('LibraryToolBar', 'Settings'), self) self.settingsButton.setCheckable(True) self.coverViewButton = QtWidgets.QAction( image_factory.get_image('view-grid'), self._translate('LibraryToolBar', 'View as covers'), self) self.coverViewButton.setCheckable(True) self.tableViewButton = QtWidgets.QAction( image_factory.get_image('table'), self._translate('LibraryToolBar', 'View as table'), self) self.tableViewButton.setCheckable(True) self.libraryFilterButton = QtWidgets.QToolButton(self) self.libraryFilterButton.setIcon(image_factory.get_image('view-readermode')) self.libraryFilterButton.setText( self._translate('LibraryToolBar', 'Filter library')) self.libraryFilterButton.setToolTip( self._translate('LibraryToolBar', 'Filter library')) # Auto unchecks the other QToolButton in case of clicking self.viewButtons = QtWidgets.QActionGroup(self) self.viewButtons.setExclusive(True) self.viewButtons.addAction(self.coverViewButton) self.viewButtons.addAction(self.tableViewButton) # Add buttons self.addAction(self.addButton) self.addAction(self.deleteButton) self.addSeparator() self.addAction(self.coverViewButton) self.addAction(self.tableViewButton) self.addSeparator() self.addWidget(self.libraryFilterButton) self.addSeparator() self.addAction(self.colorButton) self.addAction(self.settingsButton) # Filter sizePolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) self.searchBar = FixedLineEdit(self) self.searchBar.setClearButtonEnabled(True) self.searchBar.setPlaceholderText( self._translate('LibraryToolBar', 'Search for Title, Author, Tags...')) self.searchBar.setSizePolicy(sizePolicy) self.searchBar.setContentsMargins(10, 0, 0, 0) self.searchBar.setObjectName('searchBar') # Sorter title_string = self._translate('TableProxyModel', 'Title') author_string = self._translate('TableProxyModel', 'Author') year_string = self._translate('TableProxyModel', 'Year') newest_string = self._translate('TableProxyModel', 'Newest') lastread_string = self._translate('TableProxyModel', 'Last Read') sorting_choices = [ title_string, author_string, year_string, newest_string, lastread_string] self.sortingBox = FixedComboBox(self) self.sortingBox.addItems(sorting_choices) self.sortingBox.setObjectName('sortingBox') self.sortingBox.setSizePolicy(sizePolicy) self.sortingBox.setMinimumContentsLength(10) self.sortingBox.setToolTip(self._translate('LibraryToolBar', 'Sort by')) # Add widgets self.addWidget(spacer) self.sortingBoxAction = self.addWidget(self.sortingBox) self.addWidget(self.searchBar) # Sublassing these widgets out prevents them from resizing class FixedComboBox(QtWidgets.QComboBox): def __init__(self, parent=None): super(FixedComboBox, self).__init__(parent) screen_width = QtWidgets.QDesktopWidget().screenGeometry().width() self.adjusted_size = screen_width // 4.8 def sizeHint(self): # This and the one below should adjust to screen size return QtCore.QSize(self.adjusted_size, 22) class FixedLineEdit(QtWidgets.QLineEdit): def __init__(self, parent=None): super(FixedLineEdit, self).__init__(parent) screen_width = QtWidgets.QDesktopWidget().screenGeometry().width() self.adjusted_size = screen_width // 4.8 def sizeHint(self): return QtCore.QSize(self.adjusted_size, 22) def keyReleaseEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.clear() class FixedPushButton(QtWidgets.QPushButton): def __init__(self, parent=None): super(FixedPushButton, self).__init__(parent) def sizeHint(self): return QtCore.QSize(36, 30)