.
This commit is contained in:
+9
-1
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
pub mod styles;
|
||||||
@@ -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 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user