Here is a new version with some suggestions made by David.
Regards,
Natanael.
El 06/07/2008 03:28 AM, Natanael Olaiz escribió:
Grrr... :)
This is.
(sorry)
El 06/07/2008 03:22 AM, Natanael Olaiz escribió:
Emmmm... I forgot the shortcut action for the cuts...
El 06/07/2008 03:16 AM, Natanael Olaiz escribió:
A corrected version of the patch (previously I putted the actions
for copying on NetworkCanvas, with only an implementation on
ClamNetworkCanvas).
Plus, I extended the copy functionality to a new "cut" clearly than
my previous suggestion (all just in the canvas).
Regards,
Natanael.
Index: NetworkEditor/src/NetworkCanvas.hxx
===================================================================
--- NetworkEditor/src/NetworkCanvas.hxx (revision 11454)
+++ NetworkEditor/src/NetworkCanvas.hxx (working copy)
@@ -25,6 +25,7 @@
#include <vector>
#include <algorithm>
#include <CLAM/Assert.hxx>
+#include <CLAM/XMLStorage.hxx>
class NetworkCanvas : public QWidget
{
@@ -794,6 +795,21 @@
_newProcessingAction->setShortcut(QKeySequence(tr("Ctrl+Space")));
addAction(_newProcessingAction);
connect(_newProcessingAction, SIGNAL(triggered()), this, SLOT(onNewProcessing()));
+
+ _copySelectionAction = new QAction("Copy Selection", this);
+ _copySelectionAction->setShortcut(QKeySequence(tr("Ctrl+C")));
+ addAction(_copySelectionAction);
+ connect(_copySelectionAction, SIGNAL(triggered()), this, SLOT (onCopyProcessingsToClipboard()));
+
+ _cutSelectionAction = new QAction("Cut Selection", this);
+ _cutSelectionAction->setShortcut(QKeySequence(tr("Ctrl+X")));
+ addAction(_cutSelectionAction);
+ connect(_cutSelectionAction, SIGNAL(triggered()), this, SLOT (onCutProcessingsToClipboard()));
+
+ _pasteSelectionAction = new QAction("Paste Selection", this);
+ _pasteSelectionAction->setShortcut(QKeySequence(tr("Ctrl+V")));
+ addAction(_pasteSelectionAction);
+ connect(_pasteSelectionAction, SIGNAL(triggered()), this, SLOT (onPasteProcessingsFromClipboard()));
}
CLAM::Network & network()
{
@@ -1115,6 +1131,22 @@
refreshWires();
}
+
+ void reloadNetwork()
+ {
+ if (networkIsDummy()) return;
+ CLAM::Network::ProcessingsMap::const_iterator it;
+ for (it=_network->BeginProcessings(); it!=_network->EndProcessings(); it++)
+ {
+ const std::string & name = it->first;
+ if (getBox(QString(name.c_str())))
+ continue; // if the processing exists in canvas, skip it
+ CLAM::Processing * processing = it->second;
+ addProcessingBox( name.c_str(), processing );
+ }
+ refreshWires();
+ }
+
void refreshWires()
{
clearWires();
@@ -1244,6 +1276,64 @@
return;
}
}
+
+ void onCopyProcessingsToClipboard(bool cut=false)
+ {
+ std::ostringstream streamXMLBuffer;
+ CLAM::Network::NamesList processingsNamesList;
+ // Copy selected (/active) processings on networkToCopy
+ for (unsigned i=0; i<_processings.size();i++)
+ {
+ if (!_processings[i]->isSelected())
+ continue;
+ const std::string name=(_processings[i]->getName()).toStdString();
+ processingsNamesList.push_back(name);
+ }
+ if (_network->UpdateSelections(processingsNamesList))
+ return;
+ CLAM::XmlStorage::Dump(*_network,"network",streamXMLBuffer);
+
+ QApplication::clipboard()->setText(QString(streamXMLBuffer.str().c_str()));
+ if (!cut) return;
+
+ CLAM::Network::NamesList::iterator cuttedNamesIterator;
+ for(cuttedNamesIterator=processingsNamesList.begin();
+ cuttedNamesIterator!=processingsNamesList.end();
+ cuttedNamesIterator++)
+ {
+ removeProcessing(getBox(QString((*cuttedNamesIterator).c_str())));
+ }
+ }
+
+ void onCutProcessingsToClipboard()
+ {
+ onCopyProcessingsToClipboard(true);
+ }
+
+ void onPasteProcessingsFromClipboard()
+ {
+ QPoint point = ((QAction*)sender())->data().toPoint();
+ QString text=QApplication::clipboard()->text();
+ std::stringstream streamXMLBuffer;
+ streamXMLBuffer << text.toStdString();
+ CLAM::Network networkToPaste;
+
+ try
+ {
+ _network->setPasteMode();
+ CLAM::XMLStorage::Restore(*_network, streamXMLBuffer);
+ }
+ catch(CLAM::XmlStorageErr &e)
+ {
+ QMessageBox::critical(this, tr("Error trying to paste from clipboard"),
+ tr("<p>An occurred while loading clipboard.<p>"
+ "<p><b>%1</b></p>").arg(e.what()));
+ return;
+ }
+ reloadNetwork();
+ }
+
+
void onAddSlider()
{
QPoint point = ((QAction*)sender())->data().toPoint();
@@ -1587,15 +1677,23 @@
this, SLOT(onRename()))->setData(translatedPos);
menu->addAction(QIcon(":/icons/images/editdelete.png"), "Remove",
this, SLOT(onDeleteProcessing()))->setData(translatedPos);
+ menu->addSeparator();
+ menu->addAction("Copy processing(s)", this, SLOT(onCopyProcessingsToClipboard()));
+ menu->addAction("Cut processing(s)", this, SLOT(onCutProcessingsToClipboard()));
return;
}
}
menu->addAction(QIcon(":/icons/images/newprocessing.png"), "Add processing",
this, SLOT(onNewProcessing()))->setData(translatedPos);
+ menu->addAction("Paste processing(s)",
+ this,SLOT(onPasteProcessingsFromClipboard()))->setData(translatedPos);
}
protected:
QAction * _newProcessingAction;
+ QAction * _copySelectionAction;
+ QAction * _cutSelectionAction;
+ QAction * _pasteSelectionAction;
private:
CLAM::Network * _network;
};
Index: CLAM/src/Flow/Networks/Network.cxx
===================================================================
--- CLAM/src/Flow/Networks/Network.cxx (revision 11454)
+++ CLAM/src/Flow/Networks/Network.cxx (working copy)
@@ -37,7 +37,8 @@
Network::Network() :
_name("Unnamed Network"),
_flowControl(new NaiveFlowControl),
- _player(0)
+ _player(0),
+ _setPasteMode(false)
{}
Network::~Network()
@@ -57,7 +58,10 @@
for(it=BeginProcessings();it!=EndProcessings();it++)
{
Processing * proc = it->second;
- ProcessingDefinitionAdapter procDefinition(proc, it->first);
+ const std::string & name = it->first;
+ if (!ifHasSelectionAndContains(name))
+ continue;
+ ProcessingDefinitionAdapter procDefinition(proc, name);
XMLComponentAdapter xmlAdapter(procDefinition, "processing", true);
storage.Store(xmlAdapter);
}
@@ -70,6 +74,10 @@
{
const std::string & name = it->first;
Processing * proc = it->second;
+
+ if (!ifHasSelectionAndContains(name))
+ continue;
+
OutPortRegistry::Iterator itOutPort;
for (itOutPort=proc->GetOutPorts().Begin();
itOutPort!=proc->GetOutPorts().End();
@@ -85,6 +93,8 @@
namesIterator!=namesInPorts.end();
namesIterator++)
{
+ if (!ifHasSelectionAndContains(GetProcessingIdentifier(*namesIterator)))
+ continue;
ConnectionDefinitionAdapter connectionDefinition( outPortName, *namesIterator );
XMLComponentAdapter xmlAdapter(connectionDefinition, "port_connection", true);
storage.Store(xmlAdapter);
@@ -96,6 +106,10 @@
{
const std::string & name = it->first;
Processing * proc = it->second;
+
+ if (!ifHasSelectionAndContains(name))
+ continue;
+
OutControlRegistry::Iterator itOutControl;
for (itOutControl=proc->GetOutControls().Begin();
itOutControl!=proc->GetOutControls().End();
@@ -108,17 +122,22 @@
namesIterator!=namesInControls.end();
namesIterator++)
{
+ if (!ifHasSelectionAndContains(GetProcessingIdentifier(*namesIterator)))
+ continue;
ConnectionDefinitionAdapter connectionDefinition( outControlName, *namesIterator );
XMLComponentAdapter xmlAdapter(connectionDefinition, "control_connection", true);
storage.Store(xmlAdapter);
}
}
}
+ _selectedProcessings.clear();
}
void Network::LoadFrom( Storage & storage)
{
- Clear();
+ typedef std::map <std::string, std::string> changeProcNames;
+ changeProcNames newProcNames;
+ if (!_setPasteMode) Clear();
XMLAdapter<std::string> strAdapter( _name, "id");
storage.Load(strAdapter);
@@ -128,7 +147,18 @@
XMLComponentAdapter xmlAdapter(procDefinition, "processing", true);
if(storage.Load(xmlAdapter) == false) break;
- AddProcessing(procDefinition.GetName(), procDefinition.GetProcessing());
+ if (!_setPasteMode)
+ AddProcessing(procDefinition.GetName(), procDefinition.GetProcessing());
+ else
+ {
+ const std::string & name = procDefinition.GetName();
+ CLAM::Processing * processing =procDefinition.GetProcessing();
+ std::string key=processing->GetClassName();
+ std::string newName= AddProcessing(key);
+ CLAM::Processing & newProcessing = GetProcessing(newName);
+ newProcessing.Configure(processing->GetConfig());
+ newProcNames.insert(changeProcNames::value_type(name,newName));
+ }
}
while(1)
@@ -140,7 +170,17 @@
const std::string & fullIn = connectionDefinition.GetInName();
try
{
- ConnectPorts( fullOut, fullIn );
+ if (!_setPasteMode)
+ ConnectPorts( fullOut, fullIn );
+ else
+ {
+ const std::string newNameOut = newProcNames.find(GetProcessingIdentifier(fullOut))->second
+ +"."+GetConnectorIdentifier(fullOut);
+ const std::string newNameIn = newProcNames.find(GetProcessingIdentifier(fullIn))->second
+ +"."+GetConnectorIdentifier(fullIn);
+ ConnectPorts( newNameOut, newNameIn );
+ }
+
}
catch (Err & e) { throw XmlStorageErr(e.what()); }
}
@@ -152,15 +192,46 @@
if (!storage.Load(xmlAdapter)) break;
const std::string & fullOut = connectionDefinition.GetOutName();
const std::string & fullIn = connectionDefinition.GetInName();
- try
+ try
{
- ConnectControls( fullOut, fullIn );
+ if (!_setPasteMode)
+ ConnectControls( fullOut, fullIn );
+ else
+ {
+ const std::string newNameOut = newProcNames.find(GetProcessingIdentifier(fullOut))->second
+ +"."+GetConnectorIdentifier(fullOut);
+ const std::string newNameIn = newProcNames.find(GetProcessingIdentifier(fullIn))->second
+ +"."+GetConnectorIdentifier(fullIn);
+ ConnectControls( newNameOut, newNameIn );
+ }
}
catch (Err & e) { throw XmlStorageErr(e.what()); }
}
+ _setPasteMode=false;
+ }
+ bool Network::UpdateSelections (const NamesList & processingsNamesList)
+ {
+ NamesList::const_iterator namesIterator;
+ if (!_selectedProcessings.empty() || processingsNamesList.empty())
+ {
+ _selectedProcessings.clear();
+ return 1;
+ }
+ for (namesIterator=processingsNamesList.begin();namesIterator!=processingsNamesList.end();namesIterator++)
+ _selectedProcessings.insert(*namesIterator);
+ return 0;
+
}
+ bool Network::ifHasSelectionAndContains(const std::string & name) const
+ {
+ NamesSet::const_iterator itFindSelected = _selectedProcessings.find(name);
+ if (!_selectedProcessings.empty() && itFindSelected==_selectedProcessings.end())
+ return 0;
+ return 1;
+ }
+
void Network::AddFlowControl(FlowControl* flowControl)
{
if (_flowControl) delete _flowControl;
Index: CLAM/src/Flow/Networks/Network.hxx
===================================================================
--- CLAM/src/Flow/Networks/Network.hxx (revision 11454)
+++ CLAM/src/Flow/Networks/Network.hxx (working copy)
@@ -32,6 +32,7 @@
#include <string>
#include <list>
#include <map>
+#include <set>
#include "Component.hxx"
#include "Storage.hxx"
@@ -75,6 +76,10 @@
virtual void StoreOn( Storage & storage) const;
virtual void LoadFrom( Storage & storage);
+ // methods related to copy&paste processings from canvas
+ bool UpdateSelections (const NamesList & processingsNamesList);
+ void setPasteMode() { _setPasteMode=true; }
+
// methods related to connect/disconnect interface
bool ConnectPorts( const std::string &, const std::string & );
bool ConnectControls( const std::string &, const std::string & );
@@ -158,6 +163,14 @@
static char NamesIdentifiersSeparator();
FlowControl* _flowControl;
NetworkPlayer* _player;
+
+ // attributes for canvas copy & paste
+ typedef std::set<std::string> NamesSet;
+ mutable NamesSet _selectedProcessings;
+ bool _setPasteMode;
+
+ bool ifHasSelectionAndContains(const std::string & name) const;
+
};
}// namespace
_______________________________________________
Clam-devel mailing list
[email protected]
https://llistes.projectes.lafarga.org/cgi-bin/mailman/listinfo/clam-devel