mirror of
https://github.com/eliasstepanik/imgui-rs.git
synced 2026-01-23 19:38:27 +00:00
Autoresizing window and friends
This commit is contained in:
parent
8e7ae0327c
commit
ca1da00734
@ -30,6 +30,7 @@ struct State {
|
|||||||
no_collapse: bool,
|
no_collapse: bool,
|
||||||
no_menu: bool,
|
no_menu: bool,
|
||||||
bg_alpha: f32,
|
bg_alpha: f32,
|
||||||
|
auto_resize_state: AutoResizeState,
|
||||||
file_menu: FileMenuState
|
file_menu: FileMenuState
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,6 +56,7 @@ impl Default for State {
|
|||||||
no_collapse: false,
|
no_collapse: false,
|
||||||
no_menu: false,
|
no_menu: false,
|
||||||
bg_alpha: 0.65,
|
bg_alpha: 0.65,
|
||||||
|
auto_resize_state: Default::default(),
|
||||||
file_menu: Default::default()
|
file_menu: Default::default()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -72,6 +74,18 @@ impl Default for FileMenuState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct AutoResizeState {
|
||||||
|
lines: usize
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for AutoResizeState {
|
||||||
|
fn default() -> Self {
|
||||||
|
AutoResizeState {
|
||||||
|
lines: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut state = State {
|
let mut state = State {
|
||||||
.. Default::default()
|
.. Default::default()
|
||||||
@ -110,6 +124,9 @@ fn show_test_window<'a>(frame: &Frame<'a>, state: &mut State) -> bool {
|
|||||||
state.show_app_metrics = frame.show_metrics_window();
|
state.show_app_metrics = frame.show_metrics_window();
|
||||||
}
|
}
|
||||||
if state.show_app_main_menu_bar { show_example_app_main_menu_bar(frame, state) }
|
if state.show_app_main_menu_bar { show_example_app_main_menu_bar(frame, state) }
|
||||||
|
if state.show_app_auto_resize {
|
||||||
|
state.show_app_auto_resize = show_example_app_auto_resize(frame, &mut state.auto_resize_state);
|
||||||
|
}
|
||||||
if state.show_app_fixed_overlay {
|
if state.show_app_fixed_overlay {
|
||||||
state.show_app_fixed_overlay = show_example_app_fixed_overlay(frame);
|
state.show_app_fixed_overlay = show_example_app_fixed_overlay(frame);
|
||||||
}
|
}
|
||||||
@ -243,6 +260,25 @@ fn show_example_menu_file<'a>(frame: &Frame<'a>, state: &mut FileMenuState) {
|
|||||||
if frame.menu_item(im_str!("Quit")).shortcut(im_str!("Alt+F4")).build() { }
|
if frame.menu_item(im_str!("Quit")).shortcut(im_str!("Alt+F4")).build() { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn show_example_app_auto_resize<'a>(frame: &Frame<'a>, state: &mut AutoResizeState) -> bool {
|
||||||
|
frame.window()
|
||||||
|
.name(im_str!("Example: Auto-resizing window"))
|
||||||
|
.closable(true)
|
||||||
|
.always_auto_resize(true)
|
||||||
|
.build(|| {
|
||||||
|
frame.text(im_str!("Window will resize every-frame to the size of its content.
|
||||||
|
Note that you probably don't want to query the window size to
|
||||||
|
output your content because that would create a feedback loop."));
|
||||||
|
if let Some(lines) = frame.slider_i32(im_str!("Number of lines"),
|
||||||
|
state.lines as i32, 1, 20).build() {
|
||||||
|
state.lines = lines as usize;
|
||||||
|
}
|
||||||
|
for i in 0 .. state.lines {
|
||||||
|
frame.text(im_str!("{:2$}This is line {}", "", i, i * 4));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn show_example_app_fixed_overlay<'a>(frame: &Frame<'a>) -> bool {
|
fn show_example_app_fixed_overlay<'a>(frame: &Frame<'a>) -> bool {
|
||||||
frame.window()
|
frame.window()
|
||||||
.name(im_str!("Example: Fixed Overlay"))
|
.name(im_str!("Example: Fixed Overlay"))
|
||||||
|
|||||||
10
src/lib.rs
10
src/lib.rs
@ -31,11 +31,13 @@ pub use ffi::{
|
|||||||
ImVec2, ImVec4
|
ImVec2, ImVec4
|
||||||
};
|
};
|
||||||
pub use menus::{Menu, MenuItem};
|
pub use menus::{Menu, MenuItem};
|
||||||
|
pub use sliders::{SliderInt};
|
||||||
pub use widgets::{CollapsingHeader};
|
pub use widgets::{CollapsingHeader};
|
||||||
pub use window::{Window};
|
pub use window::{Window};
|
||||||
|
|
||||||
pub mod ffi;
|
pub mod ffi;
|
||||||
mod menus;
|
mod menus;
|
||||||
|
mod sliders;
|
||||||
mod widgets;
|
mod widgets;
|
||||||
mod window;
|
mod window;
|
||||||
|
|
||||||
@ -276,6 +278,14 @@ impl<'fr> Frame<'fr> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Widgets: Sliders
|
||||||
|
impl<'fr> Frame<'fr> {
|
||||||
|
pub fn slider_i32<'p>(&self, label: ImStr<'p>,
|
||||||
|
value: i32, min: i32, max: i32) -> SliderInt<'fr, 'p> {
|
||||||
|
SliderInt::new(label, value, min, max)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Widgets: Menus
|
// Widgets: Menus
|
||||||
impl<'fr> Frame<'fr> {
|
impl<'fr> Frame<'fr> {
|
||||||
pub fn main_menu_bar<F>(&self, f: F) where F: FnOnce() {
|
pub fn main_menu_bar<F>(&self, f: F) where F: FnOnce() {
|
||||||
|
|||||||
48
src/sliders.rs
Normal file
48
src/sliders.rs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
use libc::c_int;
|
||||||
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
|
use super::ffi;
|
||||||
|
use super::{Frame, ImStr};
|
||||||
|
|
||||||
|
// TODO: Consider using Range, even though it is half-open
|
||||||
|
|
||||||
|
pub struct SliderInt<'fr, 'p> {
|
||||||
|
label: ImStr<'p>,
|
||||||
|
value: i32,
|
||||||
|
min: i32,
|
||||||
|
max: i32,
|
||||||
|
display_format: ImStr<'p>,
|
||||||
|
_phantom: PhantomData<&'fr Frame<'fr>>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'fr, 'p> SliderInt<'fr, 'p> {
|
||||||
|
pub fn new(label: ImStr<'p>, value: i32, min: i32, max: i32) -> Self {
|
||||||
|
SliderInt {
|
||||||
|
label: label,
|
||||||
|
value: value,
|
||||||
|
min: min,
|
||||||
|
max: max,
|
||||||
|
display_format: unsafe { ImStr::from_bytes(b"%.0f") },
|
||||||
|
_phantom: PhantomData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
pub fn display_format(self, display_format: ImStr<'p>) -> Self {
|
||||||
|
SliderInt {
|
||||||
|
display_format: display_format,
|
||||||
|
.. self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn build(self) -> Option<i32> {
|
||||||
|
let mut value = self.value as c_int;
|
||||||
|
let changed = unsafe {
|
||||||
|
ffi::igSliderInt(self.label.as_ptr(),
|
||||||
|
&mut value,
|
||||||
|
self.min as c_int,
|
||||||
|
self.max as c_int,
|
||||||
|
self.display_format.as_ptr()
|
||||||
|
)
|
||||||
|
};
|
||||||
|
if changed { Some(value as i32) } else { None }
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user