/**************************************************************************** ** $Id: rs_layerlist.cpp 1938 2004-12-09 23:09:53Z andrew $ ** ** Copyright (C) 2001-2003 RibbonSoft. All rights reserved. ** ** This file is part of the qcadlib Library project. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** Licensees holding valid qcadlib Professional Edition licenses may use ** this file in accordance with the qcadlib Commercial License ** Agreement provided with the Software. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.ribbonsoft.com for further details. ** ** Contact info@ribbonsoft.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "rs_layerlist.h" /** * Default constructor. */ RS_LayerList::RS_LayerList() { layers.setAutoDelete(false); layerListListeners.setAutoDelete(false); activeLayer = NULL; setModified(false); } /** * Removes all layers in the layerlist. */ void RS_LayerList::clear() { layers.clear(); setModified(true); } /** * Activates the given layer. * * @param notify Notify listeners. */ void RS_LayerList::activate(const RS_String& name, bool notify) { RS_DEBUG->print("RS_LayerList::activate: %s, notify: %d begin", name.latin1(), notify); activate(find(name), notify); /* if (activeLayer==NULL) { RS_DEBUG->print("activeLayer is NULL"); } else { RS_DEBUG->print("activeLayer is %s", activeLayer->getName().latin1()); } */ RS_DEBUG->print("RS_LayerList::activate: %s end", name.latin1()); } /** * Activates the given layer. * * @param notify Notify listeners. */ void RS_LayerList::activate(RS_Layer* layer, bool notify) { RS_DEBUG->print("RS_LayerList::activate notify: %d begin", notify); /*if (layer!=NULL) { RS_DEBUG->print("RS_LayerList::activate: %s", layer->getName().latin1()); } else { RS_DEBUG->print("RS_LayerList::activate: NULL"); }*/ activeLayer = layer; if (notify) { for (uint i=0; ilayerActivated(activeLayer); RS_DEBUG->print("RS_LayerList::activate listener notified"); } } RS_DEBUG->print("RS_LayerList::activate end"); } /** * Adds a layer to the layer list. * If there is already a layer with the same name, no layer is * added. In that case the layer passed to the methode will be deleted! * If no layer was active so far, the new layer becomes the active one. * * Listeners are notified. */ void RS_LayerList::add(RS_Layer* layer) { RS_DEBUG->print("RS_LayerList::addLayer()"); if (layer==NULL) { return; } // check if layer already exists: RS_Layer* l = find(layer->getName()); if (l==NULL) { layers.append(layer); // notify listeners for (uint i=0; ilayerAdded(layer); } setModified(true); // if there was no active layer so far, activate this one. if (activeLayer==NULL) { activate(layer); } } else { // if there was no active layer so far, activate this one. if (activeLayer==NULL) { activate(l); } l->setPen(layer->getPen()); delete layer; layer = NULL; } } /** * Removes a layer from the list. * Listeners are notified after the layer was removed from * the list but before it gets deleted. */ void RS_LayerList::remove(RS_Layer* layer) { RS_DEBUG->print("RS_LayerList::removeLayer()"); if (layer==NULL) { return; } // here the layer is removed from the list but not deleted layers.remove(layer); for (uint i=0; ilayerRemoved(layer); } setModified(true); // activate an other layer if necessary: if (activeLayer==layer) { activate(layers.first()); } // now it's save to delete the layer delete layer; } /** * Changes a layer's attributes. The attributes of layer 'layer' * are copied from layer 'source'. * Listeners are notified. */ void RS_LayerList::edit(RS_Layer* layer, const RS_Layer& source) { if (layer==NULL) { return; } *layer = source; for (uint i=0; ilayerEdited(layer); } setModified(true); } /** * @return Pointer to the layer with the given name or * \p NULL if no such layer was found. */ RS_Layer* RS_LayerList::find(const RS_String& name) { //RS_DEBUG->print("RS_LayerList::find begin"); RS_Layer* ret = NULL; for (RS_Layer* l=layers.first(); l!=NULL; l=layers.next()) { if (l->getName()==name) { ret = l; } } //RS_DEBUG->print("RS_LayerList::find end"); return ret; } /** * @return Index of the given layer in the layer list or -1 if the layer * was not found. */ int RS_LayerList::getIndex(const RS_String& name) { //RS_DEBUG->print("RS_LayerList::find begin"); int ret = -1; int i = 0; for (RS_Layer* l=layers.first(); l!=NULL; l=layers.next()) { if (l->getName()==name) { ret = i; break; } i++; } //RS_DEBUG->print("RS_LayerList::find end"); return ret; } /** * @return Index of the given layer in the layer list or -1 if the layer * was not found. */ int RS_LayerList::getIndex(RS_Layer* layer) { //RS_DEBUG->print("RS_LayerList::find begin"); int ret = -1; int i = 0; for (RS_Layer* l=layers.first(); l!=NULL; l=layers.next()) { if (l==layer) { ret = i; break; } i++; } //RS_DEBUG->print("RS_LayerList::find end"); return ret; } /** * Switches on / off the given layer. * Listeners are notified. */ void RS_LayerList::toggle(const RS_String& name) { toggle(find(name)); } /** * Switches on / off the given layer. * Listeners are notified. */ void RS_LayerList::toggle(RS_Layer* layer) { if (layer==NULL) { return; } layer->toggle(); // Notify listeners: for (uint i=0; ilayerToggled(layer); } } /** * Locks or unlocks the given layer. * Listeners are notified. */ void RS_LayerList::toggleLock(RS_Layer* layer) { if (layer==NULL) { return; } layer->toggleLock(); // Notify listeners: for (uint i=0; ilayerToggled(layer); } } /** * Freezes or defreezes all layers. * * @param freeze true: freeze, false: defreeze */ void RS_LayerList::freezeAll(bool freeze) { for (uint l=0; lfreeze(freeze); } for (uint i=0; ilayerToggled(NULL); } } /** * adds a LayerListListener to the list of listeners. Listeners * are notified when the layer list changes. * * Typical listeners are: layer list widgets, pen toolbar, graphic view */ void RS_LayerList::addListener(RS_LayerListListener* listener) { layerListListeners.append(listener); } /** * removes a LayerListListener from the list of listeners. */ void RS_LayerList::removeListener(RS_LayerListListener* listener) { layerListListeners.remove(listener); } /** * Dumps the layers to stdout. */ std::ostream& operator << (std::ostream& os, RS_LayerList& l) { os << "Layerlist: \n"; for (uint i=0; i