Skip to content

Commit 52ac46e

Browse files
Live Viewer Image Timestamp (#2274)
2 parents 79a43a1 + c10991f commit 52ac46e

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#2273: Display the modified image timestamp within the live viewer to allow for easier determination of what scan is being displayed within the live viewer.

mantidimaging/eyes_tests/live_viewer_window_test.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
11
# Copyright (C) 2024 ISIS Rutherford Appleton Laboratory UKRI
22
# SPDX - License - Identifier: GPL-3.0-or-later
3-
from __future__ import annotations
43

4+
from __future__ import annotations
5+
from typing import TYPE_CHECKING
56
from unittest import mock
6-
77
import numpy as np
8-
8+
import os
99
from mantidimaging.core.operations.loader import load_filter_packages
1010
from mantidimaging.gui.windows.live_viewer.model import Image_Data
1111
from mantidimaging.test_helpers.unit_test_helper import FakeFSTestCase
1212
from pathlib import Path
13-
1413
from mantidimaging.eyes_tests.base_eyes import BaseEyesTest
1514

15+
if TYPE_CHECKING:
16+
import time # noqa: F401
17+
1618

1719
class LiveViewerWindowTest(FakeFSTestCase, BaseEyesTest):
1820

21+
def __init__(self, *args, **kwargs):
22+
super().__init__(*args, **kwargs)
23+
self.initial_time = 4000.0
24+
1925
@classmethod
2026
def setUpClass(cls) -> None:
2127
super().setUpClass()
@@ -30,26 +36,30 @@ def setUp(self) -> None:
3036
def _generate_image(self):
3137
image = np.zeros((10, 10))
3238
image[5, :] = np.arange(10)
39+
os.utime(self.live_directory, (10, self.initial_time))
40+
self.initial_time += 1000
3341
return image
3442

3543
def _make_simple_dir(self, directory: Path):
3644
file_list = [directory / f"abc_{i:06d}.tif" for i in range(5)]
37-
if not directory.exists():
38-
self.fs.create_dir(directory)
39-
45+
increment = 0
4046
for file in file_list:
4147
self.fs.create_file(file)
48+
os.utime(file, (10, self.initial_time + increment))
49+
increment += 1000
4250

4351
return file_list
4452

4553
@mock.patch('mantidimaging.gui.windows.live_viewer.model.ImageWatcher')
46-
def test_live_view_opens_without_data(self, _mock_image_watcher):
54+
@mock.patch("time.time", return_value=4000.0)
55+
def test_live_view_opens_without_data(self, _mock_time, _mock_image_watcher):
4756
self.imaging.show_live_viewer(self.live_directory)
4857
self.check_target(widget=self.imaging.live_viewer)
4958

5059
@mock.patch('mantidimaging.gui.windows.live_viewer.presenter.LiveViewerWindowPresenter.load_image')
5160
@mock.patch('mantidimaging.gui.windows.live_viewer.model.ImageWatcher')
52-
def test_live_view_opens_with_data(self, _mock_image_watcher, mock_load_image):
61+
@mock.patch("time.time", return_value=4000.0)
62+
def test_live_view_opens_with_data(self, _mock_time, _mock_image_watcher, mock_load_image):
5363
file_list = self._make_simple_dir(self.live_directory)
5464
image_list = [Image_Data(path) for path in file_list]
5565
mock_load_image.return_value = self._generate_image()
@@ -59,7 +69,8 @@ def test_live_view_opens_with_data(self, _mock_image_watcher, mock_load_image):
5969

6070
@mock.patch('mantidimaging.gui.windows.live_viewer.presenter.LiveViewerWindowPresenter.load_image')
6171
@mock.patch('mantidimaging.gui.windows.live_viewer.model.ImageWatcher')
62-
def test_live_view_opens_with_bad_data(self, _mock_image_watcher, mock_load_image):
72+
@mock.patch("time.time", return_value=4000.0)
73+
def test_live_view_opens_with_bad_data(self, _mock_time, _mock_image_watcher, mock_load_image):
6374
file_list = self._make_simple_dir(self.live_directory)
6475
image_list = [Image_Data(path) for path in file_list]
6576
mock_load_image.side_effect = ValueError
@@ -69,7 +80,8 @@ def test_live_view_opens_with_bad_data(self, _mock_image_watcher, mock_load_imag
6980

7081
@mock.patch('mantidimaging.gui.windows.live_viewer.presenter.LiveViewerWindowPresenter.load_image')
7182
@mock.patch('mantidimaging.gui.windows.live_viewer.model.ImageWatcher')
72-
def test_rotate_operation_rotates_image(self, _mock_image_watcher, mock_load_image):
83+
@mock.patch("time.time", return_value=4000.0)
84+
def test_rotate_operation_rotates_image(self, _mock_time, _mock_image_watcher, mock_load_image):
7385
file_list = self._make_simple_dir(self.live_directory)
7486
image_list = [Image_Data(path) for path in file_list]
7587
mock_load_image.return_value = self._generate_image()

mantidimaging/gui/windows/live_viewer/model.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ def image_modified_time(self) -> float:
5555
"""Return the image modified time"""
5656
return self._stat.st_mtime
5757

58+
@property
59+
def image_modified_time_stamp(self) -> str:
60+
"""Return the image modified time as a string"""
61+
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(self.image_modified_time))
62+
5863

5964
class SubDirectory:
6065

mantidimaging/gui/windows/live_viewer/presenter.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def select_image(self, index: int) -> None:
7878
if not self.model.images:
7979
return
8080
self.selected_image = self.model.images[index]
81-
self.view.label_active_filename.setText(self.selected_image.image_name)
81+
image_timestamp = self.selected_image.image_modified_time_stamp
82+
self.view.label_active_filename.setText(f"{self.selected_image.image_name} - {image_timestamp}")
8283

8384
self.display_image(self.selected_image.image_path)
8485

0 commit comments

Comments
 (0)