예제 #1
0
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]
예제 #2
0
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]
예제 #3
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() == []
예제 #4
0
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)
예제 #5
0
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() == []
예제 #6
0
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)
예제 #7
0
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]]
예제 #8
0
    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()
예제 #9
0
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() == []
예제 #10
0
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()
예제 #11
0
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']
예제 #12
0
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
예제 #13
0
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'
예제 #14
0
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]]
예제 #15
0
    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