IJPL-175939 Consider deprecating the Thumbnails tool window

- Remove unused actions

GitOrigin-RevId: a36c071657ae5c2d86e1cab18c2123e6e291e1c4
This commit is contained in:
Pavel Porvatov
2025-07-03 17:10:39 +00:00
committed by intellij-monorepo-bot
parent b6344004b0
commit d0b4acbded
14 changed files with 0 additions and 580 deletions
-62
View File
@@ -101,16 +101,6 @@
<separator/>
<group id="Images.ThumbnailViewActions">
<action class="org.intellij.images.thumbnail.actions.UpFolderAction"
id="Images.Thumbnails.UpFolder"
icon="AllIcons.Nodes.UpFolder">
<keyboard-shortcut first-keystroke="BACK_SPACE" keymap="$default"/>
</action>
<action class="org.intellij.images.thumbnail.actions.ToggleRecursiveAction"
id="Images.Thumbnails.ToggleRecursive"
icon="AllIcons.ObjectBrowser.FlattenPackages">
<keyboard-shortcut first-keystroke="alt MULTIPLY" keymap="$default"/>
</action>
<action class="org.intellij.images.thumbnail.actions.ToggleFileSizeAction"
id="Images.Thumbnails.ToggleFileSize"
icon="AllIcons.FileTypes.Any_type">
@@ -119,26 +109,6 @@
id="Images.Thumbnails.ToggleFileName"
icon="AllIcons.Actions.ShowImportStatements">
</action>
<action class="org.intellij.images.thumbnail.actions.FilterByThemeComboBoxAction"
internal="true"
id="Images.Thumbnails.FilterByTheme"/>
<group class="org.intellij.images.thumbnail.actions.FilterByTagActionGroup"
internal="true"
popup="true"
id="Images.Thumbnails.FilterByTag"/>
<action class="org.intellij.images.thumbnail.actions.ToggleTagsPanelAction"
id="Images.Thumbnails.ToggleTagsPanelName"
icon="AllIcons.Actions.Preview">
</action>
<action class="org.intellij.images.thumbnail.actions.HideThumbnailsAction"
id="Images.Thumbnails.Hide"
icon="AllIcons.Actions.Cancel" use-shortcut-of="CloseContent"/>
<action class="org.intellij.images.thumbnail.actions.EnterAction"
id="Images.Thumbnails.EnterAction">
<keyboard-shortcut first-keystroke="ENTER" keymap="$default"/>
</action>
<action class="org.intellij.images.thumbnail.actions.ShowBorderAction" id="Images.ShowBorder"/>
<action class="org.intellij.images.editor.actions.ChangeBackgroundAction" id="Images.ChangeBackground"/>
@@ -201,37 +171,5 @@
<reference ref="Images.EditExternalEditorPath"/>
<reference ref="ExternalToolsGroup"/>
</group>
<group id="Images.ThumbnailsToolbar">
<reference ref="Images.Thumbnails.UpFolder"/>
<reference ref="Images.Thumbnails.ToggleRecursive"/>
<separator/>
<reference ref="Images.ToggleTransparencyChessboard"/>
<reference ref="Images.Thumbnails.ToggleFileSize"/>
<reference ref="Images.Thumbnails.ToggleFileName"/>
<separator/>
<reference ref="Images.Thumbnails.FilterByTheme"/>
<reference ref="Images.Thumbnails.FilterByTag"/>
<reference ref="Images.Thumbnails.ToggleTagsPanelName"/>
<reference ref="Images.Thumbnails.Hide"/>
</group>
<group id="Images.ThumbnailsPopupMenu">
<reference ref="CutCopyPasteGroup"/>
<reference ref="EditSource"/>
<reference ref="Images.Thumbnails.EnterAction"/>
<separator/>
<reference ref="Images.ThumbnailsToolbar"/>
<separator/>
<reference ref="FindUsages"/>
<reference ref="RefactoringMenu"/>
<separator/>
<reference ref="$Delete"/>
<separator/>
<reference ref="VersionControlsGroup"/>
<reference ref="CompareTwoFiles"/>
<separator/>
<reference ref="Images.EditExternally"/>
<reference ref="ExternalToolsGroup"/>
</group>
</actions>
</idea-plugin>
@@ -47,20 +47,6 @@ action.Images.Editor.ZoomOut.text=Zoom Out
action.Images.Editor.ZoomOut.description=Reduce image view
action.Images.Editor.ActualSize.text=Actual Size
action.Images.Editor.ActualSize.description=Resize image to actual size
action.Images.Thumbnails.UpFolder.text=Level up
action.Images.Thumbnails.UpFolder.description=Level up
action.Images.Thumbnails.EnterAction.text=Browse
action.Images.Thumbnails.EnterAction.description=Browse directory
action.Images.Thumbnails.ToggleRecursive.text=Recursive
action.Images.Thumbnails.ToggleRecursive.description=Toggle recursive browsing
action.Images.Thumbnails.Hide.text=Close Thumbnails
action.Images.Thumbnails.Hide.description=Close thumbnails window
action.Images.Thumbnails.ToggleTagsPanelName.text=Preview Tags
action.Images.Thumbnails.ToggleTagsPanelName.description=Toggle whether to show the tags management panel
group.Images.Thumbnails.FilterByTag.text=Filter by Tag
group.Images.Thumbnails.FilterByTag.description=Filter images by tag
action.Images.Thumbnails.FilterByTheme.text=Filter by Theme
action.Images.Thumbnails.FilterByTheme.description=Filter images by theme
action.Images.Thumbnails.ToggleFileName.text=File Name
action.Images.Thumbnails.ToggleFileName.description=Toggle whether to show the image name
action.Images.Thumbnails.ToggleFileSize.text=File Size
@@ -78,7 +64,6 @@ black.cell.color.descriptor='Black' cell
white.cell.color.descriptor='White' cell
grid.line.color.descriptor=Grid line
background.color.descriptor=Background
action.all.text=All
image.description={0}\u00D7{1}, {2}bpp
# scientific mode
@@ -1,42 +0,0 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.intellij.images.thumbnail.actionSystem;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import org.intellij.images.thumbnail.ThumbnailView;
import org.jetbrains.annotations.NotNull;
/**
* Thumbnail view actions utility.
*
* @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
public final class ThumbnailViewActionUtil {
private ThumbnailViewActionUtil() {
}
/**
* Extract current thumbnail view from event context.
*
* @param e Action event
* @return Current {@link ThumbnailView} or {@code null}
* @deprecated remove with ThumbnailView and other related stuff
*/
@Deprecated
public static ThumbnailView getVisibleThumbnailView(@NotNull AnActionEvent e) {
return null;
}
/**
* Enable or disable current action from event.
*
* @param e Action event
* @return Enabled value
*/
public static boolean setEnabled(@NotNull AnActionEvent e) {
ThumbnailView thumbnailView = getVisibleThumbnailView(e);
Presentation presentation = e.getPresentation();
presentation.setEnabled(thumbnailView != null);
return presentation.isEnabled();
}
}
@@ -23,7 +23,5 @@ import org.jetbrains.annotations.NonNls;
* @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
public interface ThumbnailViewActions {
@NonNls String GROUP_POPUP = "Images.ThumbnailsPopupMenu";
@NonNls String GROUP_TOOLBAR = "Images.ThumbnailsToolbar";
@NonNls String ACTION_PLACE = "Images.Thumbnails";
}
@@ -1,71 +0,0 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.intellij.images.thumbnail.actions;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.Presentation;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.vfs.VirtualFile;
import org.intellij.images.fileTypes.ImageFileTypeManager;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
/**
* Level up to browse images.
*
* @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
public final class EnterAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
if (view != null) {
VirtualFile[] selection = view.getSelection();
if (selection.length == 1 && selection[0].isDirectory()) {
view.setRoot(selection[0]);
}
else if (selection.length > 0) {
FileEditorManager fileEditorManager = FileEditorManager.getInstance(view.getProject());
ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance();
for (VirtualFile file : selection) {
if (typeManager.isImage(file)) {
fileEditorManager.openFile(file, false);
}
}
}
}
}
@Override
public void update(@NotNull AnActionEvent e) {
if (ThumbnailViewActionUtil.setEnabled(e)) {
Presentation presentation = e.getPresentation();
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
VirtualFile[] selection = view.getSelection();
if (selection.length > 0) {
if (selection.length == 1 && selection[0].isDirectory()) {
presentation.setVisible(true);
}
else {
boolean notImages = false;
ImageFileTypeManager typeManager = ImageFileTypeManager.getInstance();
for (VirtualFile file : selection) {
notImages |= !typeManager.isImage(file);
}
presentation.setEnabled(!notImages);
presentation.setVisible(false);
}
}
else {
presentation.setEnabledAndVisible(false);
}
}
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
}
@@ -1,107 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.intellij.images.thumbnail.actions;
import com.intellij.CommonBundle;
import com.intellij.icons.AllIcons;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.containers.ContainerUtil;
import org.intellij.images.search.ImageTagManager;
import org.intellij.images.search.TagFilter;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public final class FilterByTagActionGroup extends ActionGroup implements PopupAction {
public FilterByTagActionGroup() {
setPopup(true);
}
@Override
public void update(final @NotNull AnActionEvent e) {
Project project = e.getProject();
if (project == null) {
e.getPresentation().setEnabledAndVisible(false);
return;
}
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
ImageTagManager tagManager = ImageTagManager.getInstance(project);
e.getPresentation().setVisible(view != null && !tagManager.getAllTags().isEmpty());
TagFilter[] filters = view != null ? view.getTagFilters() : null;
e.getPresentation().setText(filters == null ? CommonBundle.message("action.text.all")
: StringUtil.join(filters, filter -> filter.getDisplayName(), ","));
e.getPresentation().setIcon(AllIcons.Duplicates.SendToTheRight);
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
@Override
public AnAction @NotNull [] getChildren(@Nullable AnActionEvent e) {
if (e == null) return AnAction.EMPTY_ARRAY;
DefaultActionGroup group = new DefaultActionGroup();
Project project = e.getProject();
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
if (view == null) return AnAction.EMPTY_ARRAY;
ImageTagManager tagManager = ImageTagManager.getInstance(project);
List<MyToggleAction> tagActions =
ContainerUtil.map(tagManager.getAllTags(), (@NlsSafe var tag) -> new MyToggleAction(view, new TagFilter(tag, tagManager)));
group.add(new AnAction(IdeBundle.messagePointer("action.Anonymous.text.all")) {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
for (MyToggleAction tagAction : tagActions) {
tagAction.setSelected(e, false);
}
}
});
group.add(Separator.getInstance());
group.addAll(tagActions);
return group.getChildren(e);
}
private static class MyToggleAction extends ToggleAction {
private final ThumbnailView myView;
private final TagFilter myFilter;
MyToggleAction(ThumbnailView view, TagFilter filter) {
super(filter.getDisplayName());
myView = view;
myFilter = filter;
}
@Override
public boolean isSelected(@NotNull AnActionEvent e) {
TagFilter[] filters = myView.getTagFilters();
return filters != null && ContainerUtil.exists(filters, f -> myFilter.getDisplayName().equals(f.getDisplayName()));
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.BGT;
}
@Override
public void setSelected(@NotNull AnActionEvent e, boolean state) {
if (state) {
myFilter.setFilter(myView);
}
else {
myFilter.clearFilter(myView);
}
}
}
}
@@ -1,70 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.intellij.images.thumbnail.actions;
import com.intellij.CommonBundle;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.actionSystem.ex.ComboBoxAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.ContainerUtil;
import org.intellij.images.ImagesBundle;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
public final class FilterByThemeComboBoxAction extends ComboBoxAction {
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.BGT;
}
@Override
public void update(final @NotNull AnActionEvent e) {
Project project = e.getProject();
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
boolean hasApplicableExtension =
ContainerUtil.and(ThemeFilter.EP_NAME.getExtensionList(), filter -> project != null && filter.isApplicableToProject(project));
e.getPresentation().setVisible(view != null && hasApplicableExtension);
ThemeFilter filter = view != null ? view.getFilter() : null;
e.getPresentation().setText(filter == null ? CommonBundle.message("action.text.all") : filter.getDisplayName());
}
@Override
protected @NotNull DefaultActionGroup createPopupActionGroup(@NotNull JComponent button, @NotNull DataContext context) {
DefaultActionGroup group = new DefaultActionGroup();
group.add(new FilterImagesAction(new ThemeFilter() {
@Override
public String getDisplayName() {
return ImagesBundle.message("action.all.text");
}
@Override
public boolean accepts(VirtualFile file) {
return true;
}
@Override
public boolean isApplicableToProject(Project project) {
return true;
}
@Override
public void setFilter(ThumbnailView view) {
view.setFilter(this);
}
}));
for (ThemeFilter filter : ThemeFilter.EP_NAME.getExtensionList()) {
group.add(new FilterImagesAction(filter));
}
return group;
}
}
@@ -1,50 +0,0 @@
/*
* Copyright 2000-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.intellij.images.thumbnail.actions;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
public class FilterImagesAction extends AnAction {
private final Filter myFilter;
public FilterImagesAction(Filter filter) {
myFilter = filter;
}
@Override
public void update(@NotNull AnActionEvent e) {
e.getPresentation().setText(myFilter.getDisplayName());
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.BGT;
}
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
if (view != null) {
myFilter.setFilter(view);
}
}
}
@@ -1,29 +0,0 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.intellij.images.thumbnail.actions;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
final class HideThumbnailsAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
if (view != null) {
view.setVisible(false);
}
}
@Override
public void update(@NotNull AnActionEvent e) {
ThumbnailViewActionUtil.setEnabled(e);
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
}
@@ -1,39 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.intellij.images.thumbnail.actions;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.ToggleAction;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
/**
* Toggle recursive flag.
*/
final class ToggleRecursiveAction extends ToggleAction {
@Override
public boolean isSelected(@NotNull AnActionEvent e) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
return view != null && view.isRecursive();
}
@Override
public void setSelected(@NotNull AnActionEvent e, boolean state) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
if (view != null) {
view.setRecursive(state);
}
}
@Override
public void update(final @NotNull AnActionEvent e) {
super.update(e);
ThumbnailViewActionUtil.setEnabled(e);
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
}
@@ -1,46 +0,0 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.intellij.images.thumbnail.actions;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.ToggleAction;
import com.intellij.openapi.project.Project;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
public final class ToggleTagsPanelAction extends ToggleAction {
public static final String TAGS_PANEL_VISIBLE = "tags.panel.visible";
public static final String TAGS_PANEL_PROPORTION = "tags.panel.proportion";
@Override
public boolean isSelected(@NotNull AnActionEvent e) {
Project project = e.getProject();
return project != null && PropertiesComponent.getInstance(project).getBoolean(TAGS_PANEL_VISIBLE, false);
}
@Override
public void setSelected(@NotNull AnActionEvent e, boolean state) {
PropertiesComponent.getInstance(e.getProject()).setValue(TAGS_PANEL_VISIBLE, state);
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
assert view != null;
view.refresh();
}
@Override
public void update(final @NotNull AnActionEvent e) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
e.getPresentation().setEnabledAndVisible(view != null);
e.getPresentation().setText(isSelected(e) ? IdeBundle.message("action.text.hide.tags.panel") :
IdeBundle.message("action.text.show.tags.panel"));
super.update(e);
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.BGT;
}
}
@@ -1,45 +0,0 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.intellij.images.thumbnail.actions;
import com.intellij.openapi.actionSystem.ActionUpdateThread;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.vfs.VirtualFile;
import org.intellij.images.thumbnail.ThumbnailView;
import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActionUtil;
import org.jetbrains.annotations.NotNull;
/**
* Level up to browse images.
*
* @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
public final class UpFolderAction extends AnAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
if (view != null) {
VirtualFile root = view.getRoot();
if (root != null) {
VirtualFile parent = root.getParent();
if (parent != null) {
view.setRoot(parent);
}
}
}
}
@Override
public void update(@NotNull AnActionEvent e) {
if (ThumbnailViewActionUtil.setEnabled(e)) {
ThumbnailView view = ThumbnailViewActionUtil.getVisibleThumbnailView(e);
VirtualFile root = view.getRoot();
e.getPresentation().setEnabled(root != null && root.getParent() != null && !view.isRecursive());
}
}
@Override
public @NotNull ActionUpdateThread getActionUpdateThread() {
return ActionUpdateThread.EDT;
}
}
@@ -173,7 +173,6 @@
<action id="GuiDesigner.EditGroup"/>
<action id="HighlightUsagesInFile"/> <!-- TODO -->
<action id="IDEtalk.Rename"/>
<action id="Images.Thumbnails.ToggleRecursive"/>
<action id="ImplementMethods"/>
<action id="IncrementalSearch">
<keyboard-shortcut first-keystroke="meta J"/>
@@ -200,7 +200,6 @@
<keyboard-shortcut first-keystroke="shift control F7"/>
</action>
<action id="IDEtalk.Rename"/>
<action id="Images.Thumbnails.ToggleRecursive"/>
<action id="ImplementMethods">
<keyboard-shortcut first-keystroke="shift alt P"/>
</action>