Show webdialog quicker?
-
A couple of times I've tried to load a webdialo with a simple static html page quickly - under 5 seconds. Like a splash screen or processing screen. I would like it to open, and have ruby keep processing in the background.
But I keep finding that it doesn't fully load the splash screen. It opens the window, but never actually populates the webpage with content.
Is that normal? Is there a workaround? If I put a UI.messagebox immediately after showing the webdialog, then that seems the let it catch up and display the content. But obviously I don't want to pop up a window each time we see this splash screen like thing.
So, any ideas what I do to let it pause long enough to load the splash screen or something? Thanks!
Chris
-
what if the WD is created before, so you only call .show or .show_modal during the process...
a thought
john
-
In one of the cases I could try that. I think I had done that, and it did not work - but maybe I'm wrong. I'll try that again when get back to that particaul instance.
On the one that prompted me to ask the question - the part I'm working on right now - this is literally a splash screen that I was planning to show when the script loads. So I don't have the ability to load it all, then show it later. There is no later. Its all a continuous ruby process, if that makes sense? I'm not convinced I'm right.
But it did get me thinking. I could place the rest of my script loading inside a method that is called from my splash screen web dialog.
So my loader would load a webdialog with a callback to SketchUp that then triggers the rest of the script loading. That way ruby does not continue on loading until the webdialog calls it. That might be an option?
-
an onDomReady event call might be worth looking at.
there are plain vanila js versions out there, but he's some food for thought http://developer.yahoo.com/yui/examples/event/event-timing.html
john -
what does the code for the splashscreen html look like?
Are you using an IMG element, or just setting the background of the BODY and HTML elements to the graphic file ?
-
This is the entire html page
<html> <body> <img border="0" src="./logo_image.jpg" alt="Pulpit rock" width="800" height="600" /> </body> </html>
-
Windows and OSX loads WebDialogs differently. OSX loads the content immediately when you use set_html or set_file, while Windows defer it until .show. )From the top of my heard I cannot remember if Windows reloaded the content on each .show either...)
But as mentioned, the DOM ready event is the first event you can get when the HTML structure is loaded. jQuery makes this easy cross platform.
-
@chris fullmer said:
This is the entire html page
<html> > <body> > > <img border="0" src="./logo_image.jpg" alt="Pulpit rock" width="800" height="600" /> > > </body> > </html> >
And this takes some times 5 seconds to load?
-
I think SU just doesn't let the html page load. Here is the extent of my ruby. Perhaps there is some way to write this better so it lets the webpage load?
splash_path = File.join( Install.base_path, "assets", "splash.html" ) @@spalsh_wd = UI;;WebDialog.new("MyProject", true, myproject_splash", 800, 600, 200, 200, true); @@spalsh_wd.set_url splash_path @@spalsh_wd.show
Then here's some optional code I use to test if it loads if I pause ruby. Running the while loop for 5 seconds does nothing. Popping up the UI.messagebox though works like a charm. But I don't want to pop open the messagebox. sleep will pause the system, but does not let the webdialog load.
UI.messagebox "" or time_mark = ( Time.now + 1 ) while time_mark > Time.now end or sleep 5.0
EDIT: And of course I close it after my script loads with
@@spalsh_wd.close
So any thoughts? Am I just loading the webdialog wrong?
-
If you do heavy calculations, then the webdialog freezes or doesn't update. In one of my plugins I wanted to display a waiting animation with execute_script and then loop over thousands of entities. When I paused ruby with
sleep(5)
, it didn't help, it worked only with:
webdlg.execute_script("startProcess()") UI.start_timer(0.1, false){self.process()}
-
I don't understand what that self.process in the block does.
But I tried to implement it and no luck.
Oh well, if I don't close it, then it will eventually load the image once SU has completed loading all the other scripts. Then the user will have to close the splash screen themselves.
-
how about writing the image file in a .set_html.
AdamB does it in Goldilocks .rb and it's doing other stuff at the same timejohn
-
A long shot. Saw something like this earlier today..
One cannot use a body onload? Like <body onload="jsFunction()">.
A <div> in the <body> with an ID.Then a jsfunction in the script tag that grabs the div's ID and set the HTML inside?
Excuse my interuption, just wondering about this as well..
-
OK, Aerilius got me on the right track, just took a little digging around on my part.
Here is what is working for me (sorry it looks hard to read in this little code box. Its only 4 lines of code, much of it being my html string.):
splash_path = File.join( Install.base_path, "assets") @@splash_wd = UI;;WebDialog.new("MyProgram", true, "my_splash", 800, 600, 200, 200, true); UI.start_timer(0.1, false){@@splash_wd.show;@@splash_wd.set_html "<html><body><img border='0' src='#{splash_path}/logo_image.jpg' alt='Pulpit rock' width='800' height='600' /></body></html>"} UI.start_timer(2, false){@@splash_wd.close}
I open the webdialog, and set_html within the UI_time procedure. That is all it takes to get it to completely show everything. Then I use another timer to close the window after the splash has been on for a little while.
I'm guessing I don't even need to pass the html in as a string. It will probably load the file this way as well. i'll test.
Thanks everyone!
-
chris, is it meant to work on macs?
-
ok, even a little cleaner. This way I can use set_file to set a file to point to, instead of an html string.
splash_path = File.join( Install.base_path, "assets", "splash.html") @@splash_wd = UI;;WebDialog.new("MultiFlux", true, "multiflux_splash", 800, 600, 200, 200, true); @@splash_wd.set_file splash_path UI.start_timer(0.1, false){@@splash_wd.show;} UI.start_timer(3, false){@@splash_wd.close}
It is just the
webdlg.show
that needs to inside theUI.start_timer
procedure. Now it all loads and displays as desired. -
At this point, no unfortunately. It is not a Mac plugin. HOWEVER, I'm trying hard to mac it close to MAC friendly so we can get it up and running on Mac's someday.
Are all the methods I've used so far Mac friendly?
-
@chris fullmer said:
Are all the methods I've used so far Mac friendly?
If you want the WebDialog to stay on top of the SketchUp window you want to use .show_modal under OSX. Under OSX that method doesn't produce a modal window like under Windows.
-
and .set_html has a problem with local files... john
-
Oh, ok. I'll put in the set_modal for future use. And I'll stick with my .set_file method then. Its cleaner in my ruby code and there is no reason at this point to load the html as a string.
Thanks guys!,
Chris
Advertisement