12 if (!mod || !pgrp)
return -1;
16 if (testgrp == pgrp)
return inx;
25 std::cerr <<
"module: " << m->
get_id() <<
" <" << m->
get_name() <<
">\n";
28 std::cerr <<
" grp: " << pg->get_id() << (pg->is_ascending()?
" asc ":
" des ") << pg->get_start_index()
29 <<
" <" << pg->get_name() <<
">\n";
31 std::cerr <<
" pin: " << pin->get_id() <<
" inx:" << pin->get_group().second <<
" row:"
34 std::cerr <<
"-------------" << std::endl;
42 if (pg.first->is_ascending())
43 return index - pg.first->get_start_index();
44 return pg.first->get_start_index() - index;
50 if (pg.first->is_ascending())
51 return pg.first->get_start_index() + row;
52 return pg.first->get_start_index() - row;
68 while (existingGroups.
contains(retval))
75 QMetaEnum me = QMetaEnum::fromType<Type>();
81 QMetaEnum me = QMetaEnum::fromType<Type>();
85 return static_cast<Type>(t);
119 mPinActions.
append(AtomicAction(tp,
id,
name, value));
123 : mPinActions(aaList)
128 for (
const AtomicAction& aa : mPinActions)
130 cryptoHash.
addData((
char*)(&aa.mType),
sizeof(aa.mType));
131 cryptoHash.
addData((
char*)(&aa.mId),
sizeof(aa.mId));
132 cryptoHash.
addData(aa.mName.toUtf8());
133 cryptoHash.
addData((
char*)(&aa.mValue),
sizeof(aa.mValue));
140 for (
const AtomicAction& aa : mPinActions)
146 if (!aa.mName.isEmpty())
163 if (xmlIn.
name() ==
"type")
165 if (xmlIn.
name() ==
"id")
167 if (xmlIn.
name() ==
"name")
169 if (xmlIn.
name() ==
"value")
171 mPinActions.
append(AtomicAction(tp,
id,
name,val));
179 PinGroup<ModulePin>* ActionPingroup::getGroup(
int grpId)
const
181 PinGroup<ModulePin>* pgroup = mPinGroups.value(grpId);
182 if (pgroup)
return pgroup;
183 if (!mParentModule || grpId<=0)
return nullptr;
188 void ActionPingroup::prepareUndoAction()
191 for (
const AtomicAction& aa : mPinActions)
196 PinGroup<ModulePin>* pgroup = pin->
get_group().first;
198 remainingPins[pgroup]--;
200 remainingPins[pgroup] = pgroup->
size()-1;
204 for (
auto it = remainingPins.
begin(); it != remainingPins.
end(); ++it)
206 if (it.value() > 0)
continue;
207 GroupRestore gr(mParentModule,it.key());
208 mGroupRestore.
insert(gr.mRow,gr);
212 void ActionPingroup::finalizeUndoAction()
215 for (
auto it = mGroupRestore.
begin(); it != mGroupRestore.
end(); ++it)
217 const GroupRestore& gr = it.
value();
226 for (
auto it = mTempUndoActions.
rbegin(); it != mTempUndoActions.
rend(); ++it)
228 for (
const AtomicAction& aa : (*it))
229 restoreActions.
append(aa);
232 for (
u32 grpId : mGroupToRemove)
244 int ActionPingroup::pinGroupRow(
const Module *m, PinGroup<ModulePin>* pgroup)
247 for (PinGroup<ModulePin>* testgroup : m->get_pin_groups())
249 if (testgroup == pgroup)
return inx;
258 mGroupRestore.
clear();
260 mGroupToRemove.clear();
261 mTempUndoActions.
clear();
272 for (
const AtomicAction& aa : mPinActions)
279 auto it = mPinGroups.find(aa.mId);
280 if (it == mPinGroups.end())
291 mPinGroups.insert(aa.mId,pgroup);
306 int startIndex = aa.mValue >> 1;
324 mPinGroups[aa.mId] = pgroup;
325 mGroupToRemove.insert(pgroup->
get_id());
333 int ptype = (int) pgroup->
get_type();
346 int inx = pinGroupRow(mParentModule,pgroup);
347 if (inx < 0)
return false;
376 mPinsMoved.
insert(aa.mId);
377 pgroup = getGroup(aa.mValue);
378 if (!pgroup)
return false;
381 qDebug() <<
"assign_pin_to_group failed";
389 if (!mParentModule->
set_pin_name(pin, aa.mName.toStdString()))
405 qDebug() <<
"move_pin_within_group failed";
415 finalizeUndoAction();
423 for (
u32 pinId : pinIds)
426 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pinId,
"",grpId));
428 retval =
new ActionPingroup(PinActionType::PinAsignToGroup,pinId,
"",grpId);
430 retval->mPinActions.
append(AtomicAction(PinActionType::PinMoveToRow,pinId,
"",pinRow++));
441 return addPinsToExistingGroup(m,grpId,pinIds,pinRow);
453 retval->mPinActions.
append(AtomicAction(PinActionType::GroupDirChange,vid,
"",(
int)pin->
get_direction()));
454 retval->mPinActions.
append(AtomicAction(PinActionType::GroupTypeChange,vid,
"",(
int)pin->
get_type()));
457 for (
u32 pinId : pinIds)
458 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pinId,
"",vid));
461 retval->mPinActions.
append(AtomicAction(PinActionType::GroupMoveToRow,vid,
"",grpRow));
470 return addPinsToNewGroup(m,
name,pinIds, grpRow);
478 if (!groupToDelete)
return retval;
484 bool doNotDelete =
false;
487 std::vector<ModulePin*> orderedPins = groupToDelete->
get_pins();
489 std::reverse(orderedPins.begin(), orderedPins.end());
493 if (pin->get_name() == groupToDelete->
get_name())
498 auto it = existingGroups.
find(pinName);
499 if (it == existingGroups.
end())
502 retval->mPinActions.
append(AtomicAction(PinActionType::GroupCreate,vid,pinName));
504 retval =
new ActionPingroup(PinActionType::GroupCreate,vid,pinName);
505 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),
"",vid));
511 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),
"",it.value()));
513 retval =
new ActionPingroup(PinActionType::PinAsignToGroup,pin->get_id(),
"",it.value());
522 retval->mPinActions.
append(AtomicAction(PinActionType::GroupDelete,groupToDelete->
get_id()));
539 for (
u32 pinId : pinIds)
542 if (!pin)
return nullptr;
548 retval->mPinActions.
append(AtomicAction(PinActionType::GroupCreate,vid,
name));
551 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pinId,
"",vid));
562 if (!pinGroup)
return nullptr;
568 int grpRow = pinGroupRow(m, pinGroup);
574 for (
auto it =
pins.rbegin(); it !=
pins.rend(); ++it)
575 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(),
QString(), vid));
579 for (
auto it =
pins.begin(); it !=
pins.end(); ++it)
580 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(),
QString(), vid));
586 retval->mPinActions.
append(AtomicAction(PinActionType::GroupRename, vid, grpName));
587 retval->mPinActions.
append(AtomicAction(PinActionType::GroupMoveToRow, vid,
QString(), grpRow));
595 if (!pinGroup)
return nullptr;
600 retval->mPinActions.
append(AtomicAction(PinActionType::PinTypeChange,pin->get_id(),
"",ptype));
606 : mId(pgroup->get_id()),
607 mName(
QString::fromStdString(pgroup->get_name())),
608 mRow(pinGroupRow(m,pgroup)),
609 mStartIndex( (pgroup->get_lowest_index() << 1) | (pgroup->is_ascending() ? 1 : 0)),
610 mDirection(pgroup->get_direction()),
611 mType(pgroup->get_type())
UserActionFactory for ActionPingroup.
UserAction * newAction() const
static ActionPingroupFactory * sFactory
static QString generateGroupName(const Module *mod, const ModulePin *pin)
void readFromXml(QXmlStreamReader &xmlIn) override
void writeToXml(QXmlStreamWriter &xmlOut) const override
ActionPingroup(PinActionType::Type tp=PinActionType::None, int id=0, const QString &name=QString(), int value=0)
static int pinGroupIndex(const Module *mod, const PinGroup< ModulePin > *pgrp)
static int pinIndex2Row(const ModulePin *pin, int index)
void addToHash(QCryptographicHash &cryptoHash) const override
static int pinRow2Index(const ModulePin *pin, int row)
QString tagname() const override
const std::string & get_name() const
const std::pair< PinGroup< T > *, i32 > & get_group() const
PinDirection get_direction() const
bool move_pin_within_group(PinGroup< ModulePin > *pin_group, ModulePin *pin, u32 new_index)
bool assign_pin_to_group(PinGroup< ModulePin > *pin_group, ModulePin *pin, bool delete_empty_groups=true)
ModulePin * get_pin_by_id(const u32 id) const
bool set_pin_group_type(PinGroup< ModulePin > *pin_group, PinType new_type)
bool set_pin_type(ModulePin *pin, PinType new_type)
bool delete_pin_group(PinGroup< ModulePin > *pin_group)
bool move_pin_group(PinGroup< ModulePin > *pin_group, u32 new_index)
bool set_pin_name(ModulePin *pin, const std::string &new_name, bool force_name=false)
std::string get_name() const
bool set_pin_group_direction(PinGroup< ModulePin > *pin_group, PinDirection new_direction)
Result< PinGroup< ModulePin > * > create_pin_group(const u32 id, const std::string &name, const std::vector< ModulePin * > pins={}, PinDirection direction=PinDirection::none, PinType type=PinType::none, bool ascending=true, u32 start_index=0, bool delete_empty_groups=true, bool force_name=false)
bool set_pin_group_name(PinGroup< ModulePin > *pin_group, const std::string &new_name, bool force_name=false)
std::vector< PinGroup< ModulePin > * > get_pin_groups(const std::function< bool(PinGroup< ModulePin > *)> &filter=nullptr) const
PinGroup< ModulePin > * get_pin_group_by_id(const u32 id) const
std::vector< Module * > get_submodules(const std::function< bool(Module *)> &filter=nullptr, bool recursive=false) const
Module * get_top_module() const
Module * get_module_by_id(u32 module_id) const
static Type fromString(const QString &s)
static QString toString(Type tp)
static bool useExistingPin(Type tp)
static bool useExistingGroup(Type tp)
std::vector< T * > get_pins(const std::function< bool(T *)> &filter=nullptr) const
i32 get_lowest_index() const
const std::string & get_name() const
bool is_ascending() const
PinDirection get_direction() const
bool is_descending() const
The UserActionFactory is the abstract base class for registration.
The UserAction class is the abstract base class for user interactions.
virtual void setObject(const UserActionObject &obj)
The UserActionObject class represents a single object used in UserAction.
UserActionObjectType::ObjectType type() const
void dumpPingroups(Module *m=nullptr)
uint qHash(const LaneIndex &ri)
std::vector< PinInformation > pins
void addData(const char *data, int length)
bool contains(const Key &key) const const
void append(const T &value)
bool isEmpty() const const
QList::reverse_iterator rbegin()
QList::reverse_iterator rend()
T value(int i) const const
QMap::iterator find(const Key &key)
QMap::iterator insert(const Key &key, const T &value)
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromStdString(const std::string &str)
QString number(int n, int base)
int toInt(bool *ok, int base) const const
QString toString() const const
QStringRef name() const const
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour)
bool readNextStartElement()
void writeTextElement(const QString &qualifiedName, const QString &text)