diff --git a/source/globalCommands.py b/source/globalCommands.py index 38ed2224325..6507ac4512d 100755 --- a/source/globalCommands.py +++ b/source/globalCommands.py @@ -340,8 +340,9 @@ def script_reportCurrentSelection(self, gesture): if scriptCount == 0: speech.speakTextSelected(info.text) braille.handler.message(selectMessage) + elif scriptCount == 3: - ui.browseableMessage(info.text, copyButton=True, closeButton=True) + ui.browseableMessage(info.text) return elif len(info.text) < speech.speech.MAX_LENGTH_FOR_SELECTION_REPORTING: @@ -2209,7 +2210,7 @@ def script_review_currentSymbol(self, gesture): languageDescription = languageHandler.getLanguageDescription(curLanguage) # Translators: title for expanded symbol dialog. Example: "Expanded symbol (English)" title = _("Expanded symbol ({})").format(languageDescription) - ui.browseableMessage(message, title, closeButton=True) + ui.browseableMessage(message, title) @script( description=_( @@ -2440,8 +2441,6 @@ def _reportFormattingHelper(self, info, browseable=False): message, # Translators: title for formatting information dialog. _("Formatting"), - copyButton=True, - closeButton=True, ) @staticmethod @@ -4141,7 +4140,7 @@ def script_reportLinkDestination( ) -> None: """Generates a ui.message or ui.browseableMessage of a link's destination, if focus or caret is positioned on a link, or an element with an included link such as a graphic. - :param forceBrowseable: skips the press once check, and displays the browseableMessage version. + @param forceBrowseable: skips the press once check, and displays the browseableMessage version. """ try: ti: textInfos.TextInfo = api.getCaretPosition() @@ -4175,8 +4174,6 @@ def script_reportLinkDestination( # Translators: Informs the user that the window contains the destination of the # link with given title title=_("Destination of: {name}").format(name=obj.name), - closeButton=True, - copyButton=True, ) elif presses == 0: # One press ui.message(linkDestination) # Speak the link diff --git a/source/message.html b/source/message.html index 1c7591332e1..0e9396315e5 100644 --- a/source/message.html +++ b/source/message.html @@ -4,90 +4,24 @@ - -
- - - - - + +
diff --git a/source/ui.py b/source/ui.py index cab86177c28..83bca0c26c8 100644 --- a/source/ui.py +++ b/source/ui.py @@ -46,11 +46,10 @@ HTMLDLG_VERIFY = 0x0100 -def _warnBrowsableMessageNotAvailableOnSecureScreens(title: str | None = None) -> None: +def _warnBrowsableMessageNotAvailableOnSecureScreens(title: Optional[str]) -> None: """Warn the user that a browsable message could not be shown on a secure screen (sign-on screen / UAC prompt). - - :param title: If provided, the title of the browsable message to give the user more context. + @param title: If provided, the title of the browsable message to give the user more context. """ log.warning( "While on secure screens browsable messages can not be used." @@ -89,67 +88,13 @@ def _warnBrowsableMessageNotAvailableOnSecureScreens(title: str | None = None) - ) -def _warnBrowsableMessageComponentFailure(title: str | None = None) -> None: - """Warn the user that a browsable message could not be shown because of a component failure. - - :param title: If provided, the title of the browsable message to give the user more context. - """ - log.warning( - "A browsable message could not be shown because of a component failure." - f" Attempted to open message with title: {title!r}", - ) - - if not title: - browsableMessageUnavailableMsg: str = _( - # Translators: This is the message for a warning shown if NVDA cannot open a browsable message window - # because of a component failure. - "An error has caused this feature to be unavailable at this time. " - "Restarting NVDA or Windows may solve this problem.", - ) - else: - browsableMessageUnavailableMsg: str = _( - # Translators: This is the message for a warning shown if NVDA cannot open a browsable message window - # because of a component failure. This prompt includes the title - # of the Window that could not be opened for context. - # The {title} will be replaced with the title. - # The title may be something like "Formatting". - "An error has caused this feature ({title}) to be unavailable at this time. " - "Restarting NVDA or Windows may solve this problem.", - ) - browsableMessageUnavailableMsg = browsableMessageUnavailableMsg.format(title=title) - - import wx # Late import to prevent circular dependency. - import gui # Late import to prevent circular dependency. - - log.debug("Presenting browsable message unavailable warning.") - gui.messageBox( - browsableMessageUnavailableMsg, - # Translators: This is the title for a warning dialog, shown if NVDA cannot open a browsable message. - caption=_("Feature unavailable."), - style=wx.ICON_ERROR | wx.OK, - ) - - -def browseableMessage( - message: str, - title: str | None = None, - isHtml: bool = False, - closeButton: bool = False, - copyButton: bool = False, -) -> None: +def browseableMessage(message: str, title: Optional[str] = None, isHtml: bool = False) -> None: """Present a message to the user that can be read in browse mode. The message will be presented in an HTML document. - - :param message: The message in either html or text. - :param title: The title for the message, defaults to "NVDA Message". - :param isHtml: Whether the message is html, defaults to False. - :param closeButton: Whether to include a "close" button, defaults to False. - :param copyButton: Whether to include a "copy" (to clipboard) button, defaults to False. + @param message: The message in either html or text. + @param title: The title for the message. + @param isHtml: Whether the message is html """ - if title is None: - # Translators: The title for the dialog used to present general NVDA messages in browse mode. - title = _("NVDA Message") - if isRunningOnSecureDesktop(): import wx # Late import to prevent circular dependency. @@ -158,65 +103,37 @@ def browseableMessage( htmlFileName = os.path.join(globalVars.appDir, "message.html") if not os.path.isfile(htmlFileName): - _warnBrowsableMessageComponentFailure(title) raise LookupError(htmlFileName) - moniker = POINTER(IUnknown)() - try: - windll.urlmon.CreateURLMonikerEx(0, htmlFileName, byref(moniker), URL_MK_UNIFORM) - except Exception as e: - log.error(f"Failed to create URL moniker: {e}") - _warnBrowsableMessageComponentFailure(title) - return - + windll.urlmon.CreateURLMonikerEx(0, htmlFileName, byref(moniker), URL_MK_UNIFORM) + if not title: + # Translators: The title for the dialog used to present general NVDA messages in browse mode. + title = _("NVDA Message") + if not isHtml: + message = f"
{escape(message)}
" try: d = comtypes.client.CreateObject("Scripting.Dictionary") except (COMError, OSError): log.error("Scripting.Dictionary component unavailable", exc_info=True) - _warnBrowsableMessageComponentFailure(title) + # Store the module level message function in a new variable since it is masked by a local variable with + # the same name + messageFunction = globals()["message"] + # Translators: reported when unable to display a browsable message. + messageFunction(_("Unable to display browseable message")) return d.add("title", title) - - if not isHtml: - message = escape(message) - else: - d.add("messageUsesRawHTML", "true") # Value doesn't matter, as long as there is one - log.warning("Passing raw HTML to ui.browseableMessage!") d.add("message", message) - - # Translators: A notice to the user that a copy operation succeeded. - d.add("copySuccessfulAlertText", _("Text copied.")) - # Translators: A notice to the user that a copy operation failed. - d.add("copyFailedAlertText", _("Couldn't copy to clipboard.")) - if closeButton: - # Translators: The text of a button which closes the window. - d.add("closeButtonText", _("Close")) - if copyButton: - # Translators: The label of a button to copy the text of the window to the clipboard. - d.add("copyButtonText", _("Copy")) - # Translators: A portion of an accessibility label for the "Copy" button, - # describing the key to press to activate the button. Currently, this key may only be Alt+C. - # Translation makes sense here if the Alt key is called something else in a given language; - # or to set this to the empty string if that key combination is unavailable on some keyboard. - d.add("copyButtonAcceleratorAccessibilityLabel", _("Alt+C")) - dialogArgsVar = automation.VARIANT(d) gui.mainFrame.prePopup() - try: - windll.mshtml.ShowHTMLDialogEx( - gui.mainFrame.Handle, - moniker, - HTMLDLG_MODELESS, - byref(dialogArgsVar), - DIALOG_OPTIONS, - None, - ) - except Exception as e: - log.error(f"Failed to show HTML dialog: {e}") - _warnBrowsableMessageComponentFailure(title) - return - finally: - gui.mainFrame.postPopup() + windll.mshtml.ShowHTMLDialogEx( + gui.mainFrame.Handle, + moniker, + HTMLDLG_MODELESS, + byref(dialogArgsVar), + DIALOG_OPTIONS, + None, + ) + gui.mainFrame.postPopup() def message( diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index f597aedb0b6..eb318fa7f1e 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -21,7 +21,6 @@ The available options are: ### Changes * The `-c`/`--config-path` and `--disable-addons` command line options are now respected when launching an update from within NVDA. (#16937) -* The Report link destination, Character formatting information, and Speak selection dialogs, now include "Close" and "Copy" buttons for user convenience. (#16369, @XLTechie) * eSpeak NG has been updated to 1.52-dev commit `961454ff`. (#16775) * Added new languages Faroese and Xextan. @@ -55,7 +54,6 @@ Please refer to [the developer guide](https://www.nvaccess.org/files/nvda/docume * Please consult the [Custom speech symbol dictionaries section in the developer guide](https://www.nvaccess.org/files/nvda/documentation/developerGuide.html#AddonSymbolDictionaries) for more details. * It is now possible to redirect objects retrieved from on-screen coordinates, by using the `NVDAObject.objectFromPointRedirect` method. (#16788, @Emil-18) * Running SCons with the parameter `--all-cores` will automatically pick the maximum number of available CPU cores. (#16943, #16868, @LeonarddeR) -* `ui.browseableMessage` may now be called with options to present a button for copying to clipboard, and/or a button for closing the window. (#16369, @XLTechie) * Developer info now includes information on app architecture (such as AMD64) for the navigator object. (#16488, @josephsl) #### Deprecations