mirror of
https://github.com/obsqrbtz/egui_knob.git
synced 2026-04-09 04:29:10 +03:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 76670f416f | |||
| 0aec31e81d | |||
| 81bc2295fb | |||
| 6a49e6f961 |
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -896,7 +896,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "egui_knob"
|
name = "egui_knob"
|
||||||
version = "0.1.3"
|
version = "0.1.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"eframe",
|
"eframe",
|
||||||
"egui",
|
"egui",
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "egui_knob"
|
name = "egui_knob"
|
||||||
version = "0.1.3"
|
version = "0.1.4"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "A simple knob widget for egui"
|
description = "A simple knob widget for egui"
|
||||||
homepage = "https://github.com/obsqrbtz/egui_knob"
|
homepage = "https://github.com/obsqrbtz/egui_knob"
|
||||||
repository = "https://github.com/obsqrbtz/egui_knob"
|
repository = "https://github.com/obsqrbtz/egui_knob"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license-file = "LICENSE"
|
license = "MIT"
|
||||||
keywords = ["egui", "ui", "widget", "knob", "range"]
|
keywords = ["egui", "ui", "widget", "knob", "range"]
|
||||||
categories = ["gui"]
|
categories = ["gui"]
|
||||||
|
|
||||||
|
|||||||
29
src/lib.rs
29
src/lib.rs
@@ -81,7 +81,7 @@ impl<'a> Knob<'a> {
|
|||||||
|
|
||||||
impl Widget for Knob<'_> {
|
impl Widget for Knob<'_> {
|
||||||
fn ui(self, ui: &mut Ui) -> Response {
|
fn ui(self, ui: &mut Ui) -> Response {
|
||||||
let desired_size = Vec2::splat(self.size);
|
let knob_size = Vec2::splat(self.size);
|
||||||
|
|
||||||
let label_size = if let Some(label) = &self.label {
|
let label_size = if let Some(label) = &self.label {
|
||||||
let font_id = egui::FontId::proportional(self.font_size);
|
let font_id = egui::FontId::proportional(self.font_size);
|
||||||
@@ -97,8 +97,17 @@ impl Widget for Knob<'_> {
|
|||||||
Vec2::ZERO
|
Vec2::ZERO
|
||||||
};
|
};
|
||||||
|
|
||||||
// Adjust desired size to include label space
|
let label_padding = 12.0;
|
||||||
let adjusted_size = Vec2::new(desired_size.x, desired_size.y + label_size.y + 12.0); // 12.0 is an offset for spacing
|
|
||||||
|
let adjusted_size = match self.label_position {
|
||||||
|
LabelPosition::Top | LabelPosition::Bottom => {
|
||||||
|
Vec2::new(knob_size.x, knob_size.y + label_size.y + label_padding)
|
||||||
|
}
|
||||||
|
LabelPosition::Left | LabelPosition::Right => {
|
||||||
|
Vec2::new(knob_size.x + label_size.x + label_padding, knob_size.y)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let (rect, response) = ui.allocate_exact_size(adjusted_size, Sense::drag());
|
let (rect, response) = ui.allocate_exact_size(adjusted_size, Sense::drag());
|
||||||
|
|
||||||
if response.dragged() {
|
if response.dragged() {
|
||||||
@@ -110,7 +119,7 @@ impl Widget for Knob<'_> {
|
|||||||
|
|
||||||
let painter = ui.painter();
|
let painter = ui.painter();
|
||||||
let center = rect.center();
|
let center = rect.center();
|
||||||
let radius = rect.width() / 2.0;
|
let radius = knob_size.x / 2.0;
|
||||||
let angle = (*self.value - self.min) / (self.max - self.min) * std::f32::consts::PI * 1.5
|
let angle = (*self.value - self.min) / (self.max - self.min) * std::f32::consts::PI * 1.5
|
||||||
- std::f32::consts::PI;
|
- std::f32::consts::PI;
|
||||||
|
|
||||||
@@ -147,19 +156,21 @@ impl Widget for Knob<'_> {
|
|||||||
)
|
)
|
||||||
.size();
|
.size();
|
||||||
|
|
||||||
let label_offset = 12.0;
|
let label_offset = label_padding;
|
||||||
let label_pos = match self.label_position {
|
let label_pos = match self.label_position {
|
||||||
LabelPosition::Top => {
|
LabelPosition::Top => {
|
||||||
center + Vec2::new(-text_size.x / 2.0, -radius - label_offset - text_size.y)
|
rect.center()
|
||||||
|
+ Vec2::new(-text_size.x / 2.0, -radius - label_offset - text_size.y)
|
||||||
}
|
}
|
||||||
LabelPosition::Bottom => {
|
LabelPosition::Bottom => {
|
||||||
center + Vec2::new(-text_size.x / 2.0, radius + label_offset)
|
rect.center() + Vec2::new(-text_size.x / 2.0, radius + label_offset)
|
||||||
}
|
}
|
||||||
LabelPosition::Left => {
|
LabelPosition::Left => {
|
||||||
center + Vec2::new(-radius - label_offset - text_size.x, -text_size.y / 2.0)
|
rect.center()
|
||||||
|
+ Vec2::new(-radius - label_offset - text_size.x, -text_size.y / 2.0)
|
||||||
}
|
}
|
||||||
LabelPosition::Right => {
|
LabelPosition::Right => {
|
||||||
center + Vec2::new(radius + label_offset, -text_size.y / 2.0)
|
rect.center() + Vec2::new(radius + label_offset, -text_size.y / 2.0)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user