diff options
author | Tim <contact@bytim.eu> | 2025-02-08 11:28:57 +0100 |
---|---|---|
committer | Tim <contact@bytim.eu> | 2025-02-08 11:28:57 +0100 |
commit | d69bc395e6cc9ed5e1da6a31835874142fe6800e (patch) | |
tree | 324cf18c710721c286890d78310ebe0075499ea4 /src/distractionless | |
download | distractionless-d69bc395e6cc9ed5e1da6a31835874142fe6800e.tar.xz distractionless-d69bc395e6cc9ed5e1da6a31835874142fe6800e.zip |
Initial commit
Diffstat (limited to 'src/distractionless')
-rw-r--r-- | src/distractionless/config.cljd | 29 | ||||
-rw-r--r-- | src/distractionless/core.cljd | 53 | ||||
-rw-r--r-- | src/distractionless/ui/apps.cljd | 26 | ||||
-rw-r--r-- | src/distractionless/ui/apps/settings.cljd | 42 | ||||
-rw-r--r-- | src/distractionless/ui/constants.cljd | 15 |
5 files changed, 165 insertions, 0 deletions
diff --git a/src/distractionless/config.cljd b/src/distractionless/config.cljd new file mode 100644 index 0000000..07d86b8 --- /dev/null +++ b/src/distractionless/config.cljd @@ -0,0 +1,29 @@ +(ns distractionless.config + (:require ["dart:io" :as io] + [cljd.reader :as cljdreader])) + +(defn read-from-file [^io/File file] + (->> (.readAsStringSync file) + cljdreader/read-string)) + +(defn write-to-file! [^io/File file content reloader] + (->> content + pr-str + (.writeAsStringSync file)) + (when (some? reloader) + (reset! reloader (when (= @reloader 0) + 1 + 0)))) + +(defn update-config! [^io/File file func reloader] + (let [new-content (-> (read-from-file file) + func)] + (write-to-file! file new-content reloader) + new-content)) + +(defn init-config! [^io/File file reloader] + (when-not (.existsSync file) + (.createSync file) + (write-to-file! file {} reloader)) + (when-not (contains? (read-from-file file) "favourites") + (prn (update-config! file #(assoc % "favourites" #{}) reloader)))) diff --git a/src/distractionless/core.cljd b/src/distractionless/core.cljd new file mode 100644 index 0000000..2036da6 --- /dev/null +++ b/src/distractionless/core.cljd @@ -0,0 +1,53 @@ +(ns distractionless.core + (:require ["package:flutter/material.dart" :as m] + [cljd.flutter :as f] + ["package:path_provider/path_provider.dart" :as path-provider] + [distractionless.config :as dconfig] + ["dart:io" :as io] + + [distractionless.ui.constants :as duconstants] + [distractionless.ui.apps :as duapps])) + +(defn ^dynamic main [] + (f/run + (m/MaterialApp + .theme (m/ThemeData .primarySwatch m.Colors/pink)) + .home + (m/Scaffold .backgroundColor duconstants/background-color) + .body + :context ctx + :watch [apps (atom '()) :as *apps + query (atom "") :as *query + data-dir (await (path-provider/getApplicationDocumentsDirectory)) + _ (atom 0) :as reloader] + :managed [_ (duapps/load-installed-apps! *apps) ; loads apps on app startup + config-file (io/File. (str (.-path data-dir) "/config.edn")) + _ (dconfig/init-config! config-file nil) ; Init config on app startup + _ (m/AppLifecycleListener .onShow #(do (dconfig/init-config! config-file nil) + (duapps/load-installed-apps! *apps))) + page-controller (m/PageController.)] + :let [root-container-padding (m/EdgeInsets.only + .top 50)] + (m/PageView. + .controller page-controller + .children [(let [favourites (get (dconfig/read-from-file config-file) "favourites")] + (m/Container + .padding root-container-padding + .child (m/Column + .children [(m/Expanded + .child (duapps/apps-list (filter #(.contains favourites (.-packageName %)) apps) nil config-file ctx reloader)) + (m/Text "Wische nach links, um alle Apps anzuzeigen" + .style duconstants/text-style)]))) + (m/Container + .padding root-container-padding + .child (m/Column + .children [(m/Text "Alle Apps" + .style duconstants/title-style) + (m/SearchBar + .onChanged (fn [new-val] + (reset! *query new-val) + nil) + .hintText "Suche" + .backgroundColor (#/(.resolveWith m/Color?) m/MaterialStateProperty (fn [^Set _states] duconstants/search-bar-color))) + (m/Expanded + .child (duapps/apps-list apps query config-file ctx reloader))]))]))) diff --git a/src/distractionless/ui/apps.cljd b/src/distractionless/ui/apps.cljd new file mode 100644 index 0000000..7fd620c --- /dev/null +++ b/src/distractionless/ui/apps.cljd @@ -0,0 +1,26 @@ +(ns distractionless.ui.apps + (:require ["package:flutter/material.dart" :as m] + [clojure.string :as cstr] + ["package:installed_apps/installed_apps.dart" :as apps] + [distractionless.ui.constants :as duconstants] + [distractionless.ui.apps.settings :as duasettings])) + +(defn load-installed-apps! [a] + (reset! a (await (apps/InstalledApps.getInstalledApps)))) + +(defn- render-app [app config-file ctx reloader] + (m/ListTile + .title (m/Text (.-name app) + .style duconstants/text-style) + .onTap #(do (await (apps/InstalledApps.startApp (.-packageName app))) nil) + .onLongPress #(duasettings/open app config-file ctx reloader))) + +(defn apps-list [apps query config-file ctx reloader] + (m/ListView + .children (for [app (if (cstr/blank? query) + apps + (filter #(cstr/includes? + (cstr/lower-case (.-name %)) + (cstr/lower-case query)) + apps))] + (render-app app config-file ctx reloader)))) diff --git a/src/distractionless/ui/apps/settings.cljd b/src/distractionless/ui/apps/settings.cljd new file mode 100644 index 0000000..1b4de0a --- /dev/null +++ b/src/distractionless/ui/apps/settings.cljd @@ -0,0 +1,42 @@ +(ns distractionless.ui.apps.settings + (:require ["package:flutter/material.dart" :as m] + [cljd.flutter :as f] + [distractionless.ui.constants :as duconstants] + [distractionless.config :as dconfig])) + +(defn- header [app ctx] + (m/Row + .mainAxisAlignment m/MainAxisAlignment.spaceBetween + .children [(m/Text (.-name app) + .style duconstants/title-style) + (m/IconButton .icon (m/Icon m/Icons.clear_rounded) + .color duconstants/text-color + .onPressed #(m/Navigator.pop ctx) + .iconSize 30.0)])) + +(defn- favourite-setting [app config-file reloader] + (m/Row + .children [(m/Checkbox + .value (contains? (get (dconfig/read-from-file config-file) "favourites") + (.-packageName app)) + .onChanged (fn [new-val] + (if new-val + (dconfig/update-config! config-file + #(update % "favourites" conj (.-packageName app)) + reloader) + (dconfig/update-config! config-file + (fn [config] + (update config "favourites" disj (.-packageName app))) + reloader))) + .activeColor duconstants/checkbox-active-color) + (m/Text "Favorit")])) + +(defn open [app config-file ctx reloader] + (m/showDialog + .context ctx + .builder (f/build :watch [_ reloader] + (m/Dialog.fullscreen + .backgroundColor duconstants/background-color + .child (m/Column + .children (list (header app ctx) + (favourite-setting app config-file reloader))))))) diff --git a/src/distractionless/ui/constants.cljd b/src/distractionless/ui/constants.cljd new file mode 100644 index 0000000..505778f --- /dev/null +++ b/src/distractionless/ui/constants.cljd @@ -0,0 +1,15 @@ +(ns distractionless.ui.constants + (:require ["package:flutter/material.dart" :as m])) + +(def background-color (m/Color.fromARGB 255 157 166 159)) +(def search-bar-color (m/Color.fromARGB 255 138 150 141)) +(def text-color (m/Color.fromARGB 255 0 0 0)) + +(def checkbox-active-color (m/Color.fromARGB 255 86 93 86)) +(def checkbox-fill-color (m/Color.fromARGB 255 197 205 199)) + +(def text-style (m/TextStyle + .color text-color)) +(def title-style (m/TextStyle + .color text-color + .fontSize 30.0)) |