source: orange-bioinformatics/widgets/prototypes/OWDataFilesSelector.py @ 1039:7ca5be458a9a

Revision 1039:7ca5be458a9a, 6.8 KB checked in by blaz <blaz.zupan@…>, 4 years ago (diff)

remove category in header

Line 
1"""
2<name>Data Files Selector</name>
3<description>Selects a subset of data files.</description>
4<icon>icons/DataFilesSelector.png</icon>
5<priority>1060</priority>
6<contact>Peter Juvan (peter.juvan@fri.uni-lj.si)</contact>
7"""
8
9from OWWidget import *
10import OWGUI
11from OWDataFiles import DataFiles, ExampleSelection
12
13
14class OWDataFilesSelector(OWWidget):
15    settingsList  = ["applyOnChange"]
16
17    def __init__(self, parent=None, signalManager = None):
18        OWWidget.__init__(self, parent, signalManager, 'Data Files Selector', wantMainArea = 0, resizingEnabled = 1)
19
20        self.callbackDeposit = []
21
22        self.inputs = [("Structured Data", DataFiles, self.onDataInput)]
23        self.outputs = [("Examples", ExampleTable), ("Structured Data", DataFiles)]
24
25        self.dataStructure = None
26        self.datasets = None
27        self.lastSentIds = []
28
29        # Settings
30        self.applyOnChange = 0
31        self.loadSettings()
32
33        # GUI
34        # info
35        box = OWGUI.widgetBox(self.controlArea, "Info", addSpace = True)
36        self.infoa = OWGUI.widgetLabel(box, 'No data loaded.')
37        self.infob = OWGUI.widgetLabel(box, '')
38        self.infoc = OWGUI.widgetLabel(box, '')
39           
40        # LIST VIEW
41        frmListView = OWGUI.widgetBox(self.controlArea, None, addSpace = True)
42        self.tree = QTreeWidget(frmListView)
43        self.tree.setSelectionMode(QAbstractItemView.MultiSelection)
44        self.tree.setHeaderLabel("Directory/Data File")
45        frmListView.layout().addWidget(self.tree)
46        self.connect(self.tree,SIGNAL('itemSelectionChanged()'),self.selectionChanged)
47
48        # Output
49        box = OWGUI.widgetBox(self.controlArea, "Output", addSpace = True)
50        OWGUI.checkBox(box, self, 'applyOnChange', 'Commit data on selection change')
51        self.commitBtn = OWGUI.button(box, self, "Commit", callback=self.sendData, disabled=1)
52        self.resize(300,600)
53
54    def setFileTree(self):
55        self.disconnect(self.tree,SIGNAL('itemSelectionChanged()'),self.selectionChanged)
56        self.tree.clear()
57        self.listitems = []
58        if self.dataStructure:
59            for d in self.dataStructure:
60                (dirname, files) = d
61                diritem = QTreeWidgetItem(self.tree, [dirname], QTreeWidgetItem.UserType)
62                diritem.setSelected(1)
63                self.listitems.append(diritem)
64                diritem.setExpanded(1)
65                diritem.name = dirname
66                for f in files:
67                    item = QTreeWidgetItem(diritem, [f.name], QTreeWidgetItem.UserType)
68                    item.setSelected(1)
69                    self.listitems.append(item)
70                    item.data = f
71        self.connect(self.tree,SIGNAL('itemSelectionChanged()'),self.selectionChanged)
72
73    def selectionChanged(self):
74        if self.applyOnChange and self.okToCommit:
75            self.sendData()
76
77    # checks which data has been selected, builds a data structure, and sends it out
78    def sendData(self):
79        data = []
80        # clear what has been previously sent
81        for id in self.lastSentIds:
82            self.send("Examples", None, id)
83        self.lastSentIds = []
84        # send new data
85        id = 0
86        for tIdx in range(self.tree.topLevelItemCount()):
87            dir = self.tree.topLevelItem(tIdx)
88            if dir in self.tree.selectedItems():
89                files = []
90                for cIdx in range(dir.childCount()):
91                    f = dir.child(cIdx)
92                    if f in self.tree.selectedItems():
93                        files.append(f.data)
94                        self.send("Examples", f.data, id)
95                        self.lastSentIds.append(id)
96                        id += 1
97                data.append((dir.name, files))
98        self.send("Structured Data", data)
99
100    def onDataInput(self, dataStructure):
101        self.dataStructure = dataStructure
102        self.datasets = []
103        if dataStructure and len(dataStructure):
104            for name, etList in dataStructure:
105                for et in etList:
106                    self.datasets.append(et)
107            # sumarize the data
108            numSets = len(self.dataStructure)
109            numFiles = len(self.datasets)
110            self.infoa.setText("%d set%s, total of %d data file%s." % (numSets, ["", "s"][numSets!=1], numFiles, ["","s"][numFiles!=1]))
111            # construct lists that sumarize the data
112            numExamplesList = []
113            numAttrList = []
114            hasClass = []
115            attrNameList = []
116            for et in self.datasets:
117                numExamplesList.append(len(et))
118                numAttrList.append(len(et.domain.attributes))
119                hasClass.append(et.domain.classVar != None)
120                for attr in et.domain.attributes:
121                    if attr.name not in attrNameList:
122                        attrNameList.append(attr.name)
123            # report the number of attributes/class
124            if len(numAttrList):
125                minNumAttr = min(numAttrList)
126                maxNumAttr = max(numAttrList)
127                if minNumAttr != maxNumAttr:
128                    infob = "From %d to %d attribute%s (%d in total)" % (minNumAttr, maxNumAttr, ["","s"][maxNumAttr!=1], len(attrNameList))
129                else:
130                    infob = "%d attribute%s" % (maxNumAttr, ["","s"][maxNumAttr!=1])
131            else:
132                infob = "No attributes"
133            if sum(hasClass) == len(hasClass):
134                infob += ", all files contain class variable."
135            elif sum(hasClass) == 0:
136                infob += ", no class variable."
137            else:
138                infob += ", some files contain class variable."
139            self.infob.setText(infob)
140            # report the number of examples
141            if len(numExamplesList):
142                infoc = "Files contain "
143                minNumE = min(numExamplesList)
144                maxNumE = max(numExamplesList)
145                if minNumE == maxNumE:
146                    infoc += "%d example%s, " % (maxNumE, ["","s"][maxNumE!=1])
147                else:
148                    infoc += "from %d to %d example%s, " % (minNumE, maxNumE, ["","s"][maxNumE!=1])
149                infoc += "%d in total." % sum(numExamplesList)
150            else:
151                infoc = "Files contain no examples."
152            self.infoc.setText(infoc)
153
154            # read data
155            self.okToCommit = 1
156            self.commitBtn.setEnabled(1)
157        else:
158            self.infoa.setText('No data on input.')
159            self.infob.setText('')
160            self.infoc.setText('')
161            self.okToCommit = 0
162            self.commitBtn.setEnabled(0)
163        # enable/disable commit
164        # read data
165        self.setFileTree()
166        if self.applyOnChange:
167            self.sendData()
168
169
170if __name__=="__main__":
171    a=QApplication(sys.argv)
172    ow=OWDataFilesSelector()
173    ow.show()
174    a.exec_()
175    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.