Exemple #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)
Exemple #2
0
class MainPanel(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)
        self.search_results = []
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)
        self.create_ui()
        self.SetSizer(self.main_sizer)
        pub.subscribe(self.update_search_results, 'update')

        module_path = os.path.dirname(os.path.abspath(__file__))
        self.config = os.path.join(module_path, 'config.ini')
        if not os.path.exists(self.config):
            message = 'Unable to find grin3 for text searches. ' \
                       'Install grin3 and open preferences to ' \
                       'configure it:  pip install grin3'
            self.show_error(message)

    def create_ui(self):
        # Create the widgets for the search path
        row_sizer = wx.BoxSizer()
        lbl = wx.StaticText(self, label='Location:')
        row_sizer.Add(lbl, 0, wx.ALL | wx.CENTER, 5)
        self.directory = wx.TextCtrl(self, style=wx.TE_READONLY)
        row_sizer.Add(self.directory, 1, wx.ALL | wx.EXPAND, 5)
        open_dir_btn = wx.Button(self, label='Choose Folder')
        open_dir_btn.Bind(wx.EVT_BUTTON, self.on_choose_folder)
        row_sizer.Add(open_dir_btn, 0, wx.ALL, 5)
        self.main_sizer.Add(row_sizer, 0, wx.EXPAND)

        # Add search bar
        self.search_ctrl = wx.SearchCtrl(self,
                                         style=wx.TE_PROCESS_ENTER,
                                         size=(-1, 25))
        self.search_ctrl.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, self.on_search)
        self.search_ctrl.Bind(wx.EVT_TEXT_ENTER, self.on_search)
        self.main_sizer.Add(self.search_ctrl, 0, wx.ALL | wx.EXPAND, 5)

        # Search results widget
        self.search_results_olv = ObjectListView(self,
                                                 style=wx.LC_REPORT
                                                 | wx.SUNKEN_BORDER)
        self.search_results_olv.SetEmptyListMsg("No Results Found")
        self.search_results_olv.Bind(wx.EVT_LIST_ITEM_SELECTED,
                                     self.on_selection)
        self.main_sizer.Add(self.search_results_olv, 1, wx.ALL | wx.EXPAND, 5)
        self.update_ui()

        self.results_txt = wx.TextCtrl(self,
                                       style=wx.TE_MULTILINE | wx.TE_READONLY)
        self.main_sizer.Add(self.results_txt, 1, wx.ALL | wx.EXPAND, 5)

        show_result_btn = wx.Button(self, label='Open Containing Folder')
        show_result_btn.Bind(wx.EVT_BUTTON, self.on_show_result)
        self.main_sizer.Add(show_result_btn, 0, wx.ALL | wx.CENTER, 5)

    def on_choose_folder(self, event):
        with wx.DirDialog(
                self,
                "Choose a directory:",
                style=wx.DD_DEFAULT_STYLE,
        ) as dlg:
            if dlg.ShowModal() == wx.ID_OK:
                self.directory.SetValue(dlg.GetPath())

    def on_selection(self, event):
        current_selection = self.search_results_olv.GetSelectedObject()
        self.results_txt.SetValue('\n'.join(current_selection.data))

    def on_show_result(self, event):
        """
        Attempt to open the folder that the result was found in
        """
        result = self.search_results_olv.GetSelectedObject()
        if result:
            path = os.path.dirname(result.path)
            try:
                if sys.platform == 'darwin':
                    subprocess.check_call(['open', '--', path])
                elif 'linux' in sys.platform:
                    subprocess.check_call(['xdg-open', path])
                elif sys.platform == 'win32':
                    subprocess.check_call(['explorer', path])
            except:
                if sys.platform == 'win32':
                    # Ignore error on Windows as there seems to be
                    # a weird return code on Windows
                    return

                message = f'Unable to open file manager to {path}'
                self.show_error(message)

    def on_search(self, event):
        search_term = self.search_ctrl.GetValue()
        self.search(search_term)

    def search(self, search_term):
        """
        Search for the specified term in the directory and its
        sub-directories
        """
        folder = self.directory.GetValue()
        config = ConfigParser()
        config.read(self.config)
        try:
            grin = config.get("Settings", "grin")
        except NoSectionError:
            self.show_error('Settings or grin section not found')
            return

        if not os.path.exists(grin):
            self.show_error(f'Grin location does not exist {grin}')
            return
        if folder:
            self.search_results = []
            SearchThread(folder, search_term)

    def show_error(self, message):
        with wx.MessageDialog(None,
                              message=message,
                              caption='Error',
                              style=wx.ICON_ERROR) as dlg:
            dlg.ShowModal()

    def update_search_results(self, results):
        """
        Called by pubsub from thread
        """
        for key in results:
            if os.path.exists(key):
                stat = os.stat(key)
                modified_time = stat.st_mtime
                result = SearchResult(key, modified_time, results[key])
                self.search_results.append(result)

        if results:
            self.update_ui()
        else:
            search_term = self.search_ctrl.GetValue()
            self.search_results_olv.ClearAll()
            msg = f'No Results Found for: "{search_term}"'
            self.search_results_olv.SetEmptyListMsg(msg)

    def update_ui(self):
        self.search_results_olv.SetColumns([
            ColumnDefn("File Path", "left", 800, "path"),
            ColumnDefn("Modified Time", "left", 150, "modified")
        ])
        self.search_results_olv.SetObjects(self.search_results)
Exemple #3
0
class LeftPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        self.plots = []
        self.pickedColors = []
        self.colors = self.setupColors()
        self.plotsOlv = ObjectListView(self,
                                       wx.ID_ANY,
                                       style=wx.LC_REPORT | wx.SUNKEN_BORDER,
                                       useAlternateBackColors=False)
        self.plotsOlv.Bind(OLVEvent.EVT_ITEM_CHECKED, self.checkboxClicked)
        self.plotsOlv.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.onDoubleClick)
        #self.plotsOlv.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.onRightClick)
        self.getPlots()
        self.setColumns()
        self.plotsOlv.CreateCheckStateColumn()
        self.plotsOlv.SetObjects(self.plots)
        bsizer = wx.BoxSizer()
        #bsizer.Add(lb, 1, wx.EXPAND)
        bsizer.Add(self.plotsOlv, 1, wx.EXPAND)
        self.SetSizer(bsizer)
        self.checkedPlots = {}
        pub.subscribe(self.refreshList, 'list.updated')
        pub.subscribe(self.checkboxClicked, 'checkbox.clicked')
        pub.subscribe(self.onSavePlot, 'file.savePlot')
        pub.subscribe(self.onDelete, 'edit.delete')

    def onDoubleClick(self, event):
        #print event.m_itemIndex
        dlg = wx.ColourDialog(self)
        # Ensure the full colour dialog is displayed,
        # not the abbreviated version.
        dlg.GetColourData().SetChooseFull(True)
        if dlg.ShowModal() == wx.ID_OK:
            data = dlg.GetColourData()
        color = data.GetColour().Get()
        htmlColor = "#%02x%02x%02x" % color
        dlg.Destroy()
        index = event.m_itemIndex
        stored.plots[index]['Color'] = htmlColor
        self.plots[index].icon = self.plots[index].createIcon(
            self.plotsOlv, htmlColor)
        self.plotsOlv.RefreshObject(self.plots[index])
        pub.sendMessage('item.checked', data=self.checkedPlots)

    def onDelete(self):
        if self.plotsOlv.GetSelectedObjects():
            objectList = self.plotsOlv.GetSelectedObjects()
            for object in objectList:
                index = object.index
                stored.plots.pop(index)
                self.plots.pop(index)
            self.refreshList()
            pub.sendMessage('update.statusBar', data="Plots deleted!")
        else:
            pub.sendMessage(
                'update.statusBar',
                data="Cannot delete plots! Please select one ore more plots!")

    def onSavePlot(self):
        if self.plotsOlv.GetSelectedObject():
            index = self.plotsOlv.GetSelectedObject().index
            data = stored.plots[index]
            outputString = "%s\n" % data['Title']
            outputString += "%s\n" % data['Type']
            outputString += "%s,%s\n" % (data['xTitle'], data['xTitle'])
            for idx, row in enumerate(data['xData'].tolist()):
                z = 0
                outputString += "%1.3f,%1.3f\n" % (data['xData'][idx],
                                                   data['yData'][idx])
            if stored.plots[index]['Type'] == "DifferenceMap" or stored.plots[
                    index]['Type'] == "DistanceMap":
                outputString += "z-Data:\n"
                numpy.set_printoptions(threshold=numpy.nan)
                zData = numpy.array_str(data['zData'])
                outputString += zData
            dialog = wx.FileDialog(None,
                                   message="Save plot data as ...",
                                   defaultDir=os.getcwd(),
                                   defaultFile=stored.plots[index]['Title'],
                                   wildcard="*.dat",
                                   style=wx.SAVE | wx.OVERWRITE_PROMPT)
            if dialog.ShowModal() == wx.ID_OK:
                path = dialog.GetPath()
                dataFile = open(path, 'w')
                print "\nSaving data...",
                dataFile.write(outputString)
                print "Done!\n"
                dataFile.close()
            dialog.Destroy()
            pub.sendMessage('update.statusBar', data="Plot data saved!")
        else:
            pub.sendMessage('update.statusBar',
                            data="Cannot save data! Please select one plot!")

    def setupColors(self):
        cnames = {
            'aliceblue': '#F0F8FF',
            'antiquewhite': '#FAEBD7',
            'aqua': '#00FFFF',
            'aquamarine': '#7FFFD4',
            'azure': '#F0FFFF',
            'beige': '#F5F5DC',
            'bisque': '#FFE4C4',
            'black': '#000000',
            'blanchedalmond': '#FFEBCD',
            'blue': '#0000FF',
            'blueviolet': '#8A2BE2',
            'brown': '#A52A2A',
            'burlywood': '#DEB887',
            'cadetblue': '#5F9EA0',
            'chartreuse': '#7FFF00',
            'chocolate': '#D2691E',
            'coral': '#FF7F50',
            'cornflowerblue': '#6495ED',
            'cornsilk': '#FFF8DC',
            'crimson': '#DC143C',
            'cyan': '#00FFFF',
            'darkblue': '#00008B',
            'darkcyan': '#008B8B',
            'darkgoldenrod': '#B8860B',
            'darkgray': '#A9A9A9',
            'darkgreen': '#006400',
            'darkkhaki': '#BDB76B',
            'darkmagenta': '#8B008B',
            'darkolivegreen': '#556B2F',
            'darkorange': '#FF8C00',
            'darkorchid': '#9932CC',
            'darkred': '#8B0000',
            'darksalmon': '#E9967A',
            'darkseagreen': '#8FBC8F',
            'darkslateblue': '#483D8B',
            'darkslategray': '#2F4F4F',
            'darkturquoise': '#00CED1',
            'darkviolet': '#9400D3',
            'deeppink': '#FF1493',
            'deepskyblue': '#00BFFF',
            'dimgray': '#696969',
            'dodgerblue': '#1E90FF',
            'firebrick': '#B22222',
            'floralwhite': '#FFFAF0',
            'forestgreen': '#228B22',
            'fuchsia': '#FF00FF',
            'gainsboro': '#DCDCDC',
            'ghostwhite': '#F8F8FF',
            'gold': '#FFD700',
            'goldenrod': '#DAA520',
            'gray': '#808080',
            'green': '#008000',
            'greenyellow': '#ADFF2F',
            'honeydew': '#F0FFF0',
            'hotpink': '#FF69B4',
            'indianred': '#CD5C5C',
            'indigo': '#4B0082',
            'ivory': '#FFFFF0',
            'khaki': '#F0E68C',
            'lavender': '#E6E6FA',
            'lavenderblush': '#FFF0F5',
            'lawngreen': '#7CFC00',
            'lemonchiffon': '#FFFACD',
            'lightblue': '#ADD8E6',
            'lightcoral': '#F08080',
            'lightcyan': '#E0FFFF',
            'lightgoldenrodyellow': '#FAFAD2',
            'lightgreen': '#90EE90',
            'lightgray': '#D3D3D3',
            'lightpink': '#FFB6C1',
            'lightsalmon': '#FFA07A',
            'lightseagreen': '#20B2AA',
            'lightskyblue': '#87CEFA',
            'lightslategray': '#778899',
            'lightsteelblue': '#B0C4DE',
            'lightyellow': '#FFFFE0',
            'lime': '#00FF00',
            'limegreen': '#32CD32',
            'linen': '#FAF0E6',
            'magenta': '#FF00FF',
            'maroon': '#800000',
            'mediumaquamarine': '#66CDAA',
            'mediumblue': '#0000CD',
            'mediumorchid': '#BA55D3',
            'mediumpurple': '#9370DB',
            'mediumseagreen': '#3CB371',
            'mediumslateblue': '#7B68EE',
            'mediumspringgreen': '#00FA9A',
            'mediumturquoise': '#48D1CC',
            'mediumvioletred': '#C71585',
            'midnightblue': '#191970',
            'mintcream': '#F5FFFA',
            'mistyrose': '#FFE4E1',
            'moccasin': '#FFE4B5',
            'navajowhite': '#FFDEAD',
            'navy': '#000080',
            'oldlace': '#FDF5E6',
            'olive': '#808000',
            'olivedrab': '#6B8E23',
            'orange': '#FFA500',
            'orangered': '#FF4500',
            'orchid': '#DA70D6',
            'palegoldenrod': '#EEE8AA',
            'palegreen': '#98FB98',
            'paleturquoise': '#AFEEEE',
            'palevioletred': '#DB7093',
            'papayawhip': '#FFEFD5',
            'peachpuff': '#FFDAB9',
            'peru': '#CD853F',
            'pink': '#FFC0CB',
            'plum': '#DDA0DD',
            'powderblue': '#B0E0E6',
            'purple': '#800080',
            'red': '#FF0000',
            'rosybrown': '#BC8F8F',
            'royalblue': '#4169E1',
            'saddlebrown': '#8B4513',
            'salmon': '#FA8072',
            'sandybrown': '#FAA460',
            'seagreen': '#2E8B57',
            'seashell': '#FFF5EE',
            'sienna': '#A0522D',
            'silver': '#C0C0C0',
            'skyblue': '#87CEEB',
            'slateblue': '#6A5ACD',
            'slategray': '#708090',
            'snow': '#FFFAFA',
            'springgreen': '#00FF7F',
            'steelblue': '#4682B4',
            'tan': '#D2B48C',
            'teal': '#008080',
            'thistle': '#D8BFD8',
            'tomato': '#FF6347',
            'turquoise': '#40E0D0',
            'violet': '#EE82EE',
            'wheat': '#F5DEB3',
            'white': '#FFFFFF',
            'whitesmoke': '#F5F5F5',
            'yellow': '#FFFF00',
            'yellowgreen': '#9ACD32'
        }
        return cnames

    def setColumns(self, data=None):
        self.plotsOlv.SetColumns([
            #imageGetter: "icon" is a property of plotListEntry objects
            ColumnDefn("Title", "left", 500, "title", imageGetter="icon")
        ])
        #print "hallo"

    def refreshList(self):
        self.plotsOlv.ClearAll()
        self.plots = []
        self.pickedColors = []
        self.colors = self.setupColors()
        self.getPlots()
        self.setColumns()
        self.plotsOlv.CreateCheckStateColumn()
        self.plotsOlv.SetObjects(self.plots)
        self.checkedPlots = {}

    def getPlots(self):
        for idx, plot in enumerate(stored.plots):
            #print self.colors
            if not "Color" in plot:
                allowedColor = False
                preferredCnames = {
                    'blue': '#0000FF',
                    'green': '#008000',
                    'red': '#FF00FF',
                    'orange': '#FFA500',
                    'violet': '#EE82EE',
                    'magenta': '#FF0000'
                }
                while not allowedColor:
                    if len(preferredCnames) > 0:
                        color = preferredCnames.popitem()[1]
                    else:
                        color = self.colors.popitem()[1]
                    if not color in self.pickedColors:
                        allowedColor = True
                    self.pickedColors.append(color)
                    #print color
                plot['Color'] = color
            else:
                pass
            olv = self.plotsOlv
            self.plots.append(
                PlotListEntry(olv, plot['Type'], plot['Title'], plot['Color'],
                              idx))
        #print self.plots

    def checkboxClicked(self, data):
        data.rowModel.toggleState()
        index = data.rowModel.index
        isChecked = data.rowModel.isChecked
        currentPlot = stored.plots[index]
        currentId = index
        currentType = currentPlot["Type"]
        allowed = True
        nonSuperposeableTypes = ["DifferenceMap", "DistanceMap"]
        if len(self.checkedPlots) == 0 and isChecked:
            #this is the first checked plot, just add it
            self.checkedPlots[currentId] = currentPlot
            #print "Added first plot"
        elif len(self.checkedPlots) > 0 and isChecked:
            #check if of same type as other checked plots
            for key, value in self.checkedPlots.iteritems():
                #value will be a graph dict from mtsslWizard
                if currentType != value[
                        "Type"] or currentType in nonSuperposeableTypes:
                    allowed = False
                    #print "False, cannot add plot"
            if allowed:
                self.checkedPlots[currentId] = currentPlot
                #print "True, plot added"
            else:
                #self.lb.Check(index, check=False)
                print "New:"
                print self.plotsOlv.GetCheckState(data.rowModel)
                self.plotsOlv.SetCheckState(data.rowModel, False)
                #data.rowModel.setCheckedState(False)
                pub.sendMessage(
                    'update.statusBar',
                    data="Plots are not of same type or not superposeable!")
                print self.plotsOlv.GetCheckState(data.rowModel)
                self.plotsOlv.RefreshObject(data.rowModel)
        elif len(self.checkedPlots) > 0 and not isChecked:
            self.checkedPlots.pop(currentId, None)
            #print "removed plot from plot list"
        pub.sendMessage('item.checked', data=self.checkedPlots)
class BooksDBPanel(wx.Panel):
    """
    A panel for Books database construction.
    """
    def __init__(self, parent):

        self.engine = None
        if not os.path.exists("books.db"):
            self.CreateDB("books.db")
        else:
            self.engine = create_engine("sqlite:///books.db")
        self.session = sqlafuns.getsqlsess(self.engine)

        super().__init__(parent)
        vsizer = VBoxSizer()

        hsizer1 = wx.BoxSizer()
        combolab = wx.StaticText(self, label="Pick a table:")
        self.tablenames = [BookTable.__tablename__, SeriesTable.__tablename__]
        self.tablecombo = wx.Choice(self, choices=self.tablenames)
        self.tablecombo.SetSelection(0)
        self.tablecombo.Bind(wx.EVT_CHOICE, self.OnChoice)
        self.current_table = self.tablecombo.GetStringSelection()
        hsizer1.Add(combolab)
        hsizer1.Add(self.tablecombo)
        vsizer.Add(hsizer1, 0, wx.CENTER)

        self.olvtable = ObjectListView(self, style=wx.LC_REPORT)
        vsizer.Add(self.olvtable, 1, wx.EXPAND)

        hsizer2 = wx.BoxSizer()
        addbtn = wx.Button(self, label="Add a row")
        addbtn.Bind(wx.EVT_BUTTON, self.OnAdd)
        hsizer2.Add(addbtn)
        editbtn = wx.Button(self, label="Edit a row")
        editbtn.Bind(wx.EVT_BUTTON, self.OnEdit)
        hsizer2.Add(editbtn)
        delbtn = wx.Button(self, label="Delete a row")
        delbtn.Bind(wx.EVT_BUTTON, self.OnDelete)
        hsizer2.Add(delbtn)
        vsizer.Add(hsizer2, 0, wx.CENTER)

        self.SetSizer(vsizer)

        self.AddCols("book")

    def CreateDB(self, dbfilename):

        self.engine = create_engine(f"sqlite:///{dbfilename}")
        Base.metadata.create_all(self.engine)

    def AddCols(self, current_table):

        self.olvtable.ClearAll()
        if current_table == "book":
            self.olvtable.SetColumns([
                ColumnDefn("Book Id", "left", 50, "book_id"),
                ColumnDefn("Title", "left", 200, "title"),
                ColumnDefn("Author", "left", 200, "author"),
                ColumnDefn("Copyright Year", 'left', 200, "copyright_year"),
                ColumnDefn("Series", "left", 200, "seriesname")
            ])
        elif current_table == "series":
            self.olvtable.SetColumns([
                ColumnDefn("Series Id", "left", 50, "series_id"),
                ColumnDefn("Series Name", "left", 200, "seriesname"),
                ColumnDefn("Books Total", "left", 200, "bookstotal")
            ])
        self.ShowAll(current_table)

    def ShowAll(self, current_table):

        self.olvtable.DeleteAllItems()
        if current_table == "book":
            result = self.session.query(
                BookTable.book_id, BookTable.title, BookTable.author,
                BookTable.copyright_year,
                SeriesTable.seriesname).join(SeriesTable)
            for row in result:
                rowinstance = OlvBookTable(row.book_id, row.title, row.author,
                                           row.copyright_year, row.seriesname)
                self.olvtable.AddObject(rowinstance)
        elif current_table == "series":
            result = self.session.query(SeriesTable)
            for row in result:
                rowinstance = OlvSeriesTable(row.series_id, row.seriesname,
                                             row.bookstotal)
                self.olvtable.AddObject(rowinstance)

    def OnChoice(self, event):

        self.current_table = self.tablecombo.GetStringSelection()
        self.AddCols(self.current_table)
        event.Skip()

    def OnAdd(self, event):

        if self.current_table == "book":
            AddRowtoBookDBDialog(self).ShowModal()
        elif self.current_table == "series":
            AddRowtoSeriesDBDialog(self).ShowModal()
        self.ShowAll(self.current_table)
        event.Skip()

    def OnEdit(self, event):

        rowobj = self.olvtable.GetSelectedObject()
        if self.current_table == "book":
            EditBookRowDialog(self, rowobj=rowobj).ShowModal()
        elif self.current_table == "series":
            EditSeriesRowDialog(self, rowobj=rowobj).ShowModal()
        self.ShowAll(self.current_table)
        event.Skip()

    def OnDelete(self, event):

        rowobj = self.olvtable.GetSelectedObject()
        if self.current_table == "book":
            target = self.session.query(BookTable).filter_by(
                book_id=rowobj.book_id).one()
            self.session.delete(target)
            self.session.commit()
            self.session.close()
        if self.current_table == "series":
            target = self.session.query(SeriesTable).filter_by(
                book_id=rowobj.book_id).one()
            self.session.delete(target)
            self.session.commit()
            self.session.close()
        self.ShowAll(self.current_table)
        event.Skip()
Exemple #5
0
class queries(wx.Panel):
    def __init__(self, parent, id=-1, title=None, ptID=None):
        wx.Panel.__init__(self, parent, id, title)
        self.ptID = ptID

        #sizers
        top = wx.BoxSizer(wx.HORIZONTAL)
        midtop = wx.BoxSizer(wx.VERTICAL)
        mainsizer = wx.BoxSizer(wx.VERTICAL)

        #list of table names in gecko, goes in top
        tables = [{'title':'allergies'}, {'title':'consultants'}, {'title':'demographics'}, {'title':'icd_9'}, {'title':'meds'}, \
                  {'title':'notes'}, {'title':'past_history'}, {'title':'problems'}, {'title':'todo'}, {'title':'vitals'}]
        self.tablesList = ObjectListView(self,
                                         -1,
                                         style=wx.LC_REPORT | wx.SUNKEN_BORDER)
        self.tablesList.SetColumns(
            [ColumnDefn("Tables", "center", 300, valueGetter='title')])
        self.tablesList.SetObjects(tables)
        top.Add(self.tablesList, 3, wx.EXPAND | wx.ALL, 5)

        #buttons go in midtop; midtop goes in top sizer
        btns = (('Show Columns', self.OnShowColumns), ('Delete Query',
                                                       self.OnDelQuery),
                ('Run Query', self.OnRunQuery), ('Print Query',
                                                 self.OnPrintQuery))
        for label, handler in btns:
            EMR_utilities.buildOneButton(self, self, label, handler, midtop)
        top.Add(midtop, 1, wx.EXPAND | wx.ALL, 5)

        #columns list goes in top sizer
        self.columns = []
        self.columnsList = ObjectListView(self,
                                          -1,
                                          style=wx.LC_REPORT
                                          | wx.SUNKEN_BORDER)
        self.columnsList.SetColumns(
            [ColumnDefn("Columns", "center", 300, valueGetter="Field")])
        self.columnsList.SetObjects(self.columns)
        top.Add(self.columnsList, 3, wx.EXPAND | wx.ALL, 5)
        mainsizer.Add(top, 3, wx.EXPAND)

        #textctrl for 'where' statement goes below top sizer in main sizer
        self.wherectrl = wx.TextCtrl(self, -1, size=(-1, -1))
        wheretxt = wx.StaticText(
            self, -1, 'e.g. WHERE patient_ID > 1000 AND short_des LIKE %%DM%%')
        mainsizer.Add(self.wherectrl, 1, wx.EXPAND | wx.ALL, 5)
        mainsizer.Add((-1, 10))
        mainsizer.Add(wheretxt, 1, wx.EXPAND | wx.ALL, 5)

        #results list goes below 'where' statement in mainsizer

        self.resultsList = ObjectListView(self,
                                          -1,
                                          style=wx.LC_REPORT
                                          | wx.SUNKEN_BORDER)
        mainsizer.Add(self.resultsList, 5, wx.EXPAND | wx.ALL, 5)
        self.SetSizer(mainsizer)

    def OnShowColumns(self, event):
        self.selTables = self.tablesList.GetSelectedObjects()
        for items in self.selTables:
            self.columns = self.columns + list(
                EMR_utilities.getAllDictData(
                    ('SHOW COLUMNS IN %s;' % items['title'])))
        self.columnsList.SetObjects(self.columns)

    def OnDelQuery(self, event):
        self.columns = []
        self.columnsList.ClearAll()
        self.resultsList.ClearAll()
        self.columnsList.SetColumns(
            [ColumnDefn("Columns", "center", 300, valueGetter="Field")])
        self.columnsList.SetObjects(self.columns)

    def OnRunQuery(self, event):
        columnList = ""
        defnList = []
        if self.wherectrl == '':
            msg = wx.MessageDialog(self, "Do you want a WHERE statement?",
                                   "Question", wx.YES | wx.NO | wx.CANCEL)
            msg.ShowModal()
        else:
            if self.columnsList.GetSelectedItemCount() > 1:
                selColumns = self.columnsList.GetSelectedObjects()
            elif self.columnsList.GetSelectedItemCount() == 0:
                msg = wx.MessageDialog(self, "Please select a column", "Info",
                                       wx.OK)
                msg.ShowModal()
            else:
                selColumns = self.columnsList.GetSelectedObject()
            for items in selColumns:
                columnList = columnList + items["Field"] + ', '
            columnList = columnList.rstrip(', ')
            if self.tablesList.GetSelectedItemCount() == 3:
                qry = "SELECT %s FROM %s INNER JOIN %s USING (patient_ID) INNER JOIN %s USING (patient_ID) %s"  % \
                      (columnList, self.selTables[0]['title'], self.selTables[1]['title'], self.selTables[2]['title'], self.wherectrl.GetValue())
            elif self.tablesList.GetSelectedItemCount() == 2:
                qry = "SELECT %s FROM %s INNER JOIN %s USING (patient_ID) %s" % (
                    columnList, self.selTables[0]['title'],
                    self.selTables[1]['title'], self.wherectrl.GetValue())
            else:
                qry = "SELECT %s FROM %s %s" % (columnList,
                                                self.selTables[0]['title'],
                                                self.wherectrl.GetValue())
            results = list(EMR_utilities.getAllDictData(qry))
            for items in selColumns:
                defn = ColumnDefn(items["Field"].capitalize(),
                                  "center",
                                  100,
                                  valueGetter=items["Field"])
                defnList.append(defn)
            self.resultsList.SetColumns(defnList)
            self.resultsList.SetObjects(results)

    def OnPrintQuery(self, event):
        prnt = ListCtrlPrinter()
        #prntPreview = prnt.printout.GetPrintPreview()
        prnt.Clear()
        prnt.AddListCtrl(self.resultsList)
        prnt.Watermark = 'SIHF'
        prnt.Print()