11import os
22import pickle
33
4+ from AnyQt .QtWidgets import QSizePolicy , QStyle , QFileDialog
45from AnyQt .QtCore import QTimer
5- from AnyQt .QtWidgets import (
6- QSizePolicy , QHBoxLayout , QComboBox , QStyle , QFileDialog
7- )
86
97from Orange .base import Model
108from Orange .widgets import widget , gui
119from Orange .widgets .model import owsavemodel
12- from Orange .widgets .settings import Setting
10+ from Orange .widgets .utils . filedialogs import RecentPathsWComboMixin
1311from Orange .widgets .utils import stdpaths
1412from Orange .widgets .utils .widgetpreview import WidgetPreview
1513from Orange .widgets .widget import Msg , Output
1614
1715
18- class OWLoadModel (widget .OWWidget ):
16+ class OWLoadModel (widget .OWWidget , RecentPathsWComboMixin ):
1917 name = "Load Model"
2018 description = "Load a model from an input file."
2119 priority = 3050
2220 replaces = ["Orange.widgets.classify.owloadclassifier.OWLoadClassifier" ]
2321 icon = "icons/LoadModel.svg"
24- keywords = ["file" , "open" ]
22+ keywords = ["file" , "open" , "model" ]
2523
2624 class Outputs :
2725 model = Output ("Model" , Model )
2826
29- #: List of recent filenames.
30- history = Setting ([])
31- #: Current (last selected) filename or None.
32- filename = Setting (None )
33-
3427 class Error (widget .OWWidget .Error ):
3528 load_error = Msg ("An error occured while reading '{}'" )
3629
@@ -41,96 +34,58 @@ class Error(widget.OWWidget.Error):
4134
4235 def __init__ (self ):
4336 super ().__init__ ()
44- self .selectedIndex = - 1
45-
46- box = gui .widgetBox (
47- self .controlArea , self .tr ("File" ), orientation = QHBoxLayout ()
48- )
37+ RecentPathsWComboMixin .__init__ (self )
38+ self .loaded_file = ""
4939
50- self . filesCB = gui .comboBox (
51- box , self , "selectedIndex" , callback = self . _on_recent )
52- self .filesCB . setMinimumContentsLength ( 20 )
53- self . filesCB . setSizeAdjustPolicy (
54- QComboBox . AdjustToMinimumContentsLength )
40+ vbox = gui .vBox ( self . controlArea , "File" , addSpace = True )
41+ box = gui . hBox ( vbox )
42+ self .file_combo . setMinimumWidth ( 300 )
43+ box . layout (). addWidget ( self . file_combo )
44+ self . file_combo . activated [ int ]. connect ( self . select_file )
5545
56- self . loadbutton = gui .button (box , self , " ..." , callback = self .browse )
57- self .loadbutton . setIcon (
58- self . style (). standardIcon ( QStyle . SP_DirOpenIcon ))
59- self . loadbutton . setSizePolicy ( QSizePolicy .Maximum , QSizePolicy .Fixed )
46+ button = gui .button (box , self , ' ...' , callback = self .browse_file )
47+ button . setIcon ( self .style (). standardIcon ( QStyle . SP_DirOpenIcon ))
48+ button . setSizePolicy (
49+ QSizePolicy .Maximum , QSizePolicy .Fixed )
6050
61- self . reloadbutton = gui .button (
51+ button = gui .button (
6252 box , self , "Reload" , callback = self .reload , default = True )
63- self .reloadbutton .setIcon (
64- self .style ().standardIcon (QStyle .SP_BrowserReload ))
65- self .reloadbutton .setSizePolicy (QSizePolicy .Maximum ,
66- QSizePolicy .Fixed )
67-
68- # filter valid existing filenames
69- self .history = list (filter (os .path .isfile , self .history ))[:20 ]
70- for filename in self .history :
71- self .filesCB .addItem (os .path .basename (filename ), userData = filename )
72-
73- # restore the current selection if the filename is
74- # in the history list
75- if self .filename in self .history :
76- self .selectedIndex = self .history .index (self .filename )
77- else :
78- self .selectedIndex = - 1
79- self .filename = None
80- self .reloadbutton .setEnabled (False )
53+ button .setIcon (self .style ().standardIcon (QStyle .SP_BrowserReload ))
54+ button .setSizePolicy (QSizePolicy .Fixed , QSizePolicy .Fixed )
8155
82- if self .filename :
83- QTimer .singleShot (0 , lambda : self .load (self .filename ))
84-
85- def browse (self ):
86- """Select a filename using an open file dialog."""
87- if self .filename is None :
88- startdir = stdpaths .Documents
89- else :
90- startdir = os .path .dirname (self .filename )
56+ self .set_file_list ()
57+ QTimer .singleShot (0 , self .open_file )
9158
59+ def browse_file (self ):
60+ start_file = self .last_path () or stdpaths .Documents
9261 filename , _ = QFileDialog .getOpenFileName (
93- self , self .tr ("Open" ), directory = startdir , filter = self .FILTER )
62+ self , 'Open Distance File' , start_file , self .FILTER )
63+ if not filename :
64+ return
65+ self .add_path (filename )
66+ self .open_file ()
9467
95- if filename :
96- self .load (filename )
68+ def select_file (self , n ):
69+ super ().select_file (n )
70+ self .open_file ()
9771
9872 def reload (self ):
99- """Reload the current file."""
100- self .load (self .filename )
73+ self .open_file ()
10174
102- def load (self , filename ):
103- """Load the object from filename and send it to output."""
75+ def open_file (self ):
76+ self .clear_messages ()
77+ fn = self .last_path ()
78+ if not fn :
79+ return
10480 try :
105- with open (filename , "rb" ) as f :
81+ with open (fn , "rb" ) as f :
10682 model = pickle .load (f )
10783 except (pickle .UnpicklingError , OSError , EOFError ):
108- self .Error .load_error (os .path .split (filename )[- 1 ])
84+ self .Error .load_error (os .path .split (fn )[- 1 ])
85+ self .Outputs .model .send (None )
10986 else :
110- self .Error .load_error .clear ()
111- self ._remember (filename )
11287 self .Outputs .model .send (model )
11388
114- def _remember (self , filename ):
115- """
116- Remember `filename` was accessed.
117- """
118- if filename in self .history :
119- index = self .history .index (filename )
120- del self .history [index ]
121- self .filesCB .removeItem (index )
122-
123- self .history .insert (0 , filename )
124-
125- self .filesCB .insertItem (0 , os .path .basename (filename ),
126- userData = filename )
127- self .selectedIndex = 0
128- self .filename = filename
129- self .reloadbutton .setEnabled (self .selectedIndex != - 1 )
130-
131- def _on_recent (self ):
132- self .load (self .history [self .selectedIndex ])
133-
13489
13590if __name__ == "__main__" : # pragma: no cover
13691 WidgetPreview (OWLoadModel ).run ()
0 commit comments