Skip to content

Commit 7ad83e7

Browse files
committed
Add a model and model-view for image folder
1 parent a027e2a commit 7ad83e7

3 files changed

Lines changed: 104 additions & 0 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import glob
2+
from os.path import expanduser, split
3+
4+
import pandas as pd
5+
6+
from traits.api import (
7+
Directory, HasStrictTraits, Instance, List, observe,
8+
)
9+
10+
from pycasa.model.image_file import ImageFile
11+
12+
SUPPORTED_FORMATS = [".png", ".jpg", ".jpeg", ".PNG", ".JPG", ".JPEG"]
13+
14+
15+
class ImageFolder(HasStrictTraits):
16+
""" Model for a folder of images.
17+
"""
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+
)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from traits.api import Instance, Property
2+
from traitsui.api import Item, ModelView, View
3+
from traitsui.ui_editors.data_frame_editor import DataFrameEditor
4+
5+
from pycasa.model.image_folder import ImageFolder
6+
7+
8+
class ImageFolderView(ModelView):
9+
""" ModelView for a folder of images.
10+
"""
11+
model = Instance(ImageFolder)
12+
13+
metadata_df = Property(depends_on="model.images.items")
14+
15+
view = View(
16+
Item('model.directory', style="readonly", show_label=False),
17+
Item(
18+
'metadata_df',
19+
editor=DataFrameEditor(
20+
columns=[
21+
'ApertureValue',
22+
'ExifVersion',
23+
'Model',
24+
'Make',
25+
'LensModel',
26+
'DateTime',
27+
'ShutterSpeedValue',
28+
'XResolution',
29+
'YResolution'
30+
]
31+
),
32+
show_label=False
33+
),
34+
resizable=True
35+
)
36+
37+
def _get_metadata_df(self):
38+
return self.model.create_metadata_df()
39+
40+
41+
if __name__ == '__main__':
42+
from os.path import dirname, join
43+
import ets_tutorial
44+
45+
TUTORIAL_DIR = dirname(ets_tutorial.__file__)
46+
SAMPLE_IMG_DIR = join(TUTORIAL_DIR, "..", "sample_images")
47+
48+
image_file = ImageFolder(directory=SAMPLE_IMG_DIR)
49+
view = ImageFolderView(model=image_file)
50+
view.configure_traits()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import unittest
2+
from os.path import dirname, join
3+
4+
from traitsui.testing.api import UITester, IsVisible
5+
6+
import ets_tutorial
7+
from pycasa.model.image_folder import ImageFolder
8+
from image_folder_view import ImageFolderView
9+
10+
TUTORIAL_DIR = dirname(ets_tutorial.__file__)
11+
SAMPLE_IMG_DIR = join(TUTORIAL_DIR, "..", "sample_images")
12+
13+
14+
class TestImageFolderView(unittest.TestCase):
15+
def test_smoke(self):
16+
view = ImageFolderView(model=ImageFolder(directory=SAMPLE_IMG_DIR))
17+
tester = UITester()
18+
with tester.create_ui(view) as ui:
19+
df = tester.find_by_name(ui, "metadata_df")
20+
df.inspect(IsVisible())

0 commit comments

Comments
 (0)