Implement automatic database refresh on root category listing.

This commit is contained in:
codestation
2016-10-25 21:22:51 -04:00
parent a4366b6d1e
commit c3fc9af152
4 changed files with 95 additions and 58 deletions

View File

@@ -29,6 +29,15 @@
#include <QThread>
#include <QDebug>
#include <algorithm>
const int ohfi_array[] = {
VITA_OHFI_MUSIC, VITA_OHFI_PHOTO, VITA_OHFI_VIDEO,
VITA_OHFI_PACKAGE, VITA_OHFI_BACKUP, VITA_OHFI_VITAAPP,
VITA_OHFI_PSPAPP, VITA_OHFI_PSPSAVE, VITA_OHFI_PSXAPP,
VITA_OHFI_PSMAPP
};
static bool nameLessThan(const QFileInfo &v1, const QFileInfo &v2)
{
if(v1.isDir() && v2.isDir()) {
@@ -115,70 +124,74 @@ void QListDB::clear()
object_list.clear();
}
int QListDB::createFromOhfi(int ohfi)
{
QSettings settings;
CMARootObject *obj = new CMARootObject(ohfi);
bool skipCurrent = false;
int dir_count;
switch(ohfi) {
case VITA_OHFI_MUSIC:
obj->initObject(settings.value("musicPath").toString());
skipCurrent = settings.value("musicSkip", false).toBool();
break;
case VITA_OHFI_PHOTO:
obj->initObject(settings.value("photoPath").toString());
skipCurrent = settings.value("photoSkip", false).toBool();
break;
case VITA_OHFI_VIDEO:
obj->initObject(settings.value("videoPath").toString());
skipCurrent = settings.value("videoSkip", false).toBool();
break;
case VITA_OHFI_BACKUP:
case VITA_OHFI_VITAAPP:
case VITA_OHFI_PSPAPP:
case VITA_OHFI_PSPSAVE:
case VITA_OHFI_PSXAPP:
case VITA_OHFI_PSMAPP:
obj->initObject(settings.value("appsPath").toString());
break;
case VITA_OHFI_PACKAGE:
obj->initObject(settings.value("pkgPath").toString());
}
root_list list;
list << obj;
emit directoryAdded(obj->m_path);
if(!skipCurrent) {
dir_count = recursiveScanRootDirectory(list, obj, ohfi);
} else {
dir_count = 0;
}
if(dir_count < 0) {
return -1;
}
qDebug("Added objects for OHFI 0x%02X: %i", ohfi, dir_count);
object_list[ohfi] = list;
return dir_count;
}
int QListDB::create()
{
int total_objects = 0;
//QMutexLocker locker(&mutex);
const int ohfi_array[] = { VITA_OHFI_MUSIC, VITA_OHFI_PHOTO, VITA_OHFI_VIDEO,
VITA_OHFI_PACKAGE, VITA_OHFI_BACKUP, VITA_OHFI_VITAAPP,
VITA_OHFI_PSPAPP, VITA_OHFI_PSPSAVE, VITA_OHFI_PSXAPP,
VITA_OHFI_PSMAPP
};
CMAObject::resetOhfiCounter();
QSettings settings;
for(int i = 0, max = sizeof(ohfi_array) / sizeof(int); i < max; i++) {
CMARootObject *obj = new CMARootObject(ohfi_array[i]);
bool skipCurrent = false;
int dir_count;
switch(ohfi_array[i]) {
case VITA_OHFI_MUSIC:
obj->initObject(settings.value("musicPath").toString());
skipCurrent = settings.value("musicSkip", false).toBool();
break;
case VITA_OHFI_PHOTO:
obj->initObject(settings.value("photoPath").toString());
skipCurrent = settings.value("photoSkip", false).toBool();
break;
case VITA_OHFI_VIDEO:
obj->initObject(settings.value("videoPath").toString());
skipCurrent = settings.value("videoSkip", false).toBool();
break;
case VITA_OHFI_BACKUP:
case VITA_OHFI_VITAAPP:
case VITA_OHFI_PSPAPP:
case VITA_OHFI_PSPSAVE:
case VITA_OHFI_PSXAPP:
case VITA_OHFI_PSMAPP:
obj->initObject(settings.value("appsPath").toString());
break;
case VITA_OHFI_PACKAGE:
obj->initObject(settings.value("pkgPath").toString());
}
root_list list;
list << obj;
emit directoryAdded(obj->m_path);
if(!skipCurrent) {
dir_count = recursiveScanRootDirectory(list, obj, ohfi_array[i]);
} else {
dir_count = 0;
}
if(dir_count < 0) {
return -1;
}
qDebug("Added objects for OHFI 0x%02X: %i", ohfi_array[i], dir_count);
total_objects += dir_count;
object_list[ohfi_array[i]] = list;
total_objects += createFromOhfi(ohfi_array[i]);
}
return total_objects;
}
@@ -320,6 +333,16 @@ bool QListDB::findInternal(const root_list &list, int ohfi, find_data &data)
bool QListDB::find(int ohfi, QListDB::find_data &data)
{
// reescan when accessing a root element
if(std::binary_search(ohfi_array, ohfi_array + sizeof(ohfi_array)/sizeof(ohfi_array[0]), ohfi)) {
QSettings settings;
if(settings.value("autorefresh", false).toBool()) {
qDebug("Reescanning root for ohfi: %i", ohfi);
createFromOhfi(ohfi);
}
}
for(map_list::iterator root = object_list.begin(); root != object_list.end(); ++root) {
if(findInternal(*root, ohfi, data)) {
return true;

View File

@@ -74,6 +74,7 @@ private:
typedef QMap<int, root_list> map_list;
int create();
int createFromOhfi(int ohfi);
int scanRootDirectory(root_list &list,int ohfi_type);
int recursiveScanRootDirectory(root_list &list, CMAObject *parent, int ohfi_type);
bool hasFilter(const CMARootObject *object,int ohfi);

View File

@@ -174,6 +174,9 @@ void ConfigWidget::setDefaultData()
bool ignorexml = settings.value("ignorexml", true).toBool();
ui->ignorexmlCheck->setChecked(ignorexml);
bool autorefresh = settings.value("autorefresh", false).toBool();
ui->refreshCheck->setChecked(autorefresh);
QString versiontype = settings.value("versiontype", "zero").toString();
QString customVersion = settings.value("customversion", "00.000.000").toString();
@@ -285,7 +288,7 @@ void ConfigWidget::accept()
settings.setValue("versiontype", "custom");
settings.setValue("ignorexml", ui->ignorexmlCheck->isChecked());
settings.setValue("autorefresh", ui->refreshCheck->isChecked());
settings.setValue("customversion", ui->psversionEdit->text());
bool ok;

View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>519</width>
<height>559</height>
<height>577</height>
</rect>
</property>
<property name="windowTitle">
@@ -357,6 +357,16 @@
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="refreshCheck">
<property name="text">
<string>Automatic database refresh (experimental)</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="ignorexmlCheck">
<property name="text">