Changeset 805:41c3bffe8a25
- Timestamp:
- 08/06/16 08:07:39 (8 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- src/mlx/gui
- Files:
-
- 1 deleted
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/mlx/gui/cef.py
r713 r805 1 1 from common import * 2 2 3 from mava_simbrief import MavaSimbriefIntegrator4 5 3 from mlx.util import secondaryInstallation 6 4 7 5 from cefpython3 import cefpython 8 from selenium import webdriver9 from selenium.webdriver.chrome.options import Options10 6 11 7 import platform … … 14 10 import os 15 11 import re 12 import thread 16 13 import threading 17 14 import tempfile 18 15 import traceback 16 import urllib2 17 from lxml import etree 18 from StringIO import StringIO 19 import lxml.html 19 20 20 21 #------------------------------------------------------------------------------ … … 29 30 _toQuit = False 30 31 31 # Indicate the users of the fast timeout handler. If it reaches zero, the 32 # timeout will be stopped 33 _fastTimeoutUsers = 0 34 35 # The Selenium thread 36 _seleniumHandler = None 37 38 #------------------------------------------------------------------------------ 39 40 def getArgsFilePath(): 41 """Get the path of the argument file.""" 42 if os.name=="nt": 43 return os.path.join(tempfile.gettempdir(), 44 "mlxcef.args" + 45 (".secondary" if secondaryInstallation else "")) 46 else: 47 import pwd 48 return os.path.join(tempfile.gettempdir(), 49 "mlxcef." + pwd.getpwuid(os.getuid())[0] + ".args" + 50 (".secondary" if secondaryInstallation else "")) 51 52 #------------------------------------------------------------------------------ 53 54 class ArgsFileWaiter(threading.Thread): 55 """A thread to wait for the appearance of the arguments file.""" 56 def __init__(self, initializedCallback): 57 """Construct the thread.""" 58 threading.Thread.__init__(self) 59 self.daemon = True 60 61 self._initializedCallback = initializedCallback 62 63 def run(self): 64 """Repeatedly check for the existence of the arguments file. 65 66 If it is found, read it, extract the arguments and insert a job into 67 the GUI loop to perform the actual initialization of CEF.""" 68 argsFilePath = getArgsFilePath() 69 print "Waiting for the arguments file '%s' to appear" % (argsFilePath,) 70 71 while not os.path.exists(argsFilePath): 72 time.sleep(0.1) 73 74 print "Got arguments, reading them.""" 75 76 with open(argsFilePath, "rt") as f: 77 args = f.read().split() 78 79 gobject.idle_add(_initializeCEF, args, self._initializedCallback) 80 81 #------------------------------------------------------------------------------ 82 83 SIMBRIEF_PROGRESS_SEARCHING_BROWSER = MavaSimbriefIntegrator.PROGRESS_SEARCHING_BROWSER 84 SIMBRIEF_PROGRESS_LOADING_FORM = MavaSimbriefIntegrator.PROGRESS_LOADING_FORM 85 SIMBRIEF_PROGRESS_FILLING_FORM = MavaSimbriefIntegrator.PROGRESS_FILLING_FORM 86 SIMBRIEF_PROGRESS_WAITING_LOGIN = MavaSimbriefIntegrator.PROGRESS_WAITING_LOGIN 87 SIMBRIEF_PROGRESS_LOGGING_IN = MavaSimbriefIntegrator.PROGRESS_LOGGING_IN 88 SIMBRIEF_PROGRESS_WAITING_RESULT = MavaSimbriefIntegrator.PROGRESS_WAITING_RESULT 89 90 SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING = MavaSimbriefIntegrator.PROGRESS_MAX + 1 32 # The SimBrief handler 33 _simBriefHandler = None 34 35 #------------------------------------------------------------------------------ 36 37 SIMBRIEF_PROGRESS_SEARCHING_BROWSER = 1 38 SIMBRIEF_PROGRESS_LOADING_FORM = 2 39 SIMBRIEF_PROGRESS_FILLING_FORM = 3 40 SIMBRIEF_PROGRESS_WAITING_LOGIN = 4 41 SIMBRIEF_PROGRESS_LOGGING_IN = 5 42 SIMBRIEF_PROGRESS_WAITING_RESULT = 6 43 44 SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING = 7 91 45 SIMBRIEF_PROGRESS_DONE = 1000 92 46 93 SIMBRIEF_RESULT_NONE = MavaSimbriefIntegrator.RESULT_NONE 94 SIMBRIEF_RESULT_OK = MavaSimbriefIntegrator.RESULT_OK 95 SIMBRIEF_RESULT_ERROR_OTHER = MavaSimbriefIntegrator.RESULT_ERROR_OTHER 96 SIMBRIEF_RESULT_ERROR_NO_FORM = MavaSimbriefIntegrator.RESULT_ERROR_NO_FORM 97 SIMBRIEF_RESULT_ERROR_NO_POPUP = MavaSimbriefIntegrator.RESULT_ERROR_NO_POPUP 98 SIMBRIEF_RESULT_ERROR_LOGIN_FAILED = MavaSimbriefIntegrator.RESULT_ERROR_LOGIN_FAILED 99 100 #------------------------------------------------------------------------------ 101 102 class SeleniumHandler(threading.Thread): 103 """Thread to handle Selenium operations.""" 104 def __init__(self, programDirectory): 105 """Construct the thread.""" 106 threading.Thread.__init__(self) 107 self.daemon = False 108 109 self._programDirectory = programDirectory 110 111 self._commandsCondition = threading.Condition() 112 self._commands = [] 113 114 self._driver = None 115 116 self._simBriefBrowser = None 117 118 self._toQuit = False 119 120 @property 121 def programDirectory(self): 122 """Get the program directory.""" 123 return self._programDirectory 124 125 @property 126 def simBriefInitURL(self): 127 """Get the initial URL for the SimBrief browser.""" 128 return "file://" + os.path.join(self.programDirectory, "simbrief.html") 129 130 def run(self): 131 """Create the Selenium driver and the perform any operations 132 requested.""" 133 scriptName = "mlx_cef_caller" 134 if secondaryInstallation: 135 scriptName += "_secondary" 136 scriptName += ".bat" if os.name=="nt" else ".sh" 137 138 scriptPath = os.path.join(self._programDirectory, scriptName) 139 print "Creating the Selenium driver to call script", scriptPath 140 141 options = Options() 142 options.binary_location = scriptPath 143 driver = self._driver = webdriver.Chrome(chrome_options = options) 144 # try: 145 # except: 146 # traceback.print_exc() 147 148 print "Created Selenium driver." 149 while not self._toQuit: 150 with self._commandsCondition: 151 while not self._commands: 152 self._commandsCondition.wait() 153 154 command = self._commands[0] 155 del self._commands[0] 156 157 command() 158 159 driver.quit() 160 161 def initializeSimBrief(self): 47 SIMBRIEF_RESULT_NONE = 0 48 SIMBRIEF_RESULT_OK = 1 49 SIMBRIEF_RESULT_ERROR_OTHER = 2 50 SIMBRIEF_RESULT_ERROR_NO_FORM = 11 51 SIMBRIEF_RESULT_ERROR_NO_POPUP = 12 52 SIMBRIEF_RESULT_ERROR_LOGIN_FAILED = 13 53 54 #------------------------------------------------------------------------------ 55 56 class SimBriefHandler(object): 57 """An object to store the state of a SimBrief query.""" 58 _formURL = "http://flare.privatedns.org/mava_simbrief/simbrief_form.html" 59 60 _querySettings = { 61 'navlog': True, 62 'etops': True, 63 'stepclimbs': True, 64 'tlr': True, 65 'notams': True, 66 'firnot': True, 67 'maps': 'Simple', 68 }; 69 70 71 def __init__(self): 72 """Construct the handler.""" 73 self._browser = None 74 self._plan = None 75 self._getCredentials = None 76 self._getCredentialsCount = 0 77 self._updateProgressFn = None 78 self._htmlFilePath = None 79 self._lastProgress = SIMBRIEF_PROGRESS_SEARCHING_BROWSER 80 self._timeoutID = None 81 82 def initialize(self): 162 83 """Create and initialize the browser used for Simbrief.""" 163 84 windowInfo = cefpython.WindowInfo() 164 85 windowInfo.SetAsOffscreen(int(0)) 165 86 166 url = self.simBriefInitURL 167 self._simBriefBrowser = \ 87 self._browser = \ 168 88 cefpython.CreateBrowserSync(windowInfo, browserSettings = {}, 169 navigateUrl = self.simBriefInitURL) 170 self._simBriefBrowser.SetClientHandler(OffscreenRenderHandler()) 171 self._simBriefBrowser.SetFocus(True) 172 173 def callSimBrief(self, plan, getCredentials, updateProgress, 174 htmlFilePath): 89 navigateUrl = SimBriefHandler._formURL) 90 self._browser.SetClientHandler(OffscreenRenderHandler()) 91 self._browser.SetFocus(True) 92 self._browser.SetClientCallback("OnLoadEnd", self._onLoadEnd) 93 94 bindings = cefpython.JavascriptBindings(bindToFrames=True, 95 bindToPopups=True) 96 bindings.SetFunction("briefingData", self._briefingDataAvailable) 97 bindings.SetFunction("formFilled", self._formFilled) 98 self._browser.SetJavascriptBindings(bindings) 99 100 def call(self, plan, getCredentials, updateProgress, htmlFilePath): 175 101 """Call SimBrief with the given plan.""" 176 self._enqueue(lambda: 177 self._callSimBrief(plan, self._driver, 178 getCredentials, updateProgress, 179 htmlFilePath)) 180 181 def quit(self): 182 """Instruct the thread to quit and then join it.""" 183 self._enqueue(self._quit) 184 self.join() 185 186 def _enqueue(self, command): 187 """Enqueue the given command. 188 189 command should be a function to be executed in the thread.""" 190 with self._commandsCondition: 191 self._commands.append(command) 192 self._commandsCondition.notify() 193 194 def _callSimBrief(self, plan, driver, 195 getCredentials, updateProgress, htmlFilePath): 196 """Perform the SimBrief call.""" 197 self._simBriefBrowser.LoadUrl(self.simBriefInitURL) 198 199 integrator = MavaSimbriefIntegrator(plan = plan, driver = driver) 200 link = None 201 try: 202 link = integrator.get_xml_link(getCredentials, updateProgress, 203 local_xml_debug = False, 204 local_html_debug = False) 205 except Exception, e: 206 print "Failed to initiate the generation of the briefing:", e 207 updateProgress(SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING, 208 SIMBRIEF_RESULT_ERROR_OTHER, None) 209 210 if link is not None: 211 updateProgress(SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING, 212 SIMBRIEF_RESULT_NONE, None) 213 214 try: 215 flight_info = integrator.get_results(link, 216 html_file_path = 217 htmlFilePath) 218 219 updateProgress(SIMBRIEF_PROGRESS_DONE, 220 SIMBRIEF_RESULT_OK, flight_info) 221 except Exception, e: 222 print "Failed to retrieve the briefing:", e 223 updateProgress(SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING, 224 SIMBRIEF_RESULT_ERROR_OTHER, None) 225 226 def _quit(self): 227 """Set the _toQuit member variable to indicate that the thread should 228 quit.""" 229 self._toQuit = True 230 231 #------------------------------------------------------------------------------ 232 233 def initialize(programDirectory, initializedCallback): 102 self._timeoutID = gobject.timeout_add(120*1000, self._timedOut) 103 104 self._plan = plan 105 self._getCredentials = getCredentials 106 self._getCredentialsCount = 0 107 self._updateProgressFn = updateProgress 108 self._htmlFilePath = htmlFilePath 109 110 self._browser.LoadUrl(SimBriefHandler._formURL) 111 self._updateProgress(SIMBRIEF_PROGRESS_LOADING_FORM, 112 SIMBRIEF_RESULT_NONE, None) 113 114 def _onLoadEnd(self, browser, frame, httpCode): 115 """Called when a page has been loaded in the SimBrief browser.""" 116 url = frame.GetUrl() 117 print "gui.cef.SimBriefHandler._onLoadEnd", httpCode, url 118 if httpCode>=300: 119 self._updateProgress(self._lastProgress, 120 SIMBRIEF_RESULT_ERROR_OTHER, None) 121 elif url.startswith("http://flare.privatedns.org/mava_simbrief/simbrief_form.html"): 122 if self._plan is None: 123 return 124 125 self._updateProgress(SIMBRIEF_PROGRESS_FILLING_FORM, 126 SIMBRIEF_RESULT_NONE, None) 127 128 js = "form=document.getElementById(\"sbapiform\");" 129 for (name, value) in self._plan.iteritems(): 130 js += "form." + name + ".value=\"" + value + "\";" 131 for (name, value) in SimBriefHandler._querySettings.iteritems(): 132 if isinstance(value, bool): 133 js += "form." + name + ".checked=" + \ 134 ("true" if value else "false") + ";" 135 elif isinstance(value, str): 136 js += "form." + name + ".value=\"" + value + "\";" 137 138 js += "form.submitform.click();" 139 js += "window.formFilled();" 140 141 frame.ExecuteJavascript(js) 142 elif url.startswith("http://www.simbrief.com/system/login.api.php"): 143 (user, password) = self._getCredentials(self._getCredentialsCount) 144 if user is None or password is None: 145 self._updateProgress(SIMBRIEF_PROGRESS_WAITING_LOGIN, 146 SIMBRIEF_RESULT_ERROR_LOGIN_FAILED, None) 147 return 148 149 self._getCredentialsCount += 1 150 js = "form=document.forms[0];" 151 js += "form.user.value=\"" + user + "\";" 152 js += "form.pass.value=\"" + password + "\";" 153 js += "form.submit();" 154 frame.ExecuteJavascript(js) 155 elif url.startswith("http://www.simbrief.com/ofp/ofp.loader.api.php"): 156 self._updateProgress(SIMBRIEF_PROGRESS_WAITING_RESULT, 157 SIMBRIEF_RESULT_NONE, None) 158 elif url.startswith("http://flare.privatedns.org/mava_simbrief/simbrief_briefing.php"): 159 js = "form=document.getElementById(\"hiddenform\");" 160 js += "window.briefingData(form.hidden_is_briefing_available.value, form.hidden_link.value);"; 161 frame.ExecuteJavascript(js) 162 163 def _formFilled(self): 164 """Called when the form has been filled and submitted.""" 165 self._updateProgress(SIMBRIEF_PROGRESS_WAITING_LOGIN, 166 SIMBRIEF_RESULT_NONE, None) 167 168 def _briefingDataAvailable(self, available, link): 169 """Called when the briefing data is available.""" 170 if available: 171 link ="http://www.simbrief.com/ofp/flightplans/xml/" + link + ".xml" 172 173 self._updateProgress(SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING, 174 SIMBRIEF_RESULT_NONE, None) 175 176 thread = threading.Thread(target = self._getResults, args = (link,)) 177 thread.daemon = True 178 thread.start() 179 else: 180 self._updateProgress(SIMBRIEF_PROGRESS_RETRIEVING_BRIEFING, 181 SIMBRIEF_RESULT_ERROR_OTHER, None) 182 183 def _resultsAvailable(self, flightInfo): 184 """Called from the result retrieval thread when the result is 185 available. 186 187 It checks for the plan being not None, as we may time out.""" 188 if self._plan is not None: 189 self._updateProgress(SIMBRIEF_PROGRESS_DONE, 190 SIMBRIEF_RESULT_OK, flightInfo) 191 192 def _updateProgress(self, progress, results, flightInfo): 193 """Update the progress.""" 194 self._lastProgress = progress 195 if results!=SIMBRIEF_RESULT_NONE: 196 gobject.source_remove(self._timeoutID) 197 self._plan = None 198 199 self._updateProgressFn(progress, results, flightInfo) 200 201 def _timedOut(self): 202 """Called when the timeout occurs.""" 203 if self._lastProgress==SIMBRIEF_PROGRESS_LOADING_FORM: 204 result = SIMBRIEF_RESULT_ERROR_NO_FORM 205 elif self._lastProgress==SIMBRIEF_PROGRESS_WAITING_LOGIN: 206 result = SIMBRIEF_RESULT_ERROR_NO_POPUP 207 else: 208 result = SIMBRIEF_RESULT_ERROR_OTHER 209 210 self._updateProgress(self._lastProgress, result, None) 211 212 return False 213 214 def _getResults(self, link): 215 """Get the result from the given link.""" 216 availableInfo = {} 217 ## Holds analysis data to be used 218 flightInfo = {} 219 220 # Obtaining the xml 221 response = urllib2.urlopen(link) 222 xmlContent = response.read() 223 # Processing xml 224 content = etree.iterparse(StringIO(xmlContent)) 225 226 for (action, element) in content: 227 # Processing tags that occur multiple times 228 if element.tag == "weather": 229 weatherElementList = list(element) 230 for weatherElement in weatherElementList: 231 flightInfo[weatherElement.tag] = weatherElement.text 232 else: 233 availableInfo[element.tag] = element.text 234 235 # Processing plan_html 236 ## Obtaining chart links 237 imageLinks = [] 238 for imageLinkElement in lxml.html.find_class(availableInfo["plan_html"], 239 "ofpmaplink"): 240 for imageLink in imageLinkElement.iterlinks(): 241 if imageLink[1] == 'src': 242 imageLinks.append(imageLink[2]) 243 flightInfo["image_links"] = imageLinks 244 print(sorted(availableInfo.keys())) 245 htmlFilePath = "simbrief_plan.html" if self._htmlFilePath is None \ 246 else self._htmlFilePath 247 with open(htmlFilePath, 'w') as f: 248 f.write(availableInfo["plan_html"]) 249 250 gobject.idle_add(self._resultsAvailable, flightInfo) 251 252 #------------------------------------------------------------------------------ 253 254 def initialize(initializedCallback): 234 255 """Initialize the Chrome Embedded Framework.""" 235 global _toQuit, _s eleniumHandler256 global _toQuit, _simBriefHandler 236 257 _toQuit = False 237 258 238 259 gobject.threads_init() 239 260 240 argsFilePath = getArgsFilePath() 241 try: 242 os.unlink(argsFilePath) 243 except: 244 pass 245 246 _seleniumHandler = SeleniumHandler(programDirectory) 247 _seleniumHandler.start() 248 249 ArgsFileWaiter(initializedCallback).start() 261 _simBriefHandler = SimBriefHandler() 262 _initializeCEF([], initializedCallback) 250 263 251 264 #------------------------------------------------------------------------------ … … 307 320 """Start a browser instance in the given container with the given URL.""" 308 321 if os.name=="nt": 309 windowID = container.get_window().handle 322 window = container.get_window() 323 if window is None: 324 print "mlx.gui.cef.startInContainer: no window found!" 325 windowID = None 326 else: 327 windowID = window.handle 310 328 else: 311 329 m = re.search("GtkVBox at 0x(\w+)", str(container)) … … 314 332 315 333 windowInfo = cefpython.WindowInfo() 316 windowInfo.SetAsChild(windowID) 334 if windowID is not None: 335 windowInfo.SetAsChild(windowID) 317 336 318 337 return cefpython.CreateBrowserSync(windowInfo, … … 376 395 def initializeSimBrief(): 377 396 """Initialize the (hidden) browser window for SimBrief.""" 378 _s eleniumHandler.initializeSimBrief()397 _simBriefHandler.initialize() 379 398 380 399 #------------------------------------------------------------------------------ 381 400 382 401 def callSimBrief(plan, getCredentials, updateProgress, htmlFilePath): 383 """Call SimBrief with the given plan.""" 384 _seleniumHandler.callSimBrief(plan, getCredentials, 385 updateProgress, htmlFilePath) 402 """Call SimBrief with the given plan. 403 404 The callbacks will be called in the main GUI thread.""" 405 _simBriefHandler.call(plan, getCredentials, updateProgress, htmlFilePath) 386 406 387 407 #------------------------------------------------------------------------------ … … 389 409 def finalize(): 390 410 """Finalize the Chrome Embedded Framework.""" 391 global _toQuit , _seleniumHandler392 toQuit = True411 global _toQuit 412 _toQuit = True 393 413 cefpython.Shutdown() 394 _seleniumHandler.quit()395 414 396 415 #------------------------------------------------------------------------------ … … 406 425 #------------------------------------------------------------------------------ 407 426 408 def startFastTimeout():409 """Start the fast timeout handler."""410 global _fastTimeoutUsers411 412 if _fastTimeoutUsers==0:413 _fastTimeoutUsers = 1414 gobject.timeout_add(1, _handleFastTimeout)415 else:416 _fastTimeoutUsers += 1417 418 #------------------------------------------------------------------------------419 420 def stopFastTimeout():421 """Stop the fast timeout handler."""422 global _fastTimeoutUsers423 424 assert _fastTimeoutUsers>0425 _fastTimeoutUsers -= 1426 427 #------------------------------------------------------------------------------428 429 def _handleFastTimeout():430 """Handle a (fast) timeout by running the CEF message loop."""431 if _toQuit or _fastTimeoutUsers==0:432 return False433 else:434 cefpython.MessageLoopWork()435 return True436 437 #------------------------------------------------------------------------------438 439 427 def _handleSizeAllocate(widget, sizeAlloc): 440 428 """Handle the size-allocate event.""" 441 cefpython.WindowUtils.OnSize(widget.get_window().handle, 0, 0, 0) 429 window = widget.get_window() 430 if widget is not None: 431 cefpython.WindowUtils.OnSize(window.handle, 0, 0, 0) -
src/mlx/gui/flight.py
r798 r805 2500 2500 table.attach(self._rememberButton, 1, 2, 2, 3, ypadding = 8) 2501 2501 2502 self._credentialsCondition = threading.Condition()2503 self._credentialsAvailable = False2504 self._credentialsUserName = None2505 self._credentialsPassword = None2506 2507 2502 label = gtk.Label(xstr("simbrief_extra_fuel")) 2508 2503 label.set_use_underline(True) … … 2675 2670 self._wizard.gui.beginBusy(xstr("simbrief_calling")) 2676 2671 2677 cef.startFastTimeout()2678 2672 cef.callSimBrief(plan, 2679 self._getCredentials Callback,2680 self._simBriefProgress Callback,2673 self._getCredentials, 2674 self._simBriefProgress, 2681 2675 SimBriefSetupPage.getHTMLFilePath()) 2682 2676 2683 2677 startSound(const.SOUND_NOTAM) 2684 2685 def _getCredentialsCallback(self, count):2686 """Called when the SimBrief home page requests the credentials."""2687 with self._credentialsCondition:2688 self._credentialsAvailable = False2689 2690 gobject.idle_add(self._getCredentials, count)2691 2692 while not self._credentialsAvailable:2693 self._credentialsCondition.wait()2694 2695 return (self._credentialsUserName, self._credentialsPassword)2696 2678 2697 2679 def _getCredentials(self, count): … … 2701 2683 are returned. Otherwise a dialog box is displayed informing the user of 2702 2684 invalid credentials and requesting another set of them.""" 2703 with self._credentialsCondition: 2704 if count==0: 2705 self._credentialsUserName = self._userName.get_text() 2706 self._credentialsPassword = self._password.get_text() 2685 print "_getCredentials", count 2686 if count==0: 2687 return (self._userName.get_text(), self._password.get_text()) 2688 else: 2689 gui = self._wizard.gui 2690 config = gui.config 2691 2692 dialog = SimBriefCredentialsDialog(gui, 2693 config.simBriefUserName, 2694 config.simBriefPassword, 2695 config.rememberSimBriefPassword) 2696 response = dialog.run() 2697 2698 if response==RESPONSETYPE_OK: 2699 userName = dialog.userName 2700 self._userName.set_text(userName) 2701 password = dialog.password 2702 self._password.set_text(password) 2703 rememberPassword = dialog.rememberPassword 2704 2705 config.simBriefUserName = userName 2706 2707 config.simBriefPassword = \ 2708 password if rememberPassword else "" 2709 config.rememberSimBriefPassword = rememberPassword 2710 2711 config.save() 2712 2713 return (userName, password) 2707 2714 else: 2708 gui = self._wizard.gui 2709 config = gui.config 2710 2711 dialog = SimBriefCredentialsDialog(gui, 2712 config.simBriefUserName, 2713 config.simBriefPassword, 2714 config.rememberSimBriefPassword) 2715 response = dialog.run() 2716 2717 if response==RESPONSETYPE_OK: 2718 self._credentialsUserName = dialog.userName 2719 self._userName.set_text(self._credentialsUserName) 2720 self._credentialsPassword = dialog.password 2721 self._password.set_text(self._credentialsPassword) 2722 rememberPassword = dialog.rememberPassword 2723 2724 config.simBriefUserName = self._credentialsUserName 2725 2726 config.simBriefPassword = \ 2727 self._credentialsPassword if rememberPassword else "" 2728 config.rememberSimBriefPassword = rememberPassword 2729 2730 config.save() 2731 else: 2732 self._credentialsUserName = None 2733 self._credentialsPassword = None 2734 2735 self._credentialsAvailable = True 2736 self._credentialsCondition.notify() 2737 2738 def _simBriefProgressCallback(self, progress, result, flightInfo): 2739 """Called by the SimBrief handling thread.""" 2740 gobject.idle_add(self._simBriefProgress, progress, result, flightInfo) 2715 return (None, None) 2741 2716 2742 2717 def _simBriefProgress(self, progress, result, flightInfo): … … 2748 2723 self._wizard.gui.updateBusyState(xstr(message)) 2749 2724 else: 2750 cef.stopFastTimeout()2751 2725 self._wizard.gui.endBusy() 2752 2726 -
src/mlx/gui/gui.py
r798 r805 450 450 self.updateDone() 451 451 452 cef.initialize(self._ programDirectory, self._cefInitialized)452 cef.initialize(self._cefInitialized) 453 453 454 454 singleton.raiseCallback = self.raiseCallback
Note:
See TracChangeset
for help on using the changeset viewer.