예제 #1
0
class TestObjectListView(wtc.WidgetTestCase):
    """
    Setup of all base tests used for all types of ObjectListView's and do test the
    normal ObjectListView.

    The other ObjectListView tests just override setUp to create the appropriate ListView.
    """
    def setUp(self):
        super(TestObjectListView, self).setUp()

        panel = wx.Panel(self.frame, -1)
        self.objectListView = ObjectListView(panel,
                                             -1,
                                             style=wx.LC_REPORT
                                             | wx.SUNKEN_BORDER)
        sizerPanel = wx.BoxSizer(wx.VERTICAL)
        sizerPanel.Add(self.objectListView, 1, wx.ALL | wx.EXPAND, 4)
        panel.SetSizer(sizerPanel)

        sizerFrame = wx.BoxSizer(wx.VERTICAL)
        sizerFrame.Add(panel, 1, wx.ALL | wx.EXPAND, 4)
        self.frame.SetSizer(sizerFrame)

        loadOLV(self.objectListView)

    def testInitialState(self):
        self.objectListView.ClearAll()
        self.assertEqual(self.objectListView.GetColumnCount(), 0)
        self.assertEqual(self.objectListView.GetItemCount(), 0)
        self.assertEqual(len(self.objectListView.modelObjects), 0)
        loadOLV(self.objectListView)

    def testBasicState(self):
        self.assertEqual(self.objectListView.GetColumnCount(),
                         len(personColumns))
        self.assertEqual(self.objectListView.GetItemCount(), len(persons))

    def testSelectObject(self):
        self.objectListView.SelectObject(persons[0])
        self.assertEqual(self.objectListView.GetSelectedObject(), persons[0])

        males = [x for x in persons if x.sex == "Male"]
        self.objectListView.SelectObjects(males)
        self.assertEqual(set(self.objectListView.GetSelectedObjects()),
                         set(males))

    def testSelectAll(self):
        self.objectListView.SelectAll()
        for i in range(0, self.objectListView.GetItemCount()):
            self.assertTrue(self.objectListView.IsSelected(i))

    def testDeSelectAll(self):
        self.objectListView.SelectAll()
        self.objectListView.DeselectAll()
        for i in range(0, self.objectListView.GetItemCount()):
            self.assertFalse(self.objectListView.IsSelected(i))

    def testGetSelectedObject(self):
        self.objectListView.SelectAll()
        self.assertEqual(self.objectListView.GetSelectedObject(), None)

        self.objectListView.DeselectAll()
        self.assertEqual(self.objectListView.GetSelectedObject(), None)

        self.objectListView.SelectObject(persons[0])
        self.assertEqual(self.objectListView.GetSelectedObject(), persons[0])

        self.objectListView.SelectObject(persons[1], False)
        self.assertEqual(self.objectListView.GetSelectedObject(), None)

    def testGetSelectedObjects(self):
        self.objectListView.SelectAll()
        self.assertEqual(set(self.objectListView.GetSelectedObjects()),
                         set(persons))

        self.objectListView.SelectObject(persons[0])
        self.assertEqual(len(self.objectListView.GetSelectedObjects()), 1)

        self.objectListView.DeselectAll()
        self.assertEqual(len(self.objectListView.GetSelectedObjects()), 0)

    def testRefresh(self):
        rowIndex = 1
        primaryColumn = self.objectListView.GetPrimaryColumnIndex()
        person = self.objectListView[rowIndex]
        nameInList = self.objectListView.GetItem(rowIndex,
                                                 primaryColumn).GetText()
        self.assertEqual(nameInList, person.name)

        person.name = "Some different name"
        self.assertNotEqual(nameInList, person.name)

        self.objectListView.RefreshObject(person)
        self.assertEqual(
            self.objectListView.GetItem(rowIndex, primaryColumn).GetText(),
            person.name)
        person.name = nameInList

    def testSorting(self):
        self.objectListView.SortBy(0, False)
        self.assertEqual(
            self.objectListView.GetItem(0).GetText(), "Zoe Meliko")
        self.objectListView.SortBy(0, True)
        self.assertEqual(
            self.objectListView.GetItem(0).GetText(), "ae cummings")
        self.objectListView.SortBy(2, False)
        self.assertEqual(
            self.objectListView.GetItem(0).GetText(), "Ginger Hawk")
        self.objectListView.SortBy(2, True)
        self.assertEqual(
            self.objectListView.GetItem(0).GetText(), "Ian Janide")

    def testColumnResizing(self):
        widths = [
            self.objectListView.GetColumnWidth(i)
            for i in range(len(self.objectListView.columns))
        ]
        self.frame.SetSize(self.frame.GetSize() + (100, 100))
        self.objectListView.Layout()

        # The space filling columns should have increased in width, but the
        # others should be the same
        for (colIndex, oldWidth) in enumerate(widths):
            if self.objectListView.columns[colIndex].isSpaceFilling:
                self.assertTrue(
                    oldWidth < self.objectListView.GetColumnWidth(colIndex))
            else:
                self.assertEqual(oldWidth,
                                 self.objectListView.GetColumnWidth(colIndex))

    def testEditing(self):
        rowIndex = 1
        primaryColumnIndex = self.objectListView.GetPrimaryColumnIndex()
        self.objectListView.cellEditMode = ObjectListView.CELLEDIT_F2ONLY
        # self.objectListView.SortBy(primaryColumnIndex+1)

        originalName = self.objectListView[rowIndex].name
        self.assertEqual(
            self.objectListView.GetItem(rowIndex,
                                        primaryColumnIndex).GetText(),
            originalName)
        self.objectListView.DeselectAll()
        self.objectListView.SetItemState(
            rowIndex, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED,
            wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED)

        # Fake an F2, change the value of the edit, and then fake a Return to
        # commit the change
        evt = wx.KeyEvent(wx.EVT_CHAR.evtType[0])
        evt.m_keyCode = wx.WXK_F2
        self.objectListView._HandleChar(evt)
        self.objectListView.StartCellEdit(rowIndex, primaryColumnIndex)
        self.objectListView.cellEditor.SetValue("new name for X")
        self.objectListView.FinishCellEdit()
        evt.m_keyCode = wx.WXK_RETURN
        self.objectListView._HandleChar(evt)
        self.assertEqual(
            self.objectListView.GetItem(rowIndex,
                                        primaryColumnIndex).GetText(),
            "new name for X")

        # Put the original value back
        evt.m_keyCode = wx.WXK_F2
        self.objectListView._HandleChar(evt)
        self.objectListView.StartCellEdit(rowIndex, primaryColumnIndex)
        self.objectListView.cellEditor.SetValue(originalName)
        self.objectListView.FinishCellEdit()
        evt.m_keyCode = wx.WXK_RETURN
        self.objectListView._HandleChar(evt)
        self.assertEqual(
            self.objectListView.GetItem(rowIndex,
                                        primaryColumnIndex).GetText(),
            originalName)

    def testLackOfCheckboxes(self):
        self.objectListView.InstallCheckStateColumn(None)

        firstObject = self.objectListView[0]
        self.assertIn(self.objectListView.IsChecked(firstObject),
                      (None, False))

        self.assertEqual(self.objectListView.GetCheckedObjects(), list())

        self.objectListView.Check(firstObject)
        self.assertIn(self.objectListView.IsChecked(firstObject),
                      (None, False))

    def testCreateCheckStateColumn(self):
        self.objectListView.InstallCheckStateColumn(None)

        firstObject = self.objectListView[0]
        self.assertIn(self.objectListView.IsChecked(firstObject),
                      (False, None))

        self.objectListView.CreateCheckStateColumn()
        self.objectListView.Check(firstObject)
        self.assertEqual(self.objectListView.IsChecked(firstObject), True)

    def testAutoCheckboxes(self):
        col = ColumnDefn("Check")
        self.objectListView.AddColumnDefn(col)
        self.assertTrue(col.checkStateGetter is None)
        self.assertTrue(col.checkStateSetter is None)

        self.objectListView.InstallCheckStateColumn(col)
        self.assertTrue(col.checkStateGetter is not None)
        self.assertTrue(col.checkStateSetter is not None)

        object = self.objectListView[0]
        self.assertEqual(self.objectListView.IsChecked(object), False)

        self.objectListView.Check(object)
        self.assertEqual(self.objectListView.IsChecked(object), True)

    def testCheckboxes(self):
        def myGetter(modelObject):
            return getattr(modelObject, "isChecked", False)

        def mySetter(modelObject, newValue):
            modelObject.isChecked = newValue

        self.objectListView.SetImageLists()
        col = ColumnDefn("Check",
                         checkStateGetter=myGetter,
                         checkStateSetter=mySetter)
        self.objectListView.AddColumnDefn(col)
        self.assertEqual(self.objectListView.checkStateColumn, col)

        firstObject = self.objectListView[1]
        lastObject = self.objectListView[4]
        self.assertEqual(self.objectListView.IsChecked(firstObject), False)
        self.assertEqual(self.objectListView.IsChecked(lastObject), False)

        self.objectListView.Check(firstObject)
        self.assertEqual(self.objectListView.IsChecked(firstObject), True)
        self.assertEqual(self.objectListView.IsChecked(lastObject), False)

        self.objectListView.Check(lastObject)
        self.assertEqual(self.objectListView.IsChecked(firstObject), True)
        self.assertEqual(self.objectListView.IsChecked(lastObject), True)
        if not isinstance(self.objectListView, VirtualObjectListView):
            self.assertEqual(set(self.objectListView.GetCheckedObjects()),
                             set([firstObject, lastObject]))

        self.objectListView.Uncheck(firstObject)
        self.assertEqual(self.objectListView.IsChecked(firstObject), False)
        self.assertEqual(self.objectListView.IsChecked(lastObject), True)

        self.objectListView.ToggleCheck(lastObject)
        self.assertEqual(self.objectListView.IsChecked(firstObject), False)
        self.assertEqual(self.objectListView.IsChecked(lastObject), False)

    def testNoAlternateColours(self):
        # When there is no alternate colors, each row's background colour
        # should be invalid
        self.objectListView.useAlternateBackColors = False
        self.objectListView.RepopulateList()
        bkgdColours = [
            self.getBackgroundColour(i)
            for i in range(self.objectListView.GetItemCount())
        ]
        self.assertFalse(
            self.objectListView.oddRowsBackColor in set(bkgdColours))
        self.assertFalse(
            self.objectListView.evenRowsBackColor in set(bkgdColours))

    def testAlternateColours(self):
        self.objectListView.useAlternateBackColors = True
        self.objectListView.RepopulateList()
        for i in range(self.objectListView.GetItemCount()):
            if i & 1:
                self.assertEqual(self.objectListView.oddRowsBackColor,
                                 self.getBackgroundColour(i))
            else:
                self.assertEqual(self.objectListView.evenRowsBackColor,
                                 self.getBackgroundColour(i))

    def getBackgroundColour(self, i):
        # There is no consistent way to get the background color of an item (i.e. one that
        # works on both normal and virtual lists) so we have to split this into a method
        # so we can change it for a virtual list
        return self.objectListView.GetItemBackgroundColour(i)

    def testEmptyListMsg(self):
        self.objectListView.SetObjects(None)
        self.assertTrue(self.objectListView.stEmptyListMsg.IsShown())

        self.objectListView.SetObjects(persons)
        self.assertFalse(self.objectListView.stEmptyListMsg.IsShown())

    def testFilteringHead(self):
        self.objectListView.SetFilter(Filter.Head(1))
        self.objectListView.SetObjects(persons)
        self.assertEqual(len(self.objectListView.GetFilteredObjects()), 1)
        self.assertEqual(self.objectListView.GetFilteredObjects()[0],
                         persons[0])

        self.objectListView.SetFilter(None)

    def testFilteringTail(self):
        self.objectListView.SetFilter(Filter.Tail(1))
        self.objectListView.SetObjects(persons)
        # The group list will have a group header at row 0 so skip it
        if isinstance(self.objectListView, GroupListView):
            firstDataIndex = 1
        else:
            firstDataIndex = 0
        self.assertEqual(len(self.objectListView.GetFilteredObjects()), 1)
        self.assertEqual(self.objectListView.GetFilteredObjects()[0],
                         persons[-1])

        self.objectListView.SetFilter(None)

    def testFilteringPredicate(self):
        males = [x for x in persons if x.sex == "Male"]
        self.objectListView.SetFilter(
            Filter.Predicate(lambda person: person.sex == "Male"))
        self.objectListView.SetSortColumn(personColumns[-1])
        self.objectListView.SetObjects(persons)

        self.assertEqual(set(self.objectListView.GetFilteredObjects()),
                         set(males))

        self.objectListView.SetFilter(None)

    def testFilteringTextSearch(self):
        containsF = [
            x for x in persons
            if "f" in x.sex.lower() or "f" in x.name.lower()
        ]

        self.objectListView.SetFilter(
            Filter.TextSearch(self.objectListView, text="f"))
        self.objectListView.SetObjects(persons)
        self.assertEqual(set(self.objectListView.GetFilteredObjects()),
                         set(containsF))

        self.objectListView.SetFilter(None)

    def testFilteringChain(self):
        filterMale = Filter.Predicate(lambda person: person.sex == "Male")
        filterContainsF = Filter.TextSearch(self.objectListView, text="f")
        self.objectListView.SetFilter(Filter.Chain(filterMale,
                                                   filterContainsF))
        self.objectListView.SetObjects(persons)
        self.assertEqual(len(self.objectListView.GetFilteredObjects()), 1)
        self.assertEqual(self.objectListView.GetFilteredObjects()[0].name,
                         "Eric Fandango")

        self.objectListView.SetFilter(None)
예제 #2
0
class DataCoefPanel(wx.Frame):
    def __init__(self, parent):
        pos = wx.DefaultPosition
        size = (377, 282)
        if _platform == 'darwin':
            style = wx.DEFAULT_FRAME_STYLE
        else:
            style = (wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX
                     | wx.CLIP_CHILDREN | wx.FRAME_FLOAT_ON_PARENT)
        wx.Frame.__init__(self,
                          wx.GetApp().TopWindow, wx.ID_ANY,
                          p4R.Application_name + " - Strain and DW Values",
                          pos, size, style)
        self.Bind(wx.EVT_CLOSE, self.on_close)
        self.SetIcon(prog_icon.GetIcon())

        pnl = wx.Panel(self)

        def handleCellEditStarting(evt):
            currentCol = self.GetOLVColClicked(evt)
            if currentCol == 0:
                evt.Veto()

        def handleCellEditFinishing(evt):
            currentline = evt.rowIndex
            currentCol = self.GetOLVColClicked(evt)
            val = evt.cellValue
            self.update_param_dict(currentline, currentCol, val)

        self.list = ObjectListView(pnl,
                                   sortable=False,
                                   style=wx.LC_REPORT | wx.SUNKEN_BORDER,
                                   size=(450, 500))
        self.list.cellEditMode = ObjectListView.CELLEDIT_SINGLECLICK
        self.list.handleStandardKeys = False
        self.list.SetEmptyListMsg("This database has no rows")
        self.list.SetEmptyListMsgFont(
            wx.FFont(24, wx.DEFAULT, faceName="Tekton"))

        if _platform == "linux" or _platform == "linux2":
            self.width_name = 120
        else:
            self.width_name = 80
        self.width = 70
        self.widthCheck = 25
        self.col2checkstatus = {1: 0, 2: 0}

        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnItemSelected, self.list)
        self.list.Bind(EVT_CELL_EDIT_STARTING, handleCellEditStarting)
        self.list.Bind(EVT_CELL_EDIT_FINISHING, handleCellEditFinishing)

        mastersizer = wx.BoxSizer(wx.HORIZONTAL)
        mastersizer.Add(self.list, 0, wx.ALL | wx.EXPAND, 5)

        pub.subscribe(self.on_fill_list, pubsub_Fill_List_coef)
        pub.subscribe(self.on_open_window, pubsub_Open_data_coef_Window)

        #        self.Bind(wx.EVT_SIZE, self.OnSize)
        pnl.SetSizer(mastersizer)
        pnl.Layout()
        pnl.Fit()
        self.InitializeList()

    def on_open_window(self):
        self.CenterOnParent()

    def on_close(self, event):
        pub.sendMessage(pubsub_Hide_Show_data_coef, test=1)

    def InitializeList(self):
        temp = []
        ic_ = prog_icon_curve.GetBitmap()
        ImageIndex = self.list.AddImages(ic_)
        self.list.AddNamedImages("name", ic_)

        temp.append(
            ColumnDefn(headercolumnname[0],
                       "center",
                       self.width_name,
                       valueGetter=headercolumnname[0],
                       imageGetter=ImageIndex,
                       maximumWidth=self.width_name))
        temp.append(
            ColumnDefn(headercolumnname[1],
                       "center",
                       self.width,
                       valueGetter="sp",
                       maximumWidth=self.width,
                       checkStateGetter="state1"))
        temp.append(
            ColumnDefn(headercolumnname[3],
                       "center",
                       self.width,
                       valueGetter="dwp",
                       maximumWidth=self.width,
                       checkStateGetter="state2"))
        self.list.SetColumns(temp)

    def on_fill_list(self):
        a = P4Rm()
        self.Freeze()
        list_temp = []
        roundval = 3
        if a.AllDataDict['model'] == 2:
            for i in range(7):
                name = asym_pv[i]
                val_sp = str(round(a.ParamDict['sp'][i], roundval))
                val_dwp = str(round(a.ParamDict['dwp'][i], roundval))
                check_sp = a.ParamDict['state_sp'][i]
                check_dwp = a.ParamDict['state_dwp'][i]
                list_temp.append(
                    CoefListData(name, val_sp, check_sp, val_dwp, check_dwp))
        else:
            len_sp = len(a.ParamDict['sp'])
            len_dwp = len(a.ParamDict['dwp'])
            if len_sp > len_dwp:
                num = len_sp
            else:
                num = len_dwp
            for i in range(num):
                if i < len_sp:
                    val_sp = str(round(a.ParamDict['sp'][i], roundval))
                    check_sp = a.ParamDict['state_sp'][i]
                else:
                    val_sp = ""
                    check_sp = True
                if i < len_dwp:
                    val_dwp = str(round(a.ParamDict['dwp'][i], roundval))
                    check_dwp = a.ParamDict['state_dwp'][i]
                else:
                    val_dwp = ""
                    check_dwp = True
                list_temp.append(
                    CoefListData(i + 1, val_sp, check_sp, val_dwp, check_dwp))
        self.list.SetObjects(list_temp)
        self.Thaw()

    def update_param_dict(self, currentline, currentCol, val):
        if currentCol == 1:
            P4Rm.ParamDict['sp'][currentline] = float(val)
        if currentCol == 2:
            P4Rm.ParamDict['dwp'][currentline] = float(val)
        self.read_and_update()

    def read_and_update(self):
        pub.sendMessage(pubsub_update_sp_dwp_eta)
        b = Calcul4Radmax()
        b.on_update()

    def OnItemSelected(self, event):
        if 'phoenix' in wx.PlatformInfo:
            currentline = event.Index
        else:
            currentline = event.m_itemIndex
        currentCol = self.GetOLVColClicked(event)
        if currentline == -1:
            self.Freeze()
            if currentCol == 1 or currentCol == 2:
                if self.col2checkstatus[currentCol] == 0:
                    val = False
                    self.col2checkstatus[currentCol] = 1
                else:
                    val = True
                    self.col2checkstatus[currentCol] = 0
                objects = self.list.GetObjects()
                if currentCol == 1:
                    for obj in objects:
                        obj.state1 = val
                elif currentCol == 2:
                    for obj in objects:
                        obj.state2 = val
                self.list.SetObjects(objects)
                self.list.RefreshObject(objects)
            self.Thaw()
        if currentCol == 1 or currentCol == 2:
            a = P4Rm()
            objects = self.list.GetObjects()
            len_sp = len(a.ParamDict['sp'])
            len_dwp = len(a.ParamDict['dwp'])
            check_sp = []
            check_dwp = []
            i = 0
            for obj in objects:
                if i < len_sp:
                    check_sp.append(obj.state1)
                if i < len_dwp:
                    check_dwp.append(obj.state2)
                i += 1
            P4Rm.ParamDict['state_sp'] = check_sp
            P4Rm.ParamDict['state_dwp'] = check_dwp

    def GetOLVColClicked(self, event):
        """
        [email protected]  2011-01 Jan-13
        For use with a 3rd party module named ObjectListView
        used with wxPython.
        """

        spt = wx.GetMousePosition()
        fpt = self.list.ScreenToClient(spt)
        x, y = fpt
        last_col = 0
        for col in range(self.list.GetColumnCount()):
            col_width = self.list.GetColumnWidth(col)
            left_pxl_col = last_col
            right_pxl_col = last_col + col_width - 1

            if left_pxl_col <= x <= right_pxl_col:
                col_selected = col
                break
            col_selected = None
            last_col = last_col + col_width
        return col_selected

    def OnSize(self, event):
        sizet = event.GetSize()
        print("%s, %s" % (sizet.width, sizet.height))
        event.Skip()