Add a list of selected entities, grouped by template.

Patch by trompetin17, fixes #1392

This was SVN commit r16255.
This commit is contained in:
Nicolas Auvray 2015-02-01 21:23:06 +00:00
parent 3225e564fe
commit d71161fe4c
3 changed files with 85 additions and 2 deletions

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2014 Wildfire Games.
/* Copyright (C) 2015 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -71,6 +71,7 @@ public:
void OnFirstDisplay();
void ShowActorViewer(bool show);
void OnSelectedObjectsChange(const std::vector<AtlasMessage::ObjectID>& selectedObjects);
private:
void OnViewerSetting(wxCommandEvent& evt);
@ -88,9 +89,9 @@ private:
int m_ViewerPropPointsMode; // 0 disabled, 1 for point markers, 2 for point markers + axes
wxPanel* m_ViewerPanel;
wxScrolledWindow* m_TemplateNames;
ObjectSidebarImpl* p;
DECLARE_EVENT_TABLE();
};
@ -462,10 +463,68 @@ ObjectBottomBar::ObjectBottomBar(
mainSizer->Add(playerVariationSizer, wxSizerFlags().Expand());
// ----------------------------------------------------------------------------------
// --- display template name
wxSizer* displaySizer = new wxStaticBoxSizer(wxVERTICAL, this, _("Selected entities"));
m_TemplateNames = new wxScrolledWindow(this);
m_TemplateNames->SetMinSize(wxSize(250, -1));
m_TemplateNames->SetScrollRate(0, 5);
wxSizer* scrollwindowSizer = new wxBoxSizer(wxVERTICAL);
m_TemplateNames->SetSizer(scrollwindowSizer);
displaySizer->Add(m_TemplateNames, wxSizerFlags().Proportion(1).Expand());
m_TemplateNames->Layout();
mainSizer->AddSpacer(3);
mainSizer->Add(displaySizer, wxSizerFlags().Proportion(1).Expand());
g_SelectedObjects.RegisterObserver(0, &ObjectBottomBar::OnSelectedObjectsChange, this);
SetSizer(mainSizer);
}
static wxControl* CreateTemplateNameObject(wxWindow* parent, const std::string templateName, int counterTemplate)
{
wxString idTemplate(templateName.c_str());
if (counterTemplate > 1)
idTemplate.Append(wxString::Format(wxT(" (%i)"), counterTemplate));
wxStaticText* templateNameObject = new wxStaticText(parent, wxID_ANY, idTemplate);
return templateNameObject;
}
void ObjectBottomBar::OnSelectedObjectsChange(const std::vector<AtlasMessage::ObjectID>& selectedObjects)
{
Freeze();
wxSizer* sizer = m_TemplateNames->GetSizer();
sizer->Clear(true);
AtlasMessage::qGetSelectedObjectsTemplateNames objectTemplatesName(selectedObjects);
objectTemplatesName.Post();
std::vector<std::string> names = *objectTemplatesName.names;
int counterTemplate = 0;
std::string lastTemplateName = "";
for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); ++it)
{
if (lastTemplateName == "")
lastTemplateName = (*it);
if (lastTemplateName == (*it))
{
++counterTemplate;
continue;
}
sizer->Add(CreateTemplateNameObject(m_TemplateNames, lastTemplateName, counterTemplate), wxSizerFlags().Align(wxALIGN_LEFT));
lastTemplateName = (*it);
counterTemplate = 1;
}
// Add the remaining template
sizer->Add(CreateTemplateNameObject(m_TemplateNames, lastTemplateName, counterTemplate), wxSizerFlags().Align(wxALIGN_LEFT));
Thaw();
sizer->FitInside(m_TemplateNames);
}
void ObjectBottomBar::OnFirstDisplay()
{
// We use messages here because the simulation is not init'd otherwise (causing a crash)

View File

@ -975,4 +975,22 @@ MESSAGEHANDLER(SetBandbox)
AtlasView::GetView_Game()->SetBandbox(msg->show, (float)msg->sx0, (float)msg->sy0, (float)msg->sx1, (float)msg->sy1);
}
QUERYHANDLER(GetSelectedObjectsTemplateNames)
{
std::vector<entity_id_t> ids = *msg->ids;
std::vector<std::string> names;
CmpPtr<ICmpTemplateManager> cmpTemplateManager(*g_Game->GetSimulation2(), SYSTEM_ENTITY);
ENSURE(cmpTemplateManager);
for (size_t i = 0; i < ids.size(); ++i)
{
entity_id_t id = (entity_id_t)ids[i];
std::string templateName = cmpTemplateManager->GetCurrentTemplateName(id);
names.push_back(templateName);
}
std::sort(names.begin(), names.end());
msg->names = names;
}
}

View File

@ -693,6 +693,12 @@ MESSAGE(TriggerToggleSelector,
((Position, position))
);
QUERY(GetSelectedObjectsTemplateNames,
((std::vector<ObjectID>, ids))
,
((std::vector<std::string>, names))
);
#ifndef MESSAGES_SKIP_SETUP
#include "MessagesSetup.h"