This commit is contained in:
2026-07-28 15:09:33 -04:00
parent 7d5f2023d0
commit c8778a282e
5 changed files with 43 additions and 6 deletions
+9 -1
View File
@@ -100,6 +100,7 @@ pub(crate) struct Publisher {
abbreviated_datatypes: Vec<String>, abbreviated_datatypes: Vec<String>,
window_id: window::Id, window_id: window::Id,
url_input: String, url_input: String,
url_input_valid: bool,
navigator: Navigator<Url>, navigator: Navigator<Url>,
document: RdfSource<KeyedDataset<RowState>>, document: RdfSource<KeyedDataset<RowState>>,
hovered_row: Option<QuadKey>, hovered_row: Option<QuadKey>,
@@ -157,6 +158,7 @@ impl Publisher {
abbreviated_datatypes, abbreviated_datatypes,
window_id: id, window_id: id,
url_input: starting_url.to_string(), url_input: starting_url.to_string(),
url_input_valid: true,
navigator, navigator,
document, document,
hovered_row: None, hovered_row: None,
@@ -268,6 +270,11 @@ impl Publisher {
} }
} }
Message::URLInputChanged(value) => { Message::URLInputChanged(value) => {
if Url::parse(&value).is_ok() {
self.url_input_valid = true;
} else {
self.url_input_valid = false;
}
self.url_input = value; self.url_input = value;
} }
Message::URLInputSubmitted => { Message::URLInputSubmitted => {
@@ -868,7 +875,8 @@ impl Publisher {
let address_input = iri_input(&self.curie_helper, "URL", None, &self.url_input) let address_input = iri_input(&self.curie_helper, "URL", None, &self.url_input)
.on_input(Message::URLInputChanged) .on_input(Message::URLInputChanged)
.on_submit(Message::URLInputSubmitted) .on_submit(Message::URLInputSubmitted)
.on_control_click(Message::OpenQueryWindow(SearchResultClickAction::URLInput)); .on_control_click(Message::OpenQueryWindow(SearchResultClickAction::URLInput))
.style(crate::theme::styles::text_input::required(!self.url_input_valid));
let mut rows: Vec<Element<Message>> = vec![]; let mut rows: Vec<Element<Message>> = vec![];
rows = self rows = self
+1
View File
@@ -4,6 +4,7 @@ mod rdf;
mod windows; mod windows;
mod widget; mod widget;
mod navigator; mod navigator;
mod theme;
use crate::app::Publisher; use crate::app::Publisher;
use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::layer::SubscriberExt;
+1
View File
@@ -0,0 +1 @@
pub mod styles;
+19
View File
@@ -0,0 +1,19 @@
pub mod text_input {
use iced::{color, Theme};
use iced::widget::text_input;
use iced::widget::text_input::{Status, Style};
pub fn required(invalid: bool) -> impl Fn(&Theme, Status) -> Style {
move |theme: &Theme, status| {
let danger = color!(255, 88, 97);
let default = text_input::default(theme, status);
let border = if invalid && matches!(status, Status::Focused { .. }) {
default.border.color(danger)
} else {
default.border
};
Style { border, ..default }
}
}
}
+13 -5
View File
@@ -1,12 +1,11 @@
use iced::{alignment, keyboard, widget, Element, Event, Length, Rectangle, Size}; use iced::{alignment, keyboard, widget, Element, Event, Length, Rectangle, Size, Theme, Background, Border};
use iced::advanced::{mouse, text, Shell}; use iced::advanced::{mouse, text, Shell, renderer};
use iced::advanced::layout::{Limits, Node}; use iced::advanced::layout::{Limits, Node};
use iced::advanced::renderer::Style;
use iced::advanced::{Layout, Widget}; use iced::advanced::{Layout, Widget};
use iced::advanced::widget::{tree, Tree}; use iced::advanced::widget::{tree, Tree};
use iced::clipboard::Content; use iced::clipboard::Content;
use iced::mouse::{Cursor, Interaction}; use iced::mouse::{Cursor, Interaction};
use iced::widget::text_input::Catalog; use iced::widget::text_input::{Catalog, Status, Style, StyleFn};
use crate::rdf::curie::CurieHelper; use crate::rdf::curie::CurieHelper;
pub struct State { pub struct State {
@@ -79,6 +78,15 @@ where
self.text_input = self.text_input.on_submit(message); self.text_input = self.text_input.on_submit(message);
self self
} }
#[must_use]
pub fn style(mut self, style: impl Fn(&Theme, Status) -> Style + 'a) -> Self
where
Theme::Class<'a>: From<StyleFn<'a, Theme>>,
{
self.text_input = self.text_input.style(style);
self
}
} }
impl<'a, Message, Theme, Renderer> From<IriInput<'a, Message, Theme, Renderer>> impl<'a, Message, Theme, Renderer> From<IriInput<'a, Message, Theme, Renderer>>
@@ -116,7 +124,7 @@ where
Widget::layout(&mut self.text_input, &mut tree.children[0], renderer, limits) Widget::layout(&mut self.text_input, &mut tree.children[0], renderer, limits)
} }
fn draw(&self, tree: &Tree, renderer: &mut Renderer, theme: &Theme, style: &Style, layout: Layout<'_>, cursor: Cursor, viewport: &Rectangle) { fn draw(&self, tree: &Tree, renderer: &mut Renderer, theme: &Theme, style: &renderer::Style, layout: Layout<'_>, cursor: Cursor, viewport: &Rectangle) {
Widget::draw(&self.text_input, &tree.children[0], renderer, theme, style, layout, cursor, viewport) Widget::draw(&self.text_input, &tree.children[0], renderer, theme, style, layout, cursor, viewport)
} }