Skip to content

Commit

Permalink
Merge pull request #4957 from kuronekochomusuke/unitToolTipMoreColors
Browse files Browse the repository at this point in the history
more tooltips colors
  • Loading branch information
HammerGS authored Dec 21, 2023
2 parents 2fc2ebb + 477bac9 commit f3fb654
Show file tree
Hide file tree
Showing 13 changed files with 132 additions and 64 deletions.
3 changes: 3 additions & 0 deletions megamek/i18n/megamek/client/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1188,6 +1188,9 @@ CommonSettingsDialog.colors.UnitTooltipBuildingBGColor=Building BG Color
CommonSettingsDialog.colors.UnitTooltipAltBGColor=Alt BG Color
CommonSettingsDialog.colors.UnitTooltipBlockBGColor=Block BG Color
CommonSettingsDialog.colors.UnitTooltipTerrainBGColor=Terrain BG Color
CommonSettingsDialog.colors.UnitTooltipHighlightColor=Highlight Color
CommonSettingsDialog.colors.UnitTooltipWeaponColor=Weapon Color
CommonSettingsDialog.colors.UnitTooltipQuirkColor=Quirk Color
CommonSettingsDialog.colors.VisualRangeColor=Visual Range Color
CommonSettingsDialog.colors.warningColor=Warning Color
CommonSettingsDialog.darkenMapAtNight=Darken Map At Night
Expand Down
2 changes: 1 addition & 1 deletion megamek/src/megamek/client/ui/swing/AimedShotDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public AimedShotDialog(JFrame parent, String title, String message,
getContentPane().add(labMessage);

String div = "<DIV WIDTH=" + UIUtil.scaleForGUI(500) + ">" + UnitToolTip.getTargetTipDetail(target, clientGUI.getClient()) + "</DIV>";
JLabel labTarget = new JLabel("<html>" + div + "</hmtl>", SwingConstants.LEFT);
JLabel labTarget = new JLabel(UnitToolTip.wrapWithHTML(div), SwingConstants.LEFT);

c.weightx = 1.0;
c.weighty = 1.0;
Expand Down
23 changes: 23 additions & 0 deletions megamek/src/megamek/client/ui/swing/CommonSettingsDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,9 @@ private <T> void moveElement(DefaultListModel<T> srcModel, int srcIndex, int trg
private ColourSelectorButton csbUnitTooltipAltBGColor;
private ColourSelectorButton csbUnitTooltipBlockBGColor;
private ColourSelectorButton csbUnitTooltipTerrainBGColor;
private ColourSelectorButton csbUnitTooltipHighlightColor;
private ColourSelectorButton csbUnitTooltipWeaponColor;
private ColourSelectorButton csbUnitTooltipQuirkColor;

private ColourSelectorButton csbUnitDisplayHeatLevel1;
private ColourSelectorButton csbUnitDisplayHeatLevel2;
Expand Down Expand Up @@ -1010,6 +1013,18 @@ private JPanel getUnitDisplayPanel() {
row.add(csbUnitTooltipTerrainBGColor);
comps.add(row);

row = new ArrayList<>();
csbUnitTooltipHighlightColor = new ColourSelectorButton(Messages.getString("CommonSettingsDialog.colors.UnitTooltipHighlightColor"));
csbUnitTooltipHighlightColor.setColour(GUIP.getUnitToolTipHighlightColor());
row.add(csbUnitTooltipHighlightColor);
csbUnitTooltipWeaponColor = new ColourSelectorButton(Messages.getString("CommonSettingsDialog.colors.UnitTooltipWeaponColor"));
csbUnitTooltipWeaponColor.setColour(GUIP.getUnitToolTipWeaponColor());
row.add(csbUnitTooltipWeaponColor);
csbUnitTooltipQuirkColor = new ColourSelectorButton(Messages.getString("CommonSettingsDialog.colors.UnitTooltipQuirkColor"));
csbUnitTooltipQuirkColor.setColour(GUIP.getUnitToolTipQuirkColor());
row.add(csbUnitTooltipQuirkColor);
comps.add(row);

addLineSpacer(comps);

comps.add(checkboxEntry(showArmorMiniVisTT, null));
Expand Down Expand Up @@ -1904,6 +1919,10 @@ protected void cancelAction() {
csbUnitTooltipBlockBGColor.setColour(GUIP.getUnitToolTipBlockBGColor());
csbUnitTooltipTerrainBGColor.setColour(GUIP.getUnitToolTipTerrainBGColor());

csbUnitTooltipHighlightColor.setColour(GUIP.getUnitToolTipHighlightColor());
csbUnitTooltipWeaponColor.setColour(GUIP.getUnitToolTipWeaponColor());
csbUnitTooltipQuirkColor.setColour(GUIP.getUnitToolTipQuirkColor());

csbUnitTooltipArmorMiniIntact.setColour(GUIP.getUnitTooltipArmorMiniColorIntact());
csbUnitTooltipArmorMiniPartial.setColour(GUIP.getUnitTooltipArmorMiniColorPartialDamage());
csbUnitTooltipArmorMiniDamaged.setColour(GUIP.getUnitTooltipArmorMiniColorDamaged());
Expand Down Expand Up @@ -2353,6 +2372,10 @@ protected void okAction() {
GUIP.setUnitTooltipBlockBGColor(csbUnitTooltipBlockBGColor.getColour());
GUIP.setUnitTooltipTerrainBGColor(csbUnitTooltipTerrainBGColor.getColour());

GUIP.setUnitTooltipHightlightColor(csbUnitTooltipHighlightColor.getColour());
GUIP.setUnitTooltipWeaponColor(csbUnitTooltipQuirkColor.getColour());
GUIP.setUnitTooltipQuirkColor(csbUnitTooltipWeaponColor.getColour());

GUIP.setUnitTooltipArmorminiColorIntact(csbUnitTooltipArmorMiniIntact.getColour());
GUIP.setUnitTooltipArmorminiColorPartialDamage(csbUnitTooltipArmorMiniPartial.getColour());
GUIP.setUnitTooltipArmorminiColorDamaged(csbUnitTooltipArmorMiniDamaged.getColour());
Expand Down
5 changes: 3 additions & 2 deletions megamek/src/megamek/client/ui/swing/EntityChoiceDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,13 @@ protected EntityChoiceDialog(JFrame frame, String title, String message,
@Override
protected void detailLabel(JToggleButton button, Entity target) {
String div = "<DIV WIDTH=" + UIUtil.scaleForGUI(500) + ">" + UnitToolTip.getEntityTipAsTarget(target, null) + "</DIV>";
button.setText("<html>" + div + "</html>");
button.setText(UnitToolTip.wrapWithHTML(div));
}

@Override
protected void summaryLabel(JToggleButton button, Entity target) {
button.setText("<html><b>" +UnitToolTip.getTargetTipSummaryEntity(target, null) + "</b></html>");
String txt = UnitToolTip.getTargetTipSummaryEntity(target, null);
button.setText(UnitToolTip.wrapWithHTML(txt));
}

/**
Expand Down
30 changes: 30 additions & 0 deletions megamek/src/megamek/client/ui/swing/GUIPreferences.java
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,9 @@ public class GUIPreferences extends PreferenceStoreProxy {
public static final String UNIT_TOOLTIP_ALT_BGCOLOR = "UnitToolTipAltBGColor";
public static final String UNIT_TOOLTIP_BLOCK_BGCOLOR = "UnitToolTipBlockBGColor";
public static final String UNIT_TOOLTIP_TERRAIN_BGCOLOR = "UnitToolTipTerainBGColor";
public static final String UNIT_TOOLTIP_HIGHTLIGHT_COLOR = "UnitToolTipHighlightColor";
public static final String UNIT_TOOLTIP_WEAPON_COLOR = "UnitToolTipWeaponColor";
public static final String UNIT_TOOLTIP_QUIRK_COLOR = "UnitToolTipQuirkColor";

public static final String SPLIT_PANE_A_DIVIDER_LOCATION = "SplitPaneADividerLocation";
public static final String GAME_SUMMARY_BOARD_VIEW = "GameSummaryBoardView";
Expand Down Expand Up @@ -590,6 +593,9 @@ protected GUIPreferences() {
setDefault(UNIT_TOOLTIP_ALT_BGCOLOR, new Color(0x003333));
setDefault(UNIT_TOOLTIP_BLOCK_BGCOLOR, new Color(0x000060));
setDefault(UNIT_TOOLTIP_TERRAIN_BGCOLOR, new Color(0x8DAF8D));
setDefault(UNIT_TOOLTIP_HIGHTLIGHT_COLOR, new Color(0xB496DC));
setDefault(UNIT_TOOLTIP_WEAPON_COLOR, new Color(0x9696D2));
setDefault(UNIT_TOOLTIP_QUIRK_COLOR, new Color(0x64B4B4));

store.setDefault(GAME_SUMMARY_BOARD_VIEW, false);
store.setDefault(ENTITY_OWNER_LABEL_COLOR, true);
Expand Down Expand Up @@ -2779,6 +2785,18 @@ public Color getUnitToolTipTerrainBGColor() {
return getColor(UNIT_TOOLTIP_TERRAIN_BGCOLOR);
}

public Color getUnitToolTipHighlightColor() {
return getColor(UNIT_TOOLTIP_HIGHTLIGHT_COLOR);
}

public Color getUnitToolTipWeaponColor() {
return getColor(UNIT_TOOLTIP_WEAPON_COLOR);
}

public Color getUnitToolTipQuirkColor() {
return getColor(UNIT_TOOLTIP_QUIRK_COLOR);
}

public boolean getDockOnLeft() {
return getBoolean(DOCK_ON_LEFT);
}
Expand Down Expand Up @@ -2966,6 +2984,18 @@ public void setUnitTooltipTerrainBGColor(Color c) {
store.setValue(UNIT_TOOLTIP_TERRAIN_BGCOLOR, getColorString(c));
}

public void setUnitTooltipHightlightColor(Color c) {
store.setValue(UNIT_TOOLTIP_HIGHTLIGHT_COLOR, getColorString(c));
}

public void setUnitTooltipWeaponColor(Color c) {
store.setValue(UNIT_TOOLTIP_WEAPON_COLOR, getColorString(c));
}

public void setUnitTooltipQuirkColor(Color c) {
store.setValue(UNIT_TOOLTIP_QUIRK_COLOR, getColorString(c));
}

public void setDockOnLeft(Boolean state) {
store.setValue(DOCK_ON_LEFT, state);
}
Expand Down
10 changes: 5 additions & 5 deletions megamek/src/megamek/client/ui/swing/TargetChoiceDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,15 @@ protected TargetChoiceDialog(JFrame frame, String title, String message,

@Override
protected void detailLabel(JToggleButton button, Targetable target) {
String div = "<DIV WIDTH=" + UIUtil.scaleForGUI(500) + ">" + infoText(target) + " " + UnitToolTip.getTargetTipDetail(target,
clientGUI.getClient()) + "</DIV>";
button.setText("<html>" + div + "</html>");
String div = infoText(target) + " " + UnitToolTip.getTargetTipDetail(target, clientGUI.getClient());
div = "<DIV WIDTH=" + UIUtil.scaleForGUI(500) + ">" + div + "</DIV>";
button.setText(UnitToolTip.wrapWithHTML(div));
}

@Override
protected void summaryLabel(JToggleButton button, Targetable target) {
button.setText("<html>" + infoText(target) + "<BR>" + UnitToolTip.getTargetTipSummary(target,
clientGUI.getClient()) + "</html>");
String txt = infoText(target) + "<BR>" + UnitToolTip.getTargetTipSummary(target, clientGUI.getClient());
button.setText(UnitToolTip.wrapWithHTML(txt));
}

protected String infoText(Targetable target) {
Expand Down
8 changes: 3 additions & 5 deletions megamek/src/megamek/client/ui/swing/boardview/BoardView.java
Original file line number Diff line number Diff line change
Expand Up @@ -5724,14 +5724,12 @@ public String getHexTooltip(MouseEvent e) {
result += sSpecialHex;
}

String div = "<DIV WIDTH=" + UIUtil.scaleForGUI(500) + ">" + result + "</DIV>";
StringBuffer txt = new StringBuffer();
String htmlStyle = "style=\"color:" + GUIP.hexColor(GUIP.getUnitToolTipFGColor()) + "; ";
htmlStyle += "background-color:" + GUIP.hexColor(GUIP.getUnitToolTipBGColor()) + ";\"";
txt.append("<HTML><BODY " + htmlStyle + ">" + div + "</BODY></HTML>");
String div = "<DIV WIDTH=" + UIUtil.scaleForGUI(500) + ">" + result + "</DIV>";
txt.append(UnitToolTip.wrapWithHTML(div));

// Check to see if the tool tip is completely empty
if (txt.toString().equals("<HTML><BODY " + htmlStyle + ">" + "</BODY></HTML>")) {
if (result.isEmpty()) {
return "";
}

Expand Down
6 changes: 2 additions & 4 deletions megamek/src/megamek/client/ui/swing/lobby/MekTableModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -186,14 +186,12 @@ private void addCellData(InGameObject entity) {
MapSettings mset = chatLounge.mapSettings;
Player lPlayer = clientGui.getClient().getLocalPlayer();
String s = UnitToolTip.lobbyTip(entity, lPlayer, mset).toString();
String htmlStyle = "style=\"color:" + GUIP.hexColor(GUIP.getUnitToolTipFGColor()) + "; ";
htmlStyle += "background-color:" + GUIP.hexColor(GUIP.getUnitToolTipBGColor()) + ";\"";
unitTooltips.add("<HTML><BODY " + htmlStyle + ">" + s + "</BODY></HTML>");
unitTooltips.add(UnitToolTip.wrapWithHTML(s));
s = PilotToolTip.lobbyTip(entity).toString();
if (entity instanceof Entity) {
s += PilotToolTip.getCrewAdvs((Entity) entity, true).toString();
}
pilotTooltips.add("<HTML><BODY " + htmlStyle + ">" + s + "</BODY></HTML>");
pilotTooltips.add(UnitToolTip.wrapWithHTML(s));
}
final boolean rpgSkills = clientGui.getClient().getGame().getOptions().booleanOption(OptionsConstants.RPG_RPG_GUNNERY);
unitCells.add(LobbyMekCellFormatter.unitTableEntry(entity, chatLounge, false, chatLounge.isCompact()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public static String getOneLineSummary(BuildingTarget target, Board board) {
public static String getTerrainTip(Hex mhex, GUIPreferences GUIP, Game game)
{
Coords mcoords = mhex.getCoords();
String illuminated = IlluminationLevel.getIlluminationLevelIndicator(game, mcoords);
String illuminated = IlluminationLevel.getIlluminationLevelIndicator(game, mcoords, GUIP);
String result = "";
StringBuilder sTerrain = new StringBuilder(Messages.getString("BoardView1.Tooltip.Hex", mcoords.getBoardNum(), mhex.getLevel()) + illuminated + "<BR>");

Expand Down
43 changes: 25 additions & 18 deletions megamek/src/megamek/client/ui/swing/tooltip/UnitToolTip.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,13 @@ public static StringBuilder getEntityTipReport(Entity entity) {
false, true, false, false, false, true);
}

public static String wrapWithHTML(String text) {
String fgColor = GUIP.hexColor(GUIP.getUnitToolTipFGColor());
String bgColor = GUIP.hexColor(GUIP.getUnitToolTipBGColor());
String format = "<html><body style=\"color:%s; background-color:%s;\" >%s</body></html>";
return String.format(format, fgColor, bgColor, text);
}

// PRIVATE

/** Assembles the whole unit tooltip. */
Expand Down Expand Up @@ -211,7 +218,7 @@ private static String getDisplayNames(Entity entity, @Nullable Game game, boolea
if (showName) {
// Unit Chassis and Player
Player owner = (game != null) ? game.getPlayer(entity.getOwnerId()) : null;
Color ownerColor = (owner != null) ? owner.getColour().getColour() : uiGray();
Color ownerColor = (owner != null) ? owner.getColour().getColour() : GUIP.getUnitToolTipFGColor();
String ownerName = (owner != null) ? owner.getName() : ReportMessages.getString("BoardView1.Tooltip.unknownOwner");
String msg_clanbrackets = Messages.getString("BoardView1.Tooltip.ClanBrackets");
String clanStr = entity.isClan() && !entity.isMixedTech() ? " " + msg_clanbrackets + " " : "";
Expand All @@ -220,7 +227,7 @@ private static String getDisplayNames(Entity entity, @Nullable Game game, boolea
result += "&nbsp;&nbsp;" + entity.getEntityTypeName(entity.getEntityType());
result += "<BR>" + ownerName;
String msg_id = MessageFormat.format(" [ID: {0}]", entity.getId());
result += UIUtil.guiScaledFontHTML(UIUtil.uiGray()) + msg_id + "</FONT>";
result += UIUtil.guiScaledFontHTML(GUIP.getUnitToolTipFGColor()) + msg_id + "</FONT>";
result = guiScaledFontHTML(ownerColor) + result + "</FONT>";
}

Expand Down Expand Up @@ -251,7 +258,7 @@ private static String getQuirks(Entity entity, Game game, boolean details) {
}
}

return guiScaledFontHTML(uiQuirksColor(), TT_SMALLFONT_DELTA) + sQuirks + "</FONT>";
return guiScaledFontHTML(GUIP.getUnitToolTipQuirkColor(), TT_SMALLFONT_DELTA) + sQuirks + "</FONT>";
}

return "";
Expand All @@ -263,7 +270,7 @@ private static String getPartialRepairs(Entity entity, boolean details) {
grp -> entity.countPartialRepairs(), details);

if (!partialList.isEmpty()) {
result += guiScaledFontHTML(uiPartialRepairColor(), TT_SMALLFONT_DELTA) + partialList + "</FONT>";
result += guiScaledFontHTML(GUIP.getPrecautionColor(), TT_SMALLFONT_DELTA) + partialList + "</FONT>";
}

return result;
Expand Down Expand Up @@ -947,9 +954,9 @@ private static StringBuilder weaponList(Entity entity) {
}
};

col1 = guiScaledFontHTML(uiTTWeaponColor()) + col1 + "</FONT>";
col1 = guiScaledFontHTML(GUIP.getUnitToolTipWeaponColor()) + col1 + "</FONT>";
col1 = "<TD>" + col1 + "</TD>";
col2 = guiScaledFontHTML(uiTTWeaponColor()) + col2 + "</FONT>";
col2 = guiScaledFontHTML(GUIP.getUnitToolTipWeaponColor()) + col2 + "</FONT>";
col2 = "<TD>" + col2 + "</TD>";
row = "<TR>" + col1 + col2 + "</TR>";
}
Expand Down Expand Up @@ -989,11 +996,11 @@ private static StringBuilder bombList(Entity entity) {
col2 = "&nbsp;x&nbsp;";
col3 = BombType.getBombName(i);

col1 = guiScaledFontHTML(uiTTWeaponColor()) + col1 + "</FONT>";
col1 = guiScaledFontHTML(GUIP.getUnitToolTipWeaponColor()) + col1 + "</FONT>";
col1 = "<TD>" + col1 + "</TD>";
col2 = guiScaledFontHTML(uiTTWeaponColor()) + col2 + "</FONT>";
col2 = guiScaledFontHTML(GUIP.getUnitToolTipWeaponColor()) + col2 + "</FONT>";
col2 = "<TD>" + col2 + "</TD>";
col3 = guiScaledFontHTML(uiTTWeaponColor()) + col3 + "</FONT>";
col3 = guiScaledFontHTML(GUIP.getUnitToolTipWeaponColor()) + col3 + "</FONT>";
col3 = "<TD>" + col3 + "</TD>";
row = "<TR>" + col1 + col2 + col3 + "</TR>";
} else {
Expand Down Expand Up @@ -1338,7 +1345,7 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo
sAeroInfo = addToTT("Elev", BR, entity.getElevation()).toString();
}
sAeroInfo = "<I>" + sAeroInfo + "</I>";
result += guiScaledFontHTML(uiLightViolet()) + sAeroInfo + "</FONT>";
result += guiScaledFontHTML(GUIP.getUnitToolTipHighlightColor()) + sAeroInfo + "</FONT>";

result += "<BR>";
String msg_facing = Messages.getString("BoardView1.Tooltip.Facing");
Expand All @@ -1360,7 +1367,7 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo
}
HeatDisplayHelper hdh = getHeatCapacityForDisplay(entity);
sHeat += " / "+ hdh.heatCapacityStr;
result += guiScaledFontHTML(GUIP.getColorForHeat(heat)) + sHeat + "</FONT>";
result += guiScaledFontHTML(GUIP.getColorForHeat(heat, GUIP.getUnitToolTipFGColor())) + sHeat + "</FONT>";

if (entity instanceof Mech && ((Mech) entity).hasActiveTSM()) {
result += DOT_SPACER;
Expand All @@ -1370,12 +1377,12 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo
}

String illuminated = entity.isIlluminated() ? DOT_SPACER +"\uD83D\uDCA1" : "";
result += guiScaledFontHTML(uiYellow()) + illuminated + "</FONT>";
result += guiScaledFontHTML(GUIP.getCautionColor()) + illuminated + "</FONT>";

if (entity.hasSearchlight()) {
String searchLight = entity.isUsingSearchlight() ? DOT_SPACER + "\uD83D\uDD26" : "";
searchLight += entity.usedSearchlight() ? " \u2580\u2580" : "";
result += guiScaledFontHTML(uiYellow()) + searchLight + "</FONT>";
result += guiScaledFontHTML(GUIP.getCautionColor()) + searchLight + "</FONT>";
} else {
String searchLight = "\uD83D\uDD26";
result += guiScaledFontHTML(GUIP.getWarningColor()) + DOT_SPACER + searchLight + "</FONT>";
Expand Down Expand Up @@ -1500,7 +1507,7 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo

if (entity.hasAnyTypeNarcPodsAttached()) {
String sNarced = addToTT(entity.hasNarcPodsAttached() ? "Narced" : "INarced", BR).toString();
result += guiScaledFontHTML(uiLightRed()) + sNarced + "</FONT>";
result += guiScaledFontHTML(GUIP.getPrecautionColor()) + sNarced + "</FONT>";
}

// Towing
Expand All @@ -1514,7 +1521,7 @@ private static StringBuilder inGameValues(Entity entity, Player localPlayer, boo
}

// Coloring to make these transient entries stand out
result = guiScaledFontHTML(uiLightViolet()) + result + "</FONT>";
result = guiScaledFontHTML(GUIP.getUnitToolTipHighlightColor()) + result + "</FONT>";

return new StringBuilder().append(result);
}
Expand Down Expand Up @@ -1882,7 +1889,7 @@ private static StringBuilder c3Info(Entity entity, boolean details) {
sC3Info += "<BR>";
}

result = guiScaledFontHTML(uiC3Color(), -0.2f) + sC3Info + "</FONT>";
result = guiScaledFontHTML(GUIP.getUnitToolTipHighlightColor(), -0.2f) + sC3Info + "</FONT>";

}

Expand All @@ -1904,13 +1911,13 @@ private static String c3UnitName(Entity c3member, Entity entity) {
}

sC3UnitName += "<I>" + msg_c3 + "</I>";
result += guiScaledFontHTML(uiGray(), -0.2f) + sC3UnitName + "</FONT>";
result += guiScaledFontHTML(GUIP.getUnitToolTipFGColor(), -0.2f) + sC3UnitName + "</FONT>";
result += c3member.getShortNameRaw();

String msg_thisunit = " (" + Messages.getString("BoardView1.Tooltip.ThisUnit") + ")";
tmp = "<I>" + msg_thisunit + "</I>";
String sC3Member = c3member.equals(entity) ? tmp : "";
result += guiScaledFontHTML(uiGray(), -0.2f) + sC3Member + "</FONT>";
result += guiScaledFontHTML(GUIP.getUnitToolTipFGColor(), -0.2f) + sC3Member + "</FONT>";

return result;
}
Expand Down
Loading

0 comments on commit f3fb654

Please sign in to comment.