add examples

This commit is contained in:
Daniel Langbein 2025-02-11 21:39:39 +01:00
parent 3f4d41958e
commit 3600ffd1a5
Signed by: langfingaz
GPG Key ID: 6C47C753F0823002
5 changed files with 324 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

172
src/clipboard.rs Normal file
View File

@ -0,0 +1,172 @@
// Copied from https://github.com/gtk-rs/gtk4-rs/blob/main/examples/clipboard/main.rs
use gtk4 as gtk;
use gtk::{
gdk, gio,
glib::{self, clone},
prelude::*,
};
fn main() -> glib::ExitCode {
let application = gtk::Application::builder()
.application_id("com.github.gtk-rs.examples.clipboard")
.build();
application.connect_activate(build_ui);
application.run()
}
fn build_ui(application: &gtk::Application) {
let window = gtk::ApplicationWindow::builder()
.application(application)
.title("Clipboard")
.default_width(660)
.default_height(420)
.build();
let display = gdk::Display::default().unwrap();
let clipboard = display.clipboard();
let container = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical)
.margin_top(24)
.margin_bottom(24)
.margin_start(24)
.margin_end(24)
.halign(gtk::Align::Center)
.valign(gtk::Align::Center)
.spacing(24)
.build();
// The text copy/paste part
let title = gtk::Label::builder()
.label("Text")
.halign(gtk::Align::Start)
.build();
title.add_css_class("title-2");
container.append(&title);
let text_container = gtk::Box::builder()
.halign(gtk::Align::Center)
.orientation(gtk::Orientation::Horizontal)
.spacing(24)
.build();
let from_entry = gtk::Entry::builder()
.placeholder_text("Type text to copy")
.build();
text_container.append(&from_entry);
let copy_btn = gtk::Button::with_label("Copy");
copy_btn.connect_clicked(clone!(
#[weak]
clipboard,
#[weak]
from_entry,
move |_btn| {
let text = from_entry.text();
clipboard.set_text(&text);
}
));
text_container.append(&copy_btn);
let into_entry = gtk::Entry::new();
text_container.append(&into_entry);
let paste_btn = gtk::Button::with_label("Paste");
paste_btn.connect_clicked(clone!(
#[weak]
clipboard,
#[weak]
into_entry,
move |_btn| {
clipboard.read_text_async(
gio::Cancellable::NONE,
clone!(
#[weak]
into_entry,
move |res| {
if let Ok(Some(text)) = res {
into_entry.set_text(&text);
}
}
),
);
}
));
text_container.append(&paste_btn);
container.append(&text_container);
// The texture copy/paste part
let title = gtk::Label::builder()
.label("Texture")
.halign(gtk::Align::Start)
.build();
title.add_css_class("title-2");
container.append(&title);
let texture_container = gtk::Box::builder()
.orientation(gtk::Orientation::Horizontal)
.halign(gtk::Align::Center)
.spacing(24)
.build();
let file = gio::File::for_path("./examples/clipboard/asset.png");
let asset_paintable = gdk::Texture::from_file(&file).unwrap();
let image_from = gtk::Image::builder()
.pixel_size(96)
.paintable(&asset_paintable)
.build();
texture_container.append(&image_from);
let copy_texture_btn = gtk::Button::builder()
.label("Copy")
.valign(gtk::Align::Center)
.build();
copy_texture_btn.connect_clicked(clone!(
#[weak]
clipboard,
#[weak]
image_from,
move |_btn| {
let texture = image_from
.paintable()
.and_downcast::<gdk::Texture>()
.unwrap();
clipboard.set_texture(&texture);
}
));
texture_container.append(&copy_texture_btn);
let image_into = gtk::Image::builder()
.pixel_size(96)
.icon_name("image-missing")
.build();
texture_container.append(&image_into);
let paste_texture_btn = gtk::Button::builder()
.label("Paste")
.valign(gtk::Align::Center)
.build();
paste_texture_btn.connect_clicked(clone!(
#[weak]
clipboard,
move |_btn| {
clipboard.read_texture_async(
gio::Cancellable::NONE,
clone!(
#[weak]
image_into,
move |res| {
if let Ok(Some(texture)) = res {
image_into.set_paintable(Some(&texture));
}
}
),
);
}
));
texture_container.append(&paste_texture_btn);
container.append(&texture_container);
window.set_child(Some(&container));
window.present();
}

45
src/clock.rs Normal file
View File

@ -0,0 +1,45 @@
// Example copied from https://github.com/gtk-rs/gtk4-rs/blob/main/examples/clock/main.rs
use chrono::Local;
use gtk4 as gtk;
use gtk::{glib, prelude::*};
fn main() -> glib::ExitCode {
let application = gtk::Application::builder()
.application_id("com.github.gtk-rs.examples.clock")
.build();
application.connect_activate(build_ui);
application.run()
}
fn build_ui(application: &gtk::Application) {
let window = gtk::ApplicationWindow::new(application);
window.set_title(Some("Clock Example"));
window.set_default_size(260, 40);
let time = current_time();
let label = gtk::Label::default();
label.set_text(&time);
window.set_child(Some(&label));
window.present();
// we are using a closure to capture the label (else we could also use a normal
// function)
let tick = move || {
let time = current_time();
label.set_text(&time);
// we could return glib::ControlFlow::Break to stop our clock after this tick
glib::ControlFlow::Continue
};
// executes the closure once every second
glib::timeout_add_seconds_local(1, tick);
}
fn current_time() -> String {
format!("{}", Local::now().format("%Y-%m-%d %H:%M:%S"))
}

78
src/counter.rs Normal file
View File

@ -0,0 +1,78 @@
// Example copied from https://github.com/kashifsoofi/blog-code-samples/blob/gtk4-c-counter-app/gtk4-rust-counter-app/src/main.rs
use std::cell::Cell;
use std::rc::Rc;
use gtk4 as gtk;
use gtk::glib::clone;
use gtk::prelude::*;
use gtk::{glib, Application, ApplicationWindow, Label, Box, Button, Orientation};
const APP_ID: &str = "org.gtk_rs.GTK4Counter";
fn main() -> glib::ExitCode {
// Create a new application
let app = Application::builder().application_id(APP_ID).build();
// Connect to "activate" signal of `app`
app.connect_activate(build_ui);
// Run the application
app.run()
}
fn build_ui(app: &Application) {
let counter = Rc::new(Cell::new(0));
let label_counter = Label::builder()
.label(&counter.get().to_string())
.margin_top(12)
.margin_bottom(12)
.margin_start(12)
.margin_end(12)
.build();
let button_increase = Button::builder()
.label("Increase")
.margin_top(12)
.margin_bottom(12)
.margin_start(12)
.margin_end(12)
.build();
let button_decrease = Button::builder()
.label("Decrease")
.margin_top(12)
.margin_bottom(12)
.margin_start(12)
.margin_end(12)
.build();
button_increase.connect_clicked(clone!(@weak counter, @weak label_counter =>
move |_| {
counter.set(counter.get() + 1);
label_counter.set_label(&counter.get().to_string());
}));
button_decrease.connect_clicked(clone!(@weak label_counter =>
move |_| {
counter.set(counter.get() - 1);
label_counter.set_label(&counter.get().to_string());
}));
let gtk_box = Box::builder()
.orientation(Orientation::Vertical)
.build();
gtk_box.append(&label_counter);
gtk_box.append(&button_increase);
gtk_box.append(&button_decrease);
// Create a window and set the title
let window = ApplicationWindow::builder()
.application(app)
.title("GTK Counter App")
.child(&gtk_box)
.build();
// Present window
window.present();
}

29
src/notification.rs Normal file
View File

@ -0,0 +1,29 @@
use gtk4 as gtk;
use gtk::glib;
use gtk::prelude::*;
use gtk::gio::{Notification, NotificationPriority};
const APP_ID: &str = "de.privacy1st.pdt";
fn main() -> glib::ExitCode {
let app = gtk::Application::builder().application_id(APP_ID).build();
app.connect_activate(move |app| build_ui(app));
app.run()
}
fn build_ui(app: &gtk::Application) {
let window = gtk::ApplicationWindow::builder()
.application(app)
.title("System Notification")
.default_width(350)
.default_height(70)
.build();
window.present();
// TODO: Notification does not show up
let notification = Notification::new("Alert");
notification.set_body(Some("Time is over"));
notification.set_priority(NotificationPriority::Urgent);
let notification_id = "pdt.timeout";
app.send_notification(Some(notification_id), &notification);
}