diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 41ade23..adba2f5 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -1,99 +1,138 @@ name: 🐧 Linux -on: [ push, pull_request ] +on: + push: + pull_request: + schedule: + - cron: '0 0 * * 2' env: CARGO_TERM_COLOR: always jobs: - linux: + linux-default: strategy: matrix: - toolchain: [ stable ] + toolchain: [ stable, 1.63.0 ] type: [ release ] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.toolchain }} override: true - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | target - key: linux-${{github.ref}}-${{github.sha}} + key: linux-default-${{github.ref}}-${{github.sha}} restore-keys: | - linux-${{github.ref}}-${{github.sha}} - - - name: Install Gtk, Mingw, unzip, zip and wget - run: sudo apt update; sudo apt install libgtk-3-dev -y + linux-default-${{github.ref}}-${{github.sha}} - - name: Build Debug - run: cargo build - env: - CARGO_INCREMENTAL: 0 - RUSTFLAGS: "-C debuginfo=0 -D warnings" - if: ${{ matrix.type == 'debug'}} + - name: Install basic libraries + run: sudo apt-get update; sudo apt install libgtk-4-dev -y - name: Build Release run: cargo build --release env: CARGO_INCREMENTAL: 0 - RUSTFLAGS: "-C debuginfo=0 -D warnings" - if: ${{ matrix.type == 'release'}} + RUSTFLAGS: "-C debuginfo=0" + if: ${{ (matrix.type == 'release') && (matrix.toolchain == 'stable') }} - - name: Store Linux - uses: actions/upload-artifact@v2 + - name: Store Linux GUI + uses: actions/upload-artifact@v3 with: name: szyszka-${{ runner.os }}-${{ matrix.toolchain }} path: target/release/szyszka if: ${{ matrix.type == 'release' }} - linux-appimage: + linux-appimage-gui: strategy: matrix: toolchain: [ stable ] type: [ release ] - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.toolchain }} override: true - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | target - key: linux-appimage-${{github.ref}}-${{github.sha}} + key: linux-appimage-gui-${{github.ref}}-${{github.sha}} restore-keys: | - linux-appimage-${{github.ref}}-${{github.sha}} + linux-appimage-gui-${{github.ref}}-${{github.sha}} - - name: Install Gtk, - run: sudo apt update; sudo apt install libgtk-3-dev librsvg2-dev wget -y + - name: Install Dependencies + run: sudo apt-get update; sudo apt install libgtk-4-dev librsvg2-dev wget fuse libfuse2 -y - name: Build Release run: cargo build --release env: CARGO_INCREMENTAL: 0 - RUSTFLAGS: "-C debuginfo=0 -D warnings" + RUSTFLAGS: "-C debuginfo=0" - name: Download appimage dependiences run: | + pwd wget -c "https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh" wget -c "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" chmod +x linuxdeploy-plugin-gtk.sh chmod +x linuxdeploy-x86_64.AppImage mkdir -p AppDir/usr/bin + pwd cp target/release/szyszka AppDir/usr/bin ./linuxdeploy-x86_64.AppImage --appdir AppDir --plugin gtk --output appimage --icon-file data/icons/com.github.qarmin.szyszka.svg --desktop-file data/com.github.qarmin.szyszka.desktop - - name: Store Linux Appimage - uses: actions/upload-artifact@v2 + - name: Store Linux Appimage GUI + uses: actions/upload-artifact@v3 with: name: szyszka-appimage-${{ runner.os }}-${{ matrix.toolchain }} path: Szyszka*.AppImage + + - name: Minimal AppImage + run: | + pwd + rm -rf szyszka + cp target/release/szyszka . + strip szyszka + wget https://github.com/AppImage/pkg2appimage/releases/download/continuous/pkg2appimage-1807-x86_64.AppImage + chmod +x pkg2appimage-1807-x86_64.AppImage + ./pkg2appimage-1807-x86_64.AppImage misc/szyszka-appimage-recipe.yml + mv out/Szyszka*.AppImage out/szyszka-minimal.AppImage + + - name: Minimal Appimage Upload + uses: actions/upload-artifact@v3 + with: + name: szyszka-${{ matrix.toolchain }}_minimal_AppImage + path: out/*.AppImage + + linux-tests: + strategy: + matrix: + toolchain: [ stable ] + type: [ debug ] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + + - uses: actions-rs/toolchain@v1 + with: + toolchain: ${{ matrix.toolchain }} + override: true + + - name: Install Dependencies + run: sudo apt-get update; sudo apt install libgtk-4-dev librsvg2-dev wget fuse libfuse2 -y xvfb + + - name: Test + run: xvfb-run cargo test + env: + CARGO_INCREMENTAL: 0 + RUSTFLAGS: "-C debuginfo=0" \ No newline at end of file diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index a7139ae..458cf2d 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -1,5 +1,9 @@ name: 🍎 MacOS -on: [ push, pull_request ] +on: + push: + pull_request: + schedule: + - cron: '0 0 * * 2' env: CARGO_TERM_COLOR: always @@ -12,39 +16,33 @@ jobs: type: [ release ] runs-on: macos-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.toolchain }} override: true + - uses: actions/cache@v3 + with: + path: | + target + key: mac-${{github.ref}}-${{github.sha}} + restore-keys: | + mac-${{github.ref}}-${{github.sha}} + - name: Install Homebrew run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - - name: Override link[WORKAROUND] # Looks that this is a bug with current homebrew or Github CI + - name: Override link[WORKAROUND] # Looks that this is a bug with current homebrew or GitHub CI run: rm '/usr/local/bin/2to3' - - name: Install GTK3 - run: brew install rust gtk+3 - - - name: Build Debug - run: cargo build - env: - CARGO_INCREMENTAL: 0 - RUSTFLAGS: "-C debuginfo=0 -D warnings" - if: ${{ matrix.type == 'debug'}} - - - name: Build Release - run: cargo build --release - env: - CARGO_INCREMENTAL: 0 - RUSTFLAGS: "-C debuginfo=0 -D warnings" - if: ${{ matrix.type == 'release'}} - - - name: Store MacOS - uses: actions/upload-artifact@v2 + - name: Install GTK4 + run: brew install rust gtk4 libheif + + - name: Store MacOS GUI + uses: actions/upload-artifact@v3 with: name: szyszka-${{ runner.os }}-${{ matrix.toolchain }} path: target/release/szyszka - if: ${{ matrix.type == 'release' }} + if: ${{ matrix.type == 'release' }} \ No newline at end of file diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 9249270..93d87e1 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -1,16 +1,20 @@ name: Quality -on: [ push, pull_request ] +on: + push: + pull_request: + schedule: + - cron: '0 0 * * 2' env: CARGO_TERM_COLOR: always jobs: quality: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: | target @@ -24,8 +28,8 @@ jobs: components: rustfmt, clippy override: true - - name: Install Gtk - run: sudo apt update;sudo apt install -y libgtk-3-dev + - name: Install Gtk 4 + run: sudo apt-get update; sudo apt install -y libgtk-4-dev -y - name: Check the format run: cargo fmt --all -- --check diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index d10fabd..6785f4f 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -1,85 +1,72 @@ name: 🏁 Windows -on: [ push, pull_request ] +on: + push: + pull_request: + schedule: + - cron: '0 0 * * 2' env: CARGO_TERM_COLOR: always jobs: - windows: - strategy: - matrix: - toolchain: [ stable ] - type: [ release ] - runs-on: ubuntu-latest + container: + runs-on: ubuntu-22.04 + container: + image: ghcr.io/piegamesde/gtk4-cross:gtk-4.6 steps: - - uses: actions/checkout@v2 - + - uses: actions/checkout@v3 + - name: Install additional dependencies + # gio is for the build script + run: dnf install wget2 unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme -y && dnf clean all -y - uses: actions-rs/toolchain@v1 with: - toolchain: ${{ matrix.toolchain }} - override: true - - - uses: actions/cache@v2 + profile: minimal + toolchain: stable + target: x86_64-pc-windows-gnu + - name: Cache ~/.cargo + uses: actions/cache@v3 with: - path: | - target - key: windows-${{github.ref}}-${{github.sha}} - restore-keys: | - windows-${{github.ref}}-${{github.sha}} - - - name: Install Gtk, Mingw, unzip, zip and wget - run: sudo apt-get update; sudo apt install mingw-w64 libgtk-3-dev unzip wget zip -y - - - name: Build Release Cross Compile + path: ~/.cargo + key: windows-dotcargo + - name: Cache cargo build + uses: actions/cache@v3 + with: + path: target + key: windows-build-target + - name: Cross compile for Windows run: | - rustup target add x86_64-pc-windows-gnu - - echo "[target.x86_64-pc-windows-gnu]" > ~/.cargo/config - echo "linker = \"x86_64-w64-mingw32-gcc\"" >> ~/.cargo/config - echo "ar = \"x86_64-w64-mingw32-gcc-ar\"" >> ~/.cargo/config - - GTK_LIBRARY="$(pwd)/gtk_library" - GTK_APP="$(pwd)/gtk_app" - GTK_THEME="$(pwd)/gtk_theme" - - wget https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/mingw64.zip - unzip mingw64.zip -d $GTK_LIBRARY - GTK_LIBRARY="$GTK_LIBRARY/mingw64" - - wget https://github.com/nrhodes91/AdMin/archive/master.zip - unzip master.zip -d $GTK_THEME - - PKG_CONFIG_ALLOW_CROSS=1 PKG_CONFIG_PATH="$GTK_LIBRARY/lib/pkgconfig" RUSTFLAGS="-L $GTK_LIBRARY/lib" cargo build --target=x86_64-pc-windows-gnu --release - - strip target/x86_64-pc-windows-gnu/release/szyszka.exe - - mkdir $GTK_APP - cp target/x86_64-pc-windows-gnu/release/szyszka.exe $GTK_APP - cp $GTK_LIBRARY/bin/*.dll $GTK_APP - mkdir -p $GTK_APP/share/glib-2.0/schemas - mkdir $GTK_APP/share/icons - cp $GTK_LIBRARY/share/glib-2.0/schemas/* $GTK_APP/share/glib-2.0/schemas - cp -r $GTK_LIBRARY/share/icons/* $GTK_APP/share/icons - mkdir $GTK_APP/lib - cp -r $GTK_LIBRARY/lib/gdk-pixbuf-2.0 $GTK_APP/lib - - mkdir -p $GTK_APP/share/themes - mkdir -p $GTK_APP/share/gtk-3.0 - echo "[Settings]" > $GTK_APP/share/gtk-3.0/settings.ini - echo "gtk-theme-name = admin-gtk3-dark-osx" >> $GTK_APP/share/gtk-3.0/settings.ini - echo "gtk-font-name = Segoe UI 10" >> $GTK_APP/share/gtk-3.0/settings.ini - echo "gtk-xft-rgba = rgb" >> $GTK_APP/share/gtk-3.0/settings.ini - cp $GTK_THEME/AdMin-master/admin-gtk3-dark-osx $GTK_APP/share/themes -r -L - - zip -r gtk_app.zip $GTK_APP - env: - CARGO_INCREMENTAL: 0 - RUSTFLAGS: "-C debuginfo=0 -D warnings" - if: ${{ matrix.type == 'release'}} - - - name: Store Windows CrossComplile - uses: actions/upload-artifact@v2 + #!/bin/bash + set -euo pipefail + export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/ + cargo build --target=x86_64-pc-windows-gnu --release --locked + mkdir -p package + cp target/x86_64-pc-windows-gnu/release/szyszka.exe package/ + - name: Package + run: | + #!/bin/bash + set -euo pipefail + cp -t package $(pds -vv -f package/*.exe) + # Add gdbus which is recommended on Windows (why?) + cp $MINGW_PREFIX/bin/gdbus.exe package + # Handle the glib schema compilation as well + glib-compile-schemas $MINGW_PREFIX/share/glib-2.0/schemas/ + mkdir -p package/share/glib-2.0/schemas/ + cp -T $MINGW_PREFIX/share/glib-2.0/schemas/gschemas.compiled package/share/glib-2.0/schemas/gschemas.compiled + # Pixbuf stuff, in order to get SVGs (scalable icons) to load + mkdir -p package/lib/gdk-pixbuf-2.0 + cp -rT $MINGW_PREFIX/lib/gdk-pixbuf-2.0 package/lib/gdk-pixbuf-2.0 + cp -f -t package $(pds -vv -f $MINGW_PREFIX/lib/gdk-pixbuf-2.0/2.10.0/loaders/*) + find package -iname "*.dll" -or -iname "*.exe" -type f -exec mingw-strip {} + + + cd package/share + wget2 https://github.com/qarmin/czkawka/files/8880216/gtk4_theme.zip + unzip gtk4_theme.zip + rm gtk4_theme.zip + cd ../.. + - name: Upload artifacts + uses: actions/upload-artifact@v3 with: - name: szyszka-Windows-${{ matrix.toolchain }} - path: gtk_app.zip - if: ${{ matrix.type == 'release' }} + name: szyszka-windows-${{ github.sha }} + path: | + ./package + if-no-files-found: error \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index ae8162e..55e6659 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,48 +4,33 @@ version = 3 [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] [[package]] -name = "anyhow" -version = "1.0.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0" - -[[package]] -name = "atk" -version = "0.15.1" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "atk-sys", - "bitflags", - "glib", "libc", ] [[package]] -name = "atk-sys" -version = "0.15.1" +name = "anyhow" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" -dependencies = [ - "glib-sys", - "gobject-sys", - "libc", - "system-deps", -] +checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bitflags" @@ -61,42 +46,55 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-buffer" -version = "0.9.0" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ "generic-array", ] +[[package]] +name = "bumpalo" +version = "3.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" + [[package]] name = "cairo-rs" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b869e97a87170f96762f9f178eae8c461147e722ba21dd8814105bf5716bf14a" +checksum = "247e1183fa769ac22121f92276dae52f89acaf297f24b1320019f439b6e3b46f" dependencies = [ "bitflags", "cairo-sys-rs", "glib", "libc", + "once_cell", "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +checksum = "7c48f4af05fabdcfa9658178e1326efa061853f040ce7d72e33af6885196f421" dependencies = [ "glib-sys", "libc", "system-deps", ] +[[package]] +name = "cc" +version = "1.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" + [[package]] name = "cfg-expr" -version = "0.9.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edae0b9625d1fce32f7d64b71784d9b1bf8469ec1a9c417e44aaf16a9cbd7571" +checksum = "b0357a6402b295ca3a86bc148e84df46c02e41f41fef186bda662557ef6328aa" dependencies = [ "smallvec", ] @@ -109,50 +107,136 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "time", + "wasm-bindgen", "winapi", ] +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" dependencies = [ "libc", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cxx" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a41a86530d0fe7f5d9ea779916b7cadd2d4f9add748b99c2c029cbbdfaf453" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06416d667ff3e3ad2df1cd8cd8afae5da26cf9cec4d0825040f88b5ca659a2f0" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "820a9a2af1669deeef27cb271f476ffd196a2c4b6731336011e0ba63e2c7cf71" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08a6e2fcc370a089ad3b4aaf54db3b1b4cee38ddabce5896b33eb693275f470" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dashmap" -version = "5.2.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8858831f7781322e539ea39e72449c46b059638250c14344fec8d0aa6e539c" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if", - "num_cpus", - "parking_lot", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", ] [[package]] name = "deunicode" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c9736e15e7df1638a7f6eee92a6511615c738246a052af5ba86f039b65aede" +checksum = "08ff6a4480d42625e59bc4e8b5dc3723279fd24d83afe8aa20df217276261cd6" [[package]] name = "digest" -version = "0.9.0" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "generic-array", + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -220,24 +304,24 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" +checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" [[package]] name = "futures-executor" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" +checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" dependencies = [ "futures-core", "futures-task", @@ -246,50 +330,46 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" +checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" + +[[package]] +name = "futures-macro" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "futures-task" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" [[package]] name = "futures-util" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" dependencies = [ "futures-core", + "futures-macro", "futures-task", "pin-project-lite", "pin-utils", "slab", ] -[[package]] -name = "gdk" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" -dependencies = [ - "bitflags", - "cairo-rs", - "gdk-pixbuf", - "gdk-sys", - "gio", - "glib", - "libc", - "pango", -] - [[package]] name = "gdk-pixbuf" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172dfe1d9dfb62936bf7ad3ede2913a1b21b1e3db56990e46e00789201de9070" +checksum = "0ba3e42776d1466938add08211734738d5c76e863a25b7a8064c4433a74a1a26" dependencies = [ "bitflags", "gdk-pixbuf-sys", @@ -300,9 +380,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413424d9818621fa3cfc8a3a915cdb89a7c3c507d56761b4ec83a9a98e587171" +checksum = "3092cf797a5f1210479ea38070d9ae8a5b8e9f8f1be9f32f4643c529c7d70016" dependencies = [ "gio-sys", "glib-sys", @@ -312,10 +392,26 @@ dependencies = [ ] [[package]] -name = "gdk-sys" -version = "0.15.1" +name = "gdk4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +checksum = "dc7fc4b05be1159056c57a08102ea494892f75ff8517f5518b0401e466f77c69" +dependencies = [ + "bitflags", + "cairo-rs", + "gdk-pixbuf", + "gdk4-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk4-sys" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c057b794185a52862037526fb95aafabce9427fb98a7e9f5fe39a6f832c92822" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -330,9 +426,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", "version_check", @@ -340,26 +436,29 @@ dependencies = [ [[package]] name = "gio" -version = "0.15.10" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cd21a7a674ea811749661012512b0ba5237ba404ccbcab2850db5537549b64" +checksum = "1d4a17d999e6e4e05d87c2bb05b7140d47769bc53211711a33e2f91536458714" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-io", + "futures-util", "gio-sys", "glib", "libc", "once_cell", + "pin-project-lite", + "smallvec", "thiserror", ] [[package]] name = "gio-sys" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04b57719ccaacf2a0d9c79f151be629f3a3ef3991658ee2af0bb66287e4ea86c" +checksum = "e9b693b8e39d042a95547fc258a7b07349b1f0b48f4b2fa3108ba3c51c0b5229" dependencies = [ "glib-sys", "gobject-sys", @@ -370,15 +469,17 @@ dependencies = [ [[package]] name = "glib" -version = "0.15.10" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a826fad715b57834920839d7a594c3b5e416358c7d790bdaba847a40d7c1d96d" +checksum = "50feee2f1e73be50e6634c901bfced69a0937c5e4e4673067ade85e093fa9bd7" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-executor", "futures-task", + "futures-util", + "gio-sys", "glib-macros", "glib-sys", "gobject-sys", @@ -390,12 +491,12 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.10" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac4d47c544af67747652ab1865ace0ffa1155709723ac4f32e97587dd4735b2" +checksum = "e084807350b01348b6d9dbabb724d1a0bb987f47a2c85de200e98e12e30733bf" dependencies = [ "anyhow", - "heck 0.4.0", + "heck", "proc-macro-crate", "proc-macro-error", "proc-macro2", @@ -405,9 +506,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c668102c6e15e0a7f6b99b59f602c2e806967bb86414f617b77e19b1de5b3fac" +checksum = "c61a4f46316d06bfa33a7ac22df6f0524c8be58e3db2d9ca99ccb1f357b62a65" dependencies = [ "libc", "system-deps", @@ -415,9 +516,9 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb1f0b3e4c08e2a0a490d1082ba9e902cdff8ff07091e85c6caec60d17e2ab" +checksum = "3520bb9c07ae2a12c7f2fbb24d4efc11231c8146a86956413fb1a79bb760a0f1" dependencies = [ "glib-sys", "libc", @@ -425,51 +526,88 @@ dependencies = [ ] [[package]] -name = "gtk" -version = "0.15.4" +name = "graphene-rs" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2d1326b36af927fe46ae2f89a8fec38c6f0d279ebc5ef07ffeeabb70300bfc" +checksum = "95ecb4d347e6d09820df3bdfd89a74a8eec07753a06bb92a3aac3ad31d04447b" +dependencies = [ + "glib", + "graphene-sys", + "libc", +] + +[[package]] +name = "graphene-sys" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9aa82337d3972b4eafdea71e607c23f47be6f27f749aab613f1ad8ddbe6dcd6" +dependencies = [ + "glib-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gsk4" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcd01e485189515263f6d3ac8a624b1c0cd13c1097991e72d0cc0c145a303c0" dependencies = [ - "atk", "bitflags", "cairo-rs", - "field-offset", - "futures-channel", - "gdk", - "gdk-pixbuf", - "gio", + "gdk4", "glib", - "gtk-sys", - "gtk3-macros", + "graphene-rs", + "gsk4-sys", "libc", - "once_cell", "pango", - "pkg-config", ] [[package]] -name = "gtk-sys" -version = "0.15.1" +name = "gsk4-sys" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013419d486809ebafd7d8c2450afcfcf384c1a52dd079660f88c2a3b2e19f82f" +checksum = "f47c49111e33020615a6c6b78d755c8b54b8504143cae1bf972bccc03eaa3f59" dependencies = [ - "atk-sys", "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk-sys", - "gio-sys", + "gdk4-sys", "glib-sys", "gobject-sys", + "graphene-sys", "libc", "pango-sys", "system-deps", ] [[package]] -name = "gtk3-macros" -version = "0.15.1" +name = "gtk4" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c61a704ecdedd1c0ca66ff0184bd19e9c488835bb391655bfe6b60f6e2e43e" +dependencies = [ + "bitflags", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk-pixbuf", + "gdk4", + "gio", + "glib", + "graphene-rs", + "gsk4", + "gtk4-macros", + "gtk4-sys", + "libc", + "once_cell", + "pango", +] + +[[package]] +name = "gtk4-macros" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c891188af69e77a1e8a0b1746fbd03b9b396e7d34d518c5331b15950259f541" +checksum = "42f57e7025a8bae8429e07aeeae9c4c3fef5d7cd14834afdd6d6d23f76984246" dependencies = [ "anyhow", "proc-macro-crate", @@ -480,14 +618,30 @@ dependencies = [ ] [[package]] -name = "heck" -version = "0.3.3" +name = "gtk4-sys" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "42e1bb57be47aac6ce77b5281ad64389a19db5aba6db75b07f0049571ad6fe0f" dependencies = [ - "unicode-segmentation", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "graphene-sys", + "gsk4-sys", + "libc", + "pango-sys", + "system-deps", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "heck" version = "0.4.0" @@ -495,20 +649,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" [[package]] -name = "hermit-abi" -version = "0.1.19" +name = "humansize" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +checksum = "4e682e2bd70ecbcce5209f11a992a4ba001fea8e60acf7860ce007629e6d2756" dependencies = [ - "libc", + "libm", ] -[[package]] -name = "humansize" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" - [[package]] name = "i18n-config" version = "0.4.2" @@ -578,6 +726,30 @@ dependencies = [ "syn", ] +[[package]] +name = "iana-time-zone" +version = "0.1.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + [[package]] name = "intl-memoizer" version = "0.5.1" @@ -590,14 +762,22 @@ dependencies = [ [[package]] name = "intl_pluralrules" -version = "7.0.1" +version = "7.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b18f988384267d7066cc2be425e6faf352900652c046b6971d2e228d3b1c5ecf" +checksum = "078ea7b7c29a2b4df841a7f6ac8775ff6074020c6776d48491ce2268e068f972" dependencies = [ - "tinystr", "unic-langid", ] +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -606,9 +786,24 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.114" +version = "0.2.137" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89" + +[[package]] +name = "libm" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0005d08a8f7b65fb8073cb697aa0b12b631ed251ce73d862ce50eeb52ce3b50" +checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" + +[[package]] +name = "link-cplusplus" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +dependencies = [ + "cc", +] [[package]] name = "locale_config" @@ -625,18 +820,19 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] @@ -652,9 +848,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -667,9 +863,9 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -677,23 +873,13 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "objc" version = "0.2.7" @@ -725,33 +911,28 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" - -[[package]] -name = "opaque-debug" -version = "0.3.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "open" -version = "2.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9213e7b66aa06a7722828ee2980c1adff22a3922b582baaa1e62e30ca2a6c018" +checksum = "2078c0039e6a54a0c42c28faa984e115fb4c2d5bf2208f77d1961002df8576f8" dependencies = [ "pathdiff", - "winapi", + "windows-sys", ] [[package]] name = "pango" -version = "0.15.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79211eff430c29cc38c69e0ab54bc78fa1568121ca9737707eee7f92a8417a94" +checksum = "f6a83cd4015382dbb0f4fcf3ab7b277d4885711a62b2f2c1e6582a120094edad" dependencies = [ "bitflags", + "gio", "glib", "libc", "once_cell", @@ -760,9 +941,9 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.1" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7022c2fb88cd2d9d55e1a708a8c53a3ae8678234c4a54bf623400aeb7f31fac2" +checksum = "9e134909a9a293e04d2cc31928aa95679c5e4df954d0b85483159bd20d8f047f" dependencies = [ "glib-sys", "gobject-sys", @@ -772,9 +953,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", "parking_lot_core", @@ -782,9 +963,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.1" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28141e0cc4143da2443301914478dc976a61ffdb3f043058310c70df2fed8954" +checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" dependencies = [ "cfg-if", "libc", @@ -801,18 +982,19 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pest" -version = "2.1.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +checksum = "5f400b0f7905bf702f9f3dc3df5a121b16c54e9e8012c082905fdf09a931861a" dependencies = [ + "thiserror", "ucd-trie", ] [[package]] name = "pin-project-lite" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -822,16 +1004,17 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "proc-macro-crate" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebace6889caf889b4d3f76becee12e90353f2b8c7d875534a71e5742f8f6f83" +checksum = "eda0fc3b0fb7c975631757e14d9049da17374063edb6ebbcbc54d880d4fe94e9" dependencies = [ + "once_cell", "thiserror", "toml", ] @@ -862,36 +1045,36 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" dependencies = [ - "unicode-xid", + "unicode-ident", ] [[package]] name = "quote" -version = "1.0.15" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ "proc-macro2", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" dependencies = [ "aho-corasick", "memchr", @@ -900,15 +1083,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "rust-embed" -version = "6.3.0" +version = "6.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40377bff8cceee81e28ddb73ac97f5c2856ce5522f0b260b763f434cdfae602" +checksum = "283ffe2f866869428c92e0d61c2f35dfb4355293cdfdc48f49e895c15f1333d1" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -917,9 +1100,9 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "6.2.0" +version = "6.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94e763e24ba2bf0c72bc6be883f967f794a019fafd1b86ba1daff9c91a7edd30" +checksum = "31ab23d42d71fb9be1b643fe6765d292c5e14d46912d13f3ae2815ca048ea04d" dependencies = [ "proc-macro2", "quote", @@ -930,9 +1113,9 @@ dependencies = [ [[package]] name = "rust-embed-utils" -version = "7.1.0" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad22c7226e4829104deab21df575e995bfbc4adfad13a595e387477f238c1aec" +checksum = "c1669d81dfabd1b5f8e2856b8bbe146c6192b0ba22162edc738ac0a5de18f054" dependencies = [ "sha2", "walkdir", @@ -968,6 +1151,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scratch" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" + [[package]] name = "self_cell" version = "0.10.2" @@ -994,18 +1183,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.136" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852" dependencies = [ "proc-macro2", "quote", @@ -1014,22 +1203,23 @@ dependencies = [ [[package]] name = "sha2" -version = "0.9.9" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ - "block-buffer", "cfg-if", "cpufeatures", "digest", - "opaque-debug", ] [[package]] name = "slab" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] [[package]] name = "slugmin" @@ -1042,9 +1232,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "strsim" @@ -1054,23 +1244,23 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.86" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "system-deps" -version = "6.0.0" +version = "6.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1487aaddaacbc5d60a2a507ba1617c5ca66c57dd0dd07d0c5efd5b693841d4" +checksum = "2955b1fe31e1fa2fbd1976b71cc69a606d7d4da16f6de3333d0c92d51419aeff" dependencies = [ "cfg-expr", - "heck 0.3.3", + "heck", "pkg-config", "toml", "version-compare", @@ -1081,10 +1271,10 @@ name = "szyszka" version = "2.0.0" dependencies = [ "chrono", - "gdk", + "gdk4", "gio", "glib", - "gtk", + "gtk4", "humansize", "i18n-embed", "i18n-embed-fl", @@ -1095,20 +1285,29 @@ dependencies = [ "walkdir", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ "proc-macro2", "quote", @@ -1128,15 +1327,18 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.3.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29738eedb4388d9ea620eeab9384884fc3f06f586a2eddb56bedc5885126c7c1" +checksum = "f8aeafdfd935e4a7fe16a91ab711fa52d54df84f9c8f7ca5837a9d1d902ef4c2" +dependencies = [ + "displaydoc", +] [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] @@ -1158,46 +1360,46 @@ checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "ucd-trie" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "unic-langid" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73328fcd730a030bdb19ddf23e192187a6b01cd98be6d3140622a89129459ce5" +checksum = "398f9ad7239db44fd0f80fe068d12ff22d78354080332a5077dc6f52f14dcf2f" dependencies = [ "unic-langid-impl", ] [[package]] name = "unic-langid-impl" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a4a8eeaf0494862c1404c95ec2f4c33a2acff5076f64314b465e3ddae1b934d" +checksum = "e35bfd2f2b8796545b55d7d3fd3e89a0613f68a0d1c8bc28cb7ff96b411a35ff" dependencies = [ "serde", "tinystr", ] [[package]] -name = "unicode-segmentation" -version = "1.8.0" +name = "unicode-ident" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-width" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "version-compare" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe88247b92c1df6b6de80ddc290f3976dbdf2f5f5d3fd049a9fb598c6dd5ca73" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" [[package]] name = "version_check" @@ -1222,6 +1424,60 @@ version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + [[package]] name = "winapi" version = "0.3.9" @@ -1255,43 +1511,57 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.32.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df6e476185f92a12c072be4a189a0210dcdcf512a1891d6dff9edb874deadc6" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ + "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", + "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" + [[package]] name = "windows_aarch64_msvc" -version = "0.32.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" +checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" [[package]] name = "windows_i686_gnu" -version = "0.32.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" +checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" [[package]] name = "windows_i686_msvc" -version = "0.32.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" +checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" [[package]] name = "windows_x86_64_gnu" -version = "0.32.0" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" +checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" [[package]] name = "windows_x86_64_msvc" -version = "0.32.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" +checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" diff --git a/Cargo.toml b/Cargo.toml index 57d66d7..47a9e08 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,20 +7,21 @@ description = "Fast, powerful and easy to use file renamer" license = "MIT" homepage = "https://github.com/qarmin/szyszka" repository = "https://github.com/qarmin/szyszka" +rust-version = "1.63.0" [dependencies] -gdk = "0.15.4" -gio = "0.15.10" -glib = "0.15.10" +gdk4 = "0.5.2" +gio = "0.16.3" +glib = "0.16.3" # For checking path walkdir = "2.3.2" -humansize = "1.1.1" -chrono = "0.4.19" +humansize = "2.1.2" +chrono = "0.4.23" # For opening files -open = "2.1.1" +open = "3.2.0" # For slugs slugmin = "1.0.2" @@ -28,11 +29,11 @@ slugmin = "1.0.2" # Language i18n-embed = { version = "0.13.4", features = ["fluent-system", "desktop-requester"] } i18n-embed-fl = "0.6.4" -rust-embed = "6.3.0" -once_cell = "1.10.0" +rust-embed = "6.4.2" +once_cell = "1.16.0" -[dependencies.gtk] -version = "0.15.4" +[dependencies.gtk4] +version = "0.5.2" default-features = false # just in case -features = ["v3_24_9"] +features = ["v4_6"] diff --git a/misc/szyszka-appimage-recipe.yml b/misc/szyszka-appimage-recipe.yml new file mode 100644 index 0000000..ed4706b --- /dev/null +++ b/misc/szyszka-appimage-recipe.yml @@ -0,0 +1,11 @@ +app: Szyszka + +ingredients: + script: + - mkdir -p szyszka + +script: + - pwd + - cp ../../szyszka ./usr/bin/szyszka + - cp ../../data/com.github.qarmin.szyszka.desktop . + - cp ../../data/icons/com.github.qarmin.szyszka.svg . diff --git a/src/class_dialog_rule_add_number.rs b/src/class_dialog_rule_add_number.rs index 78c783b..ac72147 100644 --- a/src/class_dialog_rule_add_number.rs +++ b/src/class_dialog_rule_add_number.rs @@ -1,27 +1,25 @@ -use gtk::prelude::*; - #[derive(Clone)] pub struct GuiAddNumber { - pub radio_button_add_number_before_name: gtk::RadioButton, - pub radio_button_add_number_after_name: gtk::RadioButton, + pub check_button_add_number_before_name: gtk4::CheckButton, + pub check_button_add_number_after_name: gtk4::CheckButton, - pub entry_add_number_start_number: gtk::Entry, - pub entry_add_number_step: gtk::Entry, - pub entry_add_number_zeros: gtk::Entry, + pub entry_add_number_start_number: gtk4::Entry, + pub entry_add_number_step: gtk4::Entry, + pub entry_add_number_zeros: gtk4::Entry, } impl GuiAddNumber { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let radio_button_add_number_before_name: gtk::RadioButton = builder.object("radio_button_add_number_before_name").unwrap(); - let radio_button_add_number_after_name: gtk::RadioButton = builder.object("radio_button_add_number_after_name").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let check_button_add_number_before_name: gtk4::CheckButton = builder.object("check_button_add_number_before_name").unwrap(); + let check_button_add_number_after_name: gtk4::CheckButton = builder.object("check_button_add_number_after_name").unwrap(); - let entry_add_number_start_number: gtk::Entry = builder.object("entry_add_number_start_number").unwrap(); - let entry_add_number_step: gtk::Entry = builder.object("entry_add_number_step").unwrap(); - let entry_add_number_zeros: gtk::Entry = builder.object("entry_add_number_zeros").unwrap(); + let entry_add_number_start_number: gtk4::Entry = builder.object("entry_add_number_start_number").unwrap(); + let entry_add_number_step: gtk4::Entry = builder.object("entry_add_number_step").unwrap(); + let entry_add_number_zeros: gtk4::Entry = builder.object("entry_add_number_zeros").unwrap(); Self { - radio_button_add_number_before_name, - radio_button_add_number_after_name, + check_button_add_number_before_name, + check_button_add_number_after_name, entry_add_number_start_number, entry_add_number_step, entry_add_number_zeros, diff --git a/src/class_dialog_rule_add_text.rs b/src/class_dialog_rule_add_text.rs index 922806d..1f17ddf 100644 --- a/src/class_dialog_rule_add_text.rs +++ b/src/class_dialog_rule_add_text.rs @@ -1,23 +1,21 @@ -use gtk::prelude::*; - #[derive(Clone)] pub struct GuiAddText { - pub radio_button_add_text_before_name: gtk::RadioButton, - pub radio_button_add_text_after_name: gtk::RadioButton, + pub check_button_add_text_before_name: gtk4::CheckButton, + pub check_button_add_text_after_name: gtk4::CheckButton, - pub entry_add_text_text_to_add: gtk::Entry, + pub entry_add_text_text_to_add: gtk4::Entry, } impl GuiAddText { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let radio_button_add_text_before_name: gtk::RadioButton = builder.object("radio_button_add_text_before_name").unwrap(); - let radio_button_add_text_after_name: gtk::RadioButton = builder.object("radio_button_add_text_after_name").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let check_button_add_text_before_name: gtk4::CheckButton = builder.object("check_button_add_text_before_name").unwrap(); + let check_button_add_text_after_name: gtk4::CheckButton = builder.object("check_button_add_text_after_name").unwrap(); - let entry_add_text_text_to_add: gtk::Entry = builder.object("entry_add_text_text_to_add").unwrap(); + let entry_add_text_text_to_add: gtk4::Entry = builder.object("entry_add_text_text_to_add").unwrap(); Self { - radio_button_add_text_before_name, - radio_button_add_text_after_name, + check_button_add_text_before_name, + check_button_add_text_after_name, entry_add_text_text_to_add, } } diff --git a/src/class_dialog_rule_custom.rs b/src/class_dialog_rule_custom.rs index 52d1ebc..98a8858 100644 --- a/src/class_dialog_rule_custom.rs +++ b/src/class_dialog_rule_custom.rs @@ -1,13 +1,11 @@ -use gtk::prelude::*; - #[derive(Clone)] pub struct GuiCustom { - pub entry_custom_text_to_change: gtk::Entry, + pub entry_custom_text_to_change: gtk4::Entry, } impl GuiCustom { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let entry_custom_text_to_change: gtk::Entry = builder.object("entry_custom_text_to_change").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let entry_custom_text_to_change: gtk4::Entry = builder.object("entry_custom_text_to_change").unwrap(); Self { entry_custom_text_to_change } } diff --git a/src/class_dialog_rule_normalize.rs b/src/class_dialog_rule_normalize.rs index 6c2c04c..677ec87 100644 --- a/src/class_dialog_rule_normalize.rs +++ b/src/class_dialog_rule_normalize.rs @@ -1,19 +1,21 @@ -use gtk::prelude::*; +use gtk4::prelude::*; #[derive(Clone)] pub struct GuiNormalize { - pub radio_button_normalize_everything: gtk::RadioButton, - pub radio_button_normalize_partial: gtk::RadioButton, + pub check_button_normalize_everything: gtk4::CheckButton, + pub check_button_normalize_partial: gtk4::CheckButton, } impl GuiNormalize { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let radio_button_normalize_everything: gtk::RadioButton = builder.object("radio_button_normalize_everything").unwrap(); - let radio_button_normalize_partial: gtk::RadioButton = builder.object("radio_button_normalize_partial").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let check_button_normalize_everything: gtk4::CheckButton = builder.object("check_button_normalize_everything").unwrap(); + let check_button_normalize_partial: gtk4::CheckButton = builder.object("check_button_normalize_partial").unwrap(); + + check_button_normalize_partial.set_group(Some(&check_button_normalize_everything)); Self { - radio_button_normalize_everything, - radio_button_normalize_partial, + check_button_normalize_everything, + check_button_normalize_partial, } } } diff --git a/src/class_dialog_rule_purge.rs b/src/class_dialog_rule_purge.rs index ad07bf9..968c54a 100644 --- a/src/class_dialog_rule_purge.rs +++ b/src/class_dialog_rule_purge.rs @@ -1,22 +1,20 @@ -use gtk::prelude::*; - #[derive(Clone)] pub struct GuiPurge { - pub radio_button_purge_name: gtk::RadioButton, - pub radio_button_purge_extension: gtk::RadioButton, - pub radio_button_purge_both: gtk::RadioButton, + pub check_button_purge_name: gtk4::CheckButton, + pub check_button_purge_extension: gtk4::CheckButton, + pub check_button_purge_both: gtk4::CheckButton, } impl GuiPurge { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let radio_button_purge_name: gtk::RadioButton = builder.object("radio_button_purge_name").unwrap(); - let radio_button_purge_extension: gtk::RadioButton = builder.object("radio_button_purge_extension").unwrap(); - let radio_button_purge_both: gtk::RadioButton = builder.object("radio_button_purge_both").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let check_button_purge_name: gtk4::CheckButton = builder.object("check_button_purge_name").unwrap(); + let check_button_purge_extension: gtk4::CheckButton = builder.object("check_button_purge_extension").unwrap(); + let check_button_purge_both: gtk4::CheckButton = builder.object("check_button_purge_both").unwrap(); Self { - radio_button_purge_name, - radio_button_purge_extension, - radio_button_purge_both, + check_button_purge_name, + check_button_purge_extension, + check_button_purge_both, } } } diff --git a/src/class_dialog_rule_replace.rs b/src/class_dialog_rule_replace.rs index 6e64f5c..32329b6 100644 --- a/src/class_dialog_rule_replace.rs +++ b/src/class_dialog_rule_replace.rs @@ -1,36 +1,34 @@ -use gtk::prelude::*; - #[derive(Clone)] pub struct GuiReplace { - pub radio_button_replace_name: gtk::RadioButton, - pub radio_button_replace_extension: gtk::RadioButton, - pub radio_button_replace_both: gtk::RadioButton, + pub check_button_replace_name: gtk4::CheckButton, + pub check_button_replace_extension: gtk4::CheckButton, + pub check_button_replace_both: gtk4::CheckButton, - pub radio_button_replace_case_insensitive: gtk::RadioButton, - pub radio_button_replace_case_sensitive: gtk::RadioButton, + pub check_button_replace_case_insensitive: gtk4::CheckButton, + pub check_button_replace_case_sensitive: gtk4::CheckButton, - pub entry_replace_text_to_remove: gtk::Entry, - pub entry_replace_text_to_change: gtk::Entry, + pub entry_replace_text_to_remove: gtk4::Entry, + pub entry_replace_text_to_change: gtk4::Entry, } impl GuiReplace { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let radio_button_replace_name: gtk::RadioButton = builder.object("radio_button_replace_name").unwrap(); - let radio_button_replace_extension: gtk::RadioButton = builder.object("radio_button_replace_extension").unwrap(); - let radio_button_replace_both: gtk::RadioButton = builder.object("radio_button_replace_both").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let check_button_replace_name: gtk4::CheckButton = builder.object("check_button_replace_name").unwrap(); + let check_button_replace_extension: gtk4::CheckButton = builder.object("check_button_replace_extension").unwrap(); + let check_button_replace_both: gtk4::CheckButton = builder.object("check_button_replace_both").unwrap(); - let entry_replace_text_to_remove: gtk::Entry = builder.object("entry_replace_text_to_remove").unwrap(); - let entry_replace_text_to_change: gtk::Entry = builder.object("entry_replace_text_to_change").unwrap(); + let entry_replace_text_to_remove: gtk4::Entry = builder.object("entry_replace_text_to_remove").unwrap(); + let entry_replace_text_to_change: gtk4::Entry = builder.object("entry_replace_text_to_change").unwrap(); - let radio_button_replace_case_sensitive: gtk::RadioButton = builder.object("radio_button_replace_case_sensitive").unwrap(); - let radio_button_replace_case_insensitive: gtk::RadioButton = builder.object("radio_button_replace_case_insensitive").unwrap(); + let check_button_replace_case_sensitive: gtk4::CheckButton = builder.object("check_button_replace_case_sensitive").unwrap(); + let check_button_replace_case_insensitive: gtk4::CheckButton = builder.object("check_button_replace_case_insensitive").unwrap(); Self { - radio_button_replace_name, - radio_button_replace_extension, - radio_button_replace_both, - radio_button_replace_case_insensitive, - radio_button_replace_case_sensitive, + check_button_replace_name, + check_button_replace_extension, + check_button_replace_both, + check_button_replace_case_insensitive, + check_button_replace_case_sensitive, entry_replace_text_to_remove, entry_replace_text_to_change, } diff --git a/src/class_dialog_rule_size_letters.rs b/src/class_dialog_rule_size_letters.rs index 4781bb7..df572d2 100644 --- a/src/class_dialog_rule_size_letters.rs +++ b/src/class_dialog_rule_size_letters.rs @@ -1,30 +1,28 @@ -use gtk::prelude::*; - #[derive(Clone)] pub struct GuiSizeLetters { - pub radio_button_letters_type_uppercase: gtk::RadioButton, - pub radio_button_letters_type_lowercase: gtk::RadioButton, + pub check_button_letters_type_uppercase: gtk4::CheckButton, + pub check_button_letters_type_lowercase: gtk4::CheckButton, - pub radio_button_letters_usage_name: gtk::RadioButton, - pub radio_button_letters_usage_extension: gtk::RadioButton, - pub radio_button_letters_usage_both: gtk::RadioButton, + pub check_button_letters_usage_name: gtk4::CheckButton, + pub check_button_letters_usage_extension: gtk4::CheckButton, + pub check_button_letters_usage_both: gtk4::CheckButton, } impl GuiSizeLetters { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let radio_button_letters_type_uppercase: gtk::RadioButton = builder.object("radio_button_letters_type_uppercase").unwrap(); - let radio_button_letters_type_lowercase: gtk::RadioButton = builder.object("radio_button_letters_type_lowercase").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let check_button_letters_type_uppercase: gtk4::CheckButton = builder.object("check_button_letters_type_uppercase").unwrap(); + let check_button_letters_type_lowercase: gtk4::CheckButton = builder.object("check_button_letters_type_lowercase").unwrap(); - let radio_button_letters_usage_name: gtk::RadioButton = builder.object("radio_button_letters_usage_name").unwrap(); - let radio_button_letters_usage_extension: gtk::RadioButton = builder.object("radio_button_letters_usage_extension").unwrap(); - let radio_button_letters_usage_both: gtk::RadioButton = builder.object("radio_button_letters_usage_both").unwrap(); + let check_button_letters_usage_name: gtk4::CheckButton = builder.object("check_button_letters_usage_name").unwrap(); + let check_button_letters_usage_extension: gtk4::CheckButton = builder.object("check_button_letters_usage_extension").unwrap(); + let check_button_letters_usage_both: gtk4::CheckButton = builder.object("check_button_letters_usage_both").unwrap(); Self { - radio_button_letters_type_uppercase, - radio_button_letters_type_lowercase, - radio_button_letters_usage_name, - radio_button_letters_usage_extension, - radio_button_letters_usage_both, + check_button_letters_type_uppercase, + check_button_letters_type_lowercase, + check_button_letters_usage_name, + check_button_letters_usage_extension, + check_button_letters_usage_both, } } } diff --git a/src/class_dialog_rule_trim.rs b/src/class_dialog_rule_trim.rs index f140b0c..2704260 100644 --- a/src/class_dialog_rule_trim.rs +++ b/src/class_dialog_rule_trim.rs @@ -1,37 +1,43 @@ -use gtk::prelude::*; +use gtk4::prelude::*; #[derive(Clone)] pub struct GuiTrim { - pub radio_button_trim_name_start: gtk::RadioButton, - pub radio_button_trim_name_end: gtk::RadioButton, - pub radio_button_trim_extension_start: gtk::RadioButton, - pub radio_button_trim_extension_end: gtk::RadioButton, + pub check_button_trim_name_start: gtk4::CheckButton, + pub check_button_trim_name_end: gtk4::CheckButton, + pub check_button_trim_extension_start: gtk4::CheckButton, + pub check_button_trim_extension_end: gtk4::CheckButton, - pub radio_button_trim_case_sensitive: gtk::RadioButton, - pub radio_button_trim_case_insensitive: gtk::RadioButton, + pub check_button_trim_case_sensitive: gtk4::CheckButton, + pub check_button_trim_case_insensitive: gtk4::CheckButton, - pub entry_add_text_text_to_trim: gtk::Entry, + pub entry_add_text_text_to_trim: gtk4::Entry, } impl GuiTrim { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let radio_button_trim_name_start: gtk::RadioButton = builder.object("radio_button_trim_name_start").unwrap(); - let radio_button_trim_name_end: gtk::RadioButton = builder.object("radio_button_trim_name_end").unwrap(); - let radio_button_trim_extension_start: gtk::RadioButton = builder.object("radio_button_trim_extension_start").unwrap(); - let radio_button_trim_extension_end: gtk::RadioButton = builder.object("radio_button_trim_extension_end").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let check_button_trim_name_start: gtk4::CheckButton = builder.object("check_button_trim_name_start").unwrap(); + let check_button_trim_name_end: gtk4::CheckButton = builder.object("check_button_trim_name_end").unwrap(); + let check_button_trim_extension_start: gtk4::CheckButton = builder.object("check_button_trim_extension_start").unwrap(); + let check_button_trim_extension_end: gtk4::CheckButton = builder.object("check_button_trim_extension_end").unwrap(); - let radio_button_trim_case_sensitive: gtk::RadioButton = builder.object("radio_button_trim_case_sensitive").unwrap(); - let radio_button_trim_case_insensitive: gtk::RadioButton = builder.object("radio_button_trim_case_insensitive").unwrap(); + check_button_trim_name_end.set_group(Some(&check_button_trim_name_start)); + check_button_trim_extension_start.set_group(Some(&check_button_trim_name_start)); + check_button_trim_extension_end.set_group(Some(&check_button_trim_name_start)); - let entry_add_text_text_to_trim: gtk::Entry = builder.object("entry_add_text_text_to_trim").unwrap(); + let check_button_trim_case_sensitive: gtk4::CheckButton = builder.object("check_button_trim_case_sensitive").unwrap(); + let check_button_trim_case_insensitive: gtk4::CheckButton = builder.object("check_button_trim_case_insensitive").unwrap(); + + check_button_trim_case_insensitive.set_group(Some(&check_button_trim_case_sensitive)); + + let entry_add_text_text_to_trim: gtk4::Entry = builder.object("entry_add_text_text_to_trim").unwrap(); Self { - radio_button_trim_name_start, - radio_button_trim_name_end, - radio_button_trim_extension_start, - radio_button_trim_extension_end, - radio_button_trim_case_sensitive, - radio_button_trim_case_insensitive, + check_button_trim_name_start, + check_button_trim_name_end, + check_button_trim_extension_start, + check_button_trim_extension_end, + check_button_trim_case_sensitive, + check_button_trim_case_insensitive, entry_add_text_text_to_trim, } } diff --git a/src/class_dialog_rules.rs b/src/class_dialog_rules.rs index 3aac667..05a7633 100644 --- a/src/class_dialog_rules.rs +++ b/src/class_dialog_rules.rs @@ -6,15 +6,14 @@ use crate::class_dialog_rule_purge::GuiPurge; use crate::class_dialog_rule_replace::GuiReplace; use crate::class_dialog_rule_size_letters::GuiSizeLetters; use crate::class_dialog_rule_trim::GuiTrim; -use gtk::prelude::*; -use gtk::{Button, Entry, Label, WindowPosition}; +use gtk4::{Button, Entry, Label}; #[derive(Clone)] pub struct GuiDialogRules { - pub notebook_choose_rule: gtk::Notebook, + pub notebook_choose_rule: gtk4::Notebook, - pub window_with_rules: gtk::Window, - pub button_rule_window_add: gtk::Button, + pub window_with_rules: gtk4::Window, + pub button_rule_window_add: gtk4::Button, pub size_letters: GuiSizeLetters, pub purge: GuiPurge, @@ -31,12 +30,11 @@ pub struct GuiDialogRules { } impl GuiDialogRules { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let notebook_choose_rule: gtk::Notebook = builder.object("notebook_choose_rule").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let notebook_choose_rule: gtk4::Notebook = builder.object("notebook_choose_rule").unwrap(); - let window_with_rules: gtk::Window = builder.object("window_with_rules").unwrap(); - window_with_rules.set_position(WindowPosition::Center); - let button_rule_window_add: gtk::Button = builder.object("button_rule_window_add").unwrap(); + let window_with_rules: gtk4::Window = builder.object("window_with_rules").unwrap(); + let button_rule_window_add: gtk4::Button = builder.object("button_rule_window_add").unwrap(); let size_letters: GuiSizeLetters = GuiSizeLetters::create_from_builder(builder); let purge: GuiPurge = GuiPurge::create_from_builder(builder); @@ -47,9 +45,9 @@ impl GuiDialogRules { let add_number: GuiAddNumber = GuiAddNumber::create_from_builder(builder); let normalize: GuiNormalize = GuiNormalize::create_from_builder(builder); - let entry_example_before: gtk::Entry = builder.object("entry_example_before").unwrap(); - let label_example_after: gtk::Label = builder.object("label_example_after").unwrap(); - let button_example_reset: gtk::Button = builder.object("button_example_reset").unwrap(); + let entry_example_before: gtk4::Entry = builder.object("entry_example_before").unwrap(); + let label_example_after: gtk4::Label = builder.object("label_example_after").unwrap(); + let button_example_reset: gtk4::Button = builder.object("button_example_reset").unwrap(); Self { notebook_choose_rule, diff --git a/src/connect_add_files_button.rs b/src/connect_add_files_button.rs index 86b389e..c1141cf 100644 --- a/src/connect_add_files_button.rs +++ b/src/connect_add_files_button.rs @@ -2,9 +2,11 @@ use crate::gui_data::GuiData; use crate::help_function::{get_list_store_from_tree_view, split_path, ColumnsResults}; use crate::update_records::{update_records, UpdateMode}; use chrono::Local; -use gtk::prelude::*; +use gtk4::prelude::*; +use gtk4::ResponseType; use std::cmp::{max, Ordering}; use std::fs; +use std::path::PathBuf; use std::time::UNIX_EPOCH; pub fn connect_add_files_button(gui_data: &GuiData) { @@ -17,13 +19,31 @@ pub fn connect_add_files_button(gui_data: &GuiData) { let window_main = gui_data.window_main.clone(); button_add_files.connect_clicked(move |_| { - let chooser = gtk::FileChooserDialog::with_buttons(Some("Files to include"), Some(&window_main), gtk::FileChooserAction::Open, &[("Ok", gtk::ResponseType::Ok), ("Close", gtk::ResponseType::Cancel)]); + let chooser = gtk4::FileChooserDialog::builder().title("Files to include").action(gtk4::FileChooserAction::Open).transient_for(&window_main).modal(true).build(); + chooser.add_button("OK", ResponseType::Ok); + chooser.add_button("Cancel", ResponseType::Cancel); + chooser.set_select_multiple(true); - chooser.show_all(); - { - let response_type = chooser.run(); - if response_type == gtk::ResponseType::Ok { - let mut folder = chooser.filenames(); + chooser.show(); + + let tree_view_results = tree_view_results.clone(); + let label_files_folders = label_files_folders.clone(); + let shared_result_entries = shared_result_entries.clone(); + let rules = rules.clone(); + + chooser.connect_response(move |dialog, response_type| { + if response_type == gtk4::ResponseType::Ok { + let mut folder: Vec = Vec::new(); + let g_files = dialog.files(); + for index in 0..g_files.n_items() { + let file = &g_files.item(index); + if let Some(file) = file { + let ss = file.clone().downcast::().unwrap(); + if let Some(path_buf) = ss.path() { + folder.push(path_buf); + } + } + } let mut result_entries = shared_result_entries.borrow_mut(); @@ -58,7 +78,7 @@ pub fn connect_add_files_button(gui_data: &GuiData) { } //// Read Metadata - let file_metadata = match fs::metadata(&file_entry) { + let file_metadata = match fs::metadata(file_entry) { Ok(t) => t, Err(err) => { eprintln!("Failed to load metadata of file {}, reason - \"{}\"", file_entry.display(), err); @@ -114,8 +134,8 @@ pub fn connect_add_files_button(gui_data: &GuiData) { } } update_records(&tree_view_results, shared_result_entries.clone(), rules.clone(), UpdateMode::FileAdded, &label_files_folders); - } - chooser.close(); + dialog.close(); + }); }); } diff --git a/src/connect_add_folders_button.rs b/src/connect_add_folders_button.rs index c72ac16..a6de115 100644 --- a/src/connect_add_folders_button.rs +++ b/src/connect_add_folders_button.rs @@ -1,11 +1,13 @@ use crate::gui_data::GuiData; -use crate::help_function::{get_list_store_from_tree_view, split_path, ColumnsResults}; +use crate::help_function::{get_all_boxes_from_widget, get_list_store_from_tree_view, split_path, ColumnsResults}; use crate::update_records::{update_records, UpdateMode}; use chrono::Local; -use gtk::prelude::*; -use gtk::{FileChooserAction, Orientation, PackType}; +use glib::signal::Inhibit; +use gtk4::prelude::*; +use gtk4::{Orientation, ResponseType}; use std::cmp::{max, Ordering}; use std::fs; +use std::path::PathBuf; use std::time::UNIX_EPOCH; use walkdir::WalkDir; @@ -20,164 +22,191 @@ pub fn connect_add_folders_button(gui_data: &GuiData) { let window_main = gui_data.window_main.clone(); button_add_folders.connect_clicked(move |_| { - let chooser = gtk::FileChooserDialog::with_buttons(Some("Files to include"), Some(&window_main), gtk::FileChooserAction::Open, &[("Ok", gtk::ResponseType::Ok), ("Close", gtk::ResponseType::Cancel)]); + let chooser = gtk4::FileChooserDialog::builder() + .title("Files to include") + .action(gtk4::FileChooserAction::SelectFolder) + .transient_for(&window_main) + .modal(true) + .build(); + chooser.add_button("OK", ResponseType::Ok); + chooser.add_button("Cancel", ResponseType::Cancel); + chooser.set_select_multiple(true); - chooser.set_action(FileChooserAction::SelectFolder); { // Adds recursive button to FileDialog - let box_pack = gtk::Box::new(Orientation::Horizontal, 0); + let box_pack = gtk4::Box::new(Orientation::Horizontal, 0); - let switch_scan_inside = gtk::Switch::new(); - box_pack.add(&switch_scan_inside); - box_pack.set_child_packing(&switch_scan_inside, false, true, 5, PackType::End); + let switch_scan_inside = gtk4::Switch::new(); + box_pack.append(&switch_scan_inside); + // box_pack.set_child_packing(&switch_scan_inside, false, true, 5, PackType::End); // TODO GTK 4 - let label_scan_inside = gtk::Label::new(Some("Scan inside ")); - box_pack.add(&label_scan_inside); - box_pack.set_child_packing(&label_scan_inside, false, true, 0, PackType::End); + let label_scan_inside = gtk4::Label::new(Some("Scan inside ")); + box_pack.append(&label_scan_inside); + // box_pack.set_child_packing(&label_scan_inside, false, true, 0, PackType::End); - let switch_ignore_folders = gtk::Switch::new(); - box_pack.add(&switch_ignore_folders); - box_pack.set_child_packing(&switch_ignore_folders, false, true, 5, PackType::End); + let switch_ignore_folders = gtk4::Switch::new(); + switch_ignore_folders.set_active(true); + box_pack.append(&switch_ignore_folders); + // box_pack.set_child_packing(&switch_ignore_folders, false, true, 5, PackType::End); - let label_ignore_folders = gtk::Label::new(Some("Ignore folders ")); - box_pack.add(&label_ignore_folders); - box_pack.set_child_packing(&label_ignore_folders, false, true, 0, PackType::End); + let label_ignore_folders = gtk4::Label::new(Some("Ignore folders ")); + box_pack.append(&label_ignore_folders); + // box_pack.set_child_packing(&label_ignore_folders, false, true, 0, PackType::End); - let internal_box = chooser.children()[0].clone().downcast::().unwrap(); - internal_box.add(&box_pack); + let internal_box = get_all_boxes_from_widget(&chooser)[0].clone(); + internal_box.append(&box_pack); switch_ignore_folders.set_sensitive(false); - let sif = switch_ignore_folders.clone(); - switch_scan_inside.connect_changed_active(move |e| { - sif.set_sensitive(e.is_active()); + let sif = switch_ignore_folders.clone(); // TODO GTK 4 + switch_scan_inside.connect_state_set(move |_, b| { + sif.set_sensitive(b); + Inhibit(false) }); - chooser.set_title("Folders to include"); - chooser.show_all(); - let response_type = chooser.run(); - if response_type == gtk::ResponseType::Ok { - let mut result_entries = shared_result_entries.borrow_mut(); + chooser.set_title(Some("Folders to include")); + chooser.show(); + + let shared_result_entries = shared_result_entries.clone(); + let label_files_folders = label_files_folders.clone(); + let tree_view_results = tree_view_results.clone(); + let rules = rules.clone(); + + chooser.connect_response(move |chooser, response| { + if response == gtk4::ResponseType::Ok { + let mut result_entries = shared_result_entries.borrow_mut(); - let list_store = get_list_store_from_tree_view(&tree_view_results); + let list_store = get_list_store_from_tree_view(&tree_view_results); + + let mut folders_to_check: Vec = Vec::new(); + let g_files = chooser.files(); + for index in 0..g_files.n_items() { + let file = &g_files.item(index); + if let Some(file) = file { + let ss = file.clone().downcast::().unwrap(); + if let Some(path_buf) = ss.path() { + folders_to_check.push(path_buf); + } + } + } - let folders_to_check = chooser.filenames(); - let mut folders; + let mut folders; - let ignore_folders = switch_ignore_folders.is_active(); - let check_folders_inside = switch_scan_inside.is_active(); + let ignore_folders = switch_ignore_folders.is_active(); + let check_folders_inside = switch_scan_inside.is_active(); - let mut new_entries = Vec::new(); + let mut new_entries = Vec::new(); - if check_folders_inside { - if ignore_folders { - for folder in folders_to_check { - for entry in WalkDir::new(folder).max_depth(9999).into_iter().filter_map(|e| e.ok()) { - if let Ok(metadata) = entry.metadata() { - if metadata.is_file() { - new_entries.push(entry.path().to_path_buf()); + if check_folders_inside { + if ignore_folders { + for folder in folders_to_check { + for entry in WalkDir::new(folder).max_depth(9999).into_iter().filter_map(|e| e.ok()) { + if let Ok(metadata) = entry.metadata() { + if metadata.is_file() { + new_entries.push(entry.path().to_path_buf()); + } } } } - } - } else { - for folder in folders_to_check { - for entry in WalkDir::new(folder).max_depth(9999).into_iter().filter_map(|e| e.ok()) { - new_entries.push(entry.path().to_path_buf()); + } else { + for folder in folders_to_check { + for entry in WalkDir::new(folder).max_depth(9999).into_iter().filter_map(|e| e.ok()) { + new_entries.push(entry.path().to_path_buf()); + } } } + folders = new_entries; + } else { + folders = folders_to_check; } - folders = new_entries; - } else { - folders = folders_to_check; - } - folders.sort_by(|a, b| { - let (path_a, name_a) = split_path(a); - let (path_b, name_b) = split_path(b); - let res = path_a.cmp(&path_b); - if res == Ordering::Equal { - return name_a.cmp(&name_b); - } - res - }); - - let timezone_offset = Local::now().offset().local_minus_utc(); - - for file_entry in &folders { - let (path, name) = split_path(file_entry); - let full_name = match file_entry.to_str() { - Some(t) => t, - None => { - println!("Failed to read name of {:?} (some characters may be missing in this name)", file_entry); - continue; + folders.sort_by(|a, b| { + let (path_a, name_a) = split_path(a); + let (path_b, name_b) = split_path(b); + let res = path_a.cmp(&path_b); + if res == Ordering::Equal { + return name_a.cmp(&name_b); } - }; - - if result_entries.files.contains(full_name) { - // Remove this println - // println!("Already is used file name {}", full_name); - continue; // There is already entry - } + res + }); + + let timezone_offset = Local::now().offset().local_minus_utc(); + + for file_entry in &folders { + let (path, name) = split_path(file_entry); + let full_name = match file_entry.to_str() { + Some(t) => t, + None => { + println!("Failed to read name of {:?} (some characters may be missing in this name)", file_entry); + continue; + } + }; - //// Read Metadata - let file_metadata = match fs::metadata(&file_entry) { - Ok(t) => t, - Err(err) => { - eprintln!("Failed to load metadata of file {}, reason - \"{}\"", file_entry.display(), err); - continue; + if result_entries.files.contains(full_name) { + // Remove this println + // println!("Already is used file name {}", full_name); + continue; // There is already entry } - }; - let size = file_metadata.len(); - let modification_date = match file_metadata.modified() { - Ok(t) => match t.duration_since(UNIX_EPOCH) { - Ok(d) => max(d.as_secs() as i64 + timezone_offset as i64, 0) as u64, - Err(_) => { - eprintln!("File {} seems to be modified before Unix Epoch.", file_entry.display()); + + //// Read Metadata + let file_metadata = match fs::metadata(file_entry) { + Ok(t) => t, + Err(err) => { + eprintln!("Failed to load metadata of file {}, reason - \"{}\"", file_entry.display(), err); + continue; + } + }; + let size = file_metadata.len(); + let modification_date = match file_metadata.modified() { + Ok(t) => match t.duration_since(UNIX_EPOCH) { + Ok(d) => max(d.as_secs() as i64 + timezone_offset as i64, 0) as u64, + Err(_) => { + eprintln!("File {} seems to be modified before Unix Epoch.", file_entry.display()); + 0 + } + }, + Err(err) => { + eprintln!("Unable to get modification date from file {}, reason - \"{}\"", file_entry.display(), err); 0 } - }, - Err(err) => { - eprintln!("Unable to get modification date from file {}, reason - \"{}\"", file_entry.display(), err); - 0 - } - }; - let creation_date = match file_metadata.created() { - Ok(t) => match t.duration_since(UNIX_EPOCH) { - Ok(d) => max(d.as_secs() as i64 + timezone_offset as i64, 0) as u64, - Err(_) => { - eprintln!("File {} seems to be created before Unix Epoch.", file_entry.display()); + }; + let creation_date = match file_metadata.created() { + Ok(t) => match t.duration_since(UNIX_EPOCH) { + Ok(d) => max(d.as_secs() as i64 + timezone_offset as i64, 0) as u64, + Err(_) => { + eprintln!("File {} seems to be created before Unix Epoch.", file_entry.display()); + 0 + } + }, + Err(err) => { + eprintln!("Unable to get creation date from file {}, reason - \"{}\"", file_entry.display(), err); 0 } - }, - Err(err) => { - eprintln!("Unable to get creation date from file {}, reason - \"{}\"", file_entry.display(), err); - 0 - } - }; - let is_dir = match file_metadata.is_dir() { - true => "Dir", - false => "File", - }; - - //// Create entry and save it to metadata - let values: [(u32, &dyn ToValue); 7] = [ - (ColumnsResults::Type as u32, &is_dir), - (ColumnsResults::CurrentName as u32, &name), - (ColumnsResults::FutureName as u32, &name), - (ColumnsResults::Path as u32, &path), - (ColumnsResults::Size as u32, &size), - (ColumnsResults::ModificationDate as u32, &modification_date), - (ColumnsResults::CreationDate as u32, &creation_date), - ]; - list_store.set(&list_store.append(), &values); - - // Used to check if already in treeview is this values - result_entries.files.insert(full_name.to_string()); + }; + let is_dir = match file_metadata.is_dir() { + true => "Dir", + false => "File", + }; + + //// Create entry and save it to metadata + let values: [(u32, &dyn ToValue); 7] = [ + (ColumnsResults::Type as u32, &is_dir), + (ColumnsResults::CurrentName as u32, &name), + (ColumnsResults::FutureName as u32, &name), + (ColumnsResults::Path as u32, &path), + (ColumnsResults::Size as u32, &size), + (ColumnsResults::ModificationDate as u32, &modification_date), + (ColumnsResults::CreationDate as u32, &creation_date), + ]; + list_store.set(&list_store.append(), &values); + + // Used to check if already in treeview is this values + result_entries.files.insert(full_name.to_string()); + } } - } - update_records(&tree_view_results, shared_result_entries.clone(), rules.clone(), UpdateMode::FileAdded, &label_files_folders); - } + update_records(&tree_view_results, shared_result_entries.clone(), rules.clone(), UpdateMode::FileAdded, &label_files_folders); - chooser.close(); + chooser.close(); + }); + }; }); } diff --git a/src/connect_button_settings.rs b/src/connect_button_settings.rs index 4abdfd8..17a7db9 100644 --- a/src/connect_button_settings.rs +++ b/src/connect_button_settings.rs @@ -1,5 +1,6 @@ use crate::GuiData; -use gtk::prelude::*; +use glib::signal::Inhibit; +use gtk4::prelude::*; pub fn connect_button_settings(gui_data: &GuiData) { let button_setting = gui_data.upper_buttons.button_setting.clone(); @@ -9,7 +10,7 @@ pub fn connect_button_settings(gui_data: &GuiData) { }); let window_settings = gui_data.settings.window_settings.clone(); - window_settings.connect_delete_event(|window_settings, _| { + window_settings.connect_close_request(|window_settings| { window_settings.hide(); Inhibit(true) }); diff --git a/src/connect_button_update_names.rs b/src/connect_button_update_names.rs index fade9fe..4ef0399 100644 --- a/src/connect_button_update_names.rs +++ b/src/connect_button_update_names.rs @@ -1,6 +1,6 @@ use crate::gui_data::GuiData; use crate::update_records::{update_records, UpdateMode}; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_button_update_names(gui_data: &GuiData) { let button_update_names = gui_data.upper_buttons.button_update_names.clone(); diff --git a/src/connect_change_language.rs b/src/connect_change_language.rs index da12f56..99fad8b 100644 --- a/src/connect_change_language.rs +++ b/src/connect_change_language.rs @@ -1,4 +1,4 @@ -use gtk::prelude::*; +use gtk4::prelude::*; use i18n_embed::unic_langid::LanguageIdentifier; use i18n_embed::DesktopLanguageRequester; diff --git a/src/connect_remove_files_button.rs b/src/connect_remove_files_button.rs index f2df76c..707ab42 100644 --- a/src/connect_remove_files_button.rs +++ b/src/connect_remove_files_button.rs @@ -1,7 +1,7 @@ use crate::gui_data::GuiData; use crate::help_function::{get_full_file_names_from_selection, remove_selected_rows}; use crate::update_records::{update_records, UpdateMode}; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_remove_files_button(gui_data: &GuiData) { let button_remove_selection = gui_data.upper_buttons.button_remove_selection.clone(); diff --git a/src/connect_results_move.rs b/src/connect_results_move.rs index dc26558..1d8e7d2 100644 --- a/src/connect_results_move.rs +++ b/src/connect_results_move.rs @@ -1,7 +1,7 @@ use crate::gui_data::GuiData; use crate::help_function::{get_list_store_from_tree_view, ColumnsResults}; use crate::update_records::{update_records, UpdateMode}; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_results_modify_one_up(gui_data: &GuiData) { let button_results_one_up = gui_data.upper_buttons.button_results_one_up.clone(); @@ -30,7 +30,7 @@ pub fn connect_results_modify_one_up(gui_data: &GuiData) { let mut current_path_number = 0; loop { - let path = list_store.path(&temp_iter).unwrap(); + let path = list_store.path(&temp_iter); if selected_rows[current_path_number] == path { selected_results.push(true); current_path_number += 1; @@ -65,21 +65,21 @@ pub fn connect_results_modify_one_up(gui_data: &GuiData) { if selected_results[i] && !selected_results[i - 1] { selected_results.swap(i, i - 1); - let previous_creation = list_store.value(&previous_iter, ColumnsResults::CreationDate as i32).get::().unwrap(); - let previous_modification = list_store.value(&previous_iter, ColumnsResults::ModificationDate as i32).get::().unwrap(); - let previous_size = list_store.value(&previous_iter, ColumnsResults::Size as i32).get::().unwrap(); - let previous_path = list_store.value(&previous_iter, ColumnsResults::Path as i32).get::().unwrap(); - let previous_future_name = list_store.value(&previous_iter, ColumnsResults::FutureName as i32).get::().unwrap(); - let previous_type = list_store.value(&previous_iter, ColumnsResults::Type as i32).get::().unwrap(); - let previous_current_name = list_store.value(&previous_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - - let current_creation = list_store.value(¤t_iter, ColumnsResults::CreationDate as i32).get::().unwrap(); - let current_modification = list_store.value(¤t_iter, ColumnsResults::ModificationDate as i32).get::().unwrap(); - let current_size = list_store.value(¤t_iter, ColumnsResults::Size as i32).get::().unwrap(); - let current_path = list_store.value(¤t_iter, ColumnsResults::Path as i32).get::().unwrap(); - let current_future_name = list_store.value(¤t_iter, ColumnsResults::FutureName as i32).get::().unwrap(); - let current_type = list_store.value(¤t_iter, ColumnsResults::Type as i32).get::().unwrap(); - let current_current_name = list_store.value(¤t_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); + let previous_creation = list_store.get::(&previous_iter, ColumnsResults::CreationDate as i32); + let previous_modification = list_store.get::(&previous_iter, ColumnsResults::ModificationDate as i32); + let previous_size = list_store.get::(&previous_iter, ColumnsResults::Size as i32); + let previous_path = list_store.get::(&previous_iter, ColumnsResults::Path as i32); + let previous_future_name = list_store.get::(&previous_iter, ColumnsResults::FutureName as i32); + let previous_type = list_store.get::(&previous_iter, ColumnsResults::Type as i32); + let previous_current_name = list_store.get::(&previous_iter, ColumnsResults::CurrentName as i32); + + let current_creation = list_store.get::(¤t_iter, ColumnsResults::CreationDate as i32); + let current_modification = list_store.get::(¤t_iter, ColumnsResults::ModificationDate as i32); + let current_size = list_store.get::(¤t_iter, ColumnsResults::Size as i32); + let current_path = list_store.get::(¤t_iter, ColumnsResults::Path as i32); + let current_future_name = list_store.get::(¤t_iter, ColumnsResults::FutureName as i32); + let current_type = list_store.get::(¤t_iter, ColumnsResults::Type as i32); + let current_current_name = list_store.get::(¤t_iter, ColumnsResults::CurrentName as i32); list_store.set_value(&previous_iter, ColumnsResults::CreationDate as u32, ¤t_creation.to_value()); list_store.set_value(&previous_iter, ColumnsResults::ModificationDate as u32, ¤t_modification.to_value()); @@ -142,7 +142,7 @@ pub fn connect_results_modify_one_down(gui_data: &GuiData) { let mut current_path_number = 0; loop { - let path = list_store.path(&temp_iter).unwrap(); + let path = list_store.path(&temp_iter); if selected_rows[current_path_number] == path { selected_results.push(true); current_path_number += 1; @@ -185,21 +185,21 @@ pub fn connect_results_modify_one_down(gui_data: &GuiData) { if selected_results[i] && !selected_results[i + 1] { selected_results.swap(i, i + 1); - let previous_creation = list_store.value(&previous_iter, ColumnsResults::CreationDate as i32).get::().unwrap(); - let previous_modification = list_store.value(&previous_iter, ColumnsResults::ModificationDate as i32).get::().unwrap(); - let previous_size = list_store.value(&previous_iter, ColumnsResults::Size as i32).get::().unwrap(); - let previous_path = list_store.value(&previous_iter, ColumnsResults::Path as i32).get::().unwrap(); - let previous_future_name = list_store.value(&previous_iter, ColumnsResults::FutureName as i32).get::().unwrap(); - let previous_type = list_store.value(&previous_iter, ColumnsResults::Type as i32).get::().unwrap(); - let previous_current_name = list_store.value(&previous_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - - let current_creation = list_store.value(¤t_iter, ColumnsResults::CreationDate as i32).get::().unwrap(); - let current_modification = list_store.value(¤t_iter, ColumnsResults::ModificationDate as i32).get::().unwrap(); - let current_size = list_store.value(¤t_iter, ColumnsResults::Size as i32).get::().unwrap(); - let current_path = list_store.value(¤t_iter, ColumnsResults::Path as i32).get::().unwrap(); - let current_future_name = list_store.value(¤t_iter, ColumnsResults::FutureName as i32).get::().unwrap(); - let current_type = list_store.value(¤t_iter, ColumnsResults::Type as i32).get::().unwrap(); - let current_current_name = list_store.value(¤t_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); + let previous_creation = list_store.get::(&previous_iter, ColumnsResults::CreationDate as i32); + let previous_modification = list_store.get::(&previous_iter, ColumnsResults::ModificationDate as i32); + let previous_size = list_store.get::(&previous_iter, ColumnsResults::Size as i32); + let previous_path = list_store.get::(&previous_iter, ColumnsResults::Path as i32); + let previous_future_name = list_store.get::(&previous_iter, ColumnsResults::FutureName as i32); + let previous_type = list_store.get::(&previous_iter, ColumnsResults::Type as i32); + let previous_current_name = list_store.get::(&previous_iter, ColumnsResults::CurrentName as i32); + + let current_creation = list_store.get::(¤t_iter, ColumnsResults::CreationDate as i32); + let current_modification = list_store.get::(¤t_iter, ColumnsResults::ModificationDate as i32); + let current_size = list_store.get::(¤t_iter, ColumnsResults::Size as i32); + let current_path = list_store.get::(¤t_iter, ColumnsResults::Path as i32); + let current_future_name = list_store.get::(¤t_iter, ColumnsResults::FutureName as i32); + let current_type = list_store.get::(¤t_iter, ColumnsResults::Type as i32); + let current_current_name = list_store.get::(¤t_iter, ColumnsResults::CurrentName as i32); list_store.set_value(&previous_iter, ColumnsResults::CreationDate as u32, ¤t_creation.to_value()); list_store.set_value(&previous_iter, ColumnsResults::ModificationDate as u32, ¤t_modification.to_value()); diff --git a/src/connect_rule_add.rs b/src/connect_rule_add.rs index d8538ca..dde125f 100644 --- a/src/connect_rule_add.rs +++ b/src/connect_rule_add.rs @@ -1,7 +1,7 @@ use crate::gui_data::GuiData; use crate::help_function::{populate_rules_tree_view, read_rule_from_window}; use crate::update_records::{update_records, UpdateMode}; -use gtk::prelude::*; +use gtk4::prelude::*; use std::ops::DerefMut; pub fn connect_rule_add(gui_data: &GuiData) { diff --git a/src/connect_rule_buttons_modify_rules.rs b/src/connect_rule_buttons_modify_rules.rs index e9fe5db..39d222c 100644 --- a/src/connect_rule_buttons_modify_rules.rs +++ b/src/connect_rule_buttons_modify_rules.rs @@ -2,7 +2,7 @@ use crate::gui_data::GuiData; use crate::help_function::{get_list_store_from_tree_view, remove_selected_rows, ColumnsRules}; use crate::rules::{RulePlace, RuleType}; use crate::update_records::{update_records, UpdateMode}; -use gtk::prelude::*; +use gtk4::prelude::*; use std::ops::DerefMut; pub fn connect_rule_modify_add(gui_data: &GuiData) { @@ -71,7 +71,7 @@ pub fn connect_rule_modify_one_up(gui_data: &GuiData) { let (selected_rows, _tree_model) = selection.selected_rows(); let first_iter = list_store.iter_first().unwrap(); - let first_path = list_store.path(&first_iter).unwrap(); + let first_path = list_store.path(&first_iter); if selected_rows.iter().any(|selected_path| *selected_path == first_path) { return; // First thing is selected - this works only in single selection mode @@ -84,7 +84,7 @@ pub fn connect_rule_modify_one_up(gui_data: &GuiData) { let mut current_index = 0; loop { current_index += 1; - let current_path = list_store.path(¤t_iter).unwrap(); + let current_path = list_store.path(¤t_iter); let found = selected_rows.iter().any(|selected_path| *selected_path == current_path); @@ -101,13 +101,13 @@ pub fn connect_rule_modify_one_up(gui_data: &GuiData) { // Swap rules { rules.rules.swap(current_index, current_index - 1); - let previous_type = list_store.value(&previous_iter, ColumnsRules::RuleType as i32).get::().unwrap(); - let previous_usage = list_store.value(&previous_iter, ColumnsRules::UsageType as i32).get::().unwrap(); - let previous_description = list_store.value(&previous_iter, ColumnsRules::Description as i32).get::().unwrap(); + let previous_type = list_store.get::(&previous_iter, ColumnsRules::RuleType as i32); + let previous_usage = list_store.get::(&previous_iter, ColumnsRules::UsageType as i32); + let previous_description = list_store.get::(&previous_iter, ColumnsRules::Description as i32); - let next_type = list_store.value(¤t_iter, ColumnsRules::RuleType as i32).get::().unwrap(); - let next_usage = list_store.value(¤t_iter, ColumnsRules::UsageType as i32).get::().unwrap(); - let next_description = list_store.value(¤t_iter, ColumnsRules::Description as i32).get::().unwrap(); + let next_type = list_store.get::(¤t_iter, ColumnsRules::RuleType as i32); + let next_usage = list_store.get::(¤t_iter, ColumnsRules::UsageType as i32); + let next_description = list_store.get::(¤t_iter, ColumnsRules::Description as i32); list_store.set_value(¤t_iter, ColumnsRules::RuleType as u32, &previous_type.to_value()); list_store.set_value(¤t_iter, ColumnsRules::UsageType as u32, &previous_usage.to_value()); @@ -155,7 +155,7 @@ pub fn connect_rule_modify_one_down(gui_data: &GuiData) { let mut current_index = 0; loop { current_index += 1; - let current_path = list_store.path(&previous_iter).unwrap(); + let current_path = list_store.path(&previous_iter); let found = selected_rows.iter().any(|selected_path| *selected_path == current_path); @@ -177,13 +177,13 @@ pub fn connect_rule_modify_one_down(gui_data: &GuiData) { // Swap rules { rules.rules.swap(current_index, current_index - 1); - let previous_type = list_store.value(&previous_iter, ColumnsRules::RuleType as i32).get::().unwrap(); - let previous_usage = list_store.value(&previous_iter, ColumnsRules::UsageType as i32).get::().unwrap(); - let previous_description = list_store.value(&previous_iter, ColumnsRules::Description as i32).get::().unwrap(); + let previous_type = list_store.get::(&previous_iter, ColumnsRules::RuleType as i32); + let previous_usage = list_store.get::(&previous_iter, ColumnsRules::UsageType as i32); + let previous_description = list_store.get::(&previous_iter, ColumnsRules::Description as i32); - let next_type = list_store.value(¤t_iter, ColumnsRules::RuleType as i32).get::().unwrap(); - let next_usage = list_store.value(¤t_iter, ColumnsRules::UsageType as i32).get::().unwrap(); - let next_description = list_store.value(¤t_iter, ColumnsRules::Description as i32).get::().unwrap(); + let next_type = list_store.get::(¤t_iter, ColumnsRules::RuleType as i32); + let next_usage = list_store.get::(¤t_iter, ColumnsRules::UsageType as i32); + let next_description = list_store.get::(¤t_iter, ColumnsRules::Description as i32); list_store.set_value(¤t_iter, ColumnsRules::RuleType as u32, &previous_type.to_value()); list_store.set_value(¤t_iter, ColumnsRules::UsageType as u32, &previous_usage.to_value()); @@ -212,46 +212,46 @@ pub fn connect_rule_modify_edit(gui_data: &GuiData) { let notebook_choose_rule = gui_data.window_rules.notebook_choose_rule.clone(); let button_rule_window_add = gui_data.window_rules.button_rule_window_add.clone(); - let radio_button_letters_type_uppercase = window_rules.size_letters.radio_button_letters_type_uppercase.clone(); - let radio_button_letters_type_lowercase = window_rules.size_letters.radio_button_letters_type_lowercase.clone(); - let radio_button_letters_usage_name = window_rules.size_letters.radio_button_letters_usage_name.clone(); - let radio_button_letters_usage_extension = window_rules.size_letters.radio_button_letters_usage_extension.clone(); - let radio_button_letters_usage_both = window_rules.size_letters.radio_button_letters_usage_both.clone(); + let check_button_letters_type_uppercase = window_rules.size_letters.check_button_letters_type_uppercase.clone(); + let check_button_letters_type_lowercase = window_rules.size_letters.check_button_letters_type_lowercase.clone(); + let check_button_letters_usage_name = window_rules.size_letters.check_button_letters_usage_name.clone(); + let check_button_letters_usage_extension = window_rules.size_letters.check_button_letters_usage_extension.clone(); + let check_button_letters_usage_both = window_rules.size_letters.check_button_letters_usage_both.clone(); - let radio_button_purge_name = window_rules.purge.radio_button_purge_name.clone(); - let radio_button_purge_extension = window_rules.purge.radio_button_purge_extension.clone(); - let radio_button_purge_both = window_rules.purge.radio_button_purge_both.clone(); + let check_button_purge_name = window_rules.purge.check_button_purge_name.clone(); + let check_button_purge_extension = window_rules.purge.check_button_purge_extension.clone(); + let check_button_purge_both = window_rules.purge.check_button_purge_both.clone(); - let radio_button_add_text_after_name = window_rules.add_text.radio_button_add_text_after_name.clone(); - let radio_button_add_text_before_name = window_rules.add_text.radio_button_add_text_before_name.clone(); + let check_button_add_text_after_name = window_rules.add_text.check_button_add_text_after_name.clone(); + let check_button_add_text_before_name = window_rules.add_text.check_button_add_text_before_name.clone(); let entry_add_text_text_to_add = window_rules.add_text.entry_add_text_text_to_add.clone(); let entry_add_text_text_to_trim = window_rules.trim.entry_add_text_text_to_trim.clone(); - let radio_button_trim_name_start = window_rules.trim.radio_button_trim_name_start.clone(); - let radio_button_trim_name_end = window_rules.trim.radio_button_trim_name_end.clone(); - let radio_button_trim_extension_start = window_rules.trim.radio_button_trim_extension_start.clone(); - let radio_button_trim_extension_end = window_rules.trim.radio_button_trim_extension_end.clone(); - let radio_button_trim_case_insensitive = window_rules.trim.radio_button_trim_case_insensitive.clone(); - let radio_button_trim_case_sensitive = window_rules.trim.radio_button_trim_case_sensitive; + let check_button_trim_name_start = window_rules.trim.check_button_trim_name_start.clone(); + let check_button_trim_name_end = window_rules.trim.check_button_trim_name_end.clone(); + let check_button_trim_extension_start = window_rules.trim.check_button_trim_extension_start.clone(); + let check_button_trim_extension_end = window_rules.trim.check_button_trim_extension_end.clone(); + let check_button_trim_case_insensitive = window_rules.trim.check_button_trim_case_insensitive.clone(); + let check_button_trim_case_sensitive = window_rules.trim.check_button_trim_case_sensitive; let entry_custom_text_to_change = window_rules.custom.entry_custom_text_to_change.clone(); - let radio_button_replace_extension = window_rules.replace.radio_button_replace_extension.clone(); - let radio_button_replace_name = window_rules.replace.radio_button_replace_name.clone(); - let radio_button_replace_both = window_rules.replace.radio_button_replace_both.clone(); - let radio_button_replace_case_insensitive = window_rules.replace.radio_button_replace_case_insensitive.clone(); - let radio_button_replace_case_sensitive = window_rules.replace.radio_button_replace_case_sensitive.clone(); + let check_button_replace_extension = window_rules.replace.check_button_replace_extension.clone(); + let check_button_replace_name = window_rules.replace.check_button_replace_name.clone(); + let check_button_replace_both = window_rules.replace.check_button_replace_both.clone(); + let check_button_replace_case_insensitive = window_rules.replace.check_button_replace_case_insensitive.clone(); + let check_button_replace_case_sensitive = window_rules.replace.check_button_replace_case_sensitive.clone(); let entry_replace_text_to_remove = window_rules.replace.entry_replace_text_to_remove.clone(); let entry_replace_text_to_change = window_rules.replace.entry_replace_text_to_change; - let radio_button_add_number_before_name = window_rules.add_number.radio_button_add_number_before_name.clone(); - let radio_button_add_number_after_name = window_rules.add_number.radio_button_add_number_after_name.clone(); + let check_button_add_number_before_name = window_rules.add_number.check_button_add_number_before_name.clone(); + let check_button_add_number_after_name = window_rules.add_number.check_button_add_number_after_name.clone(); let entry_add_number_start_number = window_rules.add_number.entry_add_number_start_number.clone(); let entry_add_number_step = window_rules.add_number.entry_add_number_step.clone(); let entry_add_number_zeros = window_rules.add_number.entry_add_number_zeros; - let radio_button_normalize_everything = window_rules.normalize.radio_button_normalize_everything.clone(); - let radio_button_normalize_partial = window_rules.normalize.radio_button_normalize_partial; + let check_button_normalize_everything = window_rules.normalize.check_button_normalize_everything.clone(); + let check_button_normalize_partial = window_rules.normalize.check_button_normalize_partial; button_edit_rule.connect_clicked(move |_e| { let mut rules = rules.borrow_mut(); @@ -270,7 +270,7 @@ pub fn connect_rule_modify_edit(gui_data: &GuiData) { let iter = model.iter_first().unwrap(); loop { - if model.path(&iter).unwrap() == selected_item { + if model.path(&iter) == selected_item { break; } @@ -291,52 +291,52 @@ pub fn connect_rule_modify_edit(gui_data: &GuiData) { match rule_type { RuleType::CaseSize => { if rule_data.to_lowercase { - radio_button_letters_type_lowercase.set_active(true); + check_button_letters_type_lowercase.set_active(true); } else { - radio_button_letters_type_uppercase.set_active(true); + check_button_letters_type_uppercase.set_active(true); } if rule_place == RulePlace::Extension { - radio_button_letters_usage_extension.set_active(true); + check_button_letters_usage_extension.set_active(true); } else if rule_place == RulePlace::ExtensionAndName { - radio_button_letters_usage_both.set_active(true); + check_button_letters_usage_both.set_active(true); } else if rule_place == RulePlace::Name { - radio_button_letters_usage_name.set_active(true); + check_button_letters_usage_name.set_active(true); } } RuleType::Purge => { if rule_place == RulePlace::Extension { - radio_button_purge_extension.set_active(true); + check_button_purge_extension.set_active(true); } else if rule_place == RulePlace::ExtensionAndName { - radio_button_purge_both.set_active(true); + check_button_purge_both.set_active(true); } else if rule_place == RulePlace::Name { - radio_button_purge_name.set_active(true); + check_button_purge_name.set_active(true); } } RuleType::AddText => { if rule_place == RulePlace::BeforeName { - radio_button_add_text_before_name.set_active(true); + check_button_add_text_before_name.set_active(true); } else if rule_place == RulePlace::AfterName { - radio_button_add_text_after_name.set_active(true); + check_button_add_text_after_name.set_active(true); } entry_add_text_text_to_add.set_text(rule_data.add_text_text.as_str()); } RuleType::Trim => { if rule_place == RulePlace::FromNameStart { - radio_button_trim_name_start.set_active(true); + check_button_trim_name_start.set_active(true); } else if rule_place == RulePlace::FromNameEndReverse { - radio_button_trim_name_end.set_active(true); + check_button_trim_name_end.set_active(true); } else if rule_place == RulePlace::FromExtensionStart { - radio_button_trim_extension_start.set_active(true); + check_button_trim_extension_start.set_active(true); } else if rule_place == RulePlace::FromExtensionEndReverse { - radio_button_trim_extension_end.set_active(true); + check_button_trim_extension_end.set_active(true); } if rule_data.case_sensitive { - radio_button_trim_case_sensitive.set_active(true); + check_button_trim_case_sensitive.set_active(true); } else { - radio_button_trim_case_insensitive.set_active(true); + check_button_trim_case_insensitive.set_active(true); } entry_add_text_text_to_trim.set_text(rule_data.trim_text.as_str()); @@ -346,17 +346,17 @@ pub fn connect_rule_modify_edit(gui_data: &GuiData) { } RuleType::Replace => { if rule_place == RulePlace::ExtensionAndName { - radio_button_replace_both.set_active(true); + check_button_replace_both.set_active(true); } else if rule_place == RulePlace::Name { - radio_button_replace_name.set_active(true); + check_button_replace_name.set_active(true); } else if rule_place == RulePlace::Extension { - radio_button_replace_extension.set_active(true); + check_button_replace_extension.set_active(true); } if rule_data.case_sensitive { - radio_button_replace_case_sensitive.set_active(true); + check_button_replace_case_sensitive.set_active(true); } else { - radio_button_replace_case_insensitive.set_active(true); + check_button_replace_case_insensitive.set_active(true); } entry_replace_text_to_remove.set_text(rule_data.text_to_remove.as_str()); @@ -364,9 +364,9 @@ pub fn connect_rule_modify_edit(gui_data: &GuiData) { } RuleType::AddNumber => { if rule_place == RulePlace::BeforeName { - radio_button_add_number_before_name.set_active(true); + check_button_add_number_before_name.set_active(true); } else if rule_place == RulePlace::AfterName { - radio_button_add_number_after_name.set_active(true); + check_button_add_number_after_name.set_active(true); } entry_add_number_zeros.set_text(rule_data.fill_with_zeros.to_string().as_str()); @@ -375,9 +375,9 @@ pub fn connect_rule_modify_edit(gui_data: &GuiData) { } RuleType::Normalize => { if rule_data.full_normalize { - radio_button_normalize_everything.set_active(true); + check_button_normalize_everything.set_active(true); } else { - radio_button_normalize_partial.set_active(true); + check_button_normalize_partial.set_active(true); } } } diff --git a/src/connect_rule_window_add_number_click.rs b/src/connect_rule_window_add_number_click.rs index 260ef10..0dc4cbf 100644 --- a/src/connect_rule_window_add_number_click.rs +++ b/src/connect_rule_window_add_number_click.rs @@ -1,39 +1,51 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; use crate::help_function::validate_number; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_rule_window_add_number_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); - let radio_button_add_number_before_name = gui_data.window_rules.add_number.radio_button_add_number_before_name.clone(); - let radio_button_add_number_after_name = gui_data.window_rules.add_number.radio_button_add_number_after_name.clone(); + let check_button_add_number_before_name = gui_data.window_rules.add_number.check_button_add_number_before_name.clone(); + let check_button_add_number_after_name = gui_data.window_rules.add_number.check_button_add_number_after_name.clone(); let entry_add_number_start_number = gui_data.window_rules.add_number.entry_add_number_start_number.clone(); let entry_add_number_step = gui_data.window_rules.add_number.entry_add_number_step.clone(); let entry_add_number_zeros = gui_data.window_rules.add_number.entry_add_number_zeros.clone(); - radio_button_add_number_before_name.connect_clicked(move |_e| { + check_button_add_number_before_name.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_add_number_after_name.connect_clicked(move |_e| { + check_button_add_number_after_name.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); entry_add_number_start_number.connect_changed(move |e| { - e.set_text(validate_number(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_number = validate_number(old_name.clone()); + if validate_number != old_name { + e.set_text(&validate_number); + } update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); entry_add_number_step.connect_changed(move |e| { - e.set_text(validate_number(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_number = validate_number(old_name.clone()); + if validate_number != old_name { + e.set_text(&validate_number); + } update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); entry_add_number_zeros.connect_changed(move |e| { - e.set_text(validate_number(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_number = validate_number(old_name.clone()); + if validate_number != old_name { + e.set_text(&validate_number); + } update_examples(&window_rules, None); }); } diff --git a/src/connect_rule_window_add_text_click.rs b/src/connect_rule_window_add_text_click.rs index ea78a70..b3badeb 100644 --- a/src/connect_rule_window_add_text_click.rs +++ b/src/connect_rule_window_add_text_click.rs @@ -1,26 +1,30 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; use crate::help_function::validate_name; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_rule_window_add_text_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); - let radio_button_add_text_before_name = gui_data.window_rules.add_text.radio_button_add_text_before_name.clone(); - let radio_button_add_text_after_name = gui_data.window_rules.add_text.radio_button_add_text_after_name.clone(); + let check_button_add_text_before_name = gui_data.window_rules.add_text.check_button_add_text_before_name.clone(); + let check_button_add_text_after_name = gui_data.window_rules.add_text.check_button_add_text_after_name.clone(); let entry_add_text_text_to_add = gui_data.window_rules.add_text.entry_add_text_text_to_add.clone(); - radio_button_add_text_before_name.connect_clicked(move |_e| { + check_button_add_text_before_name.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_add_text_after_name.connect_clicked(move |_e| { + check_button_add_text_after_name.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); entry_add_text_text_to_add.connect_changed(move |e| { - e.set_text(validate_name(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_name = validate_name(old_name.clone()); + if validate_name != old_name { + e.set_text(&validate_name); + } update_examples(&window_rules, None); }); } diff --git a/src/connect_rule_window_close.rs b/src/connect_rule_window_close.rs index e0f4603..07024ef 100644 --- a/src/connect_rule_window_close.rs +++ b/src/connect_rule_window_close.rs @@ -1,6 +1,5 @@ use crate::gui_data::GuiData; -use gtk::prelude::WidgetExtManual; -use gtk::prelude::*; +use gtk4::prelude::*; use std::ops::DerefMut; pub fn connect_rule_window_close(gui_data: &GuiData) { @@ -9,8 +8,7 @@ pub fn connect_rule_window_close(gui_data: &GuiData) { let rules = gui_data.rules.clone(); - window_with_rules.hide_on_delete(); - window_with_rules.connect_delete_event(move |e, _y| { + window_with_rules.connect_close_request(move |e| { let mut rules = rules.borrow_mut(); let rules = rules.deref_mut(); @@ -18,6 +16,6 @@ pub fn connect_rule_window_close(gui_data: &GuiData) { window_main.set_sensitive(true); e.hide(); - gtk::Inhibit(true) + gtk4::Inhibit(true) }); } diff --git a/src/connect_rule_window_custom_click.rs b/src/connect_rule_window_custom_click.rs index 238eb8c..c697ae9 100644 --- a/src/connect_rule_window_custom_click.rs +++ b/src/connect_rule_window_custom_click.rs @@ -1,8 +1,7 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; use crate::help_function::validate_name; -use gtk::prelude::*; -use gtk::EditableSignals; +use gtk4::prelude::*; pub fn connect_rule_window_custom_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); @@ -10,7 +9,11 @@ pub fn connect_rule_window_custom_click(gui_data: &GuiData) { let entry_custom_text_to_change = gui_data.window_rules.custom.entry_custom_text_to_change.clone(); entry_custom_text_to_change.connect_changed(move |e| { - e.set_text(validate_name(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validated_name = validate_name(old_name.clone()); + if validated_name != old_name { + e.set_text(&validated_name); + } update_examples(&window_rules, None); }); } diff --git a/src/connect_rule_window_normalize_click.rs b/src/connect_rule_window_normalize_click.rs index 73411b3..e724733 100644 --- a/src/connect_rule_window_normalize_click.rs +++ b/src/connect_rule_window_normalize_click.rs @@ -1,18 +1,18 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_rule_window_normalize_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); - let radio_button_normalize_everything = gui_data.window_rules.normalize.radio_button_normalize_everything.clone(); - let radio_button_normalize_partial = gui_data.window_rules.normalize.radio_button_normalize_partial.clone(); + let check_button_normalize_everything = gui_data.window_rules.normalize.check_button_normalize_everything.clone(); + let check_button_normalize_partial = gui_data.window_rules.normalize.check_button_normalize_partial.clone(); - radio_button_normalize_everything.connect_clicked(move |_e| { + check_button_normalize_everything.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_normalize_partial.connect_clicked(move |_e| { + check_button_normalize_partial.connect_toggled(move |_e| { update_examples(&window_rules, None); }); } diff --git a/src/connect_rule_window_purge_click.rs b/src/connect_rule_window_purge_click.rs index 05472b0..8c518f9 100644 --- a/src/connect_rule_window_purge_click.rs +++ b/src/connect_rule_window_purge_click.rs @@ -1,23 +1,23 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_rule_window_purge_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); - let radio_button_purge_both = gui_data.window_rules.purge.radio_button_purge_both.clone(); - let radio_button_purge_name = gui_data.window_rules.purge.radio_button_purge_name.clone(); - let radio_button_purge_extension = gui_data.window_rules.purge.radio_button_purge_extension.clone(); + let check_button_purge_both = gui_data.window_rules.purge.check_button_purge_both.clone(); + let check_button_purge_name = gui_data.window_rules.purge.check_button_purge_name.clone(); + let check_button_purge_extension = gui_data.window_rules.purge.check_button_purge_extension.clone(); - radio_button_purge_extension.connect_clicked(move |_e| { + check_button_purge_extension.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_purge_name.connect_clicked(move |_e| { + check_button_purge_name.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_purge_both.connect_clicked(move |_e| { + check_button_purge_both.connect_toggled(move |_e| { update_examples(&window_rules, None); }); } diff --git a/src/connect_rule_window_replace_click.rs b/src/connect_rule_window_replace_click.rs index db22241..27580fc 100644 --- a/src/connect_rule_window_replace_click.rs +++ b/src/connect_rule_window_replace_click.rs @@ -1,50 +1,58 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; use crate::help_function::validate_name; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_rule_window_replace_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); - let radio_button_replace_name = gui_data.window_rules.replace.radio_button_replace_name.clone(); - let radio_button_replace_extension = gui_data.window_rules.replace.radio_button_replace_extension.clone(); - let radio_button_replace_both = gui_data.window_rules.replace.radio_button_replace_both.clone(); + let check_button_replace_name = gui_data.window_rules.replace.check_button_replace_name.clone(); + let check_button_replace_extension = gui_data.window_rules.replace.check_button_replace_extension.clone(); + let check_button_replace_both = gui_data.window_rules.replace.check_button_replace_both.clone(); - let radio_button_replace_case_insensitive = gui_data.window_rules.replace.radio_button_replace_case_insensitive.clone(); - let radio_button_replace_case_sensitive = gui_data.window_rules.replace.radio_button_replace_case_sensitive.clone(); + let check_button_replace_case_insensitive = gui_data.window_rules.replace.check_button_replace_case_insensitive.clone(); + let check_button_replace_case_sensitive = gui_data.window_rules.replace.check_button_replace_case_sensitive.clone(); let entry_replace_text_to_change = gui_data.window_rules.replace.entry_replace_text_to_change.clone(); let entry_replace_text_to_remove = gui_data.window_rules.replace.entry_replace_text_to_remove.clone(); - radio_button_replace_name.connect_clicked(move |_e| { + check_button_replace_name.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_replace_extension.connect_clicked(move |_e| { + check_button_replace_extension.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_replace_both.connect_clicked(move |_e| { + check_button_replace_both.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_replace_case_sensitive.connect_clicked(move |_e| { + check_button_replace_case_sensitive.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_replace_case_insensitive.connect_clicked(move |_e| { + check_button_replace_case_insensitive.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); entry_replace_text_to_remove.connect_changed(move |e| { - e.set_text(validate_name(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_name = validate_name(old_name.clone()); + if validate_name != old_name { + e.set_text(&validate_name); + } update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); entry_replace_text_to_change.connect_changed(move |e| { - e.set_text(validate_name(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_name = validate_name(old_name.clone()); + if validate_name != old_name { + e.set_text(&validate_name); + } update_examples(&window_rules, None); }); } diff --git a/src/connect_rule_window_size_letters_click.rs b/src/connect_rule_window_size_letters_click.rs index 479a31e..2d84b00 100644 --- a/src/connect_rule_window_size_letters_click.rs +++ b/src/connect_rule_window_size_letters_click.rs @@ -1,32 +1,32 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_rule_window_size_letters_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); - let radio_button_letters_usage_both = gui_data.window_rules.size_letters.radio_button_letters_usage_both.clone(); - let radio_button_letters_usage_name = gui_data.window_rules.size_letters.radio_button_letters_usage_name.clone(); - let radio_button_letters_usage_extension = gui_data.window_rules.size_letters.radio_button_letters_usage_extension.clone(); - let radio_button_letters_type_lowercase = gui_data.window_rules.size_letters.radio_button_letters_type_lowercase.clone(); - let radio_button_letters_type_uppercase = gui_data.window_rules.size_letters.radio_button_letters_type_uppercase.clone(); + let check_button_letters_usage_both = gui_data.window_rules.size_letters.check_button_letters_usage_both.clone(); + let check_button_letters_usage_name = gui_data.window_rules.size_letters.check_button_letters_usage_name.clone(); + let check_button_letters_usage_extension = gui_data.window_rules.size_letters.check_button_letters_usage_extension.clone(); + let check_button_letters_type_lowercase = gui_data.window_rules.size_letters.check_button_letters_type_lowercase.clone(); + let check_button_letters_type_uppercase = gui_data.window_rules.size_letters.check_button_letters_type_uppercase.clone(); - radio_button_letters_type_lowercase.connect_clicked(move |_e| { + check_button_letters_type_lowercase.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_letters_type_uppercase.connect_clicked(move |_e| { + check_button_letters_type_uppercase.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_letters_usage_extension.connect_clicked(move |_e| { + check_button_letters_usage_extension.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_letters_usage_name.connect_clicked(move |_e| { + check_button_letters_usage_name.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_letters_usage_both.connect_clicked(move |_e| { + check_button_letters_usage_both.connect_toggled(move |_e| { update_examples(&window_rules, None); }); } diff --git a/src/connect_rule_window_trim_click.rs b/src/connect_rule_window_trim_click.rs index 7a24435..0678878 100644 --- a/src/connect_rule_window_trim_click.rs +++ b/src/connect_rule_window_trim_click.rs @@ -1,47 +1,50 @@ use crate::example_fields::update_examples; use crate::gui_data::GuiData; use crate::help_function::validate_name; -use gtk::prelude::*; -use gtk::EditableSignals; +use gtk4::prelude::*; pub fn connect_rule_window_trim_click(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); - let radio_button_trim_name_start = gui_data.window_rules.trim.radio_button_trim_name_start.clone(); - let radio_button_trim_name_end = gui_data.window_rules.trim.radio_button_trim_name_end.clone(); - let radio_button_trim_extension_start = gui_data.window_rules.trim.radio_button_trim_extension_start.clone(); - let radio_button_trim_extension_end = gui_data.window_rules.trim.radio_button_trim_extension_end.clone(); - let radio_button_trim_case_insensitive = gui_data.window_rules.trim.radio_button_trim_case_insensitive.clone(); - let radio_button_trim_case_sensitive = gui_data.window_rules.trim.radio_button_trim_case_sensitive.clone(); + let check_button_trim_name_start = gui_data.window_rules.trim.check_button_trim_name_start.clone(); + let check_button_trim_name_end = gui_data.window_rules.trim.check_button_trim_name_end.clone(); + let check_button_trim_extension_start = gui_data.window_rules.trim.check_button_trim_extension_start.clone(); + let check_button_trim_extension_end = gui_data.window_rules.trim.check_button_trim_extension_end.clone(); + let check_button_trim_case_insensitive = gui_data.window_rules.trim.check_button_trim_case_insensitive.clone(); + let check_button_trim_case_sensitive = gui_data.window_rules.trim.check_button_trim_case_sensitive.clone(); let entry_add_text_text_to_trim = gui_data.window_rules.trim.entry_add_text_text_to_trim.clone(); - radio_button_trim_name_start.connect_clicked(move |_e| { + check_button_trim_name_start.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_trim_name_end.connect_clicked(move |_e| { + check_button_trim_name_end.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_trim_extension_start.connect_clicked(move |_e| { + check_button_trim_extension_start.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_trim_extension_end.connect_clicked(move |_e| { + check_button_trim_extension_end.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_trim_case_insensitive.connect_clicked(move |_e| { + check_button_trim_case_insensitive.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); - radio_button_trim_case_sensitive.connect_clicked(move |_e| { + check_button_trim_case_sensitive.connect_toggled(move |_e| { update_examples(&window_rules, None); }); let window_rules = gui_data.window_rules.clone(); entry_add_text_text_to_trim.connect_changed(move |e| { - e.set_text(validate_name(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_name = validate_name(old_name.clone()); + if validate_name != old_name { + e.set_text(&validate_name); + } update_examples(&window_rules, None); }); } diff --git a/src/connect_select_records.rs b/src/connect_select_records.rs index 58057eb..e47b256 100644 --- a/src/connect_select_records.rs +++ b/src/connect_select_records.rs @@ -1,17 +1,13 @@ use crate::gui_data::GuiData; -use crate::help_function::{get_list_store_from_tree_view, regex_check, ColumnsResults}; -use gtk::prelude::*; -use gtk::{PositionType, TreeIter}; +use crate::help_function::{get_all_boxes_from_widget, get_list_store_from_tree_view, regex_check, ColumnsResults}; +use gtk4::prelude::*; +use gtk4::TreeIter; pub fn connect_select_records(gui_data: &GuiData) { let popover_select = gui_data.popover_select.popover_select.clone(); - let button_select = gui_data.upper_buttons.button_select_popup.clone(); - button_select.connect_clicked(move |bs| { - popover_select.set_position(PositionType::Left); - popover_select.set_relative_to(Some(bs)); - popover_select.popup(); - }); + let button_select = gui_data.upper_buttons.menu_button_select_popup.clone(); + button_select.set_popover(Some(&popover_select)); } pub fn connect_select_all(gui_data: &GuiData) { let popover_select = gui_data.popover_select.popover_select.clone(); @@ -50,7 +46,7 @@ pub fn connect_select_reverse(gui_data: &GuiData) { selection.select_iter(&tree_iter_all); } else { tree_iter_selected = tree_model.iter(vector_tree_path.get(current_path_index).unwrap()).unwrap(); - if tree_model.path(&tree_iter_all).unwrap() == tree_model.path(&tree_iter_selected).unwrap() { + if tree_model.path(&tree_iter_all) == tree_model.path(&tree_iter_selected) { selection.unselect_iter(&tree_iter_selected); current_path_index += 1; } else { @@ -78,8 +74,8 @@ pub fn connect_select_changed(gui_data: &GuiData) { if let Some(iter) = model.iter_first() { loop { - let old_name = model.value(&iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - let new_name = model.value(&iter, ColumnsResults::FutureName as i32).get::().unwrap(); + let old_name = model.get::(&iter, ColumnsResults::CurrentName as i32); + let new_name = model.get::(&iter, ColumnsResults::FutureName as i32); if new_name != old_name { selection.select_iter(&iter); @@ -105,8 +101,8 @@ pub fn connect_unselect_changed(gui_data: &GuiData) { if let Some(iter) = model.iter_first() { loop { - let old_name = model.value(&iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - let new_name = model.value(&iter, ColumnsResults::FutureName as i32).get::().unwrap(); + let old_name = model.get::(&iter, ColumnsResults::CurrentName as i32); + let new_name = model.get::(&iter, ColumnsResults::FutureName as i32); if new_name != old_name { selection.unselect_iter(&iter); @@ -131,7 +127,6 @@ pub fn connect_select_custom(gui_data: &GuiData) { button_select_custom.connect_clicked(move |_e| { popover_select.popdown(); - let wildcard: String; enum WildcardType { Path, CurrentName, @@ -140,36 +135,35 @@ pub fn connect_select_custom(gui_data: &GuiData) { PathFutureName, IsDir, } - let wildcard_type: WildcardType; // Accept Dialog { let window_main = gui_data.window_main.clone(); - let confirmation_dialog_delete = gtk::Dialog::with_buttons(Some("Select custom"), Some(&window_main), gtk::DialogFlags::MODAL, &[("Ok", gtk::ResponseType::Ok), ("Close", gtk::ResponseType::Cancel)]); - let label: gtk::Label = gtk::Label::new(Some("Usage: */folder-nr*/* or name-version-*.txt")); + let confirmation_dialog_delete = gtk4::Dialog::with_buttons(Some("Select custom"), Some(&window_main), gtk4::DialogFlags::MODAL, &[("Ok", gtk4::ResponseType::Ok), ("Close", gtk4::ResponseType::Cancel)]); + let label: gtk4::Label = gtk4::Label::new(Some("Usage: */folder-nr*/* or name-version-*.txt")); - let radio_path = gtk::RadioButton::with_label("Path"); - let radio_current_name = gtk::RadioButton::with_label_from_widget(&radio_path, "Current Name"); - let radio_future_name = gtk::RadioButton::with_label_from_widget(&radio_path, "Future Name"); - let radio_current_name_path = gtk::RadioButton::with_label_from_widget(&radio_path, "Path + Current Name"); - let radio_future_name_path = gtk::RadioButton::with_label_from_widget(&radio_path, "Path + Future Name"); - let radio_is_dir = gtk::RadioButton::with_label_from_widget(&radio_path, "Directory/File"); + let radio_path = gtk4::CheckButton::with_label("Path"); + let radio_current_name = gtk4::CheckButton::with_label("Current Name"); + let radio_future_name = gtk4::CheckButton::with_label("Future Name"); + let radio_current_name_path = gtk4::CheckButton::with_label("Path + Current Name"); + let radio_future_name_path = gtk4::CheckButton::with_label("Path + Future Name"); + let radio_is_dir = gtk4::CheckButton::with_label("Directory/File"); - let entry_path = gtk::Entry::new(); - let entry_current_name = gtk::Entry::new(); - let entry_future_name = gtk::Entry::new(); - let entry_current_name_path = gtk::Entry::new(); - let entry_future_name_path = gtk::Entry::new(); - let check_button_is_dir = gtk::CheckButton::new(); + let entry_path = gtk4::Entry::new(); + let entry_current_name = gtk4::Entry::new(); + let entry_future_name = gtk4::Entry::new(); + let entry_current_name_path = gtk4::Entry::new(); + let entry_future_name_path = gtk4::Entry::new(); + let check_button_is_dir = gtk4::CheckButton::new(); - check_button_is_dir.set_label("Select Directory"); + check_button_is_dir.set_label(Some("Select Directory")); label.set_margin_bottom(5); label.set_margin_end(5); label.set_margin_start(5); // TODO Label should have const width, and rest should fill entry, but for now is 50%-50% - let grid = gtk::Grid::new(); + let grid = gtk4::Grid::new(); grid.set_row_homogeneous(true); grid.set_column_homogeneous(true); @@ -189,108 +183,106 @@ pub fn connect_select_custom(gui_data: &GuiData) { grid.attach(&entry_future_name_path, 1, 5, 1, 1); grid.attach(&check_button_is_dir, 1, 6, 1, 1); - for widgets in confirmation_dialog_delete.children() { - // By default GtkBox is child of dialog, so we can easily add other things to it - widgets.downcast::().unwrap().add(&grid); - } - - confirmation_dialog_delete.show_all(); - - let response_type = confirmation_dialog_delete.run(); - if response_type == gtk::ResponseType::Ok { - if radio_path.is_active() { - wildcard_type = WildcardType::Path; - wildcard = entry_path.text().to_string(); - } else if radio_current_name.is_active() { - wildcard_type = WildcardType::CurrentName; - wildcard = entry_current_name.text().to_string(); - } else if radio_future_name.is_active() { - wildcard_type = WildcardType::FutureName; - wildcard = entry_future_name.text().to_string(); - } else if radio_current_name_path.is_active() { - wildcard_type = WildcardType::PathCurrentName; - wildcard = entry_current_name_path.text().to_string(); - } else if radio_future_name_path.is_active() { - wildcard_type = WildcardType::PathFutureName; - wildcard = entry_future_name_path.text().to_string(); - } else if radio_is_dir.is_active() { - wildcard_type = WildcardType::IsDir; - wildcard = match check_button_is_dir.is_active() { - true => "Dir".to_string(), - false => "File".to_string(), - }; - } else { - panic!("Non handled option in select wildcard"); - } - } else { - confirmation_dialog_delete.close(); - return; - } - confirmation_dialog_delete.close(); - } - if !wildcard.is_empty() { - let wildcard = wildcard.trim(); - - #[cfg(target_family = "windows")] - let wildcard = wildcard.replace("/", "\\"); - #[cfg(target_family = "windows")] - let wildcard = wildcard.as_str(); - - let selection = tree_view.selection(); - let tree_model = tree_view.model().unwrap(); - - let tree_iter = tree_model.iter_first().unwrap(); // Never should be available button where there is no available records - - loop { - let typ = tree_model.value(&tree_iter, ColumnsResults::Type as i32).get::().unwrap(); - let path = tree_model.value(&tree_iter, ColumnsResults::Path as i32).get::().unwrap(); - let current_name = tree_model.value(&tree_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - let future_name = tree_model.value(&tree_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - match wildcard_type { - WildcardType::Path => { - if regex_check(wildcard, path) { - selection.select_iter(&tree_iter); - } - } - WildcardType::CurrentName => { - if regex_check(wildcard, current_name) { - selection.select_iter(&tree_iter); - } - } - WildcardType::FutureName => { - if regex_check(wildcard, future_name) { - selection.select_iter(&tree_iter); - } - } - WildcardType::PathCurrentName => { - if regex_check(wildcard, format!("{}/{}", path, current_name)) { - selection.select_iter(&tree_iter); - } - } - WildcardType::PathFutureName => { - if regex_check(wildcard, format!("{}/{}", path, future_name)) { - selection.select_iter(&tree_iter); - } + get_all_boxes_from_widget(&confirmation_dialog_delete)[0].clone().append(&grid); + + confirmation_dialog_delete.show(); + + let tree_view = tree_view.clone(); + confirmation_dialog_delete.connect_response(move |_chooser, response_type| { + let wildcard_type: WildcardType; + let wildcard: String; + if response_type == gtk4::ResponseType::Ok { + if radio_path.is_active() { + wildcard_type = WildcardType::Path; + wildcard = entry_path.text().to_string(); + } else if radio_current_name.is_active() { + wildcard_type = WildcardType::CurrentName; + wildcard = entry_current_name.text().to_string(); + } else if radio_future_name.is_active() { + wildcard_type = WildcardType::FutureName; + wildcard = entry_future_name.text().to_string(); + } else if radio_current_name_path.is_active() { + wildcard_type = WildcardType::PathCurrentName; + wildcard = entry_current_name_path.text().to_string(); + } else if radio_future_name_path.is_active() { + wildcard_type = WildcardType::PathFutureName; + wildcard = entry_future_name_path.text().to_string(); + } else if radio_is_dir.is_active() { + wildcard_type = WildcardType::IsDir; + wildcard = match check_button_is_dir.is_active() { + true => "Dir".to_string(), + false => "File".to_string(), + }; + } else { + panic!("Non handled option in select wildcard"); } - WildcardType::IsDir => { - if wildcard == "Dir" { - if typ == "Dir" { - selection.select_iter(&tree_iter); + + if !wildcard.is_empty() { + let wildcard = wildcard.trim(); + + #[cfg(target_family = "windows")] + let wildcard = wildcard.replace("/", "\\"); + #[cfg(target_family = "windows")] + let wildcard = wildcard.as_str(); + + let selection = tree_view.selection(); + let tree_model = tree_view.model().unwrap(); + + let tree_iter = tree_model.iter_first().unwrap(); // Never should be available button where there is no available records + + loop { + let typ = tree_model.get::(&tree_iter, ColumnsResults::Type as i32); + let path = tree_model.get::(&tree_iter, ColumnsResults::Path as i32); + let current_name = tree_model.get::(&tree_iter, ColumnsResults::CurrentName as i32); + let future_name = tree_model.get::(&tree_iter, ColumnsResults::CurrentName as i32); + match wildcard_type { + WildcardType::Path => { + if regex_check(wildcard, path) { + selection.select_iter(&tree_iter); + } + } + WildcardType::CurrentName => { + if regex_check(wildcard, current_name) { + selection.select_iter(&tree_iter); + } + } + WildcardType::FutureName => { + if regex_check(wildcard, future_name) { + selection.select_iter(&tree_iter); + } + } + WildcardType::PathCurrentName => { + if regex_check(wildcard, format!("{}/{}", path, current_name)) { + selection.select_iter(&tree_iter); + } + } + WildcardType::PathFutureName => { + if regex_check(wildcard, format!("{}/{}", path, future_name)) { + selection.select_iter(&tree_iter); + } + } + WildcardType::IsDir => { + if wildcard == "Dir" { + if typ == "Dir" { + selection.select_iter(&tree_iter); + } + } else if wildcard == "File" { + if typ == "File" { + selection.select_iter(&tree_iter); + } + } else { + panic!(); + } + } } - } else if wildcard == "File" { - if typ == "File" { - selection.select_iter(&tree_iter); + + if !tree_model.iter_next(&tree_iter) { + break; } - } else { - panic!(); } } } - - if !tree_model.iter_next(&tree_iter) { - break; - } - } + }); } }); } @@ -305,7 +297,6 @@ pub fn connect_unselect_custom(gui_data: &GuiData) { button_unselect_custom.connect_clicked(move |_e| { popover_select.popdown(); - let wildcard: String; enum WildcardType { Path, CurrentName, @@ -314,36 +305,35 @@ pub fn connect_unselect_custom(gui_data: &GuiData) { PathFutureName, IsDir, } - let wildcard_type: WildcardType; // Accept Dialog { let window_main = gui_data.window_main.clone(); - let confirmation_dialog_delete = gtk::Dialog::with_buttons(Some("Unselect custom"), Some(&window_main), gtk::DialogFlags::MODAL, &[("Ok", gtk::ResponseType::Ok), ("Close", gtk::ResponseType::Cancel)]); - let label: gtk::Label = gtk::Label::new(Some("Usage: */folder-nr*/* or name-version-*.txt")); + let confirmation_dialog_delete = gtk4::Dialog::with_buttons(Some("Unselect custom"), Some(&window_main), gtk4::DialogFlags::MODAL, &[("Ok", gtk4::ResponseType::Ok), ("Close", gtk4::ResponseType::Cancel)]); + let label: gtk4::Label = gtk4::Label::new(Some("Usage: */folder-nr*/* or name-version-*.txt")); - let radio_path = gtk::RadioButton::with_label("Path"); - let radio_current_name = gtk::RadioButton::with_label_from_widget(&radio_path, "Current Name"); - let radio_future_name = gtk::RadioButton::with_label_from_widget(&radio_path, "Future Name"); - let radio_current_name_path = gtk::RadioButton::with_label_from_widget(&radio_path, "Path + Current Name"); - let radio_future_name_path = gtk::RadioButton::with_label_from_widget(&radio_path, "Path + Future Name"); - let radio_is_dir = gtk::RadioButton::with_label_from_widget(&radio_path, "Directory/File"); + let radio_path = gtk4::CheckButton::with_label("Path"); + let radio_current_name = gtk4::CheckButton::with_label("Current Name"); + let radio_future_name = gtk4::CheckButton::with_label("Future Name"); + let radio_current_name_path = gtk4::CheckButton::with_label("Path + Current Name"); + let radio_future_name_path = gtk4::CheckButton::with_label("Path + Future Name"); + let radio_is_dir = gtk4::CheckButton::with_label("Directory/File"); - let entry_path = gtk::Entry::new(); - let entry_current_name = gtk::Entry::new(); - let entry_future_name = gtk::Entry::new(); - let entry_current_name_path = gtk::Entry::new(); - let entry_future_name_path = gtk::Entry::new(); - let check_button_is_dir = gtk::CheckButton::new(); + let entry_path = gtk4::Entry::new(); + let entry_current_name = gtk4::Entry::new(); + let entry_future_name = gtk4::Entry::new(); + let entry_current_name_path = gtk4::Entry::new(); + let entry_future_name_path = gtk4::Entry::new(); + let check_button_is_dir = gtk4::CheckButton::new(); - check_button_is_dir.set_label("Unselect Directory"); + check_button_is_dir.set_label(Some("Unselect Directory")); label.set_margin_bottom(5); label.set_margin_end(5); label.set_margin_start(5); // TODO Label should have const width, and rest should fill entry, but for now is 50%-50% - let grid = gtk::Grid::new(); + let grid = gtk4::Grid::new(); grid.set_row_homogeneous(true); grid.set_column_homogeneous(true); @@ -363,108 +353,107 @@ pub fn connect_unselect_custom(gui_data: &GuiData) { grid.attach(&entry_future_name_path, 1, 5, 1, 1); grid.attach(&check_button_is_dir, 1, 6, 1, 1); - for widgets in confirmation_dialog_delete.children() { - // By default GtkBox is child of dialog, so we can easily add other things to it - widgets.downcast::().unwrap().add(&grid); - } - - confirmation_dialog_delete.show_all(); - - let response_type = confirmation_dialog_delete.run(); - if response_type == gtk::ResponseType::Ok { - if radio_path.is_active() { - wildcard_type = WildcardType::Path; - wildcard = entry_path.text().to_string(); - } else if radio_current_name.is_active() { - wildcard_type = WildcardType::CurrentName; - wildcard = entry_current_name.text().to_string(); - } else if radio_future_name.is_active() { - wildcard_type = WildcardType::FutureName; - wildcard = entry_future_name.text().to_string(); - } else if radio_current_name_path.is_active() { - wildcard_type = WildcardType::PathCurrentName; - wildcard = entry_current_name_path.text().to_string(); - } else if radio_future_name_path.is_active() { - wildcard_type = WildcardType::PathFutureName; - wildcard = entry_future_name_path.text().to_string(); - } else if radio_is_dir.is_active() { - wildcard_type = WildcardType::IsDir; - wildcard = match check_button_is_dir.is_active() { - true => "Dir".to_string(), - false => "File".to_string(), - }; - } else { - panic!("Non handled option in select wildcard"); - } - } else { - confirmation_dialog_delete.close(); - return; - } - confirmation_dialog_delete.close(); - } - if !wildcard.is_empty() { - let wildcard = wildcard.trim(); - - #[cfg(target_family = "windows")] - let wildcard = wildcard.replace("/", "\\"); - #[cfg(target_family = "windows")] - let wildcard = wildcard.as_str(); - - let selection = tree_view.selection(); - let tree_model = tree_view.model().unwrap(); - - let tree_iter = tree_model.iter_first().unwrap(); // Never should be available button where there is no available records - - loop { - let typ = tree_model.value(&tree_iter, ColumnsResults::Type as i32).get::().unwrap(); - let path = tree_model.value(&tree_iter, ColumnsResults::Path as i32).get::().unwrap(); - let current_name = tree_model.value(&tree_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - let future_name = tree_model.value(&tree_iter, ColumnsResults::CurrentName as i32).get::().unwrap(); - match wildcard_type { - WildcardType::Path => { - if regex_check(wildcard, path) { - selection.unselect_iter(&tree_iter); - } - } - WildcardType::CurrentName => { - if regex_check(wildcard, current_name) { - selection.unselect_iter(&tree_iter); - } - } - WildcardType::FutureName => { - if regex_check(wildcard, future_name) { - selection.unselect_iter(&tree_iter); - } - } - WildcardType::PathCurrentName => { - if regex_check(wildcard, format!("{}/{}", path, current_name)) { - selection.unselect_iter(&tree_iter); - } - } - WildcardType::PathFutureName => { - if regex_check(wildcard, format!("{}/{}", path, future_name)) { - selection.unselect_iter(&tree_iter); - } + get_all_boxes_from_widget(&confirmation_dialog_delete)[0].clone().append(&grid); + + confirmation_dialog_delete.show(); + + let tree_view = tree_view.clone(); + confirmation_dialog_delete.connect_response(move |_, response| { + if response == gtk4::ResponseType::Ok { + let wildcard: String; + let wildcard_type: WildcardType; + + if radio_path.is_active() { + wildcard_type = WildcardType::Path; + wildcard = entry_path.text().to_string(); + } else if radio_current_name.is_active() { + wildcard_type = WildcardType::CurrentName; + wildcard = entry_current_name.text().to_string(); + } else if radio_future_name.is_active() { + wildcard_type = WildcardType::FutureName; + wildcard = entry_future_name.text().to_string(); + } else if radio_current_name_path.is_active() { + wildcard_type = WildcardType::PathCurrentName; + wildcard = entry_current_name_path.text().to_string(); + } else if radio_future_name_path.is_active() { + wildcard_type = WildcardType::PathFutureName; + wildcard = entry_future_name_path.text().to_string(); + } else if radio_is_dir.is_active() { + wildcard_type = WildcardType::IsDir; + wildcard = match check_button_is_dir.is_active() { + true => "Dir".to_string(), + false => "File".to_string(), + }; + } else { + panic!("Non handled option in select wildcard"); } - WildcardType::IsDir => { - if wildcard == "Dir" { - if typ == "Dir" { - selection.unselect_iter(&tree_iter); + + if !wildcard.is_empty() { + let wildcard = wildcard.trim(); + + #[cfg(target_family = "windows")] + let wildcard = wildcard.replace("/", "\\"); + #[cfg(target_family = "windows")] + let wildcard = wildcard.as_str(); + + let selection = tree_view.selection(); + let tree_model = tree_view.model().unwrap(); + + let tree_iter = tree_model.iter_first().unwrap(); // Never should be available button where there is no available records + + loop { + let typ = tree_model.get::(&tree_iter, ColumnsResults::Type as i32); + let path = tree_model.get::(&tree_iter, ColumnsResults::Path as i32); + let current_name = tree_model.get::(&tree_iter, ColumnsResults::CurrentName as i32); + let future_name = tree_model.get::(&tree_iter, ColumnsResults::CurrentName as i32); + match wildcard_type { + WildcardType::Path => { + if regex_check(wildcard, path) { + selection.unselect_iter(&tree_iter); + } + } + WildcardType::CurrentName => { + if regex_check(wildcard, current_name) { + selection.unselect_iter(&tree_iter); + } + } + WildcardType::FutureName => { + if regex_check(wildcard, future_name) { + selection.unselect_iter(&tree_iter); + } + } + WildcardType::PathCurrentName => { + if regex_check(wildcard, format!("{}/{}", path, current_name)) { + selection.unselect_iter(&tree_iter); + } + } + WildcardType::PathFutureName => { + if regex_check(wildcard, format!("{}/{}", path, future_name)) { + selection.unselect_iter(&tree_iter); + } + } + WildcardType::IsDir => { + if wildcard == "Dir" { + if typ == "Dir" { + selection.unselect_iter(&tree_iter); + } + } else if wildcard == "File" { + if typ == "File" { + selection.unselect_iter(&tree_iter); + } + } else { + panic!(); + } + } } - } else if wildcard == "File" { - if typ == "File" { - selection.unselect_iter(&tree_iter); + + if !tree_model.iter_next(&tree_iter) { + break; } - } else { - panic!(); } } } - - if !tree_model.iter_next(&tree_iter) { - break; - } - } + }); } }); } diff --git a/src/connect_start_renaming.rs b/src/connect_start_renaming.rs index 4a430d9..8ee9c70 100644 --- a/src/connect_start_renaming.rs +++ b/src/connect_start_renaming.rs @@ -1,7 +1,7 @@ use crate::gui_data::GuiData; -use crate::help_function::{count_rows_in_tree_view, create_message_window, get_list_store_from_tree_view, ColumnsResults, CHARACTER}; -use gtk::prelude::*; -use gtk::{DialogFlags, ResponseType, ScrolledWindow, TextView}; +use crate::help_function::{count_rows_in_tree_view, create_message_window, get_all_boxes_from_widget, get_list_store_from_tree_view, ColumnsResults, CHARACTER}; +use gtk4::prelude::*; +use gtk4::{DialogFlags, ScrolledWindow, TextView}; use std::collections::BTreeMap; use std::fs; use std::ops::DerefMut; @@ -19,9 +19,6 @@ pub fn connect_start_renaming(gui_data: &GuiData) { let list_store = get_list_store_from_tree_view(&tree_view_results); button_start_rename.connect_clicked(move |_e| { - let mut shared_result_entries = shared_result_entries.borrow_mut(); - let shared_result_entries = shared_result_entries.deref_mut(); - let number_of_renamed_files = count_rows_in_tree_view(&tree_view_results); if number_of_renamed_files == 0 { create_message_window(&window_main, "Missing Files", "You need to use at least 1 file"); @@ -34,85 +31,79 @@ pub fn connect_start_renaming(gui_data: &GuiData) { } if !rules.updated { - let chooser_update = gtk::Dialog::with_buttons(Some("Outdated results"), Some(&window_main), DialogFlags::DESTROY_WITH_PARENT, &[("Ok", gtk::ResponseType::Ok), ("Close", gtk::ResponseType::Cancel)]); - - let question_label = gtk::Label::new(Some( + let chooser_update = gtk4::Dialog::with_buttons( + Some("Outdated results"), + Some(&window_main), + DialogFlags::DESTROY_WITH_PARENT, + &[("Ok", gtk4::ResponseType::Ok), ("Close", gtk4::ResponseType::Cancel)], + ); + + let question_label = gtk4::Label::new(Some( "Some records are not updated, you can do it by clicking at the Update Names button.\nAre you sure that you want to proceed without updating names?", )); - let chooser_box = chooser_update.children()[0].clone().downcast::().unwrap(); - chooser_box.add(&question_label); - chooser_box.show_all(); + let chooser_box = get_all_boxes_from_widget(&chooser_update)[0].clone(); + chooser_box.append(&question_label); + chooser_box.show(); - let response_type = chooser_update.run(); - if response_type != ResponseType::Ok { - chooser_update.close(); - chooser_update.hide(); - return; - } - chooser_update.close(); - chooser_update.hide(); + chooser_update.connect_response(move |dialog, _| { + dialog.close(); + dialog.hide(); + }); } - let chooser = gtk::Dialog::with_buttons(Some("Confirm renaming"), Some(&window_main), DialogFlags::DESTROY_WITH_PARENT, &[("Ok", gtk::ResponseType::Ok), ("Close", gtk::ResponseType::Cancel)]); - - let question_label = gtk::Label::new(Some(format!("Are you sure that you want to rename {} files", number_of_renamed_files).as_str())); - - let chooser_box = chooser.children()[0].clone().downcast::().unwrap(); - chooser_box.add(&question_label); - chooser_box.show_all(); - - // Before renaming, After possible renaming, Cause - let mut failed_renames: Vec<(String, String, String)> = Vec::new(); - let mut properly_renamed = 0; - let mut ignored = 0; - - let response_type = chooser.run(); - if response_type == gtk::ResponseType::Ok { - let tree_iter = list_store.iter_first().unwrap(); - let mut file_renames: Vec<(String, String)> = Vec::new(); - let mut folder_renames: BTreeMap> = Default::default(); - - loop { - let path = list_store.value(&tree_iter, ColumnsResults::Path as i32).get::().unwrap(); - let old_name = format!("{}{}{}", path, CHARACTER, list_store.value(&tree_iter, ColumnsResults::CurrentName as i32).get::().unwrap()); - let new_name = format!("{}{}{}", path, CHARACTER, list_store.value(&tree_iter, ColumnsResults::FutureName as i32).get::().unwrap()); - let typ = list_store.value(&tree_iter, ColumnsResults::Type as i32).get::().unwrap(); - - if typ == "Dir" { - let how_much = old_name.matches(CHARACTER).count(); - folder_renames.entry(how_much).or_insert_with(Vec::new); - folder_renames.get_mut(&how_much).unwrap().push((old_name, new_name)); - } else if typ == "File" { - file_renames.push((old_name, new_name)); - } else { - panic!(); - } - - if !list_store.iter_next(&tree_iter) { - break; - } - } - - for (old_name, new_name) in file_renames { - // TODO Find method to not overwrite new function - #[allow(clippy::collapsible_else_if)] - if new_name == old_name { - ignored += 1 - } else if Path::new(&new_name).exists() { - failed_renames.push((old_name, new_name, "Destination file already exists.".to_string())); - } else { - if let Err(e) = fs::rename(&old_name, &new_name) { - failed_renames.push((old_name, new_name, e.to_string())); + let chooser = gtk4::Dialog::with_buttons( + Some("Confirm renaming"), + Some(&window_main), + DialogFlags::DESTROY_WITH_PARENT, + &[("Ok", gtk4::ResponseType::Ok), ("Close", gtk4::ResponseType::Cancel)], + ); + + let question_label = gtk4::Label::new(Some(format!("Are you sure that you want to rename {} files", number_of_renamed_files).as_str())); + + let chooser_box = get_all_boxes_from_widget(&chooser)[0].clone(); + chooser_box.append(&question_label); + chooser_box.show(); + + let shared_result_entries = shared_result_entries.clone(); + let list_store = list_store.clone(); + let window_main = window_main.clone(); + + chooser.connect_response(move |_chooser, response_type| { + let mut shared_result_entries = shared_result_entries.borrow_mut(); + let shared_result_entries = shared_result_entries.deref_mut(); + // Before renaming, After possible renaming, Cause + let mut failed_renames: Vec<(String, String, String)> = Vec::new(); + let mut properly_renamed = 0; + let mut ignored = 0; + + if response_type == gtk4::ResponseType::Ok { + let tree_iter = list_store.iter_first().unwrap(); + let mut file_renames: Vec<(String, String)> = Vec::new(); + let mut folder_renames: BTreeMap> = Default::default(); + + loop { + let path = list_store.get::(&tree_iter, ColumnsResults::Path as i32); + let old_name = format!("{}{}{}", path, CHARACTER, list_store.get::(&tree_iter, ColumnsResults::CurrentName as i32)); + let new_name = format!("{}{}{}", path, CHARACTER, list_store.get::(&tree_iter, ColumnsResults::FutureName as i32)); + let typ = list_store.get::(&tree_iter, ColumnsResults::Type as i32); + + if typ == "Dir" { + let how_much = old_name.matches(CHARACTER).count(); + folder_renames.entry(how_much).or_insert_with(Vec::new); + folder_renames.get_mut(&how_much).unwrap().push((old_name, new_name)); + } else if typ == "File" { + file_renames.push((old_name, new_name)); } else { - properly_renamed += 1; + panic!(); + } + + if !list_store.iter_next(&tree_iter) { + break; } } - } - for (_size, vec) in folder_renames.iter().rev() { - for (old_name, new_name) in vec { - let old_name = old_name.clone(); - let new_name = new_name.clone(); + + for (old_name, new_name) in file_renames { // TODO Find method to not overwrite new function #[allow(clippy::collapsible_else_if)] if new_name == old_name { @@ -127,47 +118,61 @@ pub fn connect_start_renaming(gui_data: &GuiData) { } } } + for (_size, vec) in folder_renames.iter().rev() { + for (old_name, new_name) in vec { + let old_name = old_name.clone(); + let new_name = new_name.clone(); + // TODO Find method to not overwrite new function + #[allow(clippy::collapsible_else_if)] + if new_name == old_name { + ignored += 1 + } else if Path::new(&new_name).exists() { + failed_renames.push((old_name, new_name, "Destination file already exists.".to_string())); + } else { + if let Err(e) = fs::rename(&old_name, &new_name) { + failed_renames.push((old_name, new_name, e.to_string())); + } else { + properly_renamed += 1; + } + } + } + } } - } - - chooser.close(); - chooser.hide(); // Workaround, 2 dialogs cannot be run one after one - - // Print results - create_results_dialog(&window_main, properly_renamed, ignored, failed_renames); + // Print results + create_results_dialog(&window_main, properly_renamed, ignored, failed_renames); - list_store.clear(); - shared_result_entries.files.clear(); + list_store.clear(); + shared_result_entries.files.clear(); + }); }); } -fn create_results_dialog(window_main: >k::Window, properly_renamed: u32, ignored: u32, failed_vector: Vec<(String, String, String)>) { - let chooser = gtk::Dialog::with_buttons(Some("Results of renaming"), Some(window_main), DialogFlags::DESTROY_WITH_PARENT, &[("Ok", gtk::ResponseType::Ok)]); +fn create_results_dialog(window_main: >k4::Window, properly_renamed: u32, ignored: u32, failed_vector: Vec<(String, String, String)>) { + let chooser = gtk4::Dialog::with_buttons(Some("Results of renaming"), Some(window_main), DialogFlags::DESTROY_WITH_PARENT, &[("Ok", gtk4::ResponseType::Ok)]); - let label_good = gtk::Label::new(Some(format!("Properly renamed {} files", properly_renamed).as_str())); - let label_ignored = gtk::Label::new(Some(format!("Ignored {} files, because the name before and after the change are the same.", ignored).as_str())); + let label_good = gtk4::Label::new(Some(format!("Properly renamed {} files", properly_renamed).as_str())); + let label_ignored = gtk4::Label::new(Some(format!("Ignored {} files, because the name before and after the change are the same.", ignored).as_str())); - let chooser_box = chooser.children()[0].clone().downcast::().unwrap(); - chooser_box.add(&label_good); - chooser_box.add(&label_ignored); + let chooser_box = get_all_boxes_from_widget(&chooser)[0].clone(); + chooser_box.append(&label_good); + chooser_box.append(&label_ignored); - let label_bad = gtk::Label::new(Some(format!("Failed to rename {} files", failed_vector.len()).as_str())); - chooser_box.add(&label_bad); + let label_bad = gtk4::Label::new(Some(format!("Failed to rename {} files", failed_vector.len()).as_str())); + chooser_box.append(&label_bad); if !failed_vector.is_empty() { chooser.set_default_size(800, 200); - let label_info_bad = gtk::Label::new(Some("List of all failing renames")); + let label_info_bad = gtk4::Label::new(Some("List of all failing renames")); label_info_bad.set_margin_top(10); - chooser_box.add(&label_info_bad); + chooser_box.append(&label_info_bad); - let adj_op1: Option<>k::Adjustment> = None; - let adj_op2: Option<>k::Adjustment> = None; - let txt_op1: Option<>k::TextTagTable> = None; + let txt_op1: Option<>k4::TextTagTable> = None; - let scrolled_window = ScrolledWindow::new(adj_op1, adj_op2); + let scrolled_window = ScrolledWindow::new(); let text_view = TextView::new(); - text_view.set_expand(true); - let buffer = gtk::TextBuffer::new(txt_op1); + text_view.set_hexpand(true); + text_view.set_vexpand(true); + let buffer = gtk4::TextBuffer::new(txt_op1); text_view.set_buffer(Some(&buffer)); let mut text = "".to_string(); @@ -181,13 +186,12 @@ fn create_results_dialog(window_main: >k::Window, properly_renamed: u32, ignor } buffer.set_text(&text); - scrolled_window.add(&text_view); + scrolled_window.set_child(Some(&text_view)); // TODO Created Scrolled Window with explanation about each failed example of renaming - chooser_box.add(&scrolled_window); + chooser_box.append(&scrolled_window); } - chooser_box.show_all(); + chooser_box.show(); - chooser.run(); - chooser.close(); + chooser.connect_response(|_, _| {}); } diff --git a/src/create_tree_view.rs b/src/create_tree_view.rs index 329a39c..e81b7db 100644 --- a/src/create_tree_view.rs +++ b/src/create_tree_view.rs @@ -1,10 +1,10 @@ use crate::help_function::{ColumnsResults, ColumnsRules}; -use gtk::prelude::*; -use gtk::TreeViewColumn; +use gtk4::prelude::*; +use gtk4::TreeViewColumn; -pub fn create_tree_view_results(tree_view: >k::TreeView) { - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); +pub fn create_tree_view_results(tree_view: >k4::TreeView) { + let renderer = gtk4::CellRendererText::new(); + let column: gtk4::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); column.set_title("Type"); column.set_resizable(false); @@ -13,8 +13,8 @@ pub fn create_tree_view_results(tree_view: >k::TreeView) { column.add_attribute(&renderer, "text", ColumnsResults::Type as i32); tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); + let renderer = gtk4::CellRendererText::new(); + let column: gtk4::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); column.set_title("Current Name"); column.set_resizable(true); @@ -23,8 +23,8 @@ pub fn create_tree_view_results(tree_view: >k::TreeView) { column.add_attribute(&renderer, "text", ColumnsResults::CurrentName as i32); tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); + let renderer = gtk4::CellRendererText::new(); + let column: gtk4::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); column.set_title("Future Name"); column.set_resizable(true); @@ -33,8 +33,8 @@ pub fn create_tree_view_results(tree_view: >k::TreeView) { column.add_attribute(&renderer, "text", ColumnsResults::FutureName as i32); tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); + let renderer = gtk4::CellRendererText::new(); + let column: gtk4::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); column.set_title("Path"); column.set_resizable(true); @@ -45,9 +45,9 @@ pub fn create_tree_view_results(tree_view: >k::TreeView) { tree_view.set_vexpand(true); } -pub fn create_tree_view_rules(tree_view: >k::TreeView) { - // let renderer = gtk::CellRendererText::new(); - // let column: gtk::TreeViewColumn = TreeViewColumn::new(); +pub fn create_tree_view_rules(tree_view: >k4::TreeView) { + // let renderer = gtk4::CellRendererText::new(); + // let column: gtk4::TreeViewColumn = TreeViewColumn::new(); // column.pack_start(&renderer, true); // column.set_title("Number"); // column.set_resizable(true); @@ -55,8 +55,8 @@ pub fn create_tree_view_rules(tree_view: >k::TreeView) { // column.add_attribute(&renderer, "text", ColumnsRules::RuleNumber as i32); // tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); + let renderer = gtk4::CellRendererText::new(); + let column: gtk4::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); column.set_title("Tool Type"); column.set_resizable(true); @@ -64,8 +64,8 @@ pub fn create_tree_view_rules(tree_view: >k::TreeView) { column.add_attribute(&renderer, "text", ColumnsRules::RuleType as i32); tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); + let renderer = gtk4::CellRendererText::new(); + let column: gtk4::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); column.set_title("Usage Name"); column.set_resizable(true); @@ -73,8 +73,8 @@ pub fn create_tree_view_rules(tree_view: >k::TreeView) { column.add_attribute(&renderer, "text", ColumnsRules::UsageType as i32); tree_view.append_column(&column); - let renderer = gtk::CellRendererText::new(); - let column: gtk::TreeViewColumn = TreeViewColumn::new(); + let renderer = gtk4::CellRendererText::new(); + let column: gtk4::TreeViewColumn = TreeViewColumn::new(); column.pack_start(&renderer, true); column.set_title("Description"); column.set_resizable(true); diff --git a/src/example_fields.rs b/src/example_fields.rs index eb1ef7a..60cd40c 100644 --- a/src/example_fields.rs +++ b/src/example_fields.rs @@ -3,7 +3,7 @@ use crate::gui_data::GuiData; use crate::help_function::{read_rule_from_window, validate_name}; use crate::notebook_enum::EXAMPLE_NAME; use crate::rules::Rules; -use gtk::prelude::*; +use gtk4::prelude::*; pub fn connect_update_examples(gui_data: &GuiData) { let notebook_choose_rule = gui_data.window_rules.notebook_choose_rule.clone(); @@ -23,7 +23,11 @@ pub fn connect_update_examples(gui_data: &GuiData) { let window_rules = gui_data.window_rules.clone(); let entry_example_before = gui_data.window_rules.entry_example_before.clone(); entry_example_before.connect_changed(move |e| { - e.set_text(validate_name(e.text().to_string()).as_str()); + let old_name = e.text().to_string(); + let validate_name = validate_name(old_name.clone()); + if validate_name != old_name { + e.set_text(&validate_name); + } update_examples(&window_rules, None); }); } diff --git a/src/gui_data.rs b/src/gui_data.rs index f548734..0474688 100644 --- a/src/gui_data.rs +++ b/src/gui_data.rs @@ -6,8 +6,8 @@ use crate::gui_data_upper_buttons::*; use crate::gui_popover_select::GuiPopoverSelect; use crate::help_function::ResultEntries; use crate::rules::Rules; -use gtk::prelude::*; -use gtk::{Builder, WindowPosition}; +use gtk4::prelude::*; +use gtk4::Builder; use std::cell::RefCell; use std::rc::Rc; @@ -18,7 +18,7 @@ pub struct GuiData { // pub builder: Builder, // Window - pub window_main: gtk::Window, + pub window_main: gtk4::Window, // Subcategories pub upper_buttons: GuiUpperButtons, @@ -36,7 +36,7 @@ pub struct GuiData { } impl GuiData { - pub fn new() -> Self { + pub fn new_with_application(application: >k4::Application) -> Self { //// Loading glade file content and build with it help UI let window_main_src = include_str!("../ui/window_main.ui").to_string(); let builder_window_main = Builder::from_string(window_main_src.as_str()); @@ -51,10 +51,11 @@ impl GuiData { let builder_rule_chooser = Builder::from_string(rule_chooser_src.as_str()); //// Windows - let window_main: gtk::Window = builder_window_main.object("window_main").unwrap(); - window_main.set_position(WindowPosition::Center); - window_main.show_all(); - window_main.set_title("Szyszka"); + let window_main: gtk4::Window = builder_window_main.object("window_main").unwrap(); + window_main.set_application(Some(application)); + + window_main.show(); + window_main.set_title(Some("Szyszka")); let upper_buttons = GuiUpperButtons::create_from_builder(&builder_window_main); let results = GuiResults::create_from_builder(&builder_window_main); diff --git a/src/gui_data_results.rs b/src/gui_data_results.rs index 1ef683d..aa43296 100644 --- a/src/gui_data_results.rs +++ b/src/gui_data_results.rs @@ -1,15 +1,14 @@ -use gtk::prelude::*; -use gtk::TreeView; +use gtk4::TreeView; #[derive(Clone)] pub struct GuiResults { - pub scrolled_window_results: gtk::ScrolledWindow, - pub tree_view_results: gtk::TreeView, + pub scrolled_window_results: gtk4::ScrolledWindow, + pub tree_view_results: gtk4::TreeView, } impl GuiResults { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let scrolled_window_results: gtk::ScrolledWindow = builder.object("scrolled_window_results").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let scrolled_window_results: gtk4::ScrolledWindow = builder.object("scrolled_window_results").unwrap(); let tree_view_results = TreeView::new(); Self { scrolled_window_results, tree_view_results } diff --git a/src/gui_data_rules_bottom_panel.rs b/src/gui_data_rules_bottom_panel.rs index 37a346b..6625ecc 100644 --- a/src/gui_data_rules_bottom_panel.rs +++ b/src/gui_data_rules_bottom_panel.rs @@ -1,28 +1,28 @@ use crate::fls; -use gtk::prelude::*; -use gtk::TreeView; +use gtk4::prelude::*; +use gtk4::TreeView; #[derive(Clone)] pub struct GuiRulesBottomPanel { - pub button_add_rule: gtk::Button, - pub button_edit_rule: gtk::Button, - pub button_remove_rule: gtk::Button, - pub button_rule_one_up: gtk::Button, - pub button_rule_one_down: gtk::Button, - pub scrolled_window_rules: gtk::ScrolledWindow, - pub tree_view_window_rules: gtk::TreeView, + pub button_add_rule: gtk4::Button, + pub button_edit_rule: gtk4::Button, + pub button_remove_rule: gtk4::Button, + pub button_rule_one_up: gtk4::Button, + pub button_rule_one_down: gtk4::Button, + pub scrolled_window_rules: gtk4::ScrolledWindow, + pub tree_view_window_rules: gtk4::TreeView, } impl GuiRulesBottomPanel { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let button_add_rule: gtk::Button = builder.object("button_add_rule").unwrap(); - let button_edit_rule: gtk::Button = builder.object("button_edit_rule").unwrap(); - let button_remove_rule: gtk::Button = builder.object("button_remove_rule").unwrap(); - let button_rule_one_up: gtk::Button = builder.object("button_rule_one_up").unwrap(); - let button_rule_one_down: gtk::Button = builder.object("button_rule_one_down").unwrap(); - let scrolled_window_rules: gtk::ScrolledWindow = builder.object("scrolled_window_rules").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let button_add_rule: gtk4::Button = builder.object("button_add_rule").unwrap(); + let button_edit_rule: gtk4::Button = builder.object("button_edit_rule").unwrap(); + let button_remove_rule: gtk4::Button = builder.object("button_remove_rule").unwrap(); + let button_rule_one_up: gtk4::Button = builder.object("button_rule_one_up").unwrap(); + let button_rule_one_down: gtk4::Button = builder.object("button_rule_one_down").unwrap(); + let scrolled_window_rules: gtk4::ScrolledWindow = builder.object("scrolled_window_rules").unwrap(); - let tree_view_window_rules: gtk::TreeView = TreeView::new(); + let tree_view_window_rules: gtk4::TreeView = TreeView::new(); Self { button_add_rule, diff --git a/src/gui_data_settings.rs b/src/gui_data_settings.rs index 30e5b6a..03c6605 100644 --- a/src/gui_data_settings.rs +++ b/src/gui_data_settings.rs @@ -1,20 +1,20 @@ -use gtk::prelude::*; +use gtk4::prelude::*; #[derive(Clone)] pub struct GuiSettings { - pub window_settings: gtk::Window, - pub label_settings_general_language: gtk::Label, - pub combo_box_settings_language: gtk::ComboBoxText, + pub window_settings: gtk4::Window, + pub label_settings_general_language: gtk4::Label, + pub combo_box_settings_language: gtk4::ComboBoxText, } impl GuiSettings { - pub fn create_from_builder(builder: >k::Builder, window_main: >k::Window) -> Self { - let window_settings: gtk::Window = builder.object("window_settings").unwrap(); + pub fn create_from_builder(builder: >k4::Builder, window_main: >k4::Window) -> Self { + let window_settings: gtk4::Window = builder.object("window_settings").unwrap(); window_settings.set_modal(true); window_settings.set_transient_for(Some(window_main)); - let label_settings_general_language: gtk::Label = builder.object("label_settings_general_language").unwrap(); - let combo_box_settings_language: gtk::ComboBoxText = builder.object("combo_box_settings_language").unwrap(); + let label_settings_general_language: gtk4::Label = builder.object("label_settings_general_language").unwrap(); + let combo_box_settings_language: gtk4::ComboBoxText = builder.object("combo_box_settings_language").unwrap(); Self { window_settings, diff --git a/src/gui_data_upper_buttons.rs b/src/gui_data_upper_buttons.rs index 9fa505b..52a457b 100644 --- a/src/gui_data_upper_buttons.rs +++ b/src/gui_data_upper_buttons.rs @@ -1,32 +1,32 @@ use crate::fls; -use gtk::prelude::*; +use gtk4::prelude::*; #[derive(Clone)] pub struct GuiUpperButtons { - pub button_setting: gtk::Button, - pub button_start_rename: gtk::Button, - pub button_remove_selection: gtk::Button, - pub button_add_files: gtk::Button, - pub button_add_folders: gtk::Button, - pub button_select_popup: gtk::Button, - pub button_update_names: gtk::Button, - pub label_files_folders: gtk::Label, - pub button_results_one_up: gtk::Button, - pub button_results_one_down: gtk::Button, + pub button_setting: gtk4::Button, + pub button_start_rename: gtk4::Button, + pub button_remove_selection: gtk4::Button, + pub button_add_files: gtk4::Button, + pub button_add_folders: gtk4::Button, + pub menu_button_select_popup: gtk4::MenuButton, + pub button_update_names: gtk4::Button, + pub label_files_folders: gtk4::Label, + pub button_results_one_up: gtk4::Button, + pub button_results_one_down: gtk4::Button, } impl GuiUpperButtons { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let button_setting: gtk::Button = builder.object("button_setting").unwrap(); - let button_start_rename: gtk::Button = builder.object("button_start_rename").unwrap(); - let button_remove_selection: gtk::Button = builder.object("button_remove_selection").unwrap(); - let button_add_files: gtk::Button = builder.object("button_add_files").unwrap(); - let button_add_folders: gtk::Button = builder.object("button_add_folders").unwrap(); - let button_select_popup: gtk::Button = builder.object("button_select_popup").unwrap(); - let button_update_names: gtk::Button = builder.object("button_update_names").unwrap(); - let label_files_folders: gtk::Label = builder.object("label_files_folders").unwrap(); - let button_results_one_up: gtk::Button = builder.object("button_results_one_up").unwrap(); - let button_results_one_down: gtk::Button = builder.object("button_results_one_down").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let button_setting: gtk4::Button = builder.object("button_setting").unwrap(); + let button_start_rename: gtk4::Button = builder.object("button_start_rename").unwrap(); + let button_remove_selection: gtk4::Button = builder.object("button_remove_selection").unwrap(); + let button_add_files: gtk4::Button = builder.object("button_add_files").unwrap(); + let button_add_folders: gtk4::Button = builder.object("button_add_folders").unwrap(); + let menu_button_select_popup: gtk4::MenuButton = builder.object("menu_button_select_popup").unwrap(); + let button_update_names: gtk4::Button = builder.object("button_update_names").unwrap(); + let label_files_folders: gtk4::Label = builder.object("label_files_folders").unwrap(); + let button_results_one_up: gtk4::Button = builder.object("button_results_one_up").unwrap(); + let button_results_one_down: gtk4::Button = builder.object("button_results_one_down").unwrap(); Self { button_setting, @@ -34,7 +34,7 @@ impl GuiUpperButtons { button_remove_selection, button_add_files, button_add_folders, - button_select_popup, + menu_button_select_popup, button_update_names, label_files_folders, button_results_one_up, @@ -44,16 +44,16 @@ impl GuiUpperButtons { pub fn update_language(&self) { self.button_start_rename.set_label(&fls!("upper_start_renaming_button")); - // pub button_setting: gtk::Button, - // pub button_start_rename: gtk::Button, - // pub button_remove_selection: gtk::Button, - // pub button_add_files: gtk::Button, - // pub button_add_folders: gtk::Button, - // pub button_select_popup: gtk::Button, - // pub button_update_names: gtk::Button, - // pub label_files_folders: gtk::Label, - // pub button_results_one_up: gtk::Button, - // pub button_results_one_down: gtk::Button, + // pub button_setting: gtk4::Button, + // pub button_start_rename: gtk4::Button, + // pub button_remove_selection: gtk4::Button, + // pub button_add_files: gtk4::Button, + // pub button_add_folders: gtk4::Button, + // pub menu_button_select_popup: gtk4::Button, + // pub button_update_names: gtk4::Button, + // pub label_files_folders: gtk4::Label, + // pub button_results_one_up: gtk4::Button, + // pub button_results_one_down: gtk4::Button, // self.check_button_music_title.set_label(&fls!("music_title_checkbox")); // self.check_button_music_artist.set_label(&fls!("music_artist_checkbox")); // self.check_button_music_album_title.set_label(&fls!("music_album_title_checkbox")); diff --git a/src/gui_popover_select.rs b/src/gui_popover_select.rs index 30f2a86..df3e551 100644 --- a/src/gui_popover_select.rs +++ b/src/gui_popover_select.rs @@ -1,25 +1,23 @@ -use gtk::prelude::*; - #[derive(Clone)] pub struct GuiPopoverSelect { - pub popover_select: gtk::Popover, - pub button_select_all: gtk::Button, - pub button_select_reverse: gtk::Button, - pub button_select_custom: gtk::Button, - pub button_unselect_custom: gtk::Button, - pub button_select_changed: gtk::Button, - pub button_unselect_changed: gtk::Button, + pub popover_select: gtk4::Popover, + pub button_select_all: gtk4::Button, + pub button_select_reverse: gtk4::Button, + pub button_select_custom: gtk4::Button, + pub button_unselect_custom: gtk4::Button, + pub button_select_changed: gtk4::Button, + pub button_unselect_changed: gtk4::Button, } impl GuiPopoverSelect { - pub fn create_from_builder(builder: >k::Builder) -> Self { - let popover_select: gtk::Popover = builder.object("popover_select").unwrap(); - let button_select_all: gtk::Button = builder.object("button_select_all").unwrap(); - let button_select_reverse: gtk::Button = builder.object("button_select_reverse").unwrap(); - let button_select_custom: gtk::Button = builder.object("button_select_custom").unwrap(); - let button_unselect_custom: gtk::Button = builder.object("button_unselect_custom").unwrap(); - let button_select_changed: gtk::Button = builder.object("button_select_changed").unwrap(); - let button_unselect_changed: gtk::Button = builder.object("button_unselect_changed").unwrap(); + pub fn create_from_builder(builder: >k4::Builder) -> Self { + let popover_select: gtk4::Popover = builder.object("popover_select").unwrap(); + let button_select_all: gtk4::Button = builder.object("button_select_all").unwrap(); + let button_select_reverse: gtk4::Button = builder.object("button_select_reverse").unwrap(); + let button_select_custom: gtk4::Button = builder.object("button_select_custom").unwrap(); + let button_unselect_custom: gtk4::Button = builder.object("button_unselect_custom").unwrap(); + let button_select_changed: gtk4::Button = builder.object("button_select_changed").unwrap(); + let button_unselect_changed: gtk4::Button = builder.object("button_unselect_changed").unwrap(); Self { popover_select, button_select_all, diff --git a/src/help_function.rs b/src/help_function.rs index 699ea8c..70c74fb 100644 --- a/src/help_function.rs +++ b/src/help_function.rs @@ -1,8 +1,8 @@ use crate::class_dialog_rules::GuiDialogRules; use crate::notebook_enum::{to_notebook_enum, NotebookEnum}; use crate::rules::*; -use gtk::prelude::*; -use gtk::*; +use gtk4::prelude::*; +use gtk4::*; use std::cell::RefCell; use std::collections::BTreeSet; use std::ops::DerefMut; @@ -41,7 +41,7 @@ pub fn validate_name(before_name: String) -> String { before_name.chars().filter(|e| *e != '\\' && *e != '/').collect::() } pub fn validate_number(before_name: String) -> String { - before_name.chars().filter(|e| e.is_digit(10)).collect::() + before_name.chars().filter(|e| e.is_ascii_digit()).collect::() } pub fn split_path(path: &Path) -> (String, String) { @@ -60,10 +60,10 @@ pub fn split_file_name(path: &Path) -> (String, String) { } pub fn get_list_store_from_tree_view(tree_view: &TreeView) -> ListStore { - tree_view.model().unwrap().downcast::().unwrap() + tree_view.model().unwrap().downcast::().unwrap() } -pub fn populate_rules_tree_view(tree_view: >k::TreeView, rules: Rc>) { +pub fn populate_rules_tree_view(tree_view: >k4::TreeView, rules: Rc>) { let mut rules = rules.borrow_mut(); let rules = rules.deref_mut(); @@ -81,7 +81,7 @@ pub fn populate_rules_tree_view(tree_view: >k::TreeView, rules: Rc Vec { +pub fn remove_selected_rows(tree_view: >k4::TreeView) -> Vec { let selection = tree_view.selection(); let (selected_rows, _tree_model) = selection.selected_rows(); @@ -101,7 +101,7 @@ pub fn remove_selected_rows(tree_view: >k::TreeView) -> Vec { // Get indexes of removed values for selected_tree_path in &selected_rows { loop { - if list_store.path(&tree_iter).unwrap() == *selected_tree_path { + if list_store.path(&tree_iter) == *selected_tree_path { vec_index_to_delete.push(current_iter); list_store.iter_next(&tree_iter); current_iter += 1; @@ -118,7 +118,7 @@ pub fn remove_selected_rows(tree_view: >k::TreeView) -> Vec { } vec_index_to_delete } -pub fn get_full_file_names_from_selection(tree_view: >k::TreeView) -> Vec { +pub fn get_full_file_names_from_selection(tree_view: >k4::TreeView) -> Vec { let selection = tree_view.selection(); let (selected_rows, _tree_model) = selection.selected_rows(); @@ -137,16 +137,16 @@ pub fn get_full_file_names_from_selection(tree_view: >k::TreeView) -> Vec().unwrap(), + list_store.get::(&tree_iter, ColumnsResults::Path as i32), CHARACTER, - list_store.value(&tree_iter, ColumnsResults::CurrentName as i32).get::().unwrap() + list_store.get::(&tree_iter, ColumnsResults::CurrentName as i32) )); } return_vec } -pub fn count_rows_in_tree_view(tree_view: >k::TreeView) -> u32 { +pub fn count_rows_in_tree_view(tree_view: >k4::TreeView) -> u32 { let list_store = get_list_store_from_tree_view(tree_view); let mut number = 0; @@ -162,19 +162,16 @@ pub fn count_rows_in_tree_view(tree_view: >k::TreeView) -> u32 { number } -pub fn create_message_window(window_main: >k::Window, title: &str, message: &str) { - let chooser = gtk::Dialog::with_buttons(Some(title), Some(window_main), DialogFlags::DESTROY_WITH_PARENT, &[("Ok", gtk::ResponseType::Ok)]); +pub fn create_message_window(window_main: >k4::Window, title: &str, message: &str) { + let chooser = gtk4::Dialog::with_buttons(Some(title), Some(window_main), DialogFlags::DESTROY_WITH_PARENT, &[("Ok", gtk4::ResponseType::Ok)]); chooser.set_modal(true); chooser.set_transient_for(Some(window_main)); - let question_label = gtk::Label::new(Some(message)); + let question_label = gtk4::Label::new(Some(message)); - let chooser_box = chooser.children()[0].clone().downcast::().unwrap(); - chooser_box.add(&question_label); - chooser_box.show_all(); - - chooser.run(); - chooser.close(); + let chooser_box = get_all_boxes_from_widget(&chooser)[0].clone(); + chooser_box.append(&question_label); + chooser_box.show(); } pub fn regex_check(expression: &str, directory: impl AsRef) -> bool { let temp_splits: Vec<&str> = expression.split('*').collect(); @@ -201,7 +198,7 @@ pub fn regex_check(expression: &str, directory: impl AsRef) -> bool { let mut position_of_splits: Vec = Vec::new(); // `git*` shouldn't be true for `/gitsfafasfs` - if !expression.starts_with('*') && directory.find(&splits[0]).unwrap() > 0 { + if !expression.starts_with('*') && directory.find(splits[0]).unwrap() > 0 { return false; } // `*home` shouldn't be true for `/homeowner` @@ -210,7 +207,7 @@ pub fn regex_check(expression: &str, directory: impl AsRef) -> bool { } // At the end we check if parts between * are correctly positioned - position_of_splits.push(directory.find(&splits[0]).unwrap()); + position_of_splits.push(directory.find(splits[0]).unwrap()); let mut current_index: usize; let mut found_index: usize; for i in splits[1..].iter().enumerate() { @@ -229,46 +226,46 @@ pub fn regex_check(expression: &str, directory: impl AsRef) -> bool { pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Option) -> SingleRule { let notebook_choose_rule = window_rules.notebook_choose_rule.clone(); - let radio_button_letters_type_uppercase = window_rules.size_letters.radio_button_letters_type_uppercase.clone(); - let radio_button_letters_type_lowercase = window_rules.size_letters.radio_button_letters_type_lowercase.clone(); - let radio_button_letters_usage_name = window_rules.size_letters.radio_button_letters_usage_name.clone(); - let radio_button_letters_usage_extension = window_rules.size_letters.radio_button_letters_usage_extension.clone(); - let radio_button_letters_usage_both = window_rules.size_letters.radio_button_letters_usage_both.clone(); + let check_button_letters_type_uppercase = window_rules.size_letters.check_button_letters_type_uppercase.clone(); + let check_button_letters_type_lowercase = window_rules.size_letters.check_button_letters_type_lowercase.clone(); + let check_button_letters_usage_name = window_rules.size_letters.check_button_letters_usage_name.clone(); + let check_button_letters_usage_extension = window_rules.size_letters.check_button_letters_usage_extension.clone(); + let check_button_letters_usage_both = window_rules.size_letters.check_button_letters_usage_both.clone(); - let radio_button_purge_name = window_rules.purge.radio_button_purge_name.clone(); - let radio_button_purge_extension = window_rules.purge.radio_button_purge_extension.clone(); - let radio_button_purge_both = window_rules.purge.radio_button_purge_both.clone(); + let check_button_purge_name = window_rules.purge.check_button_purge_name.clone(); + let check_button_purge_extension = window_rules.purge.check_button_purge_extension.clone(); + let check_button_purge_both = window_rules.purge.check_button_purge_both.clone(); - let radio_button_add_text_after_name = window_rules.add_text.radio_button_add_text_after_name.clone(); - let radio_button_add_text_before_name = window_rules.add_text.radio_button_add_text_before_name.clone(); + let check_button_add_text_after_name = window_rules.add_text.check_button_add_text_after_name.clone(); + let check_button_add_text_before_name = window_rules.add_text.check_button_add_text_before_name.clone(); let entry_add_text_text_to_add = window_rules.add_text.entry_add_text_text_to_add.clone(); let entry_add_text_text_to_trim = window_rules.trim.entry_add_text_text_to_trim.clone(); - let radio_button_trim_name_start = window_rules.trim.radio_button_trim_name_start.clone(); - let radio_button_trim_name_end = window_rules.trim.radio_button_trim_name_end.clone(); - let radio_button_trim_extension_start = window_rules.trim.radio_button_trim_extension_start.clone(); - let radio_button_trim_extension_end = window_rules.trim.radio_button_trim_extension_end.clone(); - let radio_button_trim_case_insensitive = window_rules.trim.radio_button_trim_case_insensitive.clone(); - let radio_button_trim_case_sensitive = window_rules.trim.radio_button_trim_case_sensitive.clone(); + let check_button_trim_name_start = window_rules.trim.check_button_trim_name_start.clone(); + let check_button_trim_name_end = window_rules.trim.check_button_trim_name_end.clone(); + let check_button_trim_extension_start = window_rules.trim.check_button_trim_extension_start.clone(); + let check_button_trim_extension_end = window_rules.trim.check_button_trim_extension_end.clone(); + let check_button_trim_case_insensitive = window_rules.trim.check_button_trim_case_insensitive.clone(); + let check_button_trim_case_sensitive = window_rules.trim.check_button_trim_case_sensitive.clone(); let entry_custom_text_to_change = window_rules.custom.entry_custom_text_to_change.clone(); - let radio_button_replace_extension = window_rules.replace.radio_button_replace_extension.clone(); - let radio_button_replace_name = window_rules.replace.radio_button_replace_name.clone(); - let radio_button_replace_both = window_rules.replace.radio_button_replace_both.clone(); - let radio_button_replace_case_insensitive = window_rules.replace.radio_button_replace_case_insensitive.clone(); - let radio_button_replace_case_sensitive = window_rules.replace.radio_button_replace_case_sensitive.clone(); + let check_button_replace_extension = window_rules.replace.check_button_replace_extension.clone(); + let check_button_replace_name = window_rules.replace.check_button_replace_name.clone(); + let check_button_replace_both = window_rules.replace.check_button_replace_both.clone(); + let check_button_replace_case_insensitive = window_rules.replace.check_button_replace_case_insensitive.clone(); + let check_button_replace_case_sensitive = window_rules.replace.check_button_replace_case_sensitive.clone(); let entry_replace_text_to_remove = window_rules.replace.entry_replace_text_to_remove.clone(); let entry_replace_text_to_change = window_rules.replace.entry_replace_text_to_change.clone(); - let radio_button_add_number_before_name = window_rules.add_number.radio_button_add_number_before_name.clone(); - let radio_button_add_number_after_name = window_rules.add_number.radio_button_add_number_after_name.clone(); + let check_button_add_number_before_name = window_rules.add_number.check_button_add_number_before_name.clone(); + let check_button_add_number_after_name = window_rules.add_number.check_button_add_number_after_name.clone(); let entry_add_number_start_number = window_rules.add_number.entry_add_number_start_number.clone(); let entry_add_number_step = window_rules.add_number.entry_add_number_step.clone(); let entry_add_number_zeros = window_rules.add_number.entry_add_number_zeros.clone(); - let radio_button_normalize_everything = window_rules.normalize.radio_button_normalize_everything.clone(); - let radio_button_normalize_partial = window_rules.normalize.radio_button_normalize_partial.clone(); + let check_button_normalize_everything = window_rules.normalize.check_button_normalize_everything.clone(); + let check_button_normalize_partial = window_rules.normalize.check_button_normalize_partial.clone(); let rule_type: RuleType; let rule_place: RulePlace; @@ -286,18 +283,18 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt rule_type = RuleType::CaseSize; rule_data.to_lowercase = true; - if radio_button_letters_type_uppercase.is_active() { + if check_button_letters_type_uppercase.is_active() { rule_data.to_lowercase = false; - } else if radio_button_letters_type_lowercase.is_active() { + } else if check_button_letters_type_lowercase.is_active() { rule_data.to_lowercase = true; } else { panic!("Button not available"); } - if radio_button_letters_usage_extension.is_active() { + if check_button_letters_usage_extension.is_active() { rule_place = RulePlace::Extension; - } else if radio_button_letters_usage_both.is_active() { + } else if check_button_letters_usage_both.is_active() { rule_place = RulePlace::ExtensionAndName; - } else if radio_button_letters_usage_name.is_active() { + } else if check_button_letters_usage_name.is_active() { rule_place = RulePlace::Name; } else { panic!("Invalid Button Clicked"); @@ -309,11 +306,11 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt } NotebookEnum::Purge => { rule_type = RuleType::Purge; - if radio_button_purge_extension.is_active() { + if check_button_purge_extension.is_active() { rule_place = RulePlace::Extension; - } else if radio_button_purge_both.is_active() { + } else if check_button_purge_both.is_active() { rule_place = RulePlace::ExtensionAndName; - } else if radio_button_purge_name.is_active() { + } else if check_button_purge_name.is_active() { rule_place = RulePlace::Name; } else { panic!("Invalid Button Clicked"); @@ -322,9 +319,9 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt } NotebookEnum::AddText => { rule_type = RuleType::AddText; - if radio_button_add_text_before_name.is_active() { + if check_button_add_text_before_name.is_active() { rule_place = RulePlace::BeforeName; - } else if radio_button_add_text_after_name.is_active() { + } else if check_button_add_text_after_name.is_active() { rule_place = RulePlace::AfterName; } else { panic!("Invalid Button Clicked"); @@ -335,9 +332,9 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt NotebookEnum::Trim => { rule_type = RuleType::Trim; - if radio_button_trim_case_sensitive.is_active() { + if check_button_trim_case_sensitive.is_active() { rule_data.case_sensitive = true; - } else if radio_button_trim_case_insensitive.is_active() { + } else if check_button_trim_case_insensitive.is_active() { rule_data.case_sensitive = false; } else { panic!("Invalid Button Clicked"); @@ -345,16 +342,16 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt let where_remove; - if radio_button_trim_name_start.is_active() { + if check_button_trim_name_start.is_active() { rule_place = RulePlace::FromNameStart; where_remove = "start"; - } else if radio_button_trim_name_end.is_active() { + } else if check_button_trim_name_end.is_active() { rule_place = RulePlace::FromNameEndReverse; where_remove = "end of name"; - } else if radio_button_trim_extension_start.is_active() { + } else if check_button_trim_extension_start.is_active() { rule_place = RulePlace::FromExtensionStart; where_remove = "extension"; - } else if radio_button_trim_extension_end.is_active() { + } else if check_button_trim_extension_end.is_active() { rule_place = RulePlace::FromExtensionEndReverse; where_remove = "end of extension"; } else { @@ -373,19 +370,19 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt NotebookEnum::Replace => { rule_type = RuleType::Replace; - if radio_button_replace_both.is_active() { + if check_button_replace_both.is_active() { rule_place = RulePlace::ExtensionAndName; - } else if radio_button_replace_name.is_active() { + } else if check_button_replace_name.is_active() { rule_place = RulePlace::Name; - } else if radio_button_replace_extension.is_active() { + } else if check_button_replace_extension.is_active() { rule_place = RulePlace::Extension; } else { panic!("Invalid Rule Type for purge rule"); } - if radio_button_replace_case_sensitive.is_active() { + if check_button_replace_case_sensitive.is_active() { rule_data.case_sensitive = true; - } else if radio_button_replace_case_insensitive.is_active() { + } else if check_button_replace_case_insensitive.is_active() { rule_data.case_sensitive = false; } else { panic!("Invalid Button Clicked"); @@ -398,9 +395,9 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt NotebookEnum::AddNumber => { rule_type = RuleType::AddNumber; - if radio_button_add_number_before_name.is_active() { + if check_button_add_number_before_name.is_active() { rule_place = RulePlace::BeforeName; - } else if radio_button_add_number_after_name.is_active() { + } else if check_button_add_number_after_name.is_active() { rule_place = RulePlace::AfterName; } else { panic!("Invalid Rule Type for purge rule"); @@ -421,9 +418,9 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt rule_type = RuleType::Normalize; rule_place = RulePlace::ExtensionAndName; - if radio_button_normalize_everything.is_active() { + if check_button_normalize_everything.is_active() { rule_data.full_normalize = true; - } else if radio_button_normalize_partial.is_active() { + } else if check_button_normalize_partial.is_active() { rule_data.full_normalize = false; } else { panic!(); @@ -443,3 +440,32 @@ pub fn read_rule_from_window(window_rules: &GuiDialogRules, notebook_number: Opt rule_description, } } + +pub fn get_all_boxes_from_widget>(item: &P) -> Vec { + let mut widgets_to_check = vec![item.clone().upcast::()]; + let mut boxes = Vec::new(); + + while let Some(widget) = widgets_to_check.pop() { + widgets_to_check.extend(get_all_children(&widget)); + if let Ok(bbox) = widget.clone().downcast::() { + boxes.push(bbox); + } + } + boxes +} + +pub fn get_all_children>(wid: &P) -> Vec { + let mut vector = vec![]; + if let Some(mut child) = wid.first_child() { + vector.push(child.clone()); + loop { + child = match child.next_sibling() { + Some(t) => t, + None => break, + }; + vector.push(child.clone()); + } + } + + vector +} diff --git a/src/initialize_gui.rs b/src/initialize_gui.rs index 24dd495..b794c8a 100644 --- a/src/initialize_gui.rs +++ b/src/initialize_gui.rs @@ -5,8 +5,8 @@ use crate::help_function::{ColumnsResults, CHARACTER}; use crate::language_functions::LANGUAGES_ALL; use crate::notebook_enum::EXAMPLE_NAME; use glib::Type; -use gtk::prelude::*; -use gtk::{ScrolledWindow, SelectionMode}; +use gtk4::prelude::*; +use gtk4::{ScrolledWindow, SelectionMode}; pub fn initialize_gui(gui_data: &GuiData) { // Setup Languages @@ -31,26 +31,27 @@ pub fn initialize_gui(gui_data: &GuiData) { glib::types::Type::U64, ]; - let list_store: gtk::ListStore = gtk::ListStore::new(&col_types); + let list_store: gtk4::ListStore = gtk4::ListStore::new(&col_types); - let tree_view: gtk::TreeView = gui_data.results.tree_view_results.clone(); + let tree_view: gtk4::TreeView = gui_data.results.tree_view_results.clone(); tree_view.set_model(Some(&list_store)); tree_view.selection().set_mode(SelectionMode::Multiple); - tree_view.connect_button_press_event(|tree_view, event| { - if event.event_type() == gdk::EventType::DoubleButtonPress && event.button() == 1 { - common_open_function(tree_view, OpenMode::PathAndName); - } else if event.event_type() == gdk::EventType::DoubleButtonPress && event.button() == 3 { - common_open_function(tree_view, OpenMode::OnlyPath); - } - gtk::Inhibit(false) - }); + // TODO GTK 4 + // tree_view.connect_button_press_event(|tree_view, event| { + // if event.event_type() == gdk4::EventType::DoubleButtonPress && event.button() == 1 { + // common_open_function(tree_view, OpenMode::PathAndName); + // } else if event.event_type() == gdk4::EventType::DoubleButtonPress && event.button() == 3 { + // common_open_function(tree_view, OpenMode::OnlyPath); + // } + // gtk4::Inhibit(false) + // }); create_tree_view_results(&tree_view); - scrolled_window_results.add(&tree_view); - scrolled_window_results.show_all(); + scrolled_window_results.set_child(Some(&tree_view)); + scrolled_window_results.show(); } // Create TreeView in Rules { @@ -58,17 +59,17 @@ pub fn initialize_gui(gui_data: &GuiData) { let col_types: [Type; 3] = [glib::types::Type::STRING, glib::types::Type::STRING, glib::types::Type::STRING]; - let list_store: gtk::ListStore = gtk::ListStore::new(&col_types); + let list_store: gtk4::ListStore = gtk4::ListStore::new(&col_types); - let tree_view: gtk::TreeView = gui_data.rules_bottom_panel.tree_view_window_rules.clone(); + let tree_view: gtk4::TreeView = gui_data.rules_bottom_panel.tree_view_window_rules.clone(); tree_view.set_model(Some(&list_store)); // tree_view.selection().set_mode(SelectionMode::Multiple); create_tree_view_rules(&tree_view); - scrolled_window_rules.add(&tree_view); - scrolled_window_rules.show_all(); + scrolled_window_rules.set_child(Some(&tree_view)); + scrolled_window_rules.show(); } // Set Example name { @@ -78,19 +79,23 @@ pub fn initialize_gui(gui_data: &GuiData) { update_examples(&gui_data.window_rules, None); } } +// TODO GTK 4 +#[allow(dead_code)] pub enum OpenMode { OnlyPath, PathAndName, } -pub fn common_open_function(tree_view: >k::TreeView, opening_mode: OpenMode) { +// TODO GTK 4 +#[allow(dead_code)] +pub fn common_open_function(tree_view: >k4::TreeView, opening_mode: OpenMode) { let selection = tree_view.selection(); let (selection_rows, tree_model) = selection.selected_rows(); for tree_path in selection_rows.iter().rev() { let end_path; - let current_name = tree_model.value(&tree_model.iter(tree_path).unwrap(), ColumnsResults::CurrentName as i32).get::().unwrap(); - let path = tree_model.value(&tree_model.iter(tree_path).unwrap(), ColumnsResults::Path as i32).get::().unwrap(); + let current_name = tree_model.get::(&tree_model.iter(tree_path).unwrap(), ColumnsResults::CurrentName as i32); + let path = tree_model.get::(&tree_model.iter(tree_path).unwrap(), ColumnsResults::Path as i32); match opening_mode { OpenMode::OnlyPath => { @@ -101,9 +106,8 @@ pub fn common_open_function(tree_view: >k::TreeView, opening_mode: OpenMode) { } } - open::that_in_background(&end_path); - // if open::that(&end_path).is_err() { - // println!("Failed to open {}", end_path); - // } + if open::that(&end_path).is_err() { + println!("Failed to open {}", end_path); + } } } diff --git a/src/main.rs b/src/main.rs index dc70279..ce0fab5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -78,12 +78,24 @@ use crate::connect_start_renaming::*; use crate::example_fields::connect_update_examples; use crate::gui_data::GuiData; use crate::initialize_gui::*; -use gtk::prelude::*; +use gio::ApplicationFlags; +use glib::signal::Inhibit; +use gtk4::prelude::*; +use gtk4::Application; +use std::env; +use std::ffi::OsString; fn main() { - gtk::init().expect("Failed to initialize GTK."); + let application = Application::new(None, ApplicationFlags::HANDLES_OPEN | ApplicationFlags::HANDLES_COMMAND_LINE); + application.connect_command_line(move |app, cmdline| { + build_ui(app, cmdline.arguments()); + 0 + }); + application.run_with_args(&env::args().collect::>()); +} - let gui_data: GuiData = GuiData::new(); +fn build_ui(application: &Application, _arguments: Vec) { + let gui_data: GuiData = GuiData::new_with_application(application); initialize_gui(&gui_data); @@ -140,12 +152,6 @@ fn main() { connect_results_modify_one_up(&gui_data); connect_results_modify_one_down(&gui_data); - // Quit the program when X in main window was clicked - gui_data.window_main.connect_delete_event(|_, _| { - gtk::main_quit(); - Inhibit(false) - }); - - // We start the gtk main loop. - gtk::main(); + let window_main = gui_data.window_main; + window_main.connect_close_request(move |_| Inhibit(false)); } diff --git a/src/rule_custom.rs b/src/rule_custom.rs index 4093d95..e40467a 100644 --- a/src/rule_custom.rs +++ b/src/rule_custom.rs @@ -1,7 +1,8 @@ use crate::help_function::split_file_name; use crate::rules::*; use chrono::NaiveDateTime; -use humansize::{file_size_opts as options, FileSize}; +use humansize::format_size; +use humansize::BINARY; use std::cmp::min; use std::path::Path; @@ -21,9 +22,9 @@ pub fn rule_custom(data_to_change: &str, rule: &SingleRule, rule_number: u64, fi // Random data to visualize typical usage in examples if let Some(f_data) = file_data { - modification_date = NaiveDateTime::from_timestamp(f_data.0 as i64, 0).to_string().replace(':', "_"); - creation_date = NaiveDateTime::from_timestamp(f_data.1 as i64, 0).to_string().replace(':', "_"); - size = f_data.2.file_size(options::BINARY).unwrap(); + modification_date = NaiveDateTime::from_timestamp_opt(f_data.0 as i64, 0).unwrap().to_string().replace(':', "_"); + creation_date = NaiveDateTime::from_timestamp_opt(f_data.1 as i64, 0).unwrap().to_string().replace(':', "_"); + size = format_size(f_data.2, BINARY); } else { creation_date = "2021-01-31 08_42_12".to_string(); modification_date = "2015-11-15 14_24_55".to_string(); diff --git a/src/update_records.rs b/src/update_records.rs index 48e0791..889e880 100644 --- a/src/update_records.rs +++ b/src/update_records.rs @@ -1,8 +1,8 @@ use crate::help_function::{get_list_store_from_tree_view, ColumnsResults, ResultEntries}; use crate::rules::Rules; use glib::Value; -use gtk::prelude::*; -use gtk::{Label, TreeView}; +use gtk4::prelude::*; +use gtk4::{Label, TreeView}; use std::cell::RefCell; use std::ops::DerefMut; use std::rc::Rc; @@ -41,10 +41,10 @@ pub fn update_records(files_tree_view: &TreeView, shared_result_entries: Rc().unwrap(); - let modification_date: u64 = list_store.value(&iter, ColumnsResults::ModificationDate as i32).get::().unwrap(); - let creation_date: u64 = list_store.value(&iter, ColumnsResults::CreationDate as i32).get::().unwrap(); - let file_size: u64 = list_store.value(&iter, ColumnsResults::Size as i32).get::().unwrap(); + let value_to_change = list_store.get::(&iter, ColumnsResults::CurrentName as i32); + let modification_date: u64 = list_store.get::(&iter, ColumnsResults::ModificationDate as i32); + let creation_date: u64 = list_store.get::(&iter, ColumnsResults::CreationDate as i32); + let file_size: u64 = list_store.get::(&iter, ColumnsResults::Size as i32); let changed_value = rules.apply_all_rules_to_item(value_to_change, current_index, (modification_date, creation_date, file_size)); list_store.set_value(&iter, ColumnsResults::FutureName as u32, &Value::from(&changed_value)); if !list_store.iter_next(&iter) { diff --git a/ui/Szyszka.cmb b/ui/Szyszka.cmb new file mode 100644 index 0000000..2e04bd1 --- /dev/null +++ b/ui/Szyszka.cmb @@ -0,0 +1,607 @@ + + + + + (2,None,"popover.ui","popover.ui",None,None,None,None,None,None), + (3,None,"rule_chooser.ui","rule_chooser.ui",None,None,None,None,None,None), + (4,None,"settings.ui","settings.ui",None,None,None,None,None,None), + (5,None,"window_main.ui","window_main.ui",None,None,None,None,None,None) + + + (2,"gtk","4.0",None), + (3,"gtk","4.0",None), + (4,"gtk","4.0",None), + (5,"gtk","4.0",None) + + + (2,1,"GtkPopover","popover_select",None,None,None,None,None), + (2,2,"GtkBox",None,1,None,None,None,None), + (2,3,"GtkButton","button_select_all",2,None,None,None,None), + (2,4,"GtkSeparator",None,2,None,None,None,1), + (2,5,"GtkButton","button_select_reverse",2,None,None,None,2), + (2,6,"GtkSeparator",None,2,None,None,None,3), + (2,7,"GtkButton","button_select_custom",2,None,None,None,4), + (2,8,"GtkButton","button_unselect_custom",2,None,None,None,5), + (2,9,"GtkSeparator",None,2,None,None,None,6), + (2,10,"GtkButton","button_select_changed",2,None,None,None,7), + (2,11,"GtkButton","button_unselect_changed",2,None,None,None,8), + (3,1,"GtkTextBuffer","textbuffer1",None,None,None,None,None), + (3,2,"GtkWindow","window_with_rules",None,None,None,None,None), + (3,3,"GtkBox",None,2,None,None,None,None), + (3,4,"GtkBox",None,3,None,None,None,None), + (3,5,"GtkNotebook","notebook_choose_rule",4,None,None,None,None), + (3,6,"GtkNotebookPage",None,5,None,None,None,None), + (3,7,"GtkBox",None,6,None,None,None,None), + (3,8,"GtkTextView",None,7,None,None,None,None), + (3,9,"GtkEntry","entry_custom_text_to_change",7,None,None,None,1), + (3,10,"GtkLabel",None,6,None,None,None,None), + (3,11,"GtkNotebookPage",None,5,None,None,None,1), + (3,12,"GtkBox",None,11,None,None,None,None), + (3,13,"GtkBox",None,12,None,None,None,None), + (3,14,"GtkLabel",None,13,None,None,None,None), + (3,15,"GtkBox",None,13,None,None,None,1), + (3,16,"GtkCheckButton","check_button_letters_type_uppercase",15,None,None,None,None), + (3,17,"GtkCheckButton","check_button_letters_type_lowercase",15,None,None,None,1), + (3,18,"GtkBox",None,12,None,None,None,1), + (3,19,"GtkLabel",None,18,None,None,None,None), + (3,20,"GtkBox",None,18,None,None,None,1), + (3,21,"GtkCheckButton","check_button_letters_usage_name",20,None,None,None,None), + (3,22,"GtkCheckButton","check_button_letters_usage_extension",20,None,None,None,1), + (3,23,"GtkCheckButton","check_button_letters_usage_both",20,None,None,None,2), + (3,24,"GtkLabel",None,11,None,None,None,None), + (3,25,"GtkNotebookPage",None,5,None,None,None,2), + (3,26,"GtkBox",None,25,None,None,None,None), + (3,27,"GtkBox",None,26,None,None,None,None), + (3,28,"GtkLabel",None,27,None,None,None,None), + (3,29,"GtkBox",None,27,None,None,None,1), + (3,30,"GtkCheckButton","check_button_purge_name",29,None,None,None,None), + (3,31,"GtkCheckButton","check_button_purge_extension",29,None,None,None,1), + (3,32,"GtkCheckButton","check_button_purge_both",29,None,None,None,2), + (3,33,"GtkLabel",None,25,None,None,None,None), + (3,34,"GtkNotebookPage",None,5,None,None,None,3), + (3,35,"GtkBox",None,34,None,None,None,None), + (3,36,"GtkBox",None,35,None,None,None,None), + (3,37,"GtkLabel",None,36,None,None,None,None), + (3,38,"GtkBox",None,36,None,None,None,1), + (3,39,"GtkCheckButton","check_button_add_number_before_name",38,None,None,None,None), + (3,40,"GtkCheckButton","check_button_add_number_after_name",38,None,None,None,1), + (3,41,"GtkBox",None,35,None,None,None,1), + (3,42,"GtkLabel",None,41,None,None,None,None), + (3,43,"GtkGrid",None,41,None,None,None,1), + (3,44,"GtkLabel",None,43,None,None,None,None), + (3,45,"GtkLabel",None,43,None,None,None,1), + (3,46,"GtkEntry","entry_add_number_start_number",43,None,None,None,2), + (3,47,"GtkEntry","entry_add_number_step",43,None,None,None,3), + (3,48,"GtkLabel",None,43,None,None,None,4), + (3,49,"GtkEntry","entry_add_number_zeros",43,None,None,None,5), + (3,50,"GtkLabel",None,34,None,None,None,None), + (3,51,"GtkNotebookPage",None,5,None,None,None,4), + (3,52,"GtkBox",None,51,None,None,None,None), + (3,53,"GtkBox",None,52,None,None,None,None), + (3,54,"GtkLabel",None,53,None,None,None,None), + (3,55,"GtkBox",None,53,None,None,None,1), + (3,56,"GtkCheckButton","check_button_add_text_before_name",55,None,None,None,None), + (3,57,"GtkCheckButton","check_button_add_text_after_name",55,None,None,None,1), + (3,58,"GtkBox",None,52,None,None,None,1), + (3,59,"GtkLabel",None,58,None,None,None,None), + (3,60,"GtkEntry","entry_add_text_text_to_add",58,None,None,None,1), + (3,61,"GtkLabel",None,51,None,None,None,None), + (3,62,"GtkNotebookPage",None,5,None,None,None,5), + (3,63,"GtkBox",None,62,None,None,None,None), + (3,64,"GtkBox",None,63,None,None,None,None), + (3,65,"GtkLabel",None,64,None,None,None,None), + (3,66,"GtkBox",None,64,None,None,None,1), + (3,67,"GtkCheckButton","check_button_replace_name",66,None,None,None,None), + (3,68,"GtkCheckButton","check_button_replace_extension",66,None,None,None,1), + (3,69,"GtkCheckButton","check_button_replace_both",66,None,None,None,2), + (3,70,"GtkBox",None,64,None,None,None,2), + (3,71,"GtkLabel",None,70,None,None,None,None), + (3,72,"GtkBox",None,70,None,None,None,1), + (3,73,"GtkCheckButton","check_button_replace_case_sensitive",72,None,None,None,None), + (3,74,"GtkCheckButton","check_button_replace_case_insensitive",72,None,None,None,1), + (3,75,"GtkGrid",None,64,None,None,None,3), + (3,76,"GtkLabel",None,75,None,None,None,None), + (3,77,"GtkEntry","entry_replace_text_to_change",75,None,None,None,1), + (3,78,"GtkEntry","entry_replace_text_to_remove",75,None,None,None,2), + (3,79,"GtkLabel",None,75,None,None,None,3), + (3,80,"GtkLabel",None,75,None,None,None,4), + (3,81,"GtkLabel",None,62,None,None,None,None), + (3,82,"GtkNotebookPage",None,5,None,None,None,6), + (3,83,"GtkBox",None,82,None,None,None,None), + (3,84,"GtkBox",None,83,None,None,None,None), + (3,85,"GtkLabel",None,84,None,None,None,None), + (3,86,"GtkBox",None,84,None,None,None,1), + (3,87,"GtkCheckButton","check_button_trim_name_start",86,None,None,None,None), + (3,88,"GtkCheckButton","check_button_trim_name_end",86,None,None,None,1), + (3,89,"GtkCheckButton","check_button_trim_extension_start",86,None,None,None,2), + (3,90,"GtkCheckButton","check_button_trim_extension_end",86,None,None,None,3), + (3,91,"GtkBox",None,83,None,None,None,1), + (3,92,"GtkLabel",None,91,None,None,None,None), + (3,93,"GtkBox",None,91,None,None,None,1), + (3,94,"GtkCheckButton","check_button_trim_case_sensitive",93,None,None,None,None), + (3,95,"GtkCheckButton","check_button_trim_case_insensitive",93,None,None,None,1), + (3,96,"GtkBox",None,83,None,None,None,2), + (3,97,"GtkLabel",None,96,None,None,None,None), + (3,98,"GtkEntry","entry_add_text_text_to_trim",96,None,None,None,1), + (3,99,"GtkLabel",None,82,None,None,None,None), + (3,100,"GtkNotebookPage",None,5,None,None,None,7), + (3,101,"GtkBox",None,100,None,None,None,None), + (3,102,"GtkLabel",None,101,None,None,None,None), + (3,103,"GtkLabel",None,101,None,None,None,1), + (3,104,"GtkBox",None,101,None,None,None,2), + (3,105,"GtkCheckButton","check_button_normalize_everything",104,None,None,None,None), + (3,106,"GtkCheckButton","check_button_normalize_partial",104,None,None,None,1), + (3,107,"GtkLabel",None,100,None,None,None,None), + (3,108,"GtkBox",None,4,None,None,None,1), + (3,109,"GtkLabel",None,108,None,None,None,None), + (3,110,"GtkBox",None,108,None,None,None,1), + (3,111,"GtkBox",None,110,None,None,None,None), + (3,112,"GtkBox",None,111,None,None,None,None), + (3,113,"GtkLabel",None,112,None,None,None,None), + (3,114,"GtkLabel",None,112,None,None,None,1), + (3,115,"GtkBox",None,111,None,None,None,1), + (3,116,"GtkEntry","entry_example_before",115,None,None,None,None), + (3,117,"GtkLabel","label_example_after",115,None,None,None,1), + (3,118,"GtkButton","button_example_reset",110,None,None,None,1), + (3,119,"GtkImage",None,118,None,None,None,None), + (3,120,"GtkButton","button_rule_window_add",4,None,None,None,2), + (4,1,"GtkDialog","window_settings",None,None,None,None,None), + (4,2,"GtkBox",None,1,None,None,None,None), + (4,3,"GtkLabel","label_settings_general_language",2,None,None,None,None), + (4,4,"GtkComboBoxText","combo_box_settings_language",2,None,None,None,1), + (5,1,"GtkWindow","window_main",None,None,None,None,None), + (5,45,"GtkHeaderBar",None,1,None,"titlebar",None,None), + (5,46,"GtkBox",None,45,None,None,None,None), + (5,47,"GtkButton","button_start_rename",46,None,None,None,None), + (5,48,"GtkButton","button_setting",46,None,None,None,1), + (5,49,"GtkImage",None,48,None,None,None,None), + (5,50,"GtkBox",None,1,None,None,None,1), + (5,51,"GtkLabel","label_files_folders",50,None,None,None,None), + (5,52,"GtkBox",None,50,None,None,None,1), + (5,53,"GtkScrolledWindow","scrolled_window_results",52,None,None,None,None), + (5,54,"GtkBox",None,52,None,None,None,1), + (5,55,"GtkButton","button_add_files",54,None,None,None,None), + (5,56,"GtkButton","button_add_folders",54,None,None,None,1), + (5,57,"GtkButton","button_remove_selection",54,None,None,None,2), + (5,59,"GtkButton","button_update_names",54,None,None,None,5), + (5,60,"GtkButton","button_results_one_up",54,None,None,None,6), + (5,61,"GtkBox",None,60,None,None,None,None), + (5,62,"GtkImage",None,61,None,None,None,None), + (5,63,"GtkLabel",None,61,None,None,None,1), + (5,64,"GtkButton","button_results_one_down",54,None,None,None,7), + (5,65,"GtkBox",None,64,None,None,None,None), + (5,66,"GtkImage",None,65,None,None,None,None), + (5,67,"GtkLabel",None,65,None,None,None,1), + (5,68,"GtkLabel",None,50,None,None,None,2), + (5,69,"GtkBox",None,50,None,None,None,3), + (5,70,"GtkBox",None,69,None,None,None,None), + (5,71,"GtkButton","button_add_rule",70,None,None,None,None), + (5,72,"GtkBox",None,71,None,None,None,None), + (5,73,"GtkImage",None,72,None,None,None,None), + (5,74,"GtkLabel",None,72,None,None,None,1), + (5,75,"GtkButton","button_edit_rule",70,None,None,None,1), + (5,76,"GtkBox",None,75,None,None,None,None), + (5,77,"GtkImage",None,76,None,None,None,None), + (5,78,"GtkLabel",None,76,None,None,None,1), + (5,79,"GtkButton","button_remove_rule",70,None,None,None,2), + (5,80,"GtkBox",None,79,None,None,None,None), + (5,81,"GtkImage",None,80,None,None,None,None), + (5,82,"GtkLabel",None,80,None,None,None,1), + (5,83,"GtkButton","button_rule_one_up",70,None,None,None,3), + (5,84,"GtkBox",None,83,None,None,None,None), + (5,85,"GtkImage",None,84,None,None,None,None), + (5,86,"GtkLabel",None,84,None,None,None,1), + (5,87,"GtkButton","button_rule_one_down",70,None,None,None,4), + (5,88,"GtkBox",None,87,None,None,None,None), + (5,89,"GtkImage",None,88,None,None,None,None), + (5,90,"GtkLabel",None,88,None,None,None,1), + (5,91,"GtkScrolledWindow","scrolled_window_rules",69,None,None,None,1), + (5,92,"GtkMenuButton","menu_button_select_popup",54,None,None,None,4) + + + (2,1,"GtkPopover","child",None,None,None,None,None,2), + (2,2,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (2,3,"GtkButton","label","Select All","yes",None,None,None,None), + (2,3,"GtkWidget","focusable","1",None,None,None,None,None), + (2,3,"GtkWidget","receives-default","1",None,None,None,None,None), + (2,5,"GtkButton","label","Reverse Selection","yes",None,None,None,None), + (2,5,"GtkWidget","focusable","1",None,None,None,None,None), + (2,5,"GtkWidget","receives-default","1",None,None,None,None,None), + (2,7,"GtkButton","label","Select Custom","yes",None,None,None,None), + (2,7,"GtkWidget","focusable","1",None,None,None,None,None), + (2,7,"GtkWidget","receives-default","1",None,None,None,None,None), + (2,8,"GtkButton","label","Unselect Custom","yes",None,None,None,None), + (2,8,"GtkWidget","focusable","1",None,None,None,None,None), + (2,8,"GtkWidget","receives-default","1",None,None,None,None,None), + (2,10,"GtkButton","label","Select Changed","yes",None,None,None,None), + (2,10,"GtkWidget","focusable","1",None,None,None,None,None), + (2,10,"GtkWidget","receives-default","1",None,None,None,None,None), + (2,11,"GtkButton","label","Unselect Changed","yes",None,None,None,None), + (2,11,"GtkWidget","focusable","1",None,None,None,None,None), + (2,11,"GtkWidget","receives-default","1",None,None,None,None,None), + (3,1,"GtkTextBuffer","text","$(NAME) - prints file name\n$(EXT) - prints extension\n$(MODIF) - prints file modification date\n$(CREAT) - prints file creation\n$(CURR) - prints current file name with extension\n$(N:6:3:2) - prints numbers with step 3, \nstarts with 6 and fill with zeros to 2 numbers -> 06,09,12 etc. ","yes",None,None,None,None), + (3,2,"GtkWindow","child",None,None,None,None,None,3), + (3,2,"GtkWindow","default-height","400",None,None,None,None,None), + (3,2,"GtkWindow","default-width","600",None,None,None,None,None), + (3,3,"GtkBox","spacing","2",None,None,None,None,None), + (3,3,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,4,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,4,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,4,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,4,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,4,"GtkWidget","margin-top","5",None,None,None,None,None), + (3,4,"GtkWidget","vexpand","1",None,None,None,None,None), + (3,5,"GtkNotebook","tab-pos","left",None,None,None,None,None), + (3,5,"GtkWidget","focusable","1",None,None,None,None,None), + (3,5,"GtkWidget","vexpand","1",None,None,None,None,None), + (3,6,"GtkNotebookPage","child",None,None,None,None,None,7), + (3,6,"GtkNotebookPage","tab",None,None,None,None,None,10), + (3,7,"GtkBox","spacing","2",None,None,None,None,None), + (3,7,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,7,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,7,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,7,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,8,"GtkTextView","buffer","1",None,None,None,None,None), + (3,8,"GtkTextView","justification","center",None,None,None,None,None), + (3,8,"GtkWidget","focusable","1",None,None,None,None,None), + (3,9,"GtkEditable","text","$(CURR)","yes",None,None,None,None), + (3,9,"GtkEntry","max-length","150",None,None,None,None,None), + (3,9,"GtkWidget","focusable","1",None,None,None,None,None), + (3,10,"GtkLabel","label","Custom","yes",None,None,None,None), + (3,11,"GtkNotebookPage","child",None,None,None,None,None,12), + (3,11,"GtkNotebookPage","tab",None,None,None,None,None,24), + (3,12,"GtkBox","spacing","2",None,None,None,None,None), + (3,12,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,12,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,12,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,12,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,13,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,14,"GtkLabel","label","Tool Type:","yes",None,None,None,None), + (3,16,"GtkCheckButton","active","1",None,None,None,None,None), + (3,16,"GtkCheckButton","label","Uppercase","yes",None,None,None,None), + (3,16,"GtkWidget","focusable","1",None,None,None,None,None), + (3,16,"GtkWidget","halign","center",None,None,None,None,None), + (3,16,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,17,"GtkCheckButton","label","Lowercase","yes",None,None,None,None), + (3,17,"GtkWidget","focusable","1",None,None,None,None,None), + (3,17,"GtkWidget","halign","center",None,None,None,None,None), + (3,17,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,18,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,19,"GtkLabel","label","Usage Type:","yes",None,None,None,None), + (3,21,"GtkCheckButton","active","1",None,None,None,None,None), + (3,21,"GtkCheckButton","label","Only Name","yes",None,None,None,None), + (3,21,"GtkWidget","focusable","1",None,None,None,None,None), + (3,21,"GtkWidget","halign","center",None,None,None,None,None), + (3,21,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,22,"GtkCheckButton","label","Only Extension","yes",None,None,None,None), + (3,22,"GtkWidget","focusable","1",None,None,None,None,None), + (3,22,"GtkWidget","halign","center",None,None,None,None,None), + (3,22,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,23,"GtkCheckButton","label","Both","yes",None,None,None,None), + (3,23,"GtkWidget","focusable","1",None,None,None,None,None), + (3,23,"GtkWidget","halign","center",None,None,None,None,None), + (3,23,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,24,"GtkLabel","label","Upper/Lower cases","yes",None,None,None,None), + (3,25,"GtkNotebookPage","child",None,None,None,None,None,26), + (3,25,"GtkNotebookPage","tab",None,None,None,None,None,33), + (3,26,"GtkBox","spacing","2",None,None,None,None,None), + (3,26,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,26,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,26,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,26,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,27,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,28,"GtkLabel","label","Usage Type:","yes",None,None,None,None), + (3,30,"GtkCheckButton","active","1",None,None,None,None,None), + (3,30,"GtkCheckButton","label","Only Name","yes",None,None,None,None), + (3,30,"GtkWidget","focusable","1",None,None,None,None,None), + (3,30,"GtkWidget","halign","center",None,None,None,None,None), + (3,30,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,31,"GtkCheckButton","label","Only Extension","yes",None,None,None,None), + (3,31,"GtkWidget","focusable","1",None,None,None,None,None), + (3,31,"GtkWidget","halign","center",None,None,None,None,None), + (3,31,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,32,"GtkCheckButton","label","Both","yes",None,None,None,None), + (3,32,"GtkWidget","focusable","1",None,None,None,None,None), + (3,32,"GtkWidget","halign","center",None,None,None,None,None), + (3,32,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,33,"GtkLabel","label","Purge","yes",None,None,None,None), + (3,34,"GtkNotebookPage","child",None,None,None,None,None,35), + (3,34,"GtkNotebookPage","tab",None,None,None,None,None,50), + (3,35,"GtkBox","spacing","2",None,None,None,None,None), + (3,35,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,35,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,35,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,35,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,36,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,37,"GtkLabel","label","Place to put number:","yes",None,None,None,None), + (3,39,"GtkCheckButton","active","1",None,None,None,None,None), + (3,39,"GtkCheckButton","label","Before Name","yes",None,None,None,None), + (3,39,"GtkWidget","focusable","1",None,None,None,None,None), + (3,39,"GtkWidget","halign","center",None,None,None,None,None), + (3,39,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,40,"GtkCheckButton","label","After Name","yes",None,None,None,None), + (3,40,"GtkWidget","focusable","1",None,None,None,None,None), + (3,40,"GtkWidget","halign","center",None,None,None,None,None), + (3,40,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,41,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,42,"GtkLabel","label","Number Settings:","yes",None,None,None,None), + (3,43,"GtkGrid","column-homogeneous","1",None,None,None,None,None), + (3,44,"GtkLabel","label","Start Number","yes",None,None,None,None), + (3,45,"GtkLabel","label","Step","yes",None,None,None,None), + (3,46,"GtkEditable","text","1","yes",None,None,None,None), + (3,46,"GtkEntry","input-purpose","digits",None,None,None,None,None), + (3,46,"GtkEntry","max-length","30",None,None,None,None,None), + (3,46,"GtkWidget","focusable","1",None,None,None,None,None), + (3,47,"GtkEditable","text","1","yes",None,None,None,None), + (3,47,"GtkEntry","input-purpose","digits",None,None,None,None,None), + (3,47,"GtkEntry","max-length","30",None,None,None,None,None), + (3,47,"GtkWidget","focusable","1",None,None,None,None,None), + (3,48,"GtkLabel","label","Fill with zeros","yes",None,None,None,None), + (3,49,"GtkEditable","text","0","yes",None,None,None,None), + (3,49,"GtkEntry","input-purpose","digits",None,None,None,None,None), + (3,49,"GtkEntry","max-length","4",None,None,None,None,None), + (3,49,"GtkWidget","focusable","1",None,None,None,None,None), + (3,50,"GtkLabel","label","Add Number","yes",None,None,None,None), + (3,51,"GtkNotebookPage","child",None,None,None,None,None,52), + (3,51,"GtkNotebookPage","tab",None,None,None,None,None,61), + (3,52,"GtkBox","spacing","2",None,None,None,None,None), + (3,52,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,52,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,52,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,52,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,53,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,54,"GtkLabel","label","Usage Type:","yes",None,None,None,None), + (3,56,"GtkCheckButton","active","1",None,None,None,None,None), + (3,56,"GtkCheckButton","label","Before Name","yes",None,None,None,None), + (3,56,"GtkWidget","focusable","1",None,None,None,None,None), + (3,56,"GtkWidget","halign","center",None,None,None,None,None), + (3,56,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,57,"GtkCheckButton","label","After Name","yes",None,None,None,None), + (3,57,"GtkWidget","focusable","1",None,None,None,None,None), + (3,57,"GtkWidget","halign","center",None,None,None,None,None), + (3,57,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,58,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,59,"GtkLabel","label","Text to add:","yes",None,None,None,None), + (3,60,"GtkEditable","text","Źdźbło","yes",None,None,None,None), + (3,60,"GtkWidget","focusable","1",None,None,None,None,None), + (3,61,"GtkLabel","label","Add Text","yes",None,None,None,None), + (3,62,"GtkNotebookPage","child",None,None,None,None,None,63), + (3,62,"GtkNotebookPage","tab",None,None,None,None,None,81), + (3,63,"GtkBox","spacing","2",None,None,None,None,None), + (3,63,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,63,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,63,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,63,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,64,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,65,"GtkLabel","label","Usage Type:","yes",None,None,None,None), + (3,67,"GtkCheckButton","active","1",None,None,None,None,None), + (3,67,"GtkCheckButton","label","Only Name","yes",None,None,None,None), + (3,67,"GtkWidget","focusable","1",None,None,None,None,None), + (3,67,"GtkWidget","halign","center",None,None,None,None,None), + (3,67,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,68,"GtkCheckButton","label","Only Extension","yes",None,None,None,None), + (3,68,"GtkWidget","focusable","1",None,None,None,None,None), + (3,68,"GtkWidget","halign","center",None,None,None,None,None), + (3,68,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,69,"GtkCheckButton","label","Both","yes",None,None,None,None), + (3,69,"GtkWidget","focusable","1",None,None,None,None,None), + (3,69,"GtkWidget","halign","center",None,None,None,None,None), + (3,69,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,70,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,71,"GtkLabel","label","Case Sensitivity","yes",None,None,None,None), + (3,73,"GtkCheckButton","active","1",None,None,None,None,None), + (3,73,"GtkCheckButton","label","Case Sensitive","yes",None,None,None,None), + (3,73,"GtkWidget","focusable","1",None,None,None,None,None), + (3,73,"GtkWidget","halign","center",None,None,None,None,None), + (3,73,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,74,"GtkCheckButton","label","Case Insensitive","yes",None,None,None,None), + (3,74,"GtkWidget","focusable","1",None,None,None,None,None), + (3,74,"GtkWidget","halign","center",None,None,None,None,None), + (3,74,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,75,"GtkGrid","column-homogeneous","1",None,None,None,None,None), + (3,76,"GtkLabel","label","Replaced Text","yes",None,None,None,None), + (3,77,"GtkEditable","text","k","yes",None,None,None,None), + (3,77,"GtkEntry","max-length","100",None,None,None,None,None), + (3,77,"GtkWidget","focusable","1",None,None,None,None,None), + (3,78,"GtkEditable","text","a","yes",None,None,None,None), + (3,78,"GtkEntry","max-length","100",None,None,None,None,None), + (3,78,"GtkWidget","focusable","1",None,None,None,None,None), + (3,79,"GtkLabel","label","Text to replace","yes",None,None,None,None), + (3,80,"GtkLabel","label","Replacing Strings:","yes",None,None,None,None), + (3,81,"GtkLabel","label","Replace","yes",None,None,None,None), + (3,82,"GtkNotebookPage","child",None,None,None,None,None,83), + (3,82,"GtkNotebookPage","tab",None,None,None,None,None,99), + (3,83,"GtkBox","spacing","2",None,None,None,None,None), + (3,83,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,83,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,83,"GtkWidget","margin-end","5",None,None,None,None,None), + (3,83,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,84,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,85,"GtkLabel","label","Usage Type:","yes",None,None,None,None), + (3,87,"GtkCheckButton","active","1",None,None,None,None,None), + (3,87,"GtkCheckButton","label","Name Start","yes",None,None,None,None), + (3,87,"GtkWidget","focusable","1",None,None,None,None,None), + (3,87,"GtkWidget","halign","center",None,None,None,None,None), + (3,87,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,88,"GtkCheckButton","label","Name End","yes",None,None,None,None), + (3,88,"GtkWidget","focusable","1",None,None,None,None,None), + (3,88,"GtkWidget","halign","center",None,None,None,None,None), + (3,88,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,89,"GtkCheckButton","label","Extension Start","yes",None,None,None,None), + (3,89,"GtkWidget","focusable","1",None,None,None,None,None), + (3,89,"GtkWidget","halign","center",None,None,None,None,None), + (3,89,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,90,"GtkCheckButton","label","Extension End","yes",None,None,None,None), + (3,90,"GtkWidget","focusable","1",None,None,None,None,None), + (3,90,"GtkWidget","halign","center",None,None,None,None,None), + (3,90,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,91,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,92,"GtkLabel","label","Case Sensitivity","yes",None,None,None,None), + (3,94,"GtkCheckButton","active","1",None,None,None,None,None), + (3,94,"GtkCheckButton","label","Case Sensitive","yes",None,None,None,None), + (3,94,"GtkWidget","focusable","1",None,None,None,None,None), + (3,94,"GtkWidget","halign","center",None,None,None,None,None), + (3,94,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,95,"GtkCheckButton","label","Case Insensitive","yes",None,None,None,None), + (3,95,"GtkWidget","focusable","1",None,None,None,None,None), + (3,95,"GtkWidget","halign","center",None,None,None,None,None), + (3,95,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,96,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,97,"GtkLabel","label","Trim text","yes",None,None,None,None), + (3,98,"GtkWidget","focusable","1",None,None,None,None,None), + (3,99,"GtkLabel","label","Trim","yes",None,None,None,None), + (3,100,"GtkNotebookPage","child",None,None,None,None,None,101), + (3,100,"GtkNotebookPage","tab",None,None,None,None,None,107), + (3,101,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,102,"GtkLabel","label","Normalize Name","yes",None,None,None,None), + (3,102,"GtkWidget","margin-bottom","10",None,None,None,None,None), + (3,103,"GtkLabel","label","Everything - renames the name to one that containsonly the\n characters `a-z`, `0-9`, `-`, ` `, `.`.\n e.g. `żółć CZERona.Txt` -> `zolc-czerwona.txt`\n\nPartial - works exacly same as option above, but allows\n to use spaces ` ` and big letters `A-Z`\n e.g. ` Źrebię Krokietowe.Rar ` -> `Zrebie Krokietowe.Rar`","yes",None,None,None,None), + (3,103,"GtkWidget","halign","start",None,None,None,None,None), + (3,103,"GtkWidget","margin-bottom","10",None,None,None,None,None), + (3,103,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,105,"GtkCheckButton","active","1",None,None,None,None,None), + (3,105,"GtkCheckButton","label","Everything","yes",None,None,None,None), + (3,105,"GtkWidget","focusable","1",None,None,None,None,None), + (3,105,"GtkWidget","halign","center",None,None,None,None,None), + (3,105,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,106,"GtkCheckButton","active","1",None,None,None,None,None), + (3,106,"GtkCheckButton","label","Partial","yes",None,None,None,None), + (3,106,"GtkWidget","focusable","1",None,None,None,None,None), + (3,106,"GtkWidget","halign","center",None,None,None,None,None), + (3,106,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,107,"GtkLabel","label","Normalize Name","yes",None,None,None,None), + (3,108,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,109,"GtkLabel","label","EXAMPLE","yes",None,None,None,None), + (3,109,"GtkWidget","margin-bottom","5",None,None,None,None,None), + (3,109,"GtkWidget","margin-top","5",None,None,None,None,None), + (3,111,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,112,"GtkBox","homogeneous","1",None,None,None,None,None), + (3,112,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,112,"GtkWidget","margin-end","10",None,None,None,None,None), + (3,112,"GtkWidget","margin-start","10",None,None,None,None,None), + (3,113,"GtkLabel","label","Before:","yes",None,None,None,None), + (3,114,"GtkLabel","label","After:","yes",None,None,None,None), + (3,115,"GtkBox","homogeneous","1",None,None,None,None,None), + (3,115,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (3,115,"GtkWidget","hexpand","1",None,None,None,None,None), + (3,116,"GtkEntry","max-length","100",None,None,None,None,None), + (3,116,"GtkWidget","focusable","1",None,None,None,None,None), + (3,117,"GtkLabel","label","label","yes",None,None,None,None), + (3,117,"GtkWidget","halign","start",None,None,None,None,None), + (3,117,"GtkWidget","margin-start","3",None,None,None,None,None), + (3,118,"GtkWidget","focusable","1",None,None,None,None,None), + (3,118,"GtkWidget","margin-start","5",None,None,None,None,None), + (3,118,"GtkWidget","receives-default","1",None,None,None,None,None), + (3,119,"GtkImage","icon-name","edit-delete",None,None,None,None,None), + (3,120,"GtkButton","label","Rule Add",None,None,None,None,None), + (3,120,"GtkWidget","halign","end",None,None,None,None,None), + (4,3,"GtkLabel","label","Language","yes",None,None,None,None), + (4,3,"GtkWidget","margin-end","10",None,None,None,None,None), + (4,3,"GtkWidget","margin-start","5",None,None,None,None,None), + (4,4,"GtkWidget","hexpand","1",None,None,None,None,None), + (5,1,"GtkWindow","default-height","600",None,None,None,None,None), + (5,1,"GtkWindow","default-width","800",None,None,None,None,None), + (5,47,"GtkButton","label","Start Renaming","yes",None,None,None,None), + (5,47,"GtkWidget","focusable","1",None,None,None,None,None), + (5,47,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,48,"GtkWidget","focusable","1",None,None,None,None,None), + (5,48,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,49,"GtkImage","icon-name","applications-engineering",None,None,None,None,None), + (5,50,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,51,"GtkLabel","label","Files/Folders","yes",None,None,None,None), + (5,52,"GtkWidget","vexpand","1",None,None,None,None,None), + (5,53,"GtkWidget","focusable","1",None,None,None,None,None), + (5,53,"GtkWidget","hexpand","1",None,None,None,None,None), + (5,54,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,55,"GtkButton","label","Add Files","yes",None,None,None,None), + (5,55,"GtkWidget","focusable","1",None,None,None,None,None), + (5,55,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,56,"GtkButton","label","Add Folders","yes",None,None,None,None), + (5,56,"GtkWidget","focusable","1",None,None,None,None,None), + (5,56,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,57,"GtkButton","label","Remove Selection","yes",None,None,None,None), + (5,57,"GtkWidget","focusable","1",None,None,None,None,None), + (5,57,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,59,"GtkButton","label","Update Names","yes",None,None,None,None), + (5,59,"GtkWidget","focusable","1",None,None,None,None,None), + (5,59,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,60,"GtkWidget","focusable","1",None,None,None,None,None), + (5,60,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,61,"GtkBox","spacing","7",None,None,None,None,None), + (5,61,"GtkWidget","halign","center",None,None,None,None,None), + (5,62,"GtkImage","icon-name","go-up",None,None,None,None,None), + (5,63,"GtkLabel","label","One Up","yes",None,None,None,None), + (5,64,"GtkWidget","focusable","1",None,None,None,None,None), + (5,64,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,65,"GtkBox","spacing","7",None,None,None,None,None), + (5,65,"GtkWidget","halign","center",None,None,None,None,None), + (5,66,"GtkImage","icon-name","go-down",None,None,None,None,None), + (5,67,"GtkLabel","label","One Down","yes",None,None,None,None), + (5,68,"GtkLabel","label","Rules",None,None,None,None,None), + (5,68,"GtkWidget","valign","end",None,None,None,None,None), + (5,69,"GtkWidget","vexpand","1",None,None,None,None,None), + (5,70,"GtkOrientable","orientation","vertical",None,None,None,None,None), + (5,71,"GtkWidget","focusable","1",None,None,None,None,None), + (5,71,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,72,"GtkBox","spacing","7",None,None,None,None,None), + (5,72,"GtkWidget","halign","center",None,None,None,None,None), + (5,73,"GtkImage","icon-name","list-add-symbolic",None,None,None,None,None), + (5,73,"GtkWidget","visible","0",None,None,None,None,None), + (5,74,"GtkLabel","label","Add Rule","yes",None,None,None,None), + (5,75,"GtkWidget","focusable","1",None,None,None,None,None), + (5,75,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,76,"GtkBox","spacing","7",None,None,None,None,None), + (5,76,"GtkWidget","halign","center",None,None,None,None,None), + (5,77,"GtkImage","icon-name","applications-engineering",None,None,None,None,None), + (5,77,"GtkWidget","visible","0",None,None,None,None,None), + (5,78,"GtkLabel","label","Edit Rule","yes",None,None,None,None), + (5,79,"GtkWidget","focusable","1",None,None,None,None,None), + (5,79,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,80,"GtkBox","spacing","7",None,None,None,None,None), + (5,80,"GtkWidget","halign","center",None,None,None,None,None), + (5,81,"GtkImage","icon-name","list-remove",None,None,None,None,None), + (5,81,"GtkWidget","visible","0",None,None,None,None,None), + (5,82,"GtkLabel","label","Remove Rule","yes",None,None,None,None), + (5,83,"GtkWidget","focusable","1",None,None,None,None,None), + (5,83,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,84,"GtkBox","spacing","7",None,None,None,None,None), + (5,84,"GtkWidget","halign","center",None,None,None,None,None), + (5,85,"GtkImage","icon-name","go-up",None,None,None,None,None), + (5,86,"GtkLabel","label","One Up","yes",None,None,None,None), + (5,87,"GtkWidget","focusable","1",None,None,None,None,None), + (5,87,"GtkWidget","receives-default","1",None,None,None,None,None), + (5,88,"GtkBox","spacing","7",None,None,None,None,None), + (5,88,"GtkWidget","halign","center",None,None,None,None,None), + (5,89,"GtkImage","icon-name","go-down",None,None,None,None,None), + (5,90,"GtkLabel","label","One Down","yes",None,None,None,None), + (5,91,"GtkWidget","focusable","1",None,None,None,None,None), + (5,91,"GtkWidget","hexpand","1",None,None,None,None,None), + (5,92,"GtkMenuButton","direction","none",None,None,None,None,None), + (5,92,"GtkMenuButton","label","Select",None,None,None,None,None) + + + (3,43,44,"GtkGridLayoutChild","column","0",None,None,None,None), + (3,43,44,"GtkGridLayoutChild","row","0",None,None,None,None), + (3,43,45,"GtkGridLayoutChild","column","0",None,None,None,None), + (3,43,45,"GtkGridLayoutChild","row","1",None,None,None,None), + (3,43,46,"GtkGridLayoutChild","column","1",None,None,None,None), + (3,43,46,"GtkGridLayoutChild","row","0",None,None,None,None), + (3,43,47,"GtkGridLayoutChild","column","1",None,None,None,None), + (3,43,47,"GtkGridLayoutChild","row","1",None,None,None,None), + (3,43,48,"GtkGridLayoutChild","column","0",None,None,None,None), + (3,43,48,"GtkGridLayoutChild","row","2",None,None,None,None), + (3,43,49,"GtkGridLayoutChild","column","1",None,None,None,None), + (3,43,49,"GtkGridLayoutChild","row","2",None,None,None,None), + (3,75,76,"GtkGridLayoutChild","column","0",None,None,None,None), + (3,75,76,"GtkGridLayoutChild","row","2",None,None,None,None), + (3,75,77,"GtkGridLayoutChild","column","1",None,None,None,None), + (3,75,77,"GtkGridLayoutChild","row","2",None,None,None,None), + (3,75,78,"GtkGridLayoutChild","column","1",None,None,None,None), + (3,75,78,"GtkGridLayoutChild","row","1",None,None,None,None), + (3,75,79,"GtkGridLayoutChild","column","0",None,None,None,None), + (3,75,79,"GtkGridLayoutChild","row","1",None,None,None,None), + (3,75,80,"GtkGridLayoutChild","column","0",None,None,None,None), + (3,75,80,"GtkGridLayoutChild","column-span","2",None,None,None,None), + (3,75,80,"GtkGridLayoutChild","row","0",None,None,None,None) + + diff --git a/ui/popover.ui b/ui/popover.ui index 2f5518d..e993d03 100644 --- a/ui/popover.ui +++ b/ui/popover.ui @@ -1,126 +1,64 @@ - - + + - + + - False - + - True - False vertical + 1 Select All - True - True - True + 1 - - False - True - 0 - - - True - False - - - False - True - 1 - + + 1 Reverse Selection - True - True - True + 1 - - False - True - 2 - - - True - False - - - False - True - 3 - + + 1 Select Custom - True - True - True + 1 - - False - True - 4 - + 1 Unselect Custom - True - True - True + 1 - - False - True - 5 - - - True - False - - - False - True - 6 - + + 1 Select Changed - True - True - True + 1 - - False - True - 7 - + 1 Unselect Changed - True - True - True + 1 - - False - True - 8 - - + diff --git a/ui/rule_chooser.ui b/ui/rule_chooser.ui index 0d52888..478a96f 100644 --- a/ui/rule_chooser.ui +++ b/ui/rule_chooser.ui @@ -1,7 +1,8 @@ - - + + - + + $(NAME) - prints file name $(EXT) - prints extension @@ -12,1446 +13,786 @@ $(N:6:3:2) - prints numbers with step 3, starts with 6 and fill with zeros to 2 numbers -> 06,09,12 etc. - False - 600 - 400 - + - True - False vertical 2 - True - False - 5 + 5 5 + 5 5 - 5 vertical + 1 - True - True + 1 left + 1 - - True - False - 5 - 5 - 5 - vertical - 2 - - - True - True - center - textbuffer1 + + + + 5 + 5 + 5 + vertical + 2 + + + textbuffer1 + 1 + center + + + + + 1 + 150 + $(CURR) + + - - False - True - 0 - - - - - True - True - 150 - $(CURR) + + + + Custom - - False - True - 1 - - - - - - - True - False - Custom + - - False - - - True - False - 5 - 5 - 5 - vertical - 2 - + + - True - False + 5 + 5 + 5 vertical - - - True - False - Tool Type: - - - False - True - 0 - - + 2 - True - False + vertical - - Uppercase - True - True - False - True - True + + Tool Type: - - True - False - 0 - - - Lowercase - True - True - False - True - radio_button_letters_type_uppercase + + + + 1 + 1 + center + 1 + Uppercase + + + + + 1 + center + 1 + Lowercase + + - - True - False - 1 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - - - True - False - Usage Type: - - - False - True - 0 - - True - False - - - Only Name - True - True - False - True - True - - - True - False - 0 - - + vertical - - Only Extension - True - True - False - True - radio_button_letters_usage_name + + Usage Type: - - True - False - 1 - - - Both - True - True - False - True - radio_button_letters_usage_name + + + + 1 + 1 + center + 1 + Only Name + + + + + 1 + center + 1 + Only Extension + + + + + 1 + center + 1 + Both + + - - True - False - 2 - - - False - True - 1 - - - False - True - 1 - - - - - 1 - - - - - True - False - Upper/Lower cases + + + + Upper/Lower cases + + - - 1 - False - - - True - False - 5 - 5 - 5 - vertical - 2 - + + - True - False + 5 + 5 + 5 vertical - - - True - False - Usage Type: - - - False - True - 0 - - + 2 - True - False - - - Only Name - True - True - False - True - True - - - True - False - 0 - - + vertical - - Only Extension - True - True - False - True - radio_button_purge_name + + Usage Type: - - True - False - 1 - - - Both - True - True - False - True - radio_button_purge_name + + + + 1 + 1 + center + 1 + Only Name + + + + + 1 + center + 1 + Only Extension + + + + + 1 + center + 1 + Both + + - - True - False - 2 - - - False - True - 1 - - - False - True - 1 - - - - - 2 - - - - - True - False - Purge + + + + Purge + + - - 2 - False - - - True - False - 5 - 5 - 5 - vertical - 2 - + + - True - False + 5 + 5 + 5 vertical - - - True - False - Place to put number: - - - False - True - 0 - - + 2 - True - False + vertical - - Before Name - True - True - False - True - True + + Place to put number: - - True - False - 0 - - - After Name - True - True - False - True - radio_button_add_number_before_name + + + + 1 + 1 + center + 1 + Before Name + + + + + 1 + center + 1 + After Name + + - - True - False - 1 - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - - - True - False - Number Settings: - - - False - True - 0 - - - - True - False - True + + vertical - True - False - Start Number + Number Settings: - - 0 - 0 - - - True - False - Step + + 1 + + + Start Number + + 0 + 0 + + + + + + Step + + 0 + 1 + + + + + + 1 + digits + 30 + 1 + + 1 + 0 + + + + + + 1 + digits + 30 + 1 + + 1 + 1 + + + + + + Fill with zeros + + 0 + 2 + + + + + + 1 + digits + 4 + 0 + + 1 + 2 + + + - - 0 - 1 - + + + + + + + Add Number + + + + + + + + + 5 + 5 + 5 + vertical + 2 + + + vertical - - True - True - 30 - 1 - digits + + Usage Type: - - 1 - 0 - - - True - True - 30 - 1 - digits + + + + 1 + 1 + center + 1 + Before Name + + + + + 1 + center + 1 + After Name + + - - 1 - 1 - + + + + + vertical - True - False - Fill with zeros + Text to add: - - 0 - 2 - - - True - True - 4 - 0 - digits + + 1 + Źdźbło - - 1 - 2 - - - - - - - - - - - - False - True - 1 - - - False - True - 1 - - - - - 3 - - - - - True - False - Add Number + + + + Add Text + + - - 3 - False - - - True - False - 5 - 5 - 5 - vertical - 2 - + + - True - False + 5 + 5 + 5 vertical - - - True - False - Usage Type: - - - False - True - 0 - - + 2 - True - False + vertical + + + Usage Type: + + - - Before Name - True - True - False - True - True + + + + 1 + 1 + center + 1 + Only Name + + + + + 1 + center + 1 + Only Extension + + + + + 1 + center + 1 + Both + + - - True - False - 0 - - - After Name - True - True - False - True - radio_button_add_text_before_name + + vertical + + + Case Sensitivity + + + + + + + 1 + 1 + center + 1 + Case Sensitive + + + + + 1 + center + 1 + Case Insensitive + + + + + + + + + 1 + + + Replaced Text + + 0 + 2 + + + + + + 1 + 100 + k + + 1 + 2 + + + + + + 1 + 100 + a + + 1 + 1 + + + + + + Text to replace + + 0 + 1 + + + + + + Replacing Strings: + + 0 + 2 + 0 + + + - - True - False - 1 - - - False - True - 1 - - - False - True - 0 - - - - - True - False - vertical - - - True - False - Text to add: - - - False - True - 0 - - - - - True - True - Źdźbło - - - False - True - 1 - - + + + + Replace - - False - True - 1 - - - - - 4 - - - - - True - False - Add Text + - - 4 - False - - - True - False - 5 - 5 - 5 - vertical - 2 - + + - True - False + 5 + 5 + 5 vertical - - - True - False - Usage Type: - - - False - True - 0 - - + 2 - True - False - - - Only Name - True - True - False - True - True - - - True - False - 0 - - + vertical - - Only Extension - True - True - False - True - radio_button_replace_name + + Usage Type: - - True - False - 1 - - - Both - True - True - False - True - radio_button_replace_name + + + + 1 + 1 + center + 1 + Name Start + + + + + 1 + center + 1 + Name End + + + + + 1 + center + 1 + Extension Start + + + + + 1 + center + 1 + Extension End + + - - True - False - 2 - - - False - True - 1 - - True - False vertical - True - False Case Sensitivity - - False - True - 0 - - True - False - + + 1 + 1 + center + 1 Case Sensitive - True - True - False - True - True - - True - False - 0 - - + + 1 + center + 1 Case Insensitive - True - True - False - True - radio_button_replace_case_sensitive - - True - False - 1 - - - False - True - 1 - - - False - True - 2 - - - - True - False - True - - - True - False - Replaced Text - - - 0 - 2 - - - - - True - True - 100 - k - - - 1 - 2 - - - - - True - True - 100 - a - - - 1 - 1 - - + + vertical - True - False - Text to replace + Trim text - - 0 - 1 - - - True - False - Replacing Strings: + + 1 - - 0 - 0 - 2 - - - - - - - - - - - - False - True - 3 - - - False - True - 1 - - - - - 5 - - - - - True - False - Replace + + + + Trim + + - - 5 - False - - - True - False - 5 - 5 - 5 - vertical - 2 - + + - True - False vertical - True - False - Usage Type: + Normalize Name + 10 - - False - True - 0 - - - - True - False - - - Name Start - True - True - False - True - True - - - True - False - 0 - - - - - Name End - True - True - False - True - radio_button_trim_name_start - - - True - False - 1 - - - - - Extension Start - True - True - False - True - radio_button_trim_name_start - - - True - False - 2 - - - - - Extension End - True - True - False - True - radio_button_trim_name_start - - - True - False - 3 - - - - - False - True - 1 - - - - - False - True - 0 - - - - - True - False - vertical - True - False - Case Sensitivity + start + Everything - renames the name to one that containsonly the + characters `a-z`, `0-9`, `-`, ` `, `.`. + e.g. `żółć CZERona.Txt` -> `zolc-czerwona.txt` + +Partial - works exacly same as option above, but allows + to use spaces ` ` and big letters `A-Z` + e.g. ` Źrebię Krokietowe.Rar ` -> `Zrebie Krokietowe.Rar` + 10 + 5 - - False - True - 0 - - True - False - - Case Sensitive - True - True - False - True - True + + 1 + 1 + center + 1 + Everything - - True - False - 0 - - - Case Insensitive - True - True - False - True - radio_button_trim_case_sensitive + + 1 + 1 + center + 1 + Partial - - True - False - 1 - - - False - True - 1 - - - False - True - 1 - - - - - True - False - vertical - - - True - False - Trim text - - - False - True - 0 - - - - - True - True - - - False - True - 1 - - - - - False - True - 2 - - - - - 6 - - - - - True - False - Trim - - - 6 - False - - - - - True - False - vertical - + + - True - False - 10 Normalize Name - - False - True - 0 - - - - - True - False - start - 5 - 10 - Everything - renames the name to one that containsonly the - characters `a-z`, `0-9`, `-`, ` `, `.`. - e.g. `żółć CZERona.Txt` -> `zolc-czerwona.txt` - -Partial - works exacly same as option above, but allows - to use spaces ` ` and big letters `A-Z` - e.g. ` Źrebię Krokietowe.Rar ` -> `Zrebie Krokietowe.Rar` - - - False - True - 1 - - - - - True - False - - - Everything - True - True - False - center - True - True - - - True - True - 0 - - - - - Partial - True - True - False - center - True - True - radio_button_normalize_everything - - - True - True - 1 - - - - - False - True - 2 - - - - - 7 - - - - - True - False - Normalize Name + - - 7 - False - - - True - True - 0 - - True - False vertical - True - False - 5 - 5 EXAMPLE + 5 + 5 - - False - True - 0 - - True - False - True - False + 1 - True - False - 10 + 1 10 + 10 vertical - True - True - False Before: - - False - True - 0 - - True - False After: - - False - True - 1 - - - False - True - 1 - - True - False + 1 + 1 vertical - True - True - True + 1 100 - - False - True - 0 - - True - False start - 3 label + 3 - - False - True - 1 - - - True - True - 2 - - - True - True - 0 - - True - True - True + 1 5 + 1 - True - False edit-delete - - False - True - 1 - - - False - True - 1 - - - False - True - 1 - - - - True - True - 0 - - - - - True - False - 5 - 5 - 5 - end - Add Rule - True - True - True + end + Rule Add - - True - True - 0 - - - - - - False - False - 1 - - + + 400 + 600 diff --git a/ui/settings.ui b/ui/settings.ui index 6a0d5cc..38800de 100644 --- a/ui/settings.ui +++ b/ui/settings.ui @@ -1,67 +1,22 @@ - - + + - + + - False - dialog - + - False - vertical - 2 - - - False - end - - - - - - + + + Language + 10 + 5 - - False - False - 0 - - - True - False - - - True - False - 5 - 10 - Language - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - + + 1 - - False - True - 1 - diff --git a/ui/window_main.ui b/ui/window_main.ui index 9d19172..5445f69 100644 --- a/ui/window_main.ui +++ b/ui/window_main.ui @@ -1,552 +1,271 @@ - - + + - + + - False - 800 600 + 800 + + + + + + + 1 + Start Renaming + 1 + + + + + 1 + 1 + + + applications-engineering + + + + + + + + - - True - True + vertical - 2000 + + + Files/Folders + + - True - False - vertical + 1 - - True - False - Files/Folders + + 1 + 1 - - False - True - 1 - 0 - - True - False + vertical - - True - True - in + + 1 + Add Files + 1 - - True - True - 0 - - - True - False - vertical - - - Add Files - True - True - True - - - False - True - 0 - - - - - Add Folders - True - True - True - - - False - True - 1 - - - - - Remove Selection - True - True - True - - - False - True - 2 - - - - - Select - True - True - True - - - False - True - 3 - - - - - Update Names - True - True - True - - - False - True - 4 - - + + 1 + Add Folders + 1 + + + + + 1 + Remove Selection + 1 + + + + + none + Select + + + + + 1 + Update Names + 1 + + + + + 1 + 1 - - True - True - True + + center + 7 - - True - False - center - 7 - - - True - False - go-up - - - False - True - 0 - - - - - True - False - One Up - - - False - True - 1 - - + + go-up + + + + + One Up - - False - True - 5 - + + + + + 1 + 1 - - True - True - True + + center + 7 + + + go-down + + - - True - False - center - 7 - - - True - False - go-down - - - False - True - 0 - - - - - True - False - One Down - - - False - True - 1 - - + + One Down - - False - True - 6 - - - False - True - 1 - - - True - True - 3 - - - True - False - + + + + Rules + end + - True - False - vertical - - - True - False - Rules - - - False - True - 1 - 0 - - + 1 - True - False + vertical - - True - False - vertical + + 1 + 1 - - True - True - True + + center + 7 - - True - False - center - 7 - - - False - list-add - - - False - True - 0 - - - - - True - False - Add Rule - - - False - True - 1 - - + + list-add-symbolic + 0 - - - False - True - 0 - - - - - True - True - True - - True - False - center - 7 - - - False - applications-engineering - - - False - True - 0 - - - - - True - False - Edit Rule - - - False - True - 1 - - + + Add Rule - - False - True - 1 - + + + + + 1 + 1 - - True - True - True + + center + 7 - - True - False - center - 7 - - - False - list-remove - - - False - True - 0 - - - - - True - False - Remove Rule - - - False - True - 1 - - + + applications-engineering + 0 + + + + + Edit Rule - - False - True - 2 - + + + + + 1 + 1 - - True - True - True + + center + 7 + + + list-remove + 0 + + - - True - False - center - 7 - - - True - False - go-up - - - False - True - 0 - - - - - True - False - One Up - - - False - True - 1 - - + + Remove Rule - - False - True - 3 - + + + + + 1 + 1 - - True - True - True + + center + 7 - - True - False - center - 7 - - - True - False - go-down - - - False - True - 0 - - - - - True - False - One Down - - - False - True - 1 - - + + go-up + + + + + One Up - - False - True - 4 - - - False - True - 0 - - - True - True - in + + 1 + 1 - + + center + 7 + + + go-down + + + + + One Down + + + - - True - True - 1 - - - True - True - 1 - - - - - True - False - - - - - - - True - False - Szyszka - Fast and powerful file renamer - True - - - True - False - - - Start Renaming - True - True - True - - - False - True - 0 - - - True - True - True - - - True - False - applications-engineering - - + + 1 + 1 - - False - True - 1 -