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;
378 mPinsMoved.
insert(aa.mId);
379 pgroup = getGroup(aa.mValue);
380 if (!pgroup)
return false;
383 qDebug() <<
"assign_pin_to_group failed";
391 if (!mParentModule->
set_pin_name(pin, aa.mName.toStdString()))
404 pgroup = pin->get_group().first;
407 qDebug() <<
"move_pin_within_group failed";
417 finalizeUndoAction();
419 return UserAction::exec();
425 for (
u32 pinId : pinIds)
428 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pinId,
"",grpId));
430 retval =
new ActionPingroup(PinActionType::PinAsignToGroup,pinId,
"",grpId);
432 retval->mPinActions.
append(AtomicAction(PinActionType::PinMoveToRow,pinId,
"",pinRow++));
443 return addPinsToExistingGroup(m,grpId,pinIds,pinRow);
455 retval->mPinActions.
append(AtomicAction(PinActionType::GroupDirChange,vid,
"",(
int)pin->
get_direction()));
456 retval->mPinActions.
append(AtomicAction(PinActionType::GroupTypeChange,vid,
"",(
int)pin->
get_type()));
459 for (
u32 pinId : pinIds)
460 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pinId,
"",vid));
463 retval->mPinActions.
append(AtomicAction(PinActionType::GroupMoveToRow,vid,
"",grpRow));
472 return addPinsToNewGroup(m,
name,pinIds, grpRow);
480 if (!groupToDelete)
return retval;
486 bool doNotDelete =
false;
489 std::vector<ModulePin*> orderedPins = groupToDelete->
get_pins();
491 std::reverse(orderedPins.begin(), orderedPins.end());
495 if (pin->get_name() == groupToDelete->
get_name())
500 auto it = existingGroups.
find(pinName);
501 if (it == existingGroups.
end())
504 retval->mPinActions.
append(AtomicAction(PinActionType::GroupCreate,vid,pinName));
506 retval =
new ActionPingroup(PinActionType::GroupCreate,vid,pinName);
507 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),
"",vid));
508 if (pin->get_direction() != PinDirection::none)
509 retval->mPinActions.
append(AtomicAction(PinActionType::GroupDirChange,vid,
"",(
int)pin->get_direction()));
510 if (pin->get_type() != PinType::none)
511 retval->mPinActions.
append(AtomicAction(PinActionType::GroupTypeChange,vid,
"",(
int)pin->get_type()));
517 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pin->get_id(),
"",it.value()));
519 retval =
new ActionPingroup(PinActionType::PinAsignToGroup,pin->get_id(),
"",it.value());
528 retval->mPinActions.
append(AtomicAction(PinActionType::GroupDelete,groupToDelete->
get_id()));
545 for (
u32 pinId : pinIds)
548 if (!pin)
return nullptr;
554 retval->mPinActions.
append(AtomicAction(PinActionType::GroupCreate,vid,
name));
557 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup,pinId,
"",vid));
559 retval->mPinActions.
append(AtomicAction(PinActionType::GroupDirChange,vid,
"",(
int)pin->
get_direction()));
560 if (pin->
get_type() != PinType::none)
561 retval->mPinActions.
append(AtomicAction(PinActionType::GroupTypeChange,vid,
"",(
int)pin->
get_type()));
572 if (!pinGroup)
return nullptr;
581 if (pin->get_name() == designatedName.
toStdString())
continue;
583 renameActions.
append(AtomicAction(PinActionType::PinRename, pin->get_id(), designatedName));
592 for (
const AtomicAction& aa : renameActions)
593 retval->mPinActions.
append(aa);
603 if (!pinGroup)
return nullptr;
609 int grpRow = pinGroupRow(m, pinGroup);
614 retval->mPinActions.
append(AtomicAction(PinActionType::GroupDirChange, vid,
"", (
int)pinGroup->
get_direction()));
615 if (pinGroup->
get_type() != PinType::none)
616 retval->mPinActions.
append(AtomicAction(PinActionType::GroupTypeChange, vid,
"", (
int)pinGroup->
get_type()));
619 for (
auto it =
pins.rbegin(); it !=
pins.rend(); ++it)
620 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(),
QString(), vid));
624 for (
auto it =
pins.begin(); it !=
pins.end(); ++it)
625 retval->mPinActions.
append(AtomicAction(PinActionType::PinAsignToGroup, (*it)->get_id(),
QString(), vid));
631 retval->mPinActions.
append(AtomicAction(PinActionType::GroupRename, vid, grpName));
632 retval->mPinActions.
append(AtomicAction(PinActionType::GroupMoveToRow, vid,
QString(), grpRow));
640 if (!pinGroup)
return nullptr;
645 retval->mPinActions.
append(AtomicAction(PinActionType::PinTypeChange,pin->get_id(),
"",ptype));
651 : mId(pgroup->get_id()),
652 mName(
QString::fromStdString(pgroup->get_name())),
653 mRow(pinGroupRow(m,pgroup)),
654 mStartIndex( (pgroup->get_lowest_index() << 1) | (pgroup->is_ascending() ? 1 : 0)),
655 mDirection(pgroup->get_direction()),
656 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 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
std::string toStdString() 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)