Skip to content

Commit

Permalink
Finished main work on lirios#50
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Fateev committed May 10, 2017
1 parent c7a9463 commit a88b184
Show file tree
Hide file tree
Showing 13 changed files with 272 additions and 4 deletions.
1 change: 1 addition & 0 deletions liri-browser.pro
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,4 @@ include(src/main/main.pri)
include(src/ui/ui.pri)

RESOURCES += res/icons/icons.qrc
QML_IMPORT_PATH = $$PWD
4 changes: 4 additions & 0 deletions src/core/core.pri
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ HEADERS += \
$$PWD/settings/themeconfig.h \
$$PWD/global/paths.h \
$$PWD/utils/darkthemetimer.h \
$$PWD/session/session.h \
$$PWD/session/tabstate.h

SOURCES += \
$$PWD/models/tabsmodel.cpp \
Expand All @@ -20,3 +22,5 @@ SOURCES += \
$$PWD/settings/searchconfig.cpp \
$$PWD/settings/themeconfig.cpp \
$$PWD/utils/darkthemetimer.cpp \
$$PWD/session/session.cpp \
$$PWD/session/tabstate.cpp
1 change: 1 addition & 0 deletions src/core/global/paths.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace Paths {
const QString DataLocation = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/liri-browser/";
const QString SettingsFile = ConfigLocation + "settings.json";
const QString ExtensionsLocation = DataLocation + "extensions/";
const QString SessionDataFile = DataLocation + "session.json";
}

#endif // PATHS_H
93 changes: 93 additions & 0 deletions src/core/session/session.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#include "Session.h"

#include <QDir>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

#include "../global/paths.h"
#include "../models/tabsmodel.h"
#include "tabstate.h"

Session::Session(QObject *parent) : QObject(parent)
{
load();
}

void Session::save(TabsModel* tabs)
{
QFile file(Paths::SessionDataFile);
if (!file.open(QIODevice::WriteOnly)) {
qWarning("Couldn't open session file for write!");
return;
}
QTextStream stream(&file);
stream << json(tabs);
file.close();

qDebug() << "Session written to" << Paths::SessionDataFile;
}

QVariantList Session::getTabsToRestore()
{
QVariantList tabs;
for (TabState* state : m_tabs)
{
tabs.append(QVariant::fromValue(state));
}
m_tabs.clear();
return tabs;
}

void Session::load()
{
QFile file(Paths::SessionDataFile);
if (!file.open(QIODevice::ReadOnly)) {
qWarning("Couldn't open session file for read!");
return;
}

QByteArray bytes = file.readAll();
QJsonDocument doc(QJsonDocument::fromJson(bytes));

QJsonObject root = doc.object();
QJsonObject meta = root["meta"].toObject();
QString metaSchema = meta["schema"].toString();
if (metaSchema != "0.1") {
qWarning() << "Unknown session schema version " << metaSchema << "!";
return;
}
QJsonArray tabs = root["tabs"].toArray();
for (QJsonValue tab : tabs)
{
auto tabObj = tab.toObject();
auto state = new TabState(this);
state->setUrl(tabObj["url"].toString());
m_tabs.append(state);
}
}

QByteArray Session::json(TabsModel* tabs)
{
QJsonObject meta {
{"schema", "0.1"}
};

QJsonArray tabsArray;

for (int i = 0; i < tabs->count(); ++i) {
QJsonObject tabObject;
tabObject["url"] = tabs->get(i)->url().toString();
tabObject["readingProgress"] = 0.f;
tabsArray.append(tabObject);
}

QJsonObject root {
{"meta", meta},
{"tabs", tabsArray},
};

QJsonDocument doc(root);
return doc.toJson();
}
31 changes: 31 additions & 0 deletions src/core/session/session.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#ifndef SESSION_H
#define SESSION_H

#include <QObject>
#include <QVariantList>
#include <QList>

class TabsModel;
class TabState;

class Session : public QObject
{
Q_OBJECT
public:
explicit Session(QObject *parent = 0);

Q_INVOKABLE void save(TabsModel* tabs);
Q_INVOKABLE QVariantList getTabsToRestore();
signals:

public slots:

private:
void load();
QByteArray json(TabsModel *tabs);

private:
QList<TabState*> m_tabs;
};

#endif // SESSION_H
29 changes: 29 additions & 0 deletions src/core/session/tabstate.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include "tabstate.h"

TabState::TabState(QObject *parent) : QObject(parent)
{

}

void TabState::setUrl(QString url)
{
if (m_url == url)
return;

m_url = url;
}

QString TabState::url() const
{
return m_url;
}

float TabState::readingProgress() const
{
return m_readingProgress;
}

void TabState::setReadingProgress(float readingProgress)
{
m_readingProgress = readingProgress;
}
30 changes: 30 additions & 0 deletions src/core/session/tabstate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef TABSTATE_H
#define TABSTATE_H

#include <QObject>

class TabState : public QObject
{
Q_OBJECT

Q_PROPERTY(QString url READ url WRITE setUrl)
Q_PROPERTY(float readingProgress READ readingProgress WRITE setReadingProgress)

public:
explicit TabState(QObject *parent = 0);

void setUrl(QString url);
QString url() const;
float readingProgress() const;
void setReadingProgress(float readingProgress);

signals:

public slots:

private:
QString m_url;
float m_readingProgress;
};

#endif // TABSTATE_H
28 changes: 27 additions & 1 deletion src/core/settings/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,17 @@ void Settings::load()
m_startConfig->setPrimaryStartUrl(QUrl(dataStart["primary_url"].toString()));
m_startConfig->setDarkStartUrl(QUrl(dataStart["dark_theme_url"].toString()));
m_startConfig->setIncognitoStartUrl(QUrl(dataStart["incognito_url"].toString()));

StartConfig::StartupType startupType;
QString startupTypeString = dataStart["startupType"].toString();

if (startupTypeString == "start_from_new_page")
startupType = StartConfig::StartupType::StartFromNewPage;
else if (startupTypeString == "start_from_previously_opened_tabs")
startupType = StartConfig::StartupType::StartFromPreviouslyOpenedTabs;

m_startConfig->setStartupType(startupType);

QJsonObject dataSearch = data["search"].toObject();
QString searchEngineString = dataSearch["engine"].toString();
SearchConfig::SearchEngine searchEngine;
Expand Down Expand Up @@ -133,7 +144,8 @@ QByteArray Settings::defaultJSON()
QJsonObject dataStart {
{"primary_url", m_startConfig->defaultPrimaryStartUrl().toString()},
{"dark_theme_url", m_startConfig->defaultDarkStartUrl().toString()},
{"incognito_url", m_startConfig->defaultIncognitoStartUrl().toString()}
{"incognito_url", m_startConfig->defaultIncognitoStartUrl().toString()},
{"startupType", "start_from_new_page"}
};
QJsonObject dataSearch {
{"engine", "duckduckgo"},
Expand Down Expand Up @@ -163,11 +175,25 @@ QByteArray Settings::json()
QJsonObject meta {
{"schema", "0.1"}
};

QString startupTypeString;

switch (m_startConfig->startupType()) {
case StartConfig::StartupType::StartFromNewPage:
startupTypeString = "start_from_new_page";
break;
case StartConfig::StartupType::StartFromPreviouslyOpenedTabs:
startupTypeString = "start_from_previously_opened_tabs";
break;
}

QJsonObject dataStart {
{"primary_url", m_startConfig->primaryStartUrl().toString()},
{"dark_theme_url", m_startConfig->darkStartUrl().toString()},
{"incognito_url", m_startConfig->incognitoStartUrl().toString()},
{"startupType", startupTypeString},
};

QString searchEngineString;
switch (m_searchConfig->searchEngine()) {
case SearchConfig::SearchEngine::DuckDuckGo:
Expand Down
1 change: 1 addition & 0 deletions src/core/settings/startconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ StartConfig::StartConfig(QObject *parent)
m_defaultPrimaryStartUrl = QUrl("https://duckduckgo.com");
m_defaultDarkStartUrl = QUrl("https://duckduckgo.com/?kae=#303030");
m_defaultIncognitoStartUrl = QUrl("https://duckduckgo.com/?kae=#37474f");
m_startupType = StartupType::StartFromNewPage;
}
12 changes: 12 additions & 0 deletions src/core/settings/startconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,16 @@ class StartConfig : public QObject
Q_PROPERTY(QUrl defaultDarkStartUrl MEMBER m_defaultDarkStartUrl NOTIFY defaultDarkStartUrlChanged)
Q_PROPERTY(QUrl incognitoStartUrl READ incognitoStartUrl WRITE setIncognitoStartUrl NOTIFY incognitoStartUrlChanged)
Q_PROPERTY(QUrl defaultIncognitoStartUrl MEMBER m_defaultIncognitoStartUrl NOTIFY defaultIncognitoStartUrlChanged)
Q_PROPERTY(StartupType startupType MEMBER m_startupType NOTIFY startupTypeChanged)
Q_ENUMS(StartupType)
public:
explicit StartConfig(QObject *parent = nullptr);

enum StartupType {
StartFromNewPage,
StartFromPreviouslyOpenedTabs,
};

QUrl primaryStartUrl() const { return m_primaryStartUrl; }
void setPrimaryStartUrl(QUrl url) { primaryStartUrlChanged(m_primaryStartUrl = url); }

Expand All @@ -52,13 +59,17 @@ class StartConfig : public QObject
QUrl defaultIncognitoStartUrl() const { return m_defaultIncognitoStartUrl; }
QUrl defaultDarkStartUrl() const { return m_defaultDarkStartUrl; }

StartupType startupType() const { return m_startupType; }
void setStartupType(const StartupType &startupType) { startupTypeChanged(m_startupType = startupType); }

signals:
void primaryStartUrlChanged(QUrl url);
void defaultPrimaryStartUrlChanged(QUrl url);
void darkStartUrlChanged(QUrl url);
void defaultDarkStartUrlChanged(QUrl url);
void incognitoStartUrlChanged(QUrl url);
void defaultIncognitoStartUrlChanged(QUrl url);
void startupTypeChanged(StartupType url);

private:
QUrl m_primaryStartUrl;
Expand All @@ -67,6 +78,7 @@ class StartConfig : public QObject
QUrl m_defaultIncognitoStartUrl;
QUrl m_darkStartUrl;
QUrl m_defaultDarkStartUrl;
StartupType m_startupType;

};

Expand Down
5 changes: 5 additions & 0 deletions src/main/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "../core/models/downloadsmodel.h"
#include "../core/models/webdownload.h"
#include "../core/settings/settings.h"
#include "../core/session/session.h"
#include "../core/utils/darkthemetimer.h"

#ifdef Q_OS_MACOS
Expand Down Expand Up @@ -63,6 +64,8 @@ int main(int argc, char *argv[])
Settings settings;
settings.load();

Session session;

// Create and start dark theme time
DarkThemeTimer darkThemeTimer;
darkThemeTimer.start();
Expand All @@ -72,6 +75,7 @@ int main(int argc, char *argv[])

// register core types
qmlRegisterUncreatableType<SearchConfig>("core", 1, 0, "SearchConfig", "SearchConfig (from module core) may not be created directly.");
qmlRegisterUncreatableType<StartConfig>("core", 1, 0, "StartConfig", "StartConfig (from module core) may not be created directly.");

qmlRegisterUncreatableType<Tab>("core", 1, 0, "Tab", "Tab (from module core) may not be created directly.");
qmlRegisterType<TabsModel>("core", 1, 0, "TabsModel");
Expand All @@ -81,6 +85,7 @@ int main(int argc, char *argv[])

// Register context properties
engine.rootContext()->setContextProperty("Settings", &settings);
engine.rootContext()->setContextProperty("Session", &session);
engine.rootContext()->setContextProperty("DarkThemeTimer", &darkThemeTimer);
#ifdef Q_OS_MACOS
engine.rootContext()->setContextProperty("MacEvents", &evListener);
Expand Down
28 changes: 26 additions & 2 deletions src/ui/tabview/content/SettingsContent.qml
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,35 @@ TabContent {
}

TitleLabel {
text: "Start"
text: "Startup"
}

Column {
Label { text: "Start new window with" }
RadioButton {
text: "New page"
checked: Settings.startConfig.startupType === StartConfig.StartFromNewPage
onClicked: {
if (Settings.startConfig.startupType !== StartConfig.StartFromNewPage) {
Settings.startConfig.startupType = StartConfig.StartFromNewPage;
Settings.dirty = true;
}
}
}
RadioButton {
text: "Continue where you left off"
checked: Settings.startConfig.startupType === StartConfig.StartFromPreviouslyOpenedTabs
onClicked: {
if (Settings.startConfig.startupType !== StartConfig.StartFromPreviouslyOpenedTabs) {
Settings.startConfig.startupType = StartConfig.StartFromPreviouslyOpenedTabs;
Settings.dirty = true;
}
}
}
}

Label {
text: "Start url"
text: "New page url"
font.pixelSize: 16
}

Expand Down
Loading

0 comments on commit a88b184

Please sign in to comment.