def __init__(self, parent, wid=-1, pos=(0, 0), size=wx.DefaultSize, style=wx.NO_BORDER): style = style | wx.NO_BORDER super(InfoLegend, self).__init__(parent, wid, pos, size, style) # Cannot be a constant because loading bitmaps only works after wx.App # has been created. self._type_to_icon = ( (MD_AT_AR, img.getBitmap("icon/ico_blending_ang.png")), (MD_AT_SPECTRUM, img.getBitmap("icon/ico_blending_spec.png")), (MD_AT_EM, img.getBitmap("icon/ico_blending_sem.png")), (MD_AT_OVV_TILES, img.getBitmap("icon/ico_blending_map.png")), (MD_AT_OVV_FULL, img.getBitmap("icon/ico_blending_navcam.png")), (MD_AT_HISTORY, img.getBitmap("icon/ico_blending_history.png")), (MD_AT_CL, img.getBitmap("icon/ico_blending_opt.png")), (MD_AT_FLUO, img.getBitmap("icon/ico_blending_opt.png")), (MD_AT_SLIT, img.getBitmap("icon/ico_blending_slit.png")), ) self.SetBackgroundColour(parent.GetBackgroundColour()) self.SetForegroundColour(parent.GetForegroundColour()) ### Create child windows # Merge slider # TODO: should be possible to use VAConnector self.merge_slider = Slider(self, wx.ID_ANY, 50, # val 0, 100, size=(100, 12), style=(wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_TICKS | wx.NO_BORDER) ) self.merge_slider.SetBackgroundColour(parent.GetBackgroundColour()) self.merge_slider.SetForegroundColour(FG_COLOUR_DIS) # "#4d4d4d" self.merge_slider.SetToolTip("Merge ratio") self.bmp_slider_left = wx.StaticBitmap(self, wx.ID_ANY, img.getBitmap("icon/ico_blending_opt.png")) self.bmp_slider_right = wx.StaticBitmap(self, wx.ID_ANY, img.getBitmap("icon/ico_blending_sem.png")) # Horizontal Field Width text self.hfw_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.hfw_text.SetBackgroundColour(parent.GetBackgroundColour()) self.hfw_text.SetForegroundColour(parent.GetForegroundColour()) self.hfw_text.SetToolTip("Horizontal Field Width") # Magnification text self.magnification_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.magnification_text.SetBackgroundColour(parent.GetBackgroundColour()) self.magnification_text.SetForegroundColour(parent.GetForegroundColour()) self.magnification_text.SetToolTip("Magnification") # Z position text self.zPos_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.zPos_text.SetBackgroundColour(parent.GetBackgroundColour()) self.zPos_text.SetForegroundColour(parent.GetForegroundColour()) self.zPos_text.SetToolTip("Z Position") self.zPos_text.Hide() # Scale window self.scale_win = ScaleWindow(self) ## Child window layout # Sizer composition: # # +-------------------------------------------------------+ # | <Mag> | <HFW> | <Scale> | [Icon|Slider|Icon] | # +-------------------------------------------------------+ slider_sizer = wx.BoxSizer(wx.HORIZONTAL) # TODO: need to have the icons updated according to the streams type slider_sizer.Add( self.bmp_slider_left, 0, border=3, flag=wx.ALIGN_CENTER | wx.RIGHT) slider_sizer.Add( self.merge_slider, 1, flag=wx.ALIGN_CENTER | wx.EXPAND) slider_sizer.Add( self.bmp_slider_right, 0, border=3, flag=wx.ALIGN_CENTER | wx.LEFT) control_sizer = wx.BoxSizer(wx.HORIZONTAL) control_sizer.Add(self.magnification_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.hfw_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.scale_win, 3, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.zPos_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(slider_sizer, 0, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT) # border_sizer is needed to add a border around the legend border_sizer = wx.BoxSizer(wx.VERTICAL) border_sizer.Add(control_sizer, border=6, flag=wx.ALL | wx.EXPAND) self.SetSizerAndFit(border_sizer) ## Event binding # Dragging the slider should set the focus to the right view self.merge_slider.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.merge_slider.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) # Make sure that mouse clicks on the icons set the correct focus self.bmp_slider_left.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.bmp_slider_right.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Set slider to min/max self.bmp_slider_left.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.bmp_slider_right.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.hfw_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.magnification_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.zPos_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
class InfoLegend(wx.Panel): """ This class describes a legend containing the default controls that provide information about live data streams. TODO: give this class a more descriptive name """ def __init__(self, parent, wid=-1, pos=(0, 0), size=wx.DefaultSize, style=wx.NO_BORDER): style = style | wx.NO_BORDER super(InfoLegend, self).__init__(parent, wid, pos, size, style) # Cannot be a constant because loading bitmaps only works after wx.App # has been created. self._type_to_icon = ( (MD_AT_AR, img.getBitmap("icon/ico_blending_ang.png")), (MD_AT_SPECTRUM, img.getBitmap("icon/ico_blending_spec.png")), (MD_AT_EM, img.getBitmap("icon/ico_blending_sem.png")), (MD_AT_OVV_TILES, img.getBitmap("icon/ico_blending_map.png")), (MD_AT_OVV_FULL, img.getBitmap("icon/ico_blending_navcam.png")), (MD_AT_HISTORY, img.getBitmap("icon/ico_blending_history.png")), (MD_AT_CL, img.getBitmap("icon/ico_blending_opt.png")), (MD_AT_FLUO, img.getBitmap("icon/ico_blending_opt.png")), (MD_AT_SLIT, img.getBitmap("icon/ico_blending_slit.png")), ) self.SetBackgroundColour(parent.GetBackgroundColour()) self.SetForegroundColour(parent.GetForegroundColour()) ### Create child windows # Merge slider # TODO: should be possible to use VAConnector self.merge_slider = Slider(self, wx.ID_ANY, 50, # val 0, 100, size=(100, 12), style=(wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_TICKS | wx.NO_BORDER) ) self.merge_slider.SetBackgroundColour(parent.GetBackgroundColour()) self.merge_slider.SetForegroundColour(FG_COLOUR_DIS) # "#4d4d4d" self.merge_slider.SetToolTip("Merge ratio") self.bmp_slider_left = wx.StaticBitmap(self, wx.ID_ANY, img.getBitmap("icon/ico_blending_opt.png")) self.bmp_slider_right = wx.StaticBitmap(self, wx.ID_ANY, img.getBitmap("icon/ico_blending_sem.png")) # Horizontal Field Width text self.hfw_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.hfw_text.SetBackgroundColour(parent.GetBackgroundColour()) self.hfw_text.SetForegroundColour(parent.GetForegroundColour()) self.hfw_text.SetToolTip("Horizontal Field Width") # Magnification text self.magnification_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.magnification_text.SetBackgroundColour(parent.GetBackgroundColour()) self.magnification_text.SetForegroundColour(parent.GetForegroundColour()) self.magnification_text.SetToolTip("Magnification") # Z position text self.zPos_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.zPos_text.SetBackgroundColour(parent.GetBackgroundColour()) self.zPos_text.SetForegroundColour(parent.GetForegroundColour()) self.zPos_text.SetToolTip("Z Position") self.zPos_text.Hide() # Scale window self.scale_win = ScaleWindow(self) ## Child window layout # Sizer composition: # # +-------------------------------------------------------+ # | <Mag> | <HFW> | <Scale> | [Icon|Slider|Icon] | # +-------------------------------------------------------+ slider_sizer = wx.BoxSizer(wx.HORIZONTAL) # TODO: need to have the icons updated according to the streams type slider_sizer.Add( self.bmp_slider_left, 0, border=3, flag=wx.ALIGN_CENTER | wx.RIGHT) slider_sizer.Add( self.merge_slider, 1, flag=wx.ALIGN_CENTER | wx.EXPAND) slider_sizer.Add( self.bmp_slider_right, 0, border=3, flag=wx.ALIGN_CENTER | wx.LEFT) control_sizer = wx.BoxSizer(wx.HORIZONTAL) control_sizer.Add(self.magnification_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.hfw_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.scale_win, 3, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.zPos_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(slider_sizer, 0, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT) # border_sizer is needed to add a border around the legend border_sizer = wx.BoxSizer(wx.VERTICAL) border_sizer.Add(control_sizer, border=6, flag=wx.ALL | wx.EXPAND) self.SetSizerAndFit(border_sizer) ## Event binding # Dragging the slider should set the focus to the right view self.merge_slider.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.merge_slider.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) # Make sure that mouse clicks on the icons set the correct focus self.bmp_slider_left.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.bmp_slider_right.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Set slider to min/max self.bmp_slider_left.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.bmp_slider_right.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.hfw_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.magnification_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.zPos_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Explicitly set the # self.SetMinSize((-1, 40)) # Make mouse events propagate to the parent def OnLeftDown(self, evt): evt.ResumePropagation(1) evt.Skip() def OnLeftUp(self, evt): evt.ResumePropagation(1) evt.Skip() def set_hfw_label(self, label): approx_width = len(label) * 7 self.hfw_text.SetMinSize((approx_width, -1)) self.hfw_text.SetValue(label) self.Layout() def set_mag_label(self, label): # TODO: compute the real size needed (using GetTextExtent()) approx_width = len(label) * 7 self.magnification_text.SetMinSize((approx_width, -1)) self.magnification_text.SetValue(label) self.Layout() def set_zPos_label(self, label): """ label (unicode or None): if None, zPos is hidden, otherwise show the value """ if label is None: self.zPos_text.Hide() else: self.zPos_text.Show() # TODO: compute the real size needed (using GetTextExtent()) approx_width = len(label) * 7 self.zPos_text.SetMinSize((approx_width, -1)) self.zPos_text.SetValue(label) self.Layout() def set_stream_type(self, side, acq_type): """ Set the stream type, to put the right icon on the merge slider :param side: (wx.LEFT or wx.RIGHT): whether this set the left or right stream :param acq_type: (String): acquisition type associated with stream """ for t, type_icon in self._type_to_icon: if acq_type == t: icon = type_icon break else: # Don't fail too bad icon = img.getBitmap("icon/ico_blending_opt.png") if self.merge_slider.IsShown(): logging.warning("Failed to find icon for stream of type %s", acq_type) if side == wx.LEFT: self.bmp_slider_left.SetBitmap(icon) else: self.bmp_slider_right.SetBitmap(icon)
class InfoLegend(wx.Panel): """ This class describes a legend containing the default controls that provide information about live data streams. TODO: give this class a more descriptive name """ def __init__(self, parent, wid=-1, pos=(0, 0), size=wx.DefaultSize, style=wx.NO_BORDER): style = style | wx.NO_BORDER super(InfoLegend, self).__init__(parent, wid, pos, size, style) self.SetBackgroundColour(parent.GetBackgroundColour()) self.SetForegroundColour(parent.GetForegroundColour()) ### Create child windows # Merge slider # TODO: should be possible to use VAConnector self.merge_slider = Slider( self, wx.ID_ANY, 50, # val 0, 100, size=(100, 12), style=(wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_TICKS | wx.NO_BORDER)) self.merge_slider.SetBackgroundColour(parent.GetBackgroundColour()) self.merge_slider.SetForegroundColour("#4d4d4d") self.merge_slider.SetToolTipString("Merge ratio") self.bmp_slider_left = wx.StaticBitmap( self, wx.ID_ANY, imgdata.getico_blending_optBitmap()) self.bmp_slider_right = wx.StaticBitmap( self, wx.ID_ANY, imgdata.getico_blending_semBitmap()) # Scale window self.scale_win = ScaleWindow(self) # Horizontal Field Width text # TODO: allow the user to select/copy the text self.hfw_text = wx.StaticText(self) self.hfw_text.SetToolTipString("Horizontal Field Width") # Magnification text self.magnification_text = wx.StaticText(self) self.magnification_text.SetToolTipString("Magnification") # TODO more... # self.LegendWl = wx.StaticText(self.legend) # self.LegendWl.SetToolTipString("Wavelength") # self.LegendET = wx.StaticText(self.legend) # self.LegendET.SetToolTipString("Exposure Time") # self.LegendDwell = wx.StaticText(self.legend) # self.LegendSpot = wx.StaticText(self.legend) # self.LegendHV = wx.StaticText(self.legend) ## Child window layout # Sizer composition: # # +-------------------------------------------------------+ # | +----+-----+ | | | | +----+------+----+ | # | |Mag | HFW | | <> | <Scale> | <> | |Icon|Slider|Icon| | # | +----+-----+ | | | | +----+------+----+ | # +-------------------------------------------------------+ leftColSizer = wx.BoxSizer(wx.HORIZONTAL) leftColSizer.Add(self.magnification_text, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT) leftColSizer.Add(self.hfw_text, border=10, flag=wx.ALIGN_CENTER) sliderSizer = wx.BoxSizer(wx.HORIZONTAL) # TODO: need to have the icons updated according to the streams type sliderSizer.Add(self.bmp_slider_left, border=3, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.RESERVE_SPACE_EVEN_IF_HIDDEN) sliderSizer.Add(self.merge_slider, flag=wx.ALIGN_CENTER | wx.EXPAND | wx.RESERVE_SPACE_EVEN_IF_HIDDEN) sliderSizer.Add(self.bmp_slider_right, border=3, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RESERVE_SPACE_EVEN_IF_HIDDEN) legendSizer = wx.BoxSizer(wx.HORIZONTAL) legendSizer.Add(leftColSizer, 0, flag=wx.EXPAND | wx.ALIGN_CENTER) legendSizer.AddStretchSpacer(1) legendSizer.Add(self.scale_win, 2, border=2, flag=wx.EXPAND | wx.ALIGN_CENTER | wx.RIGHT | wx.LEFT) legendSizer.AddStretchSpacer(1) legendSizer.Add(sliderSizer, 0, flag=wx.EXPAND | wx.ALIGN_CENTER) # legend_panel_sizer is needed to add a border around the legend legend_panel_sizer = wx.BoxSizer(wx.VERTICAL) legend_panel_sizer.Add(legendSizer, border=10, flag=wx.ALL | wx.EXPAND) self.SetSizerAndFit(legend_panel_sizer) ## Event binding # Dragging the slider should set the focus to the right view self.merge_slider.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.merge_slider.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) # Make sure that mouse clicks on the icons set the correct focus self.bmp_slider_left.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.bmp_slider_right.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Set slider to min/max self.bmp_slider_left.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.bmp_slider_right.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.hfw_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.magnification_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Explicitly set the self.SetMinSize((-1, 40)) # Make mouse events propagate to the parent def OnLeftDown(self, evt): evt.ResumePropagation(1) evt.Skip() def OnLeftUp(self, evt): evt.ResumePropagation(1) evt.Skip() def set_hfw_label(self, label): self.hfw_text.SetLabel(label) self.Layout() def set_mag_label(self, label): self.magnification_text.SetLabel(label) self.Layout() def set_stream_type(self, side, stream_class): """ Set the stream type, to put the right icon on the merge slider :param side: (wx.LEFT or wx.RIGHT): whether this set the left or right stream :param stream_class: (Stream (sub)class): the class of the stream """ stream_to_icon = [ (stream.AR_STREAMS, imgdata.getico_blending_angBitmap()), (stream.SPECTRUM_STREAMS, imgdata.getico_blending_specBitmap()), (stream.OPTICAL_STREAMS, imgdata.getico_blending_optBitmap()), (stream.EM_STREAMS, imgdata.getico_blending_semBitmap()), (stream.RGBStream, imgdata.getico_blending_goalBitmap()), ] for group_of_classes, class_icon in stream_to_icon: if issubclass(stream_class, group_of_classes): icon = class_icon break else: # Don't fail too bad icon = imgdata.getico_blending_optBitmap() if self.merge_slider.IsShown(): logging.warning("Failed to find icon for stream of class %s", stream_class) if side == wx.LEFT: self.bmp_slider_left.SetBitmap(icon) else: self.bmp_slider_right.SetBitmap(icon)
def __init__(self, parent, wid=-1, pos=(0, 0), size=wx.DefaultSize, style=wx.NO_BORDER): style = style | wx.NO_BORDER super(InfoLegend, self).__init__(parent, wid, pos, size, style) self.SetBackgroundColour(parent.GetBackgroundColour()) self.SetForegroundColour(parent.GetForegroundColour()) ### Create child windows # Merge slider # TODO: should be possible to use VAConnector self.merge_slider = Slider( self, wx.ID_ANY, 50, # val 0, 100, size=(100, 12), style=(wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_TICKS | wx.NO_BORDER)) self.merge_slider.SetBackgroundColour(parent.GetBackgroundColour()) self.merge_slider.SetForegroundColour("#4d4d4d") self.merge_slider.SetToolTipString("Merge ratio") self.bmp_slider_left = wx.StaticBitmap( self, wx.ID_ANY, imgdata.getico_blending_optBitmap()) self.bmp_slider_right = wx.StaticBitmap( self, wx.ID_ANY, imgdata.getico_blending_semBitmap()) # Scale window self.scale_win = ScaleWindow(self) # Horizontal Field Width text # TODO: allow the user to select/copy the text self.hfw_text = wx.StaticText(self) self.hfw_text.SetToolTipString("Horizontal Field Width") # Magnification text self.magnification_text = wx.StaticText(self) self.magnification_text.SetToolTipString("Magnification") # TODO more... # self.LegendWl = wx.StaticText(self.legend) # self.LegendWl.SetToolTipString("Wavelength") # self.LegendET = wx.StaticText(self.legend) # self.LegendET.SetToolTipString("Exposure Time") # self.LegendDwell = wx.StaticText(self.legend) # self.LegendSpot = wx.StaticText(self.legend) # self.LegendHV = wx.StaticText(self.legend) ## Child window layout # Sizer composition: # # +-------------------------------------------------------+ # | +----+-----+ | | | | +----+------+----+ | # | |Mag | HFW | | <> | <Scale> | <> | |Icon|Slider|Icon| | # | +----+-----+ | | | | +----+------+----+ | # +-------------------------------------------------------+ leftColSizer = wx.BoxSizer(wx.HORIZONTAL) leftColSizer.Add(self.magnification_text, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT) leftColSizer.Add(self.hfw_text, border=10, flag=wx.ALIGN_CENTER) sliderSizer = wx.BoxSizer(wx.HORIZONTAL) # TODO: need to have the icons updated according to the streams type sliderSizer.Add(self.bmp_slider_left, border=3, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.RESERVE_SPACE_EVEN_IF_HIDDEN) sliderSizer.Add(self.merge_slider, flag=wx.ALIGN_CENTER | wx.EXPAND | wx.RESERVE_SPACE_EVEN_IF_HIDDEN) sliderSizer.Add(self.bmp_slider_right, border=3, flag=wx.ALIGN_CENTER | wx.LEFT | wx.RESERVE_SPACE_EVEN_IF_HIDDEN) legendSizer = wx.BoxSizer(wx.HORIZONTAL) legendSizer.Add(leftColSizer, 0, flag=wx.EXPAND | wx.ALIGN_CENTER) legendSizer.AddStretchSpacer(1) legendSizer.Add(self.scale_win, 2, border=2, flag=wx.EXPAND | wx.ALIGN_CENTER | wx.RIGHT | wx.LEFT) legendSizer.AddStretchSpacer(1) legendSizer.Add(sliderSizer, 0, flag=wx.EXPAND | wx.ALIGN_CENTER) # legend_panel_sizer is needed to add a border around the legend legend_panel_sizer = wx.BoxSizer(wx.VERTICAL) legend_panel_sizer.Add(legendSizer, border=10, flag=wx.ALL | wx.EXPAND) self.SetSizerAndFit(legend_panel_sizer) ## Event binding # Dragging the slider should set the focus to the right view self.merge_slider.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.merge_slider.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) # Make sure that mouse clicks on the icons set the correct focus self.bmp_slider_left.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.bmp_slider_right.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Set slider to min/max self.bmp_slider_left.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.bmp_slider_right.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.hfw_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.magnification_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Explicitly set the self.SetMinSize((-1, 40))
class InfoLegend(wx.Panel): """ This class describes a legend containing the default controls that provide information about live data streams. TODO: give this class a more descriptive name """ def __init__(self, parent, wid=-1, pos=(0, 0), size=wx.DefaultSize, style=wx.NO_BORDER): style = style | wx.NO_BORDER super(InfoLegend, self).__init__(parent, wid, pos, size, style) # Cannot be a constant because loading bitmaps only works after wx.App # has been created. self._stream_to_icon = ( (stream.ARStream, img.getBitmap("icon/ico_blending_ang.png")), (stream.SpectrumStream, img.getBitmap("icon/ico_blending_spec.png")), (stream.OpticalStream, img.getBitmap("icon/ico_blending_opt.png")), (stream.CLStream, img.getBitmap("icon/ico_blending_opt.png")), # same as optical (stream.EMStream, img.getBitmap("icon/ico_blending_sem.png")), (stream.RGBStream, img.getBitmap("icon/ico_blending_goal.png")), ) self.SetBackgroundColour(parent.GetBackgroundColour()) self.SetForegroundColour(parent.GetForegroundColour()) ### Create child windows # Merge slider # TODO: should be possible to use VAConnector self.merge_slider = Slider( self, wx.ID_ANY, 50, # val 0, 100, size=(100, 12), style=(wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_TICKS | wx.NO_BORDER)) self.merge_slider.SetBackgroundColour(parent.GetBackgroundColour()) self.merge_slider.SetForegroundColour(FG_COLOUR_DIS) # "#4d4d4d" self.merge_slider.SetToolTipString("Merge ratio") self.bmp_slider_left = wx.StaticBitmap( self, wx.ID_ANY, img.getBitmap("icon/ico_blending_opt.png")) self.bmp_slider_right = wx.StaticBitmap( self, wx.ID_ANY, img.getBitmap("icon/ico_blending_sem.png")) # Horizontal Field Width text self.hfw_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.hfw_text.SetBackgroundColour(parent.GetBackgroundColour()) self.hfw_text.SetForegroundColour(parent.GetForegroundColour()) self.hfw_text.SetToolTipString("Horizontal Field Width") # Magnification text self.magnification_text = wx.TextCtrl(self, style=wx.NO_BORDER | wx.CB_READONLY) self.magnification_text.SetBackgroundColour( parent.GetBackgroundColour()) self.magnification_text.SetForegroundColour( parent.GetForegroundColour()) self.magnification_text.SetToolTipString("Magnification") # Scale window self.scale_win = ScaleWindow(self) # TODO more... # self.LegendWl = wx.StaticText(self.legend) # self.LegendWl.SetToolTipString("Wavelength") # self.LegendET = wx.StaticText(self.legend) # self.LegendET.SetToolTipString("Exposure Time") # self.LegendDwell = wx.StaticText(self.legend) # self.LegendSpot = wx.StaticText(self.legend) # self.LegendHV = wx.StaticText(self.legend) ## Child window layout # Sizer composition: # # +-------------------------------------------------------+ # | <Mag> | <HFW> | <Scale> | [Icon|Slider|Icon] | # +-------------------------------------------------------+ slider_sizer = wx.BoxSizer(wx.HORIZONTAL) # TODO: need to have the icons updated according to the streams type slider_sizer.Add(self.bmp_slider_left, 0, border=3, flag=wx.ALIGN_CENTER | wx.RIGHT) slider_sizer.Add(self.merge_slider, 1, flag=wx.ALIGN_CENTER | wx.EXPAND) slider_sizer.Add(self.bmp_slider_right, 0, border=3, flag=wx.ALIGN_CENTER | wx.LEFT) control_sizer = wx.BoxSizer(wx.HORIZONTAL) control_sizer.Add(self.magnification_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.hfw_text, 2, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(self.scale_win, 3, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.EXPAND) control_sizer.Add(slider_sizer, 0, border=10, flag=wx.ALIGN_CENTER | wx.RIGHT) # legend_panel_sizer is needed to add a border around the legend border_sizer = wx.BoxSizer(wx.VERTICAL) border_sizer.Add(control_sizer, border=6, flag=wx.ALL | wx.EXPAND) self.SetSizerAndFit(border_sizer) ## Event binding # Dragging the slider should set the focus to the right view self.merge_slider.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.merge_slider.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) # Make sure that mouse clicks on the icons set the correct focus self.bmp_slider_left.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.bmp_slider_right.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Set slider to min/max self.bmp_slider_left.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.bmp_slider_right.Bind(wx.EVT_LEFT_UP, parent.OnSliderIconClick) self.hfw_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.magnification_text.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) # Explicitly set the # self.SetMinSize((-1, 40)) # Make mouse events propagate to the parent def OnLeftDown(self, evt): evt.ResumePropagation(1) evt.Skip() def OnLeftUp(self, evt): evt.ResumePropagation(1) evt.Skip() def set_hfw_label(self, label): approx_width = len(label) * 7 self.hfw_text.SetMinSize((approx_width, -1)) self.hfw_text.SetValue(label) self.Layout() def set_mag_label(self, label): # TODO: compute the real size needed (using GetTextExtent()) approx_width = len(label) * 7 self.magnification_text.SetMinSize((approx_width, -1)) self.magnification_text.SetValue(label) self.Layout() def set_stream_type(self, side, stream_class): """ Set the stream type, to put the right icon on the merge slider :param side: (wx.LEFT or wx.RIGHT): whether this set the left or right stream :param stream_class: (Stream (sub)class): the class of the stream """ for group_of_classes, class_icon in self._stream_to_icon: if issubclass(stream_class, group_of_classes): icon = class_icon break else: # Don't fail too bad icon = img.getBitmap("icon/ico_blending_opt.png") if self.merge_slider.IsShown(): logging.warning("Failed to find icon for stream of class %s", stream_class) if side == wx.LEFT: self.bmp_slider_left.SetBitmap(icon) else: self.bmp_slider_right.SetBitmap(icon)