From 192eb5e5061e6681573a250d9473de308836531f Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Fri, 16 Feb 2024 17:53:21 +0000 Subject: [PATCH] Add ProgressView initial scenario - Relates #995 --- .../progress/SimpleProgressViewScenario.java | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 spring-shell-samples/spring-shell-sample-catalog/src/main/java/org/springframework/shell/samples/catalog/scenario/progress/SimpleProgressViewScenario.java diff --git a/spring-shell-samples/spring-shell-sample-catalog/src/main/java/org/springframework/shell/samples/catalog/scenario/progress/SimpleProgressViewScenario.java b/spring-shell-samples/spring-shell-sample-catalog/src/main/java/org/springframework/shell/samples/catalog/scenario/progress/SimpleProgressViewScenario.java new file mode 100644 index 000000000..c9721e764 --- /dev/null +++ b/spring-shell-samples/spring-shell-sample-catalog/src/main/java/org/springframework/shell/samples/catalog/scenario/progress/SimpleProgressViewScenario.java @@ -0,0 +1,126 @@ +/* + * Copyright 2024 the original author or authors. + * + * 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 + * + * https://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.springframework.shell.samples.catalog.scenario.progress; + +import java.time.Duration; +import java.util.List; +import java.util.ListIterator; + +import reactor.core.publisher.Flux; + +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.shell.component.message.ShellMessageHeaderAccessor; +import org.springframework.shell.component.message.StaticShellMessageHeaderAccessor; +import org.springframework.shell.component.view.control.GridView; +import org.springframework.shell.component.view.control.ProgressView; +import org.springframework.shell.component.view.control.ProgressView.ProgressViewItem; +import org.springframework.shell.component.view.control.View; +import org.springframework.shell.component.view.event.EventLoop; +import org.springframework.shell.geom.HorizontalAlign; +import org.springframework.shell.samples.catalog.scenario.AbstractScenario; +import org.springframework.shell.samples.catalog.scenario.Scenario; +import org.springframework.shell.samples.catalog.scenario.ScenarioComponent; + +@ScenarioComponent(name = "Simple progressview", description = "ProgressView sample", category = { + Scenario.CATEGORY_PROGRESSVIEW }) +public class SimpleProgressViewScenario extends AbstractScenario { + + @Override + public ScenarioContext buildContext() { + ContextData contextData = buildContextData(); + return ScenarioContext.of(contextData.view(), contextData.start(), contextData.stop()); + } + + private record ContextData(View view, List progress, Runnable start, Runnable stop) { + } + + private ContextData buildContextData() { + List views = List.of(plain(), spinnerOnly(), percentOnly(), spreadAlign()); + GridView grid = new GridView(); + grid.setShowBorders(true); + configure(grid); + int[] rows = new int[views.size()]; + for (int i = 0; i < rows.length; i++) { + rows[i] = 1; + } + grid.setRowSize(rows); + grid.setColumnSize(0); + + ListIterator iter = views.listIterator(); + while (iter.hasNext()) { + ProgressView view = iter.next(); + configure(view); + view.start(); + grid.addItem(view, iter.previousIndex(), 0, 1, 1, 0, 0); + } + + EventLoop eventLoop = getEventloop(); + + Flux> ticks = Flux.interval(Duration.ofMillis(500)).take(100).map(l -> { + Message message = MessageBuilder + .withPayload(l) + .setHeader(ShellMessageHeaderAccessor.EVENT_TYPE, EventLoop.Type.USER) + .setHeader("SimpleProgressViewScenario", "") + .build(); + return message; + }); + + eventLoop.dispatch(ticks); + + eventLoop.onDestroy(eventLoop.events() + .filter(m -> EventLoop.Type.USER.equals(StaticShellMessageHeaderAccessor.getEventType(m)) + && m.getHeaders().containsKey("SimpleProgressViewScenario")) + .subscribe(m -> { + views.forEach(v -> { + v.tickAdvance(1); + }); + })); + + Runnable stop = () -> { + views.forEach(v -> { + v.stop(); + }); + }; + + return new ContextData(grid, views, null, stop); + } + + private ProgressView plain() { + ProgressView view = new ProgressView(); + view.setDescription("desc"); + return view; + } + + private ProgressView spinnerOnly() { + ProgressView view = new ProgressView(ProgressViewItem.ofSpinner()); + return view; + } + + private ProgressView percentOnly() { + ProgressView view = new ProgressView(ProgressViewItem.ofPercent()); + return view; + } + + private ProgressView spreadAlign() { + ProgressView view = new ProgressView(ProgressViewItem.ofText(0, HorizontalAlign.LEFT), + ProgressViewItem.ofSpinner(0, HorizontalAlign.CENTER), + ProgressViewItem.ofPercent(0, HorizontalAlign.RIGHT)); + view.setDescription("desc"); + return view; + } + +}