source: orange-bioinformatics/_bioinformatics/widgets/prototypes/OWDataFilesSave.py @ 1636:10d234fdadb9

Revision 1636:10d234fdadb9, 4.8 KB checked in by mitar, 2 years ago (diff)

Restructuring because we will not be using namespaces.

Line 
1"""
2<name>Save Data Files</name>
3<description>Saves data to selected directory.</description>
4<icon>icons/DataFilesSave.png</icon>
5<priority>1055</priority>
6<contact>Peter Juvan (peter.juvan@fri.uni-lj.si)</contact>
7"""
8
9from __future__ import absolute_import
10
11import os, orange
12
13from Orange.OrangeWidgets import OWGUI
14from Orange.OrangeWidgets.OWWidget import *
15
16from .OWDataFiles import DataFiles
17
18class OWDataFilesSave(OWWidget):
19    settingsList  = ["recentDirs", "selectedDirName"]
20
21    def __init__(self, parent=None, signalManager = None):
22        OWWidget.__init__(self, parent, signalManager, "Save Data Files", wantMainArea = 0, resizingEnabled = 1)
23
24        self.inputs = [("Structured Data", DataFiles, self.structuredData, Default)]
25        self.outputs = []
26        self.dataStructure = None
27
28        # Settings
29        self.recentDirs=[]
30        self.selectedDirName = "(none)"
31        self.loadSettings()
32
33        # GUI
34        rfbox = OWGUI.widgetBox(self.controlArea, "Directory", orientation="horizontal", addSpace = True)
35        self.dircombo = QComboBox(rfbox)
36        rfbox.layout().addWidget(self.dircombo)
37        browse = OWGUI.button(rfbox, self, '&...', callback = self.browseDirectory, disabled=0)
38        browse.setMaximumWidth(25)
39        # info
40        box = OWGUI.widgetBox(self.controlArea, "Info", addSpace = True)
41        self.infoa = OWGUI.widgetLabel(box, 'No data on input.')
42        # Output
43        box = OWGUI.widgetBox(self.controlArea, "Output", addSpace = True)
44        self.save = OWGUI.button(box, self, '&Save', callback = self.saveData, disabled=1)
45        self.adjustSize()
46           
47        # initial settings           
48        self.recentDirs=filter(os.path.exists, self.recentDirs)
49        self.setDirlist()
50        self.dircombo.setCurrentIndex(0)
51        self.resize(300,self.height())
52
53    def structuredData(self, data):
54        self.dataStructure = data
55        self.save.setDisabled(self.dataStructure == None)
56        if self.dataStructure == None:
57            self.infoa.setText("No data on input.")
58        else:
59            self.infoa.setText("New data on input.")
60           
61    def saveData(self):
62        # Saves data into root directory
63        rootDir = self.recentDirs[self.dircombo.currentIndex()]
64        if rootDir == "(none)" or self.dataStructure == None:
65            self.infoa.setText("Select a directory first.")
66            return
67        # count number of files to save
68        n = sum([sum([1 for d in ds]) for (sdn, ds) in self.dataStructure]) 
69        if n == 0:
70            self.infoa.setText("No files to save.")
71            return
72        pbStep = 100./n
73        self.progressBarInit()
74
75        for (subDirName, datasets) in self.dataStructure:
76            targetDir = os.path.join(rootDir, subDirName)
77            if not os.path.exists(targetDir):
78                try:
79                    os.mkdir(targetDir)
80                except:
81                    self.infoa.setText("Could not create target directory: " + targetDir)
82                    self.error("Could not create target directory: " + targetDir)
83
84            for data in datasets:
85                fname = os.path.join(targetDir, data.name + '.tab')
86                orange.saveTabDelimited(fname, data)
87                self.progressBarAdvance(pbStep)
88        self.infoa.setText("Data saved to %s" % rootDir)
89        self.progressBarFinished()
90
91    def browseDirectory(self):
92        # displays a file dialog and selects a directory
93        if len(self.recentDirs):
94            startdir=self.recentDirs[0]
95        else:
96            startdir ="."
97        dirname=str(QFileDialog.getExistingDirectory(self, 'Select Directory to Save into', startdir, QFileDialog.ShowDirsOnly))
98        if len(dirname):
99            self.addDirToList(dirname)
100
101    def setDirlist(self):
102        self.dircombo.clear()
103        if len(self.recentDirs):
104            for dir in self.recentDirs:
105                ### leave out the path
106                ##(upperdir,dirname)=os.path.split(dir)
107                self.dircombo.insertItem(self.dircombo.count(), dir)
108        else:
109            self.dircombo.insertItem(0, "(none)")
110
111    def addDirToList(self, dir):
112        # Add a directory to the start of the file list.
113        # If it exists, move it to the start of the list
114        dir = os.path.normpath(dir)
115        if dir in self.recentDirs:
116            self.recentDirs.remove(dir)
117        self.recentDirs.insert(0, str(dir))
118        self.setDirlist()
119        self.selectedDirName = dir
120
121    def selectDir(self, n):
122        # called when user makes a selection from the drop-down menu
123        if self.recentDirs:
124            self.loadData(self.recentDirs[n])
125            self.addDirToList(self.recentDirs[n])
126        else:
127            self.loadData("(none)")
128
129
130if __name__=="__main__":
131    a=QApplication(sys.argv)
132    ow=OWDataFilesSave()
133    ow.show()
134    a.exec_()
135    ow.saveSettings()
Note: See TracBrowser for help on using the repository browser.