mirror of https://gitlab.com/pamhyr/pamhyr2
291 lines
8.2 KiB
Python
291 lines
8.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
|
|
from PyQt5 import QtGui
|
|
from PyQt5.QtWidgets import (
|
|
QMainWindow, QApplication, QAction,
|
|
QFileDialog,
|
|
)
|
|
from PyQt5.uic import loadUi
|
|
|
|
from view.ListedSubWindow import ListedSubWindow
|
|
from view.DummyWindow import DummyWindow
|
|
from view.ConfigureWindow import ConfigureWindow
|
|
from view.NewStudyWindow import NewStudyWindow
|
|
from view.NetworkWindow import NetworkWindow
|
|
from view.AboutWindow import AboutWindow
|
|
|
|
from model.Study import Study
|
|
|
|
no_model_action = [
|
|
"action_menu_new", "action_menu_open", "action_menu_import_mage",
|
|
"action_menu_import_rubarbe", "action_toolBar_open",
|
|
]
|
|
|
|
model_action = [
|
|
"action_menu_close", "action_menu_edit", "action_menu_save",
|
|
"action_menu_save_as", "action_toolBar_close", "action_toolBar_save",
|
|
]
|
|
|
|
other_model_action = [
|
|
"action_toolBar_run_solver", "action_toolBar_kill_solver"
|
|
]
|
|
|
|
define_model_action = [
|
|
"action_toolBar_network", "action_toolBar_geometry",
|
|
"action_toolBar_maillage", "action_toolBar_run_mailleur",
|
|
"action_toolBar_cond_limites", "action_toolBar_App_Lateraux",
|
|
"action_toolBar_Deversements", "action_toolBar_Troncons",
|
|
"action_toolBar_Frottements", "action_toolBar_Ouvrages",
|
|
]
|
|
|
|
action = (
|
|
no_model_action + model_action + define_model_action
|
|
)
|
|
|
|
class ApplicationWindow(QMainWindow, ListedSubWindow):
|
|
def __init__(self, conf=None):
|
|
super(ApplicationWindow, self).__init__()
|
|
|
|
# App Configuration
|
|
self.conf = conf
|
|
|
|
# Model
|
|
self.model = None
|
|
# UI
|
|
self.ui = loadUi(
|
|
os.path.join(os.path.dirname(__file__), "ui", "MainWindow.ui"),
|
|
self
|
|
)
|
|
|
|
self.init_callback()
|
|
self.default_style()
|
|
|
|
def enable_actions(self, action:str, enable:bool):
|
|
"""Enable of disable an action componant
|
|
|
|
Args:
|
|
action: Action to enable/disable
|
|
enable: True to Enable, or False to disable
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
self.ui.findChild(QAction, action).setEnabled(enable)
|
|
|
|
def init_callback(self):
|
|
"""Connect action to callback function
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
actions = {
|
|
# Menu action
|
|
"action_menu_config": self.open_configure,
|
|
"action_menu_new": self.open_new_study,
|
|
"action_menu_edit": self.open_edit_study,
|
|
"action_menu_open": self.open_model,
|
|
"action_menu_save": self.save_study,
|
|
"action_menu_save_as": self.save_as_study,
|
|
## Help
|
|
"action_menu_about": self.open_about,
|
|
# ToolBar action
|
|
"action_toolBar_quit": self.close,
|
|
"action_toolBar_open": self.open_model,
|
|
"action_toolBar_save": self.save_study,
|
|
"action_toolBar_close": self.close_model,
|
|
"action_toolBar_run_solver": self.open_dummy,
|
|
"action_toolBar_kill_solver": self.open_dummy,
|
|
"action_toolBar_listing": self.open_dummy,
|
|
## Current actions
|
|
"action_toolBar_network": self.open_network,
|
|
"action_toolBar_geometry": lambda: self.open_dummy("Geomerty"),
|
|
"action_toolBar_maillage": lambda: self.open_dummy("Maillage"),
|
|
"action_toolBar_run_mailleur": lambda: self.open_dummy("Lancement mailleur externe"),
|
|
"action_toolBar_cond_limites": lambda: self.open_dummy("Condition Limites"),
|
|
"action_toolBar_App_Lateraux": lambda: self.open_dummy("Apport Lateraux"),
|
|
"action_toolBar_Deversements": lambda: self.open_dummy("Deversement"),
|
|
"action_toolBar_Troncons": lambda: self.open_dummy("Tronçons"),
|
|
"action_toolBar_Frottements": lambda: self.open_dummy("Frottements"),
|
|
"action_toolBar_Ouvrages": lambda: self.open_dummy("Ouvrages"),
|
|
}
|
|
|
|
for action in actions:
|
|
self.ui.findChild(QAction, action)\
|
|
.triggered.connect(actions[action])
|
|
|
|
def default_style(self):
|
|
"""Set default window style
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
self.update_enable_action()
|
|
# Maximise window
|
|
self.showMaximized()
|
|
|
|
#########
|
|
# MODEL #
|
|
#########
|
|
|
|
def get_model(self):
|
|
return self.model
|
|
|
|
def set_model(self, model):
|
|
self.model = model
|
|
self.update_enable_action()
|
|
|
|
def close_model(self):
|
|
self.model = None
|
|
self.update_enable_action()
|
|
|
|
def update_enable_action(self):
|
|
"""Update status of action componante
|
|
|
|
Update status of action componant, enable or disable in
|
|
function of model state
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
no_model = self.model is None
|
|
|
|
for action in no_model_action:
|
|
self.enable_actions(action, no_model)
|
|
|
|
for action in define_model_action + other_model_action:
|
|
self.enable_actions(action, not no_model)
|
|
|
|
for action in model_action:
|
|
self.enable_actions(action, not no_model)
|
|
|
|
############
|
|
# FEATURES #
|
|
############
|
|
|
|
def save_study(self):
|
|
"""Save current study
|
|
|
|
Save current study, if study as no associate file, open a
|
|
file dialog.
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
if self.model.filename == "":
|
|
file_name, _ = QFileDialog.getSaveFileName(
|
|
self, "Save File",
|
|
"", "Pamhyr(*.pkl)")
|
|
if file_name[-4:] == ".pkl":
|
|
self.model.filename = file_name
|
|
else:
|
|
self.model.filename = file_name + ".pkl"
|
|
|
|
self.model.save()
|
|
|
|
def save_as_study(self):
|
|
"""Save current study as new file
|
|
|
|
Save current study as new file, if study as no associate file,
|
|
open a file dialog.
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
file_name, _ = QFileDialog.getSaveFileName(
|
|
self, "Save File",
|
|
"", "Pamhyr(*.pkl)")
|
|
if file_name[-4:] == ".pkl":
|
|
self.model.filename = file_name
|
|
else:
|
|
self.model.filename = file_name + ".pkl"
|
|
|
|
self.model.save()
|
|
|
|
#############
|
|
# SUBWINDOW #
|
|
#############
|
|
|
|
def open_configure(self):
|
|
"""Open configure window
|
|
|
|
Open PamHyr configure window
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
self.config = ConfigureWindow(conf=self.conf, parent=self)
|
|
self.config.show()
|
|
|
|
def open_about(self):
|
|
"""Open about window
|
|
|
|
Open a new window with information about PamHyr
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
self.about = AboutWindow(parent=self)
|
|
self.about.show()
|
|
|
|
def open_model(self):
|
|
"""Open file dialog to select saved model
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
if self.model is None:
|
|
dialog = QFileDialog(self)
|
|
dialog.setFileMode(QFileDialog.FileMode.ExistingFile)
|
|
dialog.setDefaultSuffix(".pkl")
|
|
#dialog.setFilter(dialog.filter() | QtCore.QDir.Hidden)
|
|
dialog.setNameFilters(['PamHyr (*.pkl)'])
|
|
|
|
if dialog.exec_():
|
|
file_name = dialog.selectedFiles()
|
|
self.set_model(Study.open(file_name[0]))
|
|
print(f"[MainWindow] Open Study : {self.model.name}")
|
|
|
|
def open_new_study(self):
|
|
"""Open dialog to set new study
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
if self.model is None:
|
|
self.new_study = NewStudyWindow(parent=self)
|
|
self.new_study.show()
|
|
|
|
def open_edit_study(self):
|
|
"""Open dialog to set new study
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
if not self.model is None:
|
|
self.new_study = NewStudyWindow(study=self.model, parent=self)
|
|
self.new_study.show()
|
|
|
|
def open_network(self):
|
|
"""Open network dialog
|
|
|
|
Returns:
|
|
Nothing
|
|
"""
|
|
if not self.model is None:
|
|
self.network = NetworkWindow(parent=self)
|
|
self.network.show()
|
|
|
|
# TODO: Delete me !
|
|
###############
|
|
# DUMMY STUFF #
|
|
###############
|
|
|
|
def open_dummy(self, title="Dummy"):
|
|
self.dummy = DummyWindow(
|
|
title=title if type(title) is str else "Dummy",
|
|
parent=self
|
|
)
|
|
self.dummy.show()
|