Skip to content

Commit c514abf

Browse files
committed
new UI for dependency license viewing
workaround for #85 closes #85
1 parent 33ca98e commit c514abf

File tree

282 files changed

+363
-121
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

282 files changed

+363
-121
lines changed

Diff for: assets/dependency_licenses/Acknowledgments/Slay

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Many thanks to Sean O'Connor for his game Slay which this game is heavily inspired by!
2+
3+
Many thanks to Amit Patel for his guide to hexagonal grids on redblobgames.com!
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,3 @@
1-
Acknowledgments
2-
===============
3-
4-
Many thanks to Sean O'Connor for his game Slay which this game is heavily inspired by!
5-
6-
Many thanks to Amit Patel for his guide to hexagonal grids on redblobgames.com!
7-
8-
9-
Skin
10-
======
11-
121
based on Pixthulhu UI Ver. 1
132

143
Created by Raymond "Raeleus" Buckley
@@ -17,7 +6,3 @@ Visit ray3k.wordpress.com for games, tutorials, and much more!git res
176

187
Pixthulhu UI can be used under the CC BY license.
198
http://creativecommons.org/licenses/by/4.0/
20-
21-
22-
Dependencies
23-
============

Diff for: build.gradle

+8-3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,14 @@ configure(subprojects - project(':android')) {
5050
// iterate through all files inside that folder
5151
// convert it to a relative path
5252
// and append it to the file assets.txt
53-
fileTree(assetsFolder).collect { assetsFolder.relativePath(it) }.each {
54-
assetsFile.append(it + "\n")
55-
}
53+
54+
// customization: using a different method that doesn't resolve symlinks
55+
fileTree(assetsFolder).visit { FileVisitDetails visitDetails ->
56+
if (!visitDetails.directory) {
57+
assetsFile.append(visitDetails.relativePath + "\n")
58+
}
59+
}
60+
5661
}
5762
processResources.dependsOn 'generateAssetList'
5863

Diff for: core/build.gradle

-21
Original file line numberDiff line numberDiff line change
@@ -59,27 +59,6 @@ processResources {
5959
duplicatesStrategy = "exclude"
6060
}
6161

62-
// build license info text file
63-
def license_texts = ''
64-
// read prefix text
65-
license_texts += file('../dependency_licenses/licenses_pre.txt').text
66-
// iterate directories containing the dependency licenses
67-
def base_dir = file("../dependency_licenses")
68-
fileTree(dir: "../dependency_licenses").visit { FileVisitDetails dirDetails ->
69-
if (dirDetails.directory) {
70-
license_texts += "\n" + dirDetails.file.name
71-
license_texts += "\n" + "-".multiply(dirDetails.file.name.length() * 1.2)
72-
fileTree(dir: dirDetails.file.path).visit { FileVisitDetails fileDetails ->
73-
if (!fileDetails.isDirectory()) {
74-
license_texts += "\n\n" + fileDetails.file.name
75-
license_texts += "\n" + fileDetails.file.text
76-
}
77-
}
78-
}
79-
}
80-
// write the result
81-
new File("$resources_dest_path/licenses.txt").text = license_texts
82-
8362
// build full changelog
8463
def changelog_dir = "../metadata/en-US/changelogs/"
8564
def changelog = ''

Diff for: core/src/main/java/de/sesu8642/feudaltactics/ScreenNavigationController.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import de.sesu8642.feudaltactics.menu.changelog.dagger.ChangelogScreen;
2525
import de.sesu8642.feudaltactics.menu.common.ui.GameScreen;
2626
import de.sesu8642.feudaltactics.menu.crashreporting.ui.CrashReportScreen;
27-
import de.sesu8642.feudaltactics.menu.information.dagger.DependencyLicensesScreen;
27+
import de.sesu8642.feudaltactics.menu.information.ui.DependencyLicensesScreen;
2828
import de.sesu8642.feudaltactics.menu.information.ui.InformationMenuPage1Screen;
2929
import de.sesu8642.feudaltactics.menu.information.ui.InformationMenuPage2Screen;
3030
import de.sesu8642.feudaltactics.menu.mainmenu.ui.MainMenuScreen;
@@ -68,7 +68,7 @@ public ScreenNavigationController(EventBus eventBus, LocalIngameInputHandler loc
6868
MainMenuScreen mainMenuScreen, @TutorialScreen GameScreen tutorialScreen,
6969
@AboutScreen GameScreen aboutScreen, PreferencesScreen preferencesScreen,
7070
InformationMenuPage1Screen informationMenuScreen, InformationMenuPage2Screen informationMenuScreen2,
71-
@DependencyLicensesScreen GameScreen dependencyLicensesScreen, @ChangelogScreen GameScreen changelogScreen,
71+
DependencyLicensesScreen dependencyLicensesScreen, @ChangelogScreen GameScreen changelogScreen,
7272
CrashReportScreen crashReportScreen, GameControllerEventHandler gameLogicEventHandler,
7373
EventHandler editorEventHandler, IngameRendererEventHandler rendererEventHandler,
7474
IngameScreenEventHandler ingameScreenEventHandler,

Diff for: core/src/main/java/de/sesu8642/feudaltactics/menu/common/ui/ExceptionLoggingChangeListener.java

+5
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ public class ExceptionLoggingChangeListener implements EventListener {
1919

2020
private final Runnable listener;
2121

22+
/**
23+
* Constructor.
24+
*
25+
* @param listener runnable to be executed on change
26+
*/
2227
public ExceptionLoggingChangeListener(Runnable listener) {
2328
this.listener = listener;
2429
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
package de.sesu8642.feudaltactics.menu.common.ui;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import com.badlogic.gdx.scenes.scene2d.InputEvent;
9+
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
10+
11+
/**
12+
* Click listener that causes a proper crash that is logged if an unexpected
13+
* Exception happens.
14+
*/
15+
public class ExceptionLoggingClickListener extends ClickListener {
16+
17+
private final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
18+
19+
private final Runnable listener;
20+
21+
/**
22+
* Constructor.
23+
*
24+
* @param listener runnable to be executed on click
25+
*/
26+
public ExceptionLoggingClickListener(Runnable listener) {
27+
this.listener = listener;
28+
}
29+
30+
@Override
31+
public void clicked(InputEvent event, float x, float y) {
32+
try {
33+
listener.run();
34+
} catch (Exception e) {
35+
logger.error("an unexpected exception happened in a cliock listener", e);
36+
}
37+
}
38+
39+
}

Diff for: core/src/main/java/de/sesu8642/feudaltactics/menu/common/ui/GameScreen.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,13 @@ public void dispose() {
7474
activeStage.dispose();
7575
}
7676

77+
/**
78+
* Switches to a new stage. Doesn't set it as the active InputProcessor.
79+
*/
7780
protected void setActiveStage(ResizableResettableStage activeStage) {
7881
this.activeStage = activeStage;
7982
}
80-
83+
8184
public ResizableResettableStage getActiveStage() {
8285
return activeStage;
8386
}

Diff for: core/src/main/java/de/sesu8642/feudaltactics/menu/common/ui/Slide.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class Slide {
1919
private static final float MAX_RESPONSIVE_IMAGE_WIDTH = Gdx.graphics.getDensity() * 1500F;
2020

2121
private Skin skin;
22+
private Label headlineLabel;
2223
private Table table = new Table();
2324

2425
/**
@@ -36,7 +37,7 @@ public Slide(Skin skin, String headline) {
3637
// adding the headline is a hack needed because the slide would get a width of 0
3738
// if the the label does not need to wrap (bug?)
3839
Table hackTable = new Table();
39-
Label headlineLabel = new Label(headline, skin.get(SkinConstants.FONT_HEADLINE, LabelStyle.class));
40+
headlineLabel = new Label(headline, skin.get(SkinConstants.FONT_HEADLINE, LabelStyle.class));
4041
hackTable.add(headlineLabel);
4142
table.add(hackTable);
4243
table.row();
@@ -96,5 +97,12 @@ public Slide addTable(List<List<String>> data) {
9697
public Table getTable() {
9798
return table;
9899
}
100+
101+
/**
102+
* Setter for the headline.
103+
*/
104+
public void setHeadline(String headline) {
105+
headlineLabel.setText(headline);
106+
}
99107

100108
}

Diff for: core/src/main/java/de/sesu8642/feudaltactics/menu/common/ui/SlideStage.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class SlideStage extends ResizableResettableStage {
3535
private Table currentSlide;
3636
private TextButton backButton;
3737
private TextButton nextButton;
38+
private ScrollPane scrollPane;
3839
private Container<Table> slideContainer = new Container<>();
3940
private Runnable finishedCallback;
4041

@@ -91,7 +92,7 @@ private void initUi(List<Table> slides) {
9192

9293
Stack slideAreaStack = new Stack(backgroundArea, slideContainer);
9394

94-
ScrollPane scrollPane = new ScrollPane(slideAreaStack, skin);
95+
scrollPane = new ScrollPane(slideAreaStack, skin);
9596
scrollPane.setFadeScrollBars(false);
9697
scrollPane.setOverscroll(false, false);
9798

@@ -149,6 +150,7 @@ public void reset() {
149150
nextButton.setText(nextButtonText);
150151
currentSlide = slides.get(0);
151152
slideContainer.setActor(currentSlide);
153+
scrollPane.setScrollY(0);
152154
}
153155

154156
@Override
@@ -178,5 +180,5 @@ public void dispose() {
178180
public void setFinishedCallback(Runnable finishedCallback) {
179181
this.finishedCallback = finishedCallback;
180182
}
181-
183+
182184
}

Diff for: core/src/main/java/de/sesu8642/feudaltactics/menu/information/dagger/DependencyLicensesScreen.java

-15
This file was deleted.

Diff for: core/src/main/java/de/sesu8642/feudaltactics/menu/information/dagger/DependencyLicensesStage.java

-15
This file was deleted.

Diff for: core/src/main/java/de/sesu8642/feudaltactics/menu/information/dagger/InformationMenuDaggerModule.java

+31-43
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,17 @@
22

33
package de.sesu8642.feudaltactics.menu.information.dagger;
44

5-
import java.io.IOException;
6-
import java.net.URL;
75
import java.nio.charset.StandardCharsets;
8-
import java.util.Collections;
6+
import java.util.HashMap;
7+
import java.util.Map;
98

109
import javax.inject.Singleton;
1110

12-
import com.badlogic.gdx.graphics.OrthographicCamera;
13-
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
14-
import com.badlogic.gdx.utils.viewport.Viewport;
15-
import com.google.common.eventbus.EventBus;
16-
import com.google.common.io.Resources;
11+
import com.badlogic.gdx.Gdx;
12+
import com.badlogic.gdx.files.FileHandle;
1713

1814
import dagger.Module;
1915
import dagger.Provides;
20-
import de.sesu8642.feudaltactics.events.ScreenTransitionTriggerEvent;
21-
import de.sesu8642.feudaltactics.events.ScreenTransitionTriggerEvent.ScreenTransitionTarget;
22-
import de.sesu8642.feudaltactics.exceptions.InitializationException;
23-
import de.sesu8642.feudaltactics.menu.common.dagger.MenuBackgroundCamera;
24-
import de.sesu8642.feudaltactics.menu.common.dagger.MenuCamera;
25-
import de.sesu8642.feudaltactics.menu.common.dagger.MenuViewport;
26-
import de.sesu8642.feudaltactics.menu.common.ui.GameScreen;
27-
import de.sesu8642.feudaltactics.menu.common.ui.Slide;
28-
import de.sesu8642.feudaltactics.menu.common.ui.SlideStage;
2916

3017
/** Dagger module for the information sub-menu and its items. */
3118
@Module
@@ -39,33 +26,34 @@ private InformationMenuDaggerModule() {
3926
@Provides
4027
@Singleton
4128
@DependencyLicenses
42-
static String provideDependencyLicensesText() {
43-
try {
44-
URL url = Resources.getResource("licenses.txt");
45-
return Resources.toString(url, StandardCharsets.UTF_8);
46-
} catch (IOException e) {
47-
throw new InitializationException("Dependency licenses cannot be read!", e);
29+
static Map<String, Map<String, String>> provideDependencyLicenses() {
30+
FileHandle assetsFileHandle = Gdx.files.internal("assets.txt");
31+
String assetListText = assetsFileHandle.readString(StandardCharsets.UTF_8.name());
32+
String[] assets = assetListText.split("\n");
33+
// outer map key: dependency name, inner map key: file name, outer map value:
34+
// file contents
35+
Map<String, Map<String, String>> result = new HashMap<>();
36+
for (int i = 0; i < assets.length; i++) {
37+
String assetPath = assets[i];
38+
if (!assetPath.startsWith("dependency_licenses/")) {
39+
continue;
40+
}
41+
String[] pathParts = assetPath.split("/");
42+
String fileName = pathParts[pathParts.length - 1];
43+
StringBuilder dependencyNameBuilder = new StringBuilder();
44+
for (int j = 1; j < pathParts.length - 1; j++) {
45+
if (dependencyNameBuilder.length() > 0) {
46+
dependencyNameBuilder.append(" - ");
47+
}
48+
dependencyNameBuilder.append(pathParts[j]);
49+
}
50+
String dependencyName = dependencyNameBuilder.toString();
51+
FileHandle fileHandle = Gdx.files.internal(assetPath);
52+
String fileContents = fileHandle.readString(StandardCharsets.UTF_8.name());
53+
result.putIfAbsent(dependencyName, new HashMap<>());
54+
result.get(dependencyName).put(fileName, fileContents);
4855
}
49-
}
50-
51-
@Provides
52-
@Singleton
53-
@DependencyLicensesStage
54-
static SlideStage provideDependencyLicensesStage(EventBus eventBus, @MenuViewport Viewport viewport,
55-
@DependencyLicenses String dependencyLicensesText, @MenuBackgroundCamera OrthographicCamera camera,
56-
Skin skin) {
57-
Slide licenseSlide = new Slide(skin, "Dependency Licenses").addLabel(dependencyLicensesText);
58-
return new SlideStage(viewport, Collections.singletonList(licenseSlide),
59-
() -> eventBus.post(new ScreenTransitionTriggerEvent(ScreenTransitionTarget.INFORMATION_MENU_SCREEN_2)),
60-
camera, skin);
61-
}
62-
63-
@Provides
64-
@Singleton
65-
@DependencyLicensesScreen
66-
static GameScreen provideDependencyLicensesScreen(@MenuCamera OrthographicCamera camera,
67-
@MenuViewport Viewport viewport, @DependencyLicensesStage SlideStage dependencyLicensesStage) {
68-
return new GameScreen(camera, viewport, dependencyLicensesStage);
56+
return result;
6957
}
7058

7159
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
package de.sesu8642.feudaltactics.menu.information.ui;
4+
5+
import javax.inject.Inject;
6+
import javax.inject.Singleton;
7+
8+
import com.badlogic.gdx.scenes.scene2d.ui.Label;
9+
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
10+
11+
import de.sesu8642.feudaltactics.menu.common.ui.Slide;
12+
13+
// this is not created by the DependencyLicensesStage because that could only use static methods as the slide needs to be passed to the super constructor
14+
15+
/** UI for the dependency details. */
16+
@Singleton
17+
public class DependencyDetailsSlide extends Slide {
18+
19+
final Label label;
20+
21+
/**
22+
* Constructor.
23+
*/
24+
@Inject
25+
public DependencyDetailsSlide(Skin skin) {
26+
super(skin, "Dependency Details");
27+
label = new Label("", skin);
28+
label.setWrap(true);
29+
super.getTable().add(label).fill().expand();
30+
}
31+
32+
}

0 commit comments

Comments
 (0)