Compare commits

..

9 Commits

Author SHA1 Message Date
309060a5ce merge stable version
Reviewed-on: https://gitea.doryan04.ru/doryan/AIT/pulls/2
2024-08-28 18:54:00 +03:00
27f9a8e10b refactor: pre-release build 2024-08-19 03:14:39 -07:00
229f525653 some changes + fix grammar mistakes 2024-08-18 13:41:54 -07:00
c211f3002a feat(theme): add dynamic theming 2024-08-18 10:30:00 -07:00
1edbe06401 feat(crate): update crate 2024-08-18 10:29:38 -07:00
a787464c44 feat(imports): update imports 2024-08-18 10:29:15 -07:00
fcc2567aa2 feat(imports): update imports 2024-08-18 10:28:58 -07:00
34d2af08c6 feat(theme): add styles for dark and light themes 2024-08-18 10:26:53 -07:00
676594f9bf Update README.md 2024-08-10 00:55:17 +03:00
35 changed files with 290 additions and 77 deletions

BIN
.vs/AIT/v17/.wsuo Normal file

Binary file not shown.

View File

@@ -0,0 +1,54 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\msys64\\home\\doryan\\AIT\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\msys64\\home\\doryan\\AIT\\src\\main.rs||{3B902123-F8A7-4915-9F01-361F908088D0}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:src\\main.rs||{3B902123-F8A7-4915-9F01-361F908088D0}"
},
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\msys64\\home\\doryan\\AIT\\.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"Children": [
{
"$type": "Document",
"DocumentIndex": 1,
"Title": ".gitignore",
"DocumentMoniker": "C:\\msys64\\home\\doryan\\AIT\\.gitignore",
"RelativeDocumentMoniker": ".gitignore",
"ToolTip": "C:\\msys64\\home\\doryan\\AIT\\.gitignore",
"RelativeToolTip": ".gitignore",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAF8SURBVDhPjVNLTgJBEG1lwpoFB3GNK9fieA48hD8iwT/ihwgSDAIHgAGXXsEV18CNzL/LquqZdsYM6kteXqcy3fWqpmpNRBgOhyABBEgpAFVKPIMUcYzUyOU\u002BXM/b2qtU3vkSfRjjZTCAMAw1A2LwzdFoBPP5HNqdzuL27n4juibWI\u002BUshBA1DIkhEx9iEorFotgslQqGYbxxAGFEqt1MxmPWJLbLZdZ\u002Bv89q5PMFPiTR6z2zdaxR0fXA0XTBcVywkb4fwHXjRteecIDNQ7UmExVYAdPcxYaqclN46na5WenMKjtlVnTYwcXlVYaDqImW9beD5N/TeGy32QHXm6hZ03ZgiSQHp2fnWQ4oBmJqWSqwAqZpZjt4aLXAD4J0VqyZsmoubfB8H2r1eoaD6NXZ9HcHO\u002BSA3f4AjifXl8rItOETM8ckB9WTWpYD9RdeZ1PWVWAHWXPQaDb59f/w8LiqHeh1pvGkCaP6qB8yXusoxmuNZ7XmII4O9vGuEF86osuDYRkpYQAAAABJRU5ErkJggg==",
"WhenOpened": "2024-08-18T21:59:06.655Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "main.rs",
"DocumentMoniker": "C:\\msys64\\home\\doryan\\AIT\\src\\main.rs",
"RelativeDocumentMoniker": "src\\main.rs",
"ToolTip": "C:\\msys64\\home\\doryan\\AIT\\src\\main.rs",
"RelativeToolTip": "src\\main.rs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
"WhenOpened": "2024-08-18T21:59:04.875Z",
"EditorCaption": ""
}
]
}
]
}
]
}

View File

@@ -0,0 +1,53 @@
{
"Version": 1,
"WorkspaceRootPath": "C:\\msys64\\home\\doryan\\AIT\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\msys64\\home\\doryan\\AIT\\src\\main.rs||{3B902123-F8A7-4915-9F01-361F908088D0}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:src\\main.rs||{3B902123-F8A7-4915-9F01-361F908088D0}"
},
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\msys64\\home\\doryan\\AIT\\.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:.gitignore||{3B902123-F8A7-4915-9F01-361F908088D0}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"Children": [
{
"$type": "Document",
"DocumentIndex": 1,
"Title": ".gitignore",
"DocumentMoniker": "C:\\msys64\\home\\doryan\\AIT\\.gitignore",
"RelativeDocumentMoniker": ".gitignore",
"ToolTip": "C:\\msys64\\home\\doryan\\AIT\\.gitignore",
"RelativeToolTip": ".gitignore",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "00000000-0000-0000-0000-000000000000.000000|iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAF8SURBVDhPjVNLTgJBEG1lwpoFB3GNK9fieA48hD8iwT/ihwgSDAIHgAGXXsEV18CNzL/LquqZdsYM6kteXqcy3fWqpmpNRBgOhyABBEgpAFVKPIMUcYzUyOU\u002BXM/b2qtU3vkSfRjjZTCAMAw1A2LwzdFoBPP5HNqdzuL27n4juibWI\u002BUshBA1DIkhEx9iEorFotgslQqGYbxxAGFEqt1MxmPWJLbLZdZ\u002Bv89q5PMFPiTR6z2zdaxR0fXA0XTBcVywkb4fwHXjRteecIDNQ7UmExVYAdPcxYaqclN46na5WenMKjtlVnTYwcXlVYaDqImW9beD5N/TeGy32QHXm6hZ03ZgiSQHp2fnWQ4oBmJqWSqwAqZpZjt4aLXAD4J0VqyZsmoubfB8H2r1eoaD6NXZ9HcHO\u002BSA3f4AjifXl8rItOETM8ckB9WTWpYD9RdeZ1PWVWAHWXPQaDb59f/w8LiqHeh1pvGkCaP6qB8yXusoxmuNZ7XmII4O9vGuEF86osuDYRkpYQAAAABJRU5ErkJggg==",
"WhenOpened": "2024-08-18T21:59:06.655Z"
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "main.rs",
"DocumentMoniker": "C:\\msys64\\home\\doryan\\AIT\\src\\main.rs",
"RelativeDocumentMoniker": "src\\main.rs",
"ToolTip": "C:\\msys64\\home\\doryan\\AIT\\src\\main.rs",
"RelativeToolTip": "src\\main.rs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
"WhenOpened": "2024-08-18T21:59:04.875Z",
"EditorCaption": ""
}
]
}
]
}
]
}

3
.vs/ProjectSettings.json Normal file
View File

@@ -0,0 +1,3 @@
{
"CurrentProjectSetting": null
}

View File

@@ -0,0 +1,7 @@
{
"ExpandedNodes": [
"",
"\\src"
],
"PreviewInSolutionExplorer": false
}

BIN
.vs/slnx.sqlite Normal file

Binary file not shown.

45
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,45 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'AIT'",
"cargo": {
"args": [
"build",
"--bin=AIT",
"--package=AIT"
],
"filter": {
"name": "AIT",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'AIT'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=AIT",
"--package=AIT"
],
"filter": {
"name": "AIT",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

21
Cargo.lock generated
View File

@@ -11,6 +11,7 @@ dependencies = [
"gtk4",
"libadwaita",
"tokio",
"winres",
]
[[package]]
@@ -712,7 +713,7 @@ dependencies = [
"cfg-expr",
"heck",
"pkg-config",
"toml",
"toml 0.8.19",
"version-compare",
]
@@ -750,6 +751,15 @@ dependencies = [
"syn",
]
[[package]]
name = "toml"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
dependencies = [
"serde",
]
[[package]]
name = "toml"
version = "0.8.19"
@@ -898,6 +908,15 @@ dependencies = [
"memchr",
]
[[package]]
name = "winres"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
dependencies = [
"toml 0.5.11",
]
[[package]]
name = "wyz"
version = "0.5.1"

View File

@@ -6,8 +6,11 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
adw = { version = "0.7.0", package = "libadwaita", features = ["v1_4"] }
adw = { version = "0.7.0", package = "libadwaita"}
bitvec = "1.0.1"
gio = { version = "0.20.0", features = ["v2_74"] }
gtk4 = { version = "0.9.0", features = ["v4_12"] }
gtk = { version = "0.9.0", package = "gtk4", features = ["v4_12"] }
tokio = { version = "1.39.2", features = ["rt", "time", "rt-multi-thread", "macros", "sync"] }
[build-dependencies]
winres = "0.1"

View File

@@ -0,0 +1,7 @@
# AIT (Applied Information Theory), или же ПТИ (Прикладная теория информаций).
Программа разрабатывается с использованием таких библиотек, как [tokio](https://tokio.rs/) (асинхронный рантайм), [bitvec](https://docs.rs/bitvec/latest/bitvec/) и [gtk-rs c libadwaita](https://gtk-rs.org/).
## Сфера применения
Данная программа разрабатывается для студентов УлГТУ 2-ого курса направления "Приборостроение" с целью включить это ПО в лабораторные работы с кодом Хэмминга и затуханием сигналов для проверки расчётов.

9
build.rs Normal file
View File

@@ -0,0 +1,9 @@
extern crate winres;
fn main() {
if cfg!(target_os = "windows") {
let mut res = winres::WindowsResource::new();
res.set_icon("./src/view/resources/icon.ico"); // Replace this with the filename of your .ico file.
res.compile().unwrap();
}
}

View File

@@ -1,5 +1,3 @@
use gtk4 as gtk;
use crate::{
model::{models::*, Result},
model_utils::hamming_code_seven_four::*,

View File

@@ -1,5 +1,3 @@
use gtk4 as gtk;
use bitvec::{order::Lsb0, view::AsBits};
use gtk::{prelude::*, *};
use std::ops::Deref;

View File

@@ -1,5 +1,4 @@
use gio::glib::Object;
use gtk4 as gtk;
use std::str::FromStr;

View File

@@ -1,4 +1,4 @@
use gtk4 as gtk;
#![windows_subsystem = "windows"]
extern crate gio;

View File

@@ -1,14 +1,12 @@
pub mod builder_traits;
pub mod models;
use crate::gtk::glib;
use glib::Object;
use gtk::glib::{Object, wrapper};
pub type Result<T> = core::result::Result<T, Error>;
pub type Error = std::boxed::Box<dyn std::error::Error>;
glib::wrapper! {
wrapper! {
pub struct Frequency(ObjectSubclass<models::Frequency>);
}

View File

@@ -1,7 +1,5 @@
use std::cell::Cell;
use crate::gtk;
use gtk::{
glib::{self, Properties},
prelude::*,

View File

@@ -1,10 +1,9 @@
use adw::HeaderBar;
use gio::{glib::Variant, SimpleAction};
use gtk4 as gtk;
use gtk::{
prelude::{BoxExt, GtkWindowExt},
AboutDialog, Box, Image, Label, Orientation, ScrolledWindow, Window,
AboutDialog, Box, Image, Label, Orientation, ScrolledWindow, Window, License, NaturalWrapMode, PolicyType
};
use std::path::Path;
@@ -23,8 +22,8 @@ pub fn open_about_dialogue(_action: &SimpleAction, _var: Option<&Variant>) {
AboutDialog::builder()
.authors(vec!["Сагиев А.Д.", "Ефимов И.П."])
.version("1.0-beta")
.program_name("Прикладная теория информаций")
.license_type(gtk4::License::Apache20)
.program_name("Прикладная теория информации")
.license_type(License::Apache20)
.logo(&logo)
.website("https://gitea.doryan04.ru/doryan/AIT")
.build()
@@ -44,7 +43,7 @@ pub fn open_help_dialogue(_action: &SimpleAction, _var: Option<&Variant>) {
.width_request(400)
.max_width_chars(50)
.single_line_mode(false)
.natural_wrap_mode(gtk4::NaturalWrapMode::Word)
.natural_wrap_mode(NaturalWrapMode::Word)
.label(crate::view::resources::HELP)
.build();
@@ -52,14 +51,14 @@ pub fn open_help_dialogue(_action: &SimpleAction, _var: Option<&Variant>) {
let scrollable = ScrolledWindow::builder()
.child(&help)
.hscrollbar_policy(gtk4::PolicyType::Never)
.hscrollbar_policy(PolicyType::Never)
.build();
let custom_header = HeaderBar::new();
Window::builder()
.width_request(400)
.height_request(300)
.width_request(800)
.height_request(600)
.name("help")
.title("Помощь")
.titlebar(&custom_header)

View File

@@ -1,11 +1,11 @@
use gtk4 as gtk;
use gio::glib::clone;
use std::{collections::VecDeque, sync::LazyLock};
use gtk::{
builders::{BoxBuilder, ButtonBuilder, LabelBuilder},
prelude::{BoxExt, ButtonExt, ObjectExt, WidgetExt},
Box, Button, Label, Revealer, RevealerTransitionType,
Box, Button, Label, Revealer, RevealerTransitionType
};
use crate::model::builder_traits::Product;
@@ -94,20 +94,20 @@ impl InfoBarBuilder {
info_bar_box.append(&info_bar_label);
info_bar_box.append(&info_bar_close_btn);
info_bar_box.set_widget_name("info_bar");
let info_bar: &Revealer = &INFO_BAR_INSTANCE.instance;
info_bar.set_transition_type(RevealerTransitionType::SlideUp);
info_bar.set_transition_duration(200);
info_bar.set_child(Some(&info_bar_box));
info_bar.set_widget_name("infobar");
info_bar.set_css_classes(&[".warning"]);
let info_bar_to_close = info_bar.clone();
info_bar_close_btn.connect_clicked(move |_| {
info_bar_to_close.set_reveal_child(false);
});
info_bar_close_btn.connect_clicked(clone!(
#[strong]
info_bar,
move |_| info_bar.set_reveal_child(false)
));
&INFO_BAR_INSTANCE
}

View File

@@ -1,5 +1,3 @@
use gtk4 as gtk;
use crate::{model::builder_traits::*, view::properties::*};
use gtk::{prelude::*, *};

View File

@@ -1,7 +1,5 @@
use std::fmt::{Debug, Display};
use gtk4 as gtk;
use gio::{
glib::Variant, prelude::ActionMapExtManual, ActionEntry, Menu, SimpleAction, SimpleActionGroup,
};

View File

@@ -1,8 +1,6 @@
use gtk4::{self as gtk, prelude::WidgetExt};
#[allow(unused)]
use gtk::{
prelude::{BoxExt, IsA},
prelude::{BoxExt, IsA, WidgetExt},
Box, Orientation, Stack, StackSidebar, StackSwitcher, StackTransitionType, Widget,
};

View File

@@ -1,5 +1,3 @@
use gtk4 as gtk;
use super::builder_traits::*;
use gtk::{Box, Label, Notebook};

View File

@@ -1,5 +1,3 @@
use gtk4 as gtk;
use crate::{
model::builder_traits::Product,
view::{

View File

@@ -19,8 +19,6 @@ use gtk::{
Align, *,
};
use gtk4 as gtk;
pub fn signal_reducing_page(wrapper: &Box) {
let values = Rc::new(Cell::new(SignalReduce::default()));

View File

@@ -1,5 +1,3 @@
use gtk4 as gtk;
use gtk::builders::*;
use gtk::Align;

View File

@@ -3,11 +3,11 @@
В данной лабораторной работе используется код Хэмминга 7-4, другими словами, код, который нужно закодировать, имеет длину в 4 бита, в то же время выходной код будет иметь 7 бит.
Программа умеет как закодировать ключевые слова, так и их проверять.
Программа умеет как кодировать ключевые слова, так и проверять их.
<b> Режим кодирования </b>
В этом режиме мы вводим код, в котором каждое "слово" имеет 4 бита. Это должно выглядеть следующим образом:
В этом режиме мы вводим код, в котором каждое "слово" имеет 4 бита. Это может выглядеть следующим образом:
<tt>1010 1100 1110 0000</tt>
@@ -15,13 +15,13 @@
<tt>1100110 0111100 0101010 0000000</tt>
В противном случае вылезет информационный блок с предупреждением: "Проверьте корректность кода".
В противном случае появится информационный блок с предупреждением: "Проверьте корректность кода".
<b> Режим проверки </b>
Данный режим проверяет код на ошибки. Проверка в лучшем случае пишет: "Все коды корректны", в противном случае, построчно показывает, в каких кодах есть ошибка.
Данный режим проверяет код на ошибки. Проверка в лучшем случае пишет: "Все коды корректны". При ошибочно введённом коде, программа построчно отобразит в каких кодах есть ошибка.
Пример ввода возьмём из предыдущего примера:
Пример ввода аналогичен предыдущему:
<tt>1100110 0111100 0101010 0000000</tt>
@@ -44,8 +44,8 @@
<span size="x-large"><b> Затухание сигнала </b></span>
Лабораторная работа подразумевает рассчитать для 19 значений частоты реактивное сопротивление конденсатора X<sub>c</sub>, напряжения сигнала на стороне приёмника информации V<sub>п</sub> и коэффициент затухания сигнала ζ.
Лабораторная работа подразумевает рассчитать для каждого из девятнадцати значений частоты реактивного сопротивление конденсатора X<sub>c</sub>, напряжение сигнала на стороне приёмника информации V<sub>п</sub> и коэффициент затухания сигнала ζ.
Значения вводятся согласно исходным данным для расчёта затухания сигнала. Значения можно вводить как с ",", так и ".".
Значения вводятся согласно исходным данным для расчёта затухания сигнала. Значения можно вводить как с ",", так и с ".".
При вводе одних и тех же данных без изменений будет вылезать предупреждение и операция расчёта не будет выполнена. Можно не менять данные в случае частоты, чтобы обновить данные расчёта в соответствии с новыми (К примеру, в случае длины провода, или сопротивления провода).
При вводе одних и тех же данных без изменений, будет показано предупреждение и операция расчёта не будет выполнена. Можно не менять данные в случае частоты, чтобы обновить данные расчёта в соответствии с новыми (К примеру, в случае длины провода, или сопротивления провода).

BIN
src/view/resources/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

BIN
src/view/resources/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

View File

@@ -1,22 +1,10 @@
#info_bar{
background-color:#F1E6D9;
padding: 5px;
label{
font-size: 11pt;
}
#info_bar > button {
transform: scale(0.9);
background-color: transparent;
}
#info_bar > button:hover {
background-color: #00000010;
}
#info_bar > button:active {
background-color: #00000020;
}
textview {
border-radius: 7px;
padding: 7px 8px;
background: #E6E6E6;
background: rgba(90, 90, 90, 0.5);
outline-offset: 2px;
outline: 2px solid #81ABDF00;
transition-duration: .15s;
@@ -26,3 +14,9 @@ textview:focus-within {
outline-offset: -2px;
outline: 2px solid #81ABDF;
}
revealer#infobar > box {
padding: 8px;
border-spacing: 12px;
border-bottom: 1px solid lighten(darken(#f6f5f4, 10%), 5%);
background-color: #4a351b;
}

View File

@@ -0,0 +1,22 @@
label{
font-size: 11pt;
}
textview {
border-radius: 7px;
padding: 7px 8px;
background: rgba(141, 141, 141, 0.18);
outline-offset: 2px;
outline: 2px solid #81ABDF00;
transition-duration: .15s;
transition-timing-function: ease-in-out;
}
textview:focus-within {
outline-offset: -2px;
outline: 2px solid #81ABDF;
}
revealer#infobar > box {
padding: 8px;
border-spacing: 12px;
border-bottom: 1px solid lighten(darken(#f6f5f4, 18%), 5%);
background-color: #f1e6d9;
}

View File

@@ -1,14 +1,25 @@
use adw::gdk::Display;
use gtk4 as gtk;
use gtk::{
style_context_add_provider_for_display, CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION,
style_context_add_provider_for_display, CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION, Settings
};
pub fn load_css() {
pub fn load_css(settings: &Settings) {
let style_provider = CssProvider::new();
style_provider.load_from_string(include_str!("base.css"));
let theme = settings.gtk_theme_name();
match theme {
Some(theme_type) => {
let theme_string = theme_type.to_string();
if theme_string.contains("dark") || settings.is_gtk_application_prefer_dark_theme() {
style_provider.load_from_string(include_str!("base_dark.css"));
} else {
style_provider.load_from_string(include_str!("base_light.css"));
}
},
None => eprintln!("Theme hasn't been determined."),
}
style_context_add_provider_for_display(
&Display::default().expect("Could not connect to a display"),

View File

@@ -1,7 +1,6 @@
use crate::model::builder_traits::*;
use adw::HeaderBar;
use gtk4 as gtk;
use gtk::{prelude::*, StackTransitionType::SlideLeftRight, *};
@@ -19,7 +18,18 @@ use crate::view::{
use super::{components::MenuActions, styles::load_css};
pub fn ui(application: &adw::Application) {
load_css();
let default_settings = Settings::default();
if let Some(settings) = default_settings {
{
#[cfg(target_os = "windows")]
settings.set_gtk_font_name(Some("Segoe UI 9"));
}
settings.connect_gtk_application_prefer_dark_theme_notify(load_css);
settings.connect_gtk_theme_name_notify(load_css);
load_css(&settings);
}
let hamming_code = Box::builder()
.orientation(Orientation::Vertical)
@@ -30,7 +40,7 @@ pub fn ui(application: &adw::Application) {
let info_bar = InfoBar::builder()
.set_text_label("Sample text")
.set_button_icon("close")
.set_button_icon("window-close-symbolic")
.build();
hamming_code::hamming_code_page(&hamming_code);
@@ -76,7 +86,7 @@ pub fn ui(application: &adw::Application) {
.hexpand(true)
.vexpand(true)
.use_markup(true)
.label("<b>Комплексная программа для лаб. работ</b>")
.label("<span size=\"larger\"><b>Комплексная программа для лаб. работ</b></span>")
.build(),
);
title_bar.append(menu_button.get_button());