From 5c555e74cca7b325980b2fd9038ca874c347da49 Mon Sep 17 00:00:00 2001 From: halfmexican <103920890+halfmexican@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:45:44 -0500 Subject: [PATCH 01/58] Port Revealer demo to Vala (#132) --- src/Revealer/main.vala | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/Revealer/main.vala diff --git a/src/Revealer/main.vala b/src/Revealer/main.vala new file mode 100644 index 00000000..6efc9e11 --- /dev/null +++ b/src/Revealer/main.vala @@ -0,0 +1,32 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +public void main () { + var button_slide = (Gtk.ToggleButton) workbench.builder.get_object ("button_slide"); + var button_crossfade = (Gtk.ToggleButton) workbench.builder.get_object ("button_crossfade"); + var revealer_slide = (Gtk.Revealer) workbench.builder.get_object ("revealer_slide"); + var revealer_crossfade = (Gtk.Revealer) workbench.builder.get_object ("revealer_crossfade"); + var image1 = (Gtk.Picture) workbench.builder.get_object ("image1"); + var image2 = (Gtk.Picture) workbench.builder.get_object ("image2"); + + var image1_file = File.new_for_uri (workbench.resolve ("image1.png")); + var image2_file = File.new_for_uri (workbench.resolve ("image2.png")); + + image1.file = image1_file; + image2.file = image2_file; + + button_slide.toggled.connect (() => { + revealer_slide.reveal_child = button_slide.active; + }); + + button_crossfade.toggled.connect (() => { + revealer_crossfade.reveal_child = button_crossfade.active; + }); + + revealer_slide.notify["child-revealed"].connect (() => { + if (revealer_slide.child_revealed) { + message ("Slide Revealer Shown"); + } else { + message ("Slide Revealer Hidden"); + } + }); +} From 6b9629b48a03f3d256c20c821232b56f3537b799 Mon Sep 17 00:00:00 2001 From: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> Date: Sat, 30 Mar 2024 19:19:49 +0100 Subject: [PATCH 02/58] Rust: Update Map demo (#135) --- src/Map/code.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Map/code.rs b/src/Map/code.rs index 1c1d6f18..637ce892 100644 --- a/src/Map/code.rs +++ b/src/Map/code.rs @@ -2,11 +2,9 @@ use crate::workbench; use glib::clone; use gtk::glib; use gtk::prelude::*; -use shumate::ffi::{ - SHUMATE_MAX_LATITUDE, SHUMATE_MAX_LONGITUDE, SHUMATE_MIN_LATITUDE, SHUMATE_MIN_LONGITUDE, -}; use shumate::prelude::*; use shumate::MAP_SOURCE_OSM_MAPNIK; +use shumate::{MAX_LATITUDE, MAX_LONGITUDE, MIN_LATITUDE, MIN_LONGITUDE}; pub fn main() { gtk::init().unwrap(); @@ -81,13 +79,13 @@ pub fn go_to_location( return; } - if latitude > SHUMATE_MAX_LATITUDE || latitude < SHUMATE_MIN_LATITUDE { - println!("Latitudes must be between {SHUMATE_MIN_LATITUDE} and {SHUMATE_MAX_LATITUDE}!"); + if latitude > MAX_LATITUDE || latitude < MIN_LATITUDE { + println!("Latitudes must be between {MIN_LATITUDE} and {MAX_LATITUDE}!"); return; } - if latitude > SHUMATE_MAX_LONGITUDE || latitude < SHUMATE_MIN_LONGITUDE { - println!("Longitudes must be between {SHUMATE_MIN_LONGITUDE} and {SHUMATE_MAX_LONGITUDE}!"); + if latitude > MAX_LONGITUDE || latitude < MIN_LONGITUDE { + println!("Longitudes must be between {MIN_LONGITUDE} and {MAX_LONGITUDE}!"); return; } From 173e469f65f5a9c53e4bcce1389cb938a08bd12e Mon Sep 17 00:00:00 2001 From: halfmexican <103920890+halfmexican@users.noreply.github.com> Date: Sun, 31 Mar 2024 17:34:35 -0500 Subject: [PATCH 03/58] Port demo (#136) --- src/Styling with CSS/main.vala | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/Styling with CSS/main.vala diff --git a/src/Styling with CSS/main.vala b/src/Styling with CSS/main.vala new file mode 100644 index 00000000..3b8e2b19 --- /dev/null +++ b/src/Styling with CSS/main.vala @@ -0,0 +1,6 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +public void main () { + var basic_label = workbench.builder.get_object("basic_label"); + basic_label.add_css_class("css_text"); +} From 9a53b1d860622661096900587837142560eaaf0f Mon Sep 17 00:00:00 2001 From: Manas Rai <106554051+manasrai1406@users.noreply.github.com> Date: Thu, 4 Apr 2024 04:10:52 +0530 Subject: [PATCH 04/58] Separator demo Port to Vala (#134) --- src/Separator/Separator.vala | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/Separator/Separator.vala diff --git a/src/Separator/Separator.vala b/src/Separator/Separator.vala new file mode 100644 index 00000000..33c2e0cb --- /dev/null +++ b/src/Separator/Separator.vala @@ -0,0 +1,11 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +public void main () { + var picture_one = (Gtk.Picture) workbench.builder.get_object ("picture_one"); + var picture_two = (Gtk.Picture) workbench.builder.get_object ("picture_two"); + + var file = File.new_for_uri(workbench.resolve("./image.png")); + + picture_one.file = file; + picture_two.file = file; +} From 0217fe4d77aaa9c385f6ef01c34c70bc0aece5de Mon Sep 17 00:00:00 2001 From: Sonny Date: Sat, 13 Apr 2024 01:58:14 +0200 Subject: [PATCH 05/58] Add SVG demo (#140) --- src/SVG/image.svg | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/SVG/main.blp | 22 ++++++++++++++++++++++ src/SVG/main.js | 16 ++++++++++++++++ src/SVG/main.json | 6 ++++++ 4 files changed, 90 insertions(+) create mode 100644 src/SVG/image.svg create mode 100644 src/SVG/main.blp create mode 100644 src/SVG/main.js create mode 100644 src/SVG/main.json diff --git a/src/SVG/image.svg b/src/SVG/image.svg new file mode 100644 index 00000000..14bc73df --- /dev/null +++ b/src/SVG/image.svg @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/src/SVG/main.blp b/src/SVG/main.blp new file mode 100644 index 00000000..3f559610 --- /dev/null +++ b/src/SVG/main.blp @@ -0,0 +1,22 @@ +using Gtk 4.0; +using Adw 1; + +Adw.StatusPage { + title: _("SVG"); + description: _("Display vectorial images at arbitrary sizes"); + + Box { + halign: center; + orientation: vertical; + + DrawingArea drawing_area { + width-request: 128; + height-request: 128; + } + + LinkButton { + label: _("Librsvg documentation"); + uri: "https://gnome.pages.gitlab.gnome.org/librsvg/Rsvg-2.0/index.html"; + } + } +} diff --git a/src/SVG/main.js b/src/SVG/main.js new file mode 100644 index 00000000..7e827f11 --- /dev/null +++ b/src/SVG/main.js @@ -0,0 +1,16 @@ +import Rsvg from "gi://Rsvg?version=2.0"; + +const drawing_area = workbench.builder.get_object("drawing_area"); +const svg = workbench.resolve("image.svg"); + +const handle = Rsvg.Handle.new_from_file(svg); + +const [, width, height] = handle.get_intrinsic_size_in_pixels(); +console.log("SVG intrisic size", { width, height }); + +function draw(_self, cr, width, height) { + console.log("drawing SVG at", { width, height }); + handle.render_document(cr, new Rsvg.Rectangle({ x: 0, y: 0, width, height })); + cr.$dispose(); +} +drawing_area.set_draw_func(draw); diff --git a/src/SVG/main.json b/src/SVG/main.json new file mode 100644 index 00000000..dce47802 --- /dev/null +++ b/src/SVG/main.json @@ -0,0 +1,6 @@ +{ + "category": "user_interface", + "description": "Display vectorial images at arbitrary sizes", + "panels": ["ui", "code", "preview"], + "autorun": true +} From 5b35f2fa299fe77bc63ba076594ac9456a383fe7 Mon Sep 17 00:00:00 2001 From: Sonny Date: Sat, 13 Apr 2024 12:47:08 +0200 Subject: [PATCH 06/58] Only run workbench-cli ci on changed demos (#142) --- .github/workflows/CI.yaml | 14 +------------- Makefile | 18 ++++++++---------- README.md | 16 ---------------- src/Separator/Separator.vala | 4 ++-- src/Styling with CSS/main.vala | 4 ++-- 5 files changed, 13 insertions(+), 43 deletions(-) diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index 9d56c748..f3e705c0 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -10,6 +10,7 @@ jobs: steps: - uses: actions/checkout@v3 with: + fetch-depth: 0 # required for make test submodules: "recursive" - name: Install host dependencies @@ -25,13 +26,6 @@ jobs: key: ${{ runner.os }}-flatpak-dependencies-${{ github.run_id }} restore-keys: | ${{ runner.os }}-flatpak-dependencies- - - name: Restore .flatpak-builder - uses: actions/cache/restore@v3 - with: - path: Workbench/.flatpak-builder - key: ${{ runner.os }}-flatpak-builder-${{ github.run_id }} - restore-keys: | - ${{ runner.os }}-flatpak-builder- - run: mutter --wayland --no-x11 --headless --wayland-display=wayland-0 --virtual-monitor 1280x720 > /tmp/mutter.log 2>&1 & - run: make ci @@ -44,9 +38,3 @@ jobs: with: path: ~/.local/share/flatpak key: ${{ runner.os }}-flatpak-dependencies-${{ github.run_id }} - - name: Save .flatpak-builder - uses: actions/cache/save@v3 - if: always() - with: - path: Workbench/.flatpak-builder - key: ${{ runner.os }}-flatpak-builder-${{ github.run_id }} diff --git a/Makefile b/Makefile index 2e49478c..2dee80d2 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ SHELL:=/bin/bash -O globstar -.PHONY: setup lint test ci +.PHONY: setup test ci .DEFAULT_GOAL := ci setup: @@ -7,22 +7,20 @@ setup: # flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo flatpak install --or-update --user --noninteractive flathub re.sonny.Workbench org.freedesktop.Sdk.Extension.rust-stable//23.08 org.freedesktop.Sdk.Extension.vala//23.08 -lint: -# Rust - flatpak run --command="/usr/lib/sdk/rust-stable/bin/rustfmt" --filesystem=host re.sonny.Workbench --check --edition 2021 src/*/*.rs -# Python -# flatpak run --command="ruff" --filesystem=host re.sonny.Workbench check --config=../src/langs/python/ruff.toml src/*/*.py - format: # npx prettier --write src/*/*.json flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format javascript src/*/*.js flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format css src/*/*.css -# flatpak run --command="ruff" --filesystem=host re.sonny.Workbench format --config=../src/langs/python/ruff.toml src/**/*.py - flatpak run --command="/usr/lib/sdk/rust-stable/bin/rustfmt" --filesystem=host re.sonny.Workbench --edition 2021 src/*/*.rs + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format python src/*/*.py + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format rust src/*/*.rs flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format blueprint src/*/*.blp flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format vala src/*/*.vala -test: lint +test: +# list folders that have changed and run workbench-cli ci on them + git diff --dirstat=files,0 origin/main src | sed 's/^[ 0-9.]\+% //g' | uniq | xargs -d '\n' flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench ci + +all: flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench ci src/* ci: setup test diff --git a/README.md b/README.md index c2a196d2..ac798fac 100644 --- a/README.md +++ b/README.md @@ -23,22 +23,6 @@ flatpak override --user --filesystem=$PWD re.sonny.Workbench For more details see [CONTRIBUTING.md](./CONTRIBUTING.md). -## Testing - -Please make sure to test your changes manually. - -You can run automated tests for a specific demo locally with - -```sh -flatpak run --command="workbench-cli" --filesystem=$PWD/src re.sonny.Workbench ci src/Welcome -``` - -Or run all the tests locally with - -```sh -make ci -``` - ## Code of conduct Workbench follows the [GNOME Code of Conduct](https://conduct.gnome.org/). diff --git a/src/Separator/Separator.vala b/src/Separator/Separator.vala index 33c2e0cb..bd9fa9fa 100644 --- a/src/Separator/Separator.vala +++ b/src/Separator/Separator.vala @@ -1,10 +1,10 @@ -#! /usr/bin/env -S vala workbench.vala --pkg gtk4 +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 public void main () { var picture_one = (Gtk.Picture) workbench.builder.get_object ("picture_one"); var picture_two = (Gtk.Picture) workbench.builder.get_object ("picture_two"); - var file = File.new_for_uri(workbench.resolve("./image.png")); + var file = File.new_for_uri (workbench.resolve ("./image.png")); picture_one.file = file; picture_two.file = file; diff --git a/src/Styling with CSS/main.vala b/src/Styling with CSS/main.vala index 3b8e2b19..c90f8b23 100644 --- a/src/Styling with CSS/main.vala +++ b/src/Styling with CSS/main.vala @@ -1,6 +1,6 @@ #! /usr/bin/env -S vala workbench.vala --pkg gtk4 public void main () { - var basic_label = workbench.builder.get_object("basic_label"); - basic_label.add_css_class("css_text"); + var basic_label = (Gtk.Label) workbench.builder.get_object ("basic_label"); + basic_label.add_css_class ("css_text"); } From df67fda4162baa72a64764d9ddf8684872ca77ce Mon Sep 17 00:00:00 2001 From: Parker Cook <128870015+Frogg1e@users.noreply.github.com> Date: Sat, 13 Apr 2024 06:00:24 -0500 Subject: [PATCH 07/58] Porting Level Bars Demo to Vala (#137) --- src/Level Bars/main.vala | 64 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/Level Bars/main.vala diff --git a/src/Level Bars/main.vala b/src/Level Bars/main.vala new file mode 100644 index 00000000..06430d50 --- /dev/null +++ b/src/Level Bars/main.vala @@ -0,0 +1,64 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +Gtk.PasswordEntry entry; +Gtk.LevelBar bar_discrete; +Gtk.Label label_strength; + +public void main () { + var bar_continuous = (Gtk.LevelBar) workbench.builder.get_object ("bar_continuous"); + + bar_continuous.add_offset_value ("full", 100); + bar_continuous.add_offset_value ("half", 50); + bar_continuous.add_offset_value ("low", 25); + + bar_discrete = (Gtk.LevelBar) workbench.builder.get_object ("bar_discrete"); + + bar_discrete.add_offset_value ("very-weak", 1); + bar_discrete.add_offset_value ("weak", 2); + bar_discrete.add_offset_value ("moderate", 4); + bar_discrete.add_offset_value ("strong", 6); + + + entry = (Gtk.PasswordEntry) workbench.builder.get_object ("entry"); + + label_strength = (Gtk.Label) workbench.builder.get_object ("label_strength"); + + entry.notify["text"].connect (estimate_password_strength); +} + +// This is not a secure way to estimate password strength +// Use appropriate solutions instead +// such as https://github.com/dropbox/zxcvbn + +public void estimate_password_strength () { + var level = (int) Math.fmin (Math.ceil ((entry.text.length + 1) / 2), 6); + + label_strength.css_classes = new string[0]; + + switch (level) { + case 1: + label_strength.label = "Very Weak"; + label_strength.add_css_class ("very-weak-label"); + break; + case 2: + label_strength.label = "Weak"; + label_strength.add_css_class ("weak-label"); + break; + case 3: + case 4: + label_strength.label = "Moderate"; + label_strength.add_css_class ("moderate-label"); + break; + case 5: + case 6: + label_strength.label = "Strong"; + label_strength.add_css_class ("strong-label"); + break; + default: + label_strength.label = ""; + label_strength.add_css_class (""); + break; + } + + bar_discrete.value = level; +} From 809063ce42b9c8649e7508e20544c21f6cd0a3ae Mon Sep 17 00:00:00 2001 From: Sahil Shadwal <119167601+Sahil-Shadwal@users.noreply.github.com> Date: Sat, 13 Apr 2024 19:06:35 +0530 Subject: [PATCH 08/58] Added search to the ComboRow in BoxedLists (#96) --- src/Boxed Lists/main.blp | 13 +++++++------ src/Boxed Lists/main.js | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 src/Boxed Lists/main.js diff --git a/src/Boxed Lists/main.blp b/src/Boxed Lists/main.blp index 746b0463..32de0a18 100644 --- a/src/Boxed Lists/main.blp +++ b/src/Boxed Lists/main.blp @@ -80,17 +80,18 @@ Adw.StatusPage { }; } - Adw.ComboRow { + Adw.ComboRow drop_down { title: _("Choose an Item"); subtitle: _("List of options from a drop down"); + enable-search: true; model: StringList list { strings [ - "This", - "Is", - "A", - "String", - "List" + "Cat", + "Dog", + "Hippo", + "Duck", + "Dodo" ] }; } diff --git a/src/Boxed Lists/main.js b/src/Boxed Lists/main.js new file mode 100644 index 00000000..973c12c0 --- /dev/null +++ b/src/Boxed Lists/main.js @@ -0,0 +1,16 @@ +import GObject from "gi://GObject"; +import Gtk from "gi://Gtk"; + +const drop_down = workbench.builder.get_object("drop_down"); + +drop_down.connect("notify::selected-item", () => { + const selected_item = drop_down.selected_item.get_string(); + console.log(selected_item); +}); + +const expression = new Gtk.ClosureExpression( + GObject.TYPE_STRING, + (obj) => obj.string, + null, +); +drop_down.expression = expression; From f2f96fd5b893c29d17ba78dc4ebdbc0012541935 Mon Sep 17 00:00:00 2001 From: Sameer Patel <49314145+urffsamhunt@users.noreply.github.com> Date: Sun, 14 Apr 2024 00:06:22 +0530 Subject: [PATCH 09/58] Ported Link Button Demo to Vala (#131) --- src/Link Button/code.rs | 12 +++++++----- src/Link Button/main.vala | 10 ++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 src/Link Button/main.vala diff --git a/src/Link Button/code.rs b/src/Link Button/code.rs index 10567141..0ba724ac 100644 --- a/src/Link Button/code.rs +++ b/src/Link Button/code.rs @@ -1,15 +1,17 @@ use crate::workbench; +use glib::signal::Propagation; +use gtk::glib; use gtk::prelude::*; -use gtk::traits::ButtonExt; pub fn main() { let linkbutton: gtk::LinkButton = workbench::builder().object("linkbutton").unwrap(); - linkbutton.connect_clicked(move |_| { - println!("Link has been visited"); + linkbutton.connect_activate_link(|button| { + println!("About to activate {}", button.uri()); + Propagation::Proceed }); - linkbutton.connect_notify(Some("visited"), |button, _| { - println!("About to activate {}", button.uri()); + linkbutton.connect_notify(Some("visited"), |_, _| { + println!("The link has been visited"); }); } diff --git a/src/Link Button/main.vala b/src/Link Button/main.vala new file mode 100644 index 00000000..babd09a9 --- /dev/null +++ b/src/Link Button/main.vala @@ -0,0 +1,10 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +public void main () { + var linkbutton = (Gtk.LinkButton) workbench.builder.get_object ("linkbutton"); + linkbutton.notify["visited"].connect ((_) => message ("The link has been visited")); + linkbutton.activate_link.connect (() => { + message (@"About to activate $(linkbutton.uri)"); + return false; + }); +} From 38a687df3ad24f6c42a048848ec86196f73dbe41 Mon Sep 17 00:00:00 2001 From: UrtsiSantsi <142679804+UrtsiSantsi@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:10:52 +0300 Subject: [PATCH 10/58] Port 'Animation' to Python (#29) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Port 'Animation' to Python --------- Co-authored-by: Roland Lötscher Co-authored-by: Sonny Piers --- src/Animation/main.js | 7 ++--- src/Animation/main.py | 67 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/Animation/main.py diff --git a/src/Animation/main.js b/src/Animation/main.js index e1bcf14f..5b53facd 100644 --- a/src/Animation/main.js +++ b/src/Animation/main.js @@ -41,11 +41,10 @@ const animation_spring = new Adw.SpringAnimation({ value_to: 1, spring_params: params, target: target_spring, + initial_velocity: 1.0, // If amplitude of oscillation < epsilon, animation stops + epsilon: 0.001, + clamp: false, }); -animation_spring.initial_velocity = 1.0; -// If amplitude of oscillation < epsilon, animation stops -animation_spring.epsilon = 0.001; -animation_spring.clamp = false; button_spring.connect("clicked", () => { animation_spring.play(); diff --git a/src/Animation/main.py b/src/Animation/main.py new file mode 100644 index 00000000..7c43de97 --- /dev/null +++ b/src/Animation/main.py @@ -0,0 +1,67 @@ +import gi + +gi.require_version("Gtk", "4.0") +gi.require_version("Adw", "1") + +from gi.repository import Gsk, Graphene, Adw +import workbench + + +button_timed = workbench.builder.get_object("button_timed") +progress_bar = workbench.builder.get_object("progress_bar") +target_timed = Adw.PropertyAnimationTarget.new(progress_bar, "fraction") + +animation_timed = Adw.TimedAnimation( + widget=progress_bar, + value_from=0, + value_to=1, + duration=1500, + easing=Adw.Easing.EASE_IN_OUT_CUBIC, + target=target_timed, +) + +button_timed.connect("clicked", lambda _: animation_timed.play()) +animation_timed.connect("done", lambda _: animation_timed.reset()) + +button_spring = workbench.builder.get_object("button_spring") +ball = workbench.builder.get_object("ball") + + +def get_end_position(widget): + parent_width = widget.get_parent().get_width() + width = ball.get_width() + + return parent_width - width + + +def move_widget(widget, x, y): + transform = Gsk.Transform.new() + p = Graphene.Point().init(x, y) + transform = transform.translate(p) + widget.allocate(widget.get_width(), widget.get_height(), -1, transform) + + +def animation_cb(value): + end = get_end_position(ball) + x = Adw.lerp(0, end, value) + move_widget(ball, x, 0) + + +target_spring = Adw.CallbackAnimationTarget.new(animation_cb) +params = Adw.SpringParams.new( + damping_ratio=0.5, + mass=1.0, + stiffness=50.0, +) +animation_spring = Adw.SpringAnimation( + widget=ball, + value_from=0, + value_to=1, + spring_params=params, + target=target_spring, + initial_velocity=1.0, # If amplitude of oscillation < epsilon, animation stops + epsilon=0.001, + clamp=False, +) + +button_spring.connect("clicked", lambda _: animation_spring.play()) From 20c4fd34f73f7f2caea655a3b7b268017775c05e Mon Sep 17 00:00:00 2001 From: Jamie Gravendeel Date: Sat, 27 Apr 2024 11:12:27 +0200 Subject: [PATCH 11/58] Add Button Rows demo (#147) --- src/Button Row/main.blp | 76 ++++++++++++++++++++++++++++++++++++++++ src/Button Row/main.js | 13 +++++++ src/Button Row/main.json | 7 ++++ src/Button Row/main.py | 16 +++++++++ 4 files changed, 112 insertions(+) create mode 100644 src/Button Row/main.blp create mode 100644 src/Button Row/main.js create mode 100644 src/Button Row/main.json create mode 100644 src/Button Row/main.py diff --git a/src/Button Row/main.blp b/src/Button Row/main.blp new file mode 100644 index 00000000..e1687f62 --- /dev/null +++ b/src/Button Row/main.blp @@ -0,0 +1,76 @@ +using Gtk 4.0; +using Adw 1; + +Adw.StatusPage { + title: _("Button Row"); + description: _("Use buttons in boxed lists"); + + Adw.Clamp { + maximum-size: 500; + + Box { + orientation: vertical; + + ListBox { + selection-mode: none; + + styles [ + "boxed-list-separate" + ] + + Adw.ButtonRow { + title: _("Start Icon"); + start-icon-name: "list-add-symbolic"; + } + + Adw.ButtonRow { + title: _("End Icon"); + end-icon-name: "go-next-symbolic"; + } + + Adw.ButtonRow button_row_suggested { + title: _("Suggested"); + + styles [ + "suggested-action" + ] + } + + Adw.ButtonRow button_row_destructive { + title: _("Destructive"); + + styles [ + "destructive-action" + ] + } + + Adw.ButtonRow { + title: _("Disabled"); + activatable: false; + } + } + + ListBox { + selection-mode: none; + + styles [ + "boxed-list" + ] + + Adw.ActionRow { + title: _("Row"); + } + + Adw.ButtonRow { + title: _("Attached"); + } + } + + LinkButton { + margin-top: 24; + label: _("API Reference"); + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.ButtonRow"; + } + } + } +} diff --git a/src/Button Row/main.js b/src/Button Row/main.js new file mode 100644 index 00000000..a0bc4057 --- /dev/null +++ b/src/Button Row/main.js @@ -0,0 +1,13 @@ +const button_row_suggested = workbench.builder.get_object( + "button_row_suggested", +); +const button_row_destructive = workbench.builder.get_object( + "button_row_destructive", +); + +button_row_suggested.connect("activated", () => { + console.log("Suggested button row activated"); +}); +button_row_destructive.connect("activated", () => { + console.log("Destructive button row activated"); +}); diff --git a/src/Button Row/main.json b/src/Button Row/main.json new file mode 100644 index 00000000..159b8c2b --- /dev/null +++ b/src/Button Row/main.json @@ -0,0 +1,7 @@ +{ + "category": "controls", + "description": "Use buttons in boxed lists", + "panels": ["ui", "preview"], + "autorun": true, + "runtime-version": "master" +} diff --git a/src/Button Row/main.py b/src/Button Row/main.py new file mode 100644 index 00000000..f4395182 --- /dev/null +++ b/src/Button Row/main.py @@ -0,0 +1,16 @@ +import workbench + +button_row_suggested = workbench.builder.get_object("button_row_suggested") +button_row_destructive = workbench.builder.get_object("button_row_destructive") + + +def on_suggested_activated(*_args): + print("Suggested button row activated") + + +def on_destructive_activated(*_args): + print("Destructive button row activated") + + +button_row_suggested.connect("activated", on_suggested_activated) +button_row_destructive.connect("activated", on_destructive_activated) From 80fe240150a6ac6e8a488b305fda5fc091e49bc1 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Sat, 27 Apr 2024 22:08:21 +0200 Subject: [PATCH 12/58] Button Row: Use sensitive instead of activatable --- src/Button Row/main.blp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Button Row/main.blp b/src/Button Row/main.blp index e1687f62..a6f85a81 100644 --- a/src/Button Row/main.blp +++ b/src/Button Row/main.blp @@ -46,7 +46,7 @@ Adw.StatusPage { Adw.ButtonRow { title: _("Disabled"); - activatable: false; + sensitive: false; } } From ce8d7649d09af0173f8f21e41f89bd6d2fccf964 Mon Sep 17 00:00:00 2001 From: Sonny Date: Sun, 28 Apr 2024 14:58:15 +0200 Subject: [PATCH 13/58] Add icons to Welcome and Web View (#145) --- .gitignore | 2 ++ Makefile | 2 ++ src/Platform Tools/main.blp | 9 ++++----- src/Web View/icons/arrow1-left-symbolic.svg | 2 ++ src/Web View/icons/arrow1-right-symbolic.svg | 2 ++ src/Welcome/icons/bookmark-outline-symbolic.svg | 2 ++ src/Welcome/icons/floppy-symbolic.svg | 2 ++ src/Welcome/icons/library-symbolic.svg | 2 ++ src/Welcome/icons/play-large-symbolic.svg | 2 ++ src/Welcome/icons/update-symbolic.svg | 2 ++ src/Welcome/main.blp | 6 +++--- 11 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 src/Web View/icons/arrow1-left-symbolic.svg create mode 100644 src/Web View/icons/arrow1-right-symbolic.svg create mode 100644 src/Welcome/icons/bookmark-outline-symbolic.svg create mode 100644 src/Welcome/icons/floppy-symbolic.svg create mode 100644 src/Welcome/icons/library-symbolic.svg create mode 100644 src/Welcome/icons/play-large-symbolic.svg create mode 100644 src/Welcome/icons/update-symbolic.svg diff --git a/.gitignore b/.gitignore index cc5fd82c..fa186403 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ src/*/Cargo.toml src/*/lib.rs src/*/workbench.rs src/*/target +src/*/*.gresource +src/*/*.gresource.xml diff --git a/Makefile b/Makefile index 2dee80d2..f0db102b 100644 --- a/Makefile +++ b/Makefile @@ -35,5 +35,7 @@ clean: rm -f src/*/Cargo.lockfile rm -f src/*/lib.rs rm -f src/*/workbench.rs + rm -f src/*/*.gresource + rm -f src/*/*.gresource.xml rm -rf src/*/target rm -rf src/*/__pycache__ diff --git a/src/Platform Tools/main.blp b/src/Platform Tools/main.blp index 855b40fa..1b9a471b 100644 --- a/src/Platform Tools/main.blp +++ b/src/Platform Tools/main.blp @@ -28,7 +28,7 @@ Adw.StatusPage { margin-bottom: 30; label: _("Source Code"); - uri: "https://gitlab.gnome.org/GNOME/libadwaita/-/tree/1.2.2/demo"; + uri: "https://gitlab.gnome.org/GNOME/libadwaita/-/tree/1.5.0/demo"; } Button gtk4-demo { @@ -48,7 +48,7 @@ Adw.StatusPage { margin-bottom: 30; label: _("Source Code"); - uri: "https://gitlab.gnome.org/GNOME/gtk/-/tree/4.8.3/demos/gtk-demo"; + uri: "https://gitlab.gnome.org/GNOME/gtk/-/tree/4.14.2/demos/gtk-demo"; } Button gtk4-widget-factory { @@ -68,7 +68,7 @@ Adw.StatusPage { margin-bottom: 30; label: _("Source Code"); - uri: "https://gitlab.gnome.org/GNOME/gtk/-/tree/4.8.3/demos/widget-factory"; + uri: "https://gitlab.gnome.org/GNOME/gtk/-/tree/4.14.2/demos/widget-factory"; } } @@ -95,8 +95,7 @@ Adw.StatusPage { margin-top: 6; halign: center; label: _("The GTK Inspector"); - // https://gitlab.gnome.org/Teams/documentation/developer-www/-/issues/40 - uri: "https://blog.gtk.org/2017/04/05/the-gtk-inspector/"; + uri: "https://developer.gnome.org/documentation/tools/inspector.html"; } } } diff --git a/src/Web View/icons/arrow1-left-symbolic.svg b/src/Web View/icons/arrow1-left-symbolic.svg new file mode 100644 index 00000000..6d6bf224 --- /dev/null +++ b/src/Web View/icons/arrow1-left-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Web View/icons/arrow1-right-symbolic.svg b/src/Web View/icons/arrow1-right-symbolic.svg new file mode 100644 index 00000000..0722168d --- /dev/null +++ b/src/Web View/icons/arrow1-right-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Welcome/icons/bookmark-outline-symbolic.svg b/src/Welcome/icons/bookmark-outline-symbolic.svg new file mode 100644 index 00000000..8842233f --- /dev/null +++ b/src/Welcome/icons/bookmark-outline-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Welcome/icons/floppy-symbolic.svg b/src/Welcome/icons/floppy-symbolic.svg new file mode 100644 index 00000000..eeac981d --- /dev/null +++ b/src/Welcome/icons/floppy-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Welcome/icons/library-symbolic.svg b/src/Welcome/icons/library-symbolic.svg new file mode 100644 index 00000000..f9f7515f --- /dev/null +++ b/src/Welcome/icons/library-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Welcome/icons/play-large-symbolic.svg b/src/Welcome/icons/play-large-symbolic.svg new file mode 100644 index 00000000..5210a7e4 --- /dev/null +++ b/src/Welcome/icons/play-large-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Welcome/icons/update-symbolic.svg b/src/Welcome/icons/update-symbolic.svg new file mode 100644 index 00000000..8366791b --- /dev/null +++ b/src/Welcome/icons/update-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Welcome/main.blp b/src/Welcome/main.blp index 9deda19f..3eafce28 100644 --- a/src/Welcome/main.blp +++ b/src/Welcome/main.blp @@ -59,7 +59,7 @@ Box welcome { margin-bottom: 6; Image { - icon-name: "media-playback-start-symbolic"; + icon-name: "play-large-symbolic"; margin-end: 12; icon-size: normal; } @@ -82,7 +82,7 @@ Box welcome { margin-bottom: 6; Image { - icon-name: "media-floppy-symbolic"; + icon-name: "floppy-symbolic"; margin-end: 12; icon-size: normal; } @@ -110,7 +110,7 @@ Box welcome { margin-bottom: 6; Image { - icon-name: "user-bookmarks-symbolic"; + icon-name: "bookmark-outline-symbolic"; margin-end: 12; icon-size: normal; } From 9ffc27e7e873f7add3deae72aae8c4b6b675c758 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Sun, 28 Apr 2024 17:05:31 +0200 Subject: [PATCH 14/58] Add Using Icons entry --- src/Using Icons/icons/cafe-symbolic.svg | 2 ++ src/Using Icons/main.blp | 29 +++++++++++++++++++++++++ src/Using Icons/main.css | 3 +++ src/Using Icons/main.json | 6 +++++ src/Welcome/main.json | 2 +- 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/Using Icons/icons/cafe-symbolic.svg create mode 100644 src/Using Icons/main.blp create mode 100644 src/Using Icons/main.css create mode 100644 src/Using Icons/main.json diff --git a/src/Using Icons/icons/cafe-symbolic.svg b/src/Using Icons/icons/cafe-symbolic.svg new file mode 100644 index 00000000..88dfe462 --- /dev/null +++ b/src/Using Icons/icons/cafe-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Using Icons/main.blp b/src/Using Icons/main.blp new file mode 100644 index 00000000..4eff06b2 --- /dev/null +++ b/src/Using Icons/main.blp @@ -0,0 +1,29 @@ +using Gtk 4.0; +using Adw 1; + +Adw.StatusPage { + title: "Using Icons"; + description: "Learn how to use icons for UI"; + // Try using a custom icon instead of cafe-symbolic + icon-name: "cafe-symbolic"; + + Adw.Clamp { + Box { + halign: center; + orientation: vertical; + + Box { + styles [ + "card" + ] + + Label { + label: _("Several widgets such as GtkImage and GtkButton accept an icon-name property. Icons must be properly registered to be referenced by name. \n\nTo includes icons in a project, select “Reveal in Files” in Workbench menu and save them in the icons folder. Make sure to press “Run” to register the new icons.\n\nYou can find icons using the Icon Library app which also explain how to register icons in GNOME applications.\n\nLearn more about UI icons in the Human Interface Guidelines."); + wrap: true; + selectable: true; + use-markup: true; + } + } + } + } +} diff --git a/src/Using Icons/main.css b/src/Using Icons/main.css new file mode 100644 index 00000000..777a8dd5 --- /dev/null +++ b/src/Using Icons/main.css @@ -0,0 +1,3 @@ +.card { + padding: 16px; +} diff --git a/src/Using Icons/main.json b/src/Using Icons/main.json new file mode 100644 index 00000000..0288353e --- /dev/null +++ b/src/Using Icons/main.json @@ -0,0 +1,6 @@ +{ + "category": "user_interface", + "description": "Learn how to use icons for UI", + "panels": ["ui", "preview"], + "autorun": false +} diff --git a/src/Welcome/main.json b/src/Welcome/main.json index 97c15ef7..863caaab 100644 --- a/src/Welcome/main.json +++ b/src/Welcome/main.json @@ -1,6 +1,6 @@ { "category": "uncategorized", - "description": "The initial welcome demo with instructions on how to use Workbench", + "description": "Learn how to use Workbench", "panels": ["ui", "preview"], "autorun": false } From 71fcb64a3ab88ba85a93df904b112325a73052f7 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Mon, 29 Apr 2024 14:43:45 +0200 Subject: [PATCH 15/58] Fix missing icons --- STYLEGUIDE.md | 3 +- src/Action Bar/main.blp | 2 +- src/Advanced Buttons/main.blp | 10 +- src/Animation/main.blp | 4 +- src/Boxed Lists/main.blp | 2 +- src/Breakpoints/main.blp | 2 +- src/Button/main.blp | 4 +- src/Carousel/icons/carousel-symbolic.svg | 2 + src/Clamp/main.blp | 4 +- src/Custom Widget/main.blp | 2 +- src/File Monitor/main.blp | 2 +- src/Frame/main.blp | 12 +- .../icons/circle-outline-thick-symbolic.svg | 2 + src/Grid/icons/cross-large-symbolic.svg | 2 + src/Header Bar/main.blp | 4 +- src/Image/main.blp | 16 +- src/Map/icons/map-marker-symbolic.svg | 2 + src/Map/icons/move-tool-symbolic.svg | 2 + src/Menu Button/main.blp | 3 +- src/Network Monitor/main.blp | 12 +- src/Overlay Split View/main.blp | 4 +- src/Overlay/main.blp | 6 +- src/Power Profile Monitor/main.blp | 2 +- .../icons/bread-symbolic.svg | 2 + .../icons/brush-monitor-symbolic.svg | 2 + .../icons/settings-symbolic.svg | 2 + src/Search/main.blp | 2 +- src/Status Page/main.blp | 2 +- src/Styling with CSS/main.blp | 6 +- src/Tab View/main.blp | 4 +- src/Text Fields/main.blp | 2 +- .../icons/eye-not-looking-symbolic.svg | 2 + .../eye-open-negative-filled-symbolic.svg | 2 + .../icons/flashlight-symbolic.svg | 2 + .../icons/photo-camera-symbolic.svg | 2 + src/Toggle Button/icons/terminal-symbolic.svg | 2 + src/Toolbar View/main.blp | 314 +++++------------- src/Toolbar View/main.css | 3 - src/Toolbar View/main.js | 78 ----- src/Toolbar View/main.py | 74 ----- src/Tooltip/main.blp | 2 +- src/Tooltip/main.js | 2 +- src/Tooltip/main.py | 2 +- .../icons/bell-outline-symbolic.svg | 2 + .../icons/check-plain-symbolic.svg | 2 + .../icons/clock-alt-symbolic.svg | 2 + src/View Switcher/icons/person-symbolic.svg | 2 + .../icons/star-filled-rounded-symbolic.svg | 2 + 48 files changed, 170 insertions(+), 451 deletions(-) create mode 100644 src/Carousel/icons/carousel-symbolic.svg create mode 100644 src/Grid/icons/circle-outline-thick-symbolic.svg create mode 100644 src/Grid/icons/cross-large-symbolic.svg create mode 100644 src/Map/icons/map-marker-symbolic.svg create mode 100644 src/Map/icons/move-tool-symbolic.svg create mode 100644 src/Preferences Dialog/icons/bread-symbolic.svg create mode 100644 src/Preferences Dialog/icons/brush-monitor-symbolic.svg create mode 100644 src/Preferences Dialog/icons/settings-symbolic.svg create mode 100644 src/Toggle Button/icons/eye-not-looking-symbolic.svg create mode 100644 src/Toggle Button/icons/eye-open-negative-filled-symbolic.svg create mode 100644 src/Toggle Button/icons/flashlight-symbolic.svg create mode 100644 src/Toggle Button/icons/photo-camera-symbolic.svg create mode 100644 src/Toggle Button/icons/terminal-symbolic.svg delete mode 100644 src/Toolbar View/main.css delete mode 100644 src/Toolbar View/main.js delete mode 100644 src/Toolbar View/main.py create mode 100644 src/View Switcher/icons/bell-outline-symbolic.svg create mode 100644 src/View Switcher/icons/check-plain-symbolic.svg create mode 100644 src/View Switcher/icons/clock-alt-symbolic.svg create mode 100644 src/View Switcher/icons/person-symbolic.svg create mode 100644 src/View Switcher/icons/star-filled-rounded-symbolic.svg diff --git a/STYLEGUIDE.md b/STYLEGUIDE.md index 5a8cf758..1a770f2c 100644 --- a/STYLEGUIDE.md +++ b/STYLEGUIDE.md @@ -11,6 +11,7 @@ - Prefer properties like `Gtk.Box:spacing` to `Gtk.Widget:margin-top` for layout - Avoid hard-coded height and width, except for e.g. images with fixed geometry - Prefer HIG terms (Radio Groups, Checkboxes) over technical ones (Checkbuttons) +- If you need icons, it is possible to use custom icons but prefer included [Adwaita icons set](ttps://gitlab.gnome.org/GNOME/adwaita-icon-theme/-/tree/master/Adwaita/symbolic/actions?ref_type=heads). ## CSS @@ -130,4 +131,4 @@ button.add_css_class ("pill"); ### Logging - Use `message ()`, `warning ()` and `critical ()` for debug messages (depending on the severity) -- Use `print ()`/`stdout.printf ()` for messages that are intended to be seen by the user \ No newline at end of file +- Use `print ()`/`stdout.printf ()` for messages that are intended to be seen by the user diff --git a/src/Action Bar/main.blp b/src/Action Bar/main.blp index 44d497a9..939e957d 100644 --- a/src/Action Bar/main.blp +++ b/src/Action Bar/main.blp @@ -64,7 +64,7 @@ Box { [end] Button end_widget { - icon-name: "padlock2-symbolic"; + icon-name: "input-keyboard-symbolic"; } } } diff --git a/src/Advanced Buttons/main.blp b/src/Advanced Buttons/main.blp index c760e2a1..04c33fe2 100644 --- a/src/Advanced Buttons/main.blp +++ b/src/Advanced Buttons/main.blp @@ -41,7 +41,7 @@ Adw.StatusPage { Adw.SplitButton { halign: center; - icon-name: "execute-from-symbolic"; + icon-name: "media-playback-start-symbolic"; menu-model: button_run_menu; } @@ -126,7 +126,7 @@ Adw.StatusPage { Adw.ButtonContent { label: _("New"); - icon-name: "plus-symbolic"; + icon-name: "list-add-symbolic"; } } @@ -143,8 +143,8 @@ Adw.StatusPage { ToggleButton { Adw.ButtonContent { - label: _("Alerts"); - icon-name: "bell-outline-symbolic"; + label: _("Bluetooth"); + icon-name: "bluetooth-active-symbolic"; } } @@ -172,7 +172,7 @@ Popover button_popover { Adw.StatusPage { title: _("No Recent Documents"); - icon-name: "clock-symbolic"; + icon-name: "document-open-recent-symbolic"; width-request: 300; height-request: 300; diff --git a/src/Animation/main.blp b/src/Animation/main.blp index 23167c06..eb6030af 100644 --- a/src/Animation/main.blp +++ b/src/Animation/main.blp @@ -64,7 +64,7 @@ Adw.Clamp { hexpand: true; halign: end; valign: center; - icon-name: "play-large-symbolic"; + icon-name: "media-playback-start-symbolic"; styles [ "circular" @@ -115,7 +115,7 @@ Adw.Clamp { hexpand: true; halign: end; valign: center; - icon-name: "play-large-symbolic"; + icon-name: "media-playback-start-symbolic"; styles [ "circular" diff --git a/src/Boxed Lists/main.blp b/src/Boxed Lists/main.blp index 32de0a18..4908f118 100644 --- a/src/Boxed Lists/main.blp +++ b/src/Boxed Lists/main.blp @@ -44,7 +44,7 @@ Adw.StatusPage { [suffix] ToggleButton activatable_toggle { - icon-name: "hand-touch-symbolic"; + icon-name: "list-add-symbolic"; valign: center; } } diff --git a/src/Breakpoints/main.blp b/src/Breakpoints/main.blp index 1e675c21..103cc678 100644 --- a/src/Breakpoints/main.blp +++ b/src/Breakpoints/main.blp @@ -19,7 +19,7 @@ Gtk.Window { Image image { icon-size: large; - icon-name: "smile-symbolic"; + icon-name: "go-home-symbolic"; } Adw.BreakpointBin breakpoint_bin { diff --git a/src/Button/main.blp b/src/Button/main.blp index 7542b8ed..4b603bcc 100644 --- a/src/Button/main.blp +++ b/src/Button/main.blp @@ -74,7 +74,7 @@ Adw.StatusPage { Button circular-plus { name: "circular-plus"; - icon-name: "plus"; + icon-name: "list-add-symbolic"; margin-start: 13; margin-end: 20; valign: center; @@ -87,7 +87,7 @@ Adw.StatusPage { Button circular-minus { name: "circular-minus"; - icon-name: "minus"; + icon-name: "list-remove-symbolic"; margin-end: 70; valign: center; diff --git a/src/Carousel/icons/carousel-symbolic.svg b/src/Carousel/icons/carousel-symbolic.svg new file mode 100644 index 00000000..aac8f37e --- /dev/null +++ b/src/Carousel/icons/carousel-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Clamp/main.blp b/src/Clamp/main.blp index 80963a62..a1d9ba7f 100644 --- a/src/Clamp/main.blp +++ b/src/Clamp/main.blp @@ -15,11 +15,11 @@ Adw.StatusPage { orientation: horizontal; Button button_increase { - icon-name: "plus"; + icon-name: "list-add-symbolic"; } Button button_decrease { - icon-name: "minus"; + icon-name: "list-remove-symbolic"; } } diff --git a/src/Custom Widget/main.blp b/src/Custom Widget/main.blp index 04006888..aaf35bda 100644 --- a/src/Custom Widget/main.blp +++ b/src/Custom Widget/main.blp @@ -5,6 +5,6 @@ template $AwesomeButton: Button { Image { halign: center; - icon-name: "penguin-alt-symbolic"; + icon-name: "emoji-people-symbolic"; } } diff --git a/src/File Monitor/main.blp b/src/File Monitor/main.blp index b4eff49e..abf7a162 100644 --- a/src/File Monitor/main.blp +++ b/src/File Monitor/main.blp @@ -5,7 +5,7 @@ Adw.ToastOverlay overlay { Adw.StatusPage { title: _("File Monitor"); description: _("Monitors a file or directory for changes"); - icon-name: "paper-symbolic"; + icon-name: "emblem-documents-symbolic"; Box { orientation: vertical; diff --git a/src/Frame/main.blp b/src/Frame/main.blp index 35e662a8..f6d8c2bd 100644 --- a/src/Frame/main.blp +++ b/src/Frame/main.blp @@ -85,15 +85,15 @@ Adw.StatusPage { ] Button { - icon-name: "plus-symbolic"; + icon-name: "list-add-symbolic"; } Button { - icon-name: "minus-symbolic"; + icon-name: "list-remove-symbolic"; } Button { - icon-name: "bell-outline-symbolic"; + icon-name: "preferences-system-notifications-symbolic"; } } @@ -119,15 +119,15 @@ Adw.StatusPage { ] Button { - icon-name: "plus-symbolic"; + icon-name: "list-add-symbolic"; } Button { - icon-name: "minus-symbolic"; + icon-name: "list-remove-symbolic"; } Button { - icon-name: "bell-outline-symbolic"; + icon-name: "preferences-system-notifications-symbolic"; } } } diff --git a/src/Grid/icons/circle-outline-thick-symbolic.svg b/src/Grid/icons/circle-outline-thick-symbolic.svg new file mode 100644 index 00000000..49d2b1a7 --- /dev/null +++ b/src/Grid/icons/circle-outline-thick-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Grid/icons/cross-large-symbolic.svg b/src/Grid/icons/cross-large-symbolic.svg new file mode 100644 index 00000000..914421a0 --- /dev/null +++ b/src/Grid/icons/cross-large-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Header Bar/main.blp b/src/Header Bar/main.blp index e0d5fbb3..efc3a63c 100644 --- a/src/Header Bar/main.blp +++ b/src/Header Bar/main.blp @@ -15,7 +15,7 @@ Gtk.Window { [start] Button { - icon-name: "tab-new-filled-symbolic"; + icon-name: "tab-new-symbolic"; } [end] @@ -28,7 +28,7 @@ Gtk.Window { [end] Button { - icon-name: "loupe-large-symbolic"; + icon-name: "edit-find-symbolic"; } }; diff --git a/src/Image/main.blp b/src/Image/main.blp index 63473ef5..4e2b4143 100644 --- a/src/Image/main.blp +++ b/src/Image/main.blp @@ -16,22 +16,22 @@ Adw.StatusPage { Image { icon-size: normal; - icon-name: "bear-symbolic"; + icon-name: "accessories-calculator-symbolic"; } Image { icon-size: normal; - icon-name: "sentiment-very-satisfied-symbolic"; + icon-name: "display-brightness-symbolic"; } Image { icon-size: normal; - icon-name: "star-filled-rounded-symbolic"; + icon-name: "face-monkey-symbolic"; } Image { icon-size: normal; - icon-name: "background-app-ghost-symbolic"; + icon-name: "starred-symbolic"; } } @@ -41,22 +41,22 @@ Adw.StatusPage { Image { icon-size: large; - icon-name: "bear-symbolic"; + icon-name: "accessories-calculator-symbolic"; } Image { icon-size: large; - icon-name: "sentiment-very-satisfied-symbolic"; + icon-name: "display-brightness-symbolic"; } Image { icon-size: large; - icon-name: "star-filled-rounded-symbolic"; + icon-name: "face-monkey-symbolic"; } Image { icon-size: large; - icon-name: "background-app-ghost-symbolic"; + icon-name: "starred-symbolic"; } } diff --git a/src/Map/icons/map-marker-symbolic.svg b/src/Map/icons/map-marker-symbolic.svg new file mode 100644 index 00000000..36e68161 --- /dev/null +++ b/src/Map/icons/map-marker-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Map/icons/move-tool-symbolic.svg b/src/Map/icons/move-tool-symbolic.svg new file mode 100644 index 00000000..96e2ab30 --- /dev/null +++ b/src/Map/icons/move-tool-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Menu Button/main.blp b/src/Menu Button/main.blp index 183819ed..ed7ded12 100644 --- a/src/Menu Button/main.blp +++ b/src/Menu Button/main.blp @@ -16,8 +16,8 @@ Adw.StatusPage { halign: center; icon-name: "open-menu-symbolic"; menu-model: primary_button_menu; - primary: true; // May not work in Previewer + primary: true; } Label { @@ -37,6 +37,7 @@ Adw.StatusPage { halign: center; menu-model: secondary_button_menu; margin-top: 18; + icon-name: "view-more-symbolic"; } Label { diff --git a/src/Network Monitor/main.blp b/src/Network Monitor/main.blp index 3d2f247c..0f365a2d 100644 --- a/src/Network Monitor/main.blp +++ b/src/Network Monitor/main.blp @@ -50,7 +50,7 @@ Box { MenuButton { halign: end; valign: center; - icon-name: "lightbulb-symbolic"; + icon-name: "dialog-information-symbolic"; popover: Popover { Box steps { @@ -87,10 +87,6 @@ Box { } } }; - - styles [ - "flat" - ] } } @@ -128,7 +124,7 @@ Box { MenuButton { valign: center; halign: end; - icon-name: "lightbulb-symbolic"; + icon-name: "dialog-information-symbolic"; popover: Popover { Box { @@ -142,10 +138,6 @@ Box { } } }; - - styles [ - "flat" - ] } } diff --git a/src/Overlay Split View/main.blp b/src/Overlay Split View/main.blp index 7c707346..d8de1340 100644 --- a/src/Overlay Split View/main.blp +++ b/src/Overlay Split View/main.blp @@ -23,7 +23,7 @@ Adw.Window { Adw.HeaderBar { [start] ToggleButton show_sidebar_button { - icon-name: "dock-left"; + icon-name: "sidebar-show-symbolic"; tooltip-text: _("Toggle Sidebar"); active: bind split_view.show-sidebar; visible: bind start_toggle.active; @@ -31,7 +31,7 @@ Adw.Window { [end] ToggleButton { - icon-name: "dock-right"; + icon-name: "sidebar-show-right-symbolic"; tooltip-text: _("Toggle Sidebar"); active: bind show_sidebar_button.active; visible: bind end_toggle.active; diff --git a/src/Overlay/main.blp b/src/Overlay/main.blp index fbc3a9ce..7c02b30c 100644 --- a/src/Overlay/main.blp +++ b/src/Overlay/main.blp @@ -17,15 +17,15 @@ Adw.StatusPage { valign: end; Button { - icon-name: "skip-backwards-10-symbolic"; + icon-name: "media-skip-backward-symbolic"; } Button { - icon-name: "play-large-symbolic"; + icon-name: "media-playback-start-symbolic"; } Button { - icon-name: "skip-forward-10-symbolic"; + icon-name: "media-skip-forward-symbolic"; } Scale { diff --git a/src/Power Profile Monitor/main.blp b/src/Power Profile Monitor/main.blp index 569c7660..6095d6ec 100644 --- a/src/Power Profile Monitor/main.blp +++ b/src/Power Profile Monitor/main.blp @@ -15,7 +15,7 @@ Adw.ToastOverlay overlay { spacing: 6; Image { - icon-name: "lightbulb-symbolic"; + icon-name: "dialog-information-symbolic"; styles [ "dim-label" diff --git a/src/Preferences Dialog/icons/bread-symbolic.svg b/src/Preferences Dialog/icons/bread-symbolic.svg new file mode 100644 index 00000000..e80fb3b1 --- /dev/null +++ b/src/Preferences Dialog/icons/bread-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Preferences Dialog/icons/brush-monitor-symbolic.svg b/src/Preferences Dialog/icons/brush-monitor-symbolic.svg new file mode 100644 index 00000000..8b0436a0 --- /dev/null +++ b/src/Preferences Dialog/icons/brush-monitor-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Preferences Dialog/icons/settings-symbolic.svg b/src/Preferences Dialog/icons/settings-symbolic.svg new file mode 100644 index 00000000..408d7e5d --- /dev/null +++ b/src/Preferences Dialog/icons/settings-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Search/main.blp b/src/Search/main.blp index fd67caeb..e294edf1 100644 --- a/src/Search/main.blp +++ b/src/Search/main.blp @@ -11,7 +11,7 @@ Adw.Window { HeaderBar { ToggleButton button_search { - icon-name: "loupe-large-symbolic"; + icon-name: "edit-find-symbolic"; } } diff --git a/src/Status Page/main.blp b/src/Status Page/main.blp index ae5a09e3..0a835c93 100644 --- a/src/Status Page/main.blp +++ b/src/Status Page/main.blp @@ -4,7 +4,7 @@ using Adw 1; Adw.StatusPage status_page { title: _("Status Page"); description: _("A page used for empty/error states and similar use-cases"); - icon-name: "loupe-symbolic"; + icon-name: "help-about-symbolic"; Box { margin-top: 18; diff --git a/src/Styling with CSS/main.blp b/src/Styling with CSS/main.blp index e4c810e0..570f3ff3 100644 --- a/src/Styling with CSS/main.blp +++ b/src/Styling with CSS/main.blp @@ -43,15 +43,15 @@ Adw.StatusPage { halign: center; Button { - icon-name: "stop-large-symbolic"; + icon-name: "list-remove-symbolic"; } Button { - icon-name: "play-large-symbolic"; + icon-name: "list-add-symbolic"; } Button { - icon-name: "playlist-symbolic"; + icon-name: "mail-forward-symbolic"; } } diff --git a/src/Tab View/main.blp b/src/Tab View/main.blp index 50256ac6..e973a18c 100644 --- a/src/Tab View/main.blp +++ b/src/Tab View/main.blp @@ -15,11 +15,11 @@ Adw.Window { Adw.HeaderBar { Button button_new_tab { - icon-name: "tab-new-filled-symbolic"; + icon-name: "tab-new-symbolic"; } Button button_overview { - icon-name: "grid-filled-symbolic"; + icon-name: "view-grid-symbolic"; } } diff --git a/src/Text Fields/main.blp b/src/Text Fields/main.blp index 0ad76443..9fe70fe7 100644 --- a/src/Text Fields/main.blp +++ b/src/Text Fields/main.blp @@ -91,7 +91,7 @@ Adw.Clamp { primary-icon-name: "help-about-symbolic"; primary-icon-activatable: true; primary-icon-tooltip-text: _("Click on Me"); - secondary-icon-name: "bell-outline-symbolic"; + secondary-icon-name: "preferences-system-notifications-symbolic"; secondary-icon-tooltip-text: _("No Click on Me"); } } diff --git a/src/Toggle Button/icons/eye-not-looking-symbolic.svg b/src/Toggle Button/icons/eye-not-looking-symbolic.svg new file mode 100644 index 00000000..3dfa6540 --- /dev/null +++ b/src/Toggle Button/icons/eye-not-looking-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Toggle Button/icons/eye-open-negative-filled-symbolic.svg b/src/Toggle Button/icons/eye-open-negative-filled-symbolic.svg new file mode 100644 index 00000000..e904ea39 --- /dev/null +++ b/src/Toggle Button/icons/eye-open-negative-filled-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Toggle Button/icons/flashlight-symbolic.svg b/src/Toggle Button/icons/flashlight-symbolic.svg new file mode 100644 index 00000000..2976cf10 --- /dev/null +++ b/src/Toggle Button/icons/flashlight-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Toggle Button/icons/photo-camera-symbolic.svg b/src/Toggle Button/icons/photo-camera-symbolic.svg new file mode 100644 index 00000000..92dd2147 --- /dev/null +++ b/src/Toggle Button/icons/photo-camera-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Toggle Button/icons/terminal-symbolic.svg b/src/Toggle Button/icons/terminal-symbolic.svg new file mode 100644 index 00000000..f2bba5b9 --- /dev/null +++ b/src/Toggle Button/icons/terminal-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/Toolbar View/main.blp b/src/Toolbar View/main.blp index d9c17430..f6eb5bd6 100644 --- a/src/Toolbar View/main.blp +++ b/src/Toolbar View/main.blp @@ -14,255 +14,99 @@ Adw.Window { bottom-bar-style: bind barstyle_select.selected; reveal-top-bars: bind reveal_topbar.active; reveal-bottom-bars: bind reveal_bottombar.active; - // In this demo we are using the API to set the header bars - // you can use the [top] and [bottom] child types directly instead - // [top] - // Adw.HeaderBar { - // title-widget: Adw.WindowTitle { - // title: _("Header Bar"); - // }; - // } - content: Adw.ViewStack stack { - Adw.ViewStackPage page_defualt { - name: "page_default"; - title: _("Toolbar View"); - icon-name: "toolbars-symbolic"; - child: Adw.StatusPage { - Box { - halign: center; - orientation: vertical; - spacing: 18; - - Label { - label: _("Toolbar View"); - - styles [ - "title-1" - ] - } - - Label { - wrap: true; - label: _("A widget containing a page, as well as top and/or bottom bars"); - } - - LinkButton { - label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ToolbarView.html"; - } - - ListBox list_box { - styles [ - "boxed-list" - ] - - selection-mode: none; - - Adw.ComboRow topbar_select { - title: _("Top bar"); - - model: StringList { - strings [ - _("Header Bar"), - _("Tab Bar"), - _("View Switcher Bar"), - _("Action Bar"), - _("PopOverMenu Bar"), - _("Search Bar"), - _("Gtk Box") - ] - }; - - selected: 0; - } - - Adw.ComboRow bottombar_select { - title: _("Bottom bar"); - - model: StringList { - strings [ - _("Header Bar"), - _("Tab Bar"), - _("View Switcher Bar"), - _("Action Bar"), - _("PopOverMenu Bar"), - _("Search Bar"), - _("Gtk Box") - ] - }; - - selected: 2; - } - - Adw.ComboRow barstyle_select { - title: _("Style"); - - model: StringList { - strings [ - _("Flat"), - _("Raised"), - _("Raised-Border") - ] - }; - } - - Adw.SwitchRow reveal_topbar { - title: _("Reveal Top Bar"); - active: true; - } - - Adw.SwitchRow reveal_bottombar { - title: _("Reveal Bottom Bar"); - active: true; - } - - Adw.SwitchRow extend_top { - title: _("Extend Content Behind Top Bar"); - active: false; - } - - Adw.SwitchRow extend_bottom { - title: _("Extend Content Behind Bottom Bar"); - active: false; - } - } - } - }; - } + [top] + Adw.HeaderBar header_bar { + title-widget: Adw.WindowTitle { + title: _("Header Bar"); + }; + } - Adw.ViewStackPage page1 { - name: "page1"; - title: _("Page 1"); - icon-name: "explore2-symbolic"; - use-underline: true; + [bottom] + ActionBar action_bar { + revealed: true; + valign: end; - child: Adw.StatusPage { - title: _("Hello"); - }; + [start] + Button start_widget { + icon-name: "call-start-symbolic"; } - Adw.ViewStackPage page2 { - name: "page2"; - title: _("Page 2"); - icon-name: "explore2-symbolic"; - use-underline: true; - - child: Adw.StatusPage { - title: _("From"); - }; + [center] + Label { + label: _("Action Bar"); } - Adw.ViewStackPage page3 { - name: "page3"; - title: _("Page 3"); - icon-name: "explore2-symbolic"; - use-underline: true; - - child: Adw.StatusPage { - title: _("Workbench"); - }; + [end] + Button end_widget { + icon-name: "view-more-symbolic"; } - }; - } -} - -Adw.HeaderBar header_bar { - title-widget: Adw.WindowTitle { - title: _("Header Bar"); - }; -} - -ActionBar action_bar { - revealed: true; - valign: end; - - [start] - Button start_widget { - icon-name: "call-start-symbolic"; - } - - [center] - DropDown { - model: StringList { - strings [ - "Center Widget", - "👁️", - "❤️", - "💼", - "🪑" - ] - }; - } - - [end] - Button end_widget { - icon-name: "padlock2-symbolic"; - } -} - -Adw.ViewSwitcherBar switcher_bar { - stack: stack; - reveal: true; -} - -PopoverMenuBar popover { - menu-model: menu_app; -} - -menu menu_app { - section { - item { - label: _("Keyboard Shortcuts"); - action: "app.shortcuts"; } - item { - label: _("About Workbench"); - action: "app.about"; - } - } -} - -SearchBar search_bar { - search-mode-enabled: true; - show-close-button: true; - - SearchEntry { - placeholder-text: _("Search"); - } -} - -Box gtk_box { - name: "gtk_box"; - halign: fill; - height-request: 20; -} - -Adw.TabBar tab_bar { - view: tab_view; -} + content: Adw.StatusPage { + Box { + halign: center; + orientation: vertical; + spacing: 18; + + Label { + label: _("Toolbar View"); + + styles [ + "title-1" + ] + } + + Label { + wrap: true; + label: _("A widget containing a page, as well as top and/or bottom bars"); + } + + LinkButton { + label: _("API Reference"); + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ToolbarView.html"; + } + + ListBox list_box { + styles [ + "boxed-list" + ] + + selection-mode: none; + + Adw.ComboRow barstyle_select { + title: _("Style"); + + model: StringList { + strings [ + _("Flat"), + _("Raised"), + _("Raised-Border") + ] + }; + } -Adw.TabView tab_view { - Adw.TabPage main_tab_page { - title: _("First Page"); + Adw.SwitchRow reveal_topbar { + title: _("Reveal Top Bar"); + active: true; + } - child: Adw.StatusPage { - hexpand: true; - vexpand: true; - title: _("Tab View"); - description: _("A dynamic tabbed container"); - }; - } + Adw.SwitchRow reveal_bottombar { + title: _("Reveal Bottom Bar"); + active: true; + } - Adw.TabPage main_tab_page2 { - title: _("Second Page"); + Adw.SwitchRow extend_top { + title: _("Extend Content Behind Top Bar"); + active: false; + } - child: Adw.StatusPage { - hexpand: true; - vexpand: true; - title: _("Tab View"); - description: _("A dynamic tabbed container"); + Adw.SwitchRow extend_bottom { + title: _("Extend Content Behind Bottom Bar"); + active: false; + } + } + } }; } } diff --git a/src/Toolbar View/main.css b/src/Toolbar View/main.css deleted file mode 100644 index 8abf89f5..00000000 --- a/src/Toolbar View/main.css +++ /dev/null @@ -1,3 +0,0 @@ -#gtk_box { - background-color: purple; -} diff --git a/src/Toolbar View/main.js b/src/Toolbar View/main.js deleted file mode 100644 index a433b496..00000000 --- a/src/Toolbar View/main.js +++ /dev/null @@ -1,78 +0,0 @@ -const topbar_select = workbench.builder.get_object("topbar_select"); -const bottombar_select = workbench.builder.get_object("bottombar_select"); -const toolbar_view = workbench.builder.get_object("toolbar_view"); - -let top_bar; -let bottom_bar; - -function changeTopBar(name) { - const new_top_bar = workbench.builder.get_object(name); - top_bar && toolbar_view.remove(top_bar); - toolbar_view.add_top_bar(new_top_bar); - top_bar = new_top_bar; -} - -function changeBottomBar(name) { - const new_bottom_bar = workbench.builder.get_object(name); - bottom_bar && toolbar_view.remove(bottom_bar); - toolbar_view.add_bottom_bar(new_bottom_bar); - bottom_bar = new_bottom_bar; -} - -topbar_select.connect("notify::selected-item", selectTopBar); -bottombar_select.connect("notify::selected-item", selectBottomBar); - -selectTopBar(); -selectBottomBar(); - -function selectTopBar() { - switch (topbar_select.selected) { - case 0: - changeTopBar("header_bar"); - break; - case 1: - changeTopBar("tab_bar"); - break; - case 2: - changeTopBar("switcher_bar"); - break; - case 3: - changeTopBar("action_bar"); - break; - case 4: - changeTopBar("popover"); - break; - case 5: - changeTopBar("search_bar"); - break; - case 6: - changeTopBar("gtk_box"); - break; - } -} - -function selectBottomBar() { - switch (bottombar_select.selected) { - case 0: - changeBottomBar("header_bar"); - break; - case 1: - changeBottomBar("tab_bar"); - break; - case 2: - changeBottomBar("switcher_bar"); - break; - case 3: - changeBottomBar("action_bar"); - break; - case 4: - changeBottomBar("popover"); - break; - case 5: - changeBottomBar("search_bar"); - break; - case 6: - changeBottomBar("gtk_box"); - break; - } -} diff --git a/src/Toolbar View/main.py b/src/Toolbar View/main.py deleted file mode 100644 index 10522010..00000000 --- a/src/Toolbar View/main.py +++ /dev/null @@ -1,74 +0,0 @@ -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Adw -import workbench - -topbar_select: Adw.ComboRow = workbench.builder.get_object("topbar_select") -bottombar_select: Adw.ComboRow = workbench.builder.get_object("bottombar_select") -toolbar_view: Adw.ToolbarView = workbench.builder.get_object("toolbar_view") - -top_bar = None -bottom_bar = None - - -def change_top_bar(name): - global top_bar - new_top_bar = workbench.builder.get_object(name) - if top_bar: - toolbar_view.remove(top_bar) - toolbar_view.add_top_bar(new_top_bar) - top_bar = new_top_bar - - -def change_bottom_bar(name): - global bottom_bar - new_bottom_bar = workbench.builder.get_object(name) - if bottom_bar: - toolbar_view.remove(bottom_bar) - toolbar_view.add_bottom_bar(new_bottom_bar) - bottom_bar = new_bottom_bar - - -def select_top_bar(*_args): - match topbar_select.get_selected(): - case 0: - change_top_bar("header_bar") - case 1: - change_top_bar("tab_bar") - case 2: - change_top_bar("switcher_bar") - case 3: - change_top_bar("action_bar") - case 4: - change_top_bar("popover") - case 5: - change_top_bar("search_bar") - case 6: - change_top_bar("gtk_box") - - -def select_bottom_bar(*_args): - match bottombar_select.get_selected(): - case 0: - change_bottom_bar("header_bar") - case 1: - change_bottom_bar("tab_bar") - case 2: - change_bottom_bar("switcher_bar") - case 3: - change_bottom_bar("action_bar") - case 4: - change_bottom_bar("popover") - case 5: - change_bottom_bar("search_bar") - case 6: - change_bottom_bar("gtk_box") - - -topbar_select.connect("notify::selected-item", select_top_bar) -bottombar_select.connect("notify::selected-item", select_bottom_bar) - -select_top_bar() -select_bottom_bar() diff --git a/src/Tooltip/main.blp b/src/Tooltip/main.blp index d9a9087f..556dddba 100644 --- a/src/Tooltip/main.blp +++ b/src/Tooltip/main.blp @@ -16,7 +16,7 @@ Adw.StatusPage { ToggleButton { tooltip-text: _("Do Not Disturb"); - icon-name: "bell-outline-none-symbolic"; + icon-name: "notifications-disabled-symbolic"; } Button { diff --git a/src/Tooltip/main.js b/src/Tooltip/main.js index 2443c283..fec2d6fb 100644 --- a/src/Tooltip/main.js +++ b/src/Tooltip/main.js @@ -5,7 +5,7 @@ const button = workbench.builder.get_object("button"); button.connect("query-tooltip", (_self, _x, _y, _mode, tooltip) => { const custom_tooltip = new Gtk.Box({ spacing: 6 }); const label = new Gtk.Label({ label: "This is a custom tooltip" }); - const icon = new Gtk.Image({ icon_name: "penguin-alt-symbolic" }); + const icon = new Gtk.Image({ icon_name: "emoji-body-symbolic" }); custom_tooltip.append(label); custom_tooltip.append(icon); diff --git a/src/Tooltip/main.py b/src/Tooltip/main.py index 44f52b0a..bed8c244 100644 --- a/src/Tooltip/main.py +++ b/src/Tooltip/main.py @@ -10,7 +10,7 @@ def on_query_tooltip(_button, _x, _y, _mode, tooltip): custom_tooltip = Gtk.Box(spacing=6) label = Gtk.Label(label="This is a custom tooltip") - icon = Gtk.Image(icon_name="penguin-alt-symbolic") + icon = Gtk.Image(icon_name="emoji-body-symbolic") custom_tooltip.append(label) custom_tooltip.append(icon) diff --git a/src/View Switcher/icons/bell-outline-symbolic.svg b/src/View Switcher/icons/bell-outline-symbolic.svg new file mode 100644 index 00000000..2d04259e --- /dev/null +++ b/src/View Switcher/icons/bell-outline-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/View Switcher/icons/check-plain-symbolic.svg b/src/View Switcher/icons/check-plain-symbolic.svg new file mode 100644 index 00000000..096db078 --- /dev/null +++ b/src/View Switcher/icons/check-plain-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/View Switcher/icons/clock-alt-symbolic.svg b/src/View Switcher/icons/clock-alt-symbolic.svg new file mode 100644 index 00000000..b4b5066b --- /dev/null +++ b/src/View Switcher/icons/clock-alt-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/View Switcher/icons/person-symbolic.svg b/src/View Switcher/icons/person-symbolic.svg new file mode 100644 index 00000000..4936089f --- /dev/null +++ b/src/View Switcher/icons/person-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/src/View Switcher/icons/star-filled-rounded-symbolic.svg b/src/View Switcher/icons/star-filled-rounded-symbolic.svg new file mode 100644 index 00000000..381efad2 --- /dev/null +++ b/src/View Switcher/icons/star-filled-rounded-symbolic.svg @@ -0,0 +1,2 @@ + + From 152b60690e38d811d5f2cc17402152e1b5fb2f70 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Tue, 28 May 2024 17:22:49 +0530 Subject: [PATCH 16/58] Port 'Dialog' demo to Vala (#151) --- src/Dialog/main.vala | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/Dialog/main.vala diff --git a/src/Dialog/main.vala b/src/Dialog/main.vala new file mode 100644 index 00000000..b618d980 --- /dev/null +++ b/src/Dialog/main.vala @@ -0,0 +1,22 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg gio-2.0 + +public void main () { + var dialog = (Adw.Dialog) workbench.builder.get_object ("dialog"); + var button = (Gtk.Button) workbench.builder.get_object ("button"); + var image = (Gtk.Image) workbench.builder.get_object ("image"); + + image.file = File.new_for_uri (workbench.resolve ("./image.svg")).get_path (); + + button.clicked.connect (() => { + dialog.present (workbench.window); + }); + + dialog.close_attempt.connect (() => { + dialog.force_close (); + message ("Close Attempt"); + }); + + dialog.closed.connect (() => { + message ("Closed"); + }); +} From 8e5a8a0d1d9e7212149b08fc798dc319c8a1525f Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Wed, 29 May 2024 21:35:18 +0530 Subject: [PATCH 17/58] Port 'Actions' demo to Vala (#153) --- src/Actions/main.vala | 44 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/Actions/main.vala diff --git a/src/Actions/main.vala b/src/Actions/main.vala new file mode 100644 index 00000000..37541286 --- /dev/null +++ b/src/Actions/main.vala @@ -0,0 +1,44 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + var demo = (Adw.StatusPage) workbench.builder.get_object ("demo"); + + var demo_group = new SimpleActionGroup (); + demo.insert_action_group ("demo", demo_group); + + // Action with no state or parameters + var simple_action = new SimpleAction ("simple", null); + simple_action.activate.connect (() => { + message (@"$(simple_action.name) action activated"); + }); + demo_group.add_action (simple_action); + + // Action with parameter + var bookmarks_action = new SimpleAction ("open-bookmarks", new GLib.VariantType ("s")); + bookmarks_action.activate.connect ((action, parameter) => { + message (@"$(action.name) activated with $(parameter.get_string())"); + }); + demo_group.add_action (bookmarks_action); + + // Action with state + var toggle_action = new SimpleAction.stateful ("toggle", null, new Variant.boolean (false)); + toggle_action.notify.connect ((action, state) => { + bool b = toggle_action.state.get_boolean (); + message (@"$(toggle_action.name) action set to " + (b ? "true" : "false")); + }); + + demo_group.add_action (toggle_action); + + // Action with state and parameter + var scale_action = new SimpleAction.stateful ("scale", new VariantType ("s"), new Variant.string ("100%")); + + scale_action.notify.connect ((action) => { + message (@"$(scale_action.name) action set to $(scale_action.state.get_string())"); + }); + + demo_group.add_action (scale_action); + + var text = (Gtk.Label) workbench.builder.get_object ("text"); + var alignment_action = new PropertyAction ("text-align", text, "halign"); + demo_group.add_action (alignment_action); +} From d6d217e9731e6c92c4240e4f65b56fcedef8bb59 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Sun, 2 Jun 2024 01:15:02 +0530 Subject: [PATCH 18/58] Port 'Dialog' demo to Python (#152) --- src/Dialog/main.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/Dialog/main.py diff --git a/src/Dialog/main.py b/src/Dialog/main.py new file mode 100644 index 00000000..a6161ee6 --- /dev/null +++ b/src/Dialog/main.py @@ -0,0 +1,30 @@ +import gi + +gi.require_version("Adw", "1") +gi.require_version("Gtk", "4.0") +from gi.repository import Gio +import workbench + +dialog = workbench.builder.get_object("dialog") +button = workbench.builder.get_object("button") +image = workbench.builder.get_object("image") + +image.set_from_file(Gio.File.new_for_uri(workbench.resolve("image.svg")).get_path()) + + +def on_button_clicked(_button): + dialog.present(workbench.window) + + +def on_dialog_close_attempt(_dialog): + print("Close Attempt") + dialog.force_close() + + +def on_dialog_closed(_dialog): + print("Closed") + + +button.connect("clicked", on_button_clicked) +dialog.connect("close-attempt", on_dialog_close_attempt) +dialog.connect("closed", on_dialog_closed) From f91f5cf567a05597e282d392b892dea5f856a969 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:57:21 +0530 Subject: [PATCH 19/58] Port 'Frames' demo to Vala (#158) --- src/Frame/main.vala | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/Frame/main.vala diff --git a/src/Frame/main.vala b/src/Frame/main.vala new file mode 100644 index 00000000..0fa97249 --- /dev/null +++ b/src/Frame/main.vala @@ -0,0 +1,20 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + + var pic_with_frame = (Gtk.Picture) workbench.builder.get_object ("with_frame"); + var pic_without_frame = (Gtk.Picture) workbench.builder.get_object ("without_frame"); + var textview_with_frame = (Gtk.TextView) workbench.builder.get_object ("textview_with_frame"); + var textview_without_frame = (Gtk.TextView) workbench.builder.get_object ("textview_without_frame"); + + var file = File.new_for_uri (workbench.resolve ("./image.png")); + + var buffer = new Gtk.TextBuffer (null); + buffer.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vel elit scelerisque mauris pellentesque pulvinar. Molestie nunc non blandit massa enim nec dui nunc. Turpis in eu mi bibendum neque egestas congue quisque. Sed velit dignissim sodales ut. Massa tempor nec feugiat nisl pretium fusce id velit. Vitae congue eu consequat ac felis donec et. Ultrices sagittis orci a scelerisque purus semper eget duis at. Habitant morbi tristique senectus et netus et malesuada fames ac. Vitae aliquet nec ullamcorper sit amet risus nullam. Tortor at auctor urna nunc. Eget velit aliquet sagittis id consectetur purus. Libero id faucibus nisl tincidunt eget. Nunc consequat interdum varius sit amet mattis. Enim facilisis gravida neque convallis. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Venenatis tellus in metus vulputate eu scelerisque.Sit amet luctus venenatis lectus magna fringilla urna. Eget nunc lobortis mattis aliquam. Urna duis convallis convallis tellus id interdum velit. Fames ac turpis egestas maecenas. Venenatis lectus magna fringilla urna porttitor rhoncus dolor. Egestas erat imperdiet sed euismod nisi porta lorem mollis aliquam. Eget est lorem ipsum dolor sit amet consectetur. Eget nunc lobortis mattis aliquam faucibus purus in. Iaculis nunc sed augue lacus viverra vitae. Euismod elementum nisi quis eleifend. Et pharetra pharetra massa massa ultricies mi quis. Volutpat odio facilisis mauris sit. Enim ut tellus elementum sagittis vitae et. Volutpat sed cras ornare arcu dui vivamus arcu felis. Arcu vitae elementum curabitur vitae nunc sed. Porttitor rhoncus dolor purus non enim. Scelerisque fermentum dui faucibus in ornare quam viverra. Amet purus gravida quis blandit turpis cursus. Faucibus pulvinar elementum integer enim. Aenean et tortor at risus viverra adipiscing at in.Vitae ultricies leo integer malesuada nunc vel. Quis lectus nulla at volutpat diam ut. Donec ac odio tempor orci dapibus ultrices. Justo eget magna fermentum iaculis eu non diam. Mauris cursus mattis molestie a iaculis at erat pellentesque. Phasellus faucibus scelerisque eleifend donec pretium. Blandit volutpat maecenas volutpat blandit aliquam etiam erat velit scelerisque. Habitant morbi tristique senectus et netus. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Nulla malesuada pellentesque elit eget. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus sed. Sollicitudin ac orci phasellus egestas tellus. In hendrerit gravida rutrum quisque non tellus orci ac. Suspendisse ultrices gravida dictum fusce ut placerat. Varius morbi enim nunc faucibus. Tellus elementum sagittis vitae et leo duis ut diam. Velit dignissim sodales ut eu sem integer. Sapien eget mi proin sed libero enim. Odio euismod lacinia at quis risus. Tellus at urna condimentum mattis pellentesque id."; + + textview_with_frame.buffer = buffer; + textview_without_frame.buffer = buffer; + + pic_with_frame.file = file; + pic_without_frame.file = file; +} From 540087ae9587e0a13ca6df9080b50574c3935e5a Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:57:40 +0530 Subject: [PATCH 20/58] Port 'Menu Button' to Vala (#160) --- src/Menu Button/main.vala | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/Menu Button/main.vala diff --git a/src/Menu Button/main.vala b/src/Menu Button/main.vala new file mode 100644 index 00000000..1d1c45ba --- /dev/null +++ b/src/Menu Button/main.vala @@ -0,0 +1,14 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + var circular_switch = (Adw.SwitchRow) workbench.builder.get_object ("circular_switch"); + var secondary_button = (Gtk.MenuButton) workbench.builder.get_object ("secondary"); + + circular_switch.notify["active"].connect (() => { + if (circular_switch.active) { + secondary_button.add_css_class ("circular"); + } else { + secondary_button.remove_css_class ("circular"); + } + }); +} From 1c20bd435cbf31770de094949ae451f0200dc1e0 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:58:12 +0530 Subject: [PATCH 21/58] Port 'Popovers' demo to Vala (#163) --- src/Popovers/main.vala | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/Popovers/main.vala diff --git a/src/Popovers/main.vala b/src/Popovers/main.vala new file mode 100644 index 00000000..7d7f7f21 --- /dev/null +++ b/src/Popovers/main.vala @@ -0,0 +1,14 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +void on_closed (Gtk.Popover popover) { + message (@"$(popover.name) closed."); +} + +public void main () { + string[] popover_ids = { "plain_popover", "popover_menu" }; + + foreach (string id in popover_ids) { + var popover = (Gtk.Popover) workbench.builder.get_object (id); + popover.closed.connect (on_closed); + } +} From 3864ddae6408c867361f822dc9685e8709d6b428 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:58:25 +0530 Subject: [PATCH 22/58] Port 'Spell Checker' demo to Vala (#165) --- src/Spell Checker/main.vala | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/Spell Checker/main.vala diff --git a/src/Spell Checker/main.vala b/src/Spell Checker/main.vala new file mode 100644 index 00000000..23139b50 --- /dev/null +++ b/src/Spell Checker/main.vala @@ -0,0 +1,17 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg gtksourceview-5 --pkg libspelling-1 + +public void main () { + GtkSource.init (); + var buffer = (GtkSource.Buffer) workbench.builder.get_object ("buffer"); + var text_view = (Gtk.TextView) workbench.builder.get_object ("text_view"); + + var checker = Spelling.Checker.get_default (); + checker.language = "en_US"; + var adapter = new Spelling.TextBufferAdapter (buffer, checker); + MenuModel extra_menu = adapter.get_menu_model (); + + text_view.extra_menu = extra_menu; + text_view.insert_action_group ("spelling", adapter); + + adapter.enabled = true; +} From ffe0efad54441616cb369883172f7b1d738ead11 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:58:54 +0530 Subject: [PATCH 23/58] Port 'Tooltip' demo to Vala (#167) --- src/Tooltip/main.vala | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/Tooltip/main.vala diff --git a/src/Tooltip/main.vala b/src/Tooltip/main.vala new file mode 100644 index 00000000..5a229fc5 --- /dev/null +++ b/src/Tooltip/main.vala @@ -0,0 +1,17 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + var button = (Gtk.Button) workbench.builder.get_object ("button"); + + button.query_tooltip.connect ((button, x, y, keyboard_mode, tooltip) => { + var custom_tooltip = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 6); + var label = new Gtk.Label ("This is a custom tooltip"); + var icon = new Gtk.Image.from_icon_name ("emoji-body-symbolic"); + + custom_tooltip.append (label); + custom_tooltip.append (icon); + + tooltip.set_custom (custom_tooltip); + return true; + }); +} From 11b30e601864580f1117e43e0830fe44a7bae993 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:59:24 +0530 Subject: [PATCH 24/58] Port 'Toggle Button' demo to Vala (#166) --- src/Toggle Button/main.vala | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Toggle Button/main.vala diff --git a/src/Toggle Button/main.vala b/src/Toggle Button/main.vala new file mode 100644 index 00000000..d3835968 --- /dev/null +++ b/src/Toggle Button/main.vala @@ -0,0 +1,18 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + + string[] button_ids = { "button_no_look", "button_look", "button_camera", "button_flashlight", "button_console" }; + string[] button_names = { "Don't look", "Look", "Camera", "Flashlight", "Console" }; + + for (int i = 0; i < button_ids.length; i++) { + string id = button_ids[i]; + string name = button_names[i]; + var button = (Gtk.ToggleButton) workbench.builder.get_object (id); + + button.notify["active"].connect (() => { + string status = button.active ? "On" : "Off"; + message (@"$name $status"); + }); + } +} From a2141bff738aa5b34375ae841448a3f3683a5b4f Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Thu, 6 Jun 2024 13:00:16 +0530 Subject: [PATCH 25/58] Port 'Network Monitor' demo to Vala (#162) --- src/Network Monitor/main.vala | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/Network Monitor/main.vala diff --git a/src/Network Monitor/main.vala b/src/Network Monitor/main.vala new file mode 100644 index 00000000..49cc8484 --- /dev/null +++ b/src/Network Monitor/main.vala @@ -0,0 +1,20 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +void set_network_status (Adw.Banner banner, NetworkMonitor network_monitor, Gtk.LevelBar level_bar) { + banner.revealed = network_monitor.network_metered; + level_bar.value = (double) network_monitor.connectivity; +} + +public void main () { + var banner = (Adw.Banner) workbench.builder.get_object ("banner"); + var network_monitor = NetworkMonitor.get_default (); + var level_bar = (Gtk.LevelBar) workbench.builder.get_object ("level_bar"); + + set_network_status (banner, network_monitor, level_bar); + network_monitor.network_changed.connect (() => { + set_network_status (banner, network_monitor, level_bar); + }); + banner.button_clicked.connect (() => { + banner.revealed = false; + }); +} From b7a7a09b892b5bf41906c77993e5932a864582d4 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Sun, 9 Jun 2024 04:59:46 +0530 Subject: [PATCH 26/58] demos: Port 'Select Folder' demo to Vala (#170) --- src/Select Folder/main.vala | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/Select Folder/main.vala diff --git a/src/Select Folder/main.vala b/src/Select Folder/main.vala new file mode 100644 index 00000000..d996b0cf --- /dev/null +++ b/src/Select Folder/main.vala @@ -0,0 +1,44 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +async void select_folder () { + var dialog_for_folder = new Gtk.FileDialog (); + try { + File file = yield dialog_for_folder.select_folder (workbench.window, null); + + FileInfo info = file.query_info ( + "standard::name", + FileQueryInfoFlags.NONE, + null + ); + string name = info.get_name (); + message (@"$(name) selected"); + } catch (Error e) { + message (@"$(e.message)"); + } +} + +async void multiple_folders () { + var dialog = new Gtk.FileDialog (); + try { + ListModel folders = yield dialog.select_multiple_folders (workbench.window, null); + + uint selected_items_count = folders.get_n_items (); + + message (@"$(selected_items_count) selected folders"); + } catch (Error e) { + message (@"$(e.message)"); + } +} + +public void main () { + var button_single = (Gtk.Button) workbench.builder.get_object ("button_single"); + var button_multiple = (Gtk.Button) workbench.builder.get_object ("button_multiple"); + + button_single.clicked.connect (() => { + select_folder.begin (); + }); + + button_multiple.clicked.connect (() => { + multiple_folders.begin (); + }); +} From a427eba38f1bc28531a0bae7ab16a0b4f6d83e43 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Sun, 9 Jun 2024 05:00:47 +0530 Subject: [PATCH 27/58] Port 'Font Dialog' to Vala (#161) --- src/Font Dialog/main.vala | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/Font Dialog/main.vala diff --git a/src/Font Dialog/main.vala b/src/Font Dialog/main.vala new file mode 100644 index 00000000..6c15369c --- /dev/null +++ b/src/Font Dialog/main.vala @@ -0,0 +1,37 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +async void on_clicked (Gtk.FontDialog dialog_custom) { + try { + Pango.FontFamily family = yield dialog_custom.choose_family (workbench.window, null, null); + + message (@"Font Family: $(family.get_name())"); + } catch (Error err) { + warning (@"Error: $(err.message)"); + } +} + +public void main () { + var font_dialog_button = (Gtk.FontDialogButton) workbench.builder.get_object ("font_dialog_button"); + var custom_button = (Gtk.Button) workbench.builder.get_object ("custom_button"); + + var dialog_standard = new Gtk.FontDialog () { + title = "Select a Font", + modal = true + }; + + font_dialog_button.dialog = dialog_standard; + + font_dialog_button.notify["font-desc"].connect (() => { + string font_name = font_dialog_button.get_font_desc ().to_string (); + message (@"Font: $(font_name)"); + }); + + var dialog_custom = new Gtk.FontDialog () { + title = "Select a Font Family", + modal = true + }; + + custom_button.clicked.connect (() => { + on_clicked.begin (dialog_custom); + }); +} From 3524480907fd222667cd8c46a9e5082f18646876 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Sun, 9 Jun 2024 05:01:03 +0530 Subject: [PATCH 28/58] Port 'Drawing Area' demo to Vala (#154) --- src/Drawing Area/main.vala | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/Drawing Area/main.vala diff --git a/src/Drawing Area/main.vala b/src/Drawing Area/main.vala new file mode 100644 index 00000000..9dda7289 --- /dev/null +++ b/src/Drawing Area/main.vala @@ -0,0 +1,37 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +double to_radians (double degrees) { + return degrees * (Math.PI / 180); +} + +public void main () { + var drawing_area = (Gtk.DrawingArea) workbench.builder.get_object ("drawing_area"); + var scale_rotate = (Gtk.Scale) workbench.builder.get_object ("scale"); + + double[,] triangle = { { 100.0, 100.0 }, + { 0.0, -100.0 }, + { -100.0, 100.0 } }; + + double angle = 0.0; + + drawing_area.set_draw_func ((area, cairo_context, width, height) => { + cairo_context.translate (height / 2, width / 2); + + cairo_context.rotate (angle); + cairo_context.move_to (triangle[2, 0], triangle[2, 1]); + for (int i = 0; i < 3; i++) { + cairo_context.line_to (triangle[i, 0], triangle[i, 1]); + } + + cairo_context.set_source_rgba (1, + 0, + 1, + 1); + cairo_context.stroke (); + }); + + scale_rotate.value_changed.connect (() => { + angle = to_radians (scale_rotate.get_value ()); + drawing_area.queue_draw (); + }); +} From 58d04eb3be70a16244a7f5cad6d8e96c1542ee79 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Sun, 9 Jun 2024 07:29:01 +0530 Subject: [PATCH 29/58] Port 'Power Profile Monitor' demo to Vala (#164) --- src/Power Profile Monitor/main.vala | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/Power Profile Monitor/main.vala diff --git a/src/Power Profile Monitor/main.vala b/src/Power Profile Monitor/main.vala new file mode 100644 index 00000000..4a2c0aeb --- /dev/null +++ b/src/Power Profile Monitor/main.vala @@ -0,0 +1,19 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + var overlay = (Adw.ToastOverlay) workbench.builder.get_object ("overlay"); + var power_profile_monitor = PowerProfileMonitor.dup_default (); + + power_profile_monitor.notify["power-saver-enabled"].connect (() => { + var toast = new Adw.Toast ("power-saver") { + priority = Adw.ToastPriority.HIGH + }; + + if (power_profile_monitor.power_saver_enabled) { + toast.title = "Power Saver Enabled"; + } else { + toast.title = "Power Saver Disabled"; + } + overlay.add_toast (toast); + }); +} From 747fa4ebb6e46d6b0b82c397abff2d39b6572fc3 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Sun, 9 Jun 2024 07:29:27 +0530 Subject: [PATCH 30/58] Port 'Label' demo to Vala (#159) --- src/Label/main.vala | 61 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/Label/main.vala diff --git a/src/Label/main.vala b/src/Label/main.vala new file mode 100644 index 00000000..1f2092cb --- /dev/null +++ b/src/Label/main.vala @@ -0,0 +1,61 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + var label = (Gtk.Label) workbench.builder.get_object ("label"); + var justification_row = (Adw.ComboRow) workbench.builder.get_object ("justification_row"); + var style_row = (Adw.ComboRow) workbench.builder.get_object ("style_row"); + var single_line_switch = (Adw.SwitchRow) workbench.builder.get_object ("single_line_switch"); + + string[] style_classes = { + "none", + "title-1", + "title-2", + "title-3", + "title-4", + "monospace", + "accent", + "success", + "warning", + "error", + "heading", + "body", + "caption-heading", + "caption" + }; + + string short_label = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore disputandum putant."; + + string long_label = + " Lorem ipsum dolor sit amet, consectetur adipiscing elit, + sed do eiusmod tempor incididunt ut labore et dolore magnam aliquam quaerat voluptatem. + Ut enim mortis metu omnis quietae vitae status perturbatur, + et ut succumbere doloribus eosque humili animo inbecilloque ferre miserum est, + ob eamque debilitatem animi multi parentes, multi amicos, non nulli patriam, + plerique autem se ipsos penitus perdiderunt, sic robustus animus et excelsus omni."; + + label.label = (short_label); + + single_line_switch.notify["active"].connect (() => { + if (!single_line_switch.active) { + label.label = long_label; + } else { + label.label = short_label; + } + }); + + justification_row.notify["selected"].connect (() => { + label.justify = (Gtk.Justification) justification_row.selected; + }); + + style_row.notify["selected"].connect (() => { + foreach (string style_class in style_classes) { + label.remove_css_class (style_class); + } + + if (style_row.selected == 0)return; + + string new_style_class = style_classes[style_row.selected]; + label.add_css_class (new_style_class); + }); +} From 51e576506674fa81df0bb98cf7934e9d9d8524c5 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Mon, 10 Jun 2024 02:08:39 +0530 Subject: [PATCH 31/58] Port 'Progress Bar' demo to Vala (#168) --- src/Progress Bar/main.vala | 67 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/Progress Bar/main.vala diff --git a/src/Progress Bar/main.vala b/src/Progress Bar/main.vala new file mode 100644 index 00000000..a2245894 --- /dev/null +++ b/src/Progress Bar/main.vala @@ -0,0 +1,67 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + + var first_bar = (Gtk.ProgressBar) workbench.builder.get_object ("first"); + var second_bar = (Gtk.ProgressBar) workbench.builder.get_object ("second"); + var play = (Gtk.Button) workbench.builder.get_object ("play"); + var progress_tracker = (Gtk.Label) workbench.builder.get_object ("progress_tracker"); + + var target = new Adw.PropertyAnimationTarget (first_bar, "fraction"); + + var animation = new Adw.TimedAnimation ( + first_bar, // widget + 0.2, // value_from + 1, // value_to + 11000, // duration + target // target + ) { + easing = LINEAR + }; + + animation.done.connect (() => { + animation.reset (); + }); + + play.clicked.connect (() => { + animation.play (); + update_tracker (second_bar); + pulse_progress (progress_tracker); + }); +} + +void update_tracker (Gtk.ProgressBar second_bar) { + double counter = 0.0; + const int pulse_period = 500; + const int duration = 10000; + double increment = (double) pulse_period / duration; + + Timeout.add (pulse_period, () => { + if (counter >= 1.0) { + counter = 0.0; + second_bar.fraction = 0.0; + return false; + } + + second_bar.pulse (); + counter += increment; + return true; + }, Priority.DEFAULT); +} + +void pulse_progress (Gtk.Label progress_tracker) { + + int time = 10; + + Timeout.add (1000, () => { + if (time == 0) { + progress_tracker.label = (""); + message (@"Operation complete!"); + return false; + } + + progress_tracker.label = (@"$time seconds remaining…"); + time -= 1; + return true; + }, Priority.DEFAULT); +} From 86ef030ce2cc561131d71a33d373ec4be7014144 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Mon, 10 Jun 2024 02:09:17 +0530 Subject: [PATCH 32/58] Port 'Spin Button' demo to Vala (#171) --- src/Spin Button/main.vala | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/Spin Button/main.vala diff --git a/src/Spin Button/main.vala b/src/Spin Button/main.vala new file mode 100644 index 00000000..9ed95fc2 --- /dev/null +++ b/src/Spin Button/main.vala @@ -0,0 +1,43 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +private Gtk.SpinButton hours; +private Gtk.SpinButton minutes; + +string tell_time () { + return (@"The time selected is $(hours.text):$(minutes.text)"); +} + +public void main () { + hours = (Gtk.SpinButton) workbench.builder.get_object ("hours"); + minutes = (Gtk.SpinButton) workbench.builder.get_object ("minutes"); + + hours.text = "00"; + minutes.text = "00"; + + hours.value_changed.connect (() => { + message (@"$(tell_time ())"); + }); + + minutes.value_changed.connect (() => { + message (@"$(tell_time ())"); + }); + + + hours.output.connect (() => { + var value = (int) hours.adjustment.value; + hours.text = "%02d".printf (value); + return true; + }); + + minutes.output.connect (() => { + var value = (int) minutes.adjustment.value; + minutes.text = "%02d".printf (value); + return true; + }); + + // This only works for one direction + // Add any extra logic to account for wrapping in both directions + minutes.wrapped.connect (() => { + hours.spin (STEP_FORWARD, 1); + }); +} From 1ff960580767b8ef1ccf45a8493fb145981fdada Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Mon, 10 Jun 2024 02:09:56 +0530 Subject: [PATCH 33/58] Port 'Save File' demo to Vala (#169) --- src/Save File/main.vala | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/Save File/main.vala diff --git a/src/Save File/main.vala b/src/Save File/main.vala new file mode 100644 index 00000000..781f395a --- /dev/null +++ b/src/Save File/main.vala @@ -0,0 +1,32 @@ +#! /usr/bin/env -S vala workbench.vala --pkg gtk4 + +async void save_file () { + var file_dialog = new Gtk.FileDialog () { + initial_name = "Workbench.txt" + }; + try { + File file = yield file_dialog.save (workbench.window, null); + + uint8[] contents = ("Hello from Workbench!").data; + + yield file.replace_contents_async (contents, // contents + null, // etag + false, // make_backup + FileCreateFlags.NONE, // flags + null, // cancellable + null // callback + ); + + message (@"File $(file.get_basename()) saved"); + } catch (Error e) { + message (@"$(e.message)"); + } +} + +public void main () { + var button = (Gtk.Button) workbench.builder.get_object ("button"); + + button.clicked.connect (() => { + save_file.begin (); + }); +} From a95c432fbd14b8a86c4de559e8b3b293754c2330 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:59:01 +0530 Subject: [PATCH 34/58] Port 'Session Monitor and Inhibit' to Vala (#176) --- src/Session Monitor and Inhibit/main.vala | 89 +++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/Session Monitor and Inhibit/main.vala diff --git a/src/Session Monitor and Inhibit/main.vala b/src/Session Monitor and Inhibit/main.vala new file mode 100644 index 00000000..bcb4af09 --- /dev/null +++ b/src/Session Monitor and Inhibit/main.vala @@ -0,0 +1,89 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg libportal-gtk4 +private Xdp.Portal portal; +private Gtk.Button button_start; +private Gtk.Button button_stop; +private Adw.SwitchRow switch_row_logout; +private Adw.SwitchRow switch_row_idle; +private Xdp.Parent parent; +private Adw.EntryRow entry; +private List ids; + +public void main () { + portal = new Xdp.Portal (); + parent = Xdp.parent_new_gtk (workbench.window); + entry = (Adw.EntryRow) workbench.builder.get_object ("entry"); + switch_row_logout = (Adw.SwitchRow) workbench.builder.get_object ("switch_row_logout"); + switch_row_idle = (Adw.SwitchRow) workbench.builder.get_object ("switch_row_idle"); + button_start = (Gtk.Button) workbench.builder.get_object ("button_start"); + button_stop = (Gtk.Button) workbench.builder.get_object ("button_stop"); + ids = new List (); + + button_start.clicked.connect (() => { + start_session.begin (); + }); + + button_stop.clicked.connect (() => { + stop_session.begin (); + }); + + portal.session_state_changed.connect ((self, screensaver_active, session_state) => { + + if (screensaver_active) { + message (@"Screensaver is active"); + } + switch (session_state) { + case Xdp.LoginSessionState.RUNNING: + message (@"Session: Running"); + break; + case Xdp.LoginSessionState.QUERY_END: + message (@"Session: Query End"); + portal.session_monitor_query_end_response (); + break; + case Xdp.LoginSessionState.ENDING: + message (@"Session: Ending"); + break; + } + }); +} + +async void start_session () { + try { + bool result = yield portal.session_monitor_start (parent, NONE, null); + + if (result) { + button_start.sensitive = false; + button_stop.sensitive = true; + if (switch_row_logout.active)inhibit_session.begin (Xdp.InhibitFlags.LOGOUT); + if (switch_row_idle.active)inhibit_session.begin (Xdp.InhibitFlags.IDLE); + /* + Xdp Portal also supports inhibition of Suspend and User Switch + using the flags SUSPEND and USER_SWITCH respectively. But these + actions cannot be inhibited on GNOME as they do not end user's + session. + */ + } + } catch (Error e) { + warning (@"$(e.message)"); + } +} + +async void stop_session () { + foreach (int id in ids) { + portal.session_uninhibit (id); + } + ids = new List (); + portal.session_monitor_stop (); + button_start.sensitive = true; + button_stop.sensitive = false; +} + +async void inhibit_session (Xdp.InhibitFlags flag) { + string reason = entry.text; + try { + int id = yield portal.session_inhibit (parent, reason, flag, null); + + ids.append (id); + } catch (Error e) { + warning (@"$(e.message)"); + } +} From 6a740835fc57de4ecfe444abaf48e237aa17a86d Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:59:12 +0530 Subject: [PATCH 35/58] Port 'Map' demo to Vala (#174) --- src/Map/main.vala | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/Map/main.vala diff --git a/src/Map/main.vala b/src/Map/main.vala new file mode 100644 index 00000000..1f81b999 --- /dev/null +++ b/src/Map/main.vala @@ -0,0 +1,87 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg shumate-1.0 + +private Shumate.SimpleMap map_widget; +private Shumate.Viewport viewport; +private Gtk.Entry entry_latitude; +private Gtk.Entry entry_longitude; + + +void go_to_location () { + float latitude = 0, longitude = 0; + + if (!float.try_parse (entry_latitude.text, out latitude) || !float.try_parse + (entry_longitude.text, out longitude)) { + message (@"Please enter valid coordinates"); + return; + } + + if (latitude > Shumate.MAX_LATITUDE || latitude < Shumate.MIN_LATITUDE) { + message ( + @"Latitudes must be between $(Shumate.MIN_LATITUDE) and $(Shumate.MAX_LATITUDE)"); + return; + } + + if (longitude > Shumate.MAX_LONGITUDE || longitude < Shumate.MIN_LONGITUDE) { + message ( + @"Longitudes must be between $(Shumate.MIN_LONGITUDE) and $(Shumate.MAX_LONGITUDE)" + ); + return; + } + viewport.zoom_level = 5; + map_widget.map.go_to (latitude, longitude); +} + +public void main () { + map_widget = (Shumate.SimpleMap) workbench.builder.get_object ("map_widget"); + var registry = new Shumate.MapSourceRegistry.with_defaults (); + + // Use OpenStreetMap as the source + var map_source = registry.get_by_id (Shumate.MAP_SOURCE_OSM_MAPNIK); + viewport = map_widget.viewport; + + map_widget.map_source = map_source; + map_widget.map.center_on (0, 0); + + // Reference map source used by MarkerLayer + viewport.reference_map_source = map_source; + viewport.zoom_level = 5; + + var marker_layer = new Shumate.MarkerLayer (viewport) { + selection_mode = SINGLE + }; + + var marker = (Shumate.Marker) workbench.builder.get_object ("marker"); + marker.set_location (0, 0); + marker_layer.add_marker (marker); + map_widget.map.add_layer (marker_layer); + + var gesture = new Gtk.GestureClick (); + map_widget.add_controller (gesture); + + var button_marker = (Gtk.ToggleButton) workbench.builder.get_object ("button_marker"); + + gesture.pressed.connect ((self, n_press, x, y) => { + if (button_marker.active) { + double latitude, longitude; + viewport.widget_coords_to_location (map_widget, x, y, out latitude, out longitude); + marker.set_location (latitude, longitude); + message (@"Marker placed at $(latitude), $(longitude)"); + } + }); + + entry_latitude = (Gtk.Entry) workbench.builder.get_object ("entry_latitude"); + entry_longitude = (Gtk.Entry) workbench.builder.get_object ("entry_longitude"); + var button_go = (Gtk.Button) workbench.builder.get_object ("button_go"); + + button_go.clicked.connect (() => { + go_to_location (); + }); + + entry_latitude.activate.connect (() => { + go_to_location (); + }); + + entry_longitude.activate.connect (() => { + go_to_location (); + }); +} From 12fe3fc227a2cda8735e127c4d197678514bcedb Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:59:33 +0530 Subject: [PATCH 36/58] Port 'HTTP Server' demo to Vala (#173) --- src/HTTP Server/main.vala | 85 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/HTTP Server/main.vala diff --git a/src/HTTP Server/main.vala b/src/HTTP Server/main.vala new file mode 100644 index 00000000..0fedf3b6 --- /dev/null +++ b/src/HTTP Server/main.vala @@ -0,0 +1,85 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg libsoup-3.0 +private Gtk.Label label_greetings; +private Gtk.ToggleButton button_server; +private Gtk.LinkButton linkbutton; +int port; + +void handler (Soup.Server server, Soup.ServerMessage msg, string path, HashTable? query) { + var content_type_params = new HashTable (str_hash, str_equal); + content_type_params["charset"] = "UTF-8"; + + msg.set_status (Soup.Status.OK, null); + msg.get_response_headers ().set_content_type ("text/html", content_type_params); + msg.get_response_body ().append_take (""" + + +
+ + + +
+ + + """.data); +} + +void hello_handler (Soup.Server server, Soup.ServerMessage msg, string path, HashTable? query) { + if (query == null) { + msg.set_redirect (Soup.Status.FOUND, "/"); + return; + } + + string user_agent = msg.get_request_headers ().get_one ("User-Agent"); + string name = query["name"]; + label_greetings.label = (@"Hello $(name), your browser is\n$(user_agent)"); + var content_type_params = new HashTable (str_hash, str_equal); + content_type_params["charset"] = "UTF-8"; + msg.set_status (Soup.Status.OK, null); + msg.get_response_headers ().set_content_type ("text/html", content_type_params); + msg.get_response_body ().append_take (" + + + Thank you, please go back to Workbench. + + + ".data); +} + +void start_server (Soup.Server server) { + try { + server.listen_local (port, 0); + SList uri = server.get_uris (); + port = uri.data.get_port (); + linkbutton.uri = (@"http://localhost:$(port)"); + + button_server.label = "Stop Server"; + } catch (Error e) { + warning (@"$(e.message)"); + } +} + +void stop_server (Soup.Server server) { + server.disconnect (); + linkbutton.uri = ""; + button_server.label = "Start Server"; +} + +public void main () { + + button_server = (Gtk.ToggleButton) workbench.builder.get_object ("button_server"); + linkbutton = (Gtk.LinkButton) workbench.builder.get_object ("linkbutton"); + label_greetings = (Gtk.Label) workbench.builder.get_object ("label_greetings"); + + var server = new Soup.Server (""); + + server.add_handler ("/", handler); + server.add_handler ("/hello", hello_handler); + + button_server.clicked.connect (() => { + if (button_server.active) { + start_server (server); + } else { + stop_server (server); + } + }); +} From 9dad1c37f4aa72070ea2756631367fda2b90fa6b Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:59:48 +0530 Subject: [PATCH 37/58] Port 'Menu' demo to Vala (#172) --- src/Menu/main.vala | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/Menu/main.vala diff --git a/src/Menu/main.vala b/src/Menu/main.vala new file mode 100644 index 00000000..3b1fe741 --- /dev/null +++ b/src/Menu/main.vala @@ -0,0 +1,60 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 + +public void main () { + var label = (Gtk.Label) workbench.builder.get_object ("label"); + + var text_group = new SimpleActionGroup (); + label.insert_action_group ("text", text_group); + + var text_state = new HashTable (str_hash, str_equal); + text_state.insert ("italic", false); + text_state.insert ("bold", false); + text_state.insert ("foreground", "green"); + + var italic_action = new SimpleAction.stateful ("italic", null, new Variant.boolean (false)); + italic_action.notify["state"].connect (() => { + text_state.replace ("italic", italic_action.state.get_boolean ()); + label.attributes = (state_to_attr (text_state)); + }); + text_group.add_action (italic_action); + + var bold_action = new SimpleAction.stateful ("bold", null, new Variant.boolean (false)); + bold_action.notify["state"].connect (() => { + text_state.replace ("bold", bold_action.state.get_boolean ()); + label.attributes = (state_to_attr (text_state)); + }); + text_group.add_action (bold_action); + + var color_action = new SimpleAction.stateful ("color", new VariantType ("s"), new Variant.string ("green")); + color_action.notify["state"].connect (() => { + text_state.replace ("foreground", color_action.state.get_string ()); + label.attributes = (state_to_attr (text_state)); + }); + text_group.add_action (color_action); +} + +// Helper function to create a PangoAttrList from text_state +private Pango.AttrList state_to_attr (HashTable state) { + string attr_string = ""; + GenericArray attrs = new GenericArray (); + + Variant? bold_variant = state.lookup ("bold"); + if (bold_variant != null && bold_variant.get_boolean ()) { + attrs.add (@"0 -1 weight bold"); + } + + Variant? italic_variant = state.lookup ("italic"); + if (italic_variant != null && italic_variant.get_boolean ()) { + attrs.add (@"0 -1 style italic"); + } + + string color = state.lookup ("foreground").get_string (); + if (color != null) { + attrs.add (@"0 -1 foreground $color"); + } + + foreach (string arr_attrb in attrs) { + attr_string += arr_attrb + ", "; + } + return Pango.AttrList.from_string (attr_string); +} From bb5df9b69152334e67dc79a31db4e7f0ba884141 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Sun, 16 Jun 2024 17:27:24 +0530 Subject: [PATCH 38/58] Port 'Scrolled Window' demo to Vala (#178) --- src/Scrolled Window/main.vala | 110 ++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/Scrolled Window/main.vala diff --git a/src/Scrolled Window/main.vala b/src/Scrolled Window/main.vala new file mode 100644 index 00000000..25b154bf --- /dev/null +++ b/src/Scrolled Window/main.vala @@ -0,0 +1,110 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 +private bool auto_scrolling = false; + +public void main () { + var scrolled_window = (Gtk.ScrolledWindow) workbench.builder.get_object ("scrolled_window"); + var container = (Gtk.Box) workbench.builder.get_object ("container"); + var toggle_orientation = (Gtk.ToggleButton) workbench.builder.get_object ("toggle_orientation"); + var button_start = (Gtk.Button) workbench.builder.get_object ("button_start"); + var button_end = (Gtk.Button) workbench.builder.get_object ("button_end"); + + button_start.sensitive = false; + + HashTable scrollbars = new HashTable (direct_hash, direct_equal); + scrollbars[Gtk.Orientation.HORIZONTAL] = (Gtk.Scrollbar) scrolled_window.get_hscrollbar (); + scrollbars[Gtk.Orientation.VERTICAL] = (Gtk.Scrollbar) scrolled_window.get_vscrollbar (); + + toggle_orientation.toggled.connect (() => { + if (toggle_orientation.active) { + container.orientation = Gtk.Orientation.HORIZONTAL; + } else { + container.orientation = Gtk.Orientation.VERTICAL; + } + }); + + int num_items = 20; + for (int i = 0; i < num_items; i++) { + populate_container (container, @"Item $(i + 1)"); + } + + foreach (Gtk.Orientation orientation in scrollbars.get_keys ()) { + Gtk.Scrollbar scrollbar = scrollbars[orientation]; + Gtk.Adjustment adj = scrollbar.adjustment; + adj.value_changed.connect (() => { + if (adj.value == adj.lower) { + button_end.sensitive = true; + button_start.sensitive = false; + } else if (adj.value == adj.upper - adj.page_size) { + button_end.sensitive = false; + button_start.sensitive = true; + } else { + // Disable buttons if scrollbar is auto-scrolling + button_end.sensitive = !auto_scrolling; + button_start.sensitive = !auto_scrolling; + } + }); + } + + scrolled_window.edge_reached.connect (() => { + message (@"Edge Reached"); + }); + + button_start.clicked.connect (() => { + auto_scrolling = true; + Gtk.Scrollbar scrollbar = scrollbars[container.orientation]; + Adw.Animation anim = create_scrollbar_anim (scrollbar, false); + anim.play (); + }); + + button_end.clicked.connect (() => { + auto_scrolling = true; + Gtk.Scrollbar scrollbar = scrollbars[container.orientation]; + Adw.Animation anim = create_scrollbar_anim (scrollbar, true); + anim.play (); + }); +} + +void populate_container (Gtk.Box container, string label) { + Gtk.Widget item = new Adw.Bin () { + margin_top = 6, + margin_bottom = 6, + margin_start = 6, + margin_end = 6, + child = new Gtk.Label (label) { + width_request = 100, + height_request = 100 + }, + css_classes = { "card" } + }; + + container.append (item); +} + +Adw.TimedAnimation create_scrollbar_anim (Gtk.Scrollbar scrollbar, bool direction) { + // direction = 0 -> Animates to Start + // direction = 1 -> Animates to End + Gtk.Adjustment adjustment = scrollbar.adjustment; + double value_to = 0; + if (direction) { + value_to = adjustment.upper - adjustment.page_size; + } else { + value_to = 0; + } + + var target = new Adw.PropertyAnimationTarget (adjustment, "value"); + var animation = new Adw.TimedAnimation ( + scrollbar, // widget + adjustment.value, // value_from + value_to, // value_to + 1000, // duration + target // target + ) { + easing = LINEAR + }; + + animation.done.connect (() => { + auto_scrolling = false; + }); + + return animation; +} From 0db011334ad15bfc60ef4aaca6c90a1dec7d705c Mon Sep 17 00:00:00 2001 From: Sonny Date: Tue, 25 Jun 2024 00:31:54 +0200 Subject: [PATCH 39/58] Use Blueprint to create the GtkSourceView (#182) --- src/Source View/main.blp | 15 ++++++++++++--- src/Source View/main.js | 20 +++++--------------- src/Source View/main.py | 21 +++++++-------------- src/Source View/main.vala | 23 +++++++---------------- 4 files changed, 31 insertions(+), 48 deletions(-) diff --git a/src/Source View/main.blp b/src/Source View/main.blp index 3d7ad953..7ccc9dcc 100644 --- a/src/Source View/main.blp +++ b/src/Source View/main.blp @@ -10,15 +10,24 @@ Adw.StatusPage { orientation: vertical; halign: center; - ScrolledWindow scrolled_window { + ScrolledWindow { height-request: 180; width-request: 600; has-frame: true; + + GtkSource.View { + auto-indent: true; + indent-width: 2; + show-line-numbers: true; + monospace: true; + + buffer: GtkSource.Buffer buffer {}; + } } LinkButton { - label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/gtksourceview/gtksourceview5/class.View.html"; + label: _("Documentation"); + uri: "https://gnome.pages.gitlab.gnome.org/gtksourceview/gtksourceview5/"; } } } diff --git a/src/Source View/main.js b/src/Source View/main.js index 08c89510..8f1d1c78 100644 --- a/src/Source View/main.js +++ b/src/Source View/main.js @@ -4,22 +4,12 @@ import GtkSource from "gi://GtkSource"; // However, you _have_ to call this once during the startup in your application - e.g. in GApplication::startup GtkSource.init(); -// Get the language we want to use +const buffer = workbench.builder.get_object("buffer"); + +// Set the language we want to use const language_manager = GtkSource.LanguageManager.get_default(); const language = language_manager.get_language("js"); +buffer.set_language(language); -// Create the buffer - this holds the text that's used in the SourceView -const buffer = GtkSource.Buffer.new_with_language(language); +// The buffer holds the text that's used in the SourceView buffer.set_text('console.log("Hello World!");', -1); - -// Create the SourceView which displays the buffer's display -const source_view = new GtkSource.View({ - auto_indent: true, - indent_width: 4, - buffer, - show_line_numbers: true, -}); - -// Add the SourceView to our ScrolledView so its displayed -const scrolled_window = workbench.builder.get_object("scrolled_window"); -scrolled_window.set_child(source_view); diff --git a/src/Source View/main.py b/src/Source View/main.py index ae22d191..20aea80a 100644 --- a/src/Source View/main.py +++ b/src/Source View/main.py @@ -2,26 +2,19 @@ gi.require_version("Gtk", "4.0") gi.require_version("GtkSource", "5") -from gi.repository import Gtk, GtkSource +from gi.repository import GtkSource import workbench # Strictly speaking we don't _have_ to do this here since WorkBench does this for us. # However, you _have_ to call this once during the startup in your application - e.g. in GApplication::startup GtkSource.init() -# Get the language we want to use +buffer = workbench.builder.get_object("buffer") + +# Set the language we want to use language_manager = GtkSource.LanguageManager.get_default() language = language_manager.get_language("js") +buffer.set_language(language) -# Create the buffer - this holds the text that's used in the SourceView -buffer = GtkSource.Buffer.new_with_language(language) -buffer.set_text('console.log("Hello World!")', -1) - -# Create the SourceView which displays the buffer's display -source_view = GtkSource.View( - auto_indent=True, indent_width=4, buffer=buffer, show_line_numbers=True -) - -# Add the SourceView to our ScrolledView so its displayed -scrolled_window: Gtk.ScrolledWindow = workbench.builder.get_object("scrolled_window") -scrolled_window.set_child(source_view) +# The buffer holds the text that's used in the SourceView +buffer.set_text('print "Hello World"', -1) diff --git a/src/Source View/main.vala b/src/Source View/main.vala index a53c9943..2621ca40 100644 --- a/src/Source View/main.vala +++ b/src/Source View/main.vala @@ -7,22 +7,13 @@ public void main () { */ GtkSource.init (); - // Get the language we want to use - var language_manager = GtkSource.LanguageManager.get_default (); - var language = language_manager.get_language ("js"); - // Create the buffer - this holds the text that's used in the SourceView - var buffer = new GtkSource.Buffer.with_language (language) { - text = "console.log(\"Hello World!\");" - }; + var buffer = (GtkSource.Buffer) workbench.builder.get_object ("buffer"); - // Create the SourceView which displays the buffer's display - var source_view = new GtkSource.View.with_buffer (buffer) { - auto_indent = true, - indent_width = 4, - show_line_numbers = true - }; + // Set the language we want to use + var language_manager = GtkSource.LanguageManager.get_default (); + var language = language_manager.get_language ("vala"); + buffer.language = language; - // Add the SourceView to our ScrolledView so its displayed - var scrolled_window = (Gtk.ScrolledWindow) workbench.builder.get_object ("scrolled_window"); - scrolled_window.child = source_view; + // The buffer holds the text that's used in the SourceView + buffer.text = "stdout.printf (\"Hello World\");"; } From 644fb6bb604bc8cf0067262f8965d57a782f9a80 Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Tue, 25 Jun 2024 23:00:37 +0530 Subject: [PATCH 40/58] Port 'File Monitor' demo to Vala (#175) --- src/File Monitor/main.vala | 82 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/File Monitor/main.vala diff --git a/src/File Monitor/main.vala b/src/File Monitor/main.vala new file mode 100644 index 00000000..51aaf71b --- /dev/null +++ b/src/File Monitor/main.vala @@ -0,0 +1,82 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg gio-2.0 + +private FileMonitor monitor_for_dir; +private FileMonitor monitor_for_file; +public void main () { + + var edit_entry = (Gtk.TextView) workbench.builder.get_object ("edit_entry"); + var view_file = (Gtk.Button) workbench.builder.get_object ("view_file"); + var delete_file = (Gtk.Button) workbench.builder.get_object ("delete_file"); + var edit_file = (Gtk.Button) workbench.builder.get_object ("edit_file"); + var file_name = (Gtk.Label) workbench.builder.get_object ("file_name"); + Gtk.TextBuffer buffer = edit_entry.buffer; + File file = File.new_for_uri (workbench.resolve ("workbench.txt")); + File file_dir = file.get_parent (); + var overlay = (Adw.ToastOverlay) workbench.builder.get_object ("overlay"); + var file_launcher = new Gtk.FileLauncher (file); + try { + FileInfo details = file.query_info ( + "standard::display-name", + FileQueryInfoFlags.NONE, + null); + file_name.label = details.get_display_name (); + buffer.text = "Start editing ... "; + monitor_for_dir = file_dir.monitor (FileMonitorFlags.WATCH_MOVES, null); + monitor_for_file = file.monitor (FileMonitorFlags.NONE, null); + } catch (Error e) { + message (@"$(e.message)"); + } + + delete_file.clicked.connect (() => file.delete_async.begin (Priority.DEFAULT, null)); + + view_file.clicked.connect (() => file_launcher.launch.begin (workbench.window, null)); + + monitor_for_file.changed.connect ((file, other_file, event) => { + if (event == FileMonitorEvent.CHANGES_DONE_HINT) { + var toast = new Adw.Toast ("File modified") { + timeout = 2 + }; + overlay.add_toast (toast); + } + }); + + monitor_for_dir.changed.connect ((child, other_file, event) => { + var toast = new Adw.Toast ("") { + timeout = 2 + }; + + switch (event) { + case FileMonitorEvent.RENAMED: + toast.title = @"$(child.get_basename()) was renamed to $(other_file.get_basename())"; + break; + case FileMonitorEvent.DELETED: + toast.title = @"$(child.get_basename()) was deleted from the directory"; + break; + case FileMonitorEvent.CREATED: + toast.title = @"$(child.get_basename()) created in the directory"; + break; + default: + break; + } + + if (toast.title != "")overlay.add_toast (toast); + }); + + edit_file.clicked.connect (() => replace_handler.begin (buffer, file)); +} + +async void replace_handler (Gtk.TextBuffer buffer, File file) { + string byte_string = buffer.text; + uint8[] bytes = byte_string.data; + try { + yield file.replace_contents_async (bytes, // contents + null, // etag + false, // make_backup + FileCreateFlags.REPLACE_DESTINATION, // flags + null, // new_etag + null // cancellable + ); + } catch (Error e) { + message (@"$(e.message)"); + } +} From f0e3559c0f7cfd8a083bac51d17374f9460d624d Mon Sep 17 00:00:00 2001 From: Sonny Date: Tue, 16 Jul 2024 14:42:59 +0200 Subject: [PATCH 41/58] Fix CI by using Workbench devel (#189) --- .github/workflows/CI.yaml | 2 +- .gitignore | 1 + Makefile | 21 ++++++++++++--------- src/Column View/main.js | 2 +- src/Drop Down/main.js | 2 +- src/Wallpaper/main.js | 4 ++-- 6 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml index f3e705c0..5dd1ac49 100644 --- a/.github/workflows/CI.yaml +++ b/.github/workflows/CI.yaml @@ -6,7 +6,7 @@ on: jobs: CI: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v3 with: diff --git a/.gitignore b/.gitignore index fa186403..df0f9cfd 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ src/*/workbench.rs src/*/target src/*/*.gresource src/*/*.gresource.xml +src/*/jsconfig.json diff --git a/Makefile b/Makefile index f0db102b..2ac9bfca 100644 --- a/Makefile +++ b/Makefile @@ -4,24 +4,26 @@ SHELL:=/bin/bash -O globstar setup: flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo + flatpak install --or-update --user --noninteractive flathub org.freedesktop.Sdk.Extension.rust-stable//23.08 org.freedesktop.Sdk.Extension.vala//23.08 org.freedesktop.Sdk.Extension.node18//23.08 org.freedesktop.Sdk.Extension.typescript//23.08 # flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo - flatpak install --or-update --user --noninteractive flathub re.sonny.Workbench org.freedesktop.Sdk.Extension.rust-stable//23.08 org.freedesktop.Sdk.Extension.vala//23.08 + flatpak remote-add --user --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo + flatpak install --or-update --user --noninteractive gnome-nightly re.sonny.Workbench.Devel format: # npx prettier --write src/*/*.json - flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format javascript src/*/*.js - flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format css src/*/*.css - flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format python src/*/*.py - flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format rust src/*/*.rs - flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format blueprint src/*/*.blp - flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench format vala src/*/*.vala + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel format javascript src/*/*.js + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel format css src/*/*.css + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel format python src/*/*.py + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel format rust src/*/*.rs + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel format blueprint src/*/*.blp + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel format vala src/*/*.vala test: # list folders that have changed and run workbench-cli ci on them - git diff --dirstat=files,0 origin/main src | sed 's/^[ 0-9.]\+% //g' | uniq | xargs -d '\n' flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench ci + git diff --dirstat=files,0 origin/main src | sed 's/^[ 0-9.]\+% //g' | uniq | xargs -d '\n' flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel ci all: - flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench ci src/* + flatpak run --command="workbench-cli" --filesystem=host re.sonny.Workbench.Devel ci src/* ci: setup test @@ -35,6 +37,7 @@ clean: rm -f src/*/Cargo.lockfile rm -f src/*/lib.rs rm -f src/*/workbench.rs + rm -f src/*/jsconfig.json rm -f src/*/*.gresource rm -f src/*/*.gresource.xml rm -rf src/*/target diff --git a/src/Column View/main.js b/src/Column View/main.js index 21e2d02b..8ca539f2 100644 --- a/src/Column View/main.js +++ b/src/Column View/main.js @@ -36,7 +36,7 @@ const Book = GObject.registerClass( ), }, }, - class Book extends GObject.Object {}, + class Book extends GObject.Object { }, ); // Create the model diff --git a/src/Drop Down/main.js b/src/Drop Down/main.js index fe99f334..b94d02d8 100644 --- a/src/Drop Down/main.js +++ b/src/Drop Down/main.js @@ -37,7 +37,7 @@ const KeyValuePair = GObject.registerClass( ), }, }, - class KeyValuePair extends GObject.Object {}, + class KeyValuePair extends GObject.Object { }, ); const model = new Gio.ListStore({ item_type: KeyValuePair }); diff --git a/src/Wallpaper/main.js b/src/Wallpaper/main.js index 8f768887..e3be0838 100644 --- a/src/Wallpaper/main.js +++ b/src/Wallpaper/main.js @@ -15,8 +15,8 @@ async function onClicked() { parent, uri, Xdp.WallpaperFlags.PREVIEW | - Xdp.WallpaperFlags.BACKGROUND | - Xdp.WallpaperFlags.LOCKSCREEN, + Xdp.WallpaperFlags.BACKGROUND | + Xdp.WallpaperFlags.LOCKSCREEN, null, ); From 10e8a8fe0c1d2081d2d31e5da620751c9bd99a98 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Fri, 19 Jul 2024 11:52:05 +0200 Subject: [PATCH 42/58] Specify Gtk version 4 --- src/About Dialog/main.js | 2 +- src/Accessibility/main.js | 2 +- src/Audio/main.js | 2 +- src/Avatar/main.js | 2 +- src/Box/main.js | 2 +- src/Boxed Lists/main.js | 2 +- src/CSS Gradients/main.js | 2 +- src/Carousel/main.js | 2 +- src/Color Dialog/main.js | 2 +- src/Column View/main.js | 2 +- src/Custom Widget/main.js | 2 +- src/Drag and Drop/main.js | 2 +- src/Drop Down/main.js | 2 +- src/Drop Zone/main.js | 2 +- src/Event Controllers/main.js | 2 +- src/File Monitor/main.js | 2 +- src/Flow Box/main.js | 2 +- src/Font Dialog/main.js | 2 +- src/Frame/main.js | 2 +- src/Grid View/main.js | 2 +- src/Launcher/main.js | 2 +- src/List Model/main.js | 2 +- src/List View/main.js | 2 +- src/Map/main.js | 2 +- src/Message Dialogs/main.js | 2 +- src/Open File/main.js | 2 +- src/Overlay Split View/main.js | 2 +- src/Save File/main.js | 2 +- src/Scale/main.js | 2 +- src/Scrolled Window/main.js | 2 +- src/Select Folder/main.js | 2 +- src/Snapshot/main.js | 2 +- src/Spin Button/main.js | 2 +- src/Stack/main.js | 2 +- src/Text Fields/main.js | 2 +- src/Tooltip/main.js | 2 +- src/Video/main.js | 2 +- src/View Switcher/main.js | 2 +- src/Welcome/main.js | 2 +- 39 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/About Dialog/main.js b/src/About Dialog/main.js index d9e2bcdb..5678c8d4 100644 --- a/src/About Dialog/main.js +++ b/src/About Dialog/main.js @@ -1,6 +1,6 @@ import { gettext as _ } from "gettext"; import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const button = workbench.builder.get_object("button"); diff --git a/src/Accessibility/main.js b/src/Accessibility/main.js index 0a1db37c..cd9d94f2 100644 --- a/src/Accessibility/main.js +++ b/src/Accessibility/main.js @@ -1,6 +1,6 @@ import GObject from "gi://GObject"; import Gdk from "gi://Gdk"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const button = workbench.builder.get_object("custom_button"); diff --git a/src/Audio/main.js b/src/Audio/main.js index 0453fcba..74741806 100644 --- a/src/Audio/main.js +++ b/src/Audio/main.js @@ -1,5 +1,5 @@ import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const controls = workbench.builder.get_object("controls"); diff --git a/src/Avatar/main.js b/src/Avatar/main.js index 6d7c2043..36c54f90 100644 --- a/src/Avatar/main.js +++ b/src/Avatar/main.js @@ -1,6 +1,6 @@ import Gdk from "gi://Gdk"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Gtk.FileDialog.prototype, "open", "open_finish"); diff --git a/src/Box/main.js b/src/Box/main.js index 536cb1d9..369c0f3c 100644 --- a/src/Box/main.js +++ b/src/Box/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const interactive_box = workbench.builder.get_object("interactive_box"); const button_append = workbench.builder.get_object("button_append"); diff --git a/src/Boxed Lists/main.js b/src/Boxed Lists/main.js index 973c12c0..58b95ab9 100644 --- a/src/Boxed Lists/main.js +++ b/src/Boxed Lists/main.js @@ -1,5 +1,5 @@ import GObject from "gi://GObject"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const drop_down = workbench.builder.get_object("drop_down"); diff --git a/src/CSS Gradients/main.js b/src/CSS Gradients/main.js index 93e6bad4..aa58015e 100644 --- a/src/CSS Gradients/main.js +++ b/src/CSS Gradients/main.js @@ -1,6 +1,6 @@ import Adw from "gi://Adw"; import Gdk from "gi://Gdk"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; import GtkSource from "gi://GtkSource"; let css_provider; diff --git a/src/Carousel/main.js b/src/Carousel/main.js index d4526fa7..e1e18643 100644 --- a/src/Carousel/main.js +++ b/src/Carousel/main.js @@ -1,5 +1,5 @@ import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const root_box = workbench.builder.get_object("root_box"); const carousel = workbench.builder.get_object("carousel"); diff --git a/src/Color Dialog/main.js b/src/Color Dialog/main.js index 28c14ed8..dcb3e9be 100644 --- a/src/Color Dialog/main.js +++ b/src/Color Dialog/main.js @@ -1,6 +1,6 @@ import Gdk from "gi://Gdk"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Gtk.ColorDialog.prototype, "choose_rgba", "choose_rgba_finish"); diff --git a/src/Column View/main.js b/src/Column View/main.js index 8ca539f2..78f53400 100644 --- a/src/Column View/main.js +++ b/src/Column View/main.js @@ -1,6 +1,6 @@ import GObject from "gi://GObject"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const column_view = workbench.builder.get_object("column_view"); const col1 = workbench.builder.get_object("col1"); diff --git a/src/Custom Widget/main.js b/src/Custom Widget/main.js index d1462b84..2d565653 100644 --- a/src/Custom Widget/main.js +++ b/src/Custom Widget/main.js @@ -1,5 +1,5 @@ import GObject from "gi://GObject"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const AwesomeButton = GObject.registerClass( { diff --git a/src/Drag and Drop/main.js b/src/Drag and Drop/main.js index 82240130..ce5232aa 100644 --- a/src/Drag and Drop/main.js +++ b/src/Drag and Drop/main.js @@ -1,7 +1,7 @@ import Adw from "gi://Adw"; import GObject from "gi://GObject"; import Gdk from "gi://Gdk"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const list = workbench.builder.get_object("list"); const drop_target = Gtk.DropTarget.new(Gtk.ListBoxRow, Gdk.DragAction.MOVE); diff --git a/src/Drop Down/main.js b/src/Drop Down/main.js index b94d02d8..c6a928dd 100644 --- a/src/Drop Down/main.js +++ b/src/Drop Down/main.js @@ -1,6 +1,6 @@ import GObject from "gi://GObject"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const drop_down = workbench.builder.get_object("drop_down"); const advanced_drop_down = workbench.builder.get_object("advanced_drop_down"); diff --git a/src/Drop Zone/main.js b/src/Drop Zone/main.js index 1630715f..24301022 100644 --- a/src/Drop Zone/main.js +++ b/src/Drop Zone/main.js @@ -1,7 +1,7 @@ import GObject from "gi://GObject"; import Gdk from "gi://Gdk"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const bin = workbench.builder.get_object("bin"); diff --git a/src/Event Controllers/main.js b/src/Event Controllers/main.js index 935233d0..0b347338 100644 --- a/src/Event Controllers/main.js +++ b/src/Event Controllers/main.js @@ -1,7 +1,7 @@ import { gettext as _ } from "gettext"; import Gdk from "gi://Gdk"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const window = workbench.window; const ctrl_button = workbench.builder.get_object("ctrl_button"); diff --git a/src/File Monitor/main.js b/src/File Monitor/main.js index f9834731..05e2fca4 100644 --- a/src/File Monitor/main.js +++ b/src/File Monitor/main.js @@ -1,7 +1,7 @@ import Adw from "gi://Adw"; import GLib from "gi://GLib"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Gtk.FileLauncher.prototype, "launch", "launch_finish"); diff --git a/src/Flow Box/main.js b/src/Flow Box/main.js index 7127f0e1..4142bfad 100644 --- a/src/Flow Box/main.js +++ b/src/Flow Box/main.js @@ -1,5 +1,5 @@ import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const flowbox = workbench.builder.get_object("flowbox"); diff --git a/src/Font Dialog/main.js b/src/Font Dialog/main.js index 9c9d9934..449a5392 100644 --- a/src/Font Dialog/main.js +++ b/src/Font Dialog/main.js @@ -1,5 +1,5 @@ import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify( Gtk.FontDialog.prototype, diff --git a/src/Frame/main.js b/src/Frame/main.js index 969873f7..bb5d8d30 100644 --- a/src/Frame/main.js +++ b/src/Frame/main.js @@ -1,5 +1,5 @@ import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const pic_with_frame = workbench.builder.get_object("with_frame"); const pic_without_frame = workbench.builder.get_object("without_frame"); diff --git a/src/Grid View/main.js b/src/Grid View/main.js index 004c71ba..d962671c 100644 --- a/src/Grid View/main.js +++ b/src/Grid View/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const grid_view = workbench.builder.get_object("grid_view"); const add = workbench.builder.get_object("add"); diff --git a/src/Launcher/main.js b/src/Launcher/main.js index c3c0b227..3ee6d787 100644 --- a/src/Launcher/main.js +++ b/src/Launcher/main.js @@ -1,6 +1,6 @@ import GLib from "gi://GLib"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Gtk.FileLauncher.prototype, "launch", "launch_finish"); Gio._promisify( diff --git a/src/List Model/main.js b/src/List Model/main.js index 23ec3085..e3821ef5 100644 --- a/src/List Model/main.js +++ b/src/List Model/main.js @@ -1,5 +1,5 @@ import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const stack = workbench.builder.get_object("stack"); const list_box = workbench.builder.get_object("list_box"); diff --git a/src/List View/main.js b/src/List View/main.js index e5002179..30a8fef7 100644 --- a/src/List View/main.js +++ b/src/List View/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const list_view = workbench.builder.get_object("list_view"); const add = workbench.builder.get_object("add"); diff --git a/src/Map/main.js b/src/Map/main.js index abd84378..084a6bbe 100644 --- a/src/Map/main.js +++ b/src/Map/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; import Shumate from "gi://Shumate"; const map_widget = workbench.builder.get_object("map_widget"); diff --git a/src/Message Dialogs/main.js b/src/Message Dialogs/main.js index 93f1252d..c5a6db8e 100644 --- a/src/Message Dialogs/main.js +++ b/src/Message Dialogs/main.js @@ -1,6 +1,6 @@ import Adw from "gi://Adw"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Adw.AlertDialog.prototype, "choose", "choose_finish"); diff --git a/src/Open File/main.js b/src/Open File/main.js index 44a63b3a..9fce1fc8 100644 --- a/src/Open File/main.js +++ b/src/Open File/main.js @@ -1,5 +1,5 @@ import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Gtk.FileDialog.prototype, "open", "open_finish"); Gio._promisify( diff --git a/src/Overlay Split View/main.js b/src/Overlay Split View/main.js index 44ae37e2..247fdaa6 100644 --- a/src/Overlay Split View/main.js +++ b/src/Overlay Split View/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const split_view = workbench.builder.get_object("split_view"); const start_toggle = workbench.builder.get_object("start_toggle"); diff --git a/src/Save File/main.js b/src/Save File/main.js index 81719db9..4752b7bf 100644 --- a/src/Save File/main.js +++ b/src/Save File/main.js @@ -1,5 +1,5 @@ import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Gtk.FileDialog.prototype, "save", "save_finish"); Gio._promisify( diff --git a/src/Scale/main.js b/src/Scale/main.js index c5b36009..fef529be 100644 --- a/src/Scale/main.js +++ b/src/Scale/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const scale_one = workbench.builder.get_object("one"); const scale_two = workbench.builder.get_object("two"); diff --git a/src/Scrolled Window/main.js b/src/Scrolled Window/main.js index 06c09688..8a2166df 100644 --- a/src/Scrolled Window/main.js +++ b/src/Scrolled Window/main.js @@ -1,5 +1,5 @@ import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const scrolled_window = workbench.builder.get_object("scrolled_window"); const container = workbench.builder.get_object("container"); diff --git a/src/Select Folder/main.js b/src/Select Folder/main.js index 3f09287f..20af5a3b 100644 --- a/src/Select Folder/main.js +++ b/src/Select Folder/main.js @@ -1,5 +1,5 @@ import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify( Gtk.FileDialog.prototype, diff --git a/src/Snapshot/main.js b/src/Snapshot/main.js index 1302d50e..154925e5 100644 --- a/src/Snapshot/main.js +++ b/src/Snapshot/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; import Gdk from "gi://Gdk"; import Graphene from "gi://Graphene"; import Gsk from "gi://Gsk"; diff --git a/src/Spin Button/main.js b/src/Spin Button/main.js index 03cffdc6..f9064cbf 100644 --- a/src/Spin Button/main.js +++ b/src/Spin Button/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const hours = workbench.builder.get_object("hours"); const minutes = workbench.builder.get_object("minutes"); diff --git a/src/Stack/main.js b/src/Stack/main.js index c1f9ddb7..ab55758a 100644 --- a/src/Stack/main.js +++ b/src/Stack/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const root_box = workbench.builder.get_object("root_box"); const stack = workbench.builder.get_object("stack"); diff --git a/src/Text Fields/main.js b/src/Text Fields/main.js index a599943f..4a8bf930 100644 --- a/src/Text Fields/main.js +++ b/src/Text Fields/main.js @@ -1,5 +1,5 @@ import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const entry = workbench.builder.get_object("entry"); const entry_placeholder = workbench.builder.get_object("entry_placeholder"); diff --git a/src/Tooltip/main.js b/src/Tooltip/main.js index fec2d6fb..f30578d2 100644 --- a/src/Tooltip/main.js +++ b/src/Tooltip/main.js @@ -1,4 +1,4 @@ -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const button = workbench.builder.get_object("button"); diff --git a/src/Video/main.js b/src/Video/main.js index 5688f39f..28ff627d 100644 --- a/src/Video/main.js +++ b/src/Video/main.js @@ -1,5 +1,5 @@ import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const video = workbench.builder.get_object("video"); diff --git a/src/View Switcher/main.js b/src/View Switcher/main.js index 43f1edf8..69321511 100644 --- a/src/View Switcher/main.js +++ b/src/View Switcher/main.js @@ -1,5 +1,5 @@ import Adw from "gi://Adw"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; const notifications_page = workbench.builder.get_object("page3"); const notification_list = workbench.builder.get_object("notification_list"); diff --git a/src/Welcome/main.js b/src/Welcome/main.js index d076584a..4972952c 100644 --- a/src/Welcome/main.js +++ b/src/Welcome/main.js @@ -1,6 +1,6 @@ import Adw from "gi://Adw"; import Gio from "gi://Gio"; -import Gtk from "gi://Gtk"; +import Gtk from "gi://Gtk?version=4.0"; Gio._promisify(Adw.AlertDialog.prototype, "choose", "choose_finish"); From 0d46b4fbb0fa548f82fe158de4c3228c4d59da2c Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Fri, 19 Jul 2024 17:22:25 +0200 Subject: [PATCH 43/58] Specify Gdk version 4 --- src/Accessibility/main.js | 5 ++++- src/Account/main.js | 4 ++-- src/Avatar/main.js | 2 +- src/CSS Gradients/main.js | 2 +- src/Color Dialog/main.js | 2 +- src/Color Picker/main.js | 2 +- src/Context Menu/main.js | 2 +- src/Drag and Drop/main.js | 2 +- src/Drop Zone/main.js | 2 +- src/Event Controllers/main.js | 2 +- src/HTTP Image/main.js | 2 +- src/Snapshot/main.js | 2 +- src/Text View/main.js | 2 +- 13 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/Accessibility/main.js b/src/Accessibility/main.js index cd9d94f2..21de5466 100644 --- a/src/Accessibility/main.js +++ b/src/Accessibility/main.js @@ -1,5 +1,5 @@ import GObject from "gi://GObject"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gtk from "gi://Gtk?version=4.0"; const button = workbench.builder.get_object("custom_button"); @@ -22,6 +22,9 @@ key_controller.connect("key-released", (_controller, keyval) => { }); button.add_controller(key_controller); +/** + * @param {Gtk.Button} button + */ function toggleButton(button) { let checked = (button.get_state_flags() & Gtk.StateFlags.CHECKED) !== 0; let pressed; diff --git a/src/Account/main.js b/src/Account/main.js index c9a7942d..9c4f7fe2 100644 --- a/src/Account/main.js +++ b/src/Account/main.js @@ -1,6 +1,6 @@ -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; -import Xdp from "gi://Xdp"; +import Xdp from "gi://Xdp?version=1.0"; import XdpGtk from "gi://XdpGtk4"; Gio._promisify( diff --git a/src/Avatar/main.js b/src/Avatar/main.js index 36c54f90..ecaef183 100644 --- a/src/Avatar/main.js +++ b/src/Avatar/main.js @@ -1,4 +1,4 @@ -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; import Gtk from "gi://Gtk?version=4.0"; diff --git a/src/CSS Gradients/main.js b/src/CSS Gradients/main.js index aa58015e..43421edb 100644 --- a/src/CSS Gradients/main.js +++ b/src/CSS Gradients/main.js @@ -1,5 +1,5 @@ import Adw from "gi://Adw"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gtk from "gi://Gtk?version=4.0"; import GtkSource from "gi://GtkSource"; diff --git a/src/Color Dialog/main.js b/src/Color Dialog/main.js index dcb3e9be..69e8c4e5 100644 --- a/src/Color Dialog/main.js +++ b/src/Color Dialog/main.js @@ -1,4 +1,4 @@ -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; import Gtk from "gi://Gtk?version=4.0"; diff --git a/src/Color Picker/main.js b/src/Color Picker/main.js index a8546162..96ae4caf 100644 --- a/src/Color Picker/main.js +++ b/src/Color Picker/main.js @@ -1,4 +1,4 @@ -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; import Xdp from "gi://Xdp"; import XdpGtk from "gi://XdpGtk4"; diff --git a/src/Context Menu/main.js b/src/Context Menu/main.js index fcabf945..a60a8400 100644 --- a/src/Context Menu/main.js +++ b/src/Context Menu/main.js @@ -1,5 +1,5 @@ import GLib from "gi://GLib"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; const box_menu_parent = workbench.builder.get_object("box_menu_parent"); diff --git a/src/Drag and Drop/main.js b/src/Drag and Drop/main.js index ce5232aa..5d29c95c 100644 --- a/src/Drag and Drop/main.js +++ b/src/Drag and Drop/main.js @@ -1,6 +1,6 @@ import Adw from "gi://Adw"; import GObject from "gi://GObject"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gtk from "gi://Gtk?version=4.0"; const list = workbench.builder.get_object("list"); diff --git a/src/Drop Zone/main.js b/src/Drop Zone/main.js index 24301022..6cb1f202 100644 --- a/src/Drop Zone/main.js +++ b/src/Drop Zone/main.js @@ -1,5 +1,5 @@ import GObject from "gi://GObject"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; import Gtk from "gi://Gtk?version=4.0"; diff --git a/src/Event Controllers/main.js b/src/Event Controllers/main.js index 0b347338..1f5c4a9c 100644 --- a/src/Event Controllers/main.js +++ b/src/Event Controllers/main.js @@ -1,5 +1,5 @@ import { gettext as _ } from "gettext"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; import Gtk from "gi://Gtk?version=4.0"; diff --git a/src/HTTP Image/main.js b/src/HTTP Image/main.js index 3b27e8aa..d27313d2 100644 --- a/src/HTTP Image/main.js +++ b/src/HTTP Image/main.js @@ -1,5 +1,5 @@ import GLib from "gi://GLib"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Gio from "gi://Gio"; import Soup from "gi://Soup"; diff --git a/src/Snapshot/main.js b/src/Snapshot/main.js index 154925e5..f8d2d256 100644 --- a/src/Snapshot/main.js +++ b/src/Snapshot/main.js @@ -1,5 +1,5 @@ import Gtk from "gi://Gtk?version=4.0"; -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; import Graphene from "gi://Graphene"; import Gsk from "gi://Gsk"; import GObject from "gi://GObject"; diff --git a/src/Text View/main.js b/src/Text View/main.js index 1175c31a..309325b0 100644 --- a/src/Text View/main.js +++ b/src/Text View/main.js @@ -1,4 +1,4 @@ -import Gdk from "gi://Gdk"; +import Gdk from "gi://Gdk?version=4.0"; const textview = workbench.builder.get_object("textview"); const select = workbench.builder.get_object("select"); From 9bfd2beaaa0c97c0fbe378e71b1c3bf330e65cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kol=C3=ADn?= Date: Mon, 5 Aug 2024 22:05:05 +0200 Subject: [PATCH 44/58] [Rust] Audio demo (#193) * Audio ported to rust * Update src/Audio/code.rs Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * bring gio to the scope --------- Co-authored-by: Ondrej Kolin Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> --- src/Audio/code.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/Audio/code.rs diff --git a/src/Audio/code.rs b/src/Audio/code.rs new file mode 100644 index 00000000..0acea2a3 --- /dev/null +++ b/src/Audio/code.rs @@ -0,0 +1,38 @@ +use crate::workbench; +use gtk::prelude::*; +use gtk::{gio, glib}; +use std::collections::HashMap; + +pub fn main() { + // Otherwise the MediaFile crate crashes + gtk::init().unwrap(); + + let controls: gtk::MediaControls = workbench::builder().object("controls").unwrap(); + + let audio_files = HashMap::from([ + ("sound", "./Dog.ogg"), + ("music", "./Chopin-nocturne-op-9-no-2.ogg"), + ]); + + for (button_name, file_name) in audio_files { + let button: gtk::Button = workbench::builder() + .object(format!("button_{}", button_name)) + .unwrap(); + + button.connect_clicked(glib::clone!( + @weak controls => move |_| { + if let Some(media_stream) = controls.media_stream() { + media_stream.set_playing(false); + } + + controls.set_media_stream(Some(>k::MediaFile::for_file( + &gio::File::for_uri(&workbench::resolve(file_name)) + ))); + // Media stream can be missing + if let Some(media_stream) = controls.media_stream() { + media_stream.set_playing(true); + } + } + )); + } +} From b01dc34fe08de8b30107568b9cf9a98dc31d7f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kol=C3=ADn?= Date: Tue, 6 Aug 2024 09:25:15 +0200 Subject: [PATCH 45/58] [Rust] Frame demo ported (#195) * [Rust] Port the Frame example * Bring gio to the scope --------- Co-authored-by: Ondrej Kolin --- src/Frame/code.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/Frame/code.rs diff --git a/src/Frame/code.rs b/src/Frame/code.rs new file mode 100644 index 00000000..2d3b7e52 --- /dev/null +++ b/src/Frame/code.rs @@ -0,0 +1,26 @@ +use crate::workbench; +use gtk::prelude::*; +use gtk::{self, gio}; + +pub fn main() { + let pic_with_frame: gtk::Picture = workbench::builder().object("with_frame").unwrap(); + let pic_without_frame: gtk::Picture = workbench::builder().object("without_frame").unwrap(); + + let textview_with_frame: gtk::TextView = + workbench::builder().object("textview_with_frame").unwrap(); + let textview_without_frame: gtk::TextView = workbench::builder() + .object("textview_without_frame") + .unwrap(); + + let file = gio::File::for_uri(&workbench::resolve("./image.png")); + + let buffer = gtk::TextBuffer::builder() + .text("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Vel elit scelerisque mauris pellentesque pulvinar. Molestie nunc non blandit massa enim nec dui nunc. Turpis in eu mi bibendum neque egestas congue quisque. Sed velit dignissim sodales ut. Massa tempor nec feugiat nisl pretium fusce id velit. Vitae congue eu consequat ac felis donec et. Ultrices sagittis orci a scelerisque purus semper eget duis at. Habitant morbi tristique senectus et netus et malesuada fames ac. Vitae aliquet nec ullamcorper sit amet risus nullam. Tortor at auctor urna nunc. Eget velit aliquet sagittis id consectetur purus. Libero id faucibus nisl tincidunt eget. Nunc consequat interdum varius sit amet mattis. Enim facilisis gravida neque convallis. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Venenatis tellus in metus vulputate eu scelerisque.Sit amet luctus venenatis lectus magna fringilla urna. Eget nunc lobortis mattis aliquam. Urna duis convallis convallis tellus id interdum velit. Fames ac turpis egestas maecenas. Venenatis lectus magna fringilla urna porttitor rhoncus dolor. Egestas erat imperdiet sed euismod nisi porta lorem mollis aliquam. Eget est lorem ipsum dolor sit amet consectetur. Eget nunc lobortis mattis aliquam faucibus purus in. Iaculis nunc sed augue lacus viverra vitae. Euismod elementum nisi quis eleifend. Et pharetra pharetra massa massa ultricies mi quis. Volutpat odio facilisis mauris sit. Enim ut tellus elementum sagittis vitae et. Volutpat sed cras ornare arcu dui vivamus arcu felis. Arcu vitae elementum curabitur vitae nunc sed. Porttitor rhoncus dolor purus non enim. Scelerisque fermentum dui faucibus in ornare quam viverra. Amet purus gravida quis blandit turpis cursus. Faucibus pulvinar elementum integer enim. Aenean et tortor at risus viverra adipiscing at in.Vitae ultricies leo integer malesuada nunc vel. Quis lectus nulla at volutpat diam ut. Donec ac odio tempor orci dapibus ultrices. Justo eget magna fermentum iaculis eu non diam. Mauris cursus mattis molestie a iaculis at erat pellentesque. Phasellus faucibus scelerisque eleifend donec pretium. Blandit volutpat maecenas volutpat blandit aliquam etiam erat velit scelerisque. Habitant morbi tristique senectus et netus. Nunc faucibus a pellentesque sit amet porttitor eget dolor. Nulla malesuada pellentesque elit eget. Tortor vitae purus faucibus ornare suspendisse sed nisi lacus sed. Sollicitudin ac orci phasellus egestas tellus. In hendrerit gravida rutrum quisque non tellus orci ac. Suspendisse ultrices gravida dictum fusce ut placerat. Varius morbi enim nunc faucibus. Tellus elementum sagittis vitae et leo duis ut diam. Velit dignissim sodales ut eu sem integer. Sapien eget mi proin sed libero enim. Odio euismod lacinia at quis risus. Tellus at urna condimentum mattis pellentesque id.") + .build(); + + textview_with_frame.set_buffer(Some(&buffer)); + textview_without_frame.set_buffer(Some(&buffer)); + + pic_with_frame.set_file(Some(&file)); + pic_without_frame.set_file(Some(&file)); +} From be31107a87bd124cd0d8911c57d560b603bbe82e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kol=C3=ADn?= Date: Tue, 6 Aug 2024 21:25:30 +0200 Subject: [PATCH 46/58] [Rust] Port the ListView demo (#198) * [Rust] Ported the listview demo * Improve the comment on Cell usage * small comment change * Update src/List View/code.rs Fix the language Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * Update src/List View/code.rs Missed this one glib::clone Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * Update src/List View/code.rs Fixed comment Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * Update src/List View/code.rs English too hard Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * Update src/List View/code.rs Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * Update src/List View/code.rs Remove unnecessary debugging output Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> * Strings_model => string_model --------- Co-authored-by: Ondrej Kolin Co-authored-by: Hofer-Julian <30049909+Hofer-Julian@users.noreply.github.com> --- src/List View/code.rs | 81 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/List View/code.rs diff --git a/src/List View/code.rs b/src/List View/code.rs new file mode 100644 index 00000000..e55bc145 --- /dev/null +++ b/src/List View/code.rs @@ -0,0 +1,81 @@ +use crate::workbench; +use gtk; +use gtk::glib; +use gtk::prelude::*; +use std::cell::Cell; + +pub fn main() { + // Required by gtk::StringList::new(), otherwise crashes + gtk::init().unwrap(); + + let list_view: gtk::ListView = workbench::builder().object("list_view").unwrap(); + let add: gtk::Button = workbench::builder().object("add").unwrap(); + let remove: gtk::Button = workbench::builder().object("remove").unwrap(); + + // https://doc.rust-lang.org/std/cell/struct.Cell.html + // "A mutable memory location." + // Makes it possible to access and change values from within signal handlers + let item = Cell::new(1); + + // Model + let string_model = + gtk::StringList::new(&["Default Item 1", "Default Item 2", "Default Item 3"]); + let model = gtk::SingleSelection::new(Some(string_model.clone())); + + // View + string_model.connect_items_changed(move |_model, position, removed, added| { + println!( + "position: {}, Item removed? {}, Item added? {}", + position, + removed > 0, + added > 0 + ) + }); + + model.connect_selection_changed(move |model, _position, _n_items| { + let selected_item = model.selected(); + println!( + "Model item selected from view: {}", + model + .item(selected_item) // Get the item + .unwrap() // Make sure it exists + .downcast::() // It's a member of GStringList + .unwrap() // Make sure it's really a StringObject + .string() // Read the string value + ) + }); + + add.connect_clicked(glib::clone!( + // Copy the reference, so it's accessible from the closure + // https://gtk-rs.org/gtk-rs-core/stable/latest/docs/glib/macro.clone.html + @weak model => move |_| { + // Get the item counter value + let value = item.get(); + // Access the underlying gtk::StringList + let string_model = model + .model() + .unwrap() + .downcast::() + .unwrap(); + string_model.append(format!("New item {}", item.get()).as_str()); + // Increase the counter + item.set(value + 1); + })); + + remove.connect_clicked(gtk::glib::clone!( + // Copy the reference, so it's accessible from the closure + // https://gtk-rs.org/gtk-rs-core/stable/latest/docs/glib/macro.clone.html + @weak model => move |_| { + let selected_item = model.selected(); + // In order to delete values we need to access the + // actual StringList model, we've created. + let string_model = model + .model() + .unwrap() + .downcast::() + .unwrap(); + string_model.remove(selected_item); + })); + + list_view.set_model(Some(&model)); +} From 2cdc1c1b367875b770b0dc4e1e939b934d80d36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kol=C3=ADn?= Date: Thu, 8 Aug 2024 16:48:49 +0200 Subject: [PATCH 47/58] [Rust] Clamp example (#194) * Add Rust Clamp example * Reformat the code slightly * Remove empty line --------- Co-authored-by: Ondrej Kolin Co-authored-by: Julian Hofer --- src/Clamp/code.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/Clamp/code.rs diff --git a/src/Clamp/code.rs b/src/Clamp/code.rs new file mode 100644 index 00000000..9b14489d --- /dev/null +++ b/src/Clamp/code.rs @@ -0,0 +1,35 @@ +use crate::workbench; +use adw; +use gtk; +use gtk::glib; +use gtk::prelude::*; + +pub fn main() { + let button_increase: gtk::Button = workbench::builder().object("button_increase").unwrap(); + let button_decrease: gtk::Button = workbench::builder().object("button_decrease").unwrap(); + let clamp: adw::Clamp = workbench::builder().object("clamp").unwrap(); + + button_increase.connect_clicked(glib::clone!(@weak clamp => move |_| { + let current_size = clamp.maximum_size(); + let current_threshold = clamp.tightening_threshold(); + + clamp.set_maximum_size(current_size + 300); + clamp.set_tightening_threshold(current_threshold + 200); + + if clamp.tightening_threshold() == 1000 { + println!("Maximum size reached"); + } + })); + + button_decrease.connect_clicked(glib::clone!(@weak clamp => move |_| { + let current_size = clamp.maximum_size(); + let current_threshold = clamp.tightening_threshold(); + + clamp.set_maximum_size(current_size - 300); + clamp.set_tightening_threshold(current_threshold - 200); + + if clamp.tightening_threshold() == 0 { + println!("Minimum size reached"); + } + })); +} From c826864d51c0ec12a8054e170a48a59bd765a89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kol=C3=ADn?= Date: Fri, 16 Aug 2024 22:45:47 +0200 Subject: [PATCH 48/58] [Rust] Column View demo ported (#196) * [Rust] Column View demo ported * bring gio to the scope * Minor improvements * Revert format change --------- Co-authored-by: Ondrej Kolin Co-authored-by: Julian Hofer --- src/Column View/code.rs | 186 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 src/Column View/code.rs diff --git a/src/Column View/code.rs b/src/Column View/code.rs new file mode 100644 index 00000000..67bf9618 --- /dev/null +++ b/src/Column View/code.rs @@ -0,0 +1,186 @@ +use crate::workbench; +use glib::Properties; +use gtk; +use gtk::prelude::*; +use gtk::subclass::prelude::*; +use gtk::{gio, glib}; +use std::cell::{Cell, OnceCell}; + +// Subclassing is quite tricky +// Documentation https://gtk-rs.org/gtk4-rs/stable/latest/book/g_object_subclassing.html +// This example differs to the book by putting `imp` module into the same file + +mod imp { + use super::*; + + #[derive(Default, Properties)] + #[properties(wrapper_type = super::Book)] + pub struct Book { + #[property(get, set)] + pub title: OnceCell, + #[property(get, set)] + pub author: OnceCell, + #[property(get, set)] + pub year: Cell, + } + + #[glib::object_subclass] + impl ObjectSubclass for Book { + const NAME: &'static str = "Book"; + type ParentType = glib::Object; + type Type = super::Book; + } + + #[glib::derived_properties] + impl ObjectImpl for Book { + fn constructed(&self) { + self.parent_constructed(); + } + } +} + +glib::wrapper! { + pub struct Book(ObjectSubclass); +} + +impl Book { + pub fn new(title: String, author: String, year: i32) -> Self { + glib::Object::builder() + .property("author", author) + .property("title", title) + .property("year", year) + .build() + } +} + +pub fn main() { + // Necessary for setting the sorter later + let column_view: gtk::ColumnView = workbench::builder().object("column_view").unwrap(); + let col1: gtk::ColumnViewColumn = workbench::builder().object("col1").unwrap(); + let col2: gtk::ColumnViewColumn = workbench::builder().object("col2").unwrap(); + let col3: gtk::ColumnViewColumn = workbench::builder().object("col3").unwrap(); + + let data_model: gio::ListStore = [ + Book::new( + "Winds from Afar".to_string(), + "Kenji Miyazawa".to_string(), + 1972, + ), + Book::new( + "Like Water for Chocolate".to_string(), + "Laura Esquivel".to_string(), + 1989, + ), + Book::new( + "Works and Nights".to_string(), + "Alejandra Pizarnik".to_string(), + 1965, + ), + Book::new( + "Understading Analysis".to_string(), + "Stephen Abbott".to_string(), + 2002, + ), + Book::new( + "The Timeless Way of Building".to_string(), + "Cristopher Alexander".to_string(), + 1979, + ), + Book::new("Bitter".to_string(), "Akwaeke Emezi".to_string(), 2022), + Book::new( + "Saying Yes".to_string(), + "Griselda Gambaro".to_string(), + 1981, + ), + Book::new( + "Itinerary of a Dramatist".to_string(), + "Rodolfo Usigli".to_string(), + 1940, + ), + ] + .into_iter() + .collect(); + // Let's initialize gtk + gtk::init().unwrap(); + + col1.set_sorter(Some(>k::StringSorter::new(Some( + gtk::PropertyExpression::new(Book::static_type(), None::<>k::Expression>, "title"), + )))); + + col2.set_sorter(Some(>k::StringSorter::new(Some( + gtk::PropertyExpression::new(Book::static_type(), None::<>k::Expression>, "author"), + )))); + + col3.set_sorter(Some(>k::NumericSorter::new(Some( + gtk::PropertyExpression::new(Book::static_type(), None::<>k::Expression>, "year"), + )))); + + // View + // Column 1 + let factory_col1 = gtk::SignalListItemFactory::new(); + factory_col1.connect_setup(move |_factory, list_item| { + let cell = list_item.downcast_ref::().unwrap(); + cell.set_child(Some( + >k::Label::builder() + .margin_start(12) + .margin_end(12) + .build(), + )); + }); + factory_col1.connect_bind(move |_factory, list_item| { + let cell = list_item + .to_owned() + .downcast::() + .unwrap(); + let child = cell.child().unwrap(); + let label = child.downcast_ref::().unwrap(); + let model_item = cell.item().to_owned().unwrap().downcast::().unwrap(); + label.set_label(&model_item.title()); + }); + col1.set_factory(Some(&factory_col1)); + // Column 2 + let factory_col2 = gtk::SignalListItemFactory::new(); + factory_col2.connect_setup(move |_factory, list_item| { + let cell = list_item.downcast_ref::().unwrap(); + cell.set_child(Some( + >k::Label::builder() + .margin_start(12) + .margin_end(12) + .build(), + )); + }); + factory_col2.connect_bind(move |_factory, list_item| { + let cell = list_item.downcast_ref::().unwrap(); + let child = cell.child().unwrap(); + let label = child.downcast::().unwrap(); + let model_item = cell.item().to_owned().unwrap().downcast::().unwrap(); + label.set_label(&model_item.author()); + }); + col2.set_factory(Some(&factory_col2)); + //Column 3 + let factory_col3 = gtk::SignalListItemFactory::new(); + factory_col3.connect_setup(move |_factory, list_item| { + let cell = list_item.downcast_ref::().unwrap(); + cell.set_child(Some( + >k::Label::builder() + .margin_start(12) + .margin_end(12) + .build(), + )); + }); + factory_col3.connect_bind(move |_factory, list_item| { + let cell = list_item.downcast_ref::().unwrap(); + let child = cell.child().unwrap(); + let label = child.downcast::().unwrap(); + let model_item = cell.item().to_owned().unwrap().downcast::().unwrap(); + label.set_label(&model_item.year().to_string()); + }); + col3.set_factory(Some(&factory_col3)); + + let sort_model = gtk::SortListModel::builder() + .model(&data_model) + .sorter(&column_view.sorter().unwrap()) + .build(); + + column_view.set_model(Some(>k::SingleSelection::new(Some(sort_model)))); +} From f0e9e69c26ef20a9e911813e984a259a67cf951c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kol=C3=ADn?= Date: Fri, 16 Aug 2024 22:55:36 +0200 Subject: [PATCH 49/58] [Rust] Ported the TextFields demo (#199) * [Rust] TextFields demo port * Updated some comments * Small comments changes * Small changes --------- Co-authored-by: Ondrej Kolin Co-authored-by: Julian Hofer --- src/Text Fields/code.rs | 99 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/Text Fields/code.rs diff --git a/src/Text Fields/code.rs b/src/Text Fields/code.rs new file mode 100644 index 00000000..02734c4d --- /dev/null +++ b/src/Text Fields/code.rs @@ -0,0 +1,99 @@ +use crate::workbench; +use adw::prelude::*; +use gtk::glib; + +pub fn main() { + let entry: gtk::Entry = workbench::builder().object("entry").unwrap(); + let entry_placeholder: gtk::Entry = workbench::builder().object("entry_placeholder").unwrap(); + let entry_icon: gtk::Entry = workbench::builder().object("entry_icon").unwrap(); + let entry_progress: gtk::Entry = workbench::builder().object("entry_progress").unwrap(); + + entry.connect_activate(|triggered_entry| { + println!("Regular Entry: {} entered", triggered_entry.text()); + }); + + entry_placeholder.connect_activate(|triggered_entry| { + println!("Placeholder Entry: {} entered", triggered_entry.text()); + }); + + entry_icon.connect_activate(|triggered_entry| { + println!("Icon Entry: {} entered", triggered_entry.text()); + }); + + entry_icon.connect_icon_press(|_, _| println!("Icon Pressed!")); + + entry_icon.connect_icon_release(|_, _| println!("Icon Released!")); + + entry_progress.connect_activate(|triggered_entry| { + println!("Progress Bar Entry: {} entered", triggered_entry.text()); + }); + // GTK init is required by adw::PropertyAnimationTarget::new + gtk::init().unwrap(); + + let target = adw::PropertyAnimationTarget::new(&entry_progress, "progress-fraction"); + + let animation = adw::TimedAnimation::builder() + .widget(&entry_progress) + .value_from(0.0) + .value_to(1.0) + .duration(2000) + .easing(adw::Easing::Linear) + .target(&target) + .build(); + + // Animation is defined outside of the scope of the following closure + // That's why we need to use glib::clone! macro + // See: https://gtk-rs.org/gtk-rs-core/stable/latest/docs/glib/macro.clone.html + + entry_progress.connect_icon_press(glib::clone!( + @strong animation => move |_, _| animation.play() + )); + + animation.connect_done(|animation| animation.reset()); + + let label_password: gtk::Label = workbench::builder().object("label_password").unwrap(); + let entry_password: gtk::PasswordEntry = workbench::builder().object("entry_password").unwrap(); + let entry_confirm_password: gtk::PasswordEntry = workbench::builder() + .object("entry_confirm_password") + .unwrap(); + + fn validate_password(passwd: &glib::GString, confirm_passwd: &glib::GString) -> &'static str { + if passwd.is_empty() || confirm_passwd.is_empty() { + "Both fields are mandatory!" + } else if passwd != confirm_passwd { + "Both fields should be matching!" + } else { + "Password made successfully" + } + } + + // Using the glib::clone! macro we pass the reference to the closure + entry_confirm_password.connect_activate( + glib::clone!(@weak label_password, @weak entry_password, @weak entry_confirm_password => move |_| { + let passwd = entry_password.text(); + let confirm_passwd = entry_confirm_password.text(); + label_password.set_text(validate_password(&passwd, &confirm_passwd)); + }), + ); + + entry_password.connect_activate( + glib::clone!(@weak label_password, @weak entry_password, @weak entry_confirm_password => move |_| { + let passwd = entry_password.text(); + let confirm_passwd = entry_confirm_password.text(); + label_password.set_text(validate_password(&passwd, &confirm_passwd)); + }), + ); + + // The entry_completion is deprecated + // https://discourse.gnome.org/t/replacement-for-entrycompletion/13505 + let entry_completion: gtk::Entry = workbench::builder().object("entry_completion").unwrap(); + let completion = gtk::EntryCompletion::new(); + let store = gtk::TreeStore::new(&[glib::Type::STRING]); + for text in ["a", "app", "apple", "apples", "applets", "application"] { + let iter = store.append(None); + store.set_value(&iter, 0, &glib::GString::from(text).to_value()); + } + completion.set_text_column(0); + completion.set_model(Some(&store)); + entry_completion.set_completion(Some(&completion)); +} From 3d05940216e007b4b3681d8a8d620d5aedcf73fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kol=C3=ADn?= Date: Fri, 16 Aug 2024 23:00:30 +0200 Subject: [PATCH 50/58] [Rust] Ported Level Bars demo (#197) * [Rust] Ported Level Bars demo * Use `glib` directly --------- Co-authored-by: Ondrej Kolin Co-authored-by: Julian Hofer --- src/Level Bars/code.rs | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/Level Bars/code.rs diff --git a/src/Level Bars/code.rs b/src/Level Bars/code.rs new file mode 100644 index 00000000..43c9721a --- /dev/null +++ b/src/Level Bars/code.rs @@ -0,0 +1,60 @@ +use crate::workbench; +use gtk::glib; +use gtk::prelude::*; + +pub fn main() { + let bar_continuous: gtk::LevelBar = workbench::builder().object("bar_continuous").unwrap(); + + bar_continuous.add_offset_value("full", 100.0); + bar_continuous.add_offset_value("half", 50.0); + bar_continuous.add_offset_value("low", 25.0); + + let bar_discrete: gtk::LevelBar = workbench::builder().object("bar_discrete").unwrap(); + + bar_discrete.add_offset_value("very-weak", 1.0); + bar_discrete.add_offset_value("weak", 2.0); + bar_discrete.add_offset_value("moderate", 4.0); + bar_discrete.add_offset_value("strong", 6.0); + + let entry: gtk::PasswordEntry = workbench::builder().object("entry").unwrap(); + let label_strength: gtk::Label = workbench::builder().object("label_strength").unwrap(); + + // We're using the glib::clone! macro to + // provide access to the object from the handling closure + // https://gtk-rs.org/gtk-rs-core/stable/latest/docs/glib/macro.clone.html + + entry.connect_text_notify(glib::clone!( + @weak label_strength, @weak bar_discrete => move |entry| { + // This is not a secure way to estimate password strength + // Use appropriate solutions instead + // such as https://github.com/dropbox/zxcvbn + let level = std::cmp::min(entry.text().len() / 2, 6); + + match level { + 1 => { + label_strength.set_label("Very Weak"); + label_strength.set_css_classes(&["very-weak-label"]); + } + 2 => { + label_strength.set_label("Weak"); + label_strength.set_css_classes(&["weak-label"]); + } + 3 | 4 => { + label_strength.set_label("Moderate"); + label_strength.set_css_classes(&["moderate-label"]); + + } + 5 | 6 => { + label_strength.set_label("Strong"); + label_strength.set_css_classes(&["strong-label"]); + } + _ => { + label_strength.set_label(""); + label_strength.set_css_classes(&[]); + } + } + + bar_discrete.set_value(level as f64) + } + )); +} From 3e727f085044ac110351d62f2dcd2c7a0d1a6871 Mon Sep 17 00:00:00 2001 From: Dan Yeaw Date: Fri, 20 Sep 2024 11:25:22 -0400 Subject: [PATCH 51/58] Python: Update ColumnView to use Expressions (#191) --- CONTRIBUTING.md | 4 ++++ src/Column View/main.py | 37 ++++++++----------------------------- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 561c4a6c..a69fa652 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -124,3 +124,7 @@ Here is a compilation of resources to learn more about the GNOME platform. - [Valadoc.org](https://valadoc.org) - [Vala tutorial](https://wiki.gnome.org/Projects/Vala/Tutorial) - [Vala examples](https://wiki.gnome.org/Projects/Vala/Examples) + +### Python + +- [PyGObject Docs](https://pygobject.gnome.org) diff --git a/src/Column View/main.py b/src/Column View/main.py index 16541ed9..3c0ae631 100644 --- a/src/Column View/main.py +++ b/src/Column View/main.py @@ -59,7 +59,7 @@ def _on_factory_setup(_factory, list_item): def _on_factory_bind(_factory, list_item, what): label_widget = list_item.get_child() - book = list_item.get_item().get_item() + book = list_item.get_item() label_widget.set_label(str(getattr(book, what))) @@ -70,35 +70,14 @@ def _on_factory_bind(_factory, list_item, what): col3.get_factory().connect("setup", _on_factory_setup) col3.get_factory().connect("bind", _on_factory_bind, "year") - -# Custom Sorter is required because PyGObject doesn't currently support -# Gtk.Expression: https://gitlab.gnome.org/GNOME/pygobject/-/issues/356 - - -def model_func(_item): - pass - - -tree_model = Gtk.TreeListModel.new(data_model, False, True, model_func) -tree_sorter = Gtk.TreeListRowSorter.new(column_view.get_sorter()) -sorter_model = Gtk.SortListModel(model=tree_model, sorter=tree_sorter) +sorter_model = Gtk.SortListModel.new(model=data_model, sorter=column_view.get_sorter()) selection = Gtk.SingleSelection.new(model=sorter_model) column_view.set_model(model=selection) +col1_exp = Gtk.PropertyExpression.new(Book, None, "title") +col2_exp = Gtk.PropertyExpression.new(Book, None, "author") +col3_exp = Gtk.PropertyExpression.new(Book, None, "year") -def str_sorter(object_a, object_b, column) -> bool: - a = getattr(object_a, column).lower() - b = getattr(object_b, column).lower() - return (a > b) - (a < b) - - -def int_sorter(object_a, object_b, column) -> bool: - print(object_a) - a = getattr(object_a, column) - b = getattr(object_b, column) - return (a > b) - (a < b) - - -col1.set_sorter(Gtk.CustomSorter.new(str_sorter, "title")) -col2.set_sorter(Gtk.CustomSorter.new(str_sorter, "author")) -col3.set_sorter(Gtk.CustomSorter.new(int_sorter, "year")) +col1.set_sorter(Gtk.StringSorter.new(col1_exp)) +col2.set_sorter(Gtk.StringSorter.new(col2_exp)) +col3.set_sorter(Gtk.NumericSorter.new(col3_exp)) From b3982bb3f5614b970e70921b0b6f41d9c59e8386 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Mon, 23 Sep 2024 10:32:30 +0200 Subject: [PATCH 52/58] Workbench 47 --- Makefile | 2 +- src/Button Row/main.json | 2 +- src/Column View/main.js | 2 +- src/Drop Down/main.js | 2 +- src/Wallpaper/main.js | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 2ac9bfca..65cbbde8 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ SHELL:=/bin/bash -O globstar setup: flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo - flatpak install --or-update --user --noninteractive flathub org.freedesktop.Sdk.Extension.rust-stable//23.08 org.freedesktop.Sdk.Extension.vala//23.08 org.freedesktop.Sdk.Extension.node18//23.08 org.freedesktop.Sdk.Extension.typescript//23.08 + flatpak install --or-update --user --noninteractive flathub org.freedesktop.Sdk.Extension.rust-stable//24.08 org.freedesktop.Sdk.Extension.vala//24.08 org.freedesktop.Sdk.Extension.node20//24.08 #org.freedesktop.Sdk.Extension.typescript//24.08 # flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo flatpak remote-add --user --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo flatpak install --or-update --user --noninteractive gnome-nightly re.sonny.Workbench.Devel diff --git a/src/Button Row/main.json b/src/Button Row/main.json index 159b8c2b..27ac84c0 100644 --- a/src/Button Row/main.json +++ b/src/Button Row/main.json @@ -3,5 +3,5 @@ "description": "Use buttons in boxed lists", "panels": ["ui", "preview"], "autorun": true, - "runtime-version": "master" + "runtime-version": "47" } diff --git a/src/Column View/main.js b/src/Column View/main.js index 78f53400..94516201 100644 --- a/src/Column View/main.js +++ b/src/Column View/main.js @@ -36,7 +36,7 @@ const Book = GObject.registerClass( ), }, }, - class Book extends GObject.Object { }, + class Book extends GObject.Object {}, ); // Create the model diff --git a/src/Drop Down/main.js b/src/Drop Down/main.js index c6a928dd..ca965452 100644 --- a/src/Drop Down/main.js +++ b/src/Drop Down/main.js @@ -37,7 +37,7 @@ const KeyValuePair = GObject.registerClass( ), }, }, - class KeyValuePair extends GObject.Object { }, + class KeyValuePair extends GObject.Object {}, ); const model = new Gio.ListStore({ item_type: KeyValuePair }); diff --git a/src/Wallpaper/main.js b/src/Wallpaper/main.js index e3be0838..8f768887 100644 --- a/src/Wallpaper/main.js +++ b/src/Wallpaper/main.js @@ -15,8 +15,8 @@ async function onClicked() { parent, uri, Xdp.WallpaperFlags.PREVIEW | - Xdp.WallpaperFlags.BACKGROUND | - Xdp.WallpaperFlags.LOCKSCREEN, + Xdp.WallpaperFlags.BACKGROUND | + Xdp.WallpaperFlags.LOCKSCREEN, null, ); From 31fa171e8047aca481fe8bb138f7c29903cb7647 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Mon, 23 Sep 2024 23:03:47 +0200 Subject: [PATCH 53/58] Fix JS Camera and Screencast demos For https://github.com/workbenchdev/Workbench/pull/984 --- src/Camera/main.js | 5 ++--- src/Screencast/main.js | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Camera/main.js b/src/Camera/main.js index b31e911a..3e0ebcaa 100644 --- a/src/Camera/main.js +++ b/src/Camera/main.js @@ -63,9 +63,8 @@ async function handleCamera() { source.link(queue); queue.link(glsinkbin); - const paintable = new GObject.Value(); - paintable_sink.get_property("paintable", paintable); - output.paintable = paintable.get_object(); + const paintable = paintable_sink.get_property("paintable"); + output.paintable = paintable; // Start the pipeline pipeline.set_state(Gst.State.PLAYING); diff --git a/src/Screencast/main.js b/src/Screencast/main.js index dc110756..450200e7 100644 --- a/src/Screencast/main.js +++ b/src/Screencast/main.js @@ -82,9 +82,8 @@ async function startScreencastSession() { source.link(queue); queue.link(glsinkbin); - const paintable = new GObject.Value(); - paintable_sink.get_property("paintable", paintable); - output.paintable = paintable.get_object(); + const paintable = paintable_sink.get_property("paintable"); + output.paintable = paintable; // Start the pipeline pipeline.set_state(Gst.State.PLAYING); From 286ba65af46b340e895d3fc818428c59c88a6fea Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Thu, 26 Sep 2024 13:43:27 +0200 Subject: [PATCH 54/58] Change category of Welcome to tools --- src/Welcome/main.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Welcome/main.json b/src/Welcome/main.json index 863caaab..7577829b 100644 --- a/src/Welcome/main.json +++ b/src/Welcome/main.json @@ -1,5 +1,5 @@ { - "category": "uncategorized", + "category": "tools", "description": "Learn how to use Workbench", "panels": ["ui", "preview"], "autorun": false From 4f6a21ac2a029712eba3361ce0f2a72182740d59 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Thu, 26 Sep 2024 17:00:49 +0200 Subject: [PATCH 55/58] Add permissions to metadata --- src/Audio/main.json | 3 ++- src/HTTP Image/main.json | 3 ++- src/HTTP Request/main.json | 3 ++- src/HTTP Server/main.json | 3 ++- src/Video/main.json | 3 ++- src/WebSocket Client/main.json | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Audio/main.json b/src/Audio/main.json index 68d7c977..e3fb0434 100644 --- a/src/Audio/main.json +++ b/src/Audio/main.json @@ -2,5 +2,6 @@ "category": "user_interface", "description": "Play audio with media controls", "panels": ["code", "preview"], - "autorun": true + "autorun": true, + "flatpak-finish-args": ["--socket=pulseaudio"] } diff --git a/src/HTTP Image/main.json b/src/HTTP Image/main.json index c77ba11c..00bad0ce 100644 --- a/src/HTTP Image/main.json +++ b/src/HTTP Image/main.json @@ -2,5 +2,6 @@ "category": "network", "description": "Load and display an image from an HTTP URL", "panels": ["code", "preview"], - "autorun": true + "autorun": true, + "flatpak-finish-args": ["--device=network"] } diff --git a/src/HTTP Request/main.json b/src/HTTP Request/main.json index 350774d4..28079ecd 100644 --- a/src/HTTP Request/main.json +++ b/src/HTTP Request/main.json @@ -2,5 +2,6 @@ "category": "network", "description": "Make a request to an API", "panels": ["code", "preview"], - "autorun": true + "autorun": true, + "flatpak-finish-args": ["--device=network"] } diff --git a/src/HTTP Server/main.json b/src/HTTP Server/main.json index 4bbcc875..f8a37d66 100644 --- a/src/HTTP Server/main.json +++ b/src/HTTP Server/main.json @@ -2,5 +2,6 @@ "category": "network", "description": "Interact with HTTP clients and browsers", "panels": ["code", "preview"], - "autorun": true + "autorun": true, + "flatpak-finish-args": ["--device=network"] } diff --git a/src/Video/main.json b/src/Video/main.json index 4750ebf1..66f2937e 100644 --- a/src/Video/main.json +++ b/src/Video/main.json @@ -2,5 +2,6 @@ "category": "user_interface", "description": "Display video with media controls", "panels": ["code", "ui", "preview"], - "autorun": true + "autorun": true, + "flatpak-finish-args": ["--socket=pulseaudio"] } diff --git a/src/WebSocket Client/main.json b/src/WebSocket Client/main.json index 62136ac0..0f8a9fb2 100644 --- a/src/WebSocket Client/main.json +++ b/src/WebSocket Client/main.json @@ -2,5 +2,6 @@ "category": "network", "description": "Using libsoup to establish a WebSocket connection", "panels": ["code", "preview"], - "autorun": true + "autorun": true, + "flatpak-finish-args": ["--device=network"] } From 6a9de43e5ede8afe911eb7580e948986f8a7ea73 Mon Sep 17 00:00:00 2001 From: Sonny Piers Date: Thu, 26 Sep 2024 17:04:08 +0200 Subject: [PATCH 56/58] Add network permission to Web View --- src/Web View/main.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Web View/main.json b/src/Web View/main.json index 4b1763e3..41d5d727 100644 --- a/src/Web View/main.json +++ b/src/Web View/main.json @@ -2,5 +2,6 @@ "category": "network", "description": "Load and display webpages and HTML", "panels": ["code", "preview"], - "autorun": true + "autorun": true, + "flatpak-finish-args": ["--device=network"] } From 2a6b18d3f761b638472de74ed37ca13d01c83ebb Mon Sep 17 00:00:00 2001 From: Atbrat <72352158+BharatAtbrat@users.noreply.github.com> Date: Fri, 27 Sep 2024 02:04:10 +0530 Subject: [PATCH 57/58] Port 'CSS Gradients' demo to Vala (#155) --- src/CSS Gradients/main.vala | 121 ++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/CSS Gradients/main.vala diff --git a/src/CSS Gradients/main.vala b/src/CSS Gradients/main.vala new file mode 100644 index 00000000..244b1958 --- /dev/null +++ b/src/CSS Gradients/main.vala @@ -0,0 +1,121 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg gtksourceview-5 + +private GtkSource.Buffer gtksource_buffer; +private Adw.ComboRow combo_row_gradient_type; +private Adw.SpinRow spin_row_angle; +private Gtk.ColorDialogButton button_color_1; +private Gtk.ColorDialogButton button_color_2; +private Gtk.ColorDialogButton button_color_3; +private Adw.StyleManager style_manager; +private GtkSource.StyleSchemeManager scheme_manager; +private Gtk.CssProvider css_provider; +private string css; + +void update () { + spin_row_angle.sensitive = combo_row_gradient_type.selected != 1; + css = generate_css (); + gtksource_buffer.set_text (css, -1); + update_css_provider (css); +} + +void update_css_provider (string css) { + var display = Gdk.Display.get_default (); + if (css_provider == null) { + css_provider = new Gtk.CssProvider (); + } else { + Gtk.StyleContext.remove_provider_for_display (display, css_provider); + } + + css_provider.load_from_string (css); + Gtk.StyleContext.add_provider_for_display (display, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); +} + +string generate_css () { + double angle = spin_row_angle.get_value (); + string angle_string = angle.to_string (); + string first_color_string = button_color_1.get_rgba ().to_string (); + string second_color_string = button_color_2.get_rgba ().to_string (); + string third_color_string = button_color_3.get_rgba ().to_string (); + + uint selected = combo_row_gradient_type.selected; + switch (selected) { + case 0: + css = @".background-gradient { + background-image: linear-gradient( + $(angle_string)deg, + $(first_color_string), + $(second_color_string), + $(third_color_string) + ); +}"; + break; + case 1: + css = @".background-gradient { + background-image: radial-gradient( + $(first_color_string), + $(second_color_string), + $(third_color_string) + ); +}"; + break; + case 2: + css = @".background-gradient { + background-image: conic-gradient( + from $(angle_string)deg, + $(first_color_string), + $(second_color_string), + $(third_color_string) + ); +}"; + break; + } + return css; +} + +void update_color_scheme () { + string scheme_name = style_manager.dark ? "Adwaita-dark" : "Adwaita"; + GtkSource.StyleScheme scheme = scheme_manager.get_scheme (scheme_name); + + if (scheme != null) { + gtksource_buffer.style_scheme = scheme; + } +} + +public void main () { + combo_row_gradient_type = (Adw.ComboRow) workbench.builder.get_object ("combo_row_gradient_type"); + spin_row_angle = (Adw.SpinRow) workbench.builder.get_object ("spin_row_angle"); + button_color_1 = (Gtk.ColorDialogButton) workbench.builder.get_object ("button_color_1"); + button_color_2 = (Gtk.ColorDialogButton) workbench.builder.get_object ("button_color_2"); + button_color_3 = (Gtk.ColorDialogButton) workbench.builder.get_object ("button_color_3"); + gtksource_buffer = (GtkSource.Buffer) workbench.builder.get_object ("gtksource_buffer"); + var button_copy_css = (Gtk.Button) workbench.builder.get_object ("button_copy_css"); + + combo_row_gradient_type.notify["selected"].connect (update); + spin_row_angle.notify["value"].connect (update); + button_color_1.notify["rgba"].connect (update); + button_color_2.notify["rgba"].connect (update); + button_color_3.notify["rgba"].connect (update); + /* + * code view + */ + Gdk.Clipboard clipboard = Gdk.Display.get_default ().get_clipboard (); + + button_copy_css.clicked.connect (() => { + Gtk.TextIter start, end; + gtksource_buffer.get_start_iter (out start); + gtksource_buffer.get_end_iter (out end); + string text = gtksource_buffer.get_text (start, end, false); + clipboard.set_text (text); + }); + + scheme_manager = GtkSource.StyleSchemeManager.get_default (); + style_manager = Adw.StyleManager.get_default (); + style_manager.notify["dark"].connect (() => update_color_scheme ()); + + var language_manager = GtkSource.LanguageManager.get_default (); + GtkSource.Language css_language = language_manager.get_language ("css"); + gtksource_buffer.language = css_language; + + update (); + update_color_scheme (); +} From cda16c268be7d1e2d8435765b158f55aabe1a69c Mon Sep 17 00:00:00 2001 From: Sonny Date: Thu, 26 Sep 2024 22:36:52 +0200 Subject: [PATCH 58/58] Update Spinner demo to AdwSpinner (#205) --- src/About Dialog/code.rs | 2 +- src/About Dialog/main.blp | 2 +- src/About Dialog/main.js | 2 +- src/About Dialog/main.py | 2 +- src/About Dialog/main.vala | 2 +- src/Advanced Buttons/main.blp | 4 ++-- src/Animation/main.blp | 4 ++-- src/Avatar/main.blp | 2 +- src/Banner/main.blp | 2 +- src/Boxed Lists/main.blp | 2 +- src/Breakpoints/main.blp | 4 ++-- src/Carousel/main.blp | 2 +- src/Clamp/main.blp | 2 +- src/Dialog/main.blp | 2 +- src/Header Bar/main.blp | 2 +- src/Message Dialogs/main.blp | 2 +- src/Navigation Split View/main.blp | 2 +- src/Navigation View/main.blp | 2 +- src/Overlay Split View/main.blp | 2 +- src/Preferences Dialog/main.blp | 8 ++++---- src/Spinner/code.rs | 8 ++++---- src/Spinner/main.blp | 33 +++++++++++++++--------------- src/Spinner/main.js | 8 ++++---- src/Spinner/main.json | 3 ++- src/Spinner/main.py | 8 ++++---- src/Spinner/main.vala | 8 ++++---- src/Status Page/main.blp | 2 +- src/Styling with CSS/main.blp | 4 ++-- src/Tab View/main.blp | 6 +++--- src/Toasts/main.blp | 2 +- src/Toolbar View/main.blp | 2 +- src/View Switcher/main.blp | 6 +++--- src/Window/main.blp | 2 +- 33 files changed, 73 insertions(+), 71 deletions(-) diff --git a/src/About Dialog/code.rs b/src/About Dialog/code.rs index 5ed8b407..5005c866 100644 --- a/src/About Dialog/code.rs +++ b/src/About Dialog/code.rs @@ -28,7 +28,7 @@ fn on_button_clicked() { dialog.add_link( "Documentation", - "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.AboutDialog.html", + "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.AboutDialog.html", ); dialog.add_legal_section( diff --git a/src/About Dialog/main.blp b/src/About Dialog/main.blp index 08cd84c7..17c4351d 100644 --- a/src/About Dialog/main.blp +++ b/src/About Dialog/main.blp @@ -21,7 +21,7 @@ Adw.StatusPage { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.AboutDialog.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.AboutDialog.html"; } } } diff --git a/src/About Dialog/main.js b/src/About Dialog/main.js index 5678c8d4..f805d312 100644 --- a/src/About Dialog/main.js +++ b/src/About Dialog/main.js @@ -25,7 +25,7 @@ function openAboutDialog() { dialog.add_link( _("Documentation"), - "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.AboutDialog.html", + "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.AboutDialog.html", ); dialog.add_legal_section( diff --git a/src/About Dialog/main.py b/src/About Dialog/main.py index ebd764ae..326bb2ce 100644 --- a/src/About Dialog/main.py +++ b/src/About Dialog/main.py @@ -28,7 +28,7 @@ def open_about_window(_widget): dialog.add_link( _("Documentation"), - "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.AboutDialog.html", + "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.AboutDialog.html", ) dialog.add_legal_section( diff --git a/src/About Dialog/main.vala b/src/About Dialog/main.vala index ae4cebe3..f4787b16 100644 --- a/src/About Dialog/main.vala +++ b/src/About Dialog/main.vala @@ -25,7 +25,7 @@ public void on_button_clicked () { }; dialog.add_link ( "Documentation", - "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.AboutDialog.html" + "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.AboutDialog.html" ); dialog.add_legal_section ( "Fonts", diff --git a/src/Advanced Buttons/main.blp b/src/Advanced Buttons/main.blp index 04c33fe2..186a56a2 100644 --- a/src/Advanced Buttons/main.blp +++ b/src/Advanced Buttons/main.blp @@ -71,7 +71,7 @@ Adw.StatusPage { LinkButton { margin-bottom: 36; label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.SplitButton.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.SplitButton.html"; } Box { @@ -157,7 +157,7 @@ Adw.StatusPage { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ButtonContent.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.ButtonContent.html"; } } } diff --git a/src/Animation/main.blp b/src/Animation/main.blp index eb6030af..876a4e41 100644 --- a/src/Animation/main.blp +++ b/src/Animation/main.blp @@ -163,12 +163,12 @@ Adw.Clamp { LinkButton { label: _("Timed Animation"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.TimedAnimation.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.TimedAnimation.html"; } LinkButton { label: _("Spring Animation"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.SpringAnimation.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.SpringAnimation.html"; } } } diff --git a/src/Avatar/main.blp b/src/Avatar/main.blp index d8290323..a464d063 100644 --- a/src/Avatar/main.blp +++ b/src/Avatar/main.blp @@ -47,7 +47,7 @@ Adw.StatusPage { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.Avatar.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Avatar.html"; } } } diff --git a/src/Banner/main.blp b/src/Banner/main.blp index de9401d6..9b7ae115 100644 --- a/src/Banner/main.blp +++ b/src/Banner/main.blp @@ -36,7 +36,7 @@ Adw.ToastOverlay overlay { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.Banner.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Banner.html"; } LinkButton { diff --git a/src/Boxed Lists/main.blp b/src/Boxed Lists/main.blp index 4908f118..51a6235d 100644 --- a/src/Boxed Lists/main.blp +++ b/src/Boxed Lists/main.blp @@ -113,7 +113,7 @@ Adw.StatusPage { LinkButton { margin-top: 24; label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/boxed-lists.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/boxed-lists.html"; } LinkButton { diff --git a/src/Breakpoints/main.blp b/src/Breakpoints/main.blp index 103cc678..afb8db3c 100644 --- a/src/Breakpoints/main.blp +++ b/src/Breakpoints/main.blp @@ -41,12 +41,12 @@ Gtk.Window { LinkButton { margin-top: 24; label: _("Breakpoint"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.Breakpoint.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Breakpoint.html"; } LinkButton { label: _("Breakpoint Bin"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.BreakpointBin.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.BreakpointBin.html"; } }; } diff --git a/src/Carousel/main.blp b/src/Carousel/main.blp index 09490702..b5f9efb1 100644 --- a/src/Carousel/main.blp +++ b/src/Carousel/main.blp @@ -21,7 +21,7 @@ Box root_box { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.Carousel.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Carousel.html"; margin-top: 12; } } diff --git a/src/Clamp/main.blp b/src/Clamp/main.blp index a1d9ba7f..1b1cb48b 100644 --- a/src/Clamp/main.blp +++ b/src/Clamp/main.blp @@ -26,7 +26,7 @@ Adw.StatusPage { LinkButton { margin-top: 12; label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.Clamp.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Clamp.html"; } Adw.Clamp clamp { diff --git a/src/Dialog/main.blp b/src/Dialog/main.blp index d59e0170..bc2fbe1d 100644 --- a/src/Dialog/main.blp +++ b/src/Dialog/main.blp @@ -46,7 +46,7 @@ Adw.StatusPage { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.Dialog.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Dialog.html"; } LinkButton { diff --git a/src/Header Bar/main.blp b/src/Header Bar/main.blp index efc3a63c..4bb67853 100644 --- a/src/Header Bar/main.blp +++ b/src/Header Bar/main.blp @@ -41,7 +41,7 @@ Gtk.Window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.HeaderBar.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.HeaderBar.html"; } LinkButton { diff --git a/src/Message Dialogs/main.blp b/src/Message Dialogs/main.blp index 30ed76bb..2b25a7c0 100644 --- a/src/Message Dialogs/main.blp +++ b/src/Message Dialogs/main.blp @@ -38,7 +38,7 @@ Adw.StatusPage { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.AlertDialog.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.AlertDialog.html"; } LinkButton { diff --git a/src/Navigation Split View/main.blp b/src/Navigation Split View/main.blp index f8ff62ab..abe9bcc5 100644 --- a/src/Navigation Split View/main.blp +++ b/src/Navigation Split View/main.blp @@ -61,7 +61,7 @@ Adw.Window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.NavigationSplitView.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.NavigationSplitView.html"; } }; }; diff --git a/src/Navigation View/main.blp b/src/Navigation View/main.blp index 453fa1bc..e5c4aa45 100644 --- a/src/Navigation View/main.blp +++ b/src/Navigation View/main.blp @@ -89,7 +89,7 @@ Adw.StatusPage { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.NavigationView.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.NavigationView.html"; } } } diff --git a/src/Overlay Split View/main.blp b/src/Overlay Split View/main.blp index d8de1340..5ffc1f79 100644 --- a/src/Overlay Split View/main.blp +++ b/src/Overlay Split View/main.blp @@ -81,7 +81,7 @@ Adw.Window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.OverlaySplitView.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.OverlaySplitView.html"; margin-top: 24; } } diff --git a/src/Preferences Dialog/main.blp b/src/Preferences Dialog/main.blp index 3815ae61..c3fb294d 100644 --- a/src/Preferences Dialog/main.blp +++ b/src/Preferences Dialog/main.blp @@ -27,22 +27,22 @@ Adw.StatusPage { LinkButton { label: _("PreferencesDialog"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.PreferencesDialog.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.PreferencesDialog.html"; } LinkButton { label: _("PreferencesPage"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.PreferencesPage.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.PreferencesPage.html"; } LinkButton { label: _("PreferencesGroup"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.PreferencesGroup.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.PreferencesGroup.html"; } LinkButton { label: _("PreferencesRow"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.PreferencesRow.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.PreferencesRow.html"; } } } diff --git a/src/Spinner/code.rs b/src/Spinner/code.rs index 131eab9e..109b6cca 100644 --- a/src/Spinner/code.rs +++ b/src/Spinner/code.rs @@ -6,12 +6,12 @@ pub fn main() { let spinner: gtk::Spinner = workbench::builder().object("spinner").unwrap(); button.connect_clicked(move |button| { - if spinner.is_spinning() { + if spinner.is_visible() { button.set_icon_name("media-playback-start"); - spinner.set_spinning(false); + spinner.set_visible(false); } else { - button.set_icon_name("media-playback-pause"); - spinner.set_spinning(true); + button.set_icon_name("media-playback-stop"); + spinner.set_visible(true); } }); } diff --git a/src/Spinner/main.blp b/src/Spinner/main.blp index ff255ca2..d7df9da7 100644 --- a/src/Spinner/main.blp +++ b/src/Spinner/main.blp @@ -8,15 +8,17 @@ Adw.StatusPage { Box { orientation: vertical; halign: center; + spacing: 24; - Spinner spinner { - spinning: true; - margin-bottom: 30; + Adw.Spinner spinner { + halign: center; + valign: center; + width-request: 48; + height-request: 48; } Button button { - icon-name: "media-playback-pause"; - margin-bottom: 30; + icon-name: "media-playback-stop"; halign: center; styles [ @@ -24,19 +26,18 @@ Adw.StatusPage { ] } - LinkButton { - label: _("Tutorial"); - uri: "https://developer.gnome.org/documentation/tutorials/beginners/components/spinner.html"; - } + Box { + orientation: vertical; - LinkButton { - label: _("API Reference"); - uri: "https://docs.gtk.org/gtk4/class.Spinner.html"; - } + LinkButton { + label: _("API Reference"); + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Spinner.html"; + } - LinkButton { - label: _("Human Interface Guidelines"); - uri: "https://developer.gnome.org/hig/patterns/feedback/spinners.html"; + LinkButton { + label: _("Human Interface Guidelines"); + uri: "https://developer.gnome.org/hig/patterns/feedback/spinners.html"; + } } } } diff --git a/src/Spinner/main.js b/src/Spinner/main.js index 83633967..80d76343 100644 --- a/src/Spinner/main.js +++ b/src/Spinner/main.js @@ -2,11 +2,11 @@ const button = workbench.builder.get_object("button"); const spinner = workbench.builder.get_object("spinner"); button.connect("clicked", () => { - if (spinner.spinning === true) { + if (spinner.visible === true) { button.icon_name = "media-playback-start"; - spinner.spinning = false; + spinner.visible = false; } else { - button.icon_name = "media-playback-pause"; - spinner.spinning = true; + button.icon_name = "media-playback-stop"; + spinner.visible = true; } }); diff --git a/src/Spinner/main.json b/src/Spinner/main.json index 7cb696e8..37659ad4 100644 --- a/src/Spinner/main.json +++ b/src/Spinner/main.json @@ -2,5 +2,6 @@ "category": "feedback", "description": "Display loading state", "panels": ["ui", "preview"], - "autorun": true + "autorun": true, + "runtime-version": "47" } diff --git a/src/Spinner/main.py b/src/Spinner/main.py index df2648ef..9b56985b 100644 --- a/src/Spinner/main.py +++ b/src/Spinner/main.py @@ -9,12 +9,12 @@ def button_clicked(_widget): - if spinner.get_spinning(): + if spinner.get_visible(): button.set_icon_name("media-playback-start") - spinner.set_spinning(False) + spinner.set_visible(False) else: - button.set_icon_name("media-playback-pause") - spinner.set_spinning(True) + button.set_icon_name("media-playback-stop") + spinner.set_visible(True) button.connect("clicked", button_clicked) diff --git a/src/Spinner/main.vala b/src/Spinner/main.vala index 7d04d24a..18fd435b 100644 --- a/src/Spinner/main.vala +++ b/src/Spinner/main.vala @@ -7,12 +7,12 @@ public void main () { var spinner = (Gtk.Spinner) workbench.builder.get_object ("spinner"); button.clicked.connect (() => { - if (spinner.spinning) { + if (spinner.visible) { button.icon_name = "media-playback-start"; - spinner.spinning = false; + spinner.visible = false; } else { - button.icon_name = "media-playback-pause"; - spinner.spinning = true; + button.icon_name = "media-playback-stop"; + spinner.visible = true; } }); } diff --git a/src/Status Page/main.blp b/src/Status Page/main.blp index 0a835c93..c33f85a7 100644 --- a/src/Status Page/main.blp +++ b/src/Status Page/main.blp @@ -13,7 +13,7 @@ Adw.StatusPage status_page { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.StatusPage.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.StatusPage.html"; } LinkButton { diff --git a/src/Styling with CSS/main.blp b/src/Styling with CSS/main.blp index 570f3ff3..a9ee969f 100644 --- a/src/Styling with CSS/main.blp +++ b/src/Styling with CSS/main.blp @@ -81,12 +81,12 @@ Adw.StatusPage { LinkButton { label: _("Style Classes"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/style-classes.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/style-classes.html"; } LinkButton { label: _("Named Colors"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/named-colors.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/named-colors.html"; } } } diff --git a/src/Tab View/main.blp b/src/Tab View/main.blp index e973a18c..acd18369 100644 --- a/src/Tab View/main.blp +++ b/src/Tab View/main.blp @@ -50,17 +50,17 @@ Adw.Window { LinkButton { label: _("Tab View"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.TabView.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.TabView.html"; } LinkButton { label: _("Tab Bar"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.TabBar.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.TabBar.html"; } LinkButton { label: _("Tab Overview"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.TabOverview.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.TabOverview.html"; } } diff --git a/src/Toasts/main.blp b/src/Toasts/main.blp index 99fb6cd6..e252a34a 100644 --- a/src/Toasts/main.blp +++ b/src/Toasts/main.blp @@ -35,7 +35,7 @@ Adw.ToastOverlay overlay { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.Toast.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.Toast.html"; } LinkButton { diff --git a/src/Toolbar View/main.blp b/src/Toolbar View/main.blp index f6eb5bd6..545ad8ab 100644 --- a/src/Toolbar View/main.blp +++ b/src/Toolbar View/main.blp @@ -64,7 +64,7 @@ Adw.Window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ToolbarView.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.ToolbarView.html"; } ListBox list_box { diff --git a/src/View Switcher/main.blp b/src/View Switcher/main.blp index e1f749a4..c34259a4 100644 --- a/src/View Switcher/main.blp +++ b/src/View Switcher/main.blp @@ -44,7 +44,7 @@ Adw.Window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ViewSwitcher.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.ViewSwitcher.html"; } LinkButton { @@ -71,7 +71,7 @@ Adw.Window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ViewSwitcher.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.ViewSwitcher.html"; } LinkButton { @@ -126,7 +126,7 @@ Adw.Window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ViewSwitcher.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.ViewSwitcher.html"; } LinkButton { diff --git a/src/Window/main.blp b/src/Window/main.blp index ef7cab6e..bd5b5526 100644 --- a/src/Window/main.blp +++ b/src/Window/main.blp @@ -29,7 +29,7 @@ Adw.Window window { LinkButton { label: _("API Reference"); - uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.5/class.ApplicationWindow.html"; + uri: "https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.6/class.ApplicationWindow.html"; } LinkButton {