Implement new viewport size/zoom UI.
This commit is contained in:
@@ -39,6 +39,9 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
editorActionManager = world.WorldActor.Trait<EditorActionManager>();
|
||||
|
||||
editorActionManager.OnChange += EditorActionManagerOnChange;
|
||||
|
||||
// Allow zooming out to full map size
|
||||
worldRenderer.Viewport.UnlockMinimumZoom(0.25f);
|
||||
}
|
||||
|
||||
void EditorActionManagerOnChange()
|
||||
@@ -80,26 +83,11 @@ namespace OpenRA.Mods.Common.Widgets
|
||||
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)
|
||||
{
|
||||
if (mi.Event == MouseInputEvent.Scroll &&
|
||||
Game.Settings.Game.AllowZoom && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
|
||||
if (mi.Event == MouseInputEvent.Scroll && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
|
||||
{
|
||||
Zoom(mi.Delta.Y);
|
||||
worldRenderer.Viewport.AdjustZoom(mi.Delta.Y * Game.Settings.Game.ZoomSpeed);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,13 +25,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
MapCopyFilters copyFilters = MapCopyFilters.All;
|
||||
|
||||
[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 gridButton = widget.GetOrNull<ButtonWidget>("GRID_BUTTON");
|
||||
@@ -43,48 +38,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
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");
|
||||
if (copypasteButton != null)
|
||||
{
|
||||
|
||||
@@ -16,31 +16,21 @@ using OpenRA.Widgets;
|
||||
|
||||
namespace OpenRA.Mods.Common.Widgets.Logic.Ingame
|
||||
{
|
||||
[ChromeLogicArgsHotkeys("TogglePixelDoubleKey")]
|
||||
public class TogglePixelDoubleHotkeyLogic : SingleHotkeyBaseLogic
|
||||
[ChromeLogicArgsHotkeys("ResetZoomKey")]
|
||||
public class ResetZoomHotkeyLogic : SingleHotkeyBaseLogic
|
||||
{
|
||||
readonly Viewport viewport;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
public TogglePixelDoubleHotkeyLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
|
||||
: base(widget, modData, "TogglePixelDoubleKey", "WORLD_KEYHANDLER", logicArgs)
|
||||
public ResetZoomHotkeyLogic(Widget widget, ModData modData, WorldRenderer worldRenderer, Dictionary<string, MiniYaml> logicArgs)
|
||||
: base(widget, modData, "ResetZoomKey", "WORLD_KEYHANDLER", logicArgs)
|
||||
{
|
||||
viewport = worldRenderer.Viewport;
|
||||
}
|
||||
|
||||
protected override bool OnHotkeyActivated(KeyInput e)
|
||||
{
|
||||
// Zoom is currently always set directly, so we don't need to worry about floating point imprecision
|
||||
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;
|
||||
viewport.ToggleZoom();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -12,6 +12,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Graphics;
|
||||
using OpenRA.Mods.Common.Lint;
|
||||
using OpenRA.Network;
|
||||
using OpenRA.Primitives;
|
||||
@@ -64,7 +65,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
}
|
||||
|
||||
[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;
|
||||
|
||||
@@ -145,6 +146,9 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
|
||||
selected = limitViews ? groups.First().Value.First() : world.WorldActor.Owner.Shroud.ExploreMapEnabled ? combined : disableShroud;
|
||||
selected.OnClick();
|
||||
|
||||
// Enable zooming out to fractional zoom levels
|
||||
worldRenderer.Viewport.UnlockMinimumZoom(0.5f);
|
||||
}
|
||||
|
||||
public bool HandleKeyPress(KeyInput e)
|
||||
|
||||
@@ -190,13 +190,20 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
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)
|
||||
{
|
||||
var ds = Game.Settings.Graphics;
|
||||
var gs = Game.Settings.Game;
|
||||
|
||||
BindCheckboxPref(panel, "HARDWARECURSORS_CHECKBOX", ds, "HardwareCursors");
|
||||
BindCheckboxPref(panel, "PIXELDOUBLE_CHECKBOX", ds, "PixelDouble");
|
||||
BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble");
|
||||
BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate");
|
||||
BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
|
||||
@@ -220,14 +227,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
targetLinesDropDown.GetText = () => gs.TargetLines == TargetLinesType.Automatic ?
|
||||
"Automatic" : gs.TargetLines == TargetLinesType.Manual ? "Manual" : "Disabled";
|
||||
|
||||
// Update zoom immediately
|
||||
var pixelDoubleCheckbox = panel.Get<CheckboxWidget>("PIXELDOUBLE_CHECKBOX");
|
||||
var pixelDoubleOnClick = pixelDoubleCheckbox.OnClick;
|
||||
pixelDoubleCheckbox.OnClick = () =>
|
||||
{
|
||||
pixelDoubleOnClick();
|
||||
worldRenderer.Viewport.Zoom = ds.PixelDouble ? 2 : 1;
|
||||
};
|
||||
var battlefieldCameraDropDown = panel.Get<DropDownButtonWidget>("BATTLEFIELD_CAMERA_DROPDOWN");
|
||||
var battlefieldCameraLabel = new CachedTransform<WorldViewport, string>(vs => ViewportSizeNames[vs]);
|
||||
battlefieldCameraDropDown.OnMouseDown = _ => ShowBattlefieldCameraDropdown(battlefieldCameraDropDown, ds);
|
||||
battlefieldCameraDropDown.GetText = () => battlefieldCameraLabel.Update(ds.ViewportDistance);
|
||||
|
||||
panel.Get("WINDOW_RESOLUTION").IsVisible = () => ds.Mode == WindowMode.Windowed;
|
||||
var windowWidth = panel.Get<TextFieldWidget>("WINDOW_WIDTH");
|
||||
@@ -329,10 +332,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
ds.Language = dds.Language;
|
||||
ds.Mode = dds.Mode;
|
||||
ds.WindowedSize = dds.WindowedSize;
|
||||
|
||||
ds.PixelDouble = dds.PixelDouble;
|
||||
ds.CursorDouble = dds.CursorDouble;
|
||||
worldRenderer.Viewport.Zoom = ds.PixelDouble ? 2 : 1;
|
||||
ds.ViewportDistance = dds.ViewportDistance;
|
||||
|
||||
ps.Color = dps.Color;
|
||||
ps.Name = dps.Name;
|
||||
@@ -417,7 +418,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
BindCheckboxPref(panel, "CLASSICORDERS_CHECKBOX", gs, "UseClassicMouseStyle");
|
||||
BindCheckboxPref(panel, "EDGESCROLL_CHECKBOX", gs, "ViewportEdgeScroll");
|
||||
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, "UI_SCROLLSPEED_SLIDER", gs, "UIScrollSpeed");
|
||||
|
||||
@@ -516,8 +517,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
||||
gs.LockMouseWindow = dgs.LockMouseWindow;
|
||||
gs.ViewportEdgeScroll = dgs.ViewportEdgeScroll;
|
||||
gs.ViewportEdgeScrollStep = dgs.ViewportEdgeScrollStep;
|
||||
gs.ZoomSpeed = dgs.ZoomSpeed;
|
||||
gs.UIScrollSpeed = dgs.UIScrollSpeed;
|
||||
gs.AllowZoom = dgs.AllowZoom;
|
||||
gs.ZoomModifier = dgs.ZoomModifier;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
var gameSettings = Game.Settings.Game;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
if (mi.Event == MouseInputEvent.Scroll &&
|
||||
Game.Settings.Game.AllowZoom && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
|
||||
if (mi.Event == MouseInputEvent.Scroll && mi.Modifiers.HasModifier(Game.Settings.Game.ZoomModifier))
|
||||
{
|
||||
Zoom(mi.Delta.Y);
|
||||
worldRenderer.Viewport.AdjustZoom(mi.Delta.Y * Game.Settings.Game.ZoomSpeed);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user