Skip to content

Commit b543544

Browse files
Merge pull request #54 from Reim-developer/dev
Implement new helper function for class `ThemeManager`
2 parents 6526836 + 6030feb commit b543544

4 files changed

Lines changed: 116 additions & 37 deletions

File tree

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
cmake_minimum_required(VERSION 3.19)
22
project(Lazyboard)
33

4-
set(CMAKE_CXX_STANDARD_REQUIRED 20)
5-
set(CMAKE_C_STANDARD_REQUIRED 99)
4+
set(CMAKE_CXX_STANDARD 20)
5+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
66

77
set(CMAKE_AUTOMOC ON)
88
find_package(Qt6 REQUIRED COMPONENTS Widgets Gui Core)

src/front_end/include/theme_manager.hxx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,35 @@
55
#include <qwidget.h>
66

77
#include <memory>
8+
#include <string_view>
89

910
#include "../../ffi/raw/config.hxx"
1011

12+
using std::string_view;
1113
using std::unique_ptr;
1214

1315
namespace Lazyboard::front_end {
1416
class ThemeManager {
17+
private:
18+
const char *data(string_view sv) noexcept { return sv.data(); }
19+
20+
private:
21+
struct GuiSettings {
22+
string_view background_color;
23+
string_view foreground_color;
24+
string_view background_button_color;
25+
string_view foreground_button_color;
26+
string_view background_table_header_color;
27+
string_view foreground_table_header_color;
28+
};
29+
30+
private:
31+
void on_invalid_hex_color_error(QMainWindow *main_window);
32+
auto gui_settings(RawAppConfig *raw_app_config) noexcept -> GuiSettings;
33+
1534
public:
1635
void set_main_window_theme(QMainWindow *main_window,
17-
RawAppConfig *raw_app_config);
36+
RawAppConfig *raw_app_config) noexcept;
1837
};
1938
} // namespace Lazyboard::front_end
2039

src/front_end/theme_manager.cxx

Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,69 +2,98 @@
22

33
#include <qmainwindow.h>
44
#include <qmessagebox.h>
5+
#include <qobject.h>
6+
#include <qtypes.h>
57

68
#include <memory>
79
#include <sstream>
810
#include <string>
911

1012
#include "../ffi/namespace/include/config.hxx"
13+
#include "../front_end_utils/include/error_types.hxx"
14+
#include "../front_end_utils/include/utils.hxx"
1115

1216
#if defined(LAZY_DEBUG)
1317
#include <iostream>
1418
using std::cout;
1519
#endif
1620

17-
#include "../front_end_utils/include/error_types.hxx"
1821
using namespace Lazyboard::ffi;
1922
using Lazyboard::front_end_utils::error_to_string;
2023
using Lazyboard::front_end_utils::ErrorTypes;
24+
using Lazyboard::front_end_utils::is_valid_hex_color;
2125

2226
using std::make_unique;
2327
using std::string;
2428
using std::stringstream;
2529
using Self = Lazyboard::front_end::ThemeManager;
2630

31+
auto Self::gui_settings(RawAppConfig *raw_app_config) noexcept -> GuiSettings {
32+
// clang-format off
33+
auto raw_background_color = raw_app_config->raw_app_gui_settings.background_color;
34+
auto raw_foreground_color = raw_app_config->raw_app_gui_settings.foreground_color;
35+
auto raw_background_button_color = raw_app_config->raw_app_gui_settings.background_button_color;
36+
auto raw_foreground_button_color = raw_app_config->raw_app_gui_settings.foreground_button_color;
37+
auto raw_background_header_table_color = raw_app_config->raw_app_gui_settings.background_table_header_color;
38+
auto raw_foreground_header_table_color = raw_app_config->raw_app_gui_settings.foreground_table_header_color;
39+
40+
41+
auto settings_gui = GuiSettings {
42+
.background_color = raw_background_color,
43+
.foreground_color = raw_foreground_color,
44+
.background_button_color = raw_background_button_color,
45+
.foreground_button_color = raw_foreground_color,
46+
.background_table_header_color = raw_background_header_table_color,
47+
.foreground_table_header_color = raw_foreground_header_table_color,
48+
}; // clang-format on
49+
50+
return settings_gui;
51+
}
52+
53+
void Self::on_invalid_hex_color_error(QMainWindow *main_window) {
54+
// clang-format off
55+
const auto error_name = error_to_string(ErrorTypes::INVALID_HEX_COLOR);
56+
const auto error_message = QString(R"(
57+
Invalid HEX color, please check your TOML configuration
58+
Error name: %1
59+
)").arg(error_name.data()); // clang-format on
60+
61+
QMessageBox::critical(main_window, "Error", error_message);
62+
}
63+
2764
void Self::set_main_window_theme(QMainWindow *main_window,
28-
RawAppConfig *raw_app_config) {
29-
auto bg_color =
30-
string(raw_app_config->raw_app_gui_settings.background_color);
31-
auto fg_color =
32-
string(raw_app_config->raw_app_gui_settings.foreground_color);
33-
auto bg_button_color =
34-
string(raw_app_config->raw_app_gui_settings.background_button_color);
35-
auto fg_button_color =
36-
string(raw_app_config->raw_app_gui_settings.foreground_button_color);
37-
auto bg_header_table_color = string(
38-
raw_app_config->raw_app_gui_settings.background_table_header_color);
39-
auto fg_header_table_color = string(
40-
raw_app_config->raw_app_gui_settings.foreground_table_header_color);
41-
42-
auto bg_hex = QColor(QString::fromStdString(bg_color));
43-
auto fg_hex = QColor(QString::fromStdString(fg_color));
44-
auto bg_btn_hex = QColor(QString::fromStdString(bg_button_color));
45-
auto fg_btn_hex = QColor(QString::fromStdString(fg_button_color));
46-
auto bg_header_table_hex =
47-
QColor(QString::fromStdString(bg_header_table_color));
48-
auto fg_header_table_hex =
49-
QColor(QString::fromStdString(fg_header_table_color));
65+
RawAppConfig *raw_app_config) noexcept {
66+
auto settings_gui = this->gui_settings(raw_app_config);
5067

68+
// clang-format off
69+
auto bg_color = data(settings_gui.background_color);
70+
auto fg_color = data(settings_gui.foreground_color);
71+
auto bg_button_color = data(settings_gui.background_button_color);
72+
auto fg_button_color = data(settings_gui.foreground_button_color);
73+
auto bg_header_table_color = data(settings_gui.background_table_header_color);
74+
auto fg_header_table_color = data(settings_gui.foreground_table_header_color);
75+
// clang-format on
76+
77+
auto bg_hex = QColor(bg_color);
78+
auto fg_hex = QColor(fg_color);
79+
auto bg_btn_hex = QColor(bg_button_color);
80+
auto fg_btn_hex = QColor(fg_button_color);
81+
auto bg_header_table_hex = QColor(bg_header_table_color);
82+
auto fg_header_table_hex = QColor(fg_header_table_color);
5183
ffi::free_cstr_app_config(raw_app_config);
5284

53-
if (!bg_hex.isValid() || !fg_hex.isValid() || !bg_btn_hex.isValid() ||
54-
!fg_btn_hex.isValid() || !bg_header_table_hex.isValid() ||
55-
!fg_header_table_hex.isValid()) {
56-
// clang-format off
57-
const auto error_name = error_to_string(ErrorTypes::INVALID_HEX_COLOR);
58-
const auto error_message = QString(R"(
59-
Invalid HEX color, please check your TOML configuration
60-
Error name: %1
61-
)").arg(error_name.data()); // clang-format on
85+
const auto valid_color =
86+
is_valid_hex_color(bg_hex, fg_hex, bg_btn_hex, fg_btn_hex,
87+
bg_header_table_hex, fg_header_table_hex);
6288

63-
QMessageBox::critical(main_window, "Error", error_message);
89+
if (!valid_color) {
90+
on_invalid_hex_color_error(main_window);
6491

6592
// clang-format off
6693
#if defined (LAZY_DEBUG)
94+
const auto error_name = error_to_string(ErrorTypes::INVALID_HEX_COLOR);
6795
stringstream string_stream_debug;
96+
6897
string_stream_debug
6998
<< "[DEBUG] Found error when load TOML configuration:\n"
7099
<< "[DEBUG] Error Type: " << error_name << "\n"
@@ -93,7 +122,6 @@ Error name: %1
93122
R"""(
94123
QPushButton {
95124
background-color: %1;
96-
qproperty-autoFillBackground: true;
97125
color: %2;
98126
}
99127
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef FRONT_END_UTILS_HXX
2+
#define FRONT_END_UTILS_HXX
3+
4+
#include <qcolor.h>
5+
6+
#include <type_traits>
7+
8+
using std::is_same_v;
9+
using std::stringstream;
10+
namespace Lazyboard::front_end_utils {
11+
12+
template <typename T>
13+
concept is_qcolor = requires(const T& t) { QColor(t); };
14+
15+
template <is_qcolor... Args>
16+
inline constexpr bool is_valid_hex_color(const Args&... args) noexcept {
17+
return (
18+
[&]() {
19+
QColor color(args);
20+
21+
if (!color.isValid()) {
22+
return false;
23+
}
24+
25+
return true;
26+
}(),
27+
...);
28+
}
29+
30+
} // namespace Lazyboard::front_end_utils
31+
32+
#endif

0 commit comments

Comments
 (0)