Skip to content

Commit 9595426

Browse files
Reuse folder model and view from stage 3.
1 parent fa913c7 commit 9595426

File tree

4 files changed

+64
-53
lines changed

4 files changed

+64
-53
lines changed
Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,34 @@
1-
# General imports
2-
import os
1+
import glob
2+
from os.path import expanduser, split
33

44
import pandas as pd
5-
import numpy as np
65

7-
# ETS imports
8-
from traits.api import Directory, HasStrictTraits, Instance
6+
from traits.api import (
7+
Directory, HasStrictTraits, Instance, List, observe,
8+
)
99

10-
# Local imports
11-
from .image_file import ImageFile, SUPPORTED_FORMATS
10+
from pycasa.model.image_file import ImageFile
11+
12+
SUPPORTED_FORMATS = [".png", ".jpg", ".jpeg", ".PNG", ".JPG", ".JPEG"]
1213

1314

1415
class ImageFolder(HasStrictTraits):
15-
""" Model to hold an image folder.
16+
""" Model for a folder of images.
1617
"""
17-
path = Directory
18-
19-
data = Instance(pd.DataFrame)
20-
21-
def __init__(self, **traits):
22-
# Don't forget this!
23-
super(ImageFolder, self).__init__(**traits)
24-
if not os.path.isdir(self.path):
25-
msg = f"Unable to create an ImageFolder from {self.path} since" \
26-
f" it is not a valid directory."
27-
raise ValueError(msg)
28-
29-
self.data = self.to_dataframe()
30-
31-
def to_dataframe(self):
32-
if not self.path:
33-
return pd.DataFrame({"filename": [], "Num. faces": []})
34-
35-
data = []
36-
for filename in os.listdir(self.path):
37-
file_ext = os.path.splitext(filename)[1].lower()
38-
if file_ext in SUPPORTED_FORMATS:
39-
filepath = os.path.join(self.path, filename)
40-
img_file = ImageFile(filepath=filepath)
41-
file_data = {"filename": filename, "Num. faces": np.nan}
42-
try:
43-
file_data.update(img_file.metadata)
44-
except Exception:
45-
pass
46-
data.append(file_data)
47-
48-
return pd.DataFrame(data)
18+
directory = Directory(expanduser("~"))
19+
20+
images = List(Instance(ImageFile))
21+
22+
@observe("directory")
23+
def _get_images(self, event):
24+
self.images = [
25+
ImageFile(filepath=file)
26+
for fmt in SUPPORTED_FORMATS
27+
for file in glob.glob(f"{self.directory}/*{fmt}")
28+
]
29+
30+
def create_metadata_df(self):
31+
return pd.DataFrame(
32+
[img.metadata for img in self.images],
33+
index=[split(img.filepath)[1] for img in self.images]
34+
)

stage5.1_fuller_application/pycasa/ui/image_folder_editor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def create(self, parent):
3030
# -------------------------------------------------------------------------
3131

3232
def _get_name(self):
33-
return self.obj.path[:25]
33+
return self.obj.directory[:25]
3434

3535
def _get_tooltip(self):
36-
return self.obj.path
36+
return self.obj.directory
Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,45 @@
1-
# General imports
2-
3-
# ETS imports
4-
from traits.api import Instance
1+
from traits.api import cached_property, Instance, Property
52
from traitsui.api import Item, ModelView, View
63
from traitsui.ui_editors.data_frame_editor import DataFrameEditor
7-
# Local imports
8-
from ..model.image_folder import ImageFolder
4+
5+
from pycasa.model.image_folder import ImageFolder
6+
7+
DISPLAYED_COLUMNS = [
8+
'ApertureValue', 'ExifVersion', 'Model', 'Make', 'LensModel', 'DateTime',
9+
'ShutterSpeedValue', 'XResolution', 'YResolution'
10+
]
911

1012

1113
class ImageFolderView(ModelView):
12-
""" ModelView for an image folder object.
14+
""" ModelView for a folder of images.
1315
"""
1416
model = Instance(ImageFolder)
1517

18+
metadata_df = Property(depends_on="model.images.items")
19+
1620
view = View(
17-
Item("model.path", style="readonly", show_label=False),
18-
Item("model.data", editor=DataFrameEditor(), style="readonly",
19-
show_label=False)
21+
Item('model.directory', style="readonly", show_label=False),
22+
Item(
23+
'metadata_df',
24+
editor=DataFrameEditor(columns=DISPLAYED_COLUMNS),
25+
show_label=False,
26+
width=1200,
27+
),
28+
resizable=True
2029
)
30+
31+
@cached_property
32+
def _get_metadata_df(self):
33+
return self.model.create_metadata_df()
34+
35+
36+
if __name__ == '__main__':
37+
from os.path import dirname, join
38+
import ets_tutorial
39+
40+
TUTORIAL_DIR = dirname(ets_tutorial.__file__)
41+
SAMPLE_IMG_DIR = join(TUTORIAL_DIR, "..", "sample_images")
42+
43+
image_file = ImageFolder(directory=SAMPLE_IMG_DIR)
44+
view = ImageFolderView(model=image_file)
45+
view.configure_traits()

stage5.1_fuller_application/pycasa/ui/tasks/pycasa_task.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def open_in_central_pane(self, filepath):
5252
obj = ImageFile(filepath=filepath)
5353
self.central_pane.edit(obj, factory=ImageFileEditor)
5454
elif file_ext == "":
55-
obj = ImageFolder(path=filepath)
55+
obj = ImageFolder(directory=filepath)
5656
self.central_pane.edit(obj, factory=ImageFolderEditor)
5757
else:
5858
print("Unsupported file format: {}".format(file_ext))

0 commit comments

Comments
 (0)