Files
Lector/settingsdialog.py

157 lines
5.7 KiB
Python

#!/usr/bin/env python3
import os
import collections
from PyQt5 import QtWidgets, QtGui, QtCore
import database
from resources import settingswindow
from models import MostExcellentTableModel, TableProxyModel
from threaded import BackGroundBookSearch, BackGroundBookAddition
class SettingsUI(QtWidgets.QDialog, settingswindow.Ui_Dialog):
# TODO
# Deletion from table
# Cancel behavior
# Update database on table model update
def __init__(self, parent_window):
super(SettingsUI, self).__init__()
self.setupUi(self)
self.last_open_directory = None
self.parent_window = parent_window
self.database_path = self.parent_window.database_path
self.resize(self.parent_window.settings_dialog_settings['size'])
self.move(self.parent_window.settings_dialog_settings['position'])
self.table_model = None
self.old_table_model = None
self.table_proxy_model = None
self.paths = None
self.thread = None
self.tableFilterEdit.textChanged.connect(self.update_table_proxy_model)
self.addButton.clicked.connect(self.add_directories)
self.cancelButton.clicked.connect(self.cancel_pressed)
self.okButton.clicked.connect(self.ok_pressed)
self.generate_table()
header_sizes = self.parent_window.settings_dialog_settings['headers']
if header_sizes:
for count, i in enumerate(header_sizes):
self.tableView.horizontalHeader().resizeSection(count, int(i))
self.tableView.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Interactive)
self.tableView.horizontalHeader().setHighlightSections(False)
self.tableView.horizontalHeader().setStretchLastSection(True)
# self.tableView.horizontalHeader().setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch)
def generate_table(self):
# Fetch all directories in the database
self.paths = database.DatabaseFunctions(
self.database_path).fetch_data(
('Path', 'Name', 'Tags'),
'directories',
{'Path': ''},
'LIKE')
if not self.paths:
print('Database returned no paths for settings...')
else:
# Convert to a list because tuples, well, they're tuples
self.paths = [list(i) for i in self.paths]
table_header = ['Path', 'Name', 'Tags']
self.table_model = MostExcellentTableModel(
table_header, self.paths, None)
self.create_table_proxy_model()
def create_table_proxy_model(self):
self.table_proxy_model = TableProxyModel()
self.table_proxy_model.setSourceModel(self.table_model)
self.table_proxy_model.setSortCaseSensitivity(False)
self.table_proxy_model.sort(1, QtCore.Qt.AscendingOrder)
self.tableView.setModel(self.table_proxy_model)
self.tableView.horizontalHeader().setSortIndicator(
1, QtCore.Qt.AscendingOrder)
def update_table_proxy_model(self):
self.table_proxy_model.invalidateFilter()
self.table_proxy_model.setFilterParams(
self.tableFilterEdit.text(), [0, 1, 2])
self.table_proxy_model.setFilterFixedString(
self.tableFilterEdit.text())
def add_directories(self):
# Directories will be added recursively
# Sub directory addition is not allowed
# In case it is to be allowed eventually, files will not
# be duplicated. However, any additional tags will get
# added to file tags
add_directory = QtWidgets.QFileDialog.getExistingDirectory(
self, 'Select Directory', self.last_open_directory,
QtWidgets.QFileDialog.ShowDirsOnly)
add_directory = os.path.realpath(add_directory)
# TODO
# Account for a parent folder getting added after a subfolder
# Currently this does the inverse only
for i in self.paths:
already_present = os.path.realpath(i[0])
if already_present == add_directory or already_present in add_directory:
QtWidgets.QMessageBox.critical(
self,
'Error',
'Duplicate or sub folder: ' + already_present + ' ',
QtWidgets.QMessageBox.Ok)
return
# Set default name for the directory
directory_name = os.path.basename(add_directory).title()
data_pair = [[add_directory, directory_name, None]]
database.DatabaseFunctions(self.database_path).set_library_paths(data_pair)
self.generate_table()
def ok_pressed(self):
# Traverse directories looking for files
self.thread = BackGroundBookSearch(self, self.table_model.display_data)
self.thread.finished.connect(self.do_something)
self.thread.start()
def do_something(self):
print('Book search completed')
def cancel_pressed(self):
self.hide()
# TODO
# Implement cancel by restoring the table model to an older version
# def showEvent(self, event):
# event.accept()
def hideEvent(self, event):
self.no_more_settings()
event.accept()
def no_more_settings(self):
self.table_model = self.old_table_model
self.parent_window.libraryToolBar.settingsButton.setChecked(False)
self.resizeEvent()
def resizeEvent(self, event=None):
self.parent_window.settings_dialog_settings['size'] = self.size()
self.parent_window.settings_dialog_settings['position'] = self.pos()
table_headers = []
for i in range(2):
table_headers.append(self.tableView.horizontalHeader().sectionSize(i))
self.parent_window.settings_dialog_settings['headers'] = table_headers