diff --git a/INSTALL.md b/INSTALL.md index 972d3b67..90ce3d8b 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -8,6 +8,7 @@ 4. [Manual installation](#manual) 5. [Configuring AeroThemePlasma](#conf) 6. [GTK](#gtk) +7. [Uninstalling AeroThemePlasma](#uninstall) ## Prerequisites @@ -35,7 +36,7 @@ KSysGuard has been officially deprecated by KDE, however an unofficial [port](ht Required Packages: ```bash -dnf install plasma-workspace-devel unzip kvantum qt6-qtmultimedia-devel qt6-qt5compat-devel libplasma-devel qt6-qtbase-devel qt6-qtwayland-devel plasma-activities-devel kf6-kpackage-devel kf6-kglobalaccel-devel qt6-qtsvg-devel wayland-devel plasma-wayland-protocols kf6-ksvg-devel kf6-kcrash-devel kf6-kguiaddons-devel kf6-kcmutils-devel kf6-kio-devel kdecoration-devel kf6-ki18n-devel kf6-knotifications-devel kf6-kirigami-devel kf6-kiconthemes-devel cmake gmp-ecm-devel kf5-plasma-devel libepoxy-devel kwin-devel kf6-karchive kf6-karchive-devel plasma-wayland-protocols-devel qt6-qtbase-private-devel qt6-qtbase-devel kf6-knewstuff-devel kf6-knotifyconfig-devel kf6-attica-devel kf6-krunner-devel kf6-kdbusaddons-devel kf6-sonnet-devel plasma5support-devel plasma-activities-stats-devel polkit-qt6-1-devel qt-devel libdrm-devel kf6-kitemmodels-devel kf6-kstatusnotifieritem-devel +dnf install plasma-workspace-devel unzip kvantum qt6-qtmultimedia-devel qt6-qt5compat-devel libplasma-devel qt6-qtbase-devel qt6-qtwayland-devel plasma-activities-devel kf6-kpackage-devel kf6-kglobalaccel-devel qt6-qtsvg-devel wayland-devel plasma-wayland-protocols kf6-ksvg-devel kf6-kcrash-devel kf6-kguiaddons-devel kf6-kcmutils-devel kf6-kio-devel kdecoration-devel kf6-ki18n-devel kf6-knotifications-devel kf6-kirigami-devel kf6-kiconthemes-devel cmake gmp-ecm-devel kf5-plasma-devel libepoxy-devel kwin-devel kf6-karchive kf6-karchive-devel plasma-wayland-protocols-devel qt6-qtbase-private-devel qt6-qtbase-devel kf6-knewstuff-devel kf6-knotifyconfig-devel kf6-attica-devel kf6-krunner-devel kf6-kdbusaddons-devel kf6-sonnet-devel plasma5support-devel plasma-activities-stats-devel polkit-qt6-1-devel qt-devel libdrm-devel kf6-kitemmodels-devel kf6-kstatusnotifieritem-devel kf6-frameworkintegration-devel ``` On Fedora, additional dependencies for X11 include: @@ -58,7 +59,7 @@ In openSUSE, additional dependencies for X11 include: ### Ubuntu 25.10 ```bash -apt install build-essential cmake ninja-build curl libqt6virtualkeyboard6 libqt6multimedia6 libqt6core5compat6 libplasma5support6 libkdecorations3-dev libkf6colorscheme-dev libkf6i18n-dev libkf6iconthemes-dev libkf6kcmutils-dev libkirigami-dev libkf6kio-dev libkf6notifications-dev libkf6svg-dev libkf6crash-dev libkf6globalaccel-dev libplasma-dev libplasmaactivities-dev libxcb-composite0-dev libxcb-randr0-dev libxcb-shm0-dev libxcb-damage0-dev libepoxy-dev libqt6svg6-dev kwin-dev plasma-wayland-protocols +apt install build-essential cmake ninja-build curl libqt6virtualkeyboard6 libqt6multimedia6 libqt6core5compat6 libplasma5support6 libkdecorations3-dev libkf6colorscheme-dev libkf6i18n-dev libkf6iconthemes-dev libkf6kcmutils-dev libkirigami-dev libkf6kio-dev libkf6notifications-dev libkf6svg-dev libkf6crash-dev libkf6globalaccel-dev libplasma-dev libplasmaactivities-dev libxcb-composite0-dev libxcb-randr0-dev libxcb-shm0-dev libxcb-damage0-dev libepoxy-dev libqt6svg6-dev kwin-dev plasma-wayland-protocols libkf5qqc2desktopstyle-dev libkf6qqc2desktopstyle-dev libplasma5support-dev libkf6auth-dev libkf6newstuff-dev libkf6notifyconfig-dev libkf6attica-dev libkf6runner-dev libkf6dbusaddons-dev libkf6sonnet-dev libkf6xmlgui-dev libkf6coreaddons-dev libkf6widgetsaddons-dev libkf6guiaddons-dev qt6-base-dev qt6-5compat-dev qml-module-org-kde-qqc2desktopstyle libplasmaactivitiesstats-dev plasma-workspace-dev libkf6statusnotifieritem-dev qml-module-org-kde-kirigami-addons-sounds qml6-module-org-kde-kirigamiaddons-sounds ``` On Ubuntu, additional dependencies for X11 include: @@ -84,11 +85,11 @@ There are two ways to install AeroThemePlasma: Using the provided install script This is the recommended way of installing ATP. The install scripts compile and deploy the components required for ATP to work. Run the install scripts in the terminal: ```sh -$ sh compile.sh --ninja -$ sh install_plasmoids.sh --ninja -$ sh install_kwin_components.sh -$ sh install_plasma_components.sh -$ sh install_misc_components.sh +$ bash compile.sh --ninja +$ bash install_plasmoids.sh --ninja +$ bash install_kwin_components.sh +$ bash install_plasma_components.sh +$ bash install_misc_components.sh ``` During execution, some scripts may require admin privileges or other prompts from the user. Do **NOT** run any of the provided install scripts with sudo or as root. @@ -109,18 +110,23 @@ You can additionally pass `--ninja` to any of the following scripts in order to - `install_plasmoids.sh` - Any individual `install.sh` script +Other notable flags include: + +1. `--skip-libplasma` in `compile.sh`, which skips libplasma patches from being compiled and installed +2. `--skip-kpackages` in `install_plasmoids.sh`, which skips installing the QML components of plasmoids + ### Note for Wayland users The compile script must be run while passing the `--wayland` argument for KWin effects: ```bash -$ sh compile.sh --wayland --ninja +$ bash compile.sh --wayland --ninja ``` If compiling individual KWin effects by running their respective `install.sh` scripts, you can also pass the `--wayland` argument there: ```bash -$ sh install.sh --wayland --ninja +$ bash install.sh --wayland --ninja ``` ### Updating AeroThemePlasma @@ -135,12 +141,12 @@ $ git pull and re-run the install scripts: ```sh -$ sh compile.sh -$ sh install_plasmoids.sh -$ sh install_plasmoids.sh --no-compile # If there's no need to recompile the C++ parts of the plasmoids, you can pass this argument to speed things up -$ sh install_kwin_components.sh -$ sh install_plasma_components.sh -$ sh install_misc_components.sh # Usually not required to run again +$ bash compile.sh +$ bash install_plasmoids.sh +$ bash install_plasmoids.sh --no-compile # If there's no need to recompile the C++ parts of the plasmoids, you can pass this argument to speed things up +$ bash install_kwin_components.sh +$ bash install_plasma_components.sh +$ bash install_misc_components.sh # Usually not required to run again ``` Typically it's enough to run the first four scripts after ATP has been updated. It's highly recommended to check for new commits and read the extended descriptions in order to see what has actually changed and what's required when updating. @@ -169,7 +175,7 @@ SevenTasks relies on modifications found in `misc/libplasma` in order to work pr 2. Compile all the C++ components found in the `plasmoids/src` directory like this for each source directory: ```bash -$ sh install.sh --ninja +$ bash install.sh --ninja ``` 3. Move `sddm/sddm-theme-mod` to `/usr/share/sddm/themes`. Optionally, to enable the Vista start screen, set `enableStartup=true` in `theme.conf.user` @@ -281,3 +287,151 @@ echo -e "Microsoft Windows [Version 6.1.7600]\nCopyright (c) 2009 Microsoft Corp AeroThemePlasma officially doesn't have any kind of maintenance, development or support for GTK applications. Instead, check out [Windows 7 Better](https://gitgud.io/Gamer95875/Windows-7-Better) by [Gamer95875](https://gitgud.io/Gamer95875), which is the recommended set of themes that works best with AeroThemePlasma. + +## Uninstalling AeroThemePlasma + +AeroThemePlasma provides an uninstall script that undoes much of what's installed on the system. The script assumes that all of the CMake build files are still present in the repo, most importantly the `install_manifest.txt` files generated as a result of installing compiled parts of ATP. If these files are missing from the repo, they need to be regenerated by once again rerunning the necessary scripts like this: + +```bash +$ bash compile.sh --skip-libplasma [--wayland] [--ninja] +$ bash install_plasmoids.sh --skip-kpackages [--ninja] +``` + +Once this is done, the script is simply executed: + +```bash +$ bash uninstall.sh +``` + +This should be run outside of the AeroThemePlasma session, preferrably in a regular Plasma session. The script will ask for confirmation to uninstall components of the system. **Please check that none of the locations are ill-formed before accepting each prompt, especially those that require additional privileges to uninstall. In case this happens to you, report it as an issue ASAP.** + +Afterwards, `libplasma` and `polkit-kde-agent` should be reinstalled using your distro's package manager. For example, on Arch Linux: + +```bash +sudo pacman -Sy libplasma polkit-kde-agent +``` + +### Manual uninstallation + +The script performs the following steps in order to uninstall ATP. Uninstalling ATP should be done outside of the ATP session itself. Log into the Plasma session before performing any of these steps. + +### CMake + +- Perform `sudo make uninstall` or `sudo ninja uninstall` in the following directories if applicable: + +``` +kwin/decoration/build +plasma/sddm/login-sessions/build +plasma/aerothemeplasma-kcmloader/build +plasma/plasmoids/src/systemtray_src/build +plasma/plasmoids/src/notifications_src/build +plasma/plasmoids/src/volume_src/build +plasma/plasmoids/src/sevenstart_src/build +plasma/plasmoids/src/seventasks_src/build +plasma/plasmoids/src/desktopcontainment/build +kwin/effects_cpp/kde-effects-aeroglassblur/build +kwin/effects_cpp/kwin-effect-smodsnap-v2/build +kwin/effects_cpp/smodglow/build +kwin/effects_cpp/aeroglide/build +kwin/effects_cpp/startupfeedback/build + +# For Wayland builds +kwin/effects_cpp/kde-effects-aeroglassblur/build-wl +kwin/effects_cpp/kwin-effect-smodsnap-v2/build-wl +kwin/effects_cpp/smodglow/build-wl +kwin/effects_cpp/aeroglide/build-wl +kwin/effects_cpp/startupfeedback/build-wl +``` + +### Plasmoids + +- Perform `kpackagetool6 -t "Plasma/Applet" -r "plasmoid_id"` for each plasmoid, replacing `plasmoid_id` with the following: + +``` +io.gitgud.wackyideas.battery +io.gitgud.wackyideas.desktopcontainment +io.gitgud.wackyideas.digitalclocklite +io.gitgud.wackyideas.keyboardlayout +io.gitgud.wackyideas.networkmanagement +io.gitgud.wackyideas.panel +io.gitgud.wackyideas.SevenStart +io.gitgud.wackyideas.seventasks +io.gitgud.wackyideas.volume +io.gitgud.wackyideas.win7showdesktop +``` + +### Plasma components + +- Perform the following commands: + +```bash +kpackagetool6 -t "Plasma/LookAndFeel" -r "authui7" +kpackagetool6 -t "Plasma/LayoutTemplate" -r "io.gitgud.wackyideas.taskbar" +kpackagetool6 -t "Plasma/Theme" -r "Seven-Black" +kpackagetool6 -t "Plasma/Shell" -r "io.gitgud.wackyideas.desktop" +``` + +- Delete `~/.local/share/color-schemes/Aero.colors` +- Delete `~/.config/Kvantum/Windows7Aero` +- Delete the sound themes from `~/.local/share/sounds`: + +``` +'Windows 7' +'Windows 7 Afternoon' +'Windows 7 Calligraphy' +'Windows 7 Characters' +'Windows 7 Cityscape' +'Windows 7 Delta' +'Windows 7 Festival' +'Windows 7 Garden' +'Windows 7 Heritage' +'Windows 7 Landscape' +'Windows 7 Quirky' +'Windows 7 Raga' +'Windows 7 Savanna' +'Windows 7 Sonata' +``` + +- Delete the icon theme at `~/.local/share/icons/Windows 7 Aero` +- Delete the following files at `~/.local/share/mime/packages`: + +``` +application-vnd.microsoft.portable-executable.xml +application-x-ms-dll.xml +application-x-msdownload.xml +application-x-ms-ne-executable.xml +``` + +and run `update-mime-database ~/.local/share/mime` to refresh MIME associations + +### KWin components + +- Perform `kpackagetool6 -t "KWin/Effect" -r "effect_id"` for each effect, replacing `effect_id` with the following: + +``` +dimscreenaero +fadingpopupsaero +loginaero +seventasks-thumbnails +smodpeekeffect +squashaero +``` + +- Perform the following: + +```bash +kpackagetool6 -t "KWin/Script" -r "smodpeekscript" +kpackagetool6 -t "KWin/WindowSwitcher" -r "flip3d" +kpackagetool6 -t "KWin/WindowSwitcher" -r "thumbnail_seven" +``` + +- Delete the outline at `~/.local/share/kwin/outline` +- Delete the symlinks `~/.local/share/kwin-x11` and `~/.local/share/kwin-wayland` +- Delete the branding at `~/.config/kdedefaults/kcm-about-distrorc` and the logo (`~/.config/kdedefaults/kcminfo.png`) + +### Other components + +- Delete the cursor theme at `/usr/share/icons/aero-drop` +- Delete the SDDM theme at `/usr/share/sddm/themes/sddm-theme-mod` +- Delete the SMOD files at `/usr/share/smod` and `~/.local/share/smod` +- Delete `/opt/aerothemeplasma` diff --git a/README.md b/README.md index 36992a25..f6b482c3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This is a project which aims to recreate the look and feel of Windows 7 as much ATP is in constant development and testing, it has been tested on: - Arch Linux x64 and other Arch derivatives -- Plasma 6.5.0, KDE Frameworks 6.19.0, Qt 6.10.0 +- Plasma 6.5.5, KDE Frameworks 6.22.0, Qt 6.10.1 - 96 DPI scaling, multi monitor - X11, Wayland* @@ -59,6 +59,7 @@ Huge thanks to everyone who helped out along the way by contributing, testing, p - [AngelBruni](https://github.com/angelbruni) for contributing several SVG textures, most notably the clock in DigitalClockLite Seven - [ricewind012](https://github.com/ricewind012/) for .bashrc Microsoft Windows header - [furkrn](https://gitgud.io/furkrn) for creating and maintaining the [Plymouth theme](https://github.com/furkrn/PlymouthVista) +- [IcyGuidance](https://gitgud.io/IcyGuidance) for designing the notification badges in SevenTasks ### Special Thanks diff --git a/compile.sh b/compile.sh index 3c94f555..31dfcc4f 100755 --- a/compile.sh +++ b/compile.sh @@ -1,8 +1,9 @@ #!/bin/bash # You can pass the following arguments to this script: -# --ninja Uses Ninja for faster compilation -# --wayland Tells the KWin build scripts to compile the C++ effects for Wayland +# --ninja Uses Ninja for faster compilation +# --wayland Tells the KWin build scripts to compile the C++ effects for Wayland +# --skip-libplasma Skips compiling libplasma patches CUR_DIR=$(pwd) USE_SCRIPT="install.sh" @@ -21,9 +22,11 @@ fi # Compiles the libplasma patches required for other components of ATP. # Requires a restart to be applied. -cd "$PWD/misc/libplasma" -sh $USE_SCRIPT $@ -cd "$CUR_DIR" +if [[ "$*" != *"--skip-libplasma"* ]]; then + cd "$PWD/misc/libplasma" + bash $USE_SCRIPT $@ + cd "$CUR_DIR" +fi #echo "Compiling plasmoids..." #for filename in "$PWD/plasma/plasmoids/src/"*; do @@ -37,14 +40,19 @@ cd "$CUR_DIR" # Compiles the window decoration theme engine. echo "Compiling SMOD decorations..." cd "$PWD/kwin/decoration" -sh $USE_SCRIPT $@ +bash $USE_SCRIPT $@ cd "$CUR_DIR" echo "Done." +echo -e "Installing login manager entries..." +cd "$PWD/plasma/sddm/login-sessions" +bash $USE_SCRIPT +echo "Done." + # Compiles the settings KCM loader used for development and quick access of certain settings pages. echo "Compiling KCM loader..." cd "$PWD/plasma/aerothemeplasma-kcmloader" -sh $USE_SCRIPT $@ +bash $USE_SCRIPT $@ cd "$CUR_DIR" echo "Done." @@ -53,7 +61,7 @@ echo "Compiling KWin effects..." for filename in "$PWD/kwin/effects_cpp/"*; do cd "$filename" echo "Compiling $(pwd)" - sh $USE_SCRIPT $@ + bash $USE_SCRIPT $@ echo "Done." cd "$CUR_DIR" done diff --git a/install_plasma_components.sh b/install_plasma_components.sh index 380dc795..25f4dbf3 100755 --- a/install_plasma_components.sh +++ b/install_plasma_components.sh @@ -7,10 +7,6 @@ if [[ -z "$(command -v kpackagetool6)" ]]; then echo "kpackagetool6 not found. Stopping." exit fi -if [[ -z "$(command -v cmake)" ]]; then - echo "CMake not found. Stopping." - exit -fi if [[ -z "$(command -v tar)" ]]; then echo "tar not found. Stopping." exit @@ -54,9 +50,6 @@ cp "$PWD/plasma/color_scheme/Aero.colors" "$COLOR_DIR" #plasma-apply-colorscheme Aero # Installs the SDDM theme, as well as the SDDM entries required for ATP. -echo -e "Installing login manager entries..." -cd "plasma/sddm/login-sessions" -sh install.sh echo -e "Installing SDDM theme..." cd "$CUR_DIR/plasma/sddm" tar -zcvf "sddm-theme-mod.tar.gz" "sddm-theme-mod" diff --git a/install_plasmoids.sh b/install_plasmoids.sh index 43316c5f..a5743cff 100755 --- a/install_plasmoids.sh +++ b/install_plasmoids.sh @@ -27,7 +27,7 @@ fi # Skips the build process of plasmoids that have C++ components # Most of the time, recompiling isn't needed as most changes are done # on the QML side. -if [[ $1 == '--no-compile' ]]; then +if [[ "$*" == *"--no-compile"* ]]; then echo "Skipping compilation..." else echo "Compiling plasmoids..." @@ -35,7 +35,7 @@ else for filename in "$PWD/plasma/plasmoids/src/"*; do cd "$filename" echo "Compiling $(pwd)" - sh $USE_SCRIPT $@ + bash $USE_SCRIPT $@ echo "Done." cd "$CUR_DIR" done @@ -65,12 +65,15 @@ function install_plasmoid { # As such, we need to first terminate plasmashell in order to retain # saved configurations -killall plasmashell - -for filename in "$PWD/plasma/plasmoids/"*; do - install_plasmoid "$filename" -done - -setsid plasmashell --replace & # Restart plasmashell and detach it from the script +if [[ "$*" == *"--skip-kpackages"* ]]; then + echo -e "Skipping QML Plasmoids" +else + killall plasmashell + for filename in "$PWD/plasma/plasmoids/"*; do + install_plasmoid "$filename" + done + setsid plasmashell --replace & # Restart plasmashell and detach it from the script +fi + diff --git a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/config.qml b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/config.qml index a60eaf81..35eef806 100644 --- a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/config.qml +++ b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/config.qml @@ -10,26 +10,27 @@ import org.kde.plasma.plasmoid 2.0 import org.kde.plasma.configuration 2.0 ConfigModel { - property bool isFolder: true //(Plasmoid.pluginName === "org.kde.plasma.folder") - ConfigCategory { name: i18n("Location") icon: "inode-directory" source: "ConfigLocation.qml" - visible: isFolder } ConfigCategory { name: i18n("Icons") icon: "preferences-desktop-icons" source: "ConfigIcons.qml" - visible: isFolder } ConfigCategory { name: i18n("Filter") icon: "preferences-desktop-filter" source: "ConfigFilter.qml" - visible: isFolder + } + + ConfigCategory { + name: i18n("Watermark") + icon: "plasma" + source: "ConfigWatermark.qml" } } diff --git a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/main.xml b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/main.xml index 0b87a731..3f2460d8 100644 --- a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/main.xml +++ b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/config/main.xml @@ -148,4 +148,13 @@ false + + + + false + + + [] + + diff --git a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/ConfigWatermark.qml b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/ConfigWatermark.qml new file mode 100644 index 00000000..3eaff489 --- /dev/null +++ b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/ConfigWatermark.qml @@ -0,0 +1,510 @@ +/* + * SPDX-FileCopyrightText: 2018 Friedrich W. H. Kossebau + * SPDX-FileCopyrightText: 2022 Ismael Asensio + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +import org.kde.kirigami as Kirigami +import org.kde.plasma.plasmoid +import org.kde.kcmutils as KCM + +Item { + id: root + + property var cfg_watermarks + property alias cfg_watermarkVisible: watermarkVisible.checked + + property Window watermarkConfigure: null + + component CustomGroupBox: GroupBox { + id: gbox + label: Label { + id: lbl + x: gbox.leftPadding + 2 + y: lbl.implicitHeight/2-gbox.bottomPadding-1 + width: lbl.implicitWidth + text: gbox.title + elide: Text.ElideRight + Rectangle { + anchors.fill: parent + anchors.leftMargin: -2 + anchors.rightMargin: -2 + color: "white" + z: -1 + } + } + background: Rectangle { + y: gbox.topPadding - gbox.bottomPadding*2 + width: parent.width + height: parent.height - gbox.topPadding + gbox.bottomPadding*2 + color: "transparent" + border.color: "#d5dfe5" + radius: 3 + } + } + + ListModel { + id: presets + + ListElement { text: "Windows 10" } + ListElement { text: "Windows 8.1" } + ListElement { text: "Windows 8" } + ListElement { text: "Windows 7" } + ListElement { text: "Windows Vista" } + ListElement { text: "AeroThemePlasma" } + } + + Item { + id: watermarkManager + + property var watermarks + property int count: 0 + + function setWatermark(index: int, text: string, bold: bool, color: string, horizontalAlignment: int) { + watermarks[index].text = text; + watermarks[index].bold = bold; + watermarks[index].color = color; + watermarks[index].horizontalAlignment = horizontalAlignment; + save(); + } + + function addWatermark(index: int, text: string, bold: bool, color: string, horizontalAlignment: int) { + var watermark = { + "text":text, + "bold":bold, + "color":color, + "horizontalAlignment":horizontalAlignment + }; + watermarks.push(watermark); + repeater_watermarks.selected_delegate = watermarks.length - 1; + save(); + } + + function deleteWatermark(index: int) { + watermarks.splice(index, 1); + repeater_watermarks.selected_delegate--; + repeater_watermarks.selected_delegate--; + save(); + } + + function moveUp(index: int) { + if(index !== 0) { + var object = watermarks[index]; + + watermarks.splice(index, 1); + watermarks.splice(index-1, 0, object); + } + + save(); + } + + function newWatermark() { + var component = Qt.createComponent("WatermarkConfigure.qml"); + + watermarkConfigure = component.createObject(root, { purpose: "new" }); + watermarkConfigure.done.connect(watermarkManager.addWatermark); + watermarkConfigure.show(); + } + + function modify(index: int) { + var watermark = watermarkManager.watermarks[repeater_watermarks.selected_delegate]; + var component = Qt.createComponent("WatermarkConfigure.qml"); + + watermarkConfigure = component.createObject(root, { + index: repeater_watermarks.selected_delegate, + purpose: "modify", + text: watermark.text, + bold: watermark.bold, + color: watermark.color, + horizontalAlignment: watermark.horizontalAlignment + }); + watermarkConfigure.done.connect(watermarkManager.setWatermark); + watermarkConfigure.show(); + } + + function moveDown(index: int) { + if(index < count) { + var object = watermarks[index]; + + watermarks.splice(index, 1); + watermarks.splice(index+1, 0, object); + } + + save(); + } + + function remove(index: int) { + watermarks.splice(index, 1); + repeater_watermarks.selected_delegate--; + save(); + } + + function clear() { + watermarks.splice(0, count); + save(); + } + + function save() { + repeater_watermarks.model = null; + root.cfg_watermarks = JSON.stringify(watermarks); + count = watermarks.length; + repeater_watermarks.model = count; + } + + function loadPreset(preset: int) { + clear(); + switch(preset) { + case 0: { + addWatermark(0, "Windows 10", false, "FFFFFF", 2); + addWatermark(0, "Build 22H2", false, "FFFFFF", 2); + break; + } + case 1: { + addWatermark(0, "Windows 8.1", false, "FFFFFF", 2); + addWatermark(0, "Build 9600", false, "FFFFFF", 2); + break; + } + case 2: { + addWatermark(0, "Windows 8", false, "FFFFFF", 2); + addWatermark(0, "Build 9200", false, "FFFFFF", 2); + break; + } + case 3: { + addWatermark(0, "Windows 7", false, "FFFFFF", 2); + addWatermark(0, "Build 7601", false, "FFFFFF", 2); + break; + } + case 4: { + addWatermark(0, "Windows Vista(TM)", false, "FFFFFF", 2); + addWatermark(0, "Build 6003", false, "FFFFFF", 2); + break; + } + case 5: { + addWatermark(0, "AeroThemePlasma", false, "FFFFFF", 2); + addWatermark(0, "Build 6.5.0", false, "FFFFFF", 2); + break; + } + } + } + + + Component.onCompleted: { + watermarks = JSON.parse(Plasmoid.configuration.watermarks); + count = watermarks.length; + } + } + + ColumnLayout { + anchors.left: parent.left + anchors.right: parent.right + anchors.leftMargin: Kirigami.Units.gridUnit*4 + anchors.rightMargin: Kirigami.Units.gridUnit*4 + + CheckBox { + id: watermarkVisible + text: i18n("Enabled") + } + + CustomGroupBox { + Layout.fillWidth: true + + title: i18n("Presets") + enabled: watermarkVisible.checked + + RowLayout { + anchors.fill: parent + + Button { + Layout.alignment: Qt.AlignTop + + text: i18n("Load") + onClicked: { + watermarkManager.loadPreset(repeater_presets.selected_delegate) + repeater_presets.selected_delegate = -1 + } + enabled: repeater_presets.selected_delegate !== -1 && watermarkVisible.checked + } + + Item { + Layout.alignment: Qt.AlignTop + + Layout.fillWidth: true + Layout.horizontalStretchFactor: 1 + Layout.minimumHeight: 22 + Layout.preferredHeight: list_presets.height + + Rectangle { + anchors.fill: parent + anchors.margins: -1 + + border.width: 1 + border.color: "lightgray" + } + + ColumnLayout { + id: list_presets + + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + spacing: 0 + + Repeater { + id: repeater_presets + + property int selected_delegate: -1 + + model: presets + delegate: Item { + id: delegate + + required property var model + required property int index + + property bool selected: repeater_presets.selected_delegate == index + property bool hovered: ma.containsMouse + + Layout.fillWidth: true + Layout.preferredHeight: 22 + + enabled: watermarkVisible.checked + opacity: enabled ? 1.0 : 0.5 + + Rectangle { + anchors.fill: parent + + color: "#3399FF" + + visible: (delegate.hovered || delegate.selected) && delegate.enabled + opacity: delegate.selected ? 1.0 : 0.5 + } + + Text { + anchors.fill: parent + + verticalAlignment: Text.AlignVCenter + text: model.text + leftPadding: 3 + rightPadding: 3 + } + + MouseArea { + id: ma + + anchors.fill: parent + + hoverEnabled: true + enabled: delegate.enabled + onPressed: repeater_presets.selected_delegate = delegate.index; + onDoubleClicked: { + watermarkManager.loadPreset(model.index); + repeater_presets.selected_delegate = -1; + } + } + } + } + } + } + + } + } + + CustomGroupBox { + Layout.fillWidth: true + + title: i18n("Watermarks") + enabled: watermarkVisible.checked + + RowLayout { + anchors.fill: parent + + ColumnLayout { + id: control_column + + Layout.alignment: Qt.AlignTop + + uniformCellSizes: true + spacing: 4 + + Button { + Layout.fillWidth: true + + text: i18n("New") + onClicked: watermarkManager.newWatermark(); + enabled: watermarkVisible.checked + } + + Button { + Layout.fillWidth: true + + text: i18n("Clear") + onClicked: watermarkManager.clear(); + enabled: watermarkVisible.checked + } + + Item { } + + Button { + Layout.fillWidth: true + + text: i18n("Remove") + onClicked: watermarkManager.remove(repeater_watermarks.selected_delegate) + enabled: repeater_watermarks.selected_delegate !== -1 && watermarkVisible.checked + } + + Button { + Layout.fillWidth: true + + text: i18n("Modify") + onClicked: watermarkManager.modify(repeater_watermarks.selected_delegate) + enabled: repeater_watermarks.selected_delegate !== -1 && watermarkVisible.checked + } + + Button { + Layout.fillWidth: true + + text: i18n("Up") + onClicked: { + watermarkManager.moveUp(repeater_watermarks.selected_delegate); + repeater_watermarks.selected_delegate--; + } + enabled: repeater_watermarks.selected_delegate !== -1 && watermarkVisible.checked + } + Button { + Layout.fillWidth: true + + text: i18n("Down") + onClicked: { + watermarkManager.moveDown(repeater_watermarks.selected_delegate); + repeater_watermarks.selected_delegate++; + } + enabled: repeater_watermarks.selected_delegate !== -1 && watermarkVisible.checked + } + } + + Item { + Layout.alignment: Qt.AlignTop + + Layout.fillWidth: true + Layout.horizontalStretchFactor: 1 + Layout.preferredHeight: control_column.height + + Rectangle { + anchors.fill: parent + anchors.margins: -1 + + border.width: 1 + border.color: "lightgray" + } + + ScrollView { + anchors.fill: parent + + ColumnLayout { + id: list_watermarks + + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + spacing: 0 + + Repeater { + id: repeater_watermarks + + property int selected_delegate: -1 + + model: watermarkManager.count + delegate: Item { + id: delegate + + required property int index + + property bool selected: repeater_watermarks.selected_delegate == index + property bool hovered: ma.containsMouse + + Layout.fillWidth: true + Layout.preferredHeight: 22 + + enabled: watermarkVisible.checked + opacity: enabled ? 1.0 : 0.5 + + Rectangle { + anchors.fill: parent + + color: "#3399FF" + + visible: delegate.hovered || delegate.selected + opacity: delegate.selected ? 1.0 : 0.5 + } + + RowLayout { + id: row + + anchors.fill: parent + anchors.leftMargin: 3 + anchors.rightMargin: 3 + + Rectangle { + Layout.alignment: Qt.AlignVCenter + + Layout.preferredWidth: 16 + Layout.preferredHeight: 16 + + color: "#" + watermarkManager.watermarks[delegate.index].color + + border.width: 1 + border.color: "gray" + } + + Text { + Layout.alignment: Qt.AlignVCenter + + Layout.fillWidth: true + Layout.fillHeight: true + + elide: Text.ElideRight + verticalAlignment: Text.AlignVCenter + text: watermarkManager.watermarks[delegate.index].text + font.bold: watermarkManager.watermarks[delegate.index].bold + horizontalAlignment: { + switch(watermarkManager.watermarks[delegate.index].horizontalAlignment) { + case 0: + return Text.AlignLeft; + case 1: + return Text.AlignHCenter; + case 2: + return Text.AlignRight; + } + } + } + } + + MouseArea { + id: ma + + anchors.fill: parent + + hoverEnabled: true + enabled: delegate.enabled + onPressed: repeater_watermarks.selected_delegate = delegate.index; + onDoubleClicked: { + repeater_watermarks.selected_delegate = delegate.index; + watermarkManager.modify(repeater_watermarks.selected_delegate); + } + } + } + } + } + } + } + } + } + } +} diff --git a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderItemDelegate.qml b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderItemDelegate.qml index 1ce2fff0..0a459443 100644 --- a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderItemDelegate.qml +++ b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderItemDelegate.qml @@ -205,17 +205,7 @@ Item { active: impl.iconAndLabelsShouldlookSelected || model.selected asynchronous: true - width: { - if (root.useListViewMode) { - if (main.GridView.view.overflowing) { - return parent.width// - Kirigami.Units.smallSpacing; - } else { - return parent.width; - } - } - - return parent.width// - (Kirigami.Units.smallSpacing * 2); - } + width: parent.width height: root.useListViewMode ? parent.height @@ -322,7 +312,19 @@ Item { renderType: Text.NativeRendering font.hintingPreference: Font.PreferFullHinting z: 2 // So it's always above the highlight effect + font.kerning: Screen.devicePixelRatio == 1.0 + Timer { + id: hidpi_hack + interval: 50 + onTriggered: { + front.anchors.rightMargin += 1; + front.anchors.rightMargin -= 1; + behind.anchors.rightMargin += 1; + behind.anchors.rightMargin -= 1; + + } + } // Hacks to improve font rendering to increase contrast and text brightness // This is done to get darker subpixel rendering, closer to ClearType PlasmaComponents.Label { @@ -334,29 +336,14 @@ Item { color: model.selected && Plasmoid.configuration.selectionStyle ? "black" : "#F9000000" renderType: Text.NativeRendering font.hintingPreference: Font.PreferFullHinting + font.kerning: Screen.devicePixelRatio == 1.0 text: parent.text elide: Text.ElideRight maximumLineCount: parent.maximumLineCount wrapMode: (maximumLineCount === 1) ? Text.NoWrap : Text.Wrap horizontalAlignment: Text.AlignHCenter visible: Plasmoid.configuration.textShadows - } - /*PlasmaComponents.Label { // One is enough - id: behind_right - z: -1 - anchors.fill: parent - anchors.rightMargin: -1 - anchors.leftMargin: 1 - color: "#d9000000" - renderType: Text.NativeRendering - font.hintingPreference: Font.PreferFullHinting - text: parent.text - elide: Text.ElideRight - maximumLineCount: parent.maximumLineCount - wrapMode: (maximumLineCount === 1) ? Text.NoWrap : Text.Wrap - horizontalAlignment: Text.AlignHCenter - }*/ PlasmaComponents.Label { id: front z: -2 @@ -365,6 +352,7 @@ Item { color: model.selected && Plasmoid.configuration.selectionStyle ? "black" : "#ffffffff" renderType: Text.NativeRendering font.hintingPreference: Font.PreferFullHinting + font.kerning: Screen.devicePixelRatio == 1.0 text: parent.text elide: Text.ElideRight maximumLineCount: parent.maximumLineCount @@ -377,17 +365,42 @@ Item { State { // icon view when: !root.useListViewMode + PropertyChanges { + target: label + anchors.topMargin: Kirigami.Units.smallSpacing + // Ffs + width: Math.floor((parent.width - Kirigami.Units.smallSpacing + (Screen.devicePixelRatio != 1.0) * 2 * Screen.devicePixelRatio) * Screen.devicePixelRatio) / Screen.devicePixelRatio + maximumLineCount: Plasmoid.configuration.textLines + horizontalAlignment: Text.AlignHCenter + } AnchorChanges { target: label anchors.top: icon.bottom anchors.horizontalCenter: parent.horizontalCenter } + AnchorChanges { + target: behind + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + } + AnchorChanges { + target: front + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + } PropertyChanges { - target: label - anchors.topMargin: Kirigami.Units.smallSpacing - width: parent.width - Kirigami.Units.smallSpacing - maximumLineCount: Plasmoid.configuration.textLines - horizontalAlignment: Text.AlignHCenter + target: behind + anchors.rightMargin: 1 + anchors.leftMargin: -1 + } + StateChangeScript { + script: { + hidpi_hack.start(); + } } }, State { // list view @@ -576,7 +589,6 @@ Item { toolTip.hideImmediately(); } } - } states: [ diff --git a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderView.qml b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderView.qml index 39e584bb..c5f43fdf 100644 --- a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderView.qml +++ b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/FolderView.qml @@ -244,6 +244,20 @@ FocusScope { id: eventGenerator } + Watermark { + id: watermark + + anchors { + right: parent.right + bottom: parent.bottom + + rightMargin: 5 + bottomMargin: 5 + } + + width: Math.floor(parent.width/4) + } + MouseEventListener { id: listener diff --git a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/Watermark.qml b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/Watermark.qml new file mode 100644 index 00000000..b32ca0ae --- /dev/null +++ b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/Watermark.qml @@ -0,0 +1,59 @@ +import QtQuick +import QtQuick.Layouts + +import org.kde.plasma.plasmoid + +ColumnLayout { + spacing: 0 + + opacity: Plasmoid.configuration.watermarkVisible + z: -1 + + Item { + id: watermarkManager + + property var watermarks + property int count: 0 + + function load() { + watermarks = JSON.parse(Plasmoid.configuration.watermarks); + count = watermarks.length; + } + + Connections { + target: Plasmoid.configuration + + function onWatermarksChanged() { + watermarkManager.load(); + } + } + + Component.onCompleted: load() + } + + Repeater { + model: watermarkManager.count + delegate: Text { + id: delegate + + required property int index + + Layout.fillWidth: true + + text: watermarkManager.watermarks[index].text + font.bold: watermarkManager.watermarks[index].bold + color: "#" + watermarkManager.watermarks[index].color + wrapMode: Text.WordWrap + horizontalAlignment: { + switch(watermarkManager.watermarks[index].horizontalAlignment) { + case 0: + return Text.AlignLeft; + case 1: + return Text.AlignHCenter; + case 2: + return Text.AlignRight; + } + } + } + } +} diff --git a/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/WatermarkConfigure.qml b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/WatermarkConfigure.qml new file mode 100644 index 00000000..3edb0b64 --- /dev/null +++ b/plasma/plasmoids/io.gitgud.wackyideas.desktopcontainment/contents/ui/WatermarkConfigure.qml @@ -0,0 +1,163 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls as QQC2 + +import org.kde.kirigami as Kirigami + +Window { + id: root + + property string purpose + property int index + + property string text: "New watermark" + property bool bold: false + property string color: "FFFFFF" + property int horizontalAlignment: 2 + + signal done(int index, string text, bool bold, string color, int horizontalAlignment) + onDone: destroy(); + + minimumWidth: width + minimumHeight: height + width: 418 + height: column.height < 1 ? 1 : column.height + maximumWidth: width + maximumHeight: height + + title: i18n("Desktop") + + FontMetrics { id: systemFont; font: color.font } + + ColumnLayout { + id: column + + anchors.left: parent.left + anchors.right: parent.right + + spacing: 0 + + Rectangle { + id: topContents + + Layout.preferredWidth: parent.width + Layout.preferredHeight: row.implicitHeight + 24 + + color: "white" + + RowLayout { + id: row + + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: 12 + + spacing: 8 + + Kirigami.Icon { + Layout.alignment: Qt.AlignTop + + implicitWidth: 32 + implicitHeight: 32 + + source: "plasma" + } + + ColumnLayout { + Text { + Layout.fillWidth: true + + text: root.purpose == "new" ? i18n("Create a new watermark") : i18n("Modify an existing watermark") + color: "#003399" + font.pointSize: 11 + } + + RowLayout { + Layout.fillWidth: true + + Text { Layout.fillWidth: true; text: i18n("Text:") } + + QQC2.TextField { id: text; Layout.fillWidth: true; text: root.text } + } + + QQC2.CheckBox { + id: bold + + text: i18n("Use bold text") + checked: root.bold + } + + RowLayout { + Text { + Layout.fillWidth: true + + text: i18n("Color (HEX):") + } + + Text { + text: "#" + } + QQC2.TextField { + id: color + + Layout.minimumWidth: Math.round(systemFont.maximumCharacterWidth)*6 + Layout.maximumWidth: Math.round(systemFont.maximumCharacterWidth)*6 + + validator: RegularExpressionValidator { regularExpression: /[0-9A-Fa-f]+/ } + maximumLength: 6 + text: root.color + color: "black" + } + } + + RowLayout { + Text { + Layout.fillWidth: true + + text: i18n("Horizontal alignment:") + } + + QQC2.ComboBox { + id: horizontalAlignment + + currentIndex: root.horizontalAlignment + model: [ + "Left", + "Center", + "Right" + ] + } + } + } + } + } + + Rectangle { Layout.preferredWidth: parent.width; Layout.preferredHeight: 1; color: "#dfdfdf" } + + Rectangle { + Layout.preferredWidth: parent.width + Layout.preferredHeight: 40 + + color: "#f0f0f0" + + RowLayout { + anchors.fill: parent + anchors.rightMargin: 11 + + spacing: 8 + + Item { Layout.fillWidth: true } + + QQC2.Button { + text: i18n("OK") + onClicked: root.done(root.index, text.text, bold.checked, color.text, horizontalAlignment.currentIndex); + } + QQC2.Button { + text: i18n("Cancel") + onClicked: root.destroy(); + } + } + } + } +} diff --git a/plasma/plasmoids/io.gitgud.wackyideas.digitalclocklite/contents/ui/DigitalClock.qml b/plasma/plasmoids/io.gitgud.wackyideas.digitalclocklite/contents/ui/DigitalClock.qml index 33ef2967..cfbca229 100755 --- a/plasma/plasmoids/io.gitgud.wackyideas.digitalclocklite/contents/ui/DigitalClock.qml +++ b/plasma/plasmoids/io.gitgud.wackyideas.digitalclocklite/contents/ui/DigitalClock.qml @@ -559,11 +559,15 @@ Item { family: Plasmoid.configuration.fontFamily || Kirigami.Theme.defaultFont.family weight: Plasmoid.configuration.boldText ? Font.Bold : Kirigami.Theme.defaultFont.weight italic: Plasmoid.configuration.italicText - pointSize: Plasmoid.configuration.fontSize || Kirigami.Theme.defaultFont.pointSize + pointSize: (Plasmoid.configuration.fontSize || Kirigami.Theme.defaultFont.pointSize) hintingPreference: Font.PreferFullHinting } minimumPixelSize: 1 - style: Screen.devicePixelRatio == 1.0 ? Text.Outline : Text.Raised + style: { + if(Screen.devicePixelRatio == 1.0) return Text.Outline; + if(Screen.devicePixelRatio >= 2.0) return Text.Normal; + return Text.Raised; + } styleColor: "transparent" text: { // get the time for the given timezone from the dataengine @@ -606,8 +610,12 @@ Item { font.hintingPreference: Font.PreferFullHinting minimumPixelSize: 1 - style: Screen.devicePixelRatio == 1.0 ? Text.Outline : Text.Raised styleColor: "transparent" + style: { + if(Screen.devicePixelRatio == 1.0) return Text.Outline; + if(Screen.devicePixelRatio >= 2.0) return Text.Normal; + return Text.Raised; + } visible: false horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter @@ -625,7 +633,11 @@ Item { font.pixelSize: timeLabel.font.pixelSize font.hintingPreference: Font.PreferFullHinting minimumPixelSize: 1 - style: Screen.devicePixelRatio == 1.0 ? Text.Outline : Text.Raised + style: { + if(Screen.devicePixelRatio == 1.0) return Text.Outline; + if(Screen.devicePixelRatio >= 2.0) return Text.Normal; + return Text.Raised; + } styleColor: "transparent" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter diff --git a/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/Badge.qml b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/Badge.qml new file mode 100644 index 00000000..84951047 --- /dev/null +++ b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/Badge.qml @@ -0,0 +1,72 @@ +/* + SPDX-FileCopyrightText: 2018 Kai Uwe Broulik + + SPDX-License-Identifier: GPL-2.0-or-later +*/ + +import QtQuick + +import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.components as PlasmaComponents3 +import org.kde.ksvg as KSvg +import org.kde.kirigami as Kirigami +import QtQuick.Effects + +// This top-level item is an opaque background that goes behind the colored +// background, for contrast. It's not an Item since that it would be square, +// and not round, as required here +KSvg.SvgItem { + id: badgeRect + + property int number: 0 + property color badgeColor: "black" + + implicitWidth: Kirigami.Units.iconSizes.small//Math.max(height, Math.round(label.contentWidth)) // Add some padding around. + implicitHeight: Kirigami.Units.iconSizes.small//implicitWidth + + svg: badgeRing + elementId: "ring" + + KSvg.SvgItem { + id: badgeGradient + svg: badgeRing + elementId: "gradient" + z: -1 + anchors.fill: parent + layer.enabled: true + layer.effect: MultiEffect { + colorization: 1.0 + colorizationColor: badgeRect.badgeColor + brightness: { + if(badgeRect.badgeColor.hslLightness < 0.5) return 0.75; + if(badgeRect.badgeColor.hslLightness > 0.7) { return 0.15; } + return 0.25 + } + } + } + + // Number + PlasmaComponents3.Label { + id: label + anchors.centerIn: parent + anchors.alignWhenCentered: false + width: height + height: Math.min(Kirigami.Units.gridUnit * 2, Math.round(parent.height)-2) + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + fontSizeMode: Text.VerticalFit + font.pointSize: 1024 + font.letterSpacing: -1 + minimumPointSize: 5 + text: { + if (badgeRect.number < 0) { + return i18nc("Invalid number of new messages, overlay, keep short", "—"); + } else if (badgeRect.number > 9) { + return i18nc("Over 9 new messages, overlay, keep short", "9+"); + } else { + return badgeRect.number.toLocaleString(Qt.locale(), 'f', 0); + } + } + textFormat: Text.PlainText + } +} diff --git a/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/Task.qml b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/Task.qml index 10a969ce..3bb71cf9 100644 --- a/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/Task.qml +++ b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/Task.qml @@ -605,6 +605,7 @@ TaskManagerApplet.SmartLauncherItem { } onTapped: leftClick() function leftClick() { + if(tasksRoot.pinnedToolTipOpen) { task.hideImmediately(); tasksRoot.pinnedToolTipOpen = false; @@ -1367,6 +1368,20 @@ TaskManagerApplet.SmartLauncherItem { } onSourceChanged: { containerRect.glowColor = Plasmoid.getDominantColor(iconBox.source); + badge.badgeColor = containerRect.glowColor + } + + Badge { + id: badge + visible: task.smartLauncherItem && task.smartLauncherItem.countVisible + number: task.smartLauncherItem.count + anchors.top: parent.top + anchors.right: parent.right + anchors.rightMargin: (tasksRoot.height <= 30) ? -Kirigami.Units.largeSpacing : -Kirigami.Units.smallSpacing + anchors.topMargin: (tasksRoot.height <= 30) ? -Kirigami.Units.smallSpacing : 0 + Component.onCompleted: { + badgeColor = containerRect.glowColor + } } } diff --git a/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/main.qml b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/main.qml index 29b61fcb..a58d121c 100644 --- a/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/main.qml +++ b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/main.qml @@ -23,6 +23,7 @@ import org.kde.plasma.plasma5support as Plasma5Support import org.kde.kquickcontrolsaddons import org.kde.kwindowsystem +import org.kde.notificationmanager as NotificationManager import "code/layoutmetrics.js" as LayoutMetrics import "code/tools.js" as TaskTools @@ -71,6 +72,14 @@ PlasmoidItem { } ] + NotificationManager.Notifications { + id: historyModel + showExpired: true + showDismissed: true + showJobs: true + groupLimit: 2 + expandUnread: true + } onIconsOnlyChanged: { iconGeometryTimer.start(); @@ -448,6 +457,10 @@ PlasmoidItem { Drag.onDragFinished: tasks.dragSource = null; } + KSvg.Svg { + id: badgeRing + imagePath: Qt.resolvedUrl("svgs/badge.svgz") + } KSvg.FrameSvgItem { id: taskFrame diff --git a/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/svgs/badge.svgz b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/svgs/badge.svgz new file mode 100644 index 00000000..d65d6472 Binary files /dev/null and b/plasma/plasmoids/io.gitgud.wackyideas.seventasks/contents/ui/svgs/badge.svgz differ diff --git a/plasma/plasmoids/src/notifications_src/notifications/FullRepresentation.qml b/plasma/plasmoids/src/notifications_src/notifications/FullRepresentation.qml index f7f89b71..9d8f0962 100644 --- a/plasma/plasmoids/src/notifications_src/notifications/FullRepresentation.qml +++ b/plasma/plasmoids/src/notifications_src/notifications/FullRepresentation.qml @@ -28,6 +28,12 @@ import "components" as Components PlasmaExtras.Representation { id: fullRepresentationRoot + function fixDpi(val) { + if(Screen.devicePixelRatio !== 1.0) { + return Math.floor(val*Screen.devicePixelRatio) / Screen.devicePixelRatio; + } + return val; + } // TODO these should be configurable in the future readonly property int dndMorningHour: 6 readonly property int dndEveningHour: 20 @@ -263,6 +269,7 @@ PlasmaExtras.Representation { anchors.fill: parent anchors.bottomMargin: 2 anchors.rightMargin: -2 + anchors.leftMargin: -2 background: null focus: true clip: true @@ -370,7 +377,7 @@ PlasmaExtras.Representation { delegate: DraggableDelegate { id: delegate - width: ListView.view.width + width: fixDpi(ListView.view.width) opacity: 0 required property int index @@ -643,8 +650,7 @@ PlasmaExtras.Representation { Loader { anchors.centerIn: parent - width: parent.width - (Kirigami.Units.gridUnit * 4) - + width: fixDpi(parent.width - Kirigami.Units.gridUnit * 4); active: list.count === 0 visible: active asynchronous: true @@ -657,6 +663,7 @@ PlasmaExtras.Representation { PlasmaExtras.PlaceholderMessage { anchors.centerIn: parent + anchors.alignWhenCentered: Screen.devicePixelRatio == 1.0 width: parent.width iconName: "checkmark" @@ -672,6 +679,7 @@ PlasmaExtras.Representation { readonly property NotificationManager.ServerInfo currentOwner: NotificationManager.Server.currentOwner anchors.centerIn: parent + anchors.alignWhenCentered: Screen.devicePixelRatio == 1.0 width: parent.width iconName: "notifications-disabled" diff --git a/uninstall.sh b/uninstall.sh new file mode 100644 index 00000000..caaf3b92 --- /dev/null +++ b/uninstall.sh @@ -0,0 +1,263 @@ +#!/bin/bash +CUR_DIR=$(pwd) +QDBUS_BIN="qdbus6" + +# Sanity check to see if the proper tools are installed. +if [[ -z "$(command -v kpackagetool6)" ]]; then + echo "kpackagetool6 not found. Stopping." + exit +fi +if [[ -n "$(command -v qdbus6)" ]]; then # Arch + QDBUS_BIN=$(command -v qdbus6) +elif [[ -n "$(command -v qdbus-qt6)" ]]; then # Fedora + QDBUS_BIN=$(command -v qdbus-qt6) +else + echo "qdbus6 not found." + echo "qdbus-qt6 not found." + echo "Stopping." + exit +fi + +PLASMASHELL=$($QDBUS_BIN org.kde.plasmashell /PlasmaShell shell) + +if [ $PLASMASHELL == "io.gitgud.wackyideas.desktop" ]; then + echo -e "You shouldn't run the uninstall script from AeroThemePlasma itself." + echo -e "Please run the uninstall script from the Plasma session or another session." + exit +fi + +BUILD_FILES=("kwin/decoration/build" + "plasma/sddm/login-sessions/build" + "plasma/aerothemeplasma-kcmloader/build" + "plasma/plasmoids/src/systemtray_src/build" + "plasma/plasmoids/src/notifications_src/build" + "plasma/plasmoids/src/volume_src/build" + "plasma/plasmoids/src/sevenstart_src/build" + "plasma/plasmoids/src/seventasks_src/build" + "plasma/plasmoids/src/desktopcontainment/build" + "kwin/effects_cpp/kde-effects-aeroglassblur/build" + "kwin/effects_cpp/kwin-effect-smodsnap-v2/build" + "kwin/effects_cpp/smodglow/build" + "kwin/effects_cpp/aeroglide/build" + "kwin/effects_cpp/startupfeedback/build" + "kwin/effects_cpp/kde-effects-aeroglassblur/build-wl" + "kwin/effects_cpp/kwin-effect-smodsnap-v2/build-wl" + "kwin/effects_cpp/smodglow/build-wl" + "kwin/effects_cpp/aeroglide/build-wl" + "kwin/effects_cpp/startupfeedback/build-wl" +) + +function uninstall_cmake_component { + if [ ! -f "$CUR_DIR/$1/install_manifest.txt" ]; then + echo -e "File install_manifest.txt in $CUR_DIR/$1 was not found." + echo -e "If this component was already removed from the system, you can ignore this message.\n" + echo -e "Otherwise, to generate this file, run the compile.sh and install_plasmoids.sh scripts again like this:" + echo -e "$ bash compile.sh --skip-libplasma [--ninja]" + echo -e "$ bash install_plasmoids.sh --skip-kpackages [--ninja]" + echo -e "Afterwards, re-run this script." + else + cd "$CUR_DIR/$1" + BUILD_TOOL=make + if [ -f "build.ninja" ]; then + BUILD_TOOL=ninja + fi + sudo $BUILD_TOOL uninstall + echo -e "Done." + cd "$CUR_DIR" + fi +} + +for path in ${BUILD_FILES[@]}; do + uninstall_cmake_component "$path" +done + +function uninstall_prompt { + echo -e "Do you want to uninstall: $1? (y/N)" + if [ ! -z "$2" ]; then + echo -e "The following will be removed: $2" + fi + read answer + if [ "$answer" != "${answer#[Yy]}" ]; then + return 1 + else + return 0 + fi +} + +function uninstall_plasmoid { + PLASMOID=$(basename "$1") + if [[ $PLASMOID == 'src' ]]; then + echo "Skipping $PLASMOID" + return + fi + if [[ $PLASMOID == 'io.gitgud.wackyideas.systemtray' ]]; then + pkexec kpackagetool6 -t "Plasma/Applet" -g -r "$1" + else + kpackagetool6 -t "Plasma/Applet" -r "$1" + fi + echo -e "Uninstalled $1.\n" + cd "$CUR_DIR" +} + +function uninstall_component { + COMPONENT=$(basename "$1") + kpackagetool6 -t "$2" -r "$1" + echo -e "Uninstalled $1.\n" + cd "$CUR_DIR" +} + +uninstall_prompt "Plasmoids" +if [ "$?" == 1 ]; then + echo "Uninstalling plasmoids..." + for filename in "$PWD/plasma/plasmoids/"*; do + uninstall_plasmoid "$filename" + done +fi + +uninstall_prompt "Plasma components" +if [ "$?" == 1 ]; then + echo "Uninstalling Plasma components..." + uninstall_component "authui7" "Plasma/LookAndFeel" + uninstall_component "io.gitgud.wackyideas.taskbar" "Plasma/LayoutTemplate" + uninstall_component "Seven-Black" "Plasma/Theme" + uninstall_component "io.gitgud.wackyideas.desktop" "Plasma/Shell" +fi + + +COLOR_DIR="$HOME/.local/share/color-schemes" +uninstall_prompt "Color scheme" "$COLOR_DIR/Aero.colors" +if [ "$?" == 1 ]; then + echo "Uninstalling color scheme..." + rm "$COLOR_DIR/Aero.colors" + echo "Done." +fi + +KV_DIR="$HOME/.config/Kvantum" +uninstall_prompt "Kvantum theme" "$KV_DIR/Windows7Aero" +if [ "$?" == 1 ]; then + echo "Uninstalling Kvantum theme..." + kvantummanager --set KvAdapta + rm -r "$KV_DIR/Windows7Aero" + echo "Done." +fi + +uninstall_prompt "Sound themes" "$(echo "$HOME/.local/share/sounds/Windows 7"*)" +if [ "$?" == 1 ]; then + echo "Uninstalling sound themes..." + for filename in "$HOME/.local/share/sounds/Windows 7"*; do + rm -r "$filename" + done + echo "Done." +fi + +ICONS_DIR="$HOME/.local/share/icons" +uninstall_prompt "Icon theme" "$ICONS_DIR/Windows 7 Aero" +if [ "$?" == 1 ]; then + echo "Uninstalling icon theme..." + rm -r "$ICONS_DIR/Windows 7 Aero" + echo "Done." +fi + +MIMETYPE_DIR="$HOME/.local/share/mime/packages" +uninstall_prompt "Mimetypes" "$MIMETYPE_DIR/application-vnd.microsoft.portable-executable.xml application-x-ms-dll.xml application-x-msdownload.xml application-x-ms-ne-executable.xml" +if [ "$?" == 1 ]; then + echo "Uninstalling mimetypes..." + for filename in "$PWD/misc/mimetype/"*; do + MIME=$(basename $filename) + rm "$MIMETYPE_DIR/$MIME" + done + update-mime-database "$HOME/.local/share/mime" + echo "Done." +fi + +uninstall_prompt "KWin JS effects" +if [ "$?" == 1 ]; then + echo "Uninstalling KWin effects (JS)..." + for filename in "$PWD/kwin/effects/"*; do + uninstall_component "$filename" "KWin/Effect" + done + echo "Done." +fi + +uninstall_prompt "KWin scripts" +if [ "$?" == 1 ]; then + echo "Uninstalling KWin scripts..." + for filename in "$PWD/kwin/scripts/"*; do + uninstall_component "$filename" "KWin/Script" + done + echo "Done." +fi + +uninstall_prompt "KWin task switchers" +if [ "$?" == 1 ]; then + echo "Uninstalling KWin task switchers..." + for filename in "$PWD/kwin/tabbox/"*; do + uninstall_component "$filename" "KWin/WindowSwitcher" + done + echo "Done." +fi + +KWIN_DIR="$HOME/.local/share/kwin" +echo "Uninstalling KWin outline" +rm -r "$KWIN_DIR/outline" + +if [[ -L "$KWIN_DIR-x11" && -d "$KWIN_DIR-x11" ]]; then + echo "kwin-x11 folder is a symlink, remove it." + rm "$KWIN_DIR-x11" +fi + +if [[ -L "$KWIN_DIR-wayland" && -d "$KWIN_DIR-wayland" ]]; then + echo "kwin-wayland folder is a symlink, remove it." + rm "$KWIN_DIR-wayland" +fi + +BRANDING_DIR="$HOME/.config/kdedefaults" +if [ ! -z "$(grep -rni "aerothemeplasma" "$BRANDING_DIR/kcm-about-distrorc")" ]; then + echo "Uninstalling branding..." + rm "$BRANDING_DIR/kcm-about-distrorc" + rm "$BRANDING_DIR/kcminfo.png" +fi + +CURSOR_DIR="/usr/share/icons/aero-drop" +uninstall_prompt "Cursor theme (requires sudo privileges)" "$CURSOR_DIR" +if [ "$?" == 1 ]; then + echo "Uninstalling cursor theme..." + pkexec rm -r "$CURSOR_DIR" + echo "Done." +fi + +SDDM_DIR="/usr/share/sddm/themes/sddm-theme-mod" +uninstall_prompt "SDDM theme (requires sudo privileges)" "$SDDM_DIR" +if [ "$?" == 1 ]; then + echo "Uninstalling SDDM theme..." + pkexec rm -r "$SDDM_DIR" + echo "Done." +fi + +SMOD_DIR="/usr/share/smod" +uninstall_prompt "SMOD files (requires sudo privileges)" "$SMOD_DIR" +if [ "$?" == 1 ]; then + echo "Uninstalling SMOD files..." + pkexec rm -r "$SMOD_DIR" + echo "Done." +fi + +LIBDIR="/usr/lib/x86_64-linux-gnu/" +if [ ! -d ${LIBDIR} ]; then + LIBDIR="/usr/lib64/" +fi +APPLET_DIR="${LIBDIR}qt6/plugins/plasma/applets/" +uninstall_prompt "Plasma applets (requires sudo privileges)" "${APPLET_DIR}/io.gitgud.wackyideas."* +if [ "$?" == 1 ]; then + echo "Uninstalling Plasma applet plugins..." + pkexec rm -r "${APPLET_DIR}/io.gitgud.wackyideas."* + echo "Done." +fi + +echo "Uninstalling /opt/aerothemeplasma..." +pkexec rm -r "/opt/aerothemeplasma" +echo "Done." + + +echo -e "Uninstallation complete." +echo -e "In order to uninstall the libplasma and polkit agent modifications, simply reinstall those packages using your distro's package manager."