mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-25 12:42:41 -06:00
95 lines
3.8 KiB
Python
95 lines
3.8 KiB
Python
|
from direct.p3d.PackageInstaller import PackageInstaller
|
||
|
from direct.gui.DirectWaitBar import DirectWaitBar
|
||
|
from direct.gui import DirectGuiGlobals as DGG
|
||
|
|
||
|
class DWBPackageInstaller(DirectWaitBar, PackageInstaller):
|
||
|
""" This class presents a PackageInstaller that also inherits from
|
||
|
DirectWaitBar, so it updates its own GUI as it downloads.
|
||
|
|
||
|
Specify perPackage = True to make the progress bar reset for each
|
||
|
package, or False (the default) to show one continuous progress
|
||
|
bar for all packages.
|
||
|
|
||
|
Specify updateText = True (the default) to update the text label
|
||
|
with the name of the package or False to leave it up to you to set
|
||
|
it.
|
||
|
|
||
|
You can specify a callback function with finished = func; this
|
||
|
function will be called, with one boolean parameter, when the
|
||
|
download has completed. The parameter will be true on success, or
|
||
|
false on failure.
|
||
|
"""
|
||
|
|
||
|
def __init__(self, appRunner, parent = None, **kw):
|
||
|
PackageInstaller.__init__(self, appRunner)
|
||
|
|
||
|
optiondefs = (
|
||
|
('borderWidth', (0.01, 0.01), None),
|
||
|
('relief', DGG.SUNKEN, self.setRelief),
|
||
|
('range', 1, self.setRange),
|
||
|
('barBorderWidth', (0.01, 0.01), self.setBarBorderWidth),
|
||
|
('barColor', (0.424, 0.647, 0.878, 1), self.setBarColor),
|
||
|
('barRelief', DGG.RAISED, self.setBarRelief),
|
||
|
('text', 'Starting', self.setText),
|
||
|
('text_pos', (0, -0.025), None),
|
||
|
('text_scale', 0.1, None),
|
||
|
('perPackage', False, None),
|
||
|
('updateText', True, None),
|
||
|
('finished', None, None),
|
||
|
)
|
||
|
self.defineoptions(kw, optiondefs)
|
||
|
DirectWaitBar.__init__(self, parent, **kw)
|
||
|
self.initialiseoptions(DWBPackageInstaller)
|
||
|
self.updateBarStyle()
|
||
|
|
||
|
# Hidden by default until the download begins.
|
||
|
self.hide()
|
||
|
|
||
|
def cleanup(self):
|
||
|
PackageInstaller.cleanup(self)
|
||
|
DirectWaitBar.destroy(self)
|
||
|
|
||
|
def destroy(self):
|
||
|
PackageInstaller.cleanup(self)
|
||
|
DirectWaitBar.destroy(self)
|
||
|
|
||
|
def packageStarted(self, package):
|
||
|
""" This callback is made for each package between
|
||
|
downloadStarted() and downloadFinished() to indicate the start
|
||
|
of a new package. """
|
||
|
if self['updateText']:
|
||
|
self['text'] = 'Installing %s' % (package.getFormattedName())
|
||
|
self.show()
|
||
|
|
||
|
def packageProgress(self, package, progress):
|
||
|
""" This callback is made repeatedly between packageStarted()
|
||
|
and packageFinished() to update the current progress on the
|
||
|
indicated package only. The progress value ranges from 0
|
||
|
(beginning) to 1 (complete). """
|
||
|
|
||
|
if self['perPackage']:
|
||
|
self['value'] = progress * self['range']
|
||
|
|
||
|
def downloadProgress(self, overallProgress):
|
||
|
""" This callback is made repeatedly between downloadStarted()
|
||
|
and downloadFinished() to update the current progress through
|
||
|
all packages. The progress value ranges from 0 (beginning) to
|
||
|
1 (complete). """
|
||
|
|
||
|
if not self['perPackage']:
|
||
|
self['value'] = overallProgress * self['range']
|
||
|
|
||
|
def downloadFinished(self, success):
|
||
|
""" This callback is made when all of the packages have been
|
||
|
downloaded and installed (or there has been some failure). If
|
||
|
all packages where successfully installed, success is True.
|
||
|
|
||
|
If there were no packages that required downloading, this
|
||
|
callback will be made immediately, *without* a corresponding
|
||
|
call to downloadStarted(). """
|
||
|
|
||
|
self.hide()
|
||
|
|
||
|
if self['finished']:
|
||
|
self['finished'](success)
|