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:"
32 <<
pinIndex2Row(pin,pin->get_group().second) <<
" <" << pin->get_name() <<
">\n";
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;
193 undo->mPinActions.append(AtomicAction(tp,
id,
name,value));
198 undo->setObject(
object());
204 void ActionPingroup::prepareUndoAction()
207 for (
const AtomicAction& aa : mPinActions)
212 PinGroup<ModulePin>* pgroup = pin->
get_group().first;
214 remainingPins[pgroup]--;
216 remainingPins[pgroup] = pgroup->
size()-1;
220 for (
auto it = remainingPins.
begin(); it != remainingPins.
end(); ++it)
222 if (it.value() > 0)
continue;
223 GroupRestore gr(mParentModule,it.key());
224 mGroupRestore.
insert(gr.mRow,gr);
228 void ActionPingroup::finalizeUndoAction()
231 for (
auto it = mGroupRestore.
begin(); it != mGroupRestore.
end(); ++it)
233 const GroupRestore& gr = it.
value();
246 restoreActions += act->mPinActions;
247 act->mPinActions = restoreActions;
255 for (
u32 grpId : mGroupToRemove)
269 int ActionPingroup::pinGroupRow(
const Module *m, PinGroup<ModulePin>* pgroup)
272 for (PinGroup<ModulePin>* testgroup : m->get_pin_groups())
274 if (testgroup == pgroup)
return inx;
283 mGroupRestore.
clear();
285 mGroupToRemove.clear();
296 for (
const AtomicAction& aa : mPinActions)
303 auto it = mPinGroups.find(aa.mId);
304 if (it == mPinGroups.end())
307 if (!pgroup)
return false;
308 mPinGroups.insert(aa.mId,pgroup);
323 int startIndex = aa.mValue;
328 startIndex = -aa.mValue-1;
346 mPinGroups[aa.mId] = pgroup;
347 mGroupToRemove.insert(pgroup->
get_id());
356 int ptype = (int) pgroup->
get_type();
368 int inx = pinGroupRow(mParentModule,pgroup);
369 if (inx < 0)
return false;
393 mPinsMoved.
insert(aa.mId);
394 pgroup = getGroup(aa.mValue);
395 if (!pgroup)
return false;
398 qDebug() <<
"assign_pin_to_group failed";
405 if (!mParentModule->
set_pin_name(pin, aa.mName.toStdString()))
419 qDebug() <<
"move_pin_within_group failed";
429 finalizeUndoAction();
437 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;
572 if (!pinGroup)
return nullptr;
577 int grpRow = pinGroupRow(m, pinGroup);
583 for (
auto it =
pins.rbegin(); it !=
pins.rend(); ++it)
588 for (
auto it =
pins.begin(); it !=
pins.end(); ++it)
604 if (!pinGroup)
return nullptr;
615 : mId(pgroup->get_id()),
616 mName(
QString::fromStdString(pgroup->get_name())),
617 mRow(pinGroupRow(m,pgroup)),
618 mStartIndex(pgroup->get_start_index()),
619 mDirection(pgroup->get_direction()),
620 mType(pgroup->get_type())
622 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)
static ActionPingroup * toggleAscendingGroup(const Module *m, u32 grpId)
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
static ActionPingroup * changePinGroupType(const Module *m, u32 grpId, int ptype)
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)
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
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)