summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorJon A. Cruz <jon@joncruz.org>2014-03-02 20:36:19 +0000
committerJon A. Cruz <jon@joncruz.org>2014-03-02 20:36:19 +0000
commit8121aa1985103b201ee846de9b3a3669b66d183b (patch)
tree3d0bd58d24b4be31363253257e6ed0de598d7f6d /src/ui
parentAdding destroy signal do document to allow proper cleanup. (diff)
downloadinkscape-8121aa1985103b201ee846de9b3a3669b66d183b.tar.gz
inkscape-8121aa1985103b201ee846de9b3a3669b66d183b.zip
Stop tracking SPDocuments as they are deleted.
(bzr r13095)
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/dialog/swatches.cpp103
-rw-r--r--src/ui/dialog/swatches.h2
2 files changed, 75 insertions, 30 deletions
diff --git a/src/ui/dialog/swatches.cpp b/src/ui/dialog/swatches.cpp
index 807618b4d..5e77a28ab 100644
--- a/src/ui/dialog/swatches.cpp
+++ b/src/ui/dialog/swatches.cpp
@@ -745,10 +745,11 @@ void SwatchesPanel::setDesktop( SPDesktop* desktop )
class DocTrack
{
public:
- DocTrack(SPDocument *doc, sigc::connection &gradientRsrcChanged, sigc::connection &defsChanged, sigc::connection &defsModified) :
- doc(doc->doRef()),
+ DocTrack(SPDocument *doc, sigc::connection &docDestroy, sigc::connection &gradientRsrcChanged, sigc::connection &defsChanged, sigc::connection &defsModified) :
+ doc(doc),
updatePending(false),
lastGradientUpdate(0.0),
+ docDestroy(docDestroy),
gradientRsrcChanged(gradientRsrcChanged),
defsChanged(defsChanged),
defsModified(defsModified)
@@ -773,10 +774,10 @@ public:
}
}
if (doc) {
+ docDestroy.disconnect();
gradientRsrcChanged.disconnect();
defsChanged.disconnect();
defsModified.disconnect();
- doc->doUnref();
doc = NULL;
}
}
@@ -797,6 +798,7 @@ public:
SPDocument *doc;
bool updatePending;
double lastGradientUpdate;
+ sigc::connection docDestroy;
sigc::connection gradientRsrcChanged;
sigc::connection defsChanged;
sigc::connection defsModified;
@@ -892,11 +894,12 @@ void SwatchesPanel::_trackDocument( SwatchesPanel *panel, SPDocument *document )
}
docPerPanel[panel] = document;
if (!found) {
+ sigc::connection conn0 = document->connectDestroy(sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleDocumentDestroy), document));
sigc::connection conn1 = document->connectResourcesChanged( "gradient", sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleGradientsChange), document) );
sigc::connection conn2 = document->getDefs()->connectRelease( sigc::hide(sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleDefsModified), document)) );
sigc::connection conn3 = document->getDefs()->connectModified( sigc::hide(sigc::hide(sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleDefsModified), document))) );
- DocTrack *dt = new DocTrack(document, conn1, conn2, conn3);
+ DocTrack *dt = new DocTrack(document, conn0, conn1, conn2, conn3);
docTrackings.push_back(dt);
if (docPalettes.find(document) == docPalettes.end()) {
@@ -925,11 +928,13 @@ static void recalcSwatchContents(SPDocument* doc,
{
std::vector<SPGradient*> newList;
- const GSList *gradients = doc->getResourceList("gradient");
- for (const GSList *item = gradients; item; item = item->next) {
- SPGradient* grad = SP_GRADIENT(item->data);
- if ( grad->isSwatch() ) {
- newList.push_back(SP_GRADIENT(item->data));
+ if (doc) {
+ const GSList *gradients = doc->getResourceList("gradient");
+ for (const GSList *item = gradients; item; item = item->next) {
+ SPGradient* grad = SP_GRADIENT(item->data);
+ if ( grad->isSwatch() ) {
+ newList.push_back(SP_GRADIENT(item->data));
+ }
}
}
@@ -968,6 +973,37 @@ static void recalcSwatchContents(SPDocument* doc,
}
}
+void SwatchesPanel::handleDocumentDestroy(SPDocument *document)
+{
+ if (document) {
+ for (std::vector<DocTrack*>::iterator it = docTrackings.begin(); it != docTrackings.end(); ++it){
+ if ((*it)->doc == document) {
+ delete *it;
+ docTrackings.erase(it);
+ break;
+ }
+ }
+
+ if (docPalettes.find(document) != docPalettes.end()) {
+ docPalettes.erase(document);
+ }
+
+ for (std::map<SwatchesPanel*, SPDocument*>::iterator it = docPerPanel.begin(); it != docPerPanel.end(); ++it) {
+ if (it->second == document) {
+ SwatchesPanel* swp = it->first;
+ std::vector<SwatchPage*> pages = swp->_getSwatchSets();
+ if ((swp->_currentIndex >= static_cast<int>(pages.size())) && (pages.size() > 0))
+ {
+ swp->_setSelectedIndex(swp->_getSwatchSets().size() - 1);
+ }
+ swp->_rebuild();
+ docPerPanel.erase(it);
+ break;
+ }
+ }
+ }
+}
+
void SwatchesPanel::handleGradientsChange(SPDocument *document)
{
SwatchPage *docPalette = (docPalettes.find(document) != docPalettes.end()) ? docPalettes[document] : 0;
@@ -1142,38 +1178,45 @@ void SwatchesPanel::_handleAction( int setId, int itemId )
switch( setId ) {
case 3:
{
- std::vector<SwatchPage*> pages = _getSwatchSets();
- if ( itemId >= 0 && itemId < static_cast<int>(pages.size()) ) {
- _currentIndex = itemId;
+ _setSelectedIndex(itemId);
+ }
+ break;
+ }
+}
- if ( !_prefs_path.empty() ) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setString(_prefs_path + "/palette", pages[_currentIndex]->_name);
- }
+void SwatchesPanel::_setSelectedIndex( int index )
+{
+ std::vector<SwatchPage*> pages = _getSwatchSets();
+ if ( index >= 0 && index < static_cast<int>(pages.size()) ) {
+ _currentIndex = index;
- _rebuild();
- }
+ if ( !_prefs_path.empty() ) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setString(_prefs_path + "/palette", pages[_currentIndex]->_name);
}
- break;
+
+ _rebuild();
}
}
void SwatchesPanel::_rebuild()
{
std::vector<SwatchPage*> pages = _getSwatchSets();
- SwatchPage* curr = pages[_currentIndex];
- _holder->clear();
+ if (_currentIndex < static_cast<int>(pages.size())) {
+ SwatchPage* curr = pages[_currentIndex];
+ _holder->clear();
- if ( curr->_prefWidth > 0 ) {
- _holder->setColumnPref( curr->_prefWidth );
- }
- _holder->freezeUpdates();
- // TODO restore once 'clear' works _holder->addPreview(_clear);
- _holder->addPreview(_remove);
- for ( boost::ptr_vector<ColorItem>::iterator it = curr->_colors.begin(); it != curr->_colors.end(); ++it) {
- _holder->addPreview(&*it);
+ if ( curr->_prefWidth > 0 ) {
+ _holder->setColumnPref( curr->_prefWidth );
+ }
+ _holder->freezeUpdates();
+ // TODO restore once 'clear' works _holder->addPreview(_clear);
+ _holder->addPreview(_remove);
+ for ( boost::ptr_vector<ColorItem>::iterator it = curr->_colors.begin(); it != curr->_colors.end(); ++it) {
+ _holder->addPreview(&*it);
+ }
+ _holder->thawUpdates();
}
- _holder->thawUpdates();
}
} //namespace Dialogs
diff --git a/src/ui/dialog/swatches.h b/src/ui/dialog/swatches.h
index ca4c1687d..3abb81d98 100644
--- a/src/ui/dialog/swatches.h
+++ b/src/ui/dialog/swatches.h
@@ -43,11 +43,13 @@ public:
virtual int getSelectedIndex() {return _currentIndex;} // temporary
protected:
+ static void handleDocumentDestroy(SPDocument *document);
static void handleGradientsChange(SPDocument *document);
virtual void _updateFromSelection();
virtual void _handleAction( int setId, int itemId );
virtual void _setDocument( SPDocument *document );
+ virtual void _setSelectedIndex( int index );
virtual void _rebuild();
virtual std::vector<SwatchPage*> _getSwatchSets() const;