work
This commit is contained in:
2
iris
2
iris
Submodule iris updated: 796bc41752...a592318a6f
39
src/bin/client/data.rs
Normal file
39
src/bin/client/data.rs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
use openworm::rsc::{DataDir, DataRsc};
|
||||||
|
|
||||||
|
pub struct ClientData {
|
||||||
|
pub dir: DataDir,
|
||||||
|
pub cache: Cache,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ClientData {
|
||||||
|
pub fn load() -> Self {
|
||||||
|
let dir = DataDir::default();
|
||||||
|
Self {
|
||||||
|
cache: dir.load(),
|
||||||
|
dir,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn save(&self) {
|
||||||
|
self.dir.save(&self.cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn device_key(&self) -> {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Default, bincode::Encode, bincode::Decode)]
|
||||||
|
pub struct Cache {
|
||||||
|
pub ip: String,
|
||||||
|
pub username: String,
|
||||||
|
/// TODO: not store this as plain string?
|
||||||
|
/// need to figure out crypto stuff
|
||||||
|
/// or store session token
|
||||||
|
pub password: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DataRsc for Cache {
|
||||||
|
fn path() -> &'static str {
|
||||||
|
"client_data"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,25 +1,21 @@
|
|||||||
#![windows_subsystem = "windows"]
|
#![windows_subsystem = "windows"]
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
data::ClientData,
|
||||||
net::{NetHandle, NetSender},
|
net::{NetHandle, NetSender},
|
||||||
rsc::{CLIENT_DATA, ClientData},
|
|
||||||
state::{ClientState, LoggedIn, Login},
|
state::{ClientState, LoggedIn, Login},
|
||||||
ui::*,
|
|
||||||
};
|
};
|
||||||
use iris::prelude::*;
|
use iris::prelude::*;
|
||||||
use openworm::{
|
use openworm::net::{ClientMsg, ServerMsg, install_crypto_provider};
|
||||||
net::{ClientMsg, ServerMsg, install_crypto_provider},
|
|
||||||
rsc::DataDir,
|
|
||||||
};
|
|
||||||
use winit::{
|
use winit::{
|
||||||
event::{ElementState, MouseButton, WindowEvent},
|
event::{ElementState, MouseButton, WindowEvent},
|
||||||
window::WindowAttributes,
|
window::WindowAttributes,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod account;
|
mod account;
|
||||||
|
mod data;
|
||||||
mod debug;
|
mod debug;
|
||||||
mod net;
|
mod net;
|
||||||
mod rsc;
|
|
||||||
mod state;
|
mod state;
|
||||||
mod ui;
|
mod ui;
|
||||||
|
|
||||||
@@ -31,7 +27,6 @@ fn main() {
|
|||||||
#[derive(DefaultUiState)]
|
#[derive(DefaultUiState)]
|
||||||
pub struct Client {
|
pub struct Client {
|
||||||
ui_state: DefaultUiState,
|
ui_state: DefaultUiState,
|
||||||
dir: DataDir,
|
|
||||||
data: ClientData,
|
data: ClientData,
|
||||||
state: ClientState,
|
state: ClientState,
|
||||||
main_ui: WeakWidget<WidgetPtr>,
|
main_ui: WeakWidget<WidgetPtr>,
|
||||||
@@ -55,7 +50,6 @@ impl DefaultAppState for Client {
|
|||||||
rsc: &mut DefaultRsc<Self>,
|
rsc: &mut DefaultRsc<Self>,
|
||||||
proxy: Proxy<Self::Event>,
|
proxy: Proxy<Self::Event>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let dir = DataDir::default();
|
|
||||||
let notif = WidgetPtr::default().add(rsc);
|
let notif = WidgetPtr::default().add(rsc);
|
||||||
let main_ui = WidgetPtr::default().add(rsc);
|
let main_ui = WidgetPtr::default().add(rsc);
|
||||||
let bg = (
|
let bg = (
|
||||||
@@ -72,13 +66,12 @@ impl DefaultAppState for Client {
|
|||||||
.stack()
|
.stack()
|
||||||
.set_root(rsc, &mut ui_state);
|
.set_root(rsc, &mut ui_state);
|
||||||
|
|
||||||
start_ui(rsc).set_ptr(main_ui, rsc);
|
ui::start(rsc).set_ptr(main_ui, rsc);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
ui_state,
|
ui_state,
|
||||||
data: dir.load(CLIENT_DATA),
|
data: ClientData::load(),
|
||||||
state: Default::default(),
|
state: Default::default(),
|
||||||
dir,
|
|
||||||
main_ui,
|
main_ui,
|
||||||
notif,
|
notif,
|
||||||
proxy,
|
proxy,
|
||||||
@@ -110,7 +103,7 @@ impl DefaultAppState for Client {
|
|||||||
if let ClientState::LoggedIn(state) = &mut self.state
|
if let ClientState::LoggedIn(state) = &mut self.state
|
||||||
&& let Some(msg_area) = state.channel
|
&& let Some(msg_area) = state.channel
|
||||||
{
|
{
|
||||||
let msg = msg_widget(&msg.user, &msg.content).add_strong(rsc);
|
let msg = ui::msg_widget(&msg.user, &msg.content).add_strong(rsc);
|
||||||
rsc[msg_area].children.push(msg);
|
rsc[msg_area].children.push(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -120,7 +113,7 @@ impl DefaultAppState for Client {
|
|||||||
{
|
{
|
||||||
for msg in msgs {
|
for msg in msgs {
|
||||||
state.msgs.push(msg.clone());
|
state.msgs.push(msg.clone());
|
||||||
let msg = msg_widget(&msg.user, &msg.content).add_strong(rsc);
|
let msg = ui::msg_widget(&msg.user, &msg.content).add_strong(rsc);
|
||||||
rsc[msg_area].children.push(msg);
|
rsc[msg_area].children.push(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,22 +129,22 @@ impl DefaultAppState for Client {
|
|||||||
msgs: Vec::new(),
|
msgs: Vec::new(),
|
||||||
username,
|
username,
|
||||||
});
|
});
|
||||||
main_view(rsc).set_ptr(self.main_ui, rsc);
|
ui::main_view(rsc).set_ptr(self.main_ui, rsc);
|
||||||
}
|
}
|
||||||
ServerMsg::Error(error) => {
|
ServerMsg::Error(error) => {
|
||||||
let msg = format!("{error:?}");
|
let msg = format!("{error:?}");
|
||||||
rsc[self.notif].inner = Some(werror(&msg, rsc));
|
rsc[self.notif].inner = Some(ui::werror(&msg, rsc));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ClientEvent::Err(msg) => {
|
ClientEvent::Err(msg) => {
|
||||||
rsc[self.notif].inner = Some(werror(&msg, rsc));
|
rsc[self.notif].inner = Some(ui::werror(&msg, rsc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exit(&mut self, _rsc: &mut DefaultRsc<Self>, _render: &mut UiRenderState) {
|
fn exit(&mut self, _rsc: &mut DefaultRsc<Self>, _render: &mut UiRenderState) {
|
||||||
self.state.exit();
|
self.state.exit();
|
||||||
self.dir.save(CLIENT_DATA, &self.data);
|
self.data.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn window_event(
|
fn window_event(
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
pub const CLIENT_DATA: &str = "client_data";
|
|
||||||
|
|
||||||
#[derive(Debug, Default, bincode::Encode, bincode::Decode)]
|
|
||||||
pub struct ClientData {
|
|
||||||
pub ip: String,
|
|
||||||
pub username: String,
|
|
||||||
/// TODO: not store this as plain string?
|
|
||||||
/// need to figure out crypto stuff
|
|
||||||
/// or store session token
|
|
||||||
pub password: String,
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
pub fn start_ui(rsc: &mut Rsc) -> WeakWidget {
|
pub fn start(rsc: &mut Rsc) -> WeakWidget {
|
||||||
let mut accounts = Span::empty(Dir::DOWN);
|
let mut accounts = Span::empty(Dir::DOWN);
|
||||||
|
|
||||||
accounts.push(
|
accounts.push(
|
||||||
@@ -14,15 +14,13 @@ pub fn start_ui(rsc: &mut Rsc) -> WeakWidget {
|
|||||||
|
|
||||||
let connect = Button::submit("connect", rsc);
|
let connect = Button::submit("connect", rsc);
|
||||||
let create = Button::submit("create", rsc);
|
let create = Button::submit("create", rsc);
|
||||||
rsc.events.register(connect.root(), Submit, move |_, rsc| {
|
rsc.events.register(connect, Submit, move |_, rsc| {
|
||||||
connect.disable(rsc);
|
connect.disable(rsc);
|
||||||
create.disable(rsc);
|
create.disable(rsc);
|
||||||
});
|
});
|
||||||
|
|
||||||
rsc.events.register(create.root(), Submit, move |ctx, rsc| {
|
rsc.events.register(create, Submit, move |ctx, rsc| {
|
||||||
connect.disable(rsc);
|
create_account(rsc).set_ptr(ctx.state.main_ui, rsc);
|
||||||
create.disable(rsc);
|
|
||||||
create_ui(rsc).set_ptr(ctx.state.main_ui, rsc);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
(
|
(
|
||||||
@@ -36,8 +34,27 @@ pub fn start_ui(rsc: &mut Rsc) -> WeakWidget {
|
|||||||
.add(rsc)
|
.add(rsc)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_ui(rsc: &mut Rsc) -> WeakWidget {
|
pub fn create_account(rsc: &mut Rsc) -> WeakWidget {
|
||||||
wtext("hi").add(rsc)
|
let url = field("", "server", rsc);
|
||||||
|
let username = field("", "username", rsc);
|
||||||
|
let password = field("", "password", rsc);
|
||||||
|
|
||||||
|
let create = Button::submit("create", rsc);
|
||||||
|
rsc.events.register(create, Submit, move |ctx, rsc| {
|
||||||
|
ctx.state.data
|
||||||
|
});
|
||||||
|
|
||||||
|
(
|
||||||
|
wtext("Create Account").text_align(Align::CENTER).size(30),
|
||||||
|
field_box(url, rsc),
|
||||||
|
field_box(username, rsc),
|
||||||
|
field_box(password, rsc),
|
||||||
|
create,
|
||||||
|
)
|
||||||
|
.span(Dir::DOWN)
|
||||||
|
.gap(15)
|
||||||
|
.modal(400)
|
||||||
|
.add(rsc)
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn connect_screen(client: &mut Client, ui: &mut Ui, state: &UiState) -> WeakWidget {
|
// pub fn connect_screen(client: &mut Client, ui: &mut Ui, state: &UiState) -> WeakWidget {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ pub fn msg_panel(rsc: &mut Rsc) -> WeakWidget {
|
|||||||
.editable(EditMode::MultiLine)
|
.editable(EditMode::MultiLine)
|
||||||
.size(SIZE)
|
.size(SIZE)
|
||||||
.wrap(true)
|
.wrap(true)
|
||||||
.hint(hint("send message"))
|
.hint(hint_text("send message"))
|
||||||
.add(rsc);
|
.add(rsc);
|
||||||
|
|
||||||
let msg_area = msg_area.add(rsc);
|
let msg_area = msg_area.add(rsc);
|
||||||
|
|||||||
@@ -8,15 +8,15 @@ pub fn werror(msg: &str, rsc: &mut Rsc) -> StrongWidget {
|
|||||||
.add_strong(rsc)
|
.add_strong(rsc)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hint(msg: impl Into<String>) -> TextBuilder<Rsc> {
|
pub fn hint_text(msg: impl Into<String>) -> TextBuilder<Rsc> {
|
||||||
wtext(msg).size(20).color(Color::GRAY)
|
wtext(msg).size(20).color(Color::GRAY)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn field_widget(name: &str, hint_text: &str, rsc: &mut Rsc) -> WeakWidget<TextEdit> {
|
pub fn field(default: &str, hint: &str, rsc: &mut Rsc) -> WeakWidget<TextEdit> {
|
||||||
wtext(name)
|
wtext(default)
|
||||||
.editable(EditMode::SingleLine)
|
.editable(EditMode::SingleLine)
|
||||||
.size(20)
|
.size(20)
|
||||||
.hint(hint(hint_text))
|
.hint(hint_text(hint))
|
||||||
.add(rsc)
|
.add(rsc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
12
src/rsc.rs
12
src/rsc.rs
@@ -20,13 +20,17 @@ impl Default for DataDir {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait DataRsc: bincode::Encode + bincode::Decode<()> + Default {
|
||||||
|
fn path() -> &'static str;
|
||||||
|
}
|
||||||
|
|
||||||
impl DataDir {
|
impl DataDir {
|
||||||
pub fn get(&self) -> &Path {
|
pub fn get(&self) -> &Path {
|
||||||
self.dirs.data_local_dir()
|
self.dirs.data_local_dir()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load<T: bincode::Decode<()> + Default>(&self, path: &str) -> T {
|
pub fn load<T: DataRsc>(&self) -> T {
|
||||||
let path = self.get().join(path);
|
let path = self.get().join(T::path());
|
||||||
match fs::read(path) {
|
match fs::read(path) {
|
||||||
Ok(bytes) => match bincode::decode_from_slice(&bytes, BINCODE_CONFIG) {
|
Ok(bytes) => match bincode::decode_from_slice(&bytes, BINCODE_CONFIG) {
|
||||||
Ok((data, _)) => data,
|
Ok((data, _)) => data,
|
||||||
@@ -36,10 +40,10 @@ impl DataDir {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn save<T: bincode::Encode>(&self, path: &str, data: &T) {
|
pub fn save<T: DataRsc>(&self, data: &T) {
|
||||||
let dir = self.get();
|
let dir = self.get();
|
||||||
fs::create_dir_all(dir).unwrap();
|
fs::create_dir_all(dir).unwrap();
|
||||||
let mut file = File::create(dir.join(path)).unwrap();
|
let mut file = File::create(dir.join(T::path())).unwrap();
|
||||||
bincode::encode_into_std_write(data, &mut file, BINCODE_CONFIG).unwrap();
|
bincode::encode_into_std_write(data, &mut file, BINCODE_CONFIG).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user