Source code for cosedaUI.importers.import_h5_window
"""Dialog for importing existing HDF5 datasets and creating plain INS metadata."""
from PyQt6.QtWidgets import (
QDialog, QFormLayout, QLineEdit, QPushButton,
QFileDialog, QMessageBox, QWidget, QHBoxLayout
)
import os
from coseda.initialize import create_plain_insfile
from coseda.importers.import_h5 import move_plain_h5
[docs]
class ImportH5Window(QDialog):
"""
Dialog to import an existing HDF5:
- Creates a plain INS file alongside the HDF5.
- Moves and renames the HDF5 into the INS output folder.
"""
def __init__(self, parent=None):
super().__init__(parent)
self.main_window = parent
self.h5_paths = []
self.setWindowTitle("Import HDF5 File(s)")
layout = QFormLayout(self)
# HDF5 file selection
self.file_edit = QLineEdit(self)
self.file_edit.setReadOnly(True)
browse_btn = QPushButton("Browse...", self)
browse_btn.clicked.connect(self.browse_file)
file_container = QWidget(self)
hc = QHBoxLayout(file_container)
hc.setContentsMargins(0, 0, 0, 0)
hc.addWidget(self.file_edit)
hc.addWidget(browse_btn)
layout.addRow("HDF5 File(s):", file_container)
# Destination folder (optional)
self.dest_edit = QLineEdit(self)
dest_btn = QPushButton("Browse...", self)
dest_btn.clicked.connect(self.browse_dest)
dest_container = QWidget(self)
hc2 = QHBoxLayout(dest_container)
hc2.setContentsMargins(0, 0, 0, 0)
hc2.addWidget(self.dest_edit)
hc2.addWidget(dest_btn)
layout.addRow("Destination Folder:", dest_container)
# Import button
import_btn = QPushButton("Import", self)
import_btn.clicked.connect(self.import_h5)
layout.addRow(import_btn)
[docs]
def browse_file(self):
"""Pick one or more HDF5 files to import."""
paths, _ = QFileDialog.getOpenFileNames(
self, "Select HDF5 File(s)", "", "HDF5 Files (*.h5 *.hdf5)"
)
if paths:
self.h5_paths = paths
self.file_edit.setText("; ".join(paths))
[docs]
def browse_dest(self):
"""Pick a destination folder for the INS/HDF5 outputs."""
path = QFileDialog.getExistingDirectory(
self, "Select Destination Folder", ""
)
if path:
self.dest_edit.setText(path)
[docs]
def import_h5(self):
"""Create plain INS files and move the selected HDF5 files."""
h5_paths = list(self.h5_paths)
if not h5_paths:
QMessageBox.warning(self, "Invalid File", "Please select at least one valid HDF5 file.")
return
dest_text = self.dest_edit.text().strip()
if dest_text and not os.path.isdir(dest_text):
QMessageBox.warning(self, "Invalid Destination", "Please select a valid destination folder.")
return
imported = []
errors = []
for h5_path in h5_paths:
if not h5_path or not os.path.isfile(h5_path):
errors.append(f"{h5_path}: file does not exist")
continue
# Default each file to its own directory if no destination is specified.
dest = dest_text if dest_text else os.path.dirname(h5_path)
try:
# Create plain INS file; empty metadata and params
ini_path = create_plain_insfile(
h5_path,
dest,
acquisition_details={},
parameters={}
)
except Exception as e:
errors.append(f"{h5_path}: failed to create INI ({e})")
continue
try:
new_h5 = move_plain_h5(ini_path)
except Exception as e:
errors.append(f"{h5_path}: failed to move HDF5 file ({e})")
continue
imported.append((ini_path, new_h5))
if imported and self.main_window and hasattr(self.main_window, "add_generated_ini_paths"):
self.main_window.add_generated_ini_paths([ini_path for ini_path, _ in imported])
if not imported:
QMessageBox.critical(
self,
"Import Failed",
"No HDF5 files were imported.\n\n" + "\n".join(errors)
)
return
message = "Imported HDF5 files:\n\n"
message += "\n\n".join(
f"INI created at:\n{ini_path}\n\nHDF5 moved to:\n{new_h5}"
for ini_path, new_h5 in imported
)
if errors:
message += "\n\nSkipped files:\n" + "\n".join(errors)
QMessageBox.information(self, "Import Complete", message)
self.accept()