Cleanup and made plan-window's position normalized so it will be in, relatively to width/height, the same spot

merge-notes
isark 2 years ago
parent af09d88360
commit cf88afca08

@ -8,10 +8,10 @@ use ts_rs::TS;
#[derive(Serialize, Deserialize, Debug, Default, Clone)] #[derive(Serialize, Deserialize, Debug, Default, Clone)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub struct Rect { pub struct Rect {
x: i32, x: f32,
y: i32, y: f32,
width: u32, width: f32,
height: u32, height: f32,
} }
#[cfg_attr(not(build_only), derive(TS))] #[cfg_attr(not(build_only), derive(TS))]

@ -1,16 +1,15 @@
// Prevents additional console window on Windows in release, DO NOT REMOVE!! // Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use std::{collections::HashMap, sync::Mutex}; use std::sync::Mutex;
use config::Config; use config::Config;
use crossbeam::channel::Sender; use crossbeam::channel::Sender;
use overlay::{Event, LockedOverlayData, Overlay}; use overlay::{Event, LockedOverlayData, Overlay};
use poe_data::world_area::WorldArea; use poe_data::world_area::WorldAreasMap;
use simple_logger::SimpleLogger; use simple_logger::SimpleLogger;
use storage::Storage; use storage::Storage;
// use overlay::{Overlay, Manager};
use tauri::Manager; use tauri::Manager;
mod config; mod config;
@ -37,7 +36,7 @@ fn set_auto_hide(auto_hide: bool, state: tauri::State<LockedOverlayData>) {
} }
#[tauri::command] #[tauri::command]
fn load_world_areas() -> HashMap<String, WorldArea> { fn load_world_areas() -> WorldAreasMap {
log::info!("Loading world areas"); log::info!("Loading world areas");
poe_data::world_area::load_world_areas_map(include_str!( poe_data::world_area::load_world_areas_map(include_str!(
"../../data/processed_world_areas.json" "../../data/processed_world_areas.json"
@ -45,12 +44,8 @@ fn load_world_areas() -> HashMap<String, WorldArea> {
} }
#[tauri::command] #[tauri::command]
fn load_config(state: tauri::State<Mutex<Storage>>) -> Config { fn load_config(state: tauri::State<Mutex<Storage>>) -> Option<Config> {
if let Ok(storage) = state.lock() { Some(state.lock().ok()?.config.clone())
log::info!("Loaded config from storage: {:?}", storage.config);
return storage.config.clone();
}
panic!("ERROR!")
} }
#[tauri::command] #[tauri::command]
@ -79,7 +74,6 @@ fn main() {
app.manage(tx); app.manage(tx);
app.manage(Mutex::new(Storage::default())); app.manage(Mutex::new(Storage::default()));
app.get_window("Overlay") app.get_window("Overlay")
.expect("Could not get main overlay window") .expect("Could not get main overlay window")
.open_devtools(); .open_devtools();

@ -1,5 +1,4 @@
use poe_data::world_area::WorldArea; use serde::{Deserialize, Serialize};
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct Plan { pub struct Plan {
@ -7,8 +6,8 @@ pub struct Plan {
current: usize, current: usize,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Debug, Deserialize, Serialize)]
pub struct PlanElement { pub struct PlanElement {
area: WorldArea, area_key: String,
notes: String, notes: String,
} }

@ -1,11 +1,7 @@
<plan-display [plan]="false" [backgroundColor]="planColor"></plan-display> <div *ngIf="overlayService.visible">
<plan-display [plan]="false" [backgroundColor]="planColor"></plan-display>
<!-- <div *ngIf="areas && areas.matcher && areas.world_areas"> <span *ngIf="worldAreas.matcher">matched init</span>
<ul>
<li *ngFor="let item of areas.fuzz()">{{item}}</li>
</ul>
</div> -->
<span *ngIf="worldAreas.matcher">matched init</span> <color-picker [initialColor]="'#00000010'" (color)="planColor = $event">Click me for color picker!</color-picker>
</div>
<color-picker [initialColor]="'#00000010'" (color)="planColor = $event">Click me for color picker!</color-picker>

@ -5,6 +5,7 @@ import { EventsService } from "./services/events.service";
import { WorldAreaService } from "./services/world-area.service"; import { WorldAreaService } from "./services/world-area.service";
import { Color } from "./color-picker/color-picker.component"; import { Color } from "./color-picker/color-picker.component";
import { OverlayService } from "./services/overlay.service"; import { OverlayService } from "./services/overlay.service";
import { ConfigService } from "./services/config.service";
@Component({ @Component({
selector: "app-root", selector: "app-root",
@ -18,10 +19,11 @@ export class AppComponent implements OnInit {
planColor?: Color; planColor?: Color;
constructor( constructor(
private overlayService: OverlayService, public overlayService: OverlayService,
public worldAreas: WorldAreaService, public worldAreas: WorldAreaService,
private shortcuts: ShortcutService, private shortcuts: ShortcutService,
private events: EventsService private events: EventsService,
public configService: ConfigService,
) { } ) { }

@ -1,11 +1,9 @@
import { AfterViewInit, ChangeDetectorRef, Component, Input, OnInit, ViewChild } from '@angular/core'; import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
import { NgxMoveableComponent, OnDragEnd, OnResize, OnResizeEnd } from 'ngx-moveable'; import { NgxMoveableComponent, OnDragEnd, OnResize, OnResizeEnd } from 'ngx-moveable';
import { OnDrag } from 'ngx-moveable'; import { OnDrag } from 'ngx-moveable';
import { ConfigService } from '../services/config.service'; import { ConfigService } from '../services/config.service';
import { Rect } from '../models/generated/Rect'; import { Rect } from '../models/generated/Rect';
import { Plan } from '../models/plan';
import { Color } from '../color-picker/color-picker.component'; import { Color } from '../color-picker/color-picker.component';
import { Subject } from 'rxjs';
@Component({ @Component({
selector: 'plan-display', selector: 'plan-display',
@ -13,7 +11,7 @@ import { Subject } from 'rxjs';
styleUrls: ['./plan-display.component.scss'] styleUrls: ['./plan-display.component.scss']
}) })
export class PlanDisplayComponent implements AfterViewInit { export class PlanDisplayComponent implements AfterViewInit {
@ViewChild('targetRef') targetRef: any; @ViewChild('targetRef') targetRef!: ElementRef;
@Input() plan: boolean = false; @Input() plan: boolean = false;
@Input() backgroundColor?: Color; @Input() backgroundColor?: Color;
draggable: boolean = true; draggable: boolean = true;
@ -34,7 +32,14 @@ export class PlanDisplayComponent implements AfterViewInit {
} }
ngAfterViewInit(): void { ngAfterViewInit(): void {
this.rect = this.configService.config.initialPlanWindowPosition; const cfgRect = this.configService.config.initialPlanWindowPosition;
console.log(window.innerWidth);
this.rect = {
x: cfgRect.x * window.innerWidth,
y: cfgRect.y * window.innerHeight,
width: cfgRect.width * window.innerWidth,
height: cfgRect.height * window.innerHeight,
}
this.cdr.detectChanges(); this.cdr.detectChanges();
} }
@ -44,7 +49,7 @@ export class PlanDisplayComponent implements AfterViewInit {
} }
onDragEnd(e: OnDragEnd) { onDragEnd(e: OnDragEnd) {
this.configService.config.initialPlanWindowPosition = this.rect!; this.saveRect();
} }
onResize(e: OnResize) { onResize(e: OnResize) {
@ -56,6 +61,16 @@ export class PlanDisplayComponent implements AfterViewInit {
} }
onResizeEnd(e: OnResizeEnd) { onResizeEnd(e: OnResizeEnd) {
this.configService.config.initialPlanWindowPosition = this.rect!; this.saveRect();
}
saveRect() {
const toCfgRect = this.rect!;
this.configService.config.initialPlanWindowPosition = {
x: toCfgRect.x / window.innerWidth,
y: toCfgRect.y / window.innerHeight,
width: toCfgRect.width / window.innerWidth,
height: toCfgRect.height / window.innerHeight,
}
} }
} }

@ -18,6 +18,10 @@ export class ConfigService {
init() { init() {
return invoke<Config>('load_config').then(cfg => { return invoke<Config>('load_config').then(cfg => {
if(!cfg) {
console.error("Could not load config, should generally not happen :')");
return;
}
const _this = this; const _this = this;
// Mostly to wrap setters so we can run the (debounced) sync function on any config changes! // Mostly to wrap setters so we can run the (debounced) sync function on any config changes!
this.config = new Proxy(cfg, { this.config = new Proxy(cfg, {

@ -1,4 +1,4 @@
import { Injectable } from '@angular/core'; import { Injectable, NgZone } from '@angular/core';
import { ShortcutService } from './shortcut.service'; import { ShortcutService } from './shortcut.service';
import { EventsService } from './events.service'; import { EventsService } from './events.service';
import { Event } from "@tauri-apps/api/event"; import { Event } from "@tauri-apps/api/event";
@ -17,18 +17,21 @@ class StateEvent {
export class OverlayService { export class OverlayService {
interactable: boolean = false; interactable: boolean = false;
isBinding: boolean = false; isBinding: boolean = false;
visible: boolean = false;
constructor(private shortcuts: ShortcutService, private events: EventsService, private configService: ConfigService) { constructor(private shortcuts: ShortcutService, private events: EventsService, private configService: ConfigService, private zone: NgZone) {
this.shortcuts.register(this.configService.config.toggleOverlay, this.onToggleOverlay); this.shortcuts.register(this.configService.config.toggleOverlay, this.onToggleOverlay.bind(this));
this.events.listen<StateEvent>("OverlayStateChange").subscribe(this.onOverlayStateChange); this.events.listen<StateEvent>("OverlayStateChange").subscribe(this.onOverlayStateChange.bind(this));
} }
onOverlayStateChange(event: Event<StateEvent>) { onOverlayStateChange(event: Event<StateEvent>) {
this.interactable = event.payload.Interactable != null; this.interactable = event.payload.Interactable != null;
if (event.payload.Hidden) {this.visible = false} else {this.visible = true};
console.log("visible: ", this.visible);
} }
onToggleOverlay = () => { onToggleOverlay() {
if (this.interactable) { if (this.interactable) {
this.interactable = false; this.interactable = false;
} else { } else {

Loading…
Cancel
Save