"""Dialog-box to display a message to the user during a lenghty operation."""
# Author(s): Davide.De-Marchi@ec.europa.eu
# Copyright © European Union 2022-2023
#
# Licensed under the EUPL, Version 1.2 or as soon they will be approved by
# the European Commission subsequent versions of the EUPL (the "Licence");
#
# You may not use this work except in compliance with the Licence.
#
# You may obtain a copy of the Licence at:
# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
# Unless required by applicable law or agreed to in writing, software
# distributed under the Licence is distributed on an "AS IS"
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied.
#
# See the Licence for the specific language governing permissions and
# limitations under the Licence.
import traitlets
from IPython.display import display
import ipyvuetify as v
try:
from . import settings
except:
import settings
#####################################################################################################################################################
# Wait dialog for lenghty operations
# Example of usage:
#
# from ipywidgets import HTML, widgets, Layout
#
# out = widgets.Output()
# display(out)
#
# dlg = dialogWait(out=out, text='Please wait for data loading...')
# with out:
# display(dlg)
#
# dlg.close()
#####################################################################################################################################################
[docs]class dialogWait(v.VuetifyTemplate):
"""
Dialog-box to display a message to the user during a lenghty operation.
Parameters
----------
text : str, optional
Text to display on top of the dialog-box body (default is '')
indeterminate : bool, optional
If True the progress bar will constantly animate (to be used when completion progress is unknown). Default is True.
If set to False, setting the value property of the dialog (e.g.: dlg.value = 30) to the percentage will change the progress bar.
height : int, optional
Height of the progress bar in pixels (default is 4)
linecolor : str, optional
Color of the progress bar (default is None, meaning that the progress bar will be white or black depending on settings.dark_mode)
showtext : bool, optional
If True the percentage text will be displayed at the center of the progress bar (default is False)
textcolor : str, optional
Color of the percentage text displayed if the showtext parameter is True (default is '#cccccc')
output : ipywidgets.Output, optional
Output widget on which the widget has to be displayed
Example
-------
Creation and display of dialogWait during a lenghty operation::
from vois.vuetify import dialogWait
from ipywidgets import widgets
from IPython.display import display
output = widgets.Output()
display(output)
dlg = dialogWait.dialogWait(text='Please wait for processing to terminate...',
output=output)
.. figure:: figures/dialogWait.png
:scale: 100 %
:alt: dialogYesNo widget
Example of a dialogWait opened during a lenghty operation.
"""
dialog = traitlets.Bool(True).tag(sync=True)
text = traitlets.Unicode('').tag(sync=True)
indeterminate = traitlets.Bool(True).tag(sync=True)
value = traitlets.Int(40).tag(sync=True)
height = traitlets.Int(5).tag(sync=True)
showtext = traitlets.Bool(False).tag(sync=True)
textcolor = traitlets.Unicode('#cccccc').tag(sync=True)
@traitlets.default('template')
def _template(self):
darkmode = ''
if settings.dark_mode:
darkmode = 'dark'
if not self.linecolor is None:
linecolor = self.linecolor
else:
linecolor = settings.textcolor_notdark
if settings.dark_mode:
linecolor = settings.textcolor_dark
sss = ''
if self.showtext:
sss = '''
<template v-slot:default="{ value }">
<strong style="color: %s;">{{ Math.ceil(value) }}%%</strong>
</template>
''' % self.textcolor
return '''
<template>
<div class="text-center">
<v-dialog
v-model="dialog"
hide-overlay
persistent
width="300"
style='z-index:20001;'
>
<v-card
color="%s"
%s
>
<v-card-text>
<br>{{ text }}
<v-progress-linear
:indeterminate="indeterminate"
:value="value"
:height="height"
color="%s"
class="mb-0 mt-2">
%s
</v-progress-linear>
</v-card-text>
</v-card>
</v-dialog>
</div>
</template>''' % (settings.color_first, darkmode, linecolor, sss)
def __init__(self, output=None, text='Please wait...', indeterminate=True, height=4, linecolor=None, showtext=False, textcolor='#cccccc', *args, **kwargs):
self.text = text
self.indeterminate = indeterminate
self.height = height
self.linecolor = linecolor
self.showtext = showtext
self.textcolor = textcolor
self.value = 0
super().__init__(*args, **kwargs)
if not output is None:
with output:
display(self)
[docs] def close(self):
"""Close the dialogWait."""
self.dialog = False