def _test_TextTagPanel_keyboard_close(): sim = wx.UIActionSimulator() frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=tt.TTP_KEYBOARD_NAV) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() result = [None] def handler(ev): result[0] = ev.tag panel.Bind(tt.EVT_TTP_TAG_REMOVED, handler) tags = ['tag1', 'tag2', 'tag3'] panel.SetOptions(tags) for t in tags: panel.AddTag(t) realYield() # Give a tag focus simclick(sim, panel.tags[0], stype=2) # Hit the delete key simkey(sim, panel.tags[0], wx.WXK_DELETE) assert result[0] == tags[0] # Give another tag focus simclick(sim, panel.tags[0], stype=2) # Hit the backspace key simkey(sim, panel.tags[0], wx.WXK_BACK) assert result[0] == tags[1]
def _test_TextTagPanel_create_logic(): frame = wx.GetApp().GetTopWindow() panel = tt.TextTagPanel(frame) tags1 = ['Tag1', 'Tag2', 'Tag3'] colours1 = [(50, 200, 50), (150, 20, 20), (50, 50, 225)] tags2 = ['2Tag1', '2Tag2', '3Tag3'] colours2 = [(10, 100, 200), (100, 167, 202), (18, 28, 208)] panel.SetOptions(tags1, colours1) assert list(panel.GetOptions()) == tags1 assert len(panel.GetTags()) == 0 assert panel.TagCount() == 0 for t, c in zip(tags1, colours1): assert tuple(panel.GetTagColour(t)) == c assert tuple(panel.GetTagColour(t.lower())) == c assert panel.GetTagColour(tags2[0]) is None # Replace the options with another set panel.SetOptions(tags2, colours2) assert list(panel.GetOptions()) == tags2 assert len(panel.GetTags()) == 0 assert panel.TagCount() == 0 for t, c in zip(tags2, colours2): assert tuple(panel.GetTagColour(t)) == c assert tuple(panel.GetTagColour(t.lower())) == c # The ttp caches colours from old options # so colours1 should still be in there assert panel.GetTagColour(tags1[0]) == colours1[0]
def _test_TextTagPanel_close_event(): frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=0) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() result = [None] def handler(ev): result[0] = ev.tag panel.Bind(tt.EVT_TTP_TAG_REMOVED, handler) panel.AddTag('MyTag1') panel.AddTag('MyTag2') realYield() panel.tags[1]._StaticTextTag__onCloseButton(None) realYield() assert result[0] == 'MyTag2' assert panel.GetTags() == ['MyTag1'] panel.tags[0]._StaticTextTag__onCloseButton(None) realYield() assert result[0] == 'MyTag1' assert panel.GetTags() == []
def _test_TextTagPanel_case_sensitive(): sim = wx.UIActionSimulator() frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=(tt.TTP_CASE_SENSITIVE | tt.TTP_NO_DUPLICATES | tt.TTP_ALLOW_NEW_TAGS)) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() tags = ['Tag1', 'Tag2', 'Tag3', 'tag3'] panel.SetOptions(tags) assert panel.GetOptions() == tags realYield() for i in range(len(tags)): simtext(sim, panel.newTagCtrl.textCtrl, tags[i]) assert panel.GetTags() == tags[:i + 1] assert panel.HasTag(tags[i]) panel.RemoveTag(tags[3]) assert panel.GetTags() == tags[:3] panel.SetTagColour(tags[2], ( 50, 50, 50)) panel.SetTagColour(tags[3], (100, 100, 100)) assert panel.GetTagColour(tags[2]) == ( 50, 50, 50) assert panel.GetTagColour(tags[3]) == (100, 100, 100)
def _test_TextTagPanel_close_event(): sim = wx.UIActionSimulator() frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=0) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() result = [None] def handler(ev): result[0] = ev.tag panel.Bind(tt.EVT_TTP_TAG_REMOVED, handler) panel.AddTag('MyTag1') panel.AddTag('MyTag2') wx.Yield() simclick(sim, panel.tags[1].closeButton, stype=2) assert result[0] == 'MyTag2' assert panel.GetTags() == ['MyTag1'] simclick(sim, panel.tags[0].closeButton, stype=2) assert result[0] == 'MyTag1' assert panel.GetTags() == []
def _test_TextTagPanel_add_remove_logic(): frame = wx.GetApp().GetTopWindow() panel = tt.TextTagPanel(frame) tags = ['Tag1', 'Tag2', 'Tag3'] colours = [(50, 200, 50), (150, 20, 20), (50, 50, 225)] panel.SetOptions(tags, colours) panel.AddTag(tags[0]) panel.AddTag(tags[1]) assert panel.TagCount() == 2 assert list(panel.GetTags()) == [tags[0], tags[1]] assert panel.GetTagIndex(tags[0]) == 0 assert panel.GetTagIndex(tags[1]) == 1 assert panel.HasTag(tags[0]) assert panel.HasTag(tags[1]) assert not panel.HasTag(tags[2]) panel.SetTagColour(tags[0], (50, 50, 50)) panel.RemoveTag(tags[0]) assert panel.TagCount() == 1 assert list(panel.GetTags()) == [tags[1]] assert not panel.HasTag(tags[0]) assert panel.HasTag(tags[1]) panel.ClearTags() assert panel.TagCount() == 0 assert list(panel.GetTags()) == [] assert not panel.HasTag(tags[0]) assert not panel.HasTag(tags[1]) assert tuple(panel.GetTagColour(tags[0])) == (50, 50, 50)
def _test_TextTagPanel_nostyle(): frame = wx.GetApp().GetTopWindow() panel = tt.TextTagPanel(frame, style=0) addall(frame, [panel]) result = [None] tags = ['Tag1', 'Tag2', 'Tag3'] panel.SetOptions(tags) # Add an existing tag realYield() simtexttt(panel, tags[0]) assert panel.GetTags() == [tags[0]] simtexttt(panel, tags[2]) assert panel.GetTags() == [tags[0], tags[2]] # Duplicate result[0] = None simtexttt(panel, tags[2]) assert panel.GetTags() == [tags[0], tags[2], tags[2]] # Case insensitive simtexttt(panel, tags[1].lower()) assert panel.GetTags() == [tags[0], tags[2], tags[2], tags[1]] # Not in known tags simtexttt(panel, 'notag') assert panel.GetTags() == [tags[0], tags[2], tags[2], tags[1]]
def __recreateTags(self): """Called by :meth:`setOverlay`. Re-creates a :class:`.TextTagPanel` for every component in the :class:`.Image`. """ volLabels = self.__volLabels numComps = volLabels.numComponents() for i in range(numComps): tags = texttag.TextTagPanel(self.__grid, style=(texttag.TTP_ALLOW_NEW_TAGS | texttag.TTP_NO_DUPLICATES | texttag.TTP_KEYBOARD_NAV)) # Store the component number on the tag # panel, so we know which component we # are dealing with in the __onTagAdded # and __onTagRemoved methods. tags._componentIndex = i self.__grid.SetText( i, 0, str(i + 1)) self.__grid.SetWidget(i, 1, tags) tags.Bind(texttag.EVT_TTP_TAG_ADDED, self.__onTagAdded) tags.Bind(texttag.EVT_TTP_TAG_REMOVED, self.__onTagRemoved) self.__grid.Refresh() self.__refreshTagOptions() self.refreshTags() self.Layout()
def _test_TextTagPanel_allow_new_tags(): frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=tt.TTP_ALLOW_NEW_TAGS) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() realYield() simtexttt(panel, 'MyNewTag') assert panel.GetTags() == ['MyNewTag'] assert panel.GetOptions() == []
def _test_TextTagPanel_keyboard_nav(): sim = wx.UIActionSimulator() frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=tt.TTP_KEYBOARD_NAV) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() result = [None] def handler(ev): result[0] = ev.tag panel.Bind(tt.EVT_TTP_TAG_SELECT, handler) tags = ['tag1', 'tag2', 'tag3'] panel.SetOptions(tags) for t in tags: panel.AddTag(t) realYield() panel.FocusNewTagCtrl() realYield() simkey(sim, panel.newTagCtrl, wx.WXK_LEFT) assert result[0] is None simkey(sim, panel.newTagCtrl, wx.WXK_RIGHT) assert result[0] == tags[0] simkey(sim, panel.tags[0], wx.WXK_RIGHT) assert result[0] == tags[1] simkey(sim, panel.tags[1], wx.WXK_RIGHT) assert result[0] == tags[2] result[0] = None simkey(sim, panel.tags[2], wx.WXK_RIGHT) assert result[0] is None simkey(sim, panel.tags[2], wx.WXK_LEFT) assert result[0] == tags[1] simkey(sim, panel.tags[1], wx.WXK_LEFT) assert result[0] == tags[0] result[0] = None simkey(sim, panel.tags[0], wx.WXK_LEFT) assert result[0] is None assert panel.newTagCtrl.textCtrl.HasFocus()
def _test_TextTagPanel_add_new_tags(): sim = wx.UIActionSimulator() frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=(tt.TTP_ALLOW_NEW_TAGS | tt.TTP_ADD_NEW_TAGS)) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() realYield() simtext(sim, panel.newTagCtrl.textCtrl, 'MyNewTag') assert panel.GetTags() == ['MyNewTag'] assert panel.GetOptions() == ['MyNewTag']
def _test_TextTagPanel_nostyle(): sim = wx.UIActionSimulator() frame = wx.GetApp().GetTopWindow() panel = tt.TextTagPanel(frame, style=0) addall(frame, [panel]) result = [None] def handler(ev): result[0] = ev.tag panel.Bind(tt.EVT_TTP_TAG_ADDED, handler) tags = ['Tag1', 'Tag2', 'Tag3'] panel.SetOptions(tags) # Add an existing tag realYield() simtext(sim, panel.newTagCtrl.textCtrl, tags[0]) assert panel.GetTags() == [tags[0]] assert result[0] == tags[0] simtext(sim, panel.newTagCtrl.textCtrl, tags[2]) assert panel.GetTags() == [tags[0], tags[2]] assert result[0] == tags[2] # Duplicate result[0] = None simtext(sim, panel.newTagCtrl.textCtrl, tags[2]) assert panel.GetTags() == [tags[0], tags[2], tags[2]] assert result[0] == tags[2] # Case insensitive simtext(sim, panel.newTagCtrl.textCtrl, tags[1].lower()) assert panel.GetTags() == [tags[0], tags[2], tags[2], tags[1]] assert result[0] == tags[1] # Not in known tags result[0] = None simtext(sim, panel.newTagCtrl.textCtrl, 'notag') assert panel.GetTags() == [tags[0], tags[2], tags[2], tags[1]] assert result[0] is None
def _test_TextTagPanel_mouse_focus(): sim = wx.UIActionSimulator() frame = wx.GetApp().GetTopWindow() panel = tt.TextTagPanel(frame, style=tt.TTP_KEYBOARD_NAV) addall(frame, [panel]) result = [None] def handler(ev): print('Gaaaargh') result[0] = ev.tag panel.Bind(tt.EVT_TTP_TAG_SELECT, handler) panel.SetOptions(['tag1', 'tag2']) panel.AddTag('tag1') simclick(sim, panel.tags[0], stype=2) assert result[0] == 'tag1'
def _test_TextTagPanel_no_duplicates(): frame = wx.GetApp().GetTopWindow() sizer = wx.BoxSizer(wx.HORIZONTAL) panel = tt.TextTagPanel(frame, style=tt.TTP_NO_DUPLICATES) sizer.Add(panel, flag=wx.EXPAND) frame.SetSizer(sizer) frame.Layout() tags = ['Tag1', 'Tag2'] panel.SetOptions(tags) realYield() simtexttt(panel, tags[0]) assert panel.GetTags() == [tags[0]] # Duplicate should not be added simtexttt(panel, tags[0]) assert panel.GetTags() == [tags[0]] simtexttt(panel, tags[1]) assert panel.GetTags() == [tags[0], tags[1]]
def __createTags(self, labels=None): """Makes sure that a :class:`.TextTagPanel` exists for every label in the :class:`.LookupTable` and in the :class:`.VolumeLabels` for the current overlay. :arg labels: If ``None``, this method does what is described above. Otherwise, this must be a list of tuples of ``(name, display name)`` specifying labels which are known not to be present, and for which a ``TextTagPanel`` needs to be created. :returns: ``True`` if one or more new ``TextTagPanel`` widgets was created (and added to the :class:`.WidgetGrid`), ``False`` otherwise. """ # This method should never be called # if the current overlay is not set. if self.__overlay is None: return if labels is None: volLabels = self.__volLabels allLabels = volLabels.getAllLabels() # We need to display a row for all # the labels from the lut, and all # classification labels which are # not in the lut. lutLabels = [(l.internalName, l.name) for l in self.__lut] allLabels = [(l, volLabels.getDisplayLabel(l)) for l in allLabels if l not in lutLabels] labels = lutLabels + allLabels newCreated = False log.debug('Creating tag panels for: {}'.format([l[0] for l in labels])) # TODO Ensure that there is always # an 'unknown' tag... ? for label, displayName in labels: # A tag panel already exists for # this label, and must therefore # already be present in the grid. if label in self.__labelTags: continue newCreated = True tags = texttag.TextTagPanel(self.__grid, style=(texttag.TTP_NO_DUPLICATES | texttag.TTP_KEYBOARD_NAV)) # This panel is associated with # this label - this association # will never change, so we can # safely store the label on the # tag itself, making it easy to # figure out the label given a # tag object. tags._label = displayName row = self.__grid.GetGridSize()[0] self.__grid.InsertRow(row) self.__grid.SetText(row, 0, displayName) self.__grid.SetWidget(row, 1, tags) self.__labelTags[label] = tags tags.Bind(texttag.EVT_TTP_TAG_ADDED, self.__onTagAdded) tags.Bind(texttag.EVT_TTP_TAG_REMOVED, self.__onTagRemoved) tags.Bind(texttag.EVT_TTP_TAG_SELECT, self.__onTagSelect) return newCreated