Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,4 @@ Kazuya Chikamatsu <kazu.chika.shima@gmail.com>
Dustin Feucht <code.nopjar@gmail.com>
Nico Mexis <nicomexis.nm@gmail.com>
Luke Memet <lukememet@gmail.com>
Diandian Liang <hlxsmail@gmail.com>
3 changes: 3 additions & 0 deletions resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@
<add-to-group anchor="before" group-id="ToolbarRunGroup" relative-to-action="RunConfiguration"/>
</group>

<!-- Allows dependent plugins to contribute inline actions to Flutter run/debug content toolbars. -->
<group id="Flutter.DebugProcess.TopToolbar" popup="false"/>

<!--suppress PluginXmlCapitalization -->
<group id="FlutterToolsActionGroup" class="io.flutter.actions.FlutterToolsActionGroup" popup="true"
text="Flutter" description="Flutter Tools" icon="FlutterIcons.Flutter">
Expand Down
1 change: 1 addition & 0 deletions src/io/flutter/run/FlutterDebugProcess.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ public void registerAdditionalActions(@NotNull final DefaultActionGroup leftTool
topToolbar.addAction(new RestartFlutterApp(app, canReload));
topToolbar.addSeparator();
topToolbar.addAction(new OpenDevToolsAction(app, debugUrlAvailable));
FlutterDebugProcessActions.addTopToolbarExtensionActions(topToolbar);

settings.addAction(new ReloadAllFlutterApps(app, canReload));
settings.addAction(new RestartAllFlutterApps(app, canReload));
Expand Down
44 changes: 44 additions & 0 deletions src/io/flutter/run/FlutterDebugProcessActions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2026 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
package io.flutter.run;

import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import org.jetbrains.annotations.NotNull;

/**
* Shared action groups for Flutter-specific run and debug toolbars.
*/
public final class FlutterDebugProcessActions {
/**
* Third-party plugins can contribute inline toolbar actions with:
* {@code <add-to-group group-id="Flutter.DebugProcess.TopToolbar" anchor="last" />}.
*/
public static final @NotNull String TOP_TOOLBAR_EXTENSION_GROUP_ID = "Flutter.DebugProcess.TopToolbar";

private FlutterDebugProcessActions() {
}

/**
* Appends toolbar actions contributed by downstream dependent plugins.
*
* <p>{@link ActionManager#getAction(String)} returns {@link AnAction} because action groups are
* actions too. The extension id resolves to an inline {@link ActionGroup}, which can contain
* multiple contributed child actions.
*/
public static void addTopToolbarExtensionActions(@NotNull DefaultActionGroup topToolbar) {
Comment thread
mdddj marked this conversation as resolved.
Comment thread
mdddj marked this conversation as resolved.
final AnAction extensionGroupAction = ActionManager.getInstance().getAction(TOP_TOOLBAR_EXTENSION_GROUP_ID);
if (!(extensionGroupAction instanceof DefaultActionGroup extensionGroup) ||
extensionGroup.getChildActionsOrStubs().length == 0) {
return;
}

topToolbar.addSeparator();
topToolbar.addAction(extensionGroup);
}

}
2 changes: 2 additions & 0 deletions src/io/flutter/run/bazelTest/BazelTestDebugProcess.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.intellij.xdebugger.XDebugSession;
import com.jetbrains.lang.dart.util.DartUrlResolver;
import io.flutter.ObservatoryConnector;
import io.flutter.run.FlutterDebugProcessActions;
import io.flutter.run.FlutterPopFrameAction;
import io.flutter.run.OpenDevToolsAction;
import io.flutter.vmService.DartVmServiceDebugProcess;
Expand Down Expand Up @@ -40,6 +41,7 @@ public void registerAdditionalActions(@NotNull DefaultActionGroup leftToolbar,
topToolbar.addSeparator();
topToolbar.addAction(new FlutterPopFrameAction());
topToolbar.addAction(new OpenDevToolsAction(connector, this::isActive));
FlutterDebugProcessActions.addTopToolbarExtensionActions(topToolbar);
}

private boolean isActive() {
Expand Down
2 changes: 2 additions & 0 deletions src/io/flutter/run/test/TestDebugProcess.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.intellij.xdebugger.XDebugSession;
import com.jetbrains.lang.dart.util.DartUrlResolver;
import io.flutter.ObservatoryConnector;
import io.flutter.run.FlutterDebugProcessActions;
import io.flutter.run.FlutterPopFrameAction;
import io.flutter.run.OpenDevToolsAction;
import io.flutter.vmService.DartVmServiceDebugProcess;
Expand Down Expand Up @@ -40,6 +41,7 @@ public void registerAdditionalActions(@NotNull DefaultActionGroup leftToolbar,
topToolbar.addSeparator();
topToolbar.addAction(new FlutterPopFrameAction());
topToolbar.addAction(new OpenDevToolsAction(connector, this::isActive));
FlutterDebugProcessActions.addTopToolbarExtensionActions(topToolbar);
}

private boolean isActive() {
Expand Down
Loading