157 lines
5.7 KiB
Python
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
|