mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-10 13:06:59 -04:00
Implemented selection using rectangles in symbol editor
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@535 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
|
||||
DECLARE_TYPEOF_COLLECTION(pair<SymbolShapeP COMMA SymbolShapeCombine>);
|
||||
DECLARE_TYPEOF_COLLECTION(pair<SymbolPartP COMMA size_t >);
|
||||
DECLARE_TYPEOF_COLLECTION(RemoveSymbolPartsAction::Removal);
|
||||
DECLARE_TYPEOF_COLLECTION(SymbolPartP);
|
||||
DECLARE_TYPEOF_COLLECTION(ControlPointP);
|
||||
|
||||
@@ -375,13 +376,25 @@ void AddSymbolPartAction::perform(bool to_undo) {
|
||||
RemoveSymbolPartsAction::RemoveSymbolPartsAction(Symbol& symbol, const set<SymbolPartP>& parts)
|
||||
: symbol(symbol)
|
||||
{
|
||||
check(symbol, parts);
|
||||
}
|
||||
|
||||
void RemoveSymbolPartsAction::check(SymbolGroup& group, const set<SymbolPartP>& parts) {
|
||||
size_t index = 0;
|
||||
FOR_EACH(p, symbol.parts) {
|
||||
size_t removed = 0;
|
||||
FOR_EACH(p, group.parts) {
|
||||
if (parts.find(p) != parts.end()) {
|
||||
removals.push_back(make_pair(p, index)); // remove this part
|
||||
removals.push_back(Removal(group, index, p)); // remove this part
|
||||
++ removed;
|
||||
} else if (SymbolGroup* g = p->isSymbolGroup()) {
|
||||
check(*g, parts);
|
||||
}
|
||||
++index;
|
||||
}
|
||||
if (!group.isSymbolSymmetry() && &group != &symbol) {
|
||||
// remove empty groups
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
String RemoveSymbolPartsAction::getName(bool to_undo) const {
|
||||
@@ -393,15 +406,15 @@ void RemoveSymbolPartsAction::perform(bool to_undo) {
|
||||
// reinsert the parts
|
||||
// ascending order, this is the reverse of removal
|
||||
FOR_EACH(r, removals) {
|
||||
assert(r.second <= symbol.parts.size());
|
||||
symbol.parts.insert(symbol.parts.begin() + r.second, r.first);
|
||||
assert(r.pos <= r.parent->parts.size());
|
||||
r.parent->parts.insert(r.parent->parts.begin() + r.pos, r.removed);
|
||||
}
|
||||
} else {
|
||||
// remove the parts
|
||||
// descending order, because earlier removals shift the rest of the vector
|
||||
FOR_EACH_REVERSE(r, removals) {
|
||||
assert(r.second < symbol.parts.size());
|
||||
symbol.parts.erase(symbol.parts.begin() + r.second);
|
||||
assert(r.pos < r.parent->parts.size());
|
||||
r.parent->parts.erase(r.parent->parts.begin() + r.pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,8 +211,21 @@ class RemoveSymbolPartsAction : public SymbolPartListAction {
|
||||
|
||||
private:
|
||||
Symbol& symbol;
|
||||
/// Removed parts and their positions, sorted by ascending pos
|
||||
vector<pair<SymbolPartP, size_t> > removals;
|
||||
/// Check for removals in a group
|
||||
void check(SymbolGroup& group, const set<SymbolPartP>& parts);
|
||||
public:
|
||||
/// A removal step
|
||||
struct Removal {
|
||||
inline Removal(SymbolGroup& parent, size_t pos, const SymbolPartP& removed)
|
||||
: parent(&parent), pos(pos), removed(removed)
|
||||
{}
|
||||
SymbolGroup* parent;
|
||||
size_t pos;
|
||||
SymbolPartP removed;
|
||||
};
|
||||
private:
|
||||
/// Removed parts, sorted by ascending pos
|
||||
vector<Removal> removals;
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------- : Duplicate symbol parts
|
||||
|
||||
Reference in New Issue
Block a user