From 903405fd8735e171b2aadc19c0d8ed2926871d65 Mon Sep 17 00:00:00 2001 From: "Natalia.Murycheva" Date: Tue, 17 Jun 2025 23:40:46 +0200 Subject: [PATCH] [PyCharm] PY-81850 Python Settings follow-up improvements #PY-81850 Ready for Merge * Added a description for the "Python" group of Settings * Added a description for the "Type Renderers" settings page * Added a description for the "External Documentation" settings page * Added a helpId for the "Type Renderers" settings page GitOrigin-RevId: 29e93e8dd7fc7f54adea825b60cf8d95540fc6b0 --- .../intellij.pycharm.community.ide.impl.xml | 2 +- .../messages/PyBundle.properties | 3 +++ .../PyUserTypeRenderersConfigurable.kt | 12 +++++++++++ .../PythonDocumentationConfigurable.java | 20 ++++++++++++++----- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml b/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml index d0c51a36af42..abb97b4b0ba1 100644 --- a/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml +++ b/python/ide/impl/resources/intellij.pycharm.community.ide.impl.xml @@ -58,7 +58,7 @@ weight="1000" bundle="messages.PyBundle" displayNameKey="settings.python.group.title" - descriptionKey="settings.python.group.title"/> + descriptionKey="settings.python.group.description"/> Configure key Python development settings to customize your coding, debugging, data visualization, and documentation workflows. runcfg.autodetect.display_name=Autodetect runcfg.autodetect.parameters.group.name=Python test @@ -676,6 +677,7 @@ configurable.PyActiveSdkModuleConfigurable.python.interpreter.display.name=Pytho configurable.PyActiveSdkModuleConfigurable.pycharm.interpreter.display.name=Interpreter configurable.PyUserTypeRenderersConfigurable.display.name=Python Type Renderers configurable.PyUserTypeRenderersConfigurable.pycharm.display.name=Type Renderers +configurable.PyUserTypeRenderersConfigurable.description= Define custom display formats for various data types across your application. configurable.plots.pycharm.display.name=Plots flask.name=Flask settings.default.remote.interpreter=Default Python Remote Interpreter @@ -914,6 +916,7 @@ pydev.console.python.interpreter.is.not.selected=Python interpreter is not selec external.documentation.python.plugin=Python External Documentation external.documentation.pycharm=External Documentation +external.documentation.description=Configure URLs for Python external documentation to enable quick access to relevant resources. external.documentation.edit.documentation.url=Edit Documentation URL external.documentation.title=Python External Documentation external.documentation.configure.description=No external documentation URL is configured for module {0}.\nWould you like to configure it now? diff --git a/python/src/com/jetbrains/python/debugger/variablesview/usertyperenderers/PyUserTypeRenderersConfigurable.kt b/python/src/com/jetbrains/python/debugger/variablesview/usertyperenderers/PyUserTypeRenderersConfigurable.kt index 93fc859fc6b6..e5f71e9b802c 100644 --- a/python/src/com/jetbrains/python/debugger/variablesview/usertyperenderers/PyUserTypeRenderersConfigurable.kt +++ b/python/src/com/jetbrains/python/debugger/variablesview/usertyperenderers/PyUserTypeRenderersConfigurable.kt @@ -15,11 +15,13 @@ import com.intellij.openapi.ui.ValidationInfo import com.intellij.openapi.util.Disposer import com.intellij.psi.util.QualifiedName import com.intellij.ui.* +import com.intellij.ui.components.JBLabel import com.intellij.ui.dsl.builder.AlignX import com.intellij.ui.dsl.builder.LabelPosition import com.intellij.ui.dsl.builder.panel import com.intellij.ui.table.JBTable import com.intellij.util.textCompletion.TextFieldWithCompletion +import com.intellij.util.ui.JBUI import com.intellij.xdebugger.XDebuggerManager import com.intellij.xdebugger.impl.XSourcePositionImpl import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl @@ -91,6 +93,14 @@ class PyUserTypeRenderersConfigurable : SearchableConfigurable { myRendererChooser.selectElements(listOf(first)) } myMainPanel.removeAll() + val border = IdeBorderFactory.createEmptyBorder(JBUI.insets(10, 0)) + val message = PyBundle.message("configurable.PyUserTypeRenderersConfigurable.description") + + myMainPanel.add( + JBUI.Panels.simplePanel(JBLabel(message)).withBorder(border), + BorderLayout.NORTH + ) + myMainPanel.add(splitter, BorderLayout.CENTER) } return myMainPanel @@ -164,6 +174,8 @@ class PyUserTypeRenderersConfigurable : SearchableConfigurable { override fun getId(): String = CONFIGURABLE_ID + override fun getHelpTopic(): String = "reference.idesettings.debugger.typerenderers" + private fun setupRendererChooser() { myRendererChooser.emptyText.text = PyBundle.message("form.debugger.variables.view.user.type.renderers.no.renderers") myRendererChooser.addElementsMarkListener(ElementsChooser.ElementsMarkListener { element, isMarked -> diff --git a/python/src/com/jetbrains/python/documentation/PythonDocumentationConfigurable.java b/python/src/com/jetbrains/python/documentation/PythonDocumentationConfigurable.java index 4c3b4c607d2b..fa2601c974ad 100644 --- a/python/src/com/jetbrains/python/documentation/PythonDocumentationConfigurable.java +++ b/python/src/com/jetbrains/python/documentation/PythonDocumentationConfigurable.java @@ -6,17 +6,19 @@ import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.ui.AddEditRemovePanel; -import com.intellij.ui.ColoredTableCellRenderer; -import com.intellij.ui.JBColor; -import com.intellij.ui.SimpleTextAttributes; +import com.intellij.ui.*; +import com.intellij.ui.components.JBLabel; import com.intellij.util.PlatformUtils; +import com.intellij.util.ui.JBUI; +import com.intellij.util.ui.components.BorderLayoutPanel; import com.jetbrains.python.PyBundle; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.border.Border; +import java.awt.*; import java.util.ArrayList; import java.util.Map; @@ -42,9 +44,17 @@ public final class PythonDocumentationConfigurable implements SearchableConfigur @Override public JComponent createComponent() { + Border border = IdeBorderFactory.createEmptyBorder(JBUI.insets(10, 0)); + JPanel panelWithDescription = JBUI.Panels.simplePanel(new JBLabel(PyBundle.message("external.documentation.description"))).withBorder(border); + SwingUtilities.updateComponentTreeUI(myPanel); // TODO: create Swing components in this method (see javadoc) myPanel.getTable().setShowGrid(false); - return myPanel; + + BorderLayoutPanel myComponent = new BorderLayoutPanel() + .addToTop(panelWithDescription) + .addToCenter(myPanel); + + return myComponent; } @Override