From 89558cc7cec3871020dfe2e84cb4a5d87e362864 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Mon, 8 Oct 2007 06:43:46 +0000 Subject: Adding profile manager and user-visible drop-down in CMS picker (bzr r3862) --- src/profile-manager.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/profile-manager.cpp (limited to 'src/profile-manager.cpp') diff --git a/src/profile-manager.cpp b/src/profile-manager.cpp new file mode 100644 index 000000000..c2d344629 --- /dev/null +++ b/src/profile-manager.cpp @@ -0,0 +1,78 @@ +/* + * Inkscape::ProfileManager - a view of a document's color profiles. + * + * Copyright 2007 Jon A. Cruz + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include + +#include "profile-manager.h" +#include "document.h" + +namespace Inkscape { + +ProfileManager::ProfileManager(SPDocument *document) : + _doc(document), + _knownProfiles() +{ + _resource_connection = sp_document_resources_changed_connect( _doc, "iccprofile", sigc::mem_fun(*this, &ProfileManager::_resourcesChanged) ); +} + +ProfileManager::~ProfileManager() +{ +} + +void ProfileManager::_resourcesChanged() +{ + std::vector newList; + const GSList *current = sp_document_get_resource_list( _doc, "iccprofile" ); + while ( current ) { + newList.push_back(SP_OBJECT(current->data)); + current = g_slist_next(current); + } + sort( newList.begin(), newList.end() ); + + std::vector diff1; + std::set_difference( _knownProfiles.begin(), _knownProfiles.end(), newList.begin(), newList.end(), + std::insert_iterator >(diff1, diff1.begin()) ); + + std::vector diff2; + std::set_difference( newList.begin(), newList.end(), _knownProfiles.begin(), _knownProfiles.end(), + std::insert_iterator >(diff2, diff2.begin()) ); + + if ( !diff1.empty() ) { + for ( std::vector::iterator it = diff1.begin(); it < diff1.end(); ++it ) { + SPObject* tmp = *it; + _knownProfiles.erase( remove(_knownProfiles.begin(), _knownProfiles.end(), tmp), _knownProfiles.end() ); + if ( includes(tmp) ) { + _removeOne(tmp); + } + } + } + + if ( !diff2.empty() ) { + for ( std::vector::iterator it = diff2.begin(); it < diff2.end(); ++it ) { + SPObject* tmp = *it; + _knownProfiles.push_back(tmp); + _addOne(tmp); + } + sort( _knownProfiles.begin(), _knownProfiles.end() ); + } +} + + +} + + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : -- cgit v1.2.3