HAL
action_fold_module.cpp
Go to the documentation of this file.
4 #include "gui/gui_globals.h"
10 
11 namespace hal
12 {
14  : UserActionFactory("FoldModule") {;}
15 
17 
19  {
20  return new ActionFoldModule;
21  }
22 
24  : mContextId(0), mPlacementHint(PlacementHint::Standard)
25  {
26  if (moduleId)
28  }
29 
31  {
33  }
34 
36  {
37  if (mObject.type() != UserActionObjectType::Module) return false;
39  if (!m) return false;
40 
41  GraphContext* ctx = mContextId
44  if (!ctx) return false;
45 
46  Node moduleToFold(mObject.id(),Node::Module);
47  NetLayoutPoint moduleAlreadyPositioned = ctx->getLayouter()->positonForNode(moduleToFold);
48  if (!moduleAlreadyPositioned.isUndefined())
49  return false; // nothing to do, module already folded
50 
51  QPoint polePosition;
52 
53  QSet<u32> gats;
54  for (const auto& g : m->get_gates(nullptr, true))
55  {
56  u32 gid = g->get_id();
58  if (pos.isUndefined()) continue;
59  if (gats.isEmpty() || pos.x() < polePosition.x() || pos.y() < polePosition.y())
60  polePosition = pos;
61  gats.insert(gid);
62  }
63 
64  QSet<u32> mods;
65  for (auto sm : m->get_submodules(nullptr, true))
66  {
67  u32 mid = sm->get_id();
69  if (pos.isUndefined()) continue;
70  if ( (gats.isEmpty()&&mods.isEmpty()) ||
71  pos.x() < polePosition.x() || pos.y() < polePosition.y())
72  polePosition = pos;
73  mods.insert(mid);
74  }
75 
78  addAction(actr);
79 
83  plc.addGridPosition(moduleToFold,polePosition);
84  acta->setPlacementHint(plc);
85  addAction(acta);
86 
87  return UserActionCompound::exec();
88  }
89 }
Adds an item to a module or grouping.
void setPlacementHint(PlacementHint hint)
UserActionFactory for ActionFoldModule.
static ActionFoldModuleFactory * sFactory
QString tagname() const override
ActionFoldModule(u32 moduleId=0)
Removes an item from a Module or Grouping.
ContextManagerWidget * getContextManagerWidget()
Logical container for modules, gates, and nets.
Definition: graph_context.h:55
GraphLayouter * getLayouter() const
GraphContext * getContextById(u32 id) const
NetLayoutPoint positonForNode(const Node &nd) const
const std::vector< Gate * > & get_gates() const
Definition: module.cpp:391
std::vector< Module * > get_submodules(const std::function< bool(Module *)> &filter=nullptr, bool recursive=false) const
Definition: module.cpp:259
bool isUndefined() const
Module * get_module_by_id(u32 module_id) const
Definition: netlist.cpp:613
The Node class object represents a module or a gate.
Definition: gui_def.h:61
@ Module
Definition: gui_def.h:63
@ Gate
Definition: gui_def.h:63
The PlacementHint class object provides hints for the layouter how new box objects are placed on a vi...
Definition: gui_def.h:196
void addGridPosition(const Node &nd, const QPoint &p)
Definition: gui_def.h:263
void addAction(UserAction *act)
The UserActionFactory is the abstract base class for registration.
Definition: user_action.h:225
QString tagname() const
Definition: user_action.h:242
The UserAction class is the abstract base class for user interactions.
Definition: user_action.h:57
virtual void setObject(const UserActionObject &obj)
Definition: user_action.cpp:32
UserActionObject mObject
Definition: user_action.h:183
The UserActionObject class represents a single object used in UserAction.
UserActionObjectType::ObjectType type() const
ContentManager * gContentManager
Definition: plugin_gui.cpp:78
GraphContextManager * gGraphContextManager
Definition: plugin_gui.cpp:85
Netlist * gNetlist
Definition: plugin_gui.cpp:80
quint32 u32
int x() const const
int y() const const
QSet::iterator insert(const T &value)
bool isEmpty() const const