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()));
+
+		_copySelectionAction = new QAction("Cut Selection", this);
+		_copySelectionAction->setShortcut(QKeySequence(tr("Ctrl+X")));
+		addAction(_copySelectionAction);
+		connect(_copySelectionAction, 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,67 @@
 			return;
 		}
 	}
+
+	void onCopyProcessingsToClipboard(bool cut=false)
+	{
+		std::ostringstream streamXMLBuffer;
+		QPoint point = ((QAction*)sender())->data().toPoint();
+
+		CLAM::Network::NamesList processingsNamesList;
+		// Copy selected (/active) processings on networkToCopy
+		for (unsigned i=0; i<_processings.size();i++)
+		{
+			ProcessingBox::Region region = _processings[i]->getRegion(point);
+			if ( (region==ProcessingBox::noRegion) && (!_processings[i]->isSelected()) )
+				continue;
+			const std::string name=(_processings[i]->getName()).toStdString();
+			processingsNamesList.push_back(name);
+		}
+		_network->UpdateSelections(processingsNamesList);
+		CLAM::XmlStorage::Dump(*_network,"network",streamXMLBuffer);
+		_network->ClearSelections();
+		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);
+			_network->unSetPasteMode();
+		}
+		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 +1680,21 @@
 					this, SLOT(onRename()))->setData(translatedPos);
 				menu->addAction(QIcon(":/icons/images/editdelete.png"), "Remove",
 				this, SLOT(onDeleteProcessing()))->setData(translatedPos);
+				menu->addAction("Copy processing(s)", this, SLOT(onCopyProcessingsToClipboard()))->setData(translatedPos);
+				menu->addAction("Cut processing(s)", this, SLOT(onCutProcessingsToClipboard()))->setData(translatedPos);
 				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,11 @@
 		for(it=BeginProcessings();it!=EndProcessings();it++)
 		{
 			Processing * proc = it->second;
-			ProcessingDefinitionAdapter procDefinition(proc, it->first);
+			const std::string & name = it->first;
+			ProcessingsSet::const_iterator itFindSelected = _selectedProcessings.find(name);
+			if (!_selectedProcessings.empty() && itFindSelected==_selectedProcessings.end())
+				continue; // if there are selected processings and the actual isn't, skip
+			ProcessingDefinitionAdapter procDefinition(proc, name);
 			XMLComponentAdapter xmlAdapter(procDefinition, "processing", true);
 			storage.Store(xmlAdapter);
 		}
@@ -70,6 +75,11 @@
 		{
 			const std::string & name = it->first;
 			Processing * proc = it->second;
+
+			ProcessingsSet::const_iterator itFindSelected = _selectedProcessings.find(name);
+			if (!_selectedProcessings.empty() && itFindSelected==_selectedProcessings.end())
+				continue; // if there are selected processings and the actual isn't, skip
+
 			OutPortRegistry::Iterator itOutPort;
 			for (itOutPort=proc->GetOutPorts().Begin(); 
 			     itOutPort!=proc->GetOutPorts().End(); 
@@ -85,6 +95,9 @@
 				    namesIterator!=namesInPorts.end();
 				    namesIterator++)
 				{
+					ProcessingsSet::const_iterator itFindSelected = _selectedProcessings.find(GetProcessingIdentifier(*namesIterator));
+					if (!_selectedProcessings.empty() && itFindSelected==_selectedProcessings.end())
+						continue; // if there are selected processings and the actual isn't, skip
 					ConnectionDefinitionAdapter connectionDefinition( outPortName, *namesIterator );
 					XMLComponentAdapter xmlAdapter(connectionDefinition, "port_connection", true);
 					storage.Store(xmlAdapter);
@@ -96,6 +109,11 @@
 		{
 			const std::string & name = it->first;
 			Processing * proc = it->second;
+
+			ProcessingsSet::const_iterator itFindSelected = _selectedProcessings.find(name);
+			if (!_selectedProcessings.empty() && itFindSelected==_selectedProcessings.end())
+				continue; // if there are selected processings and the actual isn't, skip
+
 			OutControlRegistry::Iterator itOutControl;
 			for (itOutControl=proc->GetOutControls().Begin(); 
 			     itOutControl!=proc->GetOutControls().End(); 
@@ -108,6 +126,9 @@
 				    namesIterator!=namesInControls.end();
 				    namesIterator++)
 				{
+					ProcessingsSet::const_iterator itFindSelected = _selectedProcessings.find(GetProcessingIdentifier(*namesIterator));
+					if (!_selectedProcessings.empty() && itFindSelected==_selectedProcessings.end())
+						continue; // if there are selected processings and the actual isn't, skip		
 					ConnectionDefinitionAdapter connectionDefinition( outControlName, *namesIterator );
 					XMLComponentAdapter xmlAdapter(connectionDefinition, "control_connection", true);
 					storage.Store(xmlAdapter);
@@ -118,7 +139,9 @@
 
 	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 +151,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 * procnew = &GetProcessing(newname);
+				//procnew->Configure(processing->GetConfig());
+				newProcNames.insert(changeProcNames::value_type(name,newname));
+			}
 		}
 
 		while(1)
@@ -140,7 +174,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 +196,42 @@
 			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()); }
 		}
 
 	}
 
+	bool Network::UpdateSelections (const NamesList & processingsNamesList)
+	{
+		NamesList::const_iterator namesIterator;
+		if (!_selectedProcessings.empty() || processingsNamesList.empty())
+			return 1;
+		for (namesIterator=processingsNamesList.begin();namesIterator!=processingsNamesList.end();namesIterator++)
+		{
+			_selectedProcessings.insert(*namesIterator);
+		}
+		return 0;
+		
+	}
+	void Network::ClearSelections ()
+	{
+		_selectedProcessings.clear();
+	}
+
+
 	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,13 @@
 	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 ClearSelections ();
+	void setPasteMode() { _setPasteMode=true; }
+	void unSetPasteMode() { _setPasteMode=false; }
+	bool getPasteMode() { return _setPasteMode; }
+
 	// methods related to connect/disconnect interface
 	bool ConnectPorts( const std::string &, const std::string & );
 	bool ConnectControls( const std::string &, const std::string & );
@@ -158,6 +166,12 @@
 	static char NamesIdentifiersSeparator();
 	FlowControl* _flowControl;
 	NetworkPlayer* _player;
+	
+	// attributes for canvas copy & paste
+	typedef std::set<std::string> ProcessingsSet;
+	ProcessingsSet _selectedProcessings;
+	bool _setPasteMode;
+
 };
 
 }// namespace
_______________________________________________
Clam-devel mailing list
[email protected]
https://llistes.projectes.lafarga.org/cgi-bin/mailman/listinfo/clam-devel

Reply via email to