Refactor scrollpanel items into their own widget
This commit is contained in:
@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
{
|
||||
Map map;
|
||||
Widget scrollpanel;
|
||||
Widget itemTemplate;
|
||||
ScrollItemWidget itemTemplate;
|
||||
|
||||
[ObjectCreator.UseCtor]
|
||||
internal CncMapChooserLogic([ObjectCreator.Param] Widget widget,
|
||||
@@ -52,7 +52,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
panel.GetWidget<CncMenuButtonWidget>("BUTTON_INSTALL").OnClick = () => InstallMap();
|
||||
|
||||
scrollpanel = panel.GetWidget<ScrollPanelWidget>("MAP_LIST");
|
||||
itemTemplate = scrollpanel.GetWidget<ContainerWidget>("MAP_TEMPLATE");
|
||||
itemTemplate = scrollpanel.GetWidget<ScrollItemWidget>("MAP_TEMPLATE");
|
||||
EnumerateMaps();
|
||||
}
|
||||
|
||||
@@ -65,14 +65,11 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
if (!m.Selectable)
|
||||
continue;
|
||||
|
||||
var template = itemTemplate.Clone() as ContainerWidget;
|
||||
template.GetBackground = () => (template.RenderBounds.Contains(Viewport.LastMousePos) ? "button-hover" : (m == map) ? "button-pressed" : null);
|
||||
template.OnMouseDown = mi => { if (mi.Button != MouseButton.Left) return false; map = m; return true; };
|
||||
template.IsVisible = () => true;
|
||||
template.GetWidget<LabelWidget>("TITLE").GetText = () => m.Title;
|
||||
template.GetWidget<LabelWidget>("PLAYERS").GetText = () => "{0}".F(m.PlayerCount);
|
||||
template.GetWidget<LabelWidget>("TYPE").GetText = () => m.Type;
|
||||
scrollpanel.AddChild(template);
|
||||
var item = ScrollItemWidget.Setup(itemTemplate, () => m == map, () => map = m);
|
||||
item.GetWidget<LabelWidget>("TITLE").GetText = () => m.Title;
|
||||
item.GetWidget<LabelWidget>("PLAYERS").GetText = () => "{0}".F(m.PlayerCount);
|
||||
item.GetWidget<LabelWidget>("TYPE").GetText = () => m.Type;
|
||||
scrollpanel.AddChild(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -337,5 +337,43 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
ShowDropPanel(w, dropDown, dismissAfter, () => true);
|
||||
}
|
||||
}
|
||||
|
||||
public class ScrollItemWidget : CncMenuButtonWidget
|
||||
{
|
||||
public ScrollItemWidget()
|
||||
: base()
|
||||
{
|
||||
IsVisible = () => false;
|
||||
}
|
||||
|
||||
protected ScrollItemWidget(ScrollItemWidget other)
|
||||
: base(other)
|
||||
{
|
||||
IsVisible = () => false;
|
||||
}
|
||||
|
||||
public Func<bool> IsSelected = () => false;
|
||||
|
||||
public override void DrawInner()
|
||||
{
|
||||
var state = IsSelected() ? "button-pressed" :
|
||||
RenderBounds.Contains(Viewport.LastMousePos) ? "button-hover" :
|
||||
null;
|
||||
|
||||
if (state != null)
|
||||
WidgetUtils.DrawPanel(state, RenderBounds);
|
||||
}
|
||||
|
||||
public override Widget Clone() { return new ScrollItemWidget(this); }
|
||||
|
||||
public static ScrollItemWidget Setup(ScrollItemWidget template, Func<bool> isSelected, Action onClick)
|
||||
{
|
||||
var w = template.Clone() as ScrollItemWidget;
|
||||
w.IsVisible = () => true;
|
||||
w.IsSelected = isSelected;
|
||||
w.OnClick = onClick;
|
||||
return w;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -58,19 +58,16 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
currentMod = Mod.AllMods[Game.modData.Manifest.Mods[0]];
|
||||
|
||||
// Mod list
|
||||
var modTemplate = modList.GetWidget("MOD_TEMPLATE");
|
||||
var modTemplate = modList.GetWidget<ScrollItemWidget>("MOD_TEMPLATE");
|
||||
|
||||
foreach (var m in Mod.AllMods)
|
||||
{
|
||||
var mod = m.Value;
|
||||
var template = modTemplate.Clone() as ContainerWidget;
|
||||
template.GetBackground = () => (template.RenderBounds.Contains(Viewport.LastMousePos) ? "button-hover" : (currentMod == mod) ? "button-pressed" : null);
|
||||
template.OnMouseDown = mi => { if (mi.Button != MouseButton.Left) return false; currentMod = mod; return true; };
|
||||
template.IsVisible = () => true;
|
||||
template.GetWidget<LabelWidget>("TITLE").GetText = () => mod.Title;
|
||||
template.GetWidget<LabelWidget>("VERSION").GetText = () => mod.Version;
|
||||
template.GetWidget<LabelWidget>("AUTHOR").GetText = () => mod.Author;
|
||||
modList.AddChild(template);
|
||||
var item = ScrollItemWidget.Setup(modTemplate, () => currentMod == mod, () => currentMod = mod);
|
||||
item.GetWidget<LabelWidget>("TITLE").GetText = () => mod.Title;
|
||||
item.GetWidget<LabelWidget>("VERSION").GetText = () => mod.Version;
|
||||
item.GetWidget<LabelWidget>("AUTHOR").GetText = () => mod.Author;
|
||||
modList.AddChild(item);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -104,7 +104,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
random = music.Shuffle(Game.CosmeticRandom).ToArray();
|
||||
|
||||
var ml = panel.GetWidget<ScrollPanelWidget>("MUSIC_LIST");
|
||||
var itemTemplate = ml.GetWidget<ContainerWidget>("MUSIC_TEMPLATE");
|
||||
var itemTemplate = ml.GetWidget<ScrollItemWidget>("MUSIC_TEMPLATE");
|
||||
|
||||
foreach (var s in music)
|
||||
{
|
||||
@@ -112,20 +112,10 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
if (currentSong == null)
|
||||
currentSong = song;
|
||||
|
||||
var template = itemTemplate.Clone() as ContainerWidget;
|
||||
template.GetBackground = () => (template.RenderBounds.Contains(Viewport.LastMousePos) ? "button-hover" : (song == currentSong) ? "button-pressed" : null);
|
||||
template.OnMouseDown = mi =>
|
||||
{
|
||||
if (mi.Button != MouseButton.Left) return false;
|
||||
currentSong = song;
|
||||
Play();
|
||||
return true;
|
||||
};
|
||||
|
||||
template.IsVisible = () => true;
|
||||
template.GetWidget<LabelWidget>("TITLE").GetText = () => Rules.Music[song].Title;
|
||||
template.GetWidget<LabelWidget>("LENGTH").GetText = () => SongLengthLabel(song);
|
||||
ml.AddChild(template);
|
||||
var item = ScrollItemWidget.Setup(itemTemplate, () => currentSong == song, () => { currentSong = song; Play(); });
|
||||
item.GetWidget<LabelWidget>("TITLE").GetText = () => Rules.Music[song].Title;
|
||||
item.GetWidget<LabelWidget>("LENGTH").GetText = () => SongLengthLabel(song);
|
||||
ml.AddChild(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
var rl = panel.GetWidget<ScrollPanelWidget>("REPLAY_LIST");
|
||||
var replayDir = Path.Combine(Platform.SupportDir, "Replays");
|
||||
|
||||
var template = panel.GetWidget("REPLAY_TEMPLATE");
|
||||
var template = panel.GetWidget<ScrollItemWidget>("REPLAY_TEMPLATE");
|
||||
|
||||
rl.RemoveChildren();
|
||||
if (Directory.Exists(replayDir))
|
||||
@@ -92,15 +92,14 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
}
|
||||
}
|
||||
|
||||
void AddReplay(ScrollPanelWidget list, string filename, Widget template)
|
||||
void AddReplay(ScrollPanelWidget list, string filename, ScrollItemWidget template)
|
||||
{
|
||||
var entry = template.Clone() as ContainerWidget;
|
||||
var item = ScrollItemWidget.Setup(template,
|
||||
() => currentSummary != null && currentSummary.Filename == filename,
|
||||
() => SelectReplay(filename));
|
||||
var f = Path.GetFileName(filename);
|
||||
entry.GetWidget<LabelWidget>("TITLE").GetText = () => f;
|
||||
entry.GetBackground = () => (entry.RenderBounds.Contains(Viewport.LastMousePos) ? "button-hover" : (currentSummary != null && currentSummary.Filename == filename) ? "button-pressed" : null);
|
||||
entry.OnMouseDown = mi => { if (mi.Button != MouseButton.Left) return false; SelectReplay(filename); return true; };
|
||||
entry.IsVisible = () => true;
|
||||
list.AddChild(entry);
|
||||
item.GetWidget<LabelWidget>("TITLE").GetText = () => f;
|
||||
list.AddChild(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
public class CncServerBrowserLogic : IWidgetDelegate
|
||||
{
|
||||
GameServer currentServer;
|
||||
Widget serverTemplate;
|
||||
ScrollItemWidget serverTemplate;
|
||||
bool refreshing;
|
||||
enum SearchStatus
|
||||
{
|
||||
@@ -120,7 +120,7 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
panel.GetWidget<CncMenuButtonWidget>("BACK_BUTTON").OnClick = () => { Widget.CloseWindow(); onExit(); };
|
||||
|
||||
// Server list
|
||||
serverTemplate = sl.GetWidget("SERVER_TEMPLATE");
|
||||
serverTemplate = sl.GetWidget<ScrollItemWidget>("SERVER_TEMPLATE");
|
||||
|
||||
// Display the progress label over the server list
|
||||
// The text is only visible when the list is empty
|
||||
@@ -194,17 +194,14 @@ namespace OpenRA.Mods.Cnc.Widgets
|
||||
{
|
||||
var game = loop;
|
||||
|
||||
var template = serverTemplate.Clone() as ContainerWidget;
|
||||
template.GetBackground = () => (template.RenderBounds.Contains(Viewport.LastMousePos) ? "button-hover" : (currentServer == game) ? "button-pressed" : null);
|
||||
template.OnMouseDown = mi => { if (mi.Button != MouseButton.Left) return false; currentServer = game; return true; };
|
||||
template.IsVisible = () => true;
|
||||
template.GetWidget<LabelWidget>("TITLE").GetText = () => game.Name;
|
||||
var item = ScrollItemWidget.Setup(serverTemplate, () => currentServer == game, () => currentServer = game);
|
||||
item.GetWidget<LabelWidget>("TITLE").GetText = () => game.Name;
|
||||
// TODO: Use game.MapTitle once the server supports it
|
||||
template.GetWidget<LabelWidget>("MAP").GetText = () => {var map = GetMap(game.Map); return map == null ? "Unknown" : map.Title;};
|
||||
item.GetWidget<LabelWidget>("MAP").GetText = () => {var map = GetMap(game.Map); return map == null ? "Unknown" : map.Title;};
|
||||
// TODO: Use game.MaxPlayers once the server supports it
|
||||
template.GetWidget<LabelWidget>("PLAYERS").GetText = () => GetPlayersLabel(game);
|
||||
template.GetWidget<LabelWidget>("IP").GetText = () => game.Address;
|
||||
sl.AddChild(template);
|
||||
item.GetWidget<LabelWidget>("PLAYERS").GetText = () => GetPlayersLabel(game);
|
||||
item.GetWidget<LabelWidget>("IP").GetText = () => game.Address;
|
||||
sl.AddChild(item);
|
||||
|
||||
if (i == 0) currentServer = game;
|
||||
i++;
|
||||
|
||||
@@ -38,13 +38,12 @@ Container@MAPCHOOSER_PANEL:
|
||||
Width:504
|
||||
Height:455
|
||||
Children:
|
||||
Container@MAP_TEMPLATE:
|
||||
ScrollItem@MAP_TEMPLATE:
|
||||
Id:MAP_TEMPLATE
|
||||
Width:PARENT_RIGHT-27
|
||||
Height:25
|
||||
X:2
|
||||
Y:0
|
||||
Visible:false
|
||||
Children:
|
||||
Label@TITLE:
|
||||
X:10
|
||||
|
||||
@@ -25,7 +25,7 @@ Container@MODS_PANEL:
|
||||
Width:710
|
||||
Height:455
|
||||
Children:
|
||||
Container@MOD_TEMPLATE:
|
||||
ScrollItem@MOD_TEMPLATE:
|
||||
Id:MOD_TEMPLATE
|
||||
Width:PARENT_RIGHT-27
|
||||
Height:25
|
||||
|
||||
@@ -25,7 +25,7 @@ Container@MUSIC_PANEL:
|
||||
Width:330
|
||||
Height:275
|
||||
Children:
|
||||
Container@MUSIC_TEMPLATE:
|
||||
ScrollItem@MUSIC_TEMPLATE:
|
||||
Id:MUSIC_TEMPLATE
|
||||
Width:PARENT_RIGHT-27
|
||||
Height:25
|
||||
|
||||
@@ -25,7 +25,7 @@ Container@REPLAYBROWSER_PANEL:
|
||||
Width:286
|
||||
Height:270
|
||||
Children:
|
||||
Container@REPLAY_TEMPLATE:
|
||||
ScrollItem@REPLAY_TEMPLATE:
|
||||
Id:REPLAY_TEMPLATE
|
||||
Width:PARENT_RIGHT-27
|
||||
Height:25
|
||||
|
||||
@@ -25,13 +25,12 @@ Container@SERVERBROWSER_PANEL:
|
||||
Width:710
|
||||
Height:315
|
||||
Children:
|
||||
Container@SERVER_TEMPLATE:
|
||||
ScrollItem@SERVER_TEMPLATE:
|
||||
Id:SERVER_TEMPLATE
|
||||
Width:PARENT_RIGHT-27
|
||||
Height:25
|
||||
X:2
|
||||
Y:0
|
||||
Visible:false
|
||||
Children:
|
||||
Label@TITLE:
|
||||
X:10
|
||||
|
||||
Reference in New Issue
Block a user