Skip to content

Instantly share code, notes, and snippets.

@Fuhrmann
Last active August 20, 2024 00:33
Show Gist options
  • Save Fuhrmann/4f9fbd61d945c822c6195f87605d4019 to your computer and use it in GitHub Desktop.
Save Fuhrmann/4f9fbd61d945c822c6195f87605d4019 to your computer and use it in GitHub Desktop.
relm4 examples
fn log_level_deser<'de, D>(deserializer: D) -> Result<LogLevel, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
match s.to_lowercase().as_str() {
"debug" => Ok(LogLevel::Debug),
"info" => Ok(LogLevel::Info),
"warn" => Ok(LogLevel::Warn),
"error" => Ok(LogLevel::Error),
"trace" => Ok(LogLevel::Trace),
_ => Err(serde::de::Error::custom(
"expected one of DEBUG, INFO, WARN, ERROR, TRACE",
)),
}
}
// Than in the desired field, use:
#[serde(deserialize_with = "log_level_deser")]
let listener = gtk::EventControllerScroll::builder()
.flags(gtk::EventControllerScrollFlags::HORIZONTAL)
.name("workspaces-scroll")
.build();
listener.connect_scroll(|c, _, _| {
let event = c
.current_event()
.unwrap()
.downcast::<relm4::gtk::gdk::ScrollEvent>()
.unwrap();
let direction = match event.direction() {
gtk::gdk::ScrollDirection::Up => {
println!("next workspace");
}
gtk::gdk::ScrollDirection::Down => {
println!("previous workspace");
}
_ => return relm4::gtk::glib::Propagation::Stop,
};
//Hypr::move_to_workspace(Hypr::get_current_workspace_id() + 1);
relm4::gtk::glib::Propagation::Stop
});
pub struct WindowActionGroup;
impl relm4::actions::ActionGroupName for WindowActionGroup {
const NAME: &'static str = "win";
}
relm4::new_stateful_action!(pub CopyText, WindowActionGroup, "copy-text", i32, ());
menu! {
author_menu: {
"Copy pubkey as hex" => CopyText(self.workspace.id),
"Copy pubkey as bech32" => CopyText(self.workspace.id),
},
note_menu: {
section! {
"Copy event ID as hex" => CopyText(self.workspace.id),
"Copy event ID as bech32" => CopyText(self.workspace.id)
}
}
}
view! {
#[name(button)]
gtk::Button {
#[watch]
set_class_active: ("focused", self.workspace.has_focus),
set_can_focus: false,
connect_clicked => WorkspaceItemWidgetInput::WorkspaceClicked,
add_controller = gtk::GestureClick {
set_button: relm4::gtk::gdk::BUTTON_SECONDARY,
connect_released[sender, button] => move |controller, _, x, y| {
let popover = gtk::PopoverMenu::builder()
.position(gtk::PositionType::Bottom)
.autohide(true)
.menu_model(&author_menu)
.cascade_popdown(true)
.receives_default(true)
.has_arrow(false)
.focus_on_click(true)
.focusable(true)
// .hexpand(true)
//.pointing_to(&gtk::gdk::Rectangle::new(x as i32, y as i32, 1, 1))
.build();
popover.set_parent(&button);
popover.popup();
sender.input(WorkspaceItemWidgetInput::WorkspaceRightClicked);
controller.set_state(relm4::gtk::EventSequenceState::Claimed);
}
},
gtk::Label {
set_label: &self.workspace.name,
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment