window_event.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //! This example demonstrates how to handle window events and change window properties.
  2. //!
  3. //! We're able to do things like:
  4. //! - implement window dragging
  5. //! - toggle fullscreen
  6. //! - toggle always on top
  7. //! - toggle window decorations
  8. //! - change the window title
  9. //!
  10. //! The entire featuresuite of wry and tao is available to you
  11. use dioxus::desktop::{window, Config, WindowBuilder};
  12. use dioxus::prelude::*;
  13. fn main() {
  14. dioxus::LaunchBuilder::desktop()
  15. .with_cfg(
  16. Config::new().with_window(
  17. WindowBuilder::new()
  18. .with_title("Borderless Window")
  19. .with_decorations(false),
  20. ),
  21. )
  22. .launch(app)
  23. }
  24. fn app() -> Element {
  25. rsx!(
  26. document::Link { href: "https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel: "stylesheet" }
  27. Header {}
  28. div { class: "container mx-auto",
  29. div { class: "grid grid-cols-5",
  30. SetOnTop {}
  31. SetDecorations {}
  32. SetTitle {}
  33. }
  34. }
  35. )
  36. }
  37. #[component]
  38. fn Header() -> Element {
  39. let mut fullscreen = use_signal(|| false);
  40. rsx! {
  41. header { class: "text-gray-400 bg-gray-900 body-font", onmousedown: move |_| window().drag(),
  42. div { class: "container mx-auto flex flex-wrap p-5 flex-col md:flex-row items-center",
  43. a { class: "flex title-font font-medium items-center text-white mb-4 md:mb-0",
  44. span { class: "ml-3 text-xl", "Dioxus" }
  45. }
  46. nav { class: "md:ml-auto flex flex-wrap items-center text-base justify-center" }
  47. // Set the window to minimized
  48. button {
  49. class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0",
  50. onmousedown: |evt| evt.stop_propagation(),
  51. onclick: move |_| window().set_minimized(true),
  52. "Minimize"
  53. }
  54. // Toggle fullscreen
  55. button {
  56. class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0",
  57. onmousedown: |evt| evt.stop_propagation(),
  58. onclick: move |_| {
  59. window().set_fullscreen(!fullscreen());
  60. window().set_resizable(fullscreen());
  61. fullscreen.toggle();
  62. },
  63. "Fullscreen"
  64. }
  65. // Close the window
  66. // If the window is the last window open, the app will close, if you configured the close behavior to do so
  67. button {
  68. class: "inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0",
  69. onmousedown: |evt| evt.stop_propagation(),
  70. onclick: move |_| window().close(),
  71. "Close"
  72. }
  73. }
  74. }
  75. }
  76. }
  77. #[component]
  78. fn SetOnTop() -> Element {
  79. let mut always_on_top = use_signal(|| false);
  80. rsx! {
  81. div {
  82. button {
  83. class: "inline-flex items-center text-white bg-green-500 border-0 py-1 px-3 hover:bg-green-700 rounded",
  84. onmousedown: |evt| evt.stop_propagation(),
  85. onclick: move |_| {
  86. window().set_always_on_top(!always_on_top());
  87. always_on_top.toggle();
  88. },
  89. "Always On Top"
  90. }
  91. }
  92. }
  93. }
  94. #[component]
  95. fn SetDecorations() -> Element {
  96. let mut decorations = use_signal(|| false);
  97. rsx! {
  98. div {
  99. button {
  100. class: "inline-flex items-center text-white bg-blue-500 border-0 py-1 px-3 hover:bg-green-700 rounded",
  101. onmousedown: |evt| evt.stop_propagation(),
  102. onclick: move |_| {
  103. window().set_decorations(!decorations());
  104. decorations.toggle();
  105. },
  106. "Set Decorations"
  107. }
  108. }
  109. }
  110. }
  111. #[component]
  112. fn SetTitle() -> Element {
  113. rsx! {
  114. div {
  115. button {
  116. class: "inline-flex items-center text-white bg-blue-500 border-0 py-1 px-3 hover:bg-green-700 rounded",
  117. onmousedown: |evt| evt.stop_propagation(),
  118. onclick: move |_| window().set_title("Dioxus Application"),
  119. "Change Title"
  120. }
  121. }
  122. }
  123. }