Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Show filename when importing with PartSeg in napari #1226

Merged
merged 7 commits into from
Dec 18, 2024
Merged
Show file tree
Hide file tree
Changes from 4 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
16 changes: 14 additions & 2 deletions package/PartSeg/plugins/napari_io/loader.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
import typing
from importlib.metadata import version

Expand All @@ -9,6 +10,7 @@
from PartSegCore.analysis import ProjectTuple
from PartSegCore.io_utils import LoadBase, WrongFileTypeException
from PartSegCore.mask.io_functions import MaskProjectTuple
from PartSegCore.universal_const import format_layer_name
from PartSegImage import Image


Expand Down Expand Up @@ -54,12 +56,20 @@ def add_color(image: Image, idx: int) -> dict: # noqa: ARG001


def _image_to_layers(project_info, scale, translate):
settings = get_settings()
filename = os.path.basename(project_info.file_path)
res_layers = []
if project_info.image.name == "ROI" and project_info.image.channels == 1:
res_layers.append(
(
project_info.image.get_channel(0),
{"scale": scale, "name": project_info.image.channel_names[0], "translate": translate},
{
"scale": scale,
"name": format_layer_name(
settings.layer_naming_format, filename, project_info.image.channel_names[0]
),
"translate": translate,
},
"labels",
)
)
Expand All @@ -69,7 +79,9 @@ def _image_to_layers(project_info, scale, translate):
project_info.image.get_channel(i),
{
"scale": scale,
"name": project_info.image.channel_names[i],
"name": format_layer_name(
settings.layer_naming_format, filename, project_info.image.channel_names[i]
),
"blending": "additive",
"translate": translate,
"metadata": project_info.image.metadata,
Expand Down
22 changes: 22 additions & 0 deletions package/PartSeg/plugins/napari_widgets/_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from PartSeg.common_backend import napari_get_settings
from PartSegCore import Units
from PartSegCore.json_hooks import PartSegEncoder
from PartSegCore.universal_const import LayerNamingFormat

_SETTINGS = None

Expand All @@ -29,6 +30,14 @@
def io_units(self, value: Units):
self.set("io_units", value)

@property
def layer_naming_format(self) -> LayerNamingFormat:
return self.get("layer_naming_format", LayerNamingFormat.channel_only)

@layer_naming_format.setter
def layer_naming_format(self, value: LayerNamingFormat):
self.set("layer_naming_format", value)

Check warning on line 39 in package/PartSeg/plugins/napari_widgets/_settings.py

View check run for this annotation

Codecov / codecov/patch

package/PartSeg/plugins/napari_widgets/_settings.py#L39

Added line #L39 was not covered by tests


def get_settings() -> PartSegNapariSettings:
global _SETTINGS # noqa: PLW0603 # pylint: disable=global-statement
Expand All @@ -51,10 +60,23 @@
self.units_select.changed.connect(self.units_selection_changed)
self.settings.connect_("io_units", self.units_changed)
self.append(self.units_select)
self.layer_naming_select = create_widget(
self.settings.layer_naming_format, annotation=LayerNamingFormat, label="Format for Layer Name"
)
self.layer_naming_select.changed.connect(self.layer_naming_format_selection_changed)
self.settings.connect_("layer_naming_format", self.layer_naming_format_changed)
self.append(self.layer_naming_select)

def units_selection_changed(self, value):
self.settings.io_units = value
self.settings.dump()

def units_changed(self):
self.units_select.value = self.settings.io_units

def layer_naming_format_selection_changed(self, value):
self.settings.layer_naming_format = value
self.settings.dump()

Check warning on line 79 in package/PartSeg/plugins/napari_widgets/_settings.py

View check run for this annotation

Codecov / codecov/patch

package/PartSeg/plugins/napari_widgets/_settings.py#L78-L79

Added lines #L78 - L79 were not covered by tests

def layer_naming_format_changed(self):
self.layer_naming_select.value = self.settings.layer_naming_format

Check warning on line 82 in package/PartSeg/plugins/napari_widgets/_settings.py

View check run for this annotation

Codecov / codecov/patch

package/PartSeg/plugins/napari_widgets/_settings.py#L82

Added line #L82 was not covered by tests
23 changes: 23 additions & 0 deletions package/PartSegCore/universal_const.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,26 @@

_UNITS_LIST = ["mm", "µm", "nm", "pm"]
UNIT_SCALE = [10**3, 10**6, 10**9, 10**12]


@register_class()
class LayerNamingFormat(Enum):
channel_only = 0
filename_only = 1
filename_channel = 2
channel_filename = 3

def __str__(self):
return self.name.replace("_", " ")

Check warning on line 30 in package/PartSegCore/universal_const.py

View check run for this annotation

Codecov / codecov/patch

package/PartSegCore/universal_const.py#L30

Added line #L30 was not covered by tests


def format_layer_name(layer_format: LayerNamingFormat, file_name: str, channel_name: str) -> str:
if layer_format == LayerNamingFormat.channel_only:
return channel_name
if layer_format == LayerNamingFormat.filename_only:
return file_name
if layer_format == LayerNamingFormat.filename_channel:
return f"{file_name} | {channel_name}"
if layer_format == LayerNamingFormat.channel_filename:
return f"{channel_name} | {file_name}"
raise ValueError("Unknown format")

Check warning on line 42 in package/PartSegCore/universal_const.py

View check run for this annotation

Codecov / codecov/patch

package/PartSegCore/universal_const.py#L36-L42

Added lines #L36 - L42 were not covered by tests
Loading