Skip to content

Commit ba7b3e1

Browse files
committed
reorganised
1 parent efe4d4a commit ba7b3e1

File tree

12 files changed

+371
-352
lines changed

12 files changed

+371
-352
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/bin/main.rs

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
use std::sync::Arc;
2+
// use std::time::Instant;
3+
use parking_lot::Mutex;
4+
5+
use druid::{AppLauncher, LocalizedString, WindowDesc};
6+
7+
use rust_fractal::{renderer::FractalRenderer};
8+
use rust_fractal::util::{extended_to_string_long, string_to_extended};
9+
use rust_fractal::util::data_export::ColoringType;
10+
11+
use config::{Config, File};
12+
13+
use std::thread;
14+
use std::sync::mpsc;
15+
use std::sync::atomic::AtomicBool;
16+
17+
use rust_fractal_gui::theme::*;
18+
use rust_fractal_gui::render_thread::testing_renderer;
19+
use rust_fractal_gui::ui;
20+
use rust_fractal_gui::widgets::FractalData;
21+
22+
pub fn main() {
23+
// Setup the default settings. These are stored in start.toml file
24+
let mut settings = Config::default();
25+
settings.merge(File::with_name("start.toml")).unwrap();
26+
27+
if settings.get_bool("show_output").unwrap() {
28+
println!(" {:<15}| {:<15}| {:<15}| {:<6}| {:<15}| {:<15}| {:<15}| {:<6}| {:<15}", "Zoom", "Approx [ms]", "Skipped [it]", "Order", "Maximum [it]", "Iteration [ms]", "Correct [ms]", "Ref", "Frame [ms]");
29+
};
30+
31+
let shared_settings = Arc::new(Mutex::new(settings.clone()));
32+
let shared_renderer = Arc::new(Mutex::new(FractalRenderer::new(settings.clone())));
33+
let shared_stop_flag = Arc::new(AtomicBool::new(false));
34+
let shared_repeat_flag = Arc::new(AtomicBool::new(false));
35+
36+
let thread_settings = shared_settings.clone();
37+
let thread_renderer = shared_renderer.clone();
38+
let thread_stop_flag = shared_stop_flag.clone();
39+
let thread_repeat_flag = shared_repeat_flag.clone();
40+
41+
let buffer = shared_renderer.lock().data_export.clone();
42+
43+
let window = WindowDesc::new(ui::window_main(shared_renderer.clone())).title(
44+
LocalizedString::new("rust-fractal"),
45+
).window_size((1392.0, 830.0)).resizable(true).menu(ui::make_menu);
46+
47+
let launcher = AppLauncher::with_window(window);
48+
49+
let event_sink = launcher.get_external_handle();
50+
51+
let (sender, reciever) = mpsc::channel();
52+
53+
let mut center_reference_zoom = string_to_extended(&settings.get_str("zoom").unwrap());
54+
center_reference_zoom.exponent += 40;
55+
56+
thread::spawn(move || testing_renderer(event_sink, reciever, thread_settings, thread_renderer, thread_stop_flag, thread_repeat_flag));
57+
58+
launcher
59+
.configure_env(|env, _| configure_env(env))
60+
.launch(FractalData {
61+
image_width: settings.get_int("image_width").unwrap(),
62+
image_height: settings.get_int("image_height").unwrap(),
63+
real: settings.get_str("real").unwrap(),
64+
imag: settings.get_str("imag").unwrap(),
65+
zoom: settings.get_str("zoom").unwrap(),
66+
root_zoom: "1E0".to_string(),
67+
iteration_limit: settings.get_int("iterations").unwrap(),
68+
rotation: settings.get_float("rotate").unwrap(),
69+
order: settings.get_int("approximation_order").unwrap(),
70+
period: 0,
71+
palette_source: "default".to_string(),
72+
palette_cyclic: settings.get_bool("palette_cyclic").unwrap(),
73+
palette_iteration_span: settings.get_float("palette_iteration_span").unwrap(),
74+
palette_offset: settings.get_float("palette_offset").unwrap(),
75+
rendering_progress: 0.0,
76+
root_progress: 1.0,
77+
rendering_stage: 1,
78+
rendering_time: 0,
79+
root_iteration: 64,
80+
root_stage: 0,
81+
min_valid_iterations: 1,
82+
max_valid_iterations: 1,
83+
min_iterations: 1,
84+
max_iterations: 1,
85+
display_glitches: settings.get_bool("display_glitches").unwrap(),
86+
glitch_tolerance: settings.get_float("glitch_tolerance").unwrap(),
87+
glitch_percentage: settings.get_float("glitch_percentage").unwrap(),
88+
iteration_interval: settings.get_int("data_storage_interval").unwrap(),
89+
series_approximation_tiled: settings.get_bool("series_approximation_tiled").unwrap(),
90+
series_approximation_enabled: settings.get_bool("series_approximation_enabled").unwrap(),
91+
probe_sampling: settings.get_int("probe_sampling").unwrap(),
92+
jitter: settings.get_bool("jitter").unwrap(),
93+
jitter_factor: settings.get_float("jitter_factor").unwrap(),
94+
auto_adjust_iterations: settings.get_bool("auto_adjust_iterations").unwrap(),
95+
remove_centre: settings.get_bool("remove_centre").unwrap(),
96+
renderer: shared_renderer,
97+
settings: shared_settings,
98+
sender: Arc::new(Mutex::new(sender)),
99+
stop_flag: shared_stop_flag,
100+
repeat_flag: shared_repeat_flag,
101+
buffer,
102+
need_full_rerender: false,
103+
zoom_out_enabled: false,
104+
pixel_pos: [0, 0],
105+
pixel_iterations: 1,
106+
pixel_smooth: 0.0,
107+
pixel_rgb: Arc::new(Mutex::new(vec![0u8; 255 * 3])),
108+
coloring_type: ColoringType::SmoothIteration,
109+
mouse_mode: 0,
110+
current_tab: 0,
111+
zoom_scale_factor: settings.get_float("zoom_scale").unwrap(),
112+
root_zoom_factor: 0.5,
113+
center_reference_zoom: extended_to_string_long(center_reference_zoom),
114+
reference_count: 1,
115+
stripe_scale: settings.get_float("stripe_scale").unwrap() as f32,
116+
distance_transition: settings.get_float("distance_transition").unwrap() as f32,
117+
distance_color: settings.get_bool("distance_color").unwrap(),
118+
lighting: settings.get_bool("lighting").unwrap(),
119+
lighting_direction: settings.get_float("lighting_direction").unwrap(),
120+
lighting_azimuth: settings.get_float("lighting_azimuth").unwrap(),
121+
lighting_opacity: settings.get_float("lighting_opacity").unwrap(),
122+
lighting_ambient: settings.get_float("lighting_ambient").unwrap(),
123+
lighting_diffuse: settings.get_float("lighting_diffuse").unwrap(),
124+
lighting_specular: settings.get_float("lighting_specular").unwrap(),
125+
lighting_shininess: settings.get_int("lighting_shininess").unwrap(),
126+
})
127+
.expect("launch failed");
128+
}

src/commands.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
use druid::Selector;
22

3-
use rust_fractal::util::{ComplexExtended, FloatExtended};
4-
5-
use crate::ColoringType;
3+
use rust_fractal::util::{ComplexExtended, FloatExtended, data_export::ColoringType};
64

75
pub const RESET_RENDERER_FAST: Selector<()> = Selector::new("reset_renderer_fast");
86
pub const RESET_RENDERER_FULL: Selector<()> = Selector::new("reset_renderer_full");

src/custom.rs

Lines changed: 2 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,9 @@
1-
use crate::{FractalData, commands::{UPDATE_PALETTE, UPDATE_PIXEL_INFORMATION}};
1+
use crate::{widgets::FractalData, commands::{UPDATE_PALETTE, UPDATE_PIXEL_INFORMATION}};
22

3-
use druid::piet::{FontFamily, PietText, ImageFormat, ImageBuf};
3+
use druid::piet::{ImageFormat, ImageBuf};
44
use druid::widget::prelude::*;
5-
use druid::{ArcStr, Color, FontDescriptor, Point, TextLayout, WidgetPod};
65
use druid::widget::{Controller, Image};
76

8-
const LINE_HEIGHT_FACTOR: f64 = 1.2;
9-
const X_PADDING: f64 = 5.0;
10-
pub struct NoUpdateLabel {
11-
text: TextLayout<ArcStr>,
12-
// Does the layout need to be changed?
13-
needs_update: bool,
14-
font_size: f64
15-
}
16-
17-
impl NoUpdateLabel {
18-
pub fn new(font_size: f64) -> NoUpdateLabel {
19-
NoUpdateLabel {
20-
text: TextLayout::new(),
21-
needs_update: true,
22-
font_size
23-
}
24-
}
25-
26-
fn make_layout_if_needed(&mut self, value: &str, t: &mut PietText, env: &Env) {
27-
if self.needs_update {
28-
self.text
29-
.set_text(value.into());
30-
self.text
31-
.set_font(FontDescriptor::new(FontFamily::MONOSPACE).with_size(self.font_size));
32-
self.text.set_text_color(Color::WHITE);
33-
self.text.rebuild_if_needed(t, env);
34-
35-
self.needs_update = false;
36-
}
37-
}
38-
}
39-
40-
impl Widget<String> for NoUpdateLabel {
41-
fn event(&mut self, _: &mut EventCtx, _: &Event, _: &mut String, _: &Env) {}
42-
43-
fn lifecycle(&mut self, _: &mut LifeCycleCtx, _: &LifeCycle, _: &String, _: &Env) {}
44-
45-
fn update(&mut self, ctx: &mut UpdateCtx, _: &String, _: &String, _: &Env) {
46-
self.needs_update = true;
47-
ctx.request_paint();
48-
}
49-
50-
fn layout(&mut self, ctx: &mut LayoutCtx, bc: &BoxConstraints, data: &String, env: &Env) -> Size {
51-
self.make_layout_if_needed(&data, &mut ctx.text(), env);
52-
bc.constrain((
53-
self.text.size().width + 2.0 * X_PADDING,
54-
self.font_size * LINE_HEIGHT_FACTOR,
55-
))
56-
}
57-
58-
fn paint(&mut self, ctx: &mut PaintCtx, data: &String, env: &Env) {
59-
self.make_layout_if_needed(&data, &mut ctx.text(), env);
60-
let origin = Point::new(X_PADDING, 0.0);
61-
self.text.draw(ctx, origin);
62-
}
63-
}
64-
657
pub struct PaletteUpdateController;
668

679
impl Controller<FractalData, Image> for PaletteUpdateController {
@@ -110,82 +52,4 @@ impl Controller<FractalData, Image> for PixelInformationUpdateController {
11052
other => child.event(ctx, other, data, env),
11153
}
11254
}
113-
}
114-
115-
/// A widget that switches between two possible child views.
116-
pub struct Either<T> {
117-
closure: Box<dyn Fn(&T, &Env) -> usize>,
118-
branches: Vec<WidgetPod<T, Box<dyn Widget<T>>>>,
119-
current: usize,
120-
}
121-
122-
impl<T> Either<T> {
123-
/// Create a new widget that switches between two views.
124-
pub fn new(
125-
closure: impl Fn(&T, &Env) -> usize + 'static,
126-
) -> Either<T> {
127-
Either {
128-
closure: Box::new(closure),
129-
branches: Vec::new(),
130-
current: 0,
131-
}
132-
}
133-
134-
pub fn add_branch(mut self, branch: impl Widget<T> + 'static) -> Self {
135-
self.branches.push(WidgetPod::new(branch).boxed());
136-
self
137-
}
138-
}
139-
140-
impl<T: Data> Widget<T> for Either<T> {
141-
fn event(&mut self, ctx: &mut EventCtx, event: &Event, data: &mut T, env: &Env) {
142-
if event.should_propagate_to_hidden() {
143-
for branch in &mut self.branches {
144-
branch.event(ctx, event, data, env);
145-
}
146-
} else {
147-
self.current_widget().event(ctx, event, data, env)
148-
}
149-
}
150-
151-
fn lifecycle(&mut self, ctx: &mut LifeCycleCtx, event: &LifeCycle, data: &T, env: &Env) {
152-
if let LifeCycle::WidgetAdded = event {
153-
self.current = (self.closure)(data, env);
154-
}
155-
156-
if event.should_propagate_to_hidden() {
157-
for branch in &mut self.branches {
158-
branch.lifecycle(ctx, event, data, env);
159-
}
160-
} else {
161-
self.current_widget().lifecycle(ctx, event, data, env)
162-
}
163-
}
164-
165-
fn update(&mut self, ctx: &mut UpdateCtx, _old_data: &T, data: &T, env: &Env) {
166-
let current = (self.closure)(data, env);
167-
if current != self.current {
168-
self.current = current;
169-
ctx.request_layout();
170-
}
171-
self.current_widget().update(ctx, data, env)
172-
}
173-
174-
fn layout(&mut self, ctx: &mut LayoutCtx, bc: &BoxConstraints, data: &T, env: &Env) -> Size {
175-
let current_widget = self.current_widget();
176-
let size = current_widget.layout(ctx, bc, data, env);
177-
current_widget.set_origin(ctx, data, env, Point::ORIGIN);
178-
ctx.set_paint_insets(current_widget.paint_insets());
179-
size
180-
}
181-
182-
fn paint(&mut self, ctx: &mut PaintCtx, data: &T, env: &Env) {
183-
self.current_widget().paint(ctx, data, env)
184-
}
185-
}
186-
187-
impl<T> Either<T> {
188-
fn current_widget(&mut self) -> &mut WidgetPod<T, Box<dyn Widget<T>>> {
189-
&mut self.branches[self.current]
190-
}
19155
}

src/lens.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use druid::Lens;
22

3-
use crate::FractalData;
3+
use crate::widgets::FractalData;
44
pub struct RealLens;
55

66
impl Lens<FractalData, String> for RealLens {

src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
pub mod widgets;
2+
pub mod ui;
3+
pub mod theme;
4+
pub mod commands;
5+
pub mod lens;
6+
pub mod custom;
7+
pub mod render_thread;

src/saving.rs

Whitespace-only changes.

src/ui.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,10 @@ use druid::theme::{PRIMARY_DARK, BACKGROUND_DARK};
1212

1313
use parking_lot::Mutex;
1414
use std::sync::Arc;
15-
use rust_fractal::{
16-
renderer::FractalRenderer,
17-
util::{string_to_extended, extended_to_string_short, FloatExtended}
18-
};
15+
use rust_fractal::{renderer::FractalRenderer, util::{FloatExtended, data_export::ColoringType, extended_to_string_short, string_to_extended}};
1916

20-
use crate::{FractalData, FractalWidget, ColoringType};
17+
use crate::widgets::*;
2118
use crate::custom::*;
22-
23-
2419
use crate::commands::*;
2520
use crate::lens;
2621

0 commit comments

Comments
 (0)