Introduced styles - first version of Widgets
[opentodolist:opentodolist.git] / OpenTodoListCore / todolistlibrary.cpp
1 /*
2  *  OpenTodoList - A todo and task manager
3  *  Copyright (C) 2013  Martin Höher <martin@rpdev.net>
4  * 
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 3 of the License, or
8  *  (at your option) any later version.
9  * 
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  * 
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "todolistlibrary.h"
20
21 #include "abstracttodo.h"
22 #include "abstracttodolist.h"
23 #include "todolistfactory.h"
24
25 #include <QCoreApplication>
26 #include <QStringList>
27 #include <QSettings>
28
29 TodoListLibrary::TodoListLibrary(QObject *parent) :
30     QObject(parent),
31     m_plugins( new PluginsLoader( this ) ),
32     m_lists( new TodoLists( this ) ),
33     m_nonLoadableLists(),
34     m_todos( new AbstractTodoList::TodoList( this ) )
35 {
36     restoreSettings();
37     connect( QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(saveSettings()) );
38 }
39
40 TodoListLibrary::~TodoListLibrary()
41 {
42 }
43
44 PluginsLoader *TodoListLibrary::plugins() const
45 {
46     return m_plugins;
47 }
48
49 TodoListLibrary::TodoLists* TodoListLibrary::todoLists() const
50 {
51     return m_lists;
52 }
53
54 AbstractTodoList::TodoList *TodoListLibrary::todos() const
55 {
56     return m_todos;
57 }
58
59 bool TodoListLibrary::createTodoList(const QString& name, OpenTodoListBackend* type)
60 {
61     if ( !name.isEmpty() && type ) {
62         AbstractTodoList* list = type->factory()->createTodoList( this );
63         list->setName( name );
64         m_lists->append( list );
65         m_todos->appendList( list->todos() );
66         return true;
67     }
68     return false;
69 }
70
71 OpenTodoListBackend* TodoListLibrary::backendByTypeName(const QString& type)
72 {
73     foreach ( OpenTodoListBackend* backend, m_plugins->backends()->data() ) {
74         if ( backend->type() == type ) {
75             return backend;
76         }
77     }
78     return 0;
79 }
80
81 void TodoListLibrary::saveSettings()
82 {
83     QSettings settings;
84     settings.beginWriteArray( "todoLists", m_lists->data().size() + m_nonLoadableLists.size() );
85     for ( int i = 0; i < m_lists->data().size(); ++i ) {
86         settings.setArrayIndex( i );
87         AbstractTodoList* list = m_lists->data().at( i );
88         settings.setValue( "type", list->type() );
89         settings.setValue( "key", list->key() );
90         QVariant listSettings = list->settings();
91         if ( listSettings.isValid() ) {
92             settings.setValue( "settings", listSettings );
93         }
94     }
95     for ( int i = 0; i < m_nonLoadableLists.size(); ++i ) {
96         settings.setArrayIndex( m_lists->data().size() + i );
97         QVariantMap backup = m_nonLoadableLists.at( i );
98         foreach ( QString key, backup.keys() ) {
99             settings.setValue( key, backup.value( key ) );
100         }
101     }
102     settings.endArray();
103     settings.sync();
104 }
105
106 void TodoListLibrary::restoreSettings()
107 {
108     QSettings settings;
109     int numLists = settings.beginReadArray( "todoLists" );
110     for ( int i = 0; i < numLists; ++i ) {
111         settings.setArrayIndex( i );
112         OpenTodoListBackend* backend = backendByTypeName( settings.value( "type" ).toString() );
113         if ( backend ) {
114             AbstractTodoList* list = backend->factory()->createTodoList(
115                         this,
116                         settings.value( "key" ).toString(),
117                         settings.value( "settings", QVariant() ) );
118             if ( list ) {
119                 m_lists->append( list );
120                 m_todos->appendList( list->todos() );
121             }
122         } else {
123             QVariantMap backupData;
124             foreach ( QString key, settings.allKeys() ) {
125                 backupData.insert( key, settings.value( key ) );
126             }
127             m_nonLoadableLists << backupData;
128         }
129     }
130     settings.endArray();
131 }