From 4b8252ab427ad28b4a8d3b9c9f7619ac6837ff30 Mon Sep 17 00:00:00 2001 From: Randy Mackay Date: Sat, 7 Sep 2024 20:17:50 +0900 Subject: [PATCH] picviewer: improved mosaic --- MAVProxy/tools/mavpicviewer/mosaic_window2.py | 71 ++++++++----------- .../tools/mavpicviewer/picviewer_window.py | 8 ++- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/MAVProxy/tools/mavpicviewer/mosaic_window2.py b/MAVProxy/tools/mavpicviewer/mosaic_window2.py index 471a90d71a..39688c7d2b 100644 --- a/MAVProxy/tools/mavpicviewer/mosaic_window2.py +++ b/MAVProxy/tools/mavpicviewer/mosaic_window2.py @@ -28,7 +28,10 @@ class mosaic_window2: """displays a mosaic of images""" - def __init__(self, filelist): + def __init__(self, filelist, image_select_cb): + + # keep reference to callback + self.image_select_cb = image_select_cb # determine if filelist is a string or a list of strings self.filenumber = 0 @@ -44,18 +47,19 @@ def __init__(self, filelist): self.thumb_columns = 5 self.thumb_rows = ceil(len(filelist) / self.thumb_columns) - # create image viewer - self.im = None - #self.update_image() - # create window self.app = wx.App() - self.frame = wx.Frame(None, title="Mosaic", size=(650, 200)) + + # update title + title_str = "PicViewer Mosaic (" + str(self.filenumber+1) + " of " + str(len(self.filelist)) + ")" + self.frame = wx.Frame(None, title=title_str, size=(565, 310)) self.frame.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)) # add menu self.menu = wx.Menu() self.menu.Append(1, "Open Folder", "Open a Folder of images") + self.menu.Append(2, "Show All", "Show all images") + self.menu.Append(3, "Show POI", "Show images with POI") self.menu_bar = wx.MenuBar() self.menu_bar.Append(self.menu, "Menu") self.frame.SetMenuBar(self.menu_bar) @@ -70,35 +74,25 @@ def __init__(self, filelist): #self.settings_frame.Bind(wx.EVT_TEXT_ENTER, self.settings_set_button_click, self.settings_text_input) #self.settings_frame.Bind(wx.EVT_CLOSE, self.apikey_close_button_click) + # add a read-only status text box + self.text_status = wx.TextCtrl(self.frame, id=-1, size=(600, 60), style=wx.TE_READONLY | wx.TE_MULTILINE | wx.TE_RICH) + # add a scrolled panel self.scrolled_panel = scrolled.ScrolledPanel(self.frame, -1, size=(600, 600), style=wx.TAB_TRAVERSAL) self.scrolled_panel_sizer = wx.GridSizer(cols=5, hgap=5, vgap=5) - # add an image - #img1_path = self.filelist[1] - #self.wx_image1 = wx.Image(img1_path, wx.BITMAP_TYPE_ANY).Scale(100, 100) - #self.image = wx.StaticBitmap(self.scrolled_panel, wx.ID_ANY, wx.Bitmap(self.wx_image1)) - - #img2_path = self.filelist[2] - #self.wx_image2 = wx.Image(img2_path, wx.BITMAP_TYPE_ANY).Scale(100, 100) - #self.image2 = wx.StaticBitmap(self.scrolled_panel, wx.ID_ANY, wx.Bitmap(self.wx_image2)) - - #self.scrolled_panel_sizer.Add(self.image, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) - #self.scrolled_panel_sizer.Add(self.image2, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) - # add images for i in range(len(self.filelist)): img_path = self.filelist[i] wx_image = wx.Image(img_path, wx.BITMAP_TYPE_ANY).Scale(100, 100) - image = wx.StaticBitmap(self.scrolled_panel, wx.ID_ANY, wx.Bitmap(wx_image)) - self.scrolled_panel_sizer.Add(image, proportion=0, flag=wx.EXPAND | wx.ALL, border=2) + #image = wx.StaticBitmap(self.scrolled_panel, wx.ID_ANY, wx.Bitmap(wx_image)) + image = wx.StaticBitmap(self.scrolled_panel, i, wx.Bitmap(wx_image)) + image.Bind(wx.EVT_LEFT_DOWN, self.on_image_click) + self.scrolled_panel_sizer.Add(image, proportion=0, flag=wx.EXPAND | wx.ALL, border=2, userData=i) self.scrolled_panel.SetSizer(self.scrolled_panel_sizer) self.scrolled_panel.SetupScrolling(scroll_x=True, scroll_y=True) - # add a read-only reply text box - self.text_reply = wx.TextCtrl(self.frame, id=-1, size=(600, 80), style=wx.TE_READONLY | wx.TE_MULTILINE | wx.TE_RICH) - # add a cancel button self.cancel_button = wx.Button(self.frame, id=-1, label="cancel", size=(75, 25)) #self.frame.Bind(wx.EVT_BUTTON, self.cancel_button_click , self.cancel_button) @@ -111,43 +105,38 @@ def __init__(self, filelist): wx.CallAfter(self.cancel_button.Disable) # set size hints and add sizer to frame + self.vert_sizer.Add(self.text_status, proportion=0, flag=wx.EXPAND, border=5) self.vert_sizer.Add(self.scrolled_panel, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) - self.vert_sizer.Add(self.text_reply, proportion=0, flag=wx.EXPAND, border=5) - #self.vert_sizer.Add(self.image, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) - #self.vert_sizer.Add(self.image2, proportion=0, flag=wx.EXPAND | wx.ALL, border=5) self.vert_sizer.Add(self.horiz_sizer, proportion=0, flag=wx.EXPAND) #self.frame.Bind(wx.EVT_SIZE, self.on_resize) self.frame.SetSizer(self.vert_sizer) self.frame.Layout() - # set focus on the input text box - self.text_reply.SetFocus() + # set focus on the status text box + self.text_status.SetFocus() # show frame self.frame.Show() - # window loop (this does not return until the window is closed) - self.app.MainLoop() - self.thread = Thread(target=self.mosaic_window_loop, name='mosaic_window_loop') self.thread.daemon = False self.thread.start() # main loop - #def mosaic_window_loop(self): - # """main thread""" - # while True: - # if self.im is None: - # break - # time.sleep(0.25) - # self.check_events() + def mosaic_window_loop(self): + """main thread""" + # this does not return until the window is closed + self.app.MainLoop() # set window title def set_title(self, title): """set image title""" - if self.im is None: - return - self.im.set_title(title) + self.frame.SetTitle(title) + + # process window events + def on_image_click(self, event): + """process image click event""" + self.image_select_cb(event.GetId()) # process window events def check_events(self): diff --git a/MAVProxy/tools/mavpicviewer/picviewer_window.py b/MAVProxy/tools/mavpicviewer/picviewer_window.py index 733c1f3732..92e75a4684 100644 --- a/MAVProxy/tools/mavpicviewer/picviewer_window.py +++ b/MAVProxy/tools/mavpicviewer/picviewer_window.py @@ -90,7 +90,7 @@ def __init__(self, filelist): self.update_map() # create mosaic of images - self.mosaic = mosaic_window2.mosaic_window2(self.filelist) + self.mosaic = mosaic_window2.mosaic_window2(self.filelist, self.mosaic_image_select_cb) # create menu self.menu = None @@ -122,6 +122,12 @@ def picviewer_window_loop(self): time.sleep(0.25) self.check_events() + # image select callback + def mosaic_image_select_cb(self, filenumber): + self.filenumber = filenumber + self.update_image() + self.update_map() + # set window title def set_title(self, title): """set image title"""