- refactoring started

This commit is contained in:
dmytro.bogovych 2018-12-21 23:11:26 +02:00
parent e346222c6e
commit f8d51cf95f
6 changed files with 1298 additions and 1231 deletions

View File

@ -24,7 +24,10 @@ char* __strlcat_chk (char* dest, const char* src, int len, int destcapacity)
#endif
#include "settings.h"
void ThemeHelper::applyCurrentTheme(Settings& settings)
using namespace helper;
void theme::applyCurrent(Settings& settings)
{
// Dark theme
if (settings.data()[KEY_DARK_THEME].toBool())
@ -42,18 +45,36 @@ void ThemeHelper::applyCurrentTheme(Settings& settings)
}
QString TimeHelper::secondsToDisplay(int seconds, bool showSeconds)
std::string chrono::secondsToDisplay(int seconds, bool showSeconds)
{
int hours = seconds / 3600;
int minutes = (seconds % 3600) / 60;
int secs = seconds % 60;
char r[32];
if (showSeconds)
return QString("%1:%2:%3").arg(hours, 2, 10, QLatin1Char('0')).arg(minutes, 2, 10, QLatin1Char('0')).arg(secs, 2, 10, QLatin1Char('0'));
sprintf(r, "%2d:%2d:%2d", hours, minutes, secs);
else
return QString("%1:%2").arg(hours, 2, 10, QLatin1Char('0')).arg(minutes, 2, 10, QLatin1Char('0'));
sprintf(r, "%2d:%2d", hours, minutes);
return r;
}
QString PathHelper::pathToSettings()
std::string chrono::timeToStr(time_t timestamp)
{
char buf[128];
strftime(buf, sizeof buf, "%FT%TZ", gmtime(&timestamp));
return buf;
}
time_t chrono::strToTime(const std::string& s)
{
struct tm t;
memset(&t, 0, sizeof t);
strptime(s.c_str(), "%FT%TZ", &t);
return timegm(&t);
}
QString path::pathToSettings()
{
#if QT_VERSION >= 0x050000
QString folder = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
@ -64,7 +85,7 @@ QString PathHelper::pathToSettings()
return path;
}
QString PathHelper::pathToDatabase()
QString path::pathToDatabase()
{
#if QT_VERSION >= 0x050000
QString folder = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
@ -75,7 +96,7 @@ QString PathHelper::pathToDatabase()
return path;
}
QString PathHelper::pathToDesktop()
QString path::pathToDesktop()
{
#if QT_VERSION >= 0x050000
QString folder = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
@ -85,7 +106,7 @@ QString PathHelper::pathToDesktop()
return folder;
}
QString PathHelper::pathToDatabaseTemplate()
QString path::pathToDatabaseTemplate()
{
#ifdef TARGET_WIN
return QCoreApplication::applicationDirPath() + "/" + DATABASENAME;
@ -96,7 +117,7 @@ QString PathHelper::pathToDatabaseTemplate()
#endif
}
QString PathHelper::pathToLog()
QString path::pathToLog()
{
#if QT_VERSION >= 0x050000
QString folder = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
@ -106,7 +127,7 @@ QString PathHelper::pathToLog()
return folder + "/" + LOGNAME;
}
bool ActivityTrackerHelper::ensureSmartTrackingIsPossible()
bool activityTracker::ensureSmartTrackingIsPossible()
{
bool result = false;
HIDActivityTracker tracker;

View File

@ -5,20 +5,32 @@
#include <QObject>
class Settings;
class ThemeHelper
namespace helper
{
class theme
{
public:
static void applyCurrentTheme(Settings& settings);
static void applyCurrent(Settings& settings);
};
class TimeHelper
struct date
{
int mYear = -1, mMonth = -1, mDay = -1;
time_t toTimestamp();
static date fromTimestamp();
};
class chrono
{
public:
static QString secondsToDisplay(int seconds, bool showSeconds);
static std::string secondsToDisplay(int seconds, bool showSeconds);
static std::string timeToStr(time_t timestamp);
static time_t strToTime(const std::string& s);
};
class PathHelper
class path
{
public:
static QString pathToDatabase();
@ -28,7 +40,7 @@ public:
static QString pathToLog();
};
class ActivityTrackerHelper
class activityTracker
{
public:
static bool ensureSmartTrackingIsPossible();
@ -46,5 +58,6 @@ signals:
void escapePressed(QObject* obj);
};
}
#endif

View File

@ -74,7 +74,7 @@ MainWindow::~MainWindow()
void MainWindow::attachDatabase()
{
// Open database
QString path = PathHelper::pathToDatabase();
QString path = helper::path::pathToDatabase();
if (mSettings->data()[KEY_DB_FILENAME_SPECIFIED].toBool())
path = mSettings->data()[KEY_DB_FILENAME].toString();

View File

@ -15,7 +15,7 @@ enum class DbProperty
#define CURRENT_DBVERSION "0"
// Function to make encryption. Input is raw content blob, output is blob with IV, original length and encrypted data.
static void EncryptBlob(const QByteArray& input, QByteArray& output)
/*static void EncryptBlob(const QByteArray& input, QByteArray& output)
{
TwofishCipher cipher;
@ -39,9 +39,9 @@ static void EncryptBlob(const QByteArray& input, QByteArray& output)
// Encrypt
cipher.encrypt(input, 0, output, iv.length() + 4);
}
}*/
static void DecryptBlob(const QByteArray& input, QByteArray& output)
/*static void DecryptBlob(const QByteArray& input, QByteArray& output)
{
TwofishCipher cipher;
assert(input.length() >= cipher.blocksize() + 4);
@ -64,7 +64,7 @@ static void DecryptBlob(const QByteArray& input, QByteArray& output)
// Truncate to original size
output.truncate(ntohl(lengthNbo));
}
}*/
Storage::Storage()
@ -297,7 +297,7 @@ bool Storage::encryptTask(PTask task)
bool Storage::encryptTaskContent(PTask task)
{
return false;
}
bool Storage::encryptTaskAttachment(PAttachment attachment)

View File

@ -1,8 +1,14 @@
#include "task.h"
#include "storage.h"
#include "helper.h"
#include <QVariant>
#include <assert.h>
#if defined(TARGET_OSX) || defined(TARGET_LINUX)
# include <uuid/uuid.h>
#endif
// -------- WorldId ------
WorldId::WorldId()
{
@ -13,7 +19,7 @@ WorldId::WorldId(const WorldId& src)
mId = src.mId;
}
WorldId::WorldId(const QString &s)
WorldId::WorldId(const std::string &s)
:mId(s)
{
}
@ -30,23 +36,33 @@ WorldId& WorldId::operator = (const WorldId& src)
bool WorldId::operator == (const WorldId& src)
{
return mId.isNull() ? false : (mId == src.mId);
return mId == src.mId;
}
bool WorldId::operator < (const WorldId& src)
{
return mId.isNull() ? true : (mId < src.mId);
return mId < src.mId;
}
QString WorldId::asString() const
std::string WorldId::asString() const
{
return mId.isNull() ? QString() : mId.toString();
return mId;
}
WorldId WorldId::create()
{
WorldId result;
result.mId = QUuid::createUuid();
#if defined(TARGET_OSX) || defined(TARGET_LINUX)
uuid_t t;
uuid_generate(t);
char buffer[128];
uuid_unparse(t, buffer);
result.mId = buffer;
#endif
#if defined(TARGET_WIN)
#endif
return result;
}
@ -55,7 +71,7 @@ TimeRecord::TimeRecord()
:mId(0), mTaskId(0), mSaved(false)
{}
TimeRecord::TimeRecord(const QDateTime &startTime, const QDateTime &endTime, Id taskId)
TimeRecord::TimeRecord(const time_t &startTime, const time_t &endTime, Id taskId)
:mId(0), mTaskId(taskId), mSaved(false), mStartTime(startTime), mEndTime(endTime)
{
}
@ -63,29 +79,29 @@ TimeRecord::TimeRecord(const QDateTime &startTime, const QDateTime &endTime, Id
TimeRecord::~TimeRecord()
{}
QDateTime TimeRecord::endTime() const
time_t TimeRecord::endTime() const
{
return mEndTime;
}
void TimeRecord::setEndTime(const QDateTime &endTime)
void TimeRecord::setEndTime(const time_t &endTime)
{
mEndTime = endTime;
}
QDateTime TimeRecord::startTime() const
time_t TimeRecord::startTime() const
{
return mStartTime;
}
void TimeRecord::setStartTime(const QDateTime &startTime)
void TimeRecord::setStartTime(const time_t &startTime)
{
mStartTime = startTime;
}
int TimeRecord::length()
{
return mStartTime.secsTo(mEndTime);
return (int)(mEndTime - mStartTime);
}
Id TimeRecord::id() const
@ -123,8 +139,10 @@ void TimeRecord::save()
if (!mId)
{
SQLite::Statement q(Storage::instance().database(), "insert into timeline(id, starttime, endtime, taskid, removed) values (NULL, :starttime, :endtime, :taskid, :removed)");
q.bind(":starttime", mStartTime.toString(Qt::ISODate).toStdString());
q.bind(":endtime", mEndTime.toString(Qt::ISODate).toStdString());
q.bind(":starttime", TimeHelper::timeToStr(mStartTime));
q.bind(":endtime", TimeHelper::timeToStr(mEndTime));
q.bind(":taskid", (sqlite3_int64)mTaskId);
q.bind(":removed", 0);
if (q.exec())
@ -132,9 +150,10 @@ void TimeRecord::save()
}
else
{
SQLite::Statement q(Storage::instance().database(), "update timeline set starttime = :starttime, endtime = :endtime, taskid = :taskid, removed = 0 where id = :id");
q.bind(":starttime", mStartTime.toString(Qt::ISODate).toStdString());
q.bind(":endtime", mEndTime.toString(Qt::ISODate).toStdString());
SQLite::Statement q(Storage::instance().database(),
"update timeline set starttime = :starttime, endtime = :endtime, taskid = :taskid, removed = 0 where id = :id");
q.bind(":starttime", TimeHelper::timeToStr(mStartTime));
q.bind(":endtime", TimeHelper::timeToStr(mEndTime));
q.bind(":taskid", (sqlite3_int64)mTaskId);
q.bind(":id", (sqlite3_int64)mId);
q.exec();
@ -159,9 +178,9 @@ TimeLine::~TimeLine()
int TimeLine::findTotalTime()
{
int result = 0;
for(auto timeIter = mData.begin(); timeIter != mData.end(); timeIter++)
for(auto& t: mData.begin())
{
int delta = timeIter->startTime().secsTo(timeIter->endTime());
int delta = t.endTime() - t.startTime();
result += delta + 1;
}
return result;
@ -186,7 +205,7 @@ void TimeLine::start()
mActive = true;
// Find current time in UTC format
QDateTime current = QDateTime::currentDateTimeUtc();
time_t current = time(nullptr);
// Check if current time point does not belong to any existing time interval
if (hasTimePoint(current))
@ -195,7 +214,7 @@ void TimeLine::start()
mActiveTimeRecord = makeNewRecord(current, current);
}
TimeRecord* TimeLine::makeNewRecord(const QDateTime& beginTime, const QDateTime& endTime)
TimeRecord* TimeLine::makeNewRecord(time_t beginTime, time_t endTime)
{
TimeRecord tr;
tr.setStartTime(beginTime);
@ -210,14 +229,17 @@ TimeRecord* TimeLine::makeNewRecord(const QDateTime& beginTime, const QDateTime&
std::reverse_iterator<TimeArray::iterator> intervalIter = std::find_if(std::reverse_iterator<TimeArray::iterator>(mData.end()),
std::reverse_iterator<TimeArray::iterator>(mData.begin()),
[=] (const TimeRecord& tr)
{return tr.id() == intervalId;});
{
return tr.id() == intervalId;
});
if (intervalIter != std::reverse_iterator<TimeArray::iterator>(mData.begin()))
return &(*intervalIter);
else
return nullptr;
}
TimeRecord* TimeLine::hasTimePoint(const QDateTime& t)
TimeRecord* TimeLine::hasTimePoint(time_t t)
{
if (mData.empty())
return nullptr;
@ -225,8 +247,10 @@ TimeRecord* TimeLine::hasTimePoint(const QDateTime& t)
TimeRecord* tr = nullptr;
TimeArray::iterator result;
result = std::upper_bound(mData.begin(), mData.end(), t,
[](const QDateTime& t2, const TimeRecord& tr)
{ return tr.startTime() > t2;});
[](time_t t2, const TimeRecord& tr)
{
return tr.startTime() > t2;
});
if (result == mData.end())
tr = &mData.last();
@ -251,7 +275,7 @@ bool TimeLine::hasIntersection(const TimeRecord &interval)
TimeArray::iterator result;
result = std::upper_bound(mData.begin(), mData.end(), interval.startTime(),
[](const QDateTime& t2, const TimeRecord& tr)
[](time_t t2, const TimeRecord& tr)
{ return tr.startTime() > t2;});
if (result == mData.end())
@ -293,7 +317,7 @@ bool TimeLine::removeInterval(const TimeRecord &interval)
TimeArray::iterator result;
result = std::upper_bound(mData.begin(), mData.end(), interval.startTime(),
[](const QDateTime& t2, const TimeRecord& tr)
[](time_t t2, const TimeRecord& tr)
{ return tr.startTime() > t2;});
if (result == mData.end())
@ -333,7 +357,7 @@ void TimeLine::cutInterval(const TimeRecord& interval)
// Find interval that startTime() time is greater than interval.endTime()
TimeArray::iterator iter;
iter = std::upper_bound(mData.begin(), mData.end(), interval.endTime(),
[](const QDateTime& t2, const TimeRecord& tr)
[](time_t t2, const TimeRecord& tr)
{ return tr.startTime() > t2;});
// If all intervals begins later() than requested interval - exit silently
@ -354,7 +378,7 @@ void TimeLine::cutInterval(const TimeRecord& interval)
{
if (iter->startTime() >= interval.startTime())
{
iter->setStartTime(iter->endTime().addSecs(1)); // Current interval starts in [interval.startTime(), interval.endTime()], but finishes later
iter->setStartTime(iter->endTime() + 1); // Current interval starts in [interval.startTime(), interval.endTime()], but finishes later
iter->save();
}
else
@ -363,9 +387,9 @@ void TimeLine::cutInterval(const TimeRecord& interval)
// So cut interval will split it to 2 new intervals
// Also this operation will end loop
TimeRecord toInsert(*iter); // Backup current interval
iter->setEndTime(interval.startTime().addSecs(-1));
iter->setEndTime(interval.startTime() - 1);
iter->save();
toInsert.setStartTime(interval.endTime().addSecs(1));
toInsert.setStartTime(interval.endTime() + 1);
mData.insert(++iter, toInsert);
toInsert.save();
done = true;
@ -382,7 +406,7 @@ void TimeLine::cutInterval(const TimeRecord& interval)
else
{
// Current interval starts before cut interval but finishes in cut interval
iter->setEndTime(interval.startTime().addSecs(-1));
iter->setEndTime(interval.startTime() - 1);
iter->save();
done = true;
break;
@ -396,7 +420,9 @@ void TimeLine::cutInterval(const TimeRecord& interval)
// Look for exact the same interval as specified one
if (!done)
{
iter = std::find_if(mData.begin(), mData.end(), [=] (const TimeRecord& tr) { return tr.id() == interval.id();});
iter = std::find_if(mData.begin(), mData.end(),
[=] (const TimeRecord& tr)
{ return tr.id() == interval.id();});
if (iter != mData.end())
mData.erase(iter);
}
@ -405,7 +431,9 @@ void TimeLine::cutInterval(const TimeRecord& interval)
TimeRecord* TimeLine::findIntervalById(Id id)
{
TimeArray::iterator iter = std::find_if(mData.begin(), mData.end(), [=] (const TimeRecord& tr) { return tr.id() == id;});
TimeArray::iterator iter = std::find_if(mData.begin(), mData.end(),
[=] (const TimeRecord& tr)
{ return tr.id() == id;});
if (iter == mData.end())
return nullptr;
return &(*iter);
@ -417,20 +445,20 @@ void TimeLine::stop(bool updateTimeline)
return;
if (updateTimeline)
flush(true, QDateTime::currentDateTimeUtc());
flush(true, time(nullptr));
mActive = false;
mActiveTimeRecord = nullptr;
}
void TimeLine::flush(bool saveToDb, const QDateTime& currentUtc)
void TimeLine::flush(bool saveToDb, time_t currentUtc)
{
if (!mActive)
return;
if (mActiveTimeRecord)
{
int delta = mActiveTimeRecord->endTime().secsTo(currentUtc);
int delta = currentUtc - mActiveTimeRecord->endTime();
mActiveTimeRecord->setEndTime(currentUtc);
TimeRecord* tr = hasTimePoint(currentUtc);
@ -461,10 +489,8 @@ void TimeLine::load()
q.bind(":taskid", (sqlite3_int64)mTaskId);
while (q.executeStep())
{
QDateTime start = QDateTime::fromString(q.getColumn(1).getText(), Qt::ISODate);
start.setTimeSpec(Qt::UTC);
QDateTime stop = QDateTime::fromString(q.getColumn(2).getText(), Qt::ISODate);
stop.setTimeSpec(Qt::UTC);
time_t start = TimeHelper::strToTime(q.getColumn(1).getText());
time_t stop = TimeHelper::strToTime(q.getColumn(2).getText());
TimeRecord tr;
tr.setId(q.getColumn(0).getInt64());
@ -506,13 +532,16 @@ void TimeLine::getYears(std::set<int>& years)
if (mData.empty())
return;
// Find lower bound of years - it is first time record
int year1 = mData.front().startTime().toLocalTime().date().year();
struct tm t1, t2;
localtime(&mData.front().startTime(), &t1);
localtime(&mData.back().startTime(), &t2);
// Find lower bound of years - it is first time record
int year1 = t1.tm_year + 1900;
years.insert(year1);
// Find higher bound of years - it is last time record
int year2 = mData.back().endTime().toLocalTime().date().year();
int year2 = t2.tm_year + 1900;
if (year1 == year2)
return;
@ -521,10 +550,14 @@ void TimeLine::getYears(std::set<int>& years)
for (int year = year1+1; year <= year2; year++)
{
QDate yearStart(year, 1, 1);
TimeArray::iterator iter = std::lower_bound(mData.begin(), mData.end(), yearStart, [&](const TimeRecord& lhs, const QDate& rhs) { return lhs.endTime().toLocalTime().date() < rhs; });
TimeArray::iterator iter = std::lower_bound(mData.begin(), mData.end(), yearStart,
[&](const TimeRecord& lhs, time_t rhs)
{ return lhs.endTime() < rhs; });
if (iter != mData.end())
{
if (iter->startTime().toLocalTime().date().year() <= year)
// Get current year
struct tm ct; localtime(&iter->startTime(), &ct);
if (ct.tm_year + 1900 <= year)
years.insert(year);
}
}

View File

@ -12,36 +12,36 @@
#include <map>
#include "SQLiteCpp/Database.h"
typedef qulonglong Id;
typedef uint64_t Id;
class WorldId
{
public:
WorldId();
WorldId(const WorldId& src);
WorldId(const QString& s);
WorldId(const std::string& s);
~WorldId();
WorldId& operator = (const WorldId& src);
bool operator == (const WorldId& src);
bool operator < (const WorldId& src);
QString asString() const;
std::string asString() const;
static WorldId create();
protected:
QUuid mId;
std::string mId;
};
class TimeRecord
{
public:
TimeRecord();
TimeRecord(const QDateTime& startTime, const QDateTime& endTime, Id taskId);
TimeRecord(const time_t& startTime, const time_t& endTime, Id taskId);
~TimeRecord();
QDateTime startTime() const;
void setStartTime(const QDateTime& startTime);
QDateTime endTime() const;
void setEndTime(const QDateTime& endTime);
time_t startTime() const;
void setStartTime(const time_t& startTime);
time_t endTime() const;
void setEndTime(const time_t& endTime);
int length();
Id id() const;
void setId(Id id);
@ -59,7 +59,7 @@ public:
protected:
Id mId, mTaskId;
WorldId mWorldId;
QDateTime mStartTime, mEndTime;
time_t mStartTime, mEndTime;
bool mSaved;
};
@ -83,7 +83,7 @@ public:
bool active();
void start();
void stop(bool updateTimeline = true);
void flush(bool saveToDb, const QDateTime& currentUtc);
void flush(bool saveToDb, time_t currentUtc);
void load();
void save();
@ -133,10 +133,10 @@ protected:
int findTotalTime();
// Builds new time interval record with specified start/finish time
TimeRecord* makeNewRecord(const QDateTime& begin, const QDateTime& end);
TimeRecord* makeNewRecord(time_t begin, time_t end);
// Looks for time record that includes specified time point
TimeRecord* hasTimePoint(const QDateTime& t);
TimeRecord* hasTimePoint(time_t t);
// Sorts records in mData by startTime() value
void sortData();
@ -153,8 +153,8 @@ class Task: public QObject
{
Q_OBJECT
public:
typedef qulonglong Id;
typedef quint32 ModelId;
typedef uint64_t Id;
typedef uint32_t ModelId;
enum Flag
{
Flag_NoTimeTracking = 1