Here I resend the patch of the "Connect to" function, with a little
cleaner code, and a patch for a very cheating Copy&Paste processing(s)
functionality. It uses QClipboard, but I send only the processings names
of actual/selected processings on plain text :-) To do it seriously, I
could define a new MIME format and use it in a similar way... or take
the David advice to use his XML implementations on the Network (I
unsuccessfully tried, I need to study further about all that stuff).
Regards,
Natanael.
El 05/28/2008 02:41 PM, Natanael Olaiz escribió:
Sorry, I forgot to send a separate patch for the audio check issue.
El 05/28/2008 01:22 PM, Pau Arumí escribió:
On dc, 2008-05-28 at 12:05 +0200, David García Garzón wrote:
I liked the idea at first instance. But looking at that screenshot i
find it very messing for the user. What's the difference between the
first and the second oscilloscope? The first one is creating a
linked processing while the second one is about connecting to an
existing one. I don't have a solution on that but let's mature an idea.
One solution could add multilevel menu 'connect to' or 'create
linked', or just one of them while keeping the other in the first
level.
I like this option, because we can have MANY processings in the canvas,
while the available sinks remain small
Or providing a dialog interface for choosing the connected ports.
Or showing the 'processing.port' in a single level. I am not that
convinced on any of the solutions. Any ideas?
BTW, 'f' is typeid(CLAM::TData).name() for gcc (non portable), so i
think that should be expressed in that way. It is more self
explanatory and also strong to changes on the way of representing
typeid's names which are not standard.
Sure! (Natanael you can patch this)
P
David.
On Dimecres 28 Maig 2008, Natanael Olaiz wrote:
This idea took me more time that I expected, so I didn't improve a few
ugly copy&paste testings yet. :-/
Here is the patch and a screenshot. It works, but probably the code
could be improved and I need to check the names...
_______________________________________________
Clam-devel mailing list
[email protected]
https://llistes.projectes.lafarga.org/cgi-bin/mailman/listinfo/clam-devel
_______________________________________________
Clam-devel mailing list
[email protected]
https://llistes.projectes.lafarga.org/cgi-bin/mailman/listinfo/clam-devel
Index: NetworkEditor/src/NetworkCanvas.hxx
===================================================================
--- NetworkEditor/src/NetworkCanvas.hxx (revision 11424)
+++ NetworkEditor/src/NetworkCanvas.hxx (working copy)
@@ -908,7 +908,7 @@
markAsChanged();
}
- void addLinkedProcessingReceiver( ProcessingBox * processing, QPoint point, const QString & processingType )
+ void addLinkedProcessingReceiver( ProcessingBox * processing, QPoint point, const QString & processingType, unsigned nInPort=0 )
{
if (networkIsDummy()) return;
@@ -919,13 +919,13 @@
CLAM::Processing & portProcessing = _network->GetProcessing( processingId );
// add box to canvas and connect
addProcessingBox( processingId.c_str(), &portProcessing, point+QPoint(100,0));
- addPortConnection(processing, portIndex, getBox(processingId.c_str()), 0);
+ addPortConnection(processing, portIndex, getBox(processingId.c_str()), nInPort);
markAsChanged();
}
- void addLinkedProcessingSender( ProcessingBox * processing, QPoint point, const QString & processingType )
+ void addLinkedProcessingSender( ProcessingBox * processing, QPoint point, const QString & processingType, unsigned nOutPort=0 )
{
if (networkIsDummy()) return;
@@ -936,7 +936,7 @@
CLAM::Processing & portProcessing = _network->GetProcessing( processingId );
// add box to canvas and connect
addProcessingBox( processingId.c_str(), &portProcessing, point+QPoint(-200,0));
- addPortConnection(getBox(processingId.c_str()), 0, processing, portIndex);
+ addPortConnection(getBox(processingId.c_str()), nOutPort, processing, portIndex);
markAsChanged();
}
@@ -1280,6 +1280,18 @@
}
}
+ void onProcessingsConnectPorts()
+ {
+ QMap<QString, QVariant> receiveMap=((QAction*)sender())->data().toMap() ;
+ unsigned sourcePort = receiveMap["sourceport"].toUInt();
+ unsigned sourceNumber = receiveMap["sourceprocessing"].toUInt();
+ unsigned targetPort = receiveMap["targetport"].toUInt();
+ unsigned targetNumber = receiveMap["targetprocessing"].toUInt();
+ this->addPortConnection(_processings[sourceNumber],sourcePort,_processings[targetNumber],targetPort);
+ }
+
+
+
void onConfigure()
{
QPoint point = ((QAction*)sender())->data().toPoint();
@@ -1422,7 +1434,9 @@
menu->addSeparator();
CLAM::ProcessingFactory & factory = CLAM::ProcessingFactory::GetInstance();
unsigned portindex = _processings[i]->portIndexByYPos(translatedPos);
- Keys keys = factory.GetKeys("port_monitor_type", outportTypeId(_processings[i]->model(),portindex));
+ std::string outportType = outportTypeId(_processings[i]->model(),portindex);
+
+ Keys keys = factory.GetKeys("port_monitor_type", outportType);
for (Keys::const_iterator it=keys.begin(); it!=keys.end(); it++)
{
const char* key = it->c_str();
@@ -1430,7 +1444,7 @@
QIcon icon = QIcon( QString(":/icons/images/%1").arg(iconPath.c_str()) );
menu->addAction( icon, key, this, SLOT(onAddLinkedProcessing()))->setData(translatedPos);
}
- if ((outportTypeId(_processings[i]->model(),portindex))==("f")) // Check for audio type. TODO why "f"??
+ if (outportType==typeid(CLAM::TData).name()) // Check for audio port
{
menu->addSeparator();
const char* key="AudioSink";
@@ -1438,12 +1452,15 @@
QIcon icon = QIcon( QString(":/icons/images/%1").arg(iconPath.c_str()) );
menu->addAction( icon, key, this,SLOT(onAddLinkedProcessing()))->setData(translatedPos);
}
+
}
if (region==ProcessingBox::inportsRegion)
{
CLAM::ProcessingFactory & factory = CLAM::ProcessingFactory::GetInstance();
unsigned portindex = _processings[i]->portIndexByYPos(translatedPos);
- if ((inportTypeId(_processings[i]->model(),portindex))==("f")) // Check for audio type. TODO why "f"??
+ std::string inportType=inportTypeId(_processings[i]->model(),portindex);
+
+ if (inportType==typeid(CLAM::TData).name()) // Check for audio port
{
menu->addSeparator();
const char* key="AudioSource";
@@ -1452,6 +1469,92 @@
menu->addAction( icon, key, this ,SLOT(onAddLinkedProcessing()))->setData(translatedPos);
}
}
+ if (region==ProcessingBox::inportsRegion || region==ProcessingBox::outportsRegion)
+ {
+ CLAM::ProcessingFactory & factory = CLAM::ProcessingFactory::GetInstance();
+ // Pointers to functions
+ unsigned (ClamNetworkCanvas::*nTargetPorts) (void *);
+ QString (ClamNetworkCanvas::*targetPortName) (void *, unsigned) const;
+
+ unsigned counterTargetProcessings;
+ unsigned sourcePort=_processings[i]->portIndexByYPos(translatedPos);
+ unsigned targetPort;
+
+ // pointers to connection variables
+ unsigned * outProcessing;
+ unsigned * outPort;
+ unsigned * inProcessing;
+ unsigned * inPort;
+
+ if (region==ProcessingBox::outportsRegion)
+ {
+ nTargetPorts = &ClamNetworkCanvas::nInports;
+ targetPortName = &ClamNetworkCanvas::inportName;
+ outProcessing = &i;
+ outPort = &sourcePort;
+ inProcessing = &counterTargetProcessings;
+ inPort = &targetPort;
+ }
+ else
+ {
+ nTargetPorts = &ClamNetworkCanvas::nOutports;
+ targetPortName = &ClamNetworkCanvas::outportName;
+ outProcessing = &counterTargetProcessings;
+ outPort = &targetPort;
+ inProcessing = &i;
+ inPort = &sourcePort;
+ }
+
+ QMenu * submenu=NULL, * menuUsedProcessings=NULL;
+ std::string iconPath;
+ QIcon processingIcon;
+
+ for (counterTargetProcessings = 0; counterTargetProcessings<_processings.size(); counterTargetProcessings++ )
+ {
+ ProcessingBox * targetProcessing =_processings[counterTargetProcessings];
+ const char* targetClassName=((CLAM::Processing*)targetProcessing->model())->GetClassName();
+ //if (targetProcessing->getName()==_processings[i]->getName()) continue;
+ if (counterTargetProcessings==i) continue; // skip if it's the same processing
+ submenu=NULL;
+ processingIcon=QIcon();
+
+ for (targetPort=0; targetPort<(this->*nTargetPorts)(targetProcessing->model());targetPort++)
+ {
+ QString PortName=(this->*targetPortName)(targetProcessing->model(),targetPort);
+ if (canConnectPorts(_processings[*outProcessing], *outPort, _processings[*inProcessing], *inPort))
+ {
+ //secure method to get icon (to avoid segm. fault when the attribute doesn't exist):
+ CLAM::ProcessingFactory::Pairs pairsFromKey=factory.GetPairsFromKey(targetClassName);
+ CLAM::ProcessingFactory::Pairs::const_iterator itPairs;
+ iconPath="";
+ for (itPairs=pairsFromKey.begin();itPairs!=pairsFromKey.end();itPairs++)
+ {
+ if(itPairs->attribute=="icon")
+ {
+ iconPath=itPairs->value;
+ processingIcon = QIcon( QString(":/icons/images/%1").arg(iconPath.c_str()));
+ break;
+ }
+ }
+ if (!submenu)
+ {
+ if (!menuUsedProcessings)
+ {
+ menu->addSeparator();
+ menuUsedProcessings = menu->addMenu("Connect to");
+ }
+ submenu=menuUsedProcessings->addMenu(processingIcon,targetProcessing->getName());
+ }
+ QMap<QString, QVariant> sendMap;
+ sendMap["sourceport"]=*outPort;
+ sendMap["sourceprocessing"]=*outProcessing;
+ sendMap["targetprocessing"]=*inProcessing;
+ sendMap["targetport"]=*inPort;
+ submenu->addAction(PortName, this,SLOT(onProcessingsConnectPorts()))->setData(sendMap);
+ }
+ }
+ }
+ }
return;
}
if (region==ProcessingBox::nameRegion ||
Index: NetworkEditor/src/NetworkCanvas.hxx
===================================================================
--- NetworkEditor/src/NetworkCanvas.hxx (revision 11424)
+++ NetworkEditor/src/NetworkCanvas.hxx (working copy)
@@ -1280,6 +1280,33 @@
}
}
+
+ void onCopyToClipboard()
+ {
+ QPoint point = ((QAction*)sender())->data().toPoint();
+ QString processingsToCopy;
+ QString checkString="ProcessingsOnClipboard";
+ for (unsigned i = _processings.size(); i--; )
+ {
+ ProcessingBox::Region region = _processings[i]->getRegion(point);
+ if ((region == ProcessingBox::noRegion)&&(!_processings[i]->isSelected())) continue;
+ CLAM::Processing * processing =(CLAM::Processing *) _processings[i]->model();
+ processingsToCopy.append(tr("%1.").arg(processing->GetClassName()));
+ }
+ processingsToCopy.append(checkString);
+ QApplication::clipboard()->setText(processingsToCopy);
+ }
+ void onPasteFromClipboard()
+ {
+ QString checkString=".ProcessingsOnClipboard";
+ QPoint point=((QAction*)sender())->data().toPoint();
+ QString text=QApplication::clipboard()->text();
+ if (!text.endsWith(checkString)) return;
+ QStringList processingsList = text.split(".");
+ for (int i=0;i<processingsList.size()-1;i++, point+=QPoint(100,100))
+ addProcessing(point,processingsList[i]);
+ }
+
void onConfigure()
{
QPoint point = ((QAction*)sender())->data().toPoint();
@@ -1464,11 +1491,16 @@
this, SLOT(onRename()))->setData(translatedPos);
menu->addAction(QIcon(":/icons/images/editdelete.png"), "Remove",
this, SLOT(onDeleteProcessing()))->setData(translatedPos);
+ menu->addAction("Copy to clipboard",
+ this, SLOT(onCopyToClipboard()))->setData(translatedPos);
+
return;
}
}
menu->addAction(QIcon(":/icons/images/newprocessing.png"), "Add processing",
this, SLOT(onNewProcessing()))->setData(translatedPos);
+ menu->addAction("Paste Processing From Clipboard",
+ this, SLOT (onPasteFromClipboard()))->setData(translatedPos);
}
protected:
_______________________________________________
Clam-devel mailing list
[email protected]
https://llistes.projectes.lafarga.org/cgi-bin/mailman/listinfo/clam-devel