/***********************************************************************
*
* Copyright (C) 2014, 2015 wereturtle
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
***********************************************************************/
#include
#include
#include
#include
#include
#include "DocumentHistory.h"
#define MAX_FILE_HISTORY_SIZE 20
#define FILE_HISTORY_KEY "FileHistory"
#define FILE_PATH_KEY "filePath"
#define CURSOR_POSITION_KEY "cursorPosition"
DocumentHistory::DocumentHistory()
{
}
DocumentHistory::~DocumentHistory()
{
}
QStringList DocumentHistory::getRecentFiles(int max)
{
RecentFilesList recentFiles = loadFromSettings(max);
QStringList filePathList;
for (int i = 0; i < recentFiles.size(); i++)
{
filePathList.append(recentFiles.at(i).filePath);
}
return filePathList;
}
void DocumentHistory::add
(
const QString& filePath,
int cursorPosition
)
{
QFileInfo fileInfo(filePath);
if (fileInfo.exists())
{
QString sanitizedPath = fileInfo.canonicalFilePath();
RecentFilesList recentFiles = loadFromSettings();
RecentFile lastFile;
lastFile.filePath = sanitizedPath;
lastFile.position = cursorPosition;
recentFiles.removeAll(lastFile);
recentFiles.prepend(lastFile);
cleanUpHistory(recentFiles);
storeToSettings(recentFiles);
}
}
int DocumentHistory::getCursorPosition(const QString& filePath)
{
QString sanitizedPath = QFileInfo(filePath).canonicalFilePath();
int position = 0;
RecentFilesList recentFiles = loadFromSettings();
cleanUpHistory(recentFiles);
foreach (RecentFile file, recentFiles)
{
if (sanitizedPath == file.filePath)
{
position = file.position;
break;
}
}
if (position < 0)
{
position = 0;
}
return position;
}
void DocumentHistory::clear()
{
QSettings settings;
settings.remove(FILE_HISTORY_KEY);
}
DocumentHistory::RecentFilesList DocumentHistory::loadFromSettings(int max)
{
QSettings settings;
int size = settings.beginReadArray(FILE_HISTORY_KEY);
RecentFilesList recentFiles;
if (max < 0)
{
max = size;
}
int filesAdded = 0;
for (int i = 0; (i < size) && (filesAdded < max); i++)
{
settings.setArrayIndex(i);
QString filePath = settings.value(FILE_PATH_KEY).toString();
int position = settings.value(CURSOR_POSITION_KEY, 0).toInt();
if (!filePath.isNull() && !filePath.isEmpty() && QFileInfo(filePath).exists())
{
RecentFile recentFile;
recentFile.filePath = filePath;
recentFile.position = position;
recentFiles.append(recentFile);
filesAdded++;
}
}
settings.endArray();
return recentFiles;
}
void DocumentHistory::storeToSettings
(
const DocumentHistory::RecentFilesList& recentFiles
)
{
QSettings settings;
if (recentFiles.isEmpty())
{
settings.remove(FILE_HISTORY_KEY);
return;
}
settings.beginWriteArray(FILE_HISTORY_KEY, recentFiles.size());
for (int i = 0; i < recentFiles.size(); i++)
{
RecentFile recentFile = recentFiles.at(i);
settings.setArrayIndex(i);
settings.setValue(FILE_PATH_KEY, recentFile.filePath);
settings.setValue
(
CURSOR_POSITION_KEY,
recentFile.position
);
}
settings.endArray();
}
void DocumentHistory::cleanUpHistory
(
DocumentHistory::RecentFilesList& recentFiles
)
{
while (recentFiles.size() > MAX_FILE_HISTORY_SIZE)
{
recentFiles.removeLast();
}
}