Source code for IconClipboard

"""IconButton to copy text to the clipboard."""
# Author(s): Davide.De-Marchi@ec.europa.eu
# Copyright © European Union 2022-2024
# 
# 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.
from IPython.display import display
from IPython.display import HTML as ipyHTML
import ipyvuetify as v

from vois.vuetify import settings, iconButton
            
###########################################################################################################################################################################
# Icon button to copy a text to the clipboard
###########################################################################################################################################################################
[docs] class IconClipboard(v.Html): """ IconButton to copy text to the clipboard. Parameters ---------- output : ipywidgets.Output Output widget to be used to execute javacript code to copy the text to the clipboard text : str, optional Text to be copied to the clipboard (default is '', it can be changed using the 'text' property) color : str, optional Color used for the widget (default is the color_first defined in the settings.py module) outlined : bool, optional If True applies a thin border to the button (default is False) rounded : bool, optional If True the shape of the button is rounded (default is True) width : str, optional Width of the widget (default is None) large : bool, optional If True makes the button large (default is False) small : bool, optional If True makes the button small (default is False) x_large : bool, optional If True makes the button extra-large (default is False) x_small : bool, optional If True makes the button extra-small (default is False) margins : str, optional Marging apply to the button (default is 'pa-0 ma-0') tooltip : str, optional Tooltip text for the button (default is 'Click to copy text to the clipboard') Example ------- Creation and display of an icon button to copy some text content to the clipboard:: from vois.vuetify import IconClipboard from IPython.display import display b = IconClipboard() display(b) b.text = 'Text to copy to the clipboard' """ def __init__(self, output, text='', color=None, outlined=False, rounded=True, width=None, large=False, small=False, x_large=False, x_small=False, margins='pa-0 ma-0', tooltip='Click to copy text to the clipboard', **kwargs ): super().__init__(**kwargs) self.output = output self._text = text self._color = color if self._color is None: self._color = settings.color_first self.b = iconButton.iconButton(icon='mdi-content-copy', color=self._color, onclick=self.onclick, tooltip=tooltip, outlined=outlined, rounded=rounded, width=width, large=large, small=small, x_large=x_large, x_small=x_small, margins=margins, disabled=len(self._text)==0) self.tag = 'div' self.children = [self.b.draw()] # "old" draw def draw(self): return self # Manage click event def onclick(self): with self.output: display(ipyHTML(''' <script> navigator.clipboard.writeText("%s"); //navigator.clipboard.readText().then((clipText) => (console.log("clipboard: "+clipText))) </script>'''%self._text)) @property def text(self): return self._text @text.setter def text(self, t): self._text = t.replace("\n","\\"+"n") # V.I. Need to have two separate character "\" + "n" if a text with newline is copied to the clipboard!!! self.b.disabled = len(self._text)==0