Skip to content

Commit 62bd03f

Browse files
committed
Fill in menu
1 parent ce2f3ea commit 62bd03f

File tree

6 files changed

+56
-24
lines changed

6 files changed

+56
-24
lines changed

src/Interface/Application/Connection.cc

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include <stdexcept>
3131
#include <QtGui>
3232
#include <boost/bind.hpp>
33+
#include <Core/Application/Application.h>
34+
#include <Dataflow/Engine/Controller/NetworkEditorController.h>
3335
#include <Interface/Application/Connection.h>
3436
#include <Interface/Application/Port.h>
3537
#include <Interface/Application/GuiLogger.h>
@@ -39,12 +41,13 @@
3941
#include <Core/Utils/Exception.h>
4042

4143
using namespace SCIRun::Gui;
44+
using namespace SCIRun::Core;
4245
using namespace SCIRun::Dataflow::Networks;
4346

4447
class EuclideanDrawStrategy : public ConnectionDrawStrategy
4548
{
4649
public:
47-
void draw(QGraphicsPathItem* item, const QPointF& from, const QPointF& to)
50+
virtual void draw(QGraphicsPathItem* item, const QPointF& from, const QPointF& to) override
4851
{
4952
QPainterPath path;
5053

@@ -70,7 +73,7 @@ class EuclideanDrawStrategy : public ConnectionDrawStrategy
7073
class CubicBezierDrawStrategy : public ConnectionDrawStrategy
7174
{
7275
public:
73-
void draw(QGraphicsPathItem* item, const QPointF& from, const QPointF& to)
76+
virtual void draw(QGraphicsPathItem* item, const QPointF& from, const QPointF& to) override
7477
{
7578
QPainterPath path;
7679
QPointF start = from;
@@ -79,7 +82,7 @@ class CubicBezierDrawStrategy : public ConnectionDrawStrategy
7982
auto mid = (to - start) / 2 + start;
8083

8184
double qDirXNum = -(to-start).y();
82-
double qDirXDenom = ((double)(to-start).x());
85+
double qDirXDenom = static_cast<double>((to-start).x());
8386
if (0 == qDirXDenom)
8487
qDirXDenom = -0.0001;
8588
QPointF qDir(qDirXNum / qDirXDenom , 1);
@@ -100,7 +103,7 @@ class CubicBezierDrawStrategy : public ConnectionDrawStrategy
100103
class ManhattanDrawStrategy : public ConnectionDrawStrategy
101104
{
102105
public:
103-
void draw(QGraphicsPathItem* item, const QPointF& from, const QPointF& to)
106+
virtual void draw(QGraphicsPathItem* item, const QPointF& from, const QPointF& to) override
104107
{
105108
QPainterPath path;
106109
path.moveTo(from);
@@ -185,15 +188,31 @@ namespace SCIRun
185188
const QString disableEnableAction("Disable");
186189
const QString editNotesAction("Edit Notes...");
187190

191+
QList<QAction*> fillInsertModuleMenu(QMenu* menu, const ModuleDescriptionMap& moduleMap, PortWidget* output, ConnectionLine* conn)
192+
{
193+
auto portTypeToMatch = output->get_typename();
194+
195+
return fillMenuWithFilteredModuleActions(menu, moduleMap,
196+
[portTypeToMatch](const ModuleDescription& m) { return portTypeMatches(portTypeToMatch, true, m) && portTypeMatches(portTypeToMatch, false, m); },
197+
[conn](QAction* action) { QObject::connect(action, SIGNAL(triggered()), conn, SLOT(insertNewModule())); },
198+
menu);
199+
}
200+
188201
class ConnectionMenu : public QMenu
189202
{
190203
public:
191-
explicit ConnectionMenu(QWidget* parent = nullptr) : QMenu(parent)
204+
explicit ConnectionMenu(ConnectionLine* conn, QWidget* parent = nullptr) : QMenu(parent)
192205
{
193206
deleteAction_ = addAction(deleteAction);
194207
addWidgetToExecutionDisableList(deleteAction_);
195208
insertAction_ = addAction(insertModuleAction);
196209
addWidgetToExecutionDisableList(insertAction_);
210+
211+
212+
auto insertable = new QMenu;
213+
fillInsertModuleMenu(insertable, Application::Instance().controller()->getAllAvailableModuleDescriptions(), conn->connectedPorts().first, conn);
214+
insertAction_->setMenu(insertable);
215+
197216
disableAction_ = addAction(disableEnableAction);
198217
addWidgetToExecutionDisableList(disableAction_);
199218
notesAction_ = addAction(editNotesAction);
@@ -219,7 +238,7 @@ namespace SCIRun
219238
class ConnectionLineNoteDisplayStrategy : public NoteDisplayStrategy
220239
{
221240
public:
222-
virtual QPointF relativeNotePosition(QGraphicsItem* item, const QGraphicsTextItem* note, NotePosition position) const
241+
virtual QPointF relativeNotePosition(QGraphicsItem* item, const QGraphicsTextItem* note, NotePosition position) const override
223242
{
224243
return QPointF(0,0);
225244
}
@@ -260,17 +279,19 @@ ConnectionLine::ConnectionLine(PortWidget* fromPort, PortWidget* toPort, const C
260279
setFlags(ItemIsSelectable | ItemIsMovable | ItemSendsGeometryChanges | ItemIsFocusable);
261280

262281
setZValue(defaultZValue());
263-
setToolTip("Left - Highlight\nDouble-Left - Menu\ni - Datatype info");
282+
setToolTip("<font color=\"#000000\" size=2>Left - Highlight\nDouble-Left - Menu\ni - Datatype info");
264283
setAcceptHoverEvents(true);
265284

266-
menu_ = new ConnectionMenu();
285+
menu_ = new ConnectionMenu(this);
267286
connectNoteEditorToAction(menu_->notesAction_);
268287
connectUpdateNote(this);
269288

270289
NeedsScenePositionProvider::setPositionObject(boost::make_shared<MidpointPositionerFromPorts>(fromPort_, toPort_));
271290

272291
connect(menu_->disableAction_, SIGNAL(triggered()), this, SLOT(toggleDisabled()));
273292

293+
menu_->setStyleSheet(fromPort->styleSheet());
294+
274295
trackNodes();
275296
GuiLogger::Instance().logInfoStd("Connection made: " + id_.id_);
276297
}
@@ -430,6 +451,11 @@ QVariant ConnectionLine::itemChange(GraphicsItemChange change, const QVariant& v
430451
return QGraphicsItem::itemChange(change, value);
431452
}
432453

454+
void ConnectionLine::insertNewModule()
455+
{
456+
qDebug() << "INSERTING NEW MODULE";
457+
}
458+
433459
ModuleIdPair ConnectionLine::getConnectedToModuleIds() const
434460
{
435461
return std::make_pair(toPort_->getUnderlyingModuleId(), fromPort_->getUnderlyingModuleId());
@@ -574,7 +600,7 @@ ConnectionInProgress* ConnectionFactory::makeConnectionInProgress(PortWidget* po
574600
}
575601
default:
576602
std::cerr << "Unknown connection type." << std::endl;
577-
return 0;
603+
return nullptr;
578604
}
579605
}
580606

@@ -626,7 +652,7 @@ ConnectionDrawStrategyPtr ConnectionFactory::getCurrentDrawer() const
626652
}
627653
}
628654

629-
ConnectionLine* ConnectionFactory::makeFinishedConnection(PortWidget* fromPort, PortWidget* toPort, const SCIRun::Dataflow::Networks::ConnectionId& id) const
655+
ConnectionLine* ConnectionFactory::makeFinishedConnection(PortWidget* fromPort, PortWidget* toPort, const ConnectionId& id) const
630656
{
631657
auto c = new ConnectionLine(fromPort, toPort, id, getCurrentDrawer());
632658
activate(c);

src/Interface/Application/Connection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public Q_SLOTS:
8181
void setDrawStrategy(ConnectionDrawStrategyPtr drawer);
8282
void updateNote(const Note& note);
8383
void toggleDisabled();
84+
void insertNewModule();
8485

8586
Q_SIGNALS:
8687
void deleted(const SCIRun::Dataflow::Networks::ConnectionId& id);

src/Interface/Application/ModuleWidget.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -681,8 +681,8 @@ QMenu* ModuleWidget::getReplaceWithMenu()
681681

682682
void ModuleWidget::replaceModuleWith()
683683
{
684-
QAction* action = qobject_cast<QAction*>(sender());
685-
QString moduleToReplace = action->text();
684+
auto action = qobject_cast<QAction*>(sender());
685+
auto moduleToReplace = action->text();
686686
Q_EMIT replaceModuleWith(theModule_, moduleToReplace.toStdString());
687687
}
688688

@@ -715,7 +715,7 @@ void ModuleWidget::addPorts(int index)
715715

716716
void ModuleWidget::createInputPorts(const ModuleInfoProvider& moduleInfoProvider)
717717
{
718-
const ModuleId moduleId = moduleInfoProvider.get_id();
718+
const auto moduleId = moduleInfoProvider.get_id();
719719
size_t i = 0;
720720
const auto& inputs = moduleInfoProvider.inputPorts();
721721
for (const auto& port : inputs)
@@ -753,9 +753,9 @@ void ModuleWidget::createInputPorts(const ModuleInfoProvider& moduleInfoProvider
753753
}
754754
}
755755

756-
void ModuleWidget::printInputPorts(const ModuleInfoProvider& moduleInfoProvider)
756+
void ModuleWidget::printInputPorts(const ModuleInfoProvider& moduleInfoProvider) const
757757
{
758-
const ModuleId moduleId = moduleInfoProvider.get_id();
758+
const auto moduleId = moduleInfoProvider.get_id();
759759
std::cout << "Module input ports: " << moduleId << std::endl;
760760
size_t i = 0;
761761
for (const auto& port : moduleInfoProvider.inputPorts())

src/Interface/Application/ModuleWidget.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private Q_SLOTS:
241241
void setupLogging();
242242
void adjustDockState(bool dockEnabled);
243243
Qt::DockWidgetArea allowedDockArea() const;
244-
void printInputPorts(const SCIRun::Dataflow::Networks::ModuleInfoProvider& moduleInfoProvider);
244+
void printInputPorts(const SCIRun::Dataflow::Networks::ModuleInfoProvider& moduleInfoProvider) const;
245245
QMenu* getReplaceWithMenu();
246246
void setInputPortSpacing(bool highlighted);
247247
void setOutputPortSpacing(bool highlighted);

src/Interface/Application/Port.cc

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ namespace SCIRun {
5555
return std::find_if(module.input_ports_.begin(), module.input_ports_.end(), [&](const InputPortDescription& in) { return in.datatype == portTypeToMatch; }) != module.input_ports_.end();
5656
}
5757

58-
QList<QAction*> fillMenu(QMenu* menu, const ModuleDescriptionMap& moduleMap, PortWidget* parent)
58+
QList<QAction*> fillConnectToEmptyPortMenu(QMenu* menu, const ModuleDescriptionMap& moduleMap, PortWidget* parent)
5959
{
60-
const std::string& portTypeToMatch = parent->get_typename();
61-
bool isInput = parent->isInput();
60+
auto portTypeToMatch = parent->get_typename();
61+
auto isInput = parent->isInput();
6262
return fillMenuWithFilteredModuleActions(menu, moduleMap,
63-
[=](const ModuleDescription& m) { return portTypeMatches(portTypeToMatch, isInput, m); },
64-
[=](QAction* action) { QObject::connect(action, SIGNAL(triggered()), parent, SLOT(connectNewModule())); },
63+
[portTypeToMatch, isInput](const ModuleDescription& m) { return portTypeMatches(portTypeToMatch, isInput, m); },
64+
[parent](QAction* action) { QObject::connect(action, SIGNAL(triggered()), parent, SLOT(connectNewModule())); },
6565
parent);
6666
}
6767

@@ -73,18 +73,20 @@ namespace SCIRun {
7373
QList<QAction*> allCompatibleActions;
7474
for (const auto& package : moduleMap)
7575
{
76-
const std::string& packageName = package.first;
76+
const auto& packageName = package.first;
7777

7878
QList<QMenu*> packageMenus;
7979
for (const auto& category : package.second)
8080
{
81-
const std::string& categoryName = category.first;
81+
const auto& categoryName = category.first;
8282
QList<QAction*> actions;
8383

8484
for (const auto& module : category.second)
8585
{
86+
//qDebug() << module.second.lookupInfo_.module_name_.c_str();
8687
if (modulePred(module.second))
8788
{
89+
//qDebug() << "is compatible";
8890
const auto& moduleName = module.first;
8991
auto qname = QString::fromStdString(moduleName);
9092
auto action = new QAction(qname, menu);
@@ -95,13 +97,15 @@ namespace SCIRun {
9597
}
9698
if (!actions.empty())
9799
{
100+
//qDebug() << "action list not empty, adding to submenu" << categoryName.c_str();
98101
auto m = new QMenu(QString::fromStdString(categoryName), parent);
99102
m->addActions(actions);
100103
packageMenus.append(m);
101104
}
102105
}
103106
if (!packageMenus.isEmpty())
104107
{
108+
//qDebug() << "package menu not empty, adding to menu" << packageName.c_str();
105109
auto p = new QMenu(QString::fromStdString(packageName), parent);
106110
for (auto pm : packageMenus)
107111
p->addMenu(pm);
@@ -137,7 +141,7 @@ namespace SCIRun {
137141
auto m = new QMenu("Connect Module", parent);
138142
faves_ = new QMenu("Favorites", parent);
139143
m->addMenu(faves_);
140-
compatibleModuleActions_ = fillMenu(m, Application::Instance().controller()->getAllAvailableModuleDescriptions(), parent);
144+
compatibleModuleActions_ = fillConnectToEmptyPortMenu(m, Application::Instance().controller()->getAllAvailableModuleDescriptions(), parent);
141145
addMenu(m);
142146
}
143147
void filterFavorites()

src/Interface/Application/Utility.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ namespace Gui
7575
typedef boost::function<bool(const Dataflow::Networks::ModuleDescription&)> ModulePredicate;
7676
typedef boost::function<void(QAction*)> QActionHookup;
7777
QList<QAction*> fillMenuWithFilteredModuleActions(QMenu* menu, const Dataflow::Networks::ModuleDescriptionMap& moduleMap, ModulePredicate modulePred, QActionHookup hookup, QWidget* parent);
78+
bool portTypeMatches(const std::string& portTypeToMatch, bool isInput, const Dataflow::Networks::ModuleDescription& module);
7879
QPointF findCenterOfNetwork(const Dataflow::Networks::ModulePositions& positions);
7980
}
8081

0 commit comments

Comments
 (0)