Implement new viewport size/zoom UI.

This commit is contained in:
Paul Chote
2019-12-11 18:48:43 +00:00
committed by tovl
parent 860117daf9
commit 1dcb903580
17 changed files with 319 additions and 253 deletions

View File

@@ -673,7 +673,10 @@ namespace OpenRA
// World rendering is disabled while the loading screen is displayed // World rendering is disabled while the loading screen is displayed
if (worldRenderer != null && !worldRenderer.World.IsLoadingGameSave) if (worldRenderer != null && !worldRenderer.World.IsLoadingGameSave)
{
worldRenderer.Viewport.Tick();
worldRenderer.PrepareRenderables(); worldRenderer.PrepareRenderables();
}
Ui.PrepareRenderables(); Ui.PrepareRenderables();
Renderer.WorldModelRenderer.EndFrame(); Renderer.WorldModelRenderer.EndFrame();

View File

@@ -36,6 +36,8 @@ namespace OpenRA.Graphics
public class Viewport public class Viewport
{ {
readonly WorldRenderer worldRenderer; readonly WorldRenderer worldRenderer;
readonly WorldViewportSizes viewportSizes;
readonly GraphicSettings graphicSettings;
// Map bounds (world-px) // Map bounds (world-px)
readonly Rectangle mapBounds; readonly Rectangle mapBounds;
@@ -55,14 +57,16 @@ namespace OpenRA.Graphics
ProjectedCellRegion allCells; ProjectedCellRegion allCells;
bool allCellsDirty = true; bool allCellsDirty = true;
readonly float[] availableZoomSteps = new[] { 2f, 1f, 0.5f, 0.25f };
WorldViewport lastViewportDistance;
float zoom = 1f; float zoom = 1f;
float minZoom = 1f;
float maxZoom = 2f;
public float[] AvailableZoomSteps bool unlockMinZoom;
{ float unlockedMinZoomScale;
get { return availableZoomSteps; } float unlockedMinZoom = 1f;
}
public float Zoom public float Zoom
{ {
@@ -71,16 +75,37 @@ namespace OpenRA.Graphics
return zoom; return zoom;
} }
set private set
{ {
var newValue = ClosestTo(AvailableZoomSteps, value); zoom = value;
zoom = newValue;
viewportSize = (1f / zoom * new float2(Game.Renderer.Resolution)).ToInt2(); viewportSize = (1f / zoom * new float2(Game.Renderer.Resolution)).ToInt2();
cellsDirty = true; cellsDirty = true;
allCellsDirty = true; allCellsDirty = true;
} }
} }
public void AdjustZoom(float dz)
{
// Exponential ensures that equal positive and negative steps have the same effect
Zoom = (zoom * (float)Math.Exp(dz)).Clamp(unlockMinZoom ? unlockedMinZoom : minZoom, maxZoom);
}
public void ToggleZoom()
{
// Unlocked zooms always reset to the default zoom
if (zoom < minZoom)
Zoom = minZoom;
else
Zoom = zoom > minZoom ? minZoom : maxZoom;
}
public void UnlockMinimumZoom(float scale)
{
unlockMinZoom = true;
unlockedMinZoomScale = scale;
UpdateViewportZooms(false);
}
public static long LastMoveRunTime = 0; public static long LastMoveRunTime = 0;
public static int2 LastMousePos; public static int2 LastMousePos;
@@ -120,6 +145,8 @@ namespace OpenRA.Graphics
{ {
worldRenderer = wr; worldRenderer = wr;
var grid = Game.ModData.Manifest.Get<MapGrid>(); var grid = Game.ModData.Manifest.Get<MapGrid>();
viewportSizes = Game.ModData.Manifest.Get<WorldViewportSizes>();
graphicSettings = Game.Settings.Graphics;
// Calculate map bounds in world-px // Calculate map bounds in world-px
if (wr.World.Type == WorldType.Editor) if (wr.World.Type == WorldType.Editor)
@@ -141,8 +168,75 @@ namespace OpenRA.Graphics
CenterLocation = (tl + br) / 2; CenterLocation = (tl + br) / 2;
} }
Zoom = Game.Settings.Graphics.PixelDouble ? 2 : 1;
tileSize = grid.TileSize; tileSize = grid.TileSize;
UpdateViewportZooms();
}
public void Tick()
{
if (lastViewportDistance != graphicSettings.ViewportDistance)
UpdateViewportZooms();
}
float CalculateMinimumZoom(float minHeight, float maxHeight)
{
var h = Game.Renderer.Resolution.Height;
// Check the easy case: the native resolution is within the maximum limit
// Also catches the case where the user may force a resolution smaller than the minimum window size
if (h <= maxHeight)
return 1;
// Find a clean fraction that brings us within the desired range to reduce aliasing
var step = 1f;
while (true)
{
var testZoom = 1f;
while (true)
{
var nextZoom = testZoom + step;
if (h < minHeight * nextZoom)
break;
testZoom = nextZoom;
}
if (h < maxHeight * testZoom)
return testZoom;
step /= 2;
}
}
void UpdateViewportZooms(bool resetCurrentZoom = true)
{
lastViewportDistance = graphicSettings.ViewportDistance;
var vd = graphicSettings.ViewportDistance;
if (viewportSizes.AllowNativeZoom && vd == WorldViewport.Native)
minZoom = 1;
else
{
var range = viewportSizes.GetSizeRange(vd);
minZoom = CalculateMinimumZoom(range.X, range.Y);
}
maxZoom = Math.Min(minZoom * viewportSizes.MaxZoomScale, Game.Renderer.Resolution.Height * 1f / viewportSizes.MaxZoomWindowHeight);
if (unlockMinZoom)
{
// Specators and the map editor support zooming out by an extra factor of two.
// TODO: Allow zooming out until the full map is visible
// We need to improve our viewport scroll handling to center the map as we zoom out
// before this will work well enough to enable
unlockedMinZoom = minZoom * unlockedMinZoomScale;
}
if (resetCurrentZoom)
Zoom = minZoom;
else
Zoom = Zoom.Clamp(minZoom, maxZoom);
} }
public CPos ViewToWorld(int2 view) public CPos ViewToWorld(int2 view)

View File

@@ -13,7 +13,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using OpenRA.Graphics;
using OpenRA.Primitives; using OpenRA.Primitives;
using OpenRA.Traits; using OpenRA.Traits;
@@ -34,6 +33,8 @@ namespace OpenRA
Incompatible = 16 Incompatible = 16
} }
public enum WorldViewport { Native, Close, Medium, Far }
public class ServerSettings public class ServerSettings
{ {
[Desc("Sets the server name.")] [Desc("Sets the server name.")]
@@ -145,8 +146,8 @@ namespace OpenRA
public bool HardwareCursors = true; public bool HardwareCursors = true;
public bool PixelDouble = false;
public bool CursorDouble = false; public bool CursorDouble = false;
public WorldViewport ViewportDistance = WorldViewport.Medium;
[Desc("Add a frame rate limiter. It is recommended to not disable this.")] [Desc("Add a frame rate limiter. It is recommended to not disable this.")]
public bool CapFramerate = true; public bool CapFramerate = true;
@@ -207,6 +208,7 @@ namespace OpenRA
public MouseButtonPreference MouseButtonPreference = new MouseButtonPreference(); public MouseButtonPreference MouseButtonPreference = new MouseButtonPreference();
public float ViewportEdgeScrollStep = 30f; public float ViewportEdgeScrollStep = 30f;
public float UIScrollSpeed = 50f; public float UIScrollSpeed = 50f;
public float ZoomSpeed = 0.04f;
public int SelectionDeadzone = 24; public int SelectionDeadzone = 24;
public int MouseScrollDeadzone = 8; public int MouseScrollDeadzone = 8;
@@ -220,8 +222,7 @@ namespace OpenRA
[Desc("Filename of the authentication profile to use.")] [Desc("Filename of the authentication profile to use.")]
public string AuthProfile = "player.oraid"; public string AuthProfile = "player.oraid";
public bool AllowZoom = true; public Modifiers ZoomModifier = Modifiers.None;
public Modifiers ZoomModifier = Modifiers.Ctrl;
public bool FetchNews = true; public bool FetchNews = true;

View File

@@ -0,0 +1,33 @@
#region Copyright & License Information
/*
* Copyright 2007-2019 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System.Collections.Generic;
namespace OpenRA
{
public class WorldViewportSizes : IGlobalModData
{
public readonly int2 CloseWindowHeights = new int2(480, 600);
public readonly int2 MediumWindowHeights = new int2(600, 900);
public readonly int2 FarWindowHeights = new int2(900, 1300);
public readonly float MaxZoomScale = 2.0f;
public readonly int MaxZoomWindowHeight = 240;
public readonly bool AllowNativeZoom = true;
public int2 GetSizeRange(WorldViewport distance)
{
return distance == WorldViewport.Close ? CloseWindowHeights
: distance == WorldViewport.Medium ? MediumWindowHeights
: FarWindowHeights;
}
}
}

View File

@@ -39,6 +39,9 @@ namespace OpenRA.Mods.Common.Widgets
editorActionManager = world.WorldActor.Trait<EditorActionManager>(); editorActionManager = world.WorldActor.Trait<EditorActionManager>();
editorActionManager.OnChange += EditorActionManagerOnChange; editorActionManager.OnChange += EditorActionManagerOnChange;
// Allow zooming out to full map size
worldRenderer.Viewport.UnlockMinimumZoom(0.25f);
} }
void EditorActionManagerOnChange() void EditorActionManagerOnChange()
@@ -80,26 +83,11 @@ namespace OpenRA.Mods.Common.Widgets
tooltipContainer.Value.RemoveTooltip(); tooltipContainer.Value.RemoveTooltip();
} }
void Zoom(int amount)
{
var zoomSteps = worldRenderer.Viewport.AvailableZoomSteps;
var currentZoom = worldRenderer.Viewport.Zoom;
var nextIndex = zoomSteps.IndexOf(currentZoom) - amount;
if (nextIndex < 0 || nextIndex >= zoomSteps.Length)
return;
var zoom = zoomSteps[nextIndex];
Parent.Get<DropDownButtonWidget>("ZOOM_BUTTON").SelectedItem = zoom.ToString();
worldRenderer.Viewport.Zoom = zoom;
}
public override bool HandleMouseInput(MouseInput mi) public override bool HandleMouseInput(MouseInput mi)
{ {
if (mi.Event == MouseInputEvent.Scroll && if (mi.Event == MouseInputEvent.Scroll && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
Game.Settings.Game.AllowZoom && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
{ {
Zoom(mi.Delta.Y); worldRenderer.Viewport.AdjustZoom(mi.Delta.Y * Game.Settings.Game.ZoomSpeed);
return true; return true;
} }

View File

@@ -25,13 +25,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
MapCopyFilters copyFilters = MapCopyFilters.All; MapCopyFilters copyFilters = MapCopyFilters.All;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public MapEditorLogic(Widget widget, ModData modData, World world, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs) public MapEditorLogic(Widget widget, World world, WorldRenderer worldRenderer)
{ {
MiniYaml yaml;
var changeZoomKey = new HotkeyReference();
if (logicArgs.TryGetValue("ChangeZoomKey", out yaml))
changeZoomKey = modData.Hotkeys[yaml.Value];
var editorViewport = widget.Get<EditorViewportControllerWidget>("MAP_EDITOR"); var editorViewport = widget.Get<EditorViewportControllerWidget>("MAP_EDITOR");
var gridButton = widget.GetOrNull<ButtonWidget>("GRID_BUTTON"); var gridButton = widget.GetOrNull<ButtonWidget>("GRID_BUTTON");
@@ -43,48 +38,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
gridButton.IsHighlighted = () => terrainGeometryTrait.Enabled; gridButton.IsHighlighted = () => terrainGeometryTrait.Enabled;
} }
var zoomDropdown = widget.GetOrNull<DropDownButtonWidget>("ZOOM_BUTTON");
if (zoomDropdown != null)
{
var selectedZoom = (Game.Settings.Graphics.PixelDouble ? 2f : 1f).ToString();
zoomDropdown.SelectedItem = selectedZoom;
Func<float, ScrollItemWidget, ScrollItemWidget> setupItem = (zoom, itemTemplate) =>
{
var item = ScrollItemWidget.Setup(
itemTemplate,
() =>
{
return float.Parse(zoomDropdown.SelectedItem) == zoom;
},
() =>
{
zoomDropdown.SelectedItem = selectedZoom = zoom.ToString();
worldRenderer.Viewport.Zoom = float.Parse(selectedZoom);
});
var label = zoom.ToString();
item.Get<LabelWidget>("LABEL").GetText = () => label;
return item;
};
var options = worldRenderer.Viewport.AvailableZoomSteps;
zoomDropdown.OnMouseDown = _ => zoomDropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 150, options, setupItem);
zoomDropdown.GetText = () => zoomDropdown.SelectedItem;
zoomDropdown.OnKeyPress = e =>
{
if (!changeZoomKey.IsActivatedBy(e))
return;
var selected = (options.IndexOf(float.Parse(selectedZoom)) + 1) % options.Length;
var zoom = options[selected];
worldRenderer.Viewport.Zoom = zoom;
selectedZoom = zoom.ToString();
zoomDropdown.SelectedItem = zoom.ToString();
};
}
var copypasteButton = widget.GetOrNull<ButtonWidget>("COPYPASTE_BUTTON"); var copypasteButton = widget.GetOrNull<ButtonWidget>("COPYPASTE_BUTTON");
if (copypasteButton != null) if (copypasteButton != null)
{ {

View File

@@ -16,31 +16,21 @@ using OpenRA.Widgets;
namespace OpenRA.Mods.Common.Widgets.Logic.Ingame namespace OpenRA.Mods.Common.Widgets.Logic.Ingame
{ {
[ChromeLogicArgsHotkeys("TogglePixelDoubleKey")] [ChromeLogicArgsHotkeys("ResetZoomKey")]
public class TogglePixelDoubleHotkeyLogic : SingleHotkeyBaseLogic public class ResetZoomHotkeyLogic : SingleHotkeyBaseLogic
{ {
readonly Viewport viewport; readonly Viewport viewport;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public TogglePixelDoubleHotkeyLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs) public ResetZoomHotkeyLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
: base(widget, modData, "TogglePixelDoubleKey", "WORLD_KEYHANDLER", logicArgs) : base(widget, modData, "ResetZoomKey", "WORLD_KEYHANDLER", logicArgs)
{ {
viewport = worldRenderer.Viewport; viewport = worldRenderer.Viewport;
} }
protected override bool OnHotkeyActivated(KeyInput e) protected override bool OnHotkeyActivated(KeyInput e)
{ {
// Zoom is currently always set directly, so we don't need to worry about floating point imprecision viewport.ToggleZoom();
if (viewport.Zoom == 1f)
viewport.Zoom = 2f;
else
{
// Reset zoom to regular view if it was anything else before
// (like a zoom level only reachable by using the scroll wheel).
viewport.Zoom = 1f;
}
Game.Settings.Graphics.PixelDouble = viewport.Zoom == 2f;
return true; return true;
} }

View File

@@ -12,6 +12,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.Common.Lint; using OpenRA.Mods.Common.Lint;
using OpenRA.Network; using OpenRA.Network;
using OpenRA.Primitives; using OpenRA.Primitives;
@@ -64,7 +65,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
} }
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ObserverShroudSelectorLogic(Widget widget, ModData modData, World world, Dictionary<string, MiniYaml> logicArgs) public ObserverShroudSelectorLogic(Widget widget, ModData modData, World world, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
{ {
this.world = world; this.world = world;
@@ -145,6 +146,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
selected = limitViews ? groups.First().Value.First() : world.WorldActor.Owner.Shroud.ExploreMapEnabled ? combined : disableShroud; selected = limitViews ? groups.First().Value.First() : world.WorldActor.Owner.Shroud.ExploreMapEnabled ? combined : disableShroud;
selected.OnClick(); selected.OnClick();
// Enable zooming out to fractional zoom levels
worldRenderer.Viewport.UnlockMinimumZoom(0.5f);
} }
public bool HandleKeyPress(KeyInput e) public bool HandleKeyPress(KeyInput e)

View File

@@ -190,13 +190,20 @@ namespace OpenRA.Mods.Common.Widgets.Logic
resetPanelActions.Add(type, reset(panel)); resetPanelActions.Add(type, reset(panel));
} }
static readonly Dictionary<WorldViewport, string> ViewportSizeNames = new Dictionary<WorldViewport, string>()
{
{ WorldViewport.Close, "Close" },
{ WorldViewport.Medium, "Medium" },
{ WorldViewport.Far, "Far" },
{ WorldViewport.Native, "Furthest" }
};
Action InitDisplayPanel(Widget panel) Action InitDisplayPanel(Widget panel)
{ {
var ds = Game.Settings.Graphics; var ds = Game.Settings.Graphics;
var gs = Game.Settings.Game; var gs = Game.Settings.Game;
BindCheckboxPref(panel, "HARDWARECURSORS_CHECKBOX", ds, "HardwareCursors"); BindCheckboxPref(panel, "HARDWARECURSORS_CHECKBOX", ds, "HardwareCursors");
BindCheckboxPref(panel, "PIXELDOUBLE_CHECKBOX", ds, "PixelDouble");
BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble"); BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble");
BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate"); BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate");
BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors"); BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
@@ -220,14 +227,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
targetLinesDropDown.GetText = () => gs.TargetLines == TargetLinesType.Automatic ? targetLinesDropDown.GetText = () => gs.TargetLines == TargetLinesType.Automatic ?
"Automatic" : gs.TargetLines == TargetLinesType.Manual ? "Manual" : "Disabled"; "Automatic" : gs.TargetLines == TargetLinesType.Manual ? "Manual" : "Disabled";
// Update zoom immediately var battlefieldCameraDropDown = panel.Get<DropDownButtonWidget>("BATTLEFIELD_CAMERA_DROPDOWN");
var pixelDoubleCheckbox = panel.Get<CheckboxWidget>("PIXELDOUBLE_CHECKBOX"); var battlefieldCameraLabel = new CachedTransform<WorldViewport, string>(vs => ViewportSizeNames[vs]);
var pixelDoubleOnClick = pixelDoubleCheckbox.OnClick; battlefieldCameraDropDown.OnMouseDown = _ => ShowBattlefieldCameraDropdown(battlefieldCameraDropDown, ds);
pixelDoubleCheckbox.OnClick = () => battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(ds.ViewportDistance);
{
pixelDoubleOnClick();
worldRenderer.Viewport.Zoom = ds.PixelDouble ? 2 : 1;
};
panel.Get("WINDOW_RESOLUTION").IsVisible = () => ds.Mode == WindowMode.Windowed; panel.Get("WINDOW_RESOLUTION").IsVisible = () => ds.Mode == WindowMode.Windowed;
var windowWidth = panel.Get<TextFieldWidget>("WINDOW_WIDTH"); var windowWidth = panel.Get<TextFieldWidget>("WINDOW_WIDTH");
@@ -329,10 +332,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
ds.Language = dds.Language; ds.Language = dds.Language;
ds.Mode = dds.Mode; ds.Mode = dds.Mode;
ds.WindowedSize = dds.WindowedSize; ds.WindowedSize = dds.WindowedSize;
ds.PixelDouble = dds.PixelDouble;
ds.CursorDouble = dds.CursorDouble; ds.CursorDouble = dds.CursorDouble;
worldRenderer.Viewport.Zoom = ds.PixelDouble ? 2 : 1; ds.ViewportDistance = dds.ViewportDistance;
ps.Color = dps.Color; ps.Color = dps.Color;
ps.Name = dps.Name; ps.Name = dps.Name;
@@ -417,7 +418,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
BindCheckboxPref(panel, "CLASSICORDERS_CHECKBOX", gs, "UseClassicMouseStyle"); BindCheckboxPref(panel, "CLASSICORDERS_CHECKBOX", gs, "UseClassicMouseStyle");
BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll"); BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll");
BindCheckboxPref(panel, "LOCKMOUSE_CHECKBOX", gs, "LockMouseWindow"); BindCheckboxPref(panel, "LOCKMOUSE_CHECKBOX", gs, "LockMouseWindow");
BindCheckboxPref(panel, "ALLOW_ZOOM_CHECKBOX", gs, "AllowZoom"); BindSliderPref(panel, "ZOOMSPEED_SLIDER", gs, "ZoomSpeed");
BindSliderPref(panel, "SCROLLSPEED_SLIDER", gs, "ViewportEdgeScrollStep"); BindSliderPref(panel, "SCROLLSPEED_SLIDER", gs, "ViewportEdgeScrollStep");
BindSliderPref(panel, "UI_SCROLLSPEED_SLIDER", gs, "UIScrollSpeed"); BindSliderPref(panel, "UI_SCROLLSPEED_SLIDER", gs, "UIScrollSpeed");
@@ -516,8 +517,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
gs.LockMouseWindow = dgs.LockMouseWindow; gs.LockMouseWindow = dgs.LockMouseWindow;
gs.ViewportEdgeScroll = dgs.ViewportEdgeScroll; gs.ViewportEdgeScroll = dgs.ViewportEdgeScroll;
gs.ViewportEdgeScrollStep = dgs.ViewportEdgeScrollStep; gs.ViewportEdgeScrollStep = dgs.ViewportEdgeScrollStep;
gs.ZoomSpeed = dgs.ZoomSpeed;
gs.UIScrollSpeed = dgs.UIScrollSpeed; gs.UIScrollSpeed = dgs.UIScrollSpeed;
gs.AllowZoom = dgs.AllowZoom;
gs.ZoomModifier = dgs.ZoomModifier; gs.ZoomModifier = dgs.ZoomModifier;
panel.Get<SliderWidget>("SCROLLSPEED_SLIDER").Value = gs.ViewportEdgeScrollStep; panel.Get<SliderWidget>("SCROLLSPEED_SLIDER").Value = gs.ViewportEdgeScrollStep;
@@ -738,6 +739,36 @@ namespace OpenRA.Mods.Common.Widgets.Logic
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, setupItem); dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, options.Keys, setupItem);
} }
static void ShowBattlefieldCameraDropdown(DropDownButtonWidget dropdown, GraphicSettings gs)
{
Func<WorldViewport, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) =>
{
var item = ScrollItemWidget.Setup(itemTemplate,
() => gs.ViewportDistance == o,
() => gs.ViewportDistance = o);
var label = ViewportSizeNames[o];
item.Get<LabelWidget>("LABEL").GetText = () => label;
return item;
};
var viewportSizes = Game.ModData.Manifest.Get<WorldViewportSizes>();
var windowHeight = Game.Renderer.Resolution.Height;
var validSizes = new List<WorldViewport>() { WorldViewport.Close };
if (viewportSizes.GetSizeRange(WorldViewport.Medium).X < windowHeight)
validSizes.Add(WorldViewport.Medium);
var farRange = viewportSizes.GetSizeRange(WorldViewport.Far);
if (farRange.X < windowHeight)
validSizes.Add(WorldViewport.Far);
if (farRange.Y < windowHeight)
validSizes.Add(WorldViewport.Native);
dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 500, validSizes, setupItem);
}
void MakeMouseFocusSettingsLive() void MakeMouseFocusSettingsLive()
{ {
var gameSettings = Game.Settings.Game; var gameSettings = Game.Settings.Game;

View File

@@ -306,38 +306,11 @@ namespace OpenRA.Mods.Common.Widgets
} }
} }
bool IsZoomAllowed(float zoom)
{
return world.IsGameOver || zoom >= 1.0f || world.IsReplay || world.LocalPlayer == null || world.LocalPlayer.Spectating;
}
void Zoom(int direction)
{
var zoomSteps = worldRenderer.Viewport.AvailableZoomSteps;
var currentZoom = worldRenderer.Viewport.Zoom;
var nextIndex = zoomSteps.IndexOf(currentZoom);
if (direction < 0)
nextIndex++;
else
nextIndex--;
if (nextIndex < 0 || nextIndex >= zoomSteps.Count())
return;
var zoom = zoomSteps.ElementAt(nextIndex);
if (!IsZoomAllowed(zoom))
return;
worldRenderer.Viewport.Zoom = zoom;
}
public override bool HandleMouseInput(MouseInput mi) public override bool HandleMouseInput(MouseInput mi)
{ {
if (mi.Event == MouseInputEvent.Scroll && if (mi.Event == MouseInputEvent.Scroll && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
Game.Settings.Game.AllowZoom && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
{ {
Zoom(mi.Delta.Y); worldRenderer.Viewport.AdjustZoom(mi.Delta.Y * Game.Settings.Game.ZoomSpeed);
return true; return true;
} }

View File

@@ -202,13 +202,15 @@ Container@EDITOR_ROOT:
NextMusicKey: NextMusic NextMusicKey: NextMusic
TakeScreenshotKey: TakeScreenshot TakeScreenshotKey: TakeScreenshot
MuteAudioKey: ToggleMute MuteAudioKey: ToggleMute
LogicKeyListener@WORLD_KEYHANDLER:
Logic: ResetZoomHotkeyLogic
ResetZoomKey: ResetZoom
Container@WORLD_ROOT: Container@WORLD_ROOT:
Container@MENU_ROOT: Container@MENU_ROOT:
TooltipContainer@TOOLTIP_CONTAINER: TooltipContainer@TOOLTIP_CONTAINER:
Container@EDITOR_WORLD_ROOT: Container@EDITOR_WORLD_ROOT:
Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic
ChangeZoomKey: TogglePixelDouble
EditPanelPadding: 5 EditPanelPadding: 5
Children: Children:
Container@PERF_ROOT: Container@PERF_ROOT:
@@ -578,6 +580,28 @@ Container@EDITOR_WORLD_ROOT:
Height: 25 Height: 25
Text: History Text: History
Font: Bold Font: Bold
Button@UNDO_BUTTON:
X: WINDOW_RIGHT - 910
Y: 5
Height: 25
Width: 100
Text: Undo
Font: Bold
Key: z ctrl
TooltipTemplate: BUTTON_TOOLTIP
TooltipText: Undo last step
TooltipContainer: TOOLTIP_CONTAINER
Button@REDO_BUTTON:
X: WINDOW_RIGHT - 800
Y: 5
Height: 25
Width: 100
Text: Redo
Font: Bold
Key: y ctrl
TooltipTemplate: BUTTON_TOOLTIP
TooltipText: Redo last step
TooltipContainer: TOOLTIP_CONTAINER
Button@GRID_BUTTON: Button@GRID_BUTTON:
X: WINDOW_RIGHT - 690 X: WINDOW_RIGHT - 690
Y: 5 Y: 5
@@ -589,25 +613,6 @@ Container@EDITOR_WORLD_ROOT:
TooltipTemplate: BUTTON_TOOLTIP TooltipTemplate: BUTTON_TOOLTIP
TooltipText: Toggle the terrain grid TooltipText: Toggle the terrain grid
TooltipContainer: TOOLTIP_CONTAINER TooltipContainer: TOOLTIP_CONTAINER
Label@ZOOM_LABEL:
X: WINDOW_RIGHT - 770 - 55
Y: 5
Width: 50
Height: 25
Text: Zoom:
Align: Right
Font: Bold
Contrast: true
DropDownButton@ZOOM_BUTTON:
X: WINDOW_RIGHT - 770
Y: 5
Width: 70
Height: 25
Font: Bold
Key: TogglePixelDouble
TooltipTemplate: BUTTON_TOOLTIP
TooltipText: Zoom
TooltipContainer: TOOLTIP_CONTAINER
Button@COPYPASTE_BUTTON: Button@COPYPASTE_BUTTON:
X: WINDOW_RIGHT - 580 X: WINDOW_RIGHT - 580
Y: 5 Y: 5
@@ -639,26 +644,6 @@ Container@EDITOR_WORLD_ROOT:
Align: Left Align: Left
Font: Bold Font: Bold
Contrast: true Contrast: true
Button@UNDO_BUTTON:
X: 200
Height: 25
Width: 100
Text: Undo
Font: Bold
Key: z ctrl
TooltipTemplate: BUTTON_TOOLTIP
TooltipText: Undo last step
TooltipContainer: TOOLTIP_CONTAINER
Button@REDO_BUTTON:
X: 305
Height: 25
Width: 100
Text: Redo
Font: Bold
Key: y ctrl
TooltipTemplate: BUTTON_TOOLTIP
TooltipText: Redo last step
TooltipContainer: TOOLTIP_CONTAINER
ScrollPanel@CATEGORY_FILTER_PANEL: ScrollPanel@CATEGORY_FILTER_PANEL:
Width: 190 Width: 190

View File

@@ -10,13 +10,13 @@ Container@INGAME_ROOT:
TakeScreenshotKey: TakeScreenshot TakeScreenshotKey: TakeScreenshot
MuteAudioKey: ToggleMute MuteAudioKey: ToggleMute
LogicKeyListener@WORLD_KEYHANDLER: LogicKeyListener@WORLD_KEYHANDLER:
Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, TogglePixelDoubleHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, ResetZoomHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic
RemoveFromControlGroupKey: RemoveFromControlGroup RemoveFromControlGroupKey: RemoveFromControlGroup
CycleBasesKey: CycleBase CycleBasesKey: CycleBase
CycleProductionActorsKey: CycleProductionBuildings CycleProductionActorsKey: CycleProductionBuildings
JumpToLastEventKey: ToLastEvent JumpToLastEventKey: ToLastEvent
JumpToSelectedActorsKey: ToSelection JumpToSelectedActorsKey: ToSelection
TogglePixelDoubleKey: TogglePixelDouble ResetZoomKey: ResetZoom
TogglePlayerStanceColorKey: TogglePlayerStanceColor TogglePlayerStanceColorKey: TogglePlayerStanceColor
CycleStatusBarsKey: CycleStatusBars CycleStatusBarsKey: CycleStatusBars
PauseKey: Pause PauseKey: Pause

View File

@@ -132,7 +132,7 @@ Container@SETTINGS_PANEL:
Font: Regular Font: Regular
Text: Use Hardware Cursors Text: Use Hardware Cursors
Checkbox@CURSORDOUBLE_CHECKBOX: Checkbox@CURSORDOUBLE_CHECKBOX:
X: 300 X: 310
Y: 75 Y: 75
Width: 200 Width: 200
Height: 20 Height: 20
@@ -152,13 +152,6 @@ Container@SETTINGS_PANEL:
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Enable Frame Limiter Text: Enable Frame Limiter
Checkbox@PIXELDOUBLE_CHECKBOX:
X: 310
Y: 125
Width: 200
Height: 20
Font: Regular
Text: Enable Pixel Doubling
Label@FRAME_LIMIT_DESC_A: Label@FRAME_LIMIT_DESC_A:
X: 45 X: 45
Y: 153 Y: 153
@@ -209,6 +202,18 @@ Container@SETTINGS_PANEL:
Y: 6 Y: 6
Width: PARENT_RIGHT - 35 Width: PARENT_RIGHT - 35
Height: PARENT_BOTTOM - 12 Height: PARENT_BOTTOM - 12
Label@BATTLEFIELD_CAMERA:
X: 15
Y: 227
Width: 120
Text: Battlefield Camera:
Align: Right
DropDownButton@BATTLEFIELD_CAMERA_DROPDOWN:
X: 140
Y: 215
Width: 145
Height: 25
Font: Regular
Label@STATUS_BARS: Label@STATUS_BARS:
X: 250 X: 250
Y: 257 Y: 257
@@ -223,7 +228,7 @@ Container@SETTINGS_PANEL:
Font: Regular Font: Regular
Label@TARGET_LINES: Label@TARGET_LINES:
X: 250 X: 250
Y: 228 Y: 227
Width: 145 Width: 145
Text: Target Lines: Text: Target Lines:
Align: Right Align: Right
@@ -404,7 +409,7 @@ Container@SETTINGS_PANEL:
Width: 160 Width: 160
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Scroll-zoom Modifier: Text: Mouse Wheel Zoom Modifier:
Align: Right Align: Right
DropDownButton@ZOOM_MODIFIER: DropDownButton@ZOOM_MODIFIER:
X: PARENT_RIGHT - WIDTH - 15 X: PARENT_RIGHT - WIDTH - 15
@@ -420,29 +425,22 @@ Container@SETTINGS_PANEL:
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Edge Scrolling Text: Edge Scrolling
Checkbox@ALLOW_ZOOM_CHECKBOX: Checkbox@LOCKMOUSE_CHECKBOX:
X: 15 X: 15
Y: 100 Y: 100
Width: 130 Width: 130
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Scroll Zooming
Checkbox@LOCKMOUSE_CHECKBOX:
X: 15
Y: 130
Width: 130
Height: 20
Font: Regular
Text: Lock Mouse to Window Text: Lock Mouse to Window
Label@SCROLL_SPEED_LABEL: Label@SCROLL_SPEED_LABEL:
X: PARENT_RIGHT - WIDTH - 270 X: 15
Y: 128 Y: 128
Width: 95 Width: 85
Height: 25 Height: 25
Text: Scroll Speed: Text: Scroll Speed:
Align: Right Align: Right
Slider@SCROLLSPEED_SLIDER: Slider@SCROLLSPEED_SLIDER:
X: PARENT_RIGHT - WIDTH - 170 X: 95
Y: 133 Y: 133
Width: 100 Width: 100
Height: 20 Height: 20
@@ -450,20 +448,35 @@ Container@SETTINGS_PANEL:
MinimumValue: 10 MinimumValue: 10
MaximumValue: 50 MaximumValue: 50
Label@UI_SCROLL_SPEED_LABEL: Label@UI_SCROLL_SPEED_LABEL:
X: PARENT_RIGHT - WIDTH - 106 X: PARENT_RIGHT - WIDTH - 320
Y: 128 Y: 128
Width: 95 Width: 95
Height: 25 Height: 25
Text: UI Scroll: Text: UI Scroll:
Align: Right Align: Right
Slider@UI_SCROLLSPEED_SLIDER: Slider@UI_SCROLLSPEED_SLIDER:
X: PARENT_RIGHT - WIDTH - 6 X: PARENT_RIGHT - WIDTH - 220
Y: 133 Y: 133
Width: 100 Width: 100
Height: 20 Height: 20
Ticks: 5 Ticks: 5
MinimumValue: 1 MinimumValue: 1
MaximumValue: 100 MaximumValue: 100
Label@ZOOM_SPEED_LABEL:
X: PARENT_RIGHT - WIDTH - 106
Y: 129
Width: 95
Height: 25
Text: Zoom Speed:
Align: Right
ExponentialSlider@ZOOMSPEED_SLIDER:
X: PARENT_RIGHT - WIDTH - 6
Y: 133
Width: 100
Height: 20
Ticks: 5
MinimumValue: 0.01
MaximumValue: 0.4
Container@HOTKEYS_PANEL: Container@HOTKEYS_PANEL:
X: 15 X: 15
Y: 15 Y: 15

View File

@@ -193,13 +193,15 @@ Container@EDITOR_ROOT:
NextMusicKey: NextMusic NextMusicKey: NextMusic
TakeScreenshotKey: TakeScreenshot TakeScreenshotKey: TakeScreenshot
MuteAudioKey: ToggleMute MuteAudioKey: ToggleMute
LogicKeyListener@WORLD_KEYHANDLER:
Logic: ResetZoomHotkeyLogic
ResetZoomKey: ResetZoom
Container@WORLD_ROOT: Container@WORLD_ROOT:
Container@MENU_ROOT: Container@MENU_ROOT:
TooltipContainer@TOOLTIP_CONTAINER: TooltipContainer@TOOLTIP_CONTAINER:
Container@EDITOR_WORLD_ROOT: Container@EDITOR_WORLD_ROOT:
Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic Logic: LoadIngamePerfLogic, MapEditorLogic, ActorEditLogic
ChangeZoomKey: TogglePixelDouble
EditPanelPadding: 14 EditPanelPadding: 14
Children: Children:
Container@PERF_ROOT: Container@PERF_ROOT:
@@ -584,25 +586,8 @@ Container@EDITOR_WORLD_ROOT:
TooltipContainer: TOOLTIP_CONTAINER TooltipContainer: TOOLTIP_CONTAINER
Font: Bold Font: Bold
Key: f1 Key: f1
Label@ZOOM_LABEL:
X: 495
Width: 50
Height: 25
Text: Zoom:
Align: Right
Font: Bold
Contrast: true
DropDownButton@ZOOM_BUTTON:
X: 550
Width: 70
Height: 25
Font: Bold
Key: TogglePixelDouble
TooltipTemplate: BUTTON_TOOLTIP
TooltipText: Zoom
TooltipContainer: TOOLTIP_CONTAINER
Button@UNDO_BUTTON: Button@UNDO_BUTTON:
X: 630 X: 500
Height: 25 Height: 25
Width: 90 Width: 90
Text: Undo Text: Undo
@@ -612,7 +597,7 @@ Container@EDITOR_WORLD_ROOT:
TooltipText: Undo last step TooltipText: Undo last step
TooltipContainer: TOOLTIP_CONTAINER TooltipContainer: TOOLTIP_CONTAINER
Button@REDO_BUTTON: Button@REDO_BUTTON:
X: 730 X: 600
Height: 25 Height: 25
Width: 90 Width: 90
Text: Redo Text: Redo

View File

@@ -10,13 +10,13 @@ Container@INGAME_ROOT:
TakeScreenshotKey: TakeScreenshot TakeScreenshotKey: TakeScreenshot
MuteAudioKey: ToggleMute MuteAudioKey: ToggleMute
LogicKeyListener@WORLD_KEYHANDLER: LogicKeyListener@WORLD_KEYHANDLER:
Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, TogglePixelDoubleHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic Logic: CycleBasesHotkeyLogic, CycleProductionActorsHotkeyLogic, JumpToLastEventHotkeyLogic, JumpToSelectedActorsHotkeyLogic, ResetZoomHotkeyLogic, TogglePlayerStanceColorHotkeyLogic, CycleStatusBarsHotkeyLogic, PauseHotkeyLogic, RemoveFromControlGroupHotkeyLogic
RemoveFromControlGroupKey: RemoveFromControlGroup RemoveFromControlGroupKey: RemoveFromControlGroup
CycleBasesKey: CycleBase CycleBasesKey: CycleBase
CycleProductionActorsKey: CycleProductionBuildings CycleProductionActorsKey: CycleProductionBuildings
JumpToLastEventKey: ToLastEvent JumpToLastEventKey: ToLastEvent
JumpToSelectedActorsKey: ToSelection JumpToSelectedActorsKey: ToSelection
TogglePixelDoubleKey: TogglePixelDouble ResetZoomKey: ResetZoom
TogglePlayerStanceColorKey: TogglePlayerStanceColor TogglePlayerStanceColorKey: TogglePlayerStanceColor
CycleStatusBarsKey: CycleStatusBars CycleStatusBarsKey: CycleStatusBars
PauseKey: Pause PauseKey: Pause

View File

@@ -95,7 +95,7 @@ Background@SETTINGS_PANEL:
Children: Children:
Label@MODE_LABEL: Label@MODE_LABEL:
X: 110 X: 110
Y: 41 Y: 40
Width: 45 Width: 45
Height: 25 Height: 25
Align: Right Align: Right
@@ -146,7 +146,7 @@ Background@SETTINGS_PANEL:
Font: Regular Font: Regular
Text: Use Hardware Cursors Text: Use Hardware Cursors
Checkbox@CURSORDOUBLE_CHECKBOX: Checkbox@CURSORDOUBLE_CHECKBOX:
X: 300 X: 310
Y: 75 Y: 75
Width: 200 Width: 200
Height: 20 Height: 20
@@ -166,13 +166,6 @@ Background@SETTINGS_PANEL:
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Enable Frame Limiter Text: Enable Frame Limiter
Checkbox@PIXELDOUBLE_CHECKBOX:
X: 310
Y: 125
Width: 200
Height: 20
Font: Regular
Text: Enable Pixel Doubling
Label@FRAME_LIMIT_DESC_A: Label@FRAME_LIMIT_DESC_A:
X: 45 X: 45
Y: 159 Y: 159
@@ -223,29 +216,41 @@ Background@SETTINGS_PANEL:
Y: 6 Y: 6
Width: PARENT_RIGHT - 35 Width: PARENT_RIGHT - 35
Height: PARENT_BOTTOM - 12 Height: PARENT_BOTTOM - 12
Label@BATTLEFIELD_CAMERA:
X: 15
Y: 242
Width: 120
Text: Battlefield Camera:
Align: Right
DropDownButton@BATTLEFIELD_CAMERA_DROPDOWN:
X: 140
Y: 230
Width: 145
Height: 25
Font: Regular
Label@STATUS_BARS: Label@STATUS_BARS:
X: 250 X: 250
Y: 278 Y: 277
Width: 145 Width: 145
Text: Status Bars: Text: Status Bars:
Align: Right Align: Right
DropDownButton@STATUS_BAR_DROPDOWN: DropDownButton@STATUS_BAR_DROPDOWN:
X: 400 X: 400
Y: 265 Y: 265
Width: 170 Width: 180
Height: 25 Height: 25
Font: Regular Font: Regular
Text: Standard Text: Standard
Label@TARGET_LINES: Label@TARGET_LINES:
X: 250 X: 250
Y: 243 Y: 242
Width: 145 Width: 145
Text: Target Lines: Text: Target Lines:
Align: Right Align: Right
DropDownButton@TARGET_LINES_DROPDOWN: DropDownButton@TARGET_LINES_DROPDOWN:
X: 400 X: 400
Y: 230 Y: 230
Width: 170 Width: 180
Height: 25 Height: 25
Font: Regular Font: Regular
Label@LOCALIZATION_TITLE: Label@LOCALIZATION_TITLE:
@@ -410,7 +415,7 @@ Background@SETTINGS_PANEL:
Width: 160 Width: 160
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Scroll-zoom Modifier: Text: Mouse Wheel Zoom Modifier:
Align: Right Align: Right
DropDownButton@ZOOM_MODIFIER: DropDownButton@ZOOM_MODIFIER:
X: PARENT_RIGHT - WIDTH - 15 X: PARENT_RIGHT - WIDTH - 15
@@ -426,29 +431,22 @@ Background@SETTINGS_PANEL:
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Edge Scrolling Text: Edge Scrolling
Checkbox@ALLOW_ZOOM_CHECKBOX: Checkbox@LOCKMOUSE_CHECKBOX:
X: 15 X: 15
Y: 100 Y: 100
Width: 130 Width: 130
Height: 20 Height: 20
Font: Regular Font: Regular
Text: Scroll Zooming
Checkbox@LOCKMOUSE_CHECKBOX:
X: 15
Y: 130
Width: 130
Height: 20
Font: Regular
Text: Lock mouse to window Text: Lock mouse to window
Label@SCROLL_SPEED_LABEL: Label@SCROLL_SPEED_LABEL:
X: PARENT_RIGHT - WIDTH - 270 X: 15
Y: 129 Y: 129
Width: 95 Width: 85
Height: 25 Height: 25
Text: Scroll Speed: Text: Scroll Speed:
Align: Right Align: Right
Slider@SCROLLSPEED_SLIDER: Slider@SCROLLSPEED_SLIDER:
X: PARENT_RIGHT - WIDTH - 170 X: 95
Y: 133 Y: 133
Width: 100 Width: 100
Height: 20 Height: 20
@@ -456,20 +454,35 @@ Background@SETTINGS_PANEL:
MinimumValue: 10 MinimumValue: 10
MaximumValue: 50 MaximumValue: 50
Label@UI_SCROLL_SPEED_LABEL: Label@UI_SCROLL_SPEED_LABEL:
X: PARENT_RIGHT - WIDTH - 106 X: PARENT_RIGHT - WIDTH - 320
Y: 129 Y: 129
Width: 95 Width: 95
Height: 25 Height: 25
Text: UI Scroll: Text: UI Scroll:
Align: Right Align: Right
Slider@UI_SCROLLSPEED_SLIDER: Slider@UI_SCROLLSPEED_SLIDER:
X: PARENT_RIGHT - WIDTH - 6 X: PARENT_RIGHT - WIDTH - 220
Y: 133 Y: 133
Width: 100 Width: 100
Height: 20 Height: 20
Ticks: 5 Ticks: 5
MinimumValue: 1 MinimumValue: 1
MaximumValue: 100 MaximumValue: 100
Label@ZOOM_SPEED_LABEL:
X: PARENT_RIGHT - WIDTH - 106
Y: 129
Width: 95
Height: 25
Text: Zoom Speed:
Align: Right
ExponentialSlider@ZOOMSPEED_SLIDER:
X: PARENT_RIGHT - WIDTH - 6
Y: 133
Width: 95
Height: 20
Ticks: 5
MinimumValue: 0.01
MaximumValue: 0.4
Container@HOTKEYS_PANEL: Container@HOTKEYS_PANEL:
X: 5 X: 5
Y: 50 Y: 50

View File

@@ -42,8 +42,8 @@ CycleStatusBars: COMMA
Description: Cycle status bars display Description: Cycle status bars display
Types: World, Player, Spectator Types: World, Player, Spectator
TogglePixelDouble: PERIOD ResetZoom: PERIOD
Description: Toggle pixel doubling Description: Reset zoom
Types: World, Player, Spectator Types: World, Player, Spectator
ToggleMute: M ToggleMute: M