Skip to content

Commit

Permalink
Add ProgressView initial scenario
Browse files Browse the repository at this point in the history
- Relates #995
  • Loading branch information
jvalkeal committed Feb 16, 2024
1 parent 7c91dbf commit 192eb5e
Showing 1 changed file with 126 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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<ProgressView> progress, Runnable start, Runnable stop) {
}

private ContextData buildContextData() {
List<ProgressView> 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<ProgressView> 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<Message<?>> ticks = Flux.interval(Duration.ofMillis(500)).take(100).map(l -> {
Message<Long> 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;
}

}

0 comments on commit 192eb5e

Please sign in to comment.