Автоматизация создания кнопок

Я пишу приложение калькулятора на GKT.


Оно почти готово, но не может добавить более одной цифры после запятой. Пытаюсь решить эту проблему. Неважно. Сегодня поговорим не о дробях, а об алгоритмах. Вот как можно создать 9 одинаковых кнопок. Отличаются только названия и передаваемая информация:

let mut button_value = 1.0;
for iterator in 1..=9 {
    let button = gtk::Button::with_label(&iterator.to_string());
    let mut column = 0;
    let mut raw = 1;

    button.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong  previous_operation, @strong entry,
        @strong dot_counter, @strong value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1,           &value_2, button_value);
            entry.insert_text(&iterator.to_string(), &mut -1);
        }));

    if iterator % 3 == 1 {
        column = 0;
    } else if iterator % 3 == 2 {
        column = 1;
    } else if iterator % 3 == 0 {
        column = 2;
    }
    if iterator > 3 && iterator < 7 { raw = 2 }
    else if iterator >= 7 && iterator <= 9 { raw = 3 }

    grid.attach(&button, column, raw, 1, 1);

    button_value += 1.0;
}
Вход в полноэкранный режим Выход из полноэкранного режима

Красиво и лаконично. Хотя я уверен, что его можно улучшить.
А вот так не стоит создавать девять одинаковых кнопок.

    let button_1 = gtk::Button::with_label("1");
    let button_2 = gtk::Button::with_label("2");
    let button_3 = gtk::Button::with_label("3");
    let button_4 = gtk::Button::with_label("4");
    let button_5 = gtk::Button::with_label("5");
    let button_6 = gtk::Button::with_label("6");
    let button_7 = gtk::Button::with_label("7");
    let button_8 = gtk::Button::with_label("8");
    let button_9 = gtk::Button::with_label("9");
    let button_0 = gtk::Button::with_label("0");

    button_1.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 1.0);
            entry.insert_text("1", &mut -1);
        }));

    button_2.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 2.0);
            entry.insert_text("2", &mut -1);
        }));
    button_3.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 3.0);
            entry.insert_text("3", &mut -1);
        }));
    button_4.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 4.0);
            entry.insert_text("4", &mut -1);
        }));
    button_5.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 5.0);
            entry.insert_text("5", &mut -1);
        }));
    button_6.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 6.0);
            entry.insert_text("6", &mut -1);
        }));
    button_7.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 7.0);
            entry.insert_text("7", &mut -1);
        }));
    button_8.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 8.0);
            entry.insert_text("8", &mut -1);
        }));
    button_9.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 9.0);
            entry.insert_text("9", &mut -1);
        }));
    button_0.connect_clicked(clone!(
        @strong value_1, @strong value_2, @strong num_counter, @strong previous_operation, @strong entry,
        @strong dot_counter, @strong  value_1_temp =>
        move |_| {
            set_value(num_counter.get(), dot_counter.get(), &value_1, &value_2, 0.0);
            entry.insert_text("0", &mut -1);
        }));

    grid.attach(&button_1, 0, 1, 1, 1);
    grid.attach(&button_2, 1, 1, 1, 1);
    grid.attach(&button_3, 2, 1, 1, 1);
    grid.attach(&button_4, 0, 2, 1, 1);
    grid.attach(&button_5, 1, 2, 1, 1);
    grid.attach(&button_6, 2, 2, 1, 1);
    grid.attach(&button_7, 0, 3, 1, 1);
    grid.attach(&button_8, 1, 3, 1, 1);
    grid.attach(&button_9, 2, 3, 1, 1);
    grid.attach(&button_0, 1, 4, 1, 1);
Вход в полноэкранный режим Выход из полноэкранного режима

О, да, именно это я и сделал!
Позор мне!
Спасибо Александру Петросяну за подсказку.

Кстати, вот как выглядела проблема добавления цифры после запятой в самом начале.

GTK + вычисления — это не кусок пирога

Оцените статью
devanswers.ru
Добавить комментарий