add examples
This commit is contained in:
parent
3f4d41958e
commit
3600ffd1a5
BIN
examples/clipboard/asset.png
Normal file
BIN
examples/clipboard/asset.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
172
src/clipboard.rs
Normal file
172
src/clipboard.rs
Normal 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: >k::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(©_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(©_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
45
src/clock.rs
Normal 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: >k::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
78
src/counter.rs
Normal 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(>k_box)
|
||||
.build();
|
||||
|
||||
// Present window
|
||||
window.present();
|
||||
}
|
29
src/notification.rs
Normal file
29
src/notification.rs
Normal 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: >k::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), ¬ification);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user