Removed global settings object. Fixes ticket #18.
[tagua/yd.git] / src / mastersettings.cpp
blob78700d8581733963faba452cece24ca23eee9587
1 /*
2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@sns.it>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 */
11 #include "mastersettings.h"
12 #include "common.h"
13 #include <QTextStream>
15 QDomElement MasterSettings::node() const {
16 if (m_node.isNull()) {
17 QFile f(m_filename);
18 if (!f.open(QFile::ReadOnly | QFile::Text) || !m_doc.setContent(&f)) {
19 ERROR("Unable to open configuration file for reading.");
21 // // create a stub configuration file
22 // {
23 // QFile stub(m_filename);
24 // if (!stub.open(QFile::WriteOnly | QFile::Text)) {
25 // std::cout << "Unable to write to configuration file." << std::endl;
26 // exit(1);
27 // }
28 // QTextStream stream(&stub);
29 // stream << "<?xml version=\"1.0\"?>\n"
30 // "<configuration>\n"
31 // "</configuration>\n";
32 // }
34 // // reopen it
35 // if (!f.open(QFile::ReadOnly | QFile::Text))
36 // exit(1);
38 m_doc.appendChild(m_doc.createElement("configuration"));
39 // std::cout << m_doc.toString() << std::endl;
43 const_cast<QDomElement&>(m_node) = m_doc.documentElement();
44 Q_ASSERT(!m_node.isNull());
45 Q_ASSERT(!m_node.ownerDocument().isNull());
48 return m_node;
51 MasterSettings::MasterSettings(const QString& filename)
52 : m_filename(QDir(QDir::homePath()).filePath(filename)) { }
54 MasterSettings::~MasterSettings() {
55 sync();
58 void MasterSettings::setupObserver(Observer& observer) {
59 connect(observer.object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
62 void MasterSettings::onChange(QObject* obj, const char* method) {
63 m_observers.push_front(Observer(obj, method, 0));
64 setupObserver(m_observers.front());
67 void MasterSettings::onChange(QObject* obj, const char* method, const char* dependency) {
68 if (dependency) {
69 // go backwards through all existing observers, searching for something
70 // on which we depend.
71 for (ObserverList::reverse_iterator it = m_observers.rbegin();
72 it != m_observers.rend(); ++it) {
73 const char* observer_class = it->object->metaObject()->className();
74 if (observer_class && strcmp(observer_class, dependency) == 0) {
75 // we hit a dependency wall: we can't be notified
76 // before *it, so add the new Observer just here
77 ObserverList::iterator us = m_observers.insert(it.base(), Observer(obj, method, dependency));
78 setupObserver(*us);
80 // now check for a cyclic dependency
81 const char* this_class = obj->metaObject()->className();
82 for (ObserverList::iterator it2 = m_observers.begin(); it2 != us; ++it2) {
83 if (it2->dependency && strcmp(it2->dependency, this_class) == 0) {
84 // something which is notified before has us a dependency
85 // this means that there is a cyclic dependency it2 -> us -> it.
86 WARNING("Removing a cyclic dependency: " <<
87 it2->object->metaObject()->className() << " -> " <<
88 this_class << " -> " <<
89 observer_class);
91 // remove the cycle
92 it2->dependency = 0;
96 // done
97 return;
102 // no dependency
103 onChange(obj, method);
106 void MasterSettings::sync() {
107 // store to file
108 QFile f(m_filename);
109 if (!f.open(QFile::WriteOnly | QFile::Text))
110 ERROR("Cannot open configuration file for writing");
111 else {
112 QTextStream stream(&f);
113 stream << node().ownerDocument().toString();
118 void MasterSettings::objectDestroyed(QObject* obj) {
119 for (ObserverList::iterator it = m_observers.begin();
120 it != m_observers.end();) {
121 if (it->object == obj) {
122 it = m_observers.erase(it);
124 else {
125 ++it;
130 void MasterSettings::changed() {
131 foreach (Observer& observer, m_observers) {
132 observer.object->metaObject()->invokeMethod(observer.object, observer.method, Qt::DirectConnection);
134 sync();
137 MasterSettings& settings() {
138 static MasterSettings static_settings(".taguarc.xml");
139 return static_settings;