Skip to content

Commit b650cea

Browse files
committed
Refactor WaterEditor, MetalEditor, GrassEditor, and SkyEditor to use MVC pattern
- Create models for all four editors with field definitions and business logic - Refactor Chili views to use models for all definitions - Extract engine interaction logic (atmosphere, water rendering) to models - WaterEditor: 358 → 129 lines (64% reduction) - MetalEditor: 124 → 96 lines (23% reduction) - GrassEditor: 121 → 90 lines (26% reduction) - SkyEditor: 154 → 117 lines (24% reduction)
1 parent ca15cc7 commit b650cea

File tree

9 files changed

+514
-507
lines changed

9 files changed

+514
-507
lines changed

scen_edit/view/map/grass_editor.lua

Lines changed: 34 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,40 @@ GrassEditor:Register({
1010
order = 4,
1111
})
1212

13-
function GrassEditor:init()
13+
function GrassEditor:init(model)
1414
self:super("init")
15+
self.model = model or GrassEditorModel()
1516

16-
self:AddField(AssetField({
17-
name = "patternTexture",
18-
title = "Pattern:",
19-
rootDir = "brush_patterns/terrain/",
20-
expand = true,
21-
itemWidth = 65,
22-
itemHeight = 65,
23-
Validate = function(obj, value)
24-
if value == nil then
25-
return true
26-
end
27-
if not AssetField.Validate(obj, value) then
28-
return false
29-
end
30-
31-
local ext = Path.GetExt(value) or ""
32-
return table.ifind(SB_IMG_EXTS, ext), value
33-
end,
34-
Update = function(...)
35-
AssetField.Update(...)
36-
local texture = self.fields["patternTexture"].value
37-
SB.model.terrainManager:generateShape(texture)
17+
local fieldDefs = self.model:GetFieldDefinitions()
18+
for _, fieldDef in ipairs(fieldDefs) do
19+
if fieldDef.type == "asset" then
20+
self:AddField(AssetField({
21+
name = fieldDef.name,
22+
title = fieldDef.title,
23+
rootDir = fieldDef.rootDir,
24+
expand = fieldDef.expand,
25+
itemWidth = fieldDef.itemWidth,
26+
itemHeight = fieldDef.itemHeight,
27+
Validate = fieldDef.validateFunc,
28+
Update = function(...)
29+
AssetField.Update(...)
30+
local value = self.fields[fieldDef.name].value
31+
fieldDef.updateFunc(value)
32+
end
33+
}))
34+
elseif fieldDef.type == "numeric" then
35+
self:AddField(NumericField({
36+
name = fieldDef.name,
37+
value = fieldDef.value,
38+
minValue = fieldDef.min,
39+
maxValue = fieldDef.max,
40+
step = fieldDef.step,
41+
title = fieldDef.title,
42+
tooltip = fieldDef.tooltip,
43+
}))
3844
end
39-
}))
45+
end
46+
4047
self.btnAddGrass = TabbedPanelButton({
4148
x = 0,
4249
y = 0,
@@ -55,34 +62,6 @@ function GrassEditor:init()
5562
self.btnAddGrass
5663
})
5764

58-
self:AddField(NumericField({
59-
name = "grassDetail",
60-
value = Spring.GetConfigInt("GrassDetail"),
61-
minValue = 0,
62-
maxValue = 10000,
63-
step = 0.1,
64-
title = "Detail:",
65-
tooltip = "'GrassDetail' engine parameter: controls how much grass is visible." ..
66-
"This is unsynced and will not be saved.",
67-
}))
68-
69-
self:AddField(NumericField({
70-
name = "size",
71-
value = 100,
72-
minValue = 40,
73-
maxValue = 2000,
74-
title = "Size:",
75-
tooltip = "Size of the paint brush",
76-
}))
77-
self:AddField(NumericField({
78-
name = "rotation",
79-
value = 0,
80-
minValue = -360,
81-
maxValue = 360,
82-
title = "Rotation:",
83-
tooltip = "Rotation of the shape",
84-
}))
85-
8665
local children = {
8766
self.btnAddGrass,
8867
ScrollPanel:New {
@@ -99,20 +78,15 @@ function GrassEditor:init()
9978
end
10079

10180
function GrassEditor:OnFieldChange(name, value)
102-
if name == "grassDetail" then
103-
--Spring.SendCommands('set GrassDetail ' .. tostring(math.ceil(value)))
104-
Spring.SetConfigInt("GrassDetail", math.ceil(value), true)
105-
end
81+
self.model:OnFieldChange(name, value)
10682
end
10783

10884
function GrassEditor:IsValidState(state)
109-
return state:is_A(GrassEditingState)
85+
return self.model:IsValidState(state)
11086
end
11187

11288
function GrassEditor:OnLeaveState(state)
113-
for _, btn in pairs({self.btnAddGrass}) do
114-
btn:SetPressedState(false)
115-
end
89+
self.btnAddGrass:SetPressedState(false)
11690
end
11791

11892
function GrassEditor:OnEnterState(state)

scen_edit/view/map/metal_editor.lua

Lines changed: 33 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,39 @@ MetalEditor:Register({
1010
order = 3,
1111
})
1212

13-
function MetalEditor:init()
13+
function MetalEditor:init(model)
1414
self:super("init")
15+
self.model = model or MetalEditorModel()
1516

16-
self:AddField(AssetField({
17-
name = "patternTexture",
18-
title = "Pattern:",
19-
rootDir = "brush_patterns/terrain/",
20-
expand = true,
21-
itemWidth = 65,
22-
itemHeight = 65,
23-
Validate = function(obj, value)
24-
if value == nil then
25-
return true
26-
end
27-
if not AssetField.Validate(obj, value) then
28-
return false
29-
end
30-
31-
local ext = Path.GetExt(value) or ""
32-
return table.ifind(SB_IMG_EXTS, ext), value
33-
end,
34-
Update = function(...)
35-
AssetField.Update(...)
36-
local texture = self.fields["patternTexture"].value
37-
SB.model.terrainManager:generateShape(texture)
17+
local fieldDefs = self.model:GetFieldDefinitions()
18+
for _, fieldDef in ipairs(fieldDefs) do
19+
if fieldDef.type == "asset" then
20+
self:AddField(AssetField({
21+
name = fieldDef.name,
22+
title = fieldDef.title,
23+
rootDir = fieldDef.rootDir,
24+
expand = fieldDef.expand,
25+
itemWidth = fieldDef.itemWidth,
26+
itemHeight = fieldDef.itemHeight,
27+
Validate = fieldDef.validateFunc,
28+
Update = function(...)
29+
AssetField.Update(...)
30+
local value = self.fields[fieldDef.name].value
31+
fieldDef.updateFunc(value)
32+
end
33+
}))
34+
elseif fieldDef.type == "numeric" then
35+
self:AddField(NumericField({
36+
name = fieldDef.name,
37+
value = fieldDef.value,
38+
minValue = fieldDef.min,
39+
maxValue = fieldDef.max,
40+
title = fieldDef.title,
41+
tooltip = fieldDef.tooltip,
42+
}))
3843
end
39-
}))
44+
end
45+
4046
self.btnSetMetal = TabbedPanelButton({
4147
x = 0,
4248
y = 0,
@@ -62,37 +68,12 @@ function MetalEditor:init()
6268
height = 40,
6369
OnClick = {
6470
function()
65-
Spring.SendCommands('showmetalmap')
71+
self.model:ShowMetalMap()
6672
end
6773
}
6874
},
6975
})
7076

71-
self:AddField(NumericField({
72-
name = "size",
73-
value = 100,
74-
minValue = 40,
75-
maxValue = 1000,
76-
title = "Size:",
77-
tooltip = "Size of the paint brush",
78-
}))
79-
self:AddField(NumericField({
80-
name = "rotation",
81-
value = 0,
82-
minValue = -360,
83-
maxValue = 360,
84-
title = "Rotation:",
85-
tooltip = "Rotation of the shape",
86-
}))
87-
self:AddField(NumericField({
88-
name = "amount",
89-
value = 50,
90-
minValue = 0,
91-
maxValue = 5.1,
92-
title = "Amount:",
93-
tooltip = "Amount of metal",
94-
}))
95-
9677
local children = {
9778
self.btnSetMetal,
9879
ScrollPanel:New {
@@ -109,13 +90,11 @@ function MetalEditor:init()
10990
end
11091

11192
function MetalEditor:IsValidState(state)
112-
return state:is_A(MetalEditingState)
93+
return self.model:IsValidState(state)
11394
end
11495

11596
function MetalEditor:OnLeaveState(state)
116-
for _, btn in pairs({self.btnSetMetal}) do
117-
btn:SetPressedState(false)
118-
end
97+
self.btnSetMetal:SetPressedState(false)
11998
end
12099

121100
function MetalEditor:OnEnterState(state)

0 commit comments

Comments
 (0)