source: orange/Orange/OrangeWidgets/Data/OWSave.py @ 11812:3912cba8d2a6

Revision 11812:3912cba8d2a6, 5.5 KB checked in by blaz <blaz.zupan@…>, 4 months ago (diff)

Updated documentation for the Save widget.

Line 
1from OWWidget import *
2import OWGUI
3import re, os.path
4from exceptions import Exception
5
6NAME = "Save"
7DESCRIPTION = "Saves data to file."
8LONG_DESCRIPTION = ""
9ICON = "icons/Save.svg"
10PRIORITY = 90
11AUTHOR = "Janez Demsar"
12AUTHOR_EMAIL = "janez.demsar(@at@)fri.uni-lj.si"
13INPUTS = [("Data", Orange.data.Table, "dataset", Default)]
14
15
16class OWSave(OWWidget):
17    settingsList = ["recentFiles", "selectedFileName"]
18
19    savers = {".txt": orange.saveTxt,
20              ".tab": orange.saveTabDelimited,
21              ".names": orange.saveC45,
22              ".test": orange.saveC45,
23              ".data": orange.saveC45,
24              ".csv": orange.saveCsv
25              }
26
27    # exclude C50 since it has the same extension and we do not need saving to it anyway
28    registeredFileTypes = [ft for ft in orange.getRegisteredFileTypes() if len(ft)>3 and ft[3] and not ft[0]=="C50"]
29
30    dlgFormats = 'Tab-delimited files (*.tab)\nHeaderless tab-delimited (*.txt)\nComma separated (*.csv)\nC4.5 files (*.data)\nRetis files (*.rda *.rdo)\n' \
31                 + "\n".join("%s (%s)" % (ft[:2]) for ft in registeredFileTypes) \
32                 + "\nAll files(*.*)"
33
34    savers.update(dict((lower(ft[1][1:]), ft[3]) for ft in registeredFileTypes))
35    re_filterExtension = re.compile(r"\(\*(?P<ext>\.[^ )]+)")
36
37    def __init__(self,parent=None, signalManager = None):
38        OWWidget.__init__(self, parent, signalManager, "Save", wantMainArea = 0, resizingEnabled = 0)
39
40        self.inputs = [("Data", ExampleTable, self.dataset)]
41        self.outputs = []
42
43        self.recentFiles=[]
44        self.selectedFileName = "None"
45        self.data = None
46        self.filename = ""
47        self.loadSettings()
48
49#        vb = OWGUI.widgetBox(self.controlArea)
50
51        rfbox = OWGUI.widgetBox(self.controlArea, "Filename", orientation="horizontal", addSpace=True)
52        self.filecombo = OWGUI.comboBox(rfbox, self, "filename")
53        self.filecombo.setMinimumWidth(200)
54#        browse = OWGUI.button(rfbox, self, "...", callback = self.browseFile, width=25)
55        button = OWGUI.button(rfbox, self, '...', callback = self.browseFile, disabled=0)
56        button.setIcon(self.style().standardIcon(QStyle.SP_DirOpenIcon))
57        button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
58
59        fbox = OWGUI.widgetBox(self.controlArea, "Save")
60        self.save = OWGUI.button(fbox, self, "Save", callback = self.saveFile, default=True)
61        self.save.setDisabled(1)
62       
63        OWGUI.rubber(self.controlArea)
64
65        #self.adjustSize()
66        self.setFilelist()
67        self.resize(260, 100)
68        self.filecombo.setCurrentIndex(0)
69
70        if self.selectedFileName != "":
71            if os.path.exists(self.selectedFileName):
72                self.openFile(self.selectedFileName)
73            else:
74                self.selectedFileName = ""
75
76
77    def dataset(self, data):
78        self.data = data
79        self.save.setDisabled(data == None)
80
81    def browseFile(self):
82        if self.recentFiles:
83            startfile = self.recentFiles[0]
84        else:
85            startfile = os.path.expanduser("~/")
86
87#        filename, selectedFilter = QFileDialog.getSaveFileNameAndFilter(self, 'Save Orange Data File', startfile,
88#                        self.dlgFormats, self.dlgFormats.splitlines()[0])
89#        filename = str(filename)
90#       The preceding lines should work as per API, but do not; it's probably a PyQt bug as per March 2010.
91#       The following is a workaround.
92#       (As a consequence, filter selection is not taken into account when appending a default extension.)
93        filename, selectedFilter = QFileDialog.getSaveFileName(self, 'Save Orange Data File', startfile,
94                         self.dlgFormats), self.dlgFormats.splitlines()[0]
95        filename = unicode(filename)
96        if not filename or not os.path.split(filename)[1]:
97            return
98
99        ext = lower(os.path.splitext(filename)[1])
100        if not ext in self.savers:
101            filt_ext = self.re_filterExtension.search(str(selectedFilter)).group("ext")
102            if filt_ext == ".*":
103                filt_ext = ".tab"
104            filename += filt_ext
105
106
107        self.addFileToList(filename)
108        self.saveFile()
109
110    def saveFile(self, *index):
111        self.error()
112        if self.data is not None:
113            combotext = unicode(self.filecombo.currentText())
114            if combotext == "(none)":
115                QMessageBox.information( None, "Error saving data", "Unable to save data. Select first a file name by clicking the '...' button.", QMessageBox.Ok + QMessageBox.Default)
116                return
117            filename = self.recentFiles[self.filecombo.currentIndex()]
118            fileExt = lower(os.path.splitext(filename)[1])
119            if fileExt == "":
120                fileExt = ".tab"
121            try:
122                self.savers[fileExt](filename, self.data)
123            except Exception, (errValue):
124                self.error(str(errValue))
125                return
126            self.error()
127
128    def addFileToList(self, fn):
129        if fn in self.recentFiles:
130            self.recentFiles.remove(fn)
131        self.recentFiles.insert(0,fn)
132        self.setFilelist()
133
134    def setFilelist(self):
135        """Set the GUI filelist"""
136        self.filecombo.clear()
137
138        if self.recentFiles:
139            self.filecombo.addItems([os.path.split(file)[1] for file in self.recentFiles])
140        else:
141            self.filecombo.addItem("(none)")
142
143
144if __name__ == "__main__":
145    a=QApplication(sys.argv)
146    owf=OWSave()
147    owf.show()
148    a.exec_()
149    owf.saveSettings()
Note: See TracBrowser for help on using the repository browser.