File indexing completed on 2024-12-08 06:28:23
0001 /* 0002 This file is part of Kiten, a KDE Japanese Reference Tool 0003 SPDX-FileCopyrightText: 2006 Joseph Kerian <jkerian@gmail.com> 0004 SPDX-FileCopyrightText: 2006 Eric Kjeldergaard <kjelderg@gmail.com> 0005 0006 SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "historyptrlist.h" 0010 0011 #include "entrylist.h" 0012 0013 #include <QList> 0014 0015 class HistoryPtrList::Private 0016 { 0017 public: 0018 Private() 0019 : index(-1) 0020 { 0021 } 0022 0023 static const int max_size = 20; 0024 int index; 0025 QList<EntryList *> list; 0026 }; 0027 0028 HistoryPtrList::HistoryPtrList() 0029 : d(new Private) 0030 { 0031 } 0032 0033 HistoryPtrList::~HistoryPtrList() 0034 { 0035 for (int i = d->list.size() - 1; i >= 0; i--) { 0036 d->list.at(i)->deleteAll(); 0037 delete d->list.at(i); 0038 } 0039 0040 delete d; 0041 } 0042 0043 void HistoryPtrList::addItem(EntryList *newItem) 0044 { 0045 if (!newItem) 0046 return; 0047 // If we're currently looking at something prior to the end of the list 0048 // Remove everything in the list up to this point. 0049 int currentPosition = d->index + 1; 0050 EntryList *temp; 0051 while (currentPosition < count()) { 0052 temp = d->list.takeLast(); 0053 temp->deleteAll(); 0054 delete temp; 0055 } 0056 0057 // Now... check to make sure our history isn't 'fat' 0058 while (count() >= d->max_size) { 0059 temp = d->list.takeFirst(); 0060 temp->deleteAll(); 0061 delete temp; 0062 } 0063 d->index = count() - 1; // Since we have trimmed down to the current position 0064 0065 // One other odd case... if this query is a repeat of the last query 0066 // replace the current one with the new one 0067 if (!d->list.empty()) { 0068 if (current()->getQuery() == newItem->getQuery()) { 0069 temp = d->list.takeLast(); 0070 temp->deleteAll(); 0071 delete temp; 0072 } 0073 } 0074 // Now add the item 0075 d->list.append(newItem); 0076 d->index = count() - 1; 0077 } 0078 0079 int HistoryPtrList::count() 0080 { 0081 return d->list.size(); 0082 } 0083 0084 EntryList *HistoryPtrList::current() 0085 { 0086 if (d->index == -1) { 0087 return nullptr; 0088 } 0089 0090 return d->list.at(d->index); 0091 } 0092 0093 int HistoryPtrList::index() 0094 { 0095 return d->index; 0096 } 0097 0098 void HistoryPtrList::next(int distance) 0099 { 0100 if (distance + d->index > count() - 1) { 0101 d->index = count() - 1; 0102 } else { 0103 d->index += distance; 0104 } 0105 } 0106 0107 void HistoryPtrList::prev(int distance) 0108 { 0109 if (d->index - distance < 0) { 0110 d->index = 0; 0111 } else { 0112 d->index -= distance; 0113 } 0114 } 0115 0116 void HistoryPtrList::setCurrent(int i) 0117 { 0118 if (i < count() && i >= 0) { 0119 d->index = i; 0120 } 0121 } 0122 0123 // Get a StringList of the History Items 0124 QStringList HistoryPtrList::toStringList() 0125 { 0126 QStringList result; 0127 0128 for (const EntryList *p : d->list) { 0129 result.append(p->getQuery().toString()); 0130 } 0131 0132 return result; 0133 } 0134 0135 QStringList HistoryPtrList::toStringListNext() 0136 { 0137 HistoryPtrList localCopy(*this); 0138 0139 int currentPosition = d->index + 1; 0140 while (currentPosition--) { 0141 localCopy.d->list.removeFirst(); 0142 } 0143 0144 return localCopy.toStringList(); 0145 } 0146 0147 QStringList HistoryPtrList::toStringListPrev() 0148 { 0149 QStringList result; 0150 0151 for (int i = 0; i < d->index; i++) { 0152 result.append(d->list.at(i)->getQuery().toString()); 0153 } 0154 0155 return result; 0156 }