:: BASIC_11_two_windows (feat. COLOR CONSTANTS)

BamgasiJM·2025년 9월 21일

Nannou <BASIC>

목록 보기
24/41
post-thumbnail

📝 Rust Code

use nannou::prelude::*;
use nannou::rand::prelude::*;

fn main() {
    nannou::app(model).update(update).event(event).run();
}

struct Model {
    win_sub: WindowId,
    current_color: Rgb8,
    current_color_name: String,
}

// nannou color 모듈의 모든 색상 상수들
const COLORS: &[(Rgb8, &str)] = &[
    (ALICEBLUE, "ALICEBLUE"),
    (ANTIQUEWHITE, "ANTIQUEWHITE"),
    (AQUA, "AQUA"),
    (AQUAMARINE, "AQUAMARINE"),
    (AZURE, "AZURE"),
    (BEIGE, "BEIGE"),
    (BISQUE, "BISQUE"),
    (BLACK, "BLACK"),
    (BLANCHEDALMOND, "BLANCHEDALMOND"),
    (BLUE, "BLUE"),
    (BLUEVIOLET, "BLUEVIOLET"),
    (BROWN, "BROWN"),
    (BURLYWOOD, "BURLYWOOD"),
    (CADETBLUE, "CADETBLUE"),
    (CHARTREUSE, "CHARTREUSE"),
    (CHOCOLATE, "CHOCOLATE"),
    (CORAL, "CORAL"),
    (CORNFLOWERBLUE, "CORNFLOWERBLUE"),
    (CORNSILK, "CORNSILK"),
    (CRIMSON, "CRIMSON"),
    (CYAN, "CYAN"),
    (DARKBLUE, "DARKBLUE"),
    (DARKCYAN, "DARKCYAN"),
    (DARKGOLDENROD, "DARKGOLDENROD"),
    (DARKGRAY, "DARKGRAY"),
    (DARKGREEN, "DARKGREEN"),
    (DARKGREY, "DARKGREY"),
    (DARKKHAKI, "DARKKHAKI"),
    (DARKMAGENTA, "DARKMAGENTA"),
    (DARKOLIVEGREEN, "DARKOLIVEGREEN"),
    (DARKORANGE, "DARKORANGE"),
    (DARKORCHID, "DARKORCHID"),
    (DARKRED, "DARKRED"),
    (DARKSALMON, "DARKSALMON"),
    (DARKSEAGREEN, "DARKSEAGREEN"),
    (DARKSLATEBLUE, "DARKSLATEBLUE"),
    (DARKSLATEGRAY, "DARKSLATEGRAY"),
    (DARKSLATEGREY, "DARKSLATEGREY"),
    (DARKTURQUOISE, "DARKTURQUOISE"),
    (DARKVIOLET, "DARKVIOLET"),
    (DEEPPINK, "DEEPPINK"),
    (DEEPSKYBLUE, "DEEPSKYBLUE"),
    (DIMGRAY, "DIMGRAY"),
    (DIMGREY, "DIMGREY"),
    (DODGERBLUE, "DODGERBLUE"),
    (FIREBRICK, "FIREBRICK"),
    (FLORALWHITE, "FLORALWHITE"),
    (FORESTGREEN, "FORESTGREEN"),
    (FUCHSIA, "FUCHSIA"),
    (GAINSBORO, "GAINSBORO"),
    (GHOSTWHITE, "GHOSTWHITE"),
    (GOLD, "GOLD"),
    (GOLDENROD, "GOLDENROD"),
    (GRAY, "GRAY"),
    (GREEN, "GREEN"),
    (GREENYELLOW, "GREENYELLOW"),
    (GREY, "GREY"),
    (HONEYDEW, "HONEYDEW"),
    (HOTPINK, "HOTPINK"),
    (INDIANRED, "INDIANRED"),
    (INDIGO, "INDIGO"),
    (IVORY, "IVORY"),
    (KHAKI, "KHAKI"),
    (LAVENDER, "LAVENDER"),
    (LAVENDERBLUSH, "LAVENDERBLUSH"),
    (LAWNGREEN, "LAWNGREEN"),
    (LEMONCHIFFON, "LEMONCHIFFON"),
    (LIGHTBLUE, "LIGHTBLUE"),
    (LIGHTCORAL, "LIGHTCORAL"),
    (LIGHTCYAN, "LIGHTCYAN"),
    (LIGHTGOLDENRODYELLOW, "LIGHTGOLDENRODYELLOW"),
    (LIGHTGRAY, "LIGHTGRAY"),
    (LIGHTGREEN, "LIGHTGREEN"),
    (LIGHTGREY, "LIGHTGREY"),
    (LIGHTPINK, "LIGHTPINK"),
    (LIGHTSALMON, "LIGHTSALMON"),
    (LIGHTSEAGREEN, "LIGHTSEAGREEN"),
    (LIGHTSKYBLUE, "LIGHTSKYBLUE"),
    (LIGHTSLATEGRAY, "LIGHTSLATEGRAY"),
    (LIGHTSLATEGREY, "LIGHTSLATEGREY"),
    (LIGHTSTEELBLUE, "LIGHTSTEELBLUE"),
    (LIGHTYELLOW, "LIGHTYELLOW"),
    (LIME, "LIME"),
    (LIMEGREEN, "LIMEGREEN"),
    (LINEN, "LINEN"),
    (MAGENTA, "MAGENTA"),
    (MAROON, "MAROON"),
    (MEDIUMAQUAMARINE, "MEDIUMAQUAMARINE"),
    (MEDIUMBLUE, "MEDIUMBLUE"),
    (MEDIUMORCHID, "MEDIUMORCHID"),
    (MEDIUMPURPLE, "MEDIUMPURPLE"),
    (MEDIUMSEAGREEN, "MEDIUMSEAGREEN"),
    (MEDIUMSLATEBLUE, "MEDIUMSLATEBLUE"),
    (MEDIUMSPRINGGREEN, "MEDIUMSPRINGGREEN"),
    (MEDIUMTURQUOISE, "MEDIUMTURQUOISE"),
    (MEDIUMVIOLETRED, "MEDIUMVIOLETRED"),
    (MIDNIGHTBLUE, "MIDNIGHTBLUE"),
    (MINTCREAM, "MINTCREAM"),
    (MISTYROSE, "MISTYROSE"),
    (MOCCASIN, "MOCCASIN"),
    (NAVAJOWHITE, "NAVAJOWHITE"),
    (NAVY, "NAVY"),
    (OLDLACE, "OLDLACE"),
    (OLIVE, "OLIVE"),
    (OLIVEDRAB, "OLIVEDRAB"),
    (ORANGE, "ORANGE"),
    (ORANGERED, "ORANGERED"),
    (ORCHID, "ORCHID"),
    (PALEGOLDENROD, "PALEGOLDENROD"),
    (PALEGREEN, "PALEGREEN"),
    (PALETURQUOISE, "PALETURQUOISE"),
    (PALEVIOLETRED, "PALEVIOLETRED"),
    (PAPAYAWHIP, "PAPAYAWHIP"),
    (PEACHPUFF, "PEACHPUFF"),
    (PERU, "PERU"),
    (PINK, "PINK"),
    (PLUM, "PLUM"),
    (POWDERBLUE, "POWDERBLUE"),
    (PURPLE, "PURPLE"),
    (REBECCAPURPLE, "REBECCAPURPLE"),
    (RED, "RED"),
    (ROSYBROWN, "ROSYBROWN"),
    (ROYALBLUE, "ROYALBLUE"),
    (SADDLEBROWN, "SADDLEBROWN"),
    (SALMON, "SALMON"),
    (SANDYBROWN, "SANDYBROWN"),
    (SEAGREEN, "SEAGREEN"),
    (SEASHELL, "SEASHELL"),
    (SIENNA, "SIENNA"),
    (SILVER, "SILVER"),
    (SKYBLUE, "SKYBLUE"),
    (SLATEBLUE, "SLATEBLUE"),
    (SLATEGRAY, "SLATEGRAY"),
    (SLATEGREY, "SLATEGREY"),
    (SNOW, "SNOW"),
    (SPRINGGREEN, "SPRINGGREEN"),
    (STEELBLUE, "STEELBLUE"),
    (TAN, "TAN"),
    (TEAL, "TEAL"),
    (THISTLE, "THISTLE"),
    (TOMATO, "TOMATO"),
    (TURQUOISE, "TURQUOISE"),
    (VIOLET, "VIOLET"),
    (WHEAT, "WHEAT"),
    (WHITE, "WHITE"),
    (WHITESMOKE, "WHITESMOKE"),
    (YELLOW, "YELLOW"),
    (YELLOWGREEN, "YELLOWGREEN"),
];

fn model(app: &App) -> Model {
    // 첫 번째 창 (메인)
    let _win_main = app
        .new_window()
        .size(600, 400)
        .title("Main Window")
        .view(view_main)
        .build()
        .unwrap();

    // 두 번째 창 (서브)
    let win_sub = app
        .new_window()
        .size(400, 400)
        .title("Sub Window")
        .view(view_sub)
        .build()
        .unwrap();

    Model {
        win_sub,
        current_color: WHITE,
        current_color_name: "WHITE".to_string(),
    }
}

fn update(_app: &App, _model: &mut Model, _update: Update) {}

fn event(_app: &App, model: &mut Model, event: Event) {
    match event {
        Event::WindowEvent { id, simple: Some(MousePressed(_button)), .. } => {
            // sub 창을 클릭했을 때만 색상 변경
            if id == model.win_sub {
                let mut rng = thread_rng();
                let (color, color_name) = COLORS.choose(&mut rng).unwrap();
                model.current_color = *color;
                model.current_color_name = color_name.to_string();
            }
        }
        _ => {}
    }
}

fn view_main(app: &App, model: &Model, frame: Frame) {
    let draw = app.draw();
    draw.background().color(model.current_color);

    draw.text(&model.current_color_name).color(BLACK).font_size(24).x_y(0.0, 0.0);

    draw.to_frame(app, &frame).unwrap();
}

fn view_sub(app: &App, _model: &Model, frame: Frame) {
    let draw = app.draw();
    draw.background().color(GRAY);

    draw.text("CLICK TO CHANGE THE COLOR").color(BLACK).font_size(18).x_y(0.0, 0.0);

    draw.to_frame(app, &frame).unwrap();
}

profile
Coding Art with Blender / oF / Processing / p5.js / nannou

0개의 댓글