Fixed sort a-z bug which caused list to disappear when option Checked to Bottom was...
[easylist] / src / mycheckboxcontainer.cpp
1 #include "mycheckboxcontainer.h"\r
2 \r
3 MyCheckBoxContainer * MyCheckBoxContainer::instance = 0;\r
4 int MyCheckBoxContainer::instances = 0;\r
5 \r
6 MyCheckBoxContainer::MyCheckBoxContainer()\r
7 {\r
8     ++instances;\r
9     qDebug() << "MyCheckBoxContainer instances:" << instances;\r
10     sortToBottom = false;\r
11     sortAlphabetically = false;\r
12 }\r
13 \r
14 MyCheckBoxContainer::~MyCheckBoxContainer()\r
15 {\r
16     --instances;\r
17     qDebug() << "MyCheckBoxContainer instances left:" << instances;\r
18     clear();\r
19 }\r
20 \r
21 MyCheckBoxContainer * MyCheckBoxContainer::getInstance()\r
22 {\r
23     if(instance == 0)\r
24     {\r
25         instance = new MyCheckBoxContainer();\r
26     }\r
27     return instance;\r
28 }\r
29 \r
30 void MyCheckBoxContainer::add(QString item)\r
31 {\r
32     QStringList list = item.split("\n");\r
33     qDebug() << "add" << item;\r
34     QStringList list2;\r
35     if(sortAlphabetically)\r
36     {\r
37         int listSize = list.size();\r
38         int pos = 0;\r
39         for(int i = 0; i < listSize; ++i)\r
40         {\r
41             int list2Size = list2.size();\r
42             for(int j = 0; j < list2Size; ++j)\r
43             {\r
44                 pos = j;\r
45                 if(list[i].toUpper() > list2[j].toUpper())\r
46                 {\r
47                     break;\r
48                 }\r
49             }\r
50             qDebug() << "append" << list[i];\r
51             list2.append(list[i]);\r
52         }\r
53         list = list2;\r
54     }\r
55     qDebug() << "list" << list;\r
56     foreach(QString item, list)\r
57     {\r
58         if(item.length() > 0)\r
59         {\r
60             MyCheckBox * checkBox;\r
61             if(item.startsWith("!"))\r
62             {\r
63                 checkBox = new MyCheckBox(item.right(item.length()-1));\r
64                 checkBox->setChecked(true);\r
65             }\r
66             else\r
67             {\r
68                 checkBox = new MyCheckBox(item);\r
69             }\r
70             connect(checkBox, SIGNAL(clicked()), this, SLOT(clickedAction()));\r
71             checkBoxes.append(checkBox);\r
72         }\r
73     }\r
74     sortCheckedToBottom();\r
75 }\r
76 \r
77 void MyCheckBoxContainer::set(QString item)\r
78 {\r
79     clear();\r
80     qDebug() << "set" << item;\r
81     add(item);\r
82 }\r
83 \r
84 void MyCheckBoxContainer::clear()\r
85 {\r
86     foreach(MyCheckBox * item, checkBoxes)\r
87     {\r
88         item->setParent(0);\r
89         item->deleteLater();\r
90     }\r
91     checkBoxes.clear();\r
92 }\r
93 \r
94 void MyCheckBoxContainer::sortCheckedToBottom()\r
95 {\r
96     if(sortToBottom)\r
97     {\r
98         qDebug() << "Sort checked to bottom";\r
99         QList<MyCheckBox * > tempList;\r
100         QList<MyCheckBox * > tempListChecked;\r
101         foreach(MyCheckBox * item, checkBoxes)\r
102         {\r
103             if(item->isChecked())\r
104             {\r
105                 if(sortAlphabetically)\r
106                 {\r
107                     int size = tempListChecked.size();\r
108                     int pos = 0;\r
109                     for(pos = 0; pos < size; ++pos)\r
110                     {\r
111                         if(tempListChecked[pos]->text().toUpper() > item->text().toUpper())\r
112                         {\r
113                             break;\r
114                         }\r
115                     }\r
116                     tempListChecked.insert(pos, item);\r
117                 }\r
118                 else\r
119                 {\r
120                     tempListChecked.append(item);\r
121                 }\r
122             }\r
123             else\r
124             {\r
125                 if(sortAlphabetically)\r
126                 {\r
127                     int size = tempList.size();\r
128                     int pos = 0;\r
129                     for(pos = 0; pos < size; ++pos)\r
130                     {\r
131                         if(tempList[pos]->text().toUpper() > item->text().toUpper())\r
132                         {\r
133                             break;\r
134                         }\r
135                     }\r
136                     tempList.insert(pos, item);\r
137                 }\r
138                 else\r
139                 {\r
140                     tempList.append(item);\r
141                 }\r
142             }\r
143         }\r
144         checkBoxes.clear();\r
145         checkBoxes.append(tempList);\r
146         checkBoxes.append(tempListChecked);\r
147     }\r
148     emit signalSorted();\r
149 }\r
150 \r
151 QList<MyCheckBox * > const & MyCheckBoxContainer::getCheckBoxes()\r
152 {\r
153     return checkBoxes;\r
154 }\r
155 \r
156 QString MyCheckBoxContainer::getListText()\r
157 {\r
158     QString listText("");\r
159     foreach(MyCheckBox * item, checkBoxes)\r
160     {\r
161         if(item->isChecked())\r
162         {\r
163             listText.append("!");\r
164         }\r
165         listText.append(item->text());\r
166         listText.append("\n");\r
167     }\r
168     return listText;\r
169 }\r
170 \r
171 void MyCheckBoxContainer::uncheckAll()\r
172 {\r
173     foreach(MyCheckBox * item, checkBoxes)\r
174     {\r
175         item->setChecked(false);\r
176     }\r
177     if(sortAlphabetically)\r
178     {\r
179         set(getListText());\r
180     }\r
181 }\r
182 \r
183 void MyCheckBoxContainer::removeChecked()\r
184 {\r
185     QMutableListIterator<MyCheckBox * > i(checkBoxes);\r
186     while (i.hasNext())\r
187     {\r
188         MyCheckBox * item = i.next();\r
189         if (item->isChecked())\r
190         {\r
191             item->setParent(0);\r
192             item->deleteLater();\r
193             i.remove();\r
194         }\r
195     }\r
196 }\r
197 \r
198 void MyCheckBoxContainer::setSortCheckedToBottom(bool sortToBottom)\r
199 {\r
200     this->sortToBottom = sortToBottom;\r
201     sortCheckedToBottom();\r
202 }\r
203 \r
204 void MyCheckBoxContainer::setSortAlphabetically(bool sortAlphabetically)\r
205 {\r
206     this->sortAlphabetically = sortAlphabetically;\r
207     if(sortAlphabetically)\r
208     {\r
209         set(getListText());\r
210     }\r
211 }\r
212 \r
213 void MyCheckBoxContainer::clickedAction()\r
214 {\r
215     qDebug() << "Clicked a MyCheckBox";\r
216     sortCheckedToBottom();\r
217 }\r