This repository has been archived on 2023-11-29. You can view files and clone it, but cannot push or open issues or pull requests.
WebPicDownloader/controller/MainController.py

135 lines
4.6 KiB
Python
Raw Normal View History

2022-09-04 17:38:45 +02:00
import os
from controller.Frames import Frames
2022-09-04 17:38:45 +02:00
class MainController:
"""
2022-08-30 21:12:04 +02:00
Controller - MainController
This controller manages all the main interaction, change of windows,
dialogs, stop... It is the main controller.
2022-08-30 21:12:04 +02:00
@author Jérémi Nihart / EndMove
@link https://git.endmove.eu/EndMove/WebPicDownloader
@version 1.0.0
@since 2022-08-30
"""
# Variables
__config: dict = None
2022-08-30 13:51:50 +02:00
__view = None
__quite_event_subscribers: list = None
# Constructor
def __init__(self, config: dict) -> None:
"""
Constructor
2022-09-04 17:38:45 +02:00
* :config: -> The application configuration (a dictionary).
"""
# Setup variables
self.__config = config
self.__quite_event_subscribers = []
2022-08-30 21:12:04 +02:00
# START View methods
def set_view(self, view) -> None:
"""
2022-08-30 21:12:04 +02:00
[function for view]
2022-08-31 12:07:43 +02:00
=> Allow to define the controller view.
2022-08-30 13:51:50 +02:00
2022-09-04 17:38:45 +02:00
* :view: -> The view that this controller manage and setup it.
"""
2022-08-30 21:12:04 +02:00
self.__view = view
2022-09-04 17:38:45 +02:00
view.set_window_title(self.get_config('app_name'))
2022-08-31 12:07:43 +02:00
def on_open_folder(self) -> None:
"""
[event function for view]
=> Event launch when you ask to open the current folder.
"""
os.startfile(self.get_config('app_folder')) # Open the file explorer on working dir
def on_quite(self) -> None:
"""
[event function for view]
=> Event launch when you ask to quit the program. This event is propagated
to the subscribers, they can eventually cancel the event
"""
for callback in self.__quite_event_subscribers:
if callback():
return
self.__view.close_window() # End the program
2022-08-31 12:07:43 +02:00
def on_check_for_update(self) -> None:
"""
[event function for view]
=> Event launched when a check for available updates is requested.
"""
# TODO write the function
self.show_information_dialog(self.get_config('app_name'), "Oupss, this functionality isn't available yet!\nTry it again later.")
def on_about(self) -> None:
"""
[event function for view]
=> Event launched when a request for more information arise.
"""
self.change_frame(Frames.INFO)
2022-08-31 12:07:43 +02:00
# END View methods
2022-08-30 21:12:04 +02:00
# START Controller methods
def change_frame(self, frame: Frames) -> None:
"""
2022-08-30 21:12:04 +02:00
[function for controller]
2022-08-31 12:07:43 +02:00
=> Allows you to request a frame change in the main window.
2022-08-30 13:51:50 +02:00
2022-09-04 17:38:45 +02:00
* :frame: -> The frame we want to display on the window instead of the current frame.
"""
2022-08-30 21:12:04 +02:00
self.__view.show_frame(frame)
def get_config(self, name: str) -> str|int:
"""
[function for controller]
=> Allows controllers to access the application's configuration.
2022-09-04 17:38:45 +02:00
* :name: -> The name of the configuration parameter for which we want to access the configured value.
"""
if self.__config.get(name):
return self.__config.get(name)
else:
raise ValueError("Unable to find a configuration with this name")
2022-09-04 17:38:45 +02:00
def show_question_dialog(self, title: str='title', message: str='question?', icon: str='question') -> bool:
"""
[function for controller]
=> Ask a question to the user and block until he answers with yes or no.
* :title: -> Title of the dialogue.
* :message: -> Message of the dialogue.
* :icon: -> Icon of the dialogue
2022-09-04 17:38:45 +02:00
"""
return self.__view.show_question_dialog(title, message, icon)
def show_information_dialog(self, title: str='title', message: str='informations!', icon: str='info') -> bool:
"""
[function for controller]
=> Display a pop-up information dialog to the user.
* :title: -> Title of the dialogue.
* :message: -> Message of the dialogue.
* :icon: -> Icon of the dialogue
"""
return self.__view.show_information_dialog(title, message, icon)
2022-08-31 12:07:43 +02:00
# END Controller methods
# START Controller events
def subscribe_to_quite_event(self, callback) -> None:
2022-09-04 17:38:45 +02:00
"""
[function for controller]
=> Subscription function allowing to be warned if a request to quit occurs.
In the case where the callback function returns False the process continues
but if the callback returns True the process is aborted.
* :callback: -> Callback function that will be called when a request to exit occurs.
"""
self.__quite_event_subscribers.append(callback)
# END Controller events