/***************************************************************************
 *   Copyright (C) 2004 by David Saxton                                    *
 *   david@bluehaze.org                                                    *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 ***************************************************************************/

#ifndef SUBCIRCUITS_H
#define SUBCIRCUITS_H

#include <QObject>

class CircuitDocument;
class ECSubcircuit;
class Subcircuits;
inline Subcircuits *subcircuits();

/**
Interface for dealing with loading / saving / etc of subcircuits
@author David Saxton
*/
class Subcircuits : public QObject
{
Q_OBJECT
public:
	~Subcircuits() override;
	/**
	 * Handles subcircuit creation when the user selects the subcircuit to be
	 * created.
	 * @param id Id of subcircuit; e.g. "sc/10"
	 */
	static ECSubcircuit* createSubcircuit( int id, CircuitDocument *circuitDocument, bool newItem, const char *newId );
	/**
	 * Loads a subcircuit into a subcircuit component
	 */
	static void initECSubcircuit( int subcircuitId, ECSubcircuit *ecSubcircuit );
	/**
	 * Reads in the config entries and adds the subcircuits found to the
	 * component selector
	 */
	static void loadSubcircuits();
	/**
	 * Saves the given subcircuit to the appdata dir, updates the appropriate
	 * config entries, and adds the subcircuit to the component selector.
	 */
	static void addSubcircuit( const QString &name, const QString &subcircuitXml );
	/**
	 * returns a path to the appdata dir, e.g. genFileName(2) might return
	 * ~/.kde/share/apps/ktechlab/subcircuit_2.circuit
	 */
	static QString genFileName( const int nextId );
	/**
	 * Adds the given entry to the component selector
	 */
	static void updateComponentSelector( int id, const QString &name );
	
protected slots:
	void slotItemRemoved( const QString &id );
	
private:
	Subcircuits();
	
	friend Subcircuits* subcircuits();
};


inline Subcircuits* subcircuits()
{
	static Subcircuits *_subcircuits = new Subcircuits();
	return _subcircuits;
}

#endif
