17
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-10-17 06:19:19 +02:00
Files
maszyna/scene/scenenodegroups.h

105 lines
3.9 KiB
C++

/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "scene/scenenode.h"
#include "widgets/map_objects.h"
namespace scene {
struct basic_group {
// members
std::vector<scene::basic_node *> nodes;
std::vector<basic_event *> events;
};
// holds lists of grouped scene nodes
class node_groups {
// NOTE: during scenario deserialization encountering *.inc file causes creation of a new group on the group stack
// this allows all nodes listed in this *.inc file to be grouped and potentially modified together by the editor.
public:
// constructors
node_groups() = default;
// methods
// requests creation of a new node group. returns: handle to the group
// nested groups are flattened into the outer one, unless Separate: then the group stands by itself (group ... endgroup)
group_handle
create( bool const Separate = false );
// indicates creation of current group ended. returns: handle to the parent group or null_handle if group stack is empty
group_handle
close();
// update minimap objects
void
update_map();
// returns current active group, or null_handle if group stack is empty
group_handle
handle() const;
// places provided node in specified group
void
insert( scene::group_handle const Group, scene::basic_node *Node );
// places provided event in specified group
void
insert( scene::group_handle const Group, basic_event *Event );
// grants direct access to specified group
scene::basic_group &
group( scene::group_handle const Group ) {
return m_groupmap[ Group ]; }
// groups made in the scenery editor. the nodes leave the groups they were in. returns: handle to the new group
group_handle
make( std::vector<scene::basic_node *> const &Nodes );
// the nodes of the group are left on their own
void
dissolve( scene::group_handle const Group );
// the node, about to be deleted, leaves its group
void
remove( scene::basic_node *Node );
// groups made or dissolved in the editor are written anew when the scenery is saved: the definitions of their nodes are
// taken out of where they are, a group's written as one block between group and endgroup, a dissolved one's nodes each on its own
bool
relocating( scene::basic_node const *Node ) const;
std::vector<scene::group_handle>
rewritten() const;
std::vector<scene::basic_node *>
loose() const;
// the scenery files match the groups now
void
saved();
// sends basic content of the class in legacy (text) format to provided stream
void
export_as_text( std::ostream &Output, bool const Dirty ) const;
private:
// types
using group_map = std::unordered_map<scene::group_handle, scene::basic_group>;
// methods
// removes specified group from the group list and group information from the group's nodes
void
erase( group_map::const_iterator Group );
// creates handle for a new group
group_handle
create_handle();
bool
assign_cross_switch(map::track_switch&sw, std::string &sw_name, const std::string &id, size_t idx);
// the node leaves the group it's in
void
leave( scene::basic_node *Node );
// members
group_map m_groupmap; // map of established node groups
std::stack<scene::group_handle> m_activegroup; // helper, group to be assigned to newly created nodes
std::set<scene::group_handle> m_rewrite; // groups made in the editor, to be written as blocks on save
std::set<scene::basic_node const *> m_loose; // nodes of groups dissolved in the editor, to be written on their own on save
};
extern node_groups Groups;
} // scene
//---------------------------------------------------------------------------