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

Reply via email to