- added log text

- started to implement autostart
This commit is contained in:
Dorian Zedler 2020-11-24 20:25:39 +01:00
parent c01d1b884d
commit 06dd8c4be3
Signed by: dorian
GPG key ID: D3B255CB8BC7CD37
20 changed files with 1727 additions and 22 deletions

View file

@ -14,13 +14,14 @@
-opensource \ -opensource \
-release \ -release \
-static \ -static \
-fontconfig \
-freetype \
-no-accessibility \ -no-accessibility \
-no-xmlpatterns \ -no-xmlpatterns \
-no-phonon \ -no-phonon \
-no-phonon-backend \ -no-phonon-backend \
-no-webkit \ -no-webkit \
-no-exceptions \ -no-exceptions \
-no-svg \
-no-script \ -no-script \
-no-scripttools \ -no-scripttools \
-no-nis \ -no-nis \
@ -38,7 +39,6 @@
-no-largefile \ -no-largefile \
-no-xinerama \ -no-xinerama \
-no-xrender \ -no-xrender \
-no-freetype \
-no-opengl \ -no-opengl \
-no-glib \ -no-glib \
-nomake examples \ -nomake examples \

View file

@ -23,6 +23,8 @@
#include <QStringList> #include <QStringList>
#include <QtDebug> #include <QtDebug>
#include <QProcess> #include <QProcess>
#include <QTimer>
#include <QElapsedTimer>
#include <vector> #include <vector>
#include <iostream> #include <iostream>
@ -30,6 +32,7 @@
#include <istream> #include <istream>
#include <stdlib.h> #include <stdlib.h>
#include "linbologger.h"
#include "linboconfig.h" #include "linboconfig.h"
#include "linboos.h" #include "linboos.h"
#include "linboimage.h" #include "linboimage.h"
@ -42,12 +45,15 @@ class LinboBackend : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(LinboBackend::LinboState state READ getState NOTIFY stateChanged) Q_PROPERTY(LinboBackend::LinboState state READ getState NOTIFY stateChanged)
Q_PROPERTY(LinboOs* currentOs READ getCurrentOs WRITE setCurrentOs NOTIFY currentOsChanged) Q_PROPERTY(LinboOs* currentOs READ getCurrentOs WRITE setCurrentOs NOTIFY currentOsChanged)
Q_PROPERTY(double autostartTimeoutProgress READ getAutostartTimeoutProgress NOTIFY autostartTimeoutProgressChanged)
Q_PROPERTY(int autostartTimeoutRemainingSeconds READ getAutostartTimeoutRemainingSeconds NOTIFY autostartTimeoutProgressChanged)
public: public:
explicit LinboBackend(QObject *parent = nullptr); explicit LinboBackend(QObject *parent = nullptr);
enum LinboState { enum LinboState {
Initializing, Initializing,
Autostarting,
Idle, Idle,
Starting, Starting,
Syncing, Syncing,
@ -59,10 +65,13 @@ public:
}; };
LinboState getState(); LinboState getState();
LinboLogger* getLogger();
LinboConfig* getConfig(); LinboConfig* getConfig();
QList<LinboOs*> getOperatingSystems(); QList<LinboOs*> getOperatingSystems();
LinboOs* getCurrentOs(); LinboOs* getCurrentOs();
void setCurrentOs(LinboOs* os); void setCurrentOs(LinboOs* os);
double getAutostartTimeoutProgress();
int getAutostartTimeoutRemainingSeconds();
protected: protected:
bool read_pair(ifstream* input, QString& key, QString& value); bool read_pair(ifstream* input, QString& key, QString& value);
@ -73,11 +82,16 @@ protected:
private: private:
LinboState state; LinboState state;
LinboLogger* logger;
LinboConfig* config; LinboConfig* config;
QStringList linboCommandCache; QStringList linboCommandCache;
QList<LinboOs*> operatingSystems; QList<LinboOs*> operatingSystems;
QList<LinboDiskPartition*> diskPartitions; QList<LinboDiskPartition*> diskPartitions;
QElapsedTimer* autostartElapsedTimer;
QTimer* autostartTimer;
QTimer* autostartRemainingTimeRefreshTimer;
LinboOs* currentOs; LinboOs* currentOs;
QString const linboCmdCommand = "linbo_cmd"; QString const linboCmdCommand = "linbo_cmd";
@ -126,6 +140,7 @@ public slots:
private slots: private slots:
void executeAutostart(); void executeAutostart();
void handleAutostartTimerTimeout();
void readFromStdout(); void readFromStdout();
void readFromStderr(); void readFromStderr();

View file

@ -0,0 +1,47 @@
#ifndef LINBOLOGGER_H
#define LINBOLOGGER_H
#include <QObject>
#include <QtDebug>
#include <QDateTime>
class LinboLogger : public QObject
{
Q_OBJECT
Q_PROPERTY(LinboLog latestLog READ getLatestLog NOTIFY latestLogChanged)
public:
friend class LinboBackend;
enum LinboLogType {
UnknownLogType = -1,
StdOut,
StdErr,
LinboGuiInfo,
LinboGuiError
};
typedef struct {
QString message;
LinboLogType type;
QDateTime time;
} LinboLog;
const LinboLog& getLatestLog();
QString logTypeToString(LinboLogType logType);
private:
explicit LinboLogger(QObject *parent = nullptr);
void log(QString logText, LinboLogType logType);
QList<LinboLog> logHistory;
signals:
void latestLogChanged(const LinboLogger::LinboLog& latestLog);
};
#endif // LINBOLOGGER_H

View file

@ -66,7 +66,6 @@ public:
} }
LinboOsStartAction startActionFromString(const QString& name) const { LinboOsStartAction startActionFromString(const QString& name) const {
qDebug() << "default action name is: " << name;
if(name == "start") if(name == "start")
return StartOs; return StartOs;
else if(name == "sync") else if(name == "sync")

View file

@ -24,6 +24,8 @@
#include <QApplication> #include <QApplication>
#include <QDesktopWidget> #include <QDesktopWidget>
#include <QBoxLayout> #include <QBoxLayout>
#include <QFont>
#include <QFontDatabase>
#include "linboGUIImpl.hh" #include "linboGUIImpl.hh"
#include "linbostartpage.h" #include "linbostartpage.h"

View file

@ -6,8 +6,10 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QStackedWidget> #include <QStackedWidget>
#include <QList> #include <QList>
#include <QLabel>
#include "linbobackend.h" #include "linbobackend.h"
#include "linbologger.h"
#include "linboosselectionrow.h" #include "linboosselectionrow.h"
#include "qmodernstackedwidget.h" #include "qmodernstackedwidget.h"
#include "qmodernpushbutton.h" #include "qmodernpushbutton.h"
@ -35,6 +37,8 @@ private:
QWidget* progressBarWidget; QWidget* progressBarWidget;
QModernProgressBar* progressBar; QModernProgressBar* progressBar;
QFont logFont;
QLabel* logLabel;
bool inited; bool inited;
@ -42,6 +46,7 @@ private slots:
void resizeAndPositionAllItems(); void resizeAndPositionAllItems();
void handleCurrentOsChanged(LinboOs* newOs); void handleCurrentOsChanged(LinboOs* newOs);
void handleLinboStateChanged(LinboBackend::LinboState newState); void handleLinboStateChanged(LinboBackend::LinboState newState);
void handleLatestLogChanged(const LinboLogger::LinboLog& latestLog);
signals: signals:
void selectedOsChanged(); void selectedOsChanged();

View file

@ -25,6 +25,7 @@ HEADERS += \
headers/backend/linboconfig.h \ headers/backend/linboconfig.h \
headers/backend/linbodiskpartition.h \ headers/backend/linbodiskpartition.h \
headers/backend/linboimage.h \ headers/backend/linboimage.h \
headers/backend/linbologger.h \
headers/backend/linboos.h \ headers/backend/linboos.h \
headers/legacy/image_description.hh \ headers/legacy/image_description.hh \
headers/legacy/linboConsoleImpl.hh \ headers/legacy/linboConsoleImpl.hh \
@ -57,6 +58,7 @@ SOURCES += \
sources/backend/linboconfig.cpp \ sources/backend/linboconfig.cpp \
sources/backend/linbodiskpartition.cpp \ sources/backend/linbodiskpartition.cpp \
sources/backend/linboimage.cpp \ sources/backend/linboimage.cpp \
sources/backend/linbologger.cpp \
sources/backend/linboos.cpp \ sources/backend/linboos.cpp \
sources/legacy/image_description.cc \ sources/legacy/image_description.cc \
sources/legacy/linboConsoleImpl.cc \ sources/legacy/linboConsoleImpl.cc \
@ -105,3 +107,9 @@ FORMS += \
RESOURCES += \ RESOURCES += \
resources/linbo.qrc resources/linbo.qrc
DISTFILES += \
resources/fonts/Segoe UI Bold Italic.ttf \
resources/fonts/Segoe UI Bold.ttf \
resources/fonts/Segoe UI Italic.ttf \
resources/fonts/Segoe UI.ttf

Binary file not shown.

BIN
resources/fonts/SegoeUI.eot Normal file

Binary file not shown.

1520
resources/fonts/SegoeUI.svg Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 92 KiB

BIN
resources/fonts/SegoeUI.ttf Normal file

Binary file not shown.

Binary file not shown.

View file

@ -26,5 +26,6 @@
<file>svgIcons/shutdownAction.svg</file> <file>svgIcons/shutdownAction.svg</file>
<file>svgIcons/rebootAction.svg</file> <file>svgIcons/rebootAction.svg</file>
<file>svgIcons/settingsAction.svg</file> <file>svgIcons/settingsAction.svg</file>
<file>fonts/SegoeUI.ttf</file>
</qresource> </qresource>
</RCC> </RCC>

View file

@ -25,11 +25,18 @@ using namespace std;
LinboBackend::LinboBackend(QObject *parent) : QObject(parent) LinboBackend::LinboBackend(QObject *parent) : QObject(parent)
{ {
this->setState(Initializing); this->setState(Initializing);
this->logger = new LinboLogger(this);
this->config = new LinboConfig(this); this->config = new LinboConfig(this);
this->autostartTimer = new QTimer(this);
this->autostartTimer->setSingleShot(true);
this->autostartRemainingTimeRefreshTimer = new QTimer(this);
this->autostartRemainingTimeRefreshTimer->setSingleShot(true);
this->autostartRemainingTimeRefreshTimer->setInterval(10);
this->autostartElapsedTimer = new QElapsedTimer();
this->currentOs = nullptr; this->currentOs = nullptr;
// read start.conf // read start.conf
qDebug() << "Starting to parse start.conf"; this->logger->log("Starting to parse start.conf", LinboLogger::LinboGuiInfo);
ifstream input; ifstream input;
input.open( "start.conf", ios_base::in ); input.open( "start.conf", ios_base::in );
@ -83,12 +90,8 @@ LinboBackend::LinboBackend(QObject *parent) : QObject(parent)
} }
input.close(); input.close();
// default select first OS this->logger->log("Finished to parsing start.conf", LinboLogger::LinboGuiInfo);
if(this->operatingSystems.length() > 0 && this->currentOs == nullptr) this->logger->log("Loading global configuration", LinboLogger::LinboGuiInfo);
this->currentOs = this->operatingSystems[0];
qDebug() << "Finished parsing start.conf";
qDebug() << "Loading global configuration";
// load global config // load global config
QStringList command; QStringList command;
@ -130,7 +133,17 @@ LinboBackend::LinboBackend(QObject *parent) : QObject(parent)
hd.remove( *removePartition ); hd.remove( *removePartition );
this->config->setHddSize(this->executeCommand(true, "size", hd)); this->config->setHddSize(this->executeCommand(true, "size", hd));
qDebug() << "Finished loading global configuration";
this->logger->log("Finished loading global configuration", LinboLogger::LinboGuiInfo);
// default select first OS if no other OS has been selected yet
if(this->operatingSystems.length() > 0 && this->currentOs == nullptr)
this->currentOs = this->operatingSystems[0];
// triger autostart
if(this->currentOs->getAutostart())
this->executeAutostart();
else
this->setState(Idle); this->setState(Idle);
} }
@ -139,6 +152,11 @@ LinboBackend::LinboBackend(QObject *parent) : QObject(parent)
// -------------------- // --------------------
void LinboBackend::executeAutostart() { void LinboBackend::executeAutostart() {
this->autostartTimer->setInterval(this->currentOs->getAutostartTimeout() * 1000);
this->autostartElapsedTimer->restart();
}
void handleAutostartTimerTimeout() {
} }
@ -159,6 +177,7 @@ bool LinboBackend::startCurrentOs() {
this->setState(Starting); this->setState(Starting);
return true; return true;
this->executeCommand( this->executeCommand(
false, false,
"start", "start",
@ -284,6 +303,10 @@ bool LinboBackend::updateLinbo() {
return true; return true;
} }
LinboLogger* LinboBackend::getLogger() {
return this->logger;
}
LinboConfig* LinboBackend::getConfig() { LinboConfig* LinboBackend::getConfig() {
return this->config; return this->config;
} }
@ -304,13 +327,22 @@ void LinboBackend::setCurrentOs(LinboOs* os) {
emit this->currentOsChanged(os); emit this->currentOsChanged(os);
} }
double LinboBackend::getAutostartTimeoutProgress() {
return this->autostartElapsedTimer->elapsed() / this->autostartTimer->interval();
}
int LinboBackend::getAutostartTimeoutRemainingSeconds() {
return (this->autostartTimer->interval() - this->autostartElapsedTimer->elapsed()) / 1000;
}
// ----------- // -----------
// - Helpers - // - Helpers -
// ----------- // -----------
QString LinboBackend::executeCommand(bool waitForFinished, QString command, QStringList commandArgs) { QString LinboBackend::executeCommand(bool waitForFinished, QString command, QStringList commandArgs) {
qDebug() << "Executing " << (waitForFinished ? "synchronos":"asynchronos") << ": " << command << " " << commandArgs.join(" "); this->logger->log("Executing " + QString(waitForFinished ? "synchronos":"asynchronos") + ": " + command + " " + commandArgs.join(" "), LinboLogger::LinboGuiInfo);
if(waitForFinished) { if(waitForFinished) {
// clear old output // clear old output
@ -332,11 +364,19 @@ QString LinboBackend::executeCommand(bool waitForFinished, QString command, QStr
void LinboBackend::readFromStdout() { void LinboBackend::readFromStdout() {
qDebug() << "OUT: " << this->asynchronosProcess->readAllStandardOutput(); QString stdOut = this->asynchronosProcess->readAllStandardOutput();
QStringList lines = stdOut.split("\n");
for(QString line : lines) {
this->logger->log(line, LinboLogger::StdOut);
}
} }
void LinboBackend::readFromStderr() { void LinboBackend::readFromStderr() {
qDebug() << "ERR: " << this->asynchronosProcess->readAllStandardError(); QString stdOut = this->asynchronosProcess->readAllStandardError();
QStringList lines = stdOut.split("\n");
for(QString line : lines) {
this->logger->log(line, LinboLogger::StdErr);
}
} }
LinboBackend::LinboState LinboBackend::getState() { LinboBackend::LinboState LinboBackend::getState() {
@ -377,7 +417,6 @@ LinboOs* LinboBackend::read_os(ifstream* input) {
LinboOs* os = new LinboOs(this); LinboOs* os = new LinboOs(this);
QString key, value; QString key, value;
while(!input->eof() && read_pair(input, key, value)) { while(!input->eof() && read_pair(input, key, value)) {
qDebug() << key << "=" << value;
if(key.compare("name") == 0) os->setName(value); if(key.compare("name") == 0) os->setName(value);
else if(key.compare("description") == 0) os->setDescription(value); else if(key.compare("description") == 0) os->setDescription(value);
else if(key.compare("version") == 0) os->setVersion(value); else if(key.compare("version") == 0) os->setVersion(value);

View file

@ -0,0 +1,34 @@
#include "../../headers/backend/linbologger.h"
LinboLogger::LinboLogger(QObject *parent) : QObject(parent)
{
}
QString LinboLogger::logTypeToString(LinboLogType logType) {
switch (logType) {
case StdErr:
return "StrErr";
case StdOut:
return "StdOut";
case LinboGuiInfo:
return "Info";
case LinboGuiError:
return "Error";
default:
return "UNKNOW";
}
}
void LinboLogger::log(QString logText, LinboLogType logType) {
if(logText.isEmpty() || logText == "")
return;
qDebug() << qPrintable("[" + this->logTypeToString(logType) + "]") << logText;
LinboLog latestLog {logText, logType, QDateTime::currentDateTime()};
this->logHistory.append(latestLog);
emit this->latestLogChanged(latestLog);
}
const LinboLogger::LinboLog& LinboLogger::getLatestLog() {
return this->logHistory.last();
}

View file

@ -1504,7 +1504,7 @@ void linboGUIImpl::resetButtons() {
} }
void linboGUIImpl::executeAutostart() { void linboGUIImpl::executeAutostart() {
return; // autostart is handles by new GUI return; // autostart is handled by new backend
// if there is "autopartition" set, execute the hidden button // if there is "autopartition" set, execute the hidden button
if( autopartition ) if( autopartition )
autopartition->lclicked(); autopartition->lclicked();
@ -1543,6 +1543,7 @@ void linboGUIImpl::executeAutostart() {
} }
void linboGUIImpl::autostartTimeoutSlot() { void linboGUIImpl::autostartTimeoutSlot() {
return; // autostart is handled by new backend
if( !myCounter->timeoutCheck->isChecked() ) { if( !myCounter->timeoutCheck->isChecked() ) {
// do nothing but dont stop timer // do nothing but dont stop timer
} }

View file

@ -29,7 +29,9 @@ LinboGui::LinboGui()
this->setFixedHeight(QApplication::desktop()->screenGeometry().height()); this->setFixedHeight(QApplication::desktop()->screenGeometry().height());
this->setFixedWidth(QApplication::desktop()->screenGeometry().width()); this->setFixedWidth(QApplication::desktop()->screenGeometry().width());
qDebug() << this->geometry(); QFontDatabase db;
qDebug() << QFontDatabase::addApplicationFont(":/fonts/SegoeUI.ttf");
qDebug() << db.families();
// white bakground // white bakground
// linuxmuster background color: #394f5e // linuxmuster background color: #394f5e

View file

@ -5,6 +5,7 @@ LinboStartActions::LinboStartActions(LinboBackend* backend, QWidget *parent) : Q
this->backend = backend; this->backend = backend;
connect(this->backend, SIGNAL(currentOsChanged(LinboOs*)), this, SLOT(handleCurrentOsChanged(LinboOs*))); connect(this->backend, SIGNAL(currentOsChanged(LinboOs*)), this, SLOT(handleCurrentOsChanged(LinboOs*)));
connect(this->backend, SIGNAL(stateChanged(LinboBackend::LinboState)), this, SLOT(handleLinboStateChanged(LinboBackend::LinboState))); connect(this->backend, SIGNAL(stateChanged(LinboBackend::LinboState)), this, SLOT(handleLinboStateChanged(LinboBackend::LinboState)));
connect(this->backend->getLogger(), SIGNAL(latestLogChanged(const LinboLogger::LinboLog&)), this, SLOT(handleLatestLogChanged(const LinboLogger::LinboLog&)));
this->stackView = new QModernStackedWidget(this); this->stackView = new QModernStackedWidget(this);
@ -28,6 +29,13 @@ LinboStartActions::LinboStartActions(LinboBackend* backend, QWidget *parent) : Q
this->progressBarWidget = new QWidget(); this->progressBarWidget = new QWidget();
this->progressBar = new QModernProgressBar(this->progressBarWidget); this->progressBar = new QModernProgressBar(this->progressBarWidget);
this->progressBar->setIndeterminate(true); this->progressBar->setIndeterminate(true);
this->logLabel = new QLabel("", this->progressBarWidget);
this->logLabel->setAlignment(Qt::AlignCenter);
this->logFont = QFont("Segoe UI");
this->logLabel->setFont(this->logFont);
this->stackView->addWidget(this->progressBarWidget); this->stackView->addWidget(this->progressBarWidget);
connect(this->stackView, SIGNAL(currentChanged(int)), this, SLOT(resizeAndPositionAllItems())); connect(this->stackView, SIGNAL(currentChanged(int)), this, SLOT(resizeAndPositionAllItems()));
@ -142,7 +150,13 @@ void LinboStartActions::resizeAndPositionAllItems() {
this->progressBarWidget->setFixedSize(this->size()); this->progressBarWidget->setFixedSize(this->size());
int progressBarHeight = this->height() * 0.1; int progressBarHeight = this->height() * 0.1;
int progressBarWidth = this->width() * 0.5; int progressBarWidth = this->width() * 0.5;
progressBar->setGeometry((this->width() - progressBarWidth) / 2, (this->height() - progressBarHeight) / 2, progressBarWidth, progressBarHeight); int logLabelHeight = progressBarHeight * 2;
int logLabelWidth = this->width() * 0.8;
progressBar->setGeometry((this->width() - progressBarWidth) / 2, (this->height() - logLabelHeight - progressBarHeight) / 2, progressBarWidth, progressBarHeight);
this->logFont.setPixelSize(logLabelHeight * 0.8);
this->logLabel->setFont(this->logFont);
this->logLabel->setGeometry((this->width() - logLabelWidth) / 2, this->height() - logLabelHeight, logLabelWidth, logLabelHeight);
this->inited = true; this->inited = true;
} }
@ -173,3 +187,20 @@ void LinboStartActions::handleLinboStateChanged(LinboBackend::LinboState newStat
break; break;
} }
} }
void LinboStartActions::handleLatestLogChanged(const LinboLogger::LinboLog& latestLog) {
QString logColor = "black";
switch (latestLog.type) {
case LinboLogger::StdErr:
logColor = this->backend->getConfig()->getConsoleFontcolorStderr();
break;
case LinboLogger::StdOut:
// TODO?? logColor = this->backend->getConfig()->getConsoleFontcolorStdout();
break;
default:
break;
}
this->logLabel->setStyleSheet("QLabel { color : " + logColor + "; }");
this->logLabel->setText(latestLog.message);
}

View file

@ -55,6 +55,7 @@ LinboStartPage::LinboStartPage(LinboBackend* backend, QWidget *parent) : QWidget
mainLayout->addItem(new QSpacerItem(0,0, QSizePolicy::Minimum, QSizePolicy::Expanding)); mainLayout->addItem(new QSpacerItem(0,0, QSizePolicy::Minimum, QSizePolicy::Expanding));
QLabel* versionLabel = new QLabel(backend->getConfig()->getVersion() + " - mod by Dorian Zedler"); QLabel* versionLabel = new QLabel(backend->getConfig()->getVersion() + " - mod by Dorian Zedler");
versionLabel->setFont(QFont("Segoe UI"));
mainLayout->addWidget(versionLabel); mainLayout->addWidget(versionLabel);
@ -63,7 +64,7 @@ LinboStartPage::LinboStartPage(LinboBackend* backend, QWidget *parent) : QWidget
int height = this->height() * 0.2; int height = this->height() * 0.2;
int width = height / 3; int width = height / 3;
int margins = width * 0.1; int margins = width * 0.1;
int buttonWidth = width * 0.8; int buttonWidth = width * 0.6;
powerActionsLayoutWidget->setGeometry(QRect(this->width() - (width + margins), this->height() - (height + margins), width * 1.1, height)); powerActionsLayoutWidget->setGeometry(QRect(this->width() - (width + margins), this->height() - (height + margins), width * 1.1, height));
QModernPushButton* settingsActionButton = new QModernPushButton(":/svgIcons/settingsAction.svg"); QModernPushButton* settingsActionButton = new QModernPushButton(":/svgIcons/settingsAction.svg");

View file

@ -100,7 +100,7 @@ void QModernPushButton::keyReleaseEvent(QKeyEvent *e) {
void QModernPushButton::enterEvent(QEvent *e) { void QModernPushButton::enterEvent(QEvent *e) {
if(this->overlays.length() >= 2) if(this->overlays.length() >= 2 && this->isEnabled())
this->overlays[1]->setVisible(true); this->overlays[1]->setVisible(true);
return QAbstractButton::enterEvent(e); return QAbstractButton::enterEvent(e);
} }
@ -112,7 +112,7 @@ void QModernPushButton::leaveEvent(QEvent *e) {
} }
void QModernPushButton::mousePressEvent(QMouseEvent *e) { void QModernPushButton::mousePressEvent(QMouseEvent *e) {
if(this->overlays.length() >= 3) if(this->overlays.length() >= 3 && this->isEnabled())
this->overlays[2]->setVisible(true); this->overlays[2]->setVisible(true);
return QAbstractButton::mousePressEvent(e); return QAbstractButton::mousePressEvent(e);
} }