@@ -551,8 +551,8 @@ def add_annotations_from_items(
551551 """Add object annotations (annotation plot items).
552552
553553 Args:
554- items (list) : annotation plot items
555- refresh_plot (bool | None) : refresh plot. Defaults to True.
554+ items: annotation plot items
555+ refresh_plot: refresh plot. Defaults to True.
556556 """
557557 for obj in self .objview .get_sel_objects (include_groups = True ):
558558 obj .add_annotations_from_items (items )
@@ -594,8 +594,7 @@ def get_newparam_from_current(
594594 """Get new object parameters from the current object.
595595
596596 Args:
597- newparam (guidata.dataset.DataSet): new object parameters.
598- If None, create a new one.
597+ newparam: new object parameters. If None, create a new one.
599598
600599 Returns:
601600 New object parameters
@@ -612,10 +611,10 @@ def new_object(
612611 """Create a new object (signal/image).
613612
614613 Args:
615- newparam (guidata.dataset.DataSet) : new object parameters
616- addparam (guidata.dataset.DataSet) : additional parameters
617- edit (bool) : Open a dialog box to edit parameters (default: True)
618- add_to_panel (bool) : Add object to panel (default: True)
614+ newparam: new object parameters
615+ addparam: additional parameters
616+ edit: Open a dialog box to edit parameters (default: True)
617+ add_to_panel: Add object to panel (default: True)
619618
620619 Returns:
621620 New object
@@ -627,62 +626,38 @@ def set_current_object_title(self, title: str) -> None:
627626 obj .title = title
628627 self .objview .update_item (obj .uuid )
629628
630- def open_object (
631- self , filename : str
632- ) -> SignalObj | ImageObj | list [SignalObj | ImageObj ]:
633- """Open object from file (signal/image), add it to DataLab and return it.
629+ def __load_from_file (self , filename : str ) -> list [SignalObj ] | list [ImageObj ]:
630+ """Open objects from file (signal/image), add them to DataLab and return them.
634631
635632 Args:
636- filename (str) : file name
633+ filename: file name
637634
638635 Returns:
639636 New object or list of new objects
640637 """
641- obj_or_objlist = self .IO_REGISTRY .read (filename )
642- objs = obj_or_objlist if isinstance (obj_or_objlist , list ) else [obj_or_objlist ]
638+ objs = self .IO_REGISTRY .read (filename )
643639 for obj in objs :
644640 obj .metadata ["source" ] = filename
645641 self .add_object (obj , set_current = obj is objs [- 1 ])
646642 self .selection_changed ()
647- if len (objs ) == 1 :
648- return objs [0 ]
649643 return objs
650644
651- def save_object (self , obj , filename : str | None = None ) -> None :
652- """Save object to file (signal/image)"""
653- if filename is None :
654- basedir = Conf .main .base_dir .get ()
655- filters = self .IO_REGISTRY .get_filters (IOAction .SAVE )
656- with save_restore_stds ():
657- filename , _filt = getsavefilename (self , _ ("Save as" ), basedir , filters )
658- if filename :
659- with qt_try_loadsave_file (self .parent (), filename , "save" ):
660- Conf .main .base_dir .set (filename )
661- self .IO_REGISTRY .write (filename , obj )
662-
663- def handle_dropped_files (self , filenames : list [str ] | None = None ) -> None :
664- """Handle dropped files
645+ def __save_to_file (self , obj : SignalObj | ImageObj , filename : str ) -> None :
646+ """Save object to file (signal/image).
665647
666648 Args:
667- filenames (list(str)): File names
668-
669- Returns:
670- None
649+ obj: object
650+ filename: file name
671651 """
672- h5_fnames = [fname for fname in filenames if fname .endswith (".h5" )]
673- other_fnames = sorted (list (set (filenames ) - set (h5_fnames )))
674- if h5_fnames :
675- self .mainwindow .open_h5_files (h5_fnames , import_all = True )
676- if other_fnames :
677- self .open_objects (other_fnames )
652+ self .IO_REGISTRY .write (filename , obj )
678653
679- def open_objects (
654+ def load_from_files (
680655 self , filenames : list [str ] | None = None
681656 ) -> list [SignalObj | ImageObj ]:
682657 """Open objects from file (signals/images), add them to DataLab and return them.
683658
684659 Args:
685- filenames (list(str)) : File names
660+ filenames: File names
686661
687662 Returns:
688663 list of new objects
@@ -698,25 +673,50 @@ def open_objects(
698673 for filename in filenames :
699674 with qt_try_loadsave_file (self .parent (), filename , "load" ):
700675 Conf .main .base_dir .set (filename )
701- objs . append ( self .open_object (filename ) )
676+ objs += self .__load_from_file (filename )
702677 return objs
703678
704- def save_objects (self , filenames : list [str ] | None = None ) -> None :
705- """Save selected objects to file (signal/image).
679+ def save_to_files (self , obj , filenames : list [str ] | str | None = None ) -> None :
680+ """Save selected objects to files (signal/image).
706681
707682 Args:
708- filenames (list(str)): File names
709-
710- Returns:
711- None
683+ filenames: File names
712684 """
713685 objs = self .objview .get_sel_objects (include_groups = True )
714686 if filenames is None : # pragma: no cover
715687 filenames = [None ] * len (objs )
716- assert len (filenames ) == len (objs )
688+ assert len (filenames ) == len (
689+ objs
690+ ), "Number of filenames must match number of objects"
717691 for index , obj in enumerate (objs ):
718692 filename = filenames [index ]
719- self .save_object (obj , filename )
693+ if filename is None :
694+ basedir = Conf .main .base_dir .get ()
695+ filters = self .IO_REGISTRY .get_filters (IOAction .SAVE )
696+ with save_restore_stds ():
697+ filename , _filt = getsavefilename (
698+ self , _ ("Save as" ), basedir , filters
699+ )
700+ if filename :
701+ with qt_try_loadsave_file (self .parent (), filename , "save" ):
702+ Conf .main .base_dir .set (filename )
703+ self .__save_to_file (obj , filename )
704+
705+ def handle_dropped_files (self , filenames : list [str ] | None = None ) -> None :
706+ """Handle dropped files
707+
708+ Args:
709+ filenames: File names
710+
711+ Returns:
712+ None
713+ """
714+ h5_fnames = [fname for fname in filenames if fname .endswith (".h5" )]
715+ other_fnames = sorted (list (set (filenames ) - set (h5_fnames )))
716+ if h5_fnames :
717+ self .mainwindow .open_h5_files (h5_fnames , import_all = True )
718+ if other_fnames :
719+ self .load_from_files (other_fnames )
720720
721721 def exec_import_wizard (self ) -> None :
722722 """Execute import wizard"""
@@ -737,10 +737,7 @@ def import_metadata_from_file(self, filename: str | None = None) -> None:
737737 """Import metadata from file (JSON).
738738
739739 Args:
740- filename (str): File name
741-
742- Returns:
743- None
740+ filename: File name
744741 """
745742 if filename is None : # pragma: no cover
746743 basedir = Conf .main .base_dir .get ()
@@ -759,10 +756,7 @@ def export_metadata_from_file(self, filename: str | None = None) -> None:
759756 """Export metadata to file (JSON).
760757
761758 Args:
762- filename (str): File name
763-
764- Returns:
765- None
759+ filename: File name
766760 """
767761 obj = self .objview .get_sel_objects (include_groups = True )[0 ]
768762 if filename is None : # pragma: no cover
@@ -782,7 +776,7 @@ def selection_changed(self, update_items: bool = False) -> None:
782776 object view.
783777
784778 Args:
785- update_items (bool) : Update plot items (default: False)
779+ update_items: Update plot items (default: False)
786780 """
787781 selected_objects = self .objview .get_sel_objects (include_groups = True )
788782 selected_groups = self .objview .get_sel_groups ()
@@ -804,7 +798,7 @@ def open_separate_view(self, oids: list[str] | None = None) -> PlotDialog | None
804798 Open separate view for visualizing selected objects
805799
806800 Args:
807- oids (list(str)) : Object IDs
801+ oids: Object IDs
808802
809803 Returns:
810804 QDialog instance
@@ -874,13 +868,13 @@ def create_new_dialog(
874868 """Create new pop-up signal/image plot dialog.
875869
876870 Args:
877- oids (list(str)) : Object IDs
878- edit (bool) : Edit mode
879- toolbar (bool) : Show toolbar
880- title (str) : Dialog title
881- tools (list(GuiTool)) : list of tools to add to the toolbar
882- name (str) : Dialog name
883- options (dict) : Plot options
871+ oids: Object IDs
872+ edit: Edit mode
873+ toolbar: Show toolbar
874+ title: Dialog title
875+ tools: list of tools to add to the toolbar
876+ name: Dialog name
877+ options: Plot options
884878
885879 Returns:
886880 QDialog instance
@@ -939,11 +933,11 @@ def create_new_dialog_for_selection(
939933 """Create new pop-up dialog for the currently selected signal/image.
940934
941935 Args:
942- title (str) : Dialog title
943- name (str) : Dialog name
944- options (dict) : Plot options
945- toolbar (bool) : Show toolbar
946- tools (list(GuiTool)) : list of tools to add to the toolbar
936+ title: Dialog title
937+ name: Dialog name
938+ options: Plot options
939+ toolbar: Show toolbar
940+ tools: list of tools to add to the toolbar
947941
948942 Returns:
949943 QDialog instance, selected object
@@ -1141,8 +1135,8 @@ def add_label_with_title(self, title: str | None = None) -> None:
11411135 """Add a label with object title on the associated plot
11421136
11431137 Args:
1144- title (str | None) : Label title. Defaults to None.
1145- If None, the title is the object title.
1138+ title: Label title. Defaults to None.
1139+ If None, the title is the object title.
11461140 """
11471141 objs = self .objview .get_sel_objects (include_groups = True )
11481142 for obj in objs :
0 commit comments