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. # Save the data in the configuration dictionary.
self.save_configuration_data() self.save_configuration_data()
# Try to find the current configuration for opening previous files.
try: try:
self.configuration_dictionary["open_previous_files"] self.configuration_dictionary["open_previous_files"]
# If the configuration does not exist, set the configuration to True and save the data.
except KeyError: except KeyError:
self.configuration_dictionary["open_previous_files"] = True self.configuration_dictionary["open_previous_files"] = True
self.save_configuration_data() self.save_configuration_data()

View File

@ -7,7 +7,13 @@ from pygadmin.configurator import global_app_configurator
class FileManager: 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): def __init__(self):
# Define a container for the open files.
self.open_files = [] self.open_files = []
# Define a path for the configuration files. # Define a path for the configuration files.
configuration_path = os.path.join(os.path.expanduser("~"), '.pygadmin') 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. # Create the file as an empty file for writing in it.
open(self.open_files_file, "a") 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: if global_app_configurator.get_single_configuration("open_previous_files") is False:
self.delete_all_files() self.delete_all_files()
self.commit_current_files_to_yaml() self.commit_current_files_to_yaml()
def add_new_file(self, file_name): 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) self.open_files.append(file_name)
return True return True
def delete_file(self, file_name): 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 file_name not in self.open_files:
# If the file does not exist, return False for a failure.
return False return False
# Remove the file name.
self.open_files.remove(file_name) self.open_files.remove(file_name)
# Return True for a success.
return True return True
def delete_all_files(self): 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 = [] self.open_files = []
def commit_current_files_to_yaml(self): def commit_current_files_to_yaml(self):
"""
Try to save the current list in the yaml file.
"""
try: try:
# Try to open the file in writing mode.
with open(self.open_files_file, "w") as file_data: 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) yaml.safe_dump(self.open_files, file_data)
# Return True for a success.
return True return True
# Use the exception during the writing process for an error message.
except Exception as file_error: except Exception as file_error:
logging.error("The file {} cannot be opened and the open files in the editor cannot be saved with the " 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) "following error: {}".format(self.open_files_file, file_error), exc_info=True)
# Return False for a failure.
return False return False
def load_open_file_list(self): 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. # Use a try statement in case of a broken .yaml file.
try: try:
# Use the read mode for getting the content of the file. # 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 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, 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\ if previous_file_name is None and global_app_configurator.get_single_configuration("open_previous_files") is\
True: True:
previous_file_name = self.corresponding_saved_file 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. # Write the current text of the lexer as SQL editor in the file.
file_to_save.write(current_text) file_to_save.write(current_text)
# Parse the error for writing in the file.
except Exception as file_error: except Exception as file_error:
# Define an error text.
error_text = "The file {} cannot be written with the error: {}".format(self.corresponding_saved_file, error_text = "The file {} cannot be written with the error: {}".format(self.corresponding_saved_file,
file_error) file_error)
# Show the error to the user and save it in the log.
QMessageBox.critical(self, "File Reading Error", error_text) QMessageBox.critical(self, "File Reading Error", error_text)
logging.critical(error_text, exc_info=True) logging.critical(error_text, exc_info=True)
# Redefine the corresponding saved file back to the previous one.
self.corresponding_saved_file = previous_file_name self.corresponding_saved_file = previous_file_name
# End the function after a failure, because the following part is not necessary.
return 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 \ if self.corresponding_saved_file != previous_file_name \
and global_app_configurator.get_single_configuration("open_previous_files") is True: and global_app_configurator.get_single_configuration("open_previous_files") is True:
# Delete the previous one.
global_file_manager.delete_file(previous_file_name) global_file_manager.delete_file(previous_file_name)
# Add the new one.
global_file_manager.add_new_file(self.corresponding_saved_file) global_file_manager.add_new_file(self.corresponding_saved_file)
# Commit/save the change.
global_file_manager.commit_current_files_to_yaml() global_file_manager.commit_current_files_to_yaml()
# Save the current text in the class-wide current editor text. # 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. # Get the file name out of the tuple.
file_name = file_name_and_type[0] file_name = file_name_and_type[0]
# If the file name is false, the process has been aborted.
if file_name is False: 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 " logging.info("The current file opening process was aborted by the user, so the content of this file is not "
"loaded.") "loaded.")
# End the function with a return.
return False return False
# Try to load the statement based on the file name.
return self.load_statement_with_file_name(file_name) return self.load_statement_with_file_name(file_name)
def load_statement_with_file_name(self, 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. # Check for the success in form of an existing file and not an empty string.
if file_name != "": if file_name != "":
# Try to open the file. This operation can fail without the correct file rights.
try: try:
# Open the file in reading mode. # Open the file in reading mode.
with open(file_name, "r") as file_to_load: with open(file_name, "r") as file_to_load:
# Read the whole given file and save its text. # Read the whole given file and save its text.
file_text = file_to_load.read() file_text = file_to_load.read()
# Show an error to the user, if the file reading process has failed.
except Exception as file_error: except Exception as file_error:
error_text = "The file {} cannot be loaded with the error: {}".format(file_name, 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) QMessageBox.critical(self, "File Reading Error", error_text)
logging.critical(error_text, exc_info=True) logging.critical(error_text, exc_info=True)
# Return False for the error.
return False 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 \ if global_app_configurator.get_single_configuration("open_previous_files") is True and \
self.corresponding_saved_file is not None: self.corresponding_saved_file is not None:
global_file_manager.delete_file(self.corresponding_saved_file) 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. # Save the name of the file in the class variable for the corresponding file.
self.corresponding_saved_file = file_name 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: 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.add_new_file(self.corresponding_saved_file)
global_file_manager.commit_current_files_to_yaml() global_file_manager.commit_current_files_to_yaml()
@ -1034,8 +1061,13 @@ class EditorWidget(QWidget, SearchReplaceParent, metaclass=MetaEditor):
file_to_save.write("\n") file_to_save.write("\n")
def closeEvent(self, a0: QtGui.QCloseEvent) -> None: 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 \ 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.delete_file(self.corresponding_saved_file)
global_file_manager.commit_current_files_to_yaml() global_file_manager.commit_current_files_to_yaml()

View File

@ -360,11 +360,14 @@ class MainWindow(QMainWindow):
# Check, if the current editor widget exists. # Check, if the current editor widget exists.
if current_editor_widget is not None: 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 # 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. # editor for the global file manager can be realized.
current_corresponding_file = current_editor_widget.corresponding_saved_file current_corresponding_file = current_editor_widget.corresponding_saved_file
# The corresponding file is unnecessary, if the configuration is not True.
else: else:
current_corresponding_file = None current_corresponding_file = None

View File

@ -52,8 +52,11 @@ class MdiArea(QMdiArea):
def init_open_files(self): 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. 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: if global_app_configurator.get_single_configuration("open_previous_files") is False:
return return