From 057c5f332934dd0c16093cd71b8160d3dc688abe Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Thu, 6 Feb 2014 20:16:08 +0400 Subject: [PATCH] initial python project interpreters page --- .../packaging/InstalledPackagesPanel.java | 203 ++++++++---------- .../PyActiveSdkConfigurable.form | 40 ---- .../PyActiveSdkConfigurable.java | 111 ++++++++-- .../PyActiveSdkModuleConfigurable.java | 13 +- .../com/jetbrains/python/interpreterGear.png | Bin 0 -> 509 bytes .../jetbrains/python/interpreterGear@2x.png | Bin 0 -> 1019 bytes .../python/interpreterGear@2x_dark.png | Bin 0 -> 1090 bytes .../jetbrains/python/interpreterGear_dark.png | Bin 0 -> 537 bytes python/src/icons/PythonIcons.java | 1 + 9 files changed, 189 insertions(+), 179 deletions(-) delete mode 100644 python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.form create mode 100644 python/resources/icons/com/jetbrains/python/interpreterGear.png create mode 100644 python/resources/icons/com/jetbrains/python/interpreterGear@2x.png create mode 100644 python/resources/icons/com/jetbrains/python/interpreterGear@2x_dark.png create mode 100644 python/resources/icons/com/jetbrains/python/interpreterGear_dark.png diff --git a/platform/lang-impl/src/com/intellij/webcore/packaging/InstalledPackagesPanel.java b/platform/lang-impl/src/com/intellij/webcore/packaging/InstalledPackagesPanel.java index 5595212c4519..4aee4b7c2389 100644 --- a/platform/lang-impl/src/com/intellij/webcore/packaging/InstalledPackagesPanel.java +++ b/platform/lang-impl/src/com/intellij/webcore/packaging/InstalledPackagesPanel.java @@ -2,6 +2,7 @@ package com.intellij.webcore.packaging; import com.google.common.collect.Lists; import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -9,13 +10,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.DoubleClickListener; -import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.*; import com.intellij.ui.table.JBTable; import com.intellij.util.CatchingConsumer; import com.intellij.util.Consumer; +import com.intellij.util.IconUtil; import com.intellij.util.ObjectUtils; -import com.intellij.util.containers.*; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,20 +27,16 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.*; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class InstalledPackagesPanel extends JPanel { - protected final JButton myInstallButton; - private final JButton myUninstallButton; - private final JButton myUpgradeButton; + private final AnActionButton myUpgradeButton; + protected final AnActionButton myInstallButton; + private final AnActionButton myUninstallButton; protected final JBTable myPackagesTable; private DefaultTableModel myPackagesTableModel; @@ -51,19 +48,9 @@ public class InstalledPackagesPanel extends JPanel { private final Set myWaitingToUpgrade = ContainerUtil.newHashSet(); public InstalledPackagesPanel(Project project, PackagesNotificationPanel area) { - super(new GridBagLayout()); + super(new BorderLayout()); myProject = project; myNotificationArea = area; - myInstallButton = new JButton("Install"); - myUninstallButton = new JButton("Uninstall"); - myUpgradeButton = new JButton("Upgrade"); - myInstallButton.setMnemonic('I'); - myUninstallButton.setMnemonic('U'); - myUpgradeButton.setMnemonic('p'); - - myInstallButton.setEnabled(false); - myUninstallButton.setEnabled(false); - myUpgradeButton.setEnabled(false); myPackagesTableModel = new DefaultTableModel(new String[]{"Package", "Version", "Latest"}, 0) { @Override @@ -80,25 +67,37 @@ public class InstalledPackagesPanel extends JPanel { }; myPackagesTable.getTableHeader().setReorderingAllowed(false); - Insets anInsets = new Insets(2, 2, 2, 2); - JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myPackagesTable, - ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setPreferredSize(new Dimension(500, 500)); - add(scrollPane, new GridBagConstraints(0, 0, 1, 3, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, - anInsets, 0, 0)); + myUpgradeButton = new AnActionButton("Upgrade", IconUtil.getMoveUpIcon()) { + @Override + public void actionPerformed(AnActionEvent e) { + upgradeAction(); + } + }; + final ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myPackagesTable).disableUpDownActions() + .setAddAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + if (myPackageManagementService != null) { + ManagePackagesDialog dialog = createManagePackagesDialog(); + dialog.show(); + } + } + }) + .setRemoveAction(new AnActionButtonRunnable() { + @Override + public void run(AnActionButton button) { + uninstallAction(); + } + }) + .addExtraAction(myUpgradeButton); - addUninstallAction(); - addUpgradeAction(); - - add(myInstallButton, - new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, - anInsets, 0, 0)); - add(myUninstallButton, - new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, - anInsets, 0, 0)); - add(myUpgradeButton, - new GridBagConstraints(1, 2, 1, 1, 0.0, 1.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, anInsets, 0, 0)); + decorator.setPreferredSize(new Dimension(500, 500)); + add(decorator.createPanel()); + myInstallButton = decorator.getActionsPanel().getAnActionButton(CommonActionsPanel.Buttons.ADD); + myUninstallButton = decorator.getActionsPanel().getAnActionButton(CommonActionsPanel.Buttons.REMOVE); + myInstallButton.setEnabled(false); + myUninstallButton.setEnabled(false); + myUpgradeButton.setEnabled(false); myPackagesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override @@ -107,16 +106,6 @@ public class InstalledPackagesPanel extends JPanel { } }); - myInstallButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - if (myPackageManagementService != null) { - ManagePackagesDialog dialog = createManagePackagesDialog(); - dialog.show(); - } - } - }); - new DoubleClickListener() { @Override protected boolean onDoubleClick(MouseEvent e) { @@ -162,38 +151,33 @@ public class InstalledPackagesPanel extends JPanel { myPathChangedListeners.add(consumer); } - private void addUpgradeAction() { - myUpgradeButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - final int[] rows = myPackagesTable.getSelectedRows(); - if (myPackageManagementService != null) { - final Set upgradedPackages = new HashSet(); - final Set packagesShouldBePostponed = getPackagesToPostpone(); - for (int row : rows) { - final Object packageObj = myPackagesTableModel.getValueAt(row, 0); - if (packageObj instanceof InstalledPackage) { - InstalledPackage pkg = (InstalledPackage)packageObj; - final String packageName = pkg.getName(); - final String currentVersion = pkg.getVersion(); - final String availableVersion = (String)myPackagesTableModel.getValueAt(row, 2); + private void upgradeAction() { + final int[] rows = myPackagesTable.getSelectedRows(); + if (myPackageManagementService != null) { + final Set upgradedPackages = new HashSet(); + final Set packagesShouldBePostponed = getPackagesToPostpone(); + for (int row : rows) { + final Object packageObj = myPackagesTableModel.getValueAt(row, 0); + if (packageObj instanceof InstalledPackage) { + InstalledPackage pkg = (InstalledPackage)packageObj; + final String packageName = pkg.getName(); + final String currentVersion = pkg.getVersion(); + final String availableVersion = (String)myPackagesTableModel.getValueAt(row, 2); - if (packagesShouldBePostponed.contains(packageName)) { - myWaitingToUpgrade.add((InstalledPackage)packageObj); - } - else if (PackageVersionComparator.VERSION_COMPARATOR.compare(currentVersion, availableVersion) < 0) { - upgradePackage(pkg, availableVersion); - upgradedPackages.add(packageName); - } - } + if (packagesShouldBePostponed.contains(packageName)) { + myWaitingToUpgrade.add((InstalledPackage)packageObj); } - - if (myCurrentlyInstalling.isEmpty() && upgradedPackages.isEmpty() && !myWaitingToUpgrade.isEmpty()) { - upgradePostponedPackages(); + else if (PackageVersionComparator.VERSION_COMPARATOR.compare(currentVersion, availableVersion) < 0) { + upgradePackage(pkg, availableVersion); + upgradedPackages.add(packageName); } } } - }); + + if (myCurrentlyInstalling.isEmpty() && upgradedPackages.isEmpty() && !myWaitingToUpgrade.isEmpty()) { + upgradePostponedPackages(); + } + } } private void upgradePostponedPackages() { @@ -322,43 +306,38 @@ public class InstalledPackagesPanel extends JPanel { return true; } - private void addUninstallAction() { - myUninstallButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(final ActionEvent e) { - final List packages = getSelectedPackages(); - final PackageManagementService selPackageManagementService = myPackageManagementService; - if (selPackageManagementService != null) { - PackageManagementService.Listener listener = new PackageManagementService.Listener() { - @Override - public void operationStarted(String packageName) { - myPackagesTable.setPaintBusy(true); - } - - @Override - public void operationFinished(String packageName, @Nullable String errorDescription) { - myPackagesTable.clearSelection(); - updatePackages(selPackageManagementService); - myPackagesTable.setPaintBusy(false); - if (errorDescription == null) { - if (packageName != null) { - myNotificationArea.showSuccess("Package '" + packageName + "' successfully uninstalled"); - } - else { - myNotificationArea.showSuccess("Packages successfully uninstalled"); - } - } - else { - myNotificationArea.showError("Uninstall packages failed. Details...", - "Uninstall Packages Failed", - "Uninstall packages failed.\n" + errorDescription); - } - } - }; - myPackageManagementService.uninstallPackages(packages, listener); + private void uninstallAction() { + final List packages = getSelectedPackages(); + final PackageManagementService selPackageManagementService = myPackageManagementService; + if (selPackageManagementService != null) { + PackageManagementService.Listener listener = new PackageManagementService.Listener() { + @Override + public void operationStarted(String packageName) { + myPackagesTable.setPaintBusy(true); } - } - }); + + @Override + public void operationFinished(String packageName, @Nullable String errorDescription) { + myPackagesTable.clearSelection(); + updatePackages(selPackageManagementService); + myPackagesTable.setPaintBusy(false); + if (errorDescription == null) { + if (packageName != null) { + myNotificationArea.showSuccess("Package '" + packageName + "' successfully uninstalled"); + } + else { + myNotificationArea.showSuccess("Packages successfully uninstalled"); + } + } + else { + myNotificationArea.showError("Uninstall packages failed. Details...", + "Uninstall Packages Failed", + "Uninstall packages failed.\n" + errorDescription); + } + } + }; + myPackageManagementService.uninstallPackages(packages, listener); + } } @NotNull diff --git a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.form b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.form deleted file mode 100644 index 79a648b213a2..000000000000 --- a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.form +++ /dev/null @@ -1,40 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java index e4f22dd51e60..807c8af0edd6 100644 --- a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java +++ b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkConfigurable.java @@ -32,52 +32,133 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ModuleRootModificationUtil; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; +import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.CollectionComboBoxModel; +import com.intellij.util.ui.UIUtil; +import com.intellij.webcore.packaging.PackagesNotificationPanel; +import com.jetbrains.python.packaging.ui.PyInstalledPackagesPanel; +import com.jetbrains.python.packaging.ui.PyPackageManagementService; import com.jetbrains.python.psi.LanguageLevel; import com.jetbrains.python.sdk.PySdkListCellRenderer; import com.jetbrains.python.sdk.flavors.PythonSdkFlavor; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.List; -/** - * @author yole - */ public class PyActiveSdkConfigurable implements UnnamedConfigurable { private JPanel myPanel; private final Project myProject; @Nullable private final Module myModule; - private JComboBox mySdkCombo; - private JPanel myConfigureInterpretersPanel; - private PyConfigurableInterpreterList myInterpreterList; - private ProjectSdksModel myProjectSdksModel; private MyListener myListener; - public PyActiveSdkConfigurable(Project project) { + private PyConfigurableInterpreterList myInterpreterList; + private ProjectSdksModel myProjectSdksModel; + private ComboBox mySdkCombo; + private PyInstalledPackagesPanel myPackagesPanel; + + public PyActiveSdkConfigurable(@NotNull Project project) { myModule = null; myProject = project; - init(); + layoutPanel(); + initContent(); } public PyActiveSdkConfigurable(@NotNull Module module) { myModule = module; myProject = module.getProject(); - init(); + layoutPanel(); + initContent(); } - private void init() { - mySdkCombo.setRenderer(new SdkListCellRenderer("")); - + private void initContent() { myInterpreterList = PyConfigurableInterpreterList.getInstance(myProject); + myInterpreterList.setSdkCombo(mySdkCombo); + myProjectSdksModel = myInterpreterList.getModel(); myListener = new MyListener(this); myProjectSdksModel.addListener(myListener); - myConfigureInterpretersPanel.add(new PyConfigureInterpretersLinkPanel(myPanel), BorderLayout.CENTER); - myInterpreterList.setSdkCombo(mySdkCombo); + + mySdkCombo.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final Sdk selectedSdk = (Sdk)mySdkCombo.getSelectedItem(); + myPackagesPanel.updatePackages(selectedSdk == null ? null : new PyPackageManagementService(myProject, selectedSdk)); + } + }); + + } + + private void layoutPanel() { + final GridBagLayout layout = new GridBagLayout(); + myPanel = new JPanel(layout); + final JLabel label = new JLabel("Project Interpreter:"); + final JLabel label1 = new JLabel(" "); + mySdkCombo = new ComboBox(); + mySdkCombo.setRenderer(new SdkListCellRenderer("")); + + PackagesNotificationPanel notificationsArea = new PackagesNotificationPanel(myProject); + final JComponent notificationsComponent = notificationsArea.getComponent(); + notificationsComponent.setPreferredSize(new Dimension(500, 29)); + + JButton detailsButton = new JButton(); + detailsButton.setIcon(PythonIcons.Python.InterpreterGear); + detailsButton.setIconTextGap(0); + detailsButton.setPreferredSize(new Dimension(29, 29)); + if (((UIUtil.isUnderAquaLookAndFeel())) || UIUtil.isUnderIntelliJLaF() || UIUtil.isUnderDarcula()) { + detailsButton.putClientProperty("JButton.buttonType", "square"); + } + + myPackagesPanel = new PyInstalledPackagesPanel(myProject, notificationsArea); + mySdkCombo.setPreferredSize(new Dimension(250, 29)); + final GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + c.insets = new Insets(2,2,2,2); + + c.gridx = 0; + c.gridy = 0; + myPanel.add(label, c); + + c.gridx = 1; + c.gridy = 0; + c.weightx = 0.1; + myPanel.add(mySdkCombo, c); + + c.insets = new Insets(0,5,0,2); + c.gridx = 2; + c.gridy = 0; + c.weightx = 0.0; + myPanel.add(detailsButton, c); + + c.insets = new Insets(2,2,2,2); + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 3; + myPanel.add(label1, c); + + c.gridx = 0; + c.gridy = 2; + c.weighty = 0.5; + c.gridwidth = 3; + c.gridheight = GridBagConstraints.RELATIVE; + c.fill = GridBagConstraints.BOTH; + myPanel.add(myPackagesPanel, c); + + c.gridheight = GridBagConstraints.REMAINDER; + c.gridx = 0; + c.gridy = 3; + c.gridwidth = 3; + + c.fill = GridBagConstraints.HORIZONTAL; + c.anchor = GridBagConstraints.SOUTH; + + myPanel.add(notificationsComponent, c); } @Override diff --git a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java index c3c299ef93d6..304424fd8f64 100644 --- a/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java +++ b/python/ide/src/com/jetbrains/python/configuration/PyActiveSdkModuleConfigurable.java @@ -18,7 +18,6 @@ package com.jetbrains.python.configuration; import com.intellij.application.options.ModuleAwareProjectConfigurable; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.project.Project; @@ -28,17 +27,12 @@ import com.jetbrains.python.sdk.PythonSdkUpdater; import com.jetbrains.python.testing.VFSTestFrameworkListener; import org.jetbrains.annotations.NotNull; -/** - * @author yole - */ -public class PyActiveSdkModuleConfigurable extends ModuleAwareProjectConfigurable implements Configurable.Composite { +public class PyActiveSdkModuleConfigurable extends ModuleAwareProjectConfigurable { private final Project myProject; - private final Configurable mySdkConfigurable; public PyActiveSdkModuleConfigurable(Project project) { super(project, "Project Interpreter", "reference.settings.project.interpreter"); myProject = project; - mySdkConfigurable = new PythonSdkConfigurable(project); } @NotNull @@ -67,9 +61,4 @@ public class PyActiveSdkModuleConfigurable extends ModuleAwareProjectConfigurabl } PythonSdkUpdater.getInstance().updateActiveSdks(myProject, 0); } - - @Override - public Configurable[] getConfigurables() { - return new Configurable[] { mySdkConfigurable }; - } } diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear.png b/python/resources/icons/com/jetbrains/python/interpreterGear.png new file mode 100644 index 0000000000000000000000000000000000000000..448474acb643cba62f0077c5fdb9c00e3528a9fb GIT binary patch literal 509 zcmV;H4GWnthxXI0g6dP zK~y-)t&=@Z8$l3;pJ7jO$49Ctg`uDb60XQUNR*_e!F!SgC7%NEBXAcH#c^%P(q2cM z6#N5{hLaLdir7U&g9H^6=Npw%BsQDP zB@q$eBk%^ufnOrhvny->i`MW|ME3JM&ug{XMP%cjmk0y60(v2Ywvh+03%mect7%EL2w|t# z<4T)Xfi){G2%a{tG-@;&*J+ymsOSKg2j=W4&wvHsonc>r-=>deK>Z&bIOjeApMiFg zB%2~~P!idJ<&J<(6h)o?|Cz?vB`{<0-K3%iL$i_wYe3#a00000NkvXXu0mjf1+>vc literal 0 HcmV?d00001 diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear@2x.png b/python/resources/icons/com/jetbrains/python/interpreterGear@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe190f2412aa677728acd2bdee5f4bf1f43ab29f GIT binary patch literal 1019 zcmV;HV8GAJ753+1BgjP zK~z}7<(JQETvZguKj+Peku;0MAD{~tPOS-JCW|Ki0a65Q!ocI)Ip=)u zJ>PTBIq-j9@-#}m@0V5eHgIf3{US0IhT+ze+R8sA@MjXo8L}r@URtoYxF`Vg^Yeqg z?_V;;6f^Wrx{(=UipH2rK@bcAEG#TYM*wSUYif)ch~s!hRj&cdK@beP|54SK(t2r` z)ma9vHJidKLX!$BH>TK55RcphAy|cJ@?;l#v*0EmbHg&v&#wImFQ?Y11) z+1W`_r3ehCv&|a&1GozuSott82@Ivk2{0leMc|%e`*HFZW2WqDb^^Qzyq%G101ts% zz$Z}@J+Qj310Mocfaf!GwtzdpVdA5&uWx%}V z(zdeEpWKYgfp@wj;Uw^pF(!+IlPyB<7ztJNQQL;Z_x(jxUF|^{A|gv+7_N2o5RH$I zC(8FTNR{jj0n@hJF5B;+7Npy^wp`n-0qpMXs;%#83&>el18BOoJJy0A2;NZD_knkN z0N?^ZsZ{#DUavpw2*CIKqN=U{@AWX-E&?x%jg9Ts>-EF7AyCyBe*v!gV_h*jq-p>F002ovPDHLkV1lG$)&Bqh literal 0 HcmV?d00001 diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear@2x_dark.png b/python/resources/icons/com/jetbrains/python/interpreterGear@2x_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2d77aac65fa5ef796f7f7d7fbdbd275ab4d654da GIT binary patch literal 1090 zcmV-I1ikx-P);GBA1gM*08%1J6lB zK~z}7<(ExpTvZguf9K6OL1KkeEV!@>Q*pw$6x|1sjWH4OdPkC7KDI7IT!m8FT`7X= ze5^vuyi6cX+JXt~zOEZHP-kNWp+zf{Ks&>{zneSd_VJpJCJ5r)y!YS z{NIPYj!=>$qreSG`v7Lv3yeAEHjk^T_?nKt;h()Zb0>3PXJ^NThK97UvC-FVw?C8g z&^fpJQrOJelE}{GM5-d`{bI3rZ+v|G$@ccP4G#~$Bp79dhK7ceB*~d}yM0m86-jgT zdc7R(k#sI}KoXM9g?sAtdRfvOaHZ4fTwGsYe=BP|7X!=7%V$faQY`6fpyE$AZ)OW= znwptaB#i;18PQEMyCG>eiXusxku>YqcB3fzq19^DCnqPL9GHSqsr0EAtN;Scf4^sD z{gMW{2M-P)U{unmne9nxN*W2)Dw1YPrP6P}PX{_+W)Fd1C4CY`C{UOey>Q z1b#mf4U;4(1K$K8JQ>%`=7H~>bB*j;lqcYvYe-rEZk>YtTfjn|@mvR{r>6}diXsF0 z&Fmy62l${H>8|brF|fF}D4)v;P|onZ3%tL8yJpt#d&|Hea5e;|mmTnczSq^Ai-B6L zHs)`$Ht;U+MGn<4vp<1#N!P2@>H{zPp_zRPj7xeaCm5T+mYF@4R0LYRy}h?bMn*be z1U7O6l>^kflCD*&)n<31TCF~))oRzwtPi-DqhmC4m=t&$*bgzVf5c+d2#p6$G=at; zI=U(NyZas;7g*UEaMBSv(EExMWHC@)U0vAut$4 z(Ra04Ef0i)uSmfrumwCev!bN7nLRtOAxV;C+FwSmO~W8+GtRliBV9yOQ&Z-J?gNd? zMb!N`3&fJdYy;!d~I#5;zRq@DL25Yg+k$K9LK*L7y(J=feSu=3i5f=%=TVEuW;X< zncd7;yO5^o`9q7*^XJd+_4M>C0B`2CWWdM3n5SuA*S3HgX`0?I6bb_V@co1VyJj}u zYPEhoQbV$`vT~+aEKW$80h)zE;c^_ujew#vlIAm1n|01DgiUFu)42@vM^Q8{=||_> z(?dac=gu9Qn3#BKW(jb~%&vyUy|G6jJ^lNma8De^4Kuq6Tq+ieYtFf+J3BjeT7O34 zK)p**??CLFTR%xHIL>GX6?8u{_pkh#-3HDC2shx_fAa76A7Y}#z!78H2mk;807*qo IM6N<$f}IfmU;qFB literal 0 HcmV?d00001 diff --git a/python/resources/icons/com/jetbrains/python/interpreterGear_dark.png b/python/resources/icons/com/jetbrains/python/interpreterGear_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..44e79af9551d60793d53097c6268ad0a93309e41 GIT binary patch literal 537 zcmV+!0_OdRP);GduS&t}_4t0j5br zK~y-)wUe=H(?Jx+Kkt%|jOrv6+M*5>>ty>E2-+hXq9|UA$V=d-_x@>& zaiy%q7!SPn=fGp&Mo|<12XhTX-8QOV+6RH^9lGWB1akZIdDG%-Wv=C52w><>U27%)jXsxKxGE~2XJJq z-Os}V*j3df;7N>eY>bIO)m&ExRe+SzBY;Y!@=jH^fZM=!2to4`wsQ^IkeWkT42F@-vTx-sq{|vS)k1jLTf>ZzzT3PQ+Wcc0?%^oBk&E_ zP}N(&^1=;jwc2~&1F-L$+cC!MW!^Ey>^bLlMC7fAbQ_IE_n)7s-|w%bl*XCn^>({` b#{aNCAA6e#+2_Nz00000NkvXXu0mjfp;Yg& literal 0 HcmV?d00001 diff --git a/python/src/icons/PythonIcons.java b/python/src/icons/PythonIcons.java index c942e0ca02c6..2d29827aa526 100644 --- a/python/src/icons/PythonIcons.java +++ b/python/src/icons/PythonIcons.java @@ -32,6 +32,7 @@ public class PythonIcons { } public static final Icon Dotnet = load("/icons/com/jetbrains/python/dotnet.png"); // 16x16 + public static final Icon InterpreterGear = load("/icons/com/jetbrains/python/interpreterGear.png"); // 16x16 public static final Icon Jython = load("/icons/com/jetbrains/python/jython.png"); // 16x16 public static class Nodes {