From 1698ca721f1f94180e9df023910f4ae4c08edad9 Mon Sep 17 00:00:00 2001 From: reionwong Date: Fri, 25 Jun 2021 02:10:34 +0800 Subject: [PATCH] Provide an interface to battery percentage --- CMakeLists.txt | 7 ++++++- qml/main.qml | 4 ---- src/battery.cpp | 33 +++++++++++++++++++++++++++++++-- src/battery.h | 4 ++++ src/main.cpp | 28 ++++++++++++++++++---------- src/org.cutefish.Statusbar.xml | 8 ++++++++ src/statusbar.cpp | 10 ++++++++++ src/statusbar.h | 2 ++ 8 files changed, 79 insertions(+), 17 deletions(-) create mode 100644 src/org.cutefish.Statusbar.xml diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e1d81b..a62bde7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,7 +91,12 @@ qt_add_dbus_adaptor(appmenu_SRCS src/appmenu/com.canonical.AppMenu.Registrar.xml qt_add_dbus_adaptor(appmenu_SRCS src/appmenu/org.cutefish.cappmenu.xml src/appmenu/appmenudbus.h AppmenuDBus appmenuadaptor AppmenuAdaptor) -add_executable(cutefish-statusbar ${SRCS} ${appmenu_SRCS}) +## statusbar dbus +qt5_add_dbus_adaptor(DBUS_SOURCES + src/org.cutefish.Statusbar.xml + src/statusbar.h StatusBar) + +add_executable(cutefish-statusbar ${SRCS} ${appmenu_SRCS} ${DBUS_SOURCES}) target_include_directories(cutefish-statusbar PUBLIC ${XCB_LIBS_INCLUDE_DIRS}) target_link_libraries(cutefish-statusbar diff --git a/qml/main.qml b/qml/main.qml index 225be9e..1eac62b 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -361,10 +361,6 @@ Item { id: volume } - Battery { - id: battery - } - NM.ActiveConnection { id: activeConnection } diff --git a/src/battery.cpp b/src/battery.cpp index 98b9fb5..bba0fcf 100644 --- a/src/battery.cpp +++ b/src/battery.cpp @@ -18,11 +18,22 @@ */ #include "battery.h" +#include static const QString s_sServer = "org.cutefish.Settings"; static const QString s_sPath = "/PrimaryBattery"; static const QString s_sInterface = "org.cutefish.PrimaryBattery"; +static Battery *SELF = nullptr; + +Battery *Battery::self() +{ + if (!SELF) + SELF = new Battery; + + return SELF; +} + Battery::Battery(QObject *parent) : QObject(parent) , m_upowerInterface("org.freedesktop.UPower", @@ -35,10 +46,15 @@ Battery::Battery(QObject *parent) QDBusConnection::sessionBus()) , m_available(false) , m_onBattery(false) + , m_showPercentage(false) { m_available = m_interface.isValid() && !m_interface.lastError().isValid(); if (m_available) { + QSettings settings("cutefishos", "statusbar"); + settings.setDefaultFormat(QSettings::IniFormat); + m_showPercentage = settings.value("BatteryPercentage", true).toBool(); + QDBusConnection::sessionBus().connect(s_sServer, s_sPath, s_sInterface, "chargeStateChanged", this, SLOT(chargeStateChanged(int))); QDBusConnection::sessionBus().connect(s_sServer, s_sPath, s_sInterface, "chargePercentChanged", this, SLOT(chargePercentChanged(int))); QDBusConnection::sessionBus().connect(s_sServer, s_sPath, s_sInterface, "lastChargedPercentChanged", this, SLOT(lastChargedPercentChanged())); @@ -76,8 +92,21 @@ bool Battery::onBattery() const bool Battery::showPercentage() const { - // TODO - return true; + return m_showPercentage; +} + +void Battery::setShowPercentage(bool enabled) +{ + if (enabled == m_showPercentage) + return; + + m_showPercentage = enabled; + + QSettings settings("cutefishos", "statusbar"); + settings.setDefaultFormat(QSettings::IniFormat); + settings.setValue("BatteryPercentage", m_showPercentage); + + emit showPercentageChanged(); } int Battery::chargeState() const diff --git a/src/battery.h b/src/battery.h index 0a2dd36..47fb10c 100644 --- a/src/battery.h +++ b/src/battery.h @@ -37,11 +37,14 @@ class Battery : public QObject Q_PROPERTY(QString iconSource READ iconSource NOTIFY iconSourceChanged) public: + static Battery *self(); explicit Battery(QObject *parent = nullptr); bool available() const; bool onBattery() const; + bool showPercentage() const; + void setShowPercentage(bool enabled); int chargeState() const; int chargePercent() const; @@ -70,6 +73,7 @@ private: QDBusInterface m_interface; bool m_available; bool m_onBattery; + bool m_showPercentage; }; #endif // BATTERY_H diff --git a/src/main.cpp b/src/main.cpp index 42991c4..6b61520 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,16 +37,6 @@ int main(int argc, char *argv[]) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication app(argc, argv); - QString qmFilePath = QString("%1/%2.qm").arg("/usr/share/cutefish-statusbar/translations/").arg(QLocale::system().name()); - if (QFile::exists(qmFilePath)) { - QTranslator *translator = new QTranslator(QApplication::instance()); - if (translator->load(qmFilePath)) { - QGuiApplication::installTranslator(translator); - } else { - translator->deleteLater(); - } - } - const char *uri = "Cutefish.StatusBar"; qmlRegisterType(uri, 1, 0, "SystemTrayModel"); qmlRegisterType(uri, 1, 0, "ControlCenterDialog"); @@ -59,5 +49,23 @@ int main(int argc, char *argv[]) StatusBar bar; + if (!QDBusConnection::sessionBus().registerService("org.cutefish.Statusbar")) { + return -1; + } + + if (!QDBusConnection::sessionBus().registerObject("/Statusbar", &bar)) { + return -1; + } + + QString qmFilePath = QString("%1/%2.qm").arg("/usr/share/cutefish-statusbar/translations/").arg(QLocale::system().name()); + if (QFile::exists(qmFilePath)) { + QTranslator *translator = new QTranslator(QApplication::instance()); + if (translator->load(qmFilePath)) { + QGuiApplication::installTranslator(translator); + } else { + translator->deleteLater(); + } + } + return app.exec(); } diff --git a/src/org.cutefish.Statusbar.xml b/src/org.cutefish.Statusbar.xml new file mode 100644 index 0000000..29a49c0 --- /dev/null +++ b/src/org.cutefish.Statusbar.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/statusbar.cpp b/src/statusbar.cpp index 1440bb2..d71d40b 100644 --- a/src/statusbar.cpp +++ b/src/statusbar.cpp @@ -18,12 +18,15 @@ */ #include "statusbar.h" +#include "battery.h" #include "processprovider.h" #include "appmenu/appmenu.h" +#include "statusbaradaptor.h" #include #include +#include #include #include @@ -42,10 +45,12 @@ StatusBar::StatusBar(QQuickView *parent) KWindowSystem::setType(winId(), NET::Dock); KWindowEffects::slideWindow(winId(), KWindowEffects::TopEdge); + new StatusbarAdaptor(this); new AppMenu(this); engine()->rootContext()->setContextProperty("acticity", m_acticity); engine()->rootContext()->setContextProperty("process", new ProcessProvider); + engine()->rootContext()->setContextProperty("battery", Battery::self()); setSource(QUrl(QStringLiteral("qrc:/qml/main.qml"))); setResizeMode(QQuickView::SizeRootObjectToView); @@ -57,6 +62,11 @@ StatusBar::StatusBar(QQuickView *parent) connect(qApp->primaryScreen(), &QScreen::geometryChanged, this, &StatusBar::updateGeometry); } +void StatusBar::setBatteryPercentage(bool enabled) +{ + Battery::self()->setShowPercentage(enabled); +} + void StatusBar::updateGeometry() { const QRect rect = qApp->primaryScreen()->geometry(); diff --git a/src/statusbar.h b/src/statusbar.h index 5fe0f19..6ae2c7a 100644 --- a/src/statusbar.h +++ b/src/statusbar.h @@ -30,6 +30,8 @@ class StatusBar : public QQuickView public: explicit StatusBar(QQuickView *parent = nullptr); + void setBatteryPercentage(bool enabled); + void updateGeometry(); void updateViewStruts();