13 if (!mod || !pgrp)
return -1;
17 if (testgrp == pgrp)
return inx;
26 std::cerr <<
"module: " << m->
get_id() <<
" <" << m->
get_name() <<
">\n";
29 std::cerr <<
" grp: " << pg->get_id() << (pg->is_ascending()?
" asc ":
" des ") << pg->get_start_index()
30 <<
" <" << pg->get_name() <<
">\n";
32 std::cerr <<
" pin: " << pin->get_id() <<
" inx:" << pin->get_group().second <<
" row:"
33 <<
pinIndex2Row(pin,pin->get_group().second) <<
" <" << pin->get_name() <<
">\n";
35 std::cerr <<
"-------------" << std::endl;
43 if (pg.first->is_ascending())
44 return index - pg.first->get_start_index();
45 return pg.first->get_start_index() - index;
51 if (pg.first->is_ascending())
52 return pg.first->get_start_index() + row;
53 return pg.first->get_start_index() - row;
69 while (existingGroups.
contains(retval))
76 QMetaEnum me = QMetaEnum::fromType<Type>();
82 QMetaEnum me = QMetaEnum::fromType<Type>();
86 return static_cast<Type>(t);
120 mPinActions.
append(AtomicAction(tp,
id,
name, value));
124 : mPinActions(aaList)
129 for (
const AtomicAction& aa : mPinActions)
131 cryptoHash.
addData((
char*)(&aa.mType),
sizeof(aa.mType));
132 cryptoHash.
addData((
char*)(&aa.mId),
sizeof(aa.mId));
133 cryptoHash.
addData(aa.mName.toUtf8());
134 cryptoHash.
addData((
char*)(&aa.mValue),
sizeof(aa.mValue));
141 for (
const AtomicAction& aa : mPinActions)
147 if (!aa.mName.isEmpty())
164 if (xmlIn.
name() ==
"type")
166 if (xmlIn.
name() ==
"id")
168 if (xmlIn.
name() ==
"name")
170 if (xmlIn.
name() ==
"value")
172 mPinActions.
append(AtomicAction(tp,
id,
name,val));
180 PinGroup<ModulePin>* ActionPingroup::getGroup(
int grpId)
const
182 PinGroup<ModulePin>* pgroup = mPinGroups.value(grpId);
183 if (pgroup)
return pgroup;
184 if (!mParentModule || grpId<=0)
return nullptr;
194 undo->mPinActions.append(AtomicAction(tp,
id,
name,value));
199 undo->setObject(
object());
205 void ActionPingroup::prepareUndoAction()
208 for (
const AtomicAction& aa : mPinActions)
213 PinGroup<ModulePin>* pgroup = pin->
get_group().first;
215 remainingPins[pgroup]--;
217 remainingPins[pgroup] = pgroup->
size()-1;
221 for (
auto it = remainingPins.
begin(); it != remainingPins.
end(); ++it)
223 if (it.value() > 0)
continue;
224 GroupRestore gr(mParentModule,it.key());
225 mGroupRestore.
insert(gr.mRow,gr);
229 void ActionPingroup::finalizeUndoAction()
232 for (
auto it = mGroupRestore.
begin(); it != mGroupRestore.
end(); ++it)
234 const GroupRestore& gr = it.
value();
247 restoreActions += act->mPinActions;
248 act->mPinActions = restoreActions;
256 for (
u32 grpId : mGroupToRemove)
270 int ActionPingroup::pinGroupRow(Module *m, PinGroup<ModulePin>* pgroup)
273 for (PinGroup<ModulePin>* testgroup : m->get_pin_groups())
275 if (testgroup == pgroup)
return inx;
284 mGroupRestore.
clear();
286 mGroupToRemove.clear();
297 for (
const AtomicAction& aa : mPinActions)
304 auto it = mPinGroups.find(aa.mId);
305 if (it == mPinGroups.end())
308 if (!pgroup)
return false;
309 mPinGroups.insert(aa.mId,pgroup);
324 int startIndex = aa.mValue;
329 startIndex = -aa.mValue-1;
347 mPinGroups[aa.mId] = pgroup;
348 mGroupToRemove.insert(pgroup->
get_id());
357 int ptype = (int) pgroup->
get_type();
369 int inx = pinGroupRow(mParentModule,pgroup);
370 if (inx < 0)
return false;
394 mPinsMoved.
insert(aa.mId);
395 pgroup = getGroup(aa.mValue);
396 if (!pgroup)
return false;
399 qDebug() <<
"assign_pin_to_group failed";
406 if (!mParentModule->
set_pin_name(pin, aa.mName.toStdString()))
420 qDebug() <<
"move_pin_within_group failed";
430 finalizeUndoAction();
438 for (
u32 pinId : pinIds)
471 for (
u32 pinId : pinIds)
492 if (!groupToDelete)
return retval;
498 bool doNotDelete =
false;
503 if (pin->get_name() == groupToDelete->
get_name())
508 auto it = existingGroups.
find(pinName);
509 if (it == existingGroups.
end())
549 for (
u32 pinId : pinIds)
552 if (!pin)
return nullptr;
569 : mId(pgroup->get_id()),
570 mName(
QString::fromStdString(pgroup->get_name())),
571 mRow(pinGroupRow(m,pgroup)),
572 mStartIndex(pgroup->get_start_index()),
573 mDirection(pgroup->get_direction()),
574 mType(pgroup->get_type())
576 if (!pgroup->
is_ascending()) mStartIndex = -mStartIndex-1;
UserActionFactory for ActionPingroup.
UserAction * newAction() const
static ActionPingroupFactory * sFactory
static ActionPingroup * addPinToNewGroup(const Module *m, const QString &name, u32 pinId, int grpRow=-1)
static ActionPingroup * deletePinGroup(const Module *m, u32 grpId)
void readFromXml(QXmlStreamReader &xmlIn) override
static ActionPingroup * addPinToExistingGroup(const Module *m, u32 grpId, u32 pinId, int pinRow=-1)
void writeToXml(QXmlStreamWriter &xmlOut) const override
static ActionPingroup * addPinsToExistingGroup(const Module *m, u32 grpId, QList< u32 > pinIds, int pinRow=-1)
ActionPingroup(PinActionType::Type tp=PinActionType::None, int id=0, const QString &name=QString(), int value=0)
void addToHash(QCryptographicHash &cryptoHash) const override
static ActionPingroup * addPinsToNewGroup(const Module *m, const QString &name, QList< u32 > pinIds, int grpRow=-1)
static ActionPingroup * removePinsFromGroup(const Module *m, QList< u32 > pinIds)
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_start_index() const
const std::string & get_name() const
bool is_ascending() const
PinDirection get_direction() 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
int pinGroupIndex(const Module *mod, const PinGroup< ModulePin > *pgrp)
int pinIndex2Row(const ModulePin *pin, int index)
int pinRow2Index(const ModulePin *pin, int row)
void dumpPingroups(Module *m=nullptr)
QString generateGroupName(const Module *mod, const ModulePin *pin)
uint qHash(const LaneIndex &ri)
void addData(const char *data, int length)
bool contains(const Key &key) const const
void append(const T &value)
bool isEmpty() const const
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
QStringRef name() const const
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour)
bool readNextStartElement()
void writeTextElement(const QString &qualifiedName, const QString &text)