source: orange/Orange/OrangeWidgets/Data/OWSave.py @ 11719:d26fa6fe99b2

Revision 11719:d26fa6fe99b2, 5.4 KB checked in by blaz <blaz.zupan@…>, 7 months ago (diff)

Updated DESCRIPTION fields.

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