Open previous tabs/files after restart

This commit is contained in:
Lea Laux 2020-12-22 15:48:05 +01:00 committed by KDV Admin
parent 0bc39ada3d
commit b13a1e3eb7
5 changed files with 80 additions and 3 deletions

View File

@ -102,9 +102,11 @@ class AppConfigurator:
# Save the data in the configuration dictionary.
self.save_configuration_data()
# Try to find the current configuration for opening previous files.
try:
self.configuration_dictionary["open_previous_files"]
# If the configuration does not exist, set the configuration to True and save the data.
except KeyError:
self.configuration_dictionary["open_previous_files"] = True
self.save_configuration_data()

View File

@ -7,7 +7,13 @@ from pygadmin.configurator import global_app_configurator
class FileManager:
""""
Create a class for administrating the open files in the editor tabs. This class saves the paths of the open tabs in
a yaml file.
"""
def __init__(self):
# Define a container for the open files.
self.open_files = []
# Define a path for the configuration files.
configuration_path = os.path.join(os.path.expanduser("~"), '.pygadmin')
@ -25,40 +31,71 @@ class FileManager:
# Create the file as an empty file for writing in it.
open(self.open_files_file, "a")
# If the current configuration is False, delete all current files, because a storage is not necessary.
if global_app_configurator.get_single_configuration("open_previous_files") is False:
self.delete_all_files()
self.commit_current_files_to_yaml()
def add_new_file(self, file_name):
"""
Add a new file with its name/path to the list of open files.
"""
self.open_files.append(file_name)
return True
def delete_file(self, file_name):
"""
Delete a file with its name/path.
"""
# Check for the existence of the file.
if file_name not in self.open_files:
# If the file does not exist, return False for a failure.
return False
# Remove the file name.
self.open_files.remove(file_name)
# Return True for a success.
return True
def delete_all_files(self):
"""
Delete all current open files with overwriting the current content of the open files list with an empty list.
"""
self.open_files = []
def commit_current_files_to_yaml(self):
"""
Try to save the current list in the yaml file.
"""
try:
# Try to open the file in writing mode.
with open(self.open_files_file, "w") as file_data:
# Use a safe dump, because the file can be manually edited by a user.
yaml.safe_dump(self.open_files, file_data)
# Return True for a success.
return True
# Use the exception during the writing process for an error message.
except Exception as file_error:
logging.error("The file {} cannot be opened and the open files in the editor cannot be saved with the "
"following error: {}".format(self.open_files_file, file_error), exc_info=True)
# Return False for a failure.
return False
def load_open_file_list(self):
"""
Load the content of the open files out of the yaml file. Use a try statement for a potential failure of the file
reading process.
"""
# Use a try statement in case of a broken .yaml file.
try:
# Use the read mode for getting the content of the file.

View File

@ -394,9 +394,12 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
"""
Save the current text/statement of the lexer as query editor in for further usage. The class-wide variable for
the corresponding file is used as directory with file. If this variable contains its initialized value None,
use the function for opening a file dialog.
use the function for opening a file dialog. A default parameter is used for the previous file name. In this case
the previous corresponding saved file is used. If a file name is given, the given one is used.
"""
# Check for the configuration and the previous file name: if the previous file name is None, get the name of the
# current corresponding saved file, because this one is going to be the previous one.
if previous_file_name is None and global_app_configurator.get_single_configuration("open_previous_files") is\
True:
previous_file_name = self.corresponding_saved_file
@ -416,21 +419,31 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
# Write the current text of the lexer as SQL editor in the file.
file_to_save.write(current_text)
# Parse the error for writing in the file.
except Exception as file_error:
# Define an error text.
error_text = "The file {} cannot be written with the error: {}".format(self.corresponding_saved_file,
file_error)
# Show the error to the user and save it in the log.
QMessageBox.critical(self, "File Reading Error", error_text)
logging.critical(error_text, exc_info=True)
# Redefine the corresponding saved file back to the previous one.
self.corresponding_saved_file = previous_file_name
# End the function after a failure, because the following part is not necessary.
return
# If the corresponding file name is not the previous file and the configuration for opening the previous files
# is True, the old file will be deleted as previous file and the new one added.
if self.corresponding_saved_file != previous_file_name \
and global_app_configurator.get_single_configuration("open_previous_files") is True:
# Delete the previous one.
global_file_manager.delete_file(previous_file_name)
# Add the new one.
global_file_manager.add_new_file(self.corresponding_saved_file)
# Commit/save the change.
global_file_manager.commit_current_files_to_yaml()
# Save the current text in the class-wide current editor text.
@ -480,30 +493,42 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
# Get the file name out of the tuple.
file_name = file_name_and_type[0]
# If the file name is false, the process has been aborted.
if file_name is False:
logging.info("The current file opening process was aborted by the user, so the content of this file is not "
"loaded.")
# End the function with a return.
return False
# Try to load the statement based on the file name.
return self.load_statement_with_file_name(file_name)
def load_statement_with_file_name(self, file_name):
"""
Load the content of the file with its given name and path.
"""
# Check for the success in form of an existing file and not an empty string.
if file_name != "":
# Try to open the file. This operation can fail without the correct file rights.
try:
# Open the file in reading mode.
with open(file_name, "r") as file_to_load:
# Read the whole given file and save its text.
file_text = file_to_load.read()
# Show an error to the user, if the file reading process has failed.
except Exception as file_error:
error_text = "The file {} cannot be loaded with the error: {}".format(file_name, file_error)
QMessageBox.critical(self, "File Reading Error", error_text)
logging.critical(error_text, exc_info=True)
# Return False for the error.
return False
# If the option for open the previous files is activated and if the current corresponding save file is not
# None, delete it in the file manager, because it will be replaced by a new one.
if global_app_configurator.get_single_configuration("open_previous_files") is True and \
self.corresponding_saved_file is not None:
global_file_manager.delete_file(self.corresponding_saved_file)
@ -511,6 +536,8 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
# Save the name of the file in the class variable for the corresponding file.
self.corresponding_saved_file = file_name
# If the configuration is set, save the new corresponding save file and commit the changes to the file
# manager.
if global_app_configurator.get_single_configuration("open_previous_files") is True:
global_file_manager.add_new_file(self.corresponding_saved_file)
global_file_manager.commit_current_files_to_yaml()
@ -1034,8 +1061,13 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
file_to_save.write("\n")
def closeEvent(self, a0: QtGui.QCloseEvent) -> None:
"""
Overwrite the close event: If the configuration for opening the previous is set and the corresponding save file
exists, delete it from the file manager, because it does not have to be opened after a restart of the program.
"""
if self.corresponding_saved_file is not None \
and global_app_configurator.get_single_configuration("open_previous_files"):
and global_app_configurator.get_single_configuration("open_previous_files") is True:
global_file_manager.delete_file(self.corresponding_saved_file)
global_file_manager.commit_current_files_to_yaml()

View File

@ -360,11 +360,14 @@ class MainWindow(QMainWindow):
# Check, if the current editor widget exists.
if current_editor_widget is not None:
if global_app_configurator.get_single_configuration("open_previous_files"):
# Check for the configuration settings, because getting the corresponding saved file is only necessary for
# the step for opening previous files.
if global_app_configurator.get_single_configuration("open_previous_files") is True:
# Get the current corresponding file name for the usage as previous file name, so an overwrite in the
# editor for the global file manager can be realized.
current_corresponding_file = current_editor_widget.corresponding_saved_file
# The corresponding file is unnecessary, if the configuration is not True.
else:
current_corresponding_file = None

View File

@ -52,8 +52,11 @@ class MdiArea(QMdiArea):
def init_open_files(self):
"""
Get the list of previous opened files of the editor out of the file manager and load them in new editor widgets.
This procedure will be executed, if the configuration for opening the previous files is True.
"""
# If the configuration is False, end the function with a return, so an initialization of the previous opened
# files is not executed.
if global_app_configurator.get_single_configuration("open_previous_files") is False:
return