source: orange-bioinformatics/orangecontrib/bio/widgets/prototypes/OWDataFilesSave.py @ 1873:0810c5708cc5

Revision 1873:0810c5708cc5, 4.8 KB checked in by Ales Erjavec <ales.erjavec@…>, 6 months ago (diff)

Moved '_bioinformatics' into orangecontrib namespace.

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