Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions examples/generate/external/layout.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@ blocks:
x: 17.0
y: -157.0
orientation: normal
width: 120.0
height: 60.0
error:
x: 196.0
y: -149.0
orientation: normal
width: 120.0
height: 60.0
pid:
x: 369.0
y: -149.0
orientation: normal
width: 120.0
height: 60.0
plant:
x: 530.0
y: -150.0
orientation: normal
width: 120.0
height: 60.0
68 changes: 65 additions & 3 deletions pySimBlocks/gui/dialogs/settings/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@
# ******************************************************************************

from pathlib import Path
import os
from PySide6.QtWidgets import (
QWidget, QFormLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QComboBox
QWidget, QFormLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QFileDialog, QHBoxLayout
)

from pySimBlocks.gui.model.project_state import ProjectState
Expand All @@ -40,7 +41,16 @@ def __init__(self, project_state: ProjectState, project_controller: ProjectContr
layout.addRow(QLabel("<b>Project Settings</b>"))

self.dir_edit = QLineEdit(str(project_state.directory_path))
layout.addRow("Directory path:", self.dir_edit)
self.dir_browse_btn = QPushButton("...")
self.dir_browse_btn.setToolTip("Select a project directory from disk")
self.dir_browse_btn.clicked.connect(self.browse_project_directory)

dir_layout = QHBoxLayout()
dir_layout.setContentsMargins(0, 0, 0, 0)
dir_layout.addWidget(self.dir_edit)
dir_layout.addWidget(self.dir_browse_btn)

layout.addRow("Directory path:", dir_layout)

load_btn = QPushButton("Load")
load_btn.clicked.connect(self.load_project)
Expand All @@ -50,9 +60,18 @@ def __init__(self, project_state: ProjectState, project_controller: ProjectContr

ext = project_state.external or ""
self.external_edit = QLineEdit(ext)
self.external_browse_btn = QPushButton("...")
self.external_browse_btn.setToolTip("Select a Python file from disk")
self.external_browse_btn.clicked.connect(self.browse_external_file)

external_layout = QHBoxLayout()
external_layout.setContentsMargins(0, 0, 0, 0)
external_layout.addWidget(self.external_edit)
external_layout.addWidget(self.external_browse_btn)

label = QLabel("Python file:")
label.setToolTip("Relative path from project directory")
layout.addRow(label, self.external_edit)
layout.addRow(label, external_layout)



Expand All @@ -69,6 +88,49 @@ def apply(self) -> bool:
self.project_controller.update_project_param(path, ext)
return True

def browse_external_file(self):
base_dir = Path(self.dir_edit.text()).expanduser()
if not base_dir.is_dir():
QMessageBox.warning(
self,
"Invalid directory",
f"The directory does not exist:\n{base_dir}",
)
return

selected_file, _ = QFileDialog.getOpenFileName(
self,
"Select Python file",
str(base_dir),
"Python files (*.py);;All files (*)",
)

if not selected_file:
return

selected_path = Path(selected_file).resolve()
try:
relative_path = selected_path.relative_to(base_dir.resolve())
except ValueError:
relative_path = Path(os.path.relpath(str(selected_path), str(base_dir.resolve())))

self.external_edit.setText(str(relative_path))

def browse_project_directory(self):
current_dir = Path(self.dir_edit.text()).expanduser()
start_dir = current_dir if current_dir.is_dir() else Path.cwd()

selected_dir = QFileDialog.getExistingDirectory(
self,
"Select project directory",
str(start_dir),
)

if not selected_dir:
return

self.dir_edit.setText(str(Path(selected_dir).resolve()))

def load_project(self):
self.apply()
self.project_controller.load_project(ProjectLoaderYaml())
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ pySimBlocks = [
[project.optional-dependencies]
examples = [
"control",
"qpsolvers[osqp,clarabel]",
]

tests = [
Expand Down
47 changes: 0 additions & 47 deletions requirements.txt

This file was deleted.