/* Copyright (C) 2021 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 0 A.D. is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with 0 A.D. If not, see . */ #include "precompiled.h" #include "ActorEditorListCtrl.h" #include "AnimListEditor.h" #include "TexListEditor.h" #include "PropListEditor.h" #include "AtlasObject/AtlasObject.h" #include "EditableListCtrl/FieldEditCtrl.h" ActorEditorListCtrl::ActorEditorListCtrl(wxWindow* parent) : DraggableListCtrl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_SINGLE_SEL) { // Set colors for row backgrounds (which vary depending on what columns // have some data) #define COLOR(name, c0, c1) \ m_ListItemAttr_##name[0].SetBackgroundColour(wxColor c0); \ m_ListItemAttr_##name[1].SetBackgroundColour(wxColor c1) const int f=0xFF, e=0xEE, c=0xCC; COLOR(Model, (f,f,e), (f,f,c)); COLOR(Texture, (f,e,e), (f,c,c)); COLOR(Anim, (e,f,e), (c,f,c)); COLOR(Prop, (e,e,f), (c,c,f)); COLOR(Color, (f,e,f), (f,c,f)); COLOR(None, (f,f,f), (f,f,f)); #undef COLOR AddColumnType(_("Group"), 50, "@group", new FieldEditCtrl_Boolean()); AddColumnType(_("Variant"), 90, "@name", new FieldEditCtrl_Text()); AddColumnType(_("Base File"), 90, "@file", new FieldEditCtrl_File(_T("art/variants/"), _("Variants (*.xml)|*.xml|All files (*.*)|*.*"))); AddColumnType(_("Ratio"), 50, "@frequency", new FieldEditCtrl_Text()); AddColumnType(_("Min Quality"),50, "@minquality",new FieldEditCtrl_Text()); AddColumnType(_("Max Quality"),50, "@maxquality",new FieldEditCtrl_Text()); AddColumnType(_("Model"), 140, "mesh", new FieldEditCtrl_File(_T("art/meshes/"), _("Mesh files (*.pmd, *.dae)|*.pmd;*.dae|All files (*.*)|*.*"))); AddColumnType(_("Particles"), 90, "particles", new FieldEditCtrl_File(_T("art/particles/"), _("Particle file (*.xml)|*.xml|All files (*.*)|*.*"))); AddColumnType(_("Textures"), 250, "textures", new FieldEditCtrl_Dialog(&TexListEditor::Create)); AddColumnType(_("Animations"), 250, "animations", new FieldEditCtrl_Dialog(&AnimListEditor::Create)); AddColumnType(_("Props"), 220, "props", new FieldEditCtrl_Dialog(&PropListEditor::Create)); AddColumnType(_("Color"), 80, "color", new FieldEditCtrl_Color()); } void ActorEditorListCtrl::DoImport(AtObj& in) { DeleteData(); for (AtIter group = in["group"]; group.defined(); ++group) { for (AtIter variant = group["variant"]; variant.defined(); ++variant) AddRow(variant); AtObj gr = *group; gr.add("@group", "true"); AddRow(gr); } UpdateDisplay(); } AtObj ActorEditorListCtrl::DoExport() { AtObj out; AtObj group; for (size_t i = 0; i < m_ListData.size(); ++i) { if (std::string(m_ListData[i]["@group"]) == "true") { if (group.defined()) { group.unset("@group"); if (m_ListData[i]["@minquality"].hasContent()) group.set("@minquality", m_ListData[i]["@minquality"]); if (m_ListData[i]["@maxquality"].hasContent()) group.set("@maxquality", m_ListData[i]["@maxquality"]); out.add("group", group); } group = AtObj(); } else { AtObj variant = AtlasObject::TrimEmptyChildren(m_ListData[i]); group.add("variant", variant); } } if (group.defined()) out.add("group", group); return out; } wxListItemAttr* ActorEditorListCtrl::OnGetItemAttr(long item) const { if (item >= 0 && item < (int)m_ListData.size()) { AtObj row (m_ListData[item]); // Color-code the row, depending on the first non-empty column, // and also alternate between light/dark. if (row["mesh"].hasContent()) return const_cast(&m_ListItemAttr_Model[item%2]); else if (row["textures"].hasContent()) return const_cast(&m_ListItemAttr_Texture[item%2]); else if (row["animations"].hasContent()) return const_cast(&m_ListItemAttr_Anim[item%2]); else if (row["props"].hasContent()) return const_cast(&m_ListItemAttr_Prop[item%2]); else if (row["color"].hasContent()) return const_cast(&m_ListItemAttr_Color[item%2]); } return const_cast(&m_ListItemAttr_None[item%2]); }