diff --git a/README.md b/README.md
index 0a0218b..1768639 100644
--- a/README.md
+++ b/README.md
@@ -40,8 +40,9 @@ MultiApp/ // Core application files
- 🎉 Simple internet browser
- 🎉 Fractal creator
- 🎉 Local chat app
-- ❌ Maze generator/player/solver
- ❌ Game of life
+- ❌ Maze generator/player/solver
+- ❌ Music player
- ❌ Local AI chat with ollama
- 🔬 Other goodies in the future
diff --git a/res/gtk/main_app.ui b/res/gtk/main_app.ui
index 8cf816c..070ef40 100644
--- a/res/gtk/main_app.ui
+++ b/res/gtk/main_app.ui
@@ -16,42 +16,6 @@
diff --git a/src/browser_app.cc b/src/browser_app.cc
index ec470f9..c13a255 100644
--- a/src/browser_app.cc
+++ b/src/browser_app.cc
@@ -44,31 +44,31 @@ Browser::Browser() : Gtk::Box(Gtk::Orientation::VERTICAL) {
if(back_button) [[likely]]
back_button->signal_clicked().connect
(
- [this](){ webkit_web_view_go_back(web_view);}
+ [this]{ webkit_web_view_go_back(web_view);}
);
if(forward_button) [[likely]]
forward_button->signal_clicked().connect
(
- [this](){ webkit_web_view_go_forward(web_view);}
+ [this]{ webkit_web_view_go_forward(web_view);}
);
if(home_button) [[likely]]
home_button->signal_clicked().connect
(
- [this](){ entry_uri_load(HOME_URL);}
+ [this]{ entry_uri_load(HOME_URL);}
);
if(reload_button) [[likely]]
reload_button->signal_clicked().connect
(
- [this]() {
+ [this] {
webkit_web_view_is_loading(web_view) ?
webkit_web_view_stop_loading(web_view) :
webkit_web_view_reload(web_view);
}
);
if(uri_entry) [[likely]] {
- uri_entry->signal_activate().connect([this](){ entry_uri_load();});
+ uri_entry->signal_activate().connect([this]{ entry_uri_load();});
if(enter_button) [[likely]]
- enter_button->signal_clicked().connect([this](){ entry_uri_load();});
+ enter_button->signal_clicked().connect([this]{ entry_uri_load();});
}
// Menu button not visible as no usage needed for the moment
if(menu_button) [[likely]] menu_button->set_visible(false);
diff --git a/src/chat_app.cc b/src/chat_app.cc
index 1fbf9b4..7fb45ce 100644
--- a/src/chat_app.cc
+++ b/src/chat_app.cc
@@ -41,18 +41,18 @@ Chat::Chat() : Gtk::Box(Gtk::Orientation::VERTICAL) {
// Add Callbacks
if(home_button) [[likely]]
home_button->signal_clicked().connect
- ( [this](){ ip_entry->set_text(LOCALHOST); port_entry->set_text(DEFAULT_PORT); } );
+ ( [this]{ ip_entry->set_text(LOCALHOST); port_entry->set_text(DEFAULT_PORT); } );
if(ip_entry) [[likely]]
- ip_entry->signal_activate().connect([this](){ session_connection(); });
+ ip_entry->signal_activate().connect([this]{ session_connection(); });
if(port_entry) [[likely]]
- port_entry->signal_activate().connect([this](){ session_connection(); });
+ port_entry->signal_activate().connect([this]{ session_connection(); });
if(connect_button) [[likely]]
- connect_button->signal_clicked().connect([this](){ session_connection(); });
+ connect_button->signal_clicked().connect([this]{ session_connection(); });
if(message_entry) [[likely]]
- message_entry->signal_activate().connect( [this] () { message_buffer(); });
+ message_entry->signal_activate().connect( [this] { message_buffer(); });
if(message_button) [[likely]]
- message_button->signal_clicked().connect( [this] () { message_buffer(); });
+ message_button->signal_clicked().connect( [this] { message_buffer(); });
// Insert elements into Browser Box
insert_child_at_start(*header);
@@ -132,11 +132,11 @@ void Chat::session_connection() {
footer_box->set_visible(true);
message_entry->grab_focus();
- session->set_disconnecter([this]() {
- Glib::signal_idle().connect_once([this]() { session_connection(); });
+ session->set_disconnecter([this] {
+ Glib::signal_idle().connect_once([this] { session_connection(); });
});
dispatcher = std::make_unique();
- dispatcher->connect([this]() {
+ dispatcher->connect([this] {
std::lock_guard lock(session->receive_mutex);
while (!session->receive_queue.empty()) {
std::string message{std::move(session->receive_queue.front())};
@@ -165,13 +165,13 @@ void Chat::session_connection() {
bubble->set_wrap_mode(Pango::WrapMode::WORD_CHAR);
chat_box->append(*bubble);
- Glib::signal_idle().connect_once([this]() {
+ Glib::signal_idle().connect_once([this] {
auto adj = chat_scrolled->get_vadjustment();
adj->set_value(adj->get_upper() - adj->get_page_size());
});
}
});
- session->set_poster([this]() { dispatcher->emit(); });
+ session->set_poster([this] { dispatcher->emit(); });
}
void Chat::message_buffer () {
diff --git a/src/fractal_app.cc b/src/fractal_app.cc
index 1b7ced2..c82e96b 100644
--- a/src/fractal_app.cc
+++ b/src/fractal_app.cc
@@ -160,7 +160,7 @@ void FractalArea::on_draw(const Cairo::RefPtr& cr, int w, int h)
}
-FractalBox::FractalBox() : Gtk::Box(Gtk::Orientation::HORIZONTAL) {
+Fractal::Fractal() : Gtk::Box(Gtk::Orientation::HORIZONTAL) {
// Load the GtkBuilder file and instantiate its widgets, check for errors
auto ref_builder {Gtk::Builder::create()};
try {
@@ -189,19 +189,19 @@ FractalBox::FractalBox() : Gtk::Box(Gtk::Orientation::HORIZONTAL) {
if(reset_button) [[likely]]
reset_button->signal_clicked().connect
(
- [this](){ fractal_area->reset(); }
+ [this]{ fractal_area->reset(); }
);
if(save_button) [[likely]] {
save_button->signal_clicked().connect
(
- [](){ std::cout << "Save button pressed!" << std::endl;}
+ []{ std::cout << "Save button pressed!" << std::endl;}
);
save_button->set_visible(false); //Set visible false until new way of creating a dialog is available
}
if(fractal_dropdown) [[likely]]
fractal_dropdown->property_selected().signal_changed().connect
(
- [this](){
+ [this]{
selection = std::dynamic_pointer_cast(fractal_dropdown->get_selected_item())->get_string();
fractal_area->set_selection(selection);
if (selection != "Julia")
@@ -274,7 +274,7 @@ FractalBox::FractalBox() : Gtk::Box(Gtk::Orientation::HORIZONTAL) {
}
-void FractalBox::on_realize() {
+void Fractal::on_realize() {
Gtk::Box::on_realize();
selection = std::dynamic_pointer_cast(fractal_dropdown->get_selected_item())->get_string();
status_label = dynamic_cast(get_parent()->get_parent()->get_parent()->get_parent()->get_last_child());
diff --git a/src/include/fractal_app.hpp b/src/include/fractal_app.hpp
index 2d75b75..5dab490 100644
--- a/src/include/fractal_app.hpp
+++ b/src/include/fractal_app.hpp
@@ -165,7 +165,7 @@ class FractalArea : public Gtk::DrawingArea {
* Gtk::Box implementing class that contains important Gtk Widgets
* for loading, displaying and saving fractals.
*/
-class FractalBox : public Gtk::Box {
+class Fractal : public Gtk::Box {
friend class FractalTest;
friend class FractalTest_FractalFunctionalTest_Test;
@@ -176,7 +176,7 @@ class FractalBox : public Gtk::Box {
* Creates FractalBox object using res/gtk/fractal_app.ui file,
* Checks for file issues, gets Widgets and connects needed signals.
*/
- FractalBox();
+ Fractal();
private:
std::string selection{};
diff --git a/src/include/main_application.hpp b/src/include/main_application.hpp
index a88b35e..252c273 100644
--- a/src/include/main_application.hpp
+++ b/src/include/main_application.hpp
@@ -27,6 +27,8 @@ class MainApplication : public Gtk::Application {
Gtk::ApplicationWindow *main_window{};
Gtk::Box *selected_app{};
+ std::vector>> apps{};
+
/**
* @brief Creates ApplicationWindow to show.
*
diff --git a/src/main_application.cc b/src/main_application.cc
index aacbac6..711b05f 100644
--- a/src/main_application.cc
+++ b/src/main_application.cc
@@ -1,4 +1,5 @@
#include "include/main_application.hpp"
+#include "gtkmm/object.h"
#include "include/browser_app.hpp"
#include "include/fractal_app.hpp"
#include "include/chat_app.hpp"
@@ -8,7 +9,12 @@
#include
MainApplication::MainApplication() :
- Gtk::Application("org.xchel.multiapp", Gio::Application::Flags::HANDLES_OPEN | Gio::Application::Flags::NON_UNIQUE) {}
+ Gtk::Application("org.xchel.multiapp", Gio::Application::Flags::HANDLES_OPEN | Gio::Application::Flags::NON_UNIQUE),
+ apps ({
+ {"Chat", [] { return new Chat(); }},
+ {"Fractal", [] { return new Fractal(); }},
+ {"Browser", [] { return new Browser(); }}
+ }) {}
Glib::RefPtr MainApplication::create() {
return Glib::make_refptr_for_instance(new MainApplication());
@@ -39,32 +45,22 @@ Gtk::ApplicationWindow* MainApplication::create_window() {
main_window = Gtk::manage(ref_builder->get_widget("main_window"));
auto main_notebook {Gtk::manage(ref_builder->get_widget("main_notebook"))};
- auto main_box {Gtk::manage(ref_builder->get_widget("Chat"))};
+ for ( auto app : apps ) {
+ main_notebook->append_page(
+ *Gtk::manage(new Gtk::Box()),
+ *Gtk::manage(new Gtk::Label(app.first))
+ );
+ }
+ auto main_box {Gtk::manage(dynamic_cast(main_notebook->get_nth_page(0)))};
selected_app = Gtk::manage(new Chat());
main_box->append(*selected_app);
main_notebook->signal_switch_page().connect([this](Gtk::Widget* page, guint page_number) {
+ if (selected_app) selected_app->unparent();
+ selected_app = Gtk::manage(apps[page_number].second());
auto app {dynamic_cast(page)};
- if (selected_app) {
- selected_app->unparent();
- selected_app = nullptr;
- }
-
- switch(page_number) {
- case 0:
- selected_app = Gtk::manage(new Chat());
- app->append(*selected_app);
- break;
- case 1:
- selected_app = Gtk::manage(new FractalBox());
- app->append(*selected_app);
- break;
- case 2:
- selected_app = Gtk::manage(new Browser());
- app->append(*selected_app);
- break;
- }
+ app->append(*selected_app);
});
add_window(*main_window);
diff --git a/src/session.cc b/src/session.cc
index 588df6a..e9bec2d 100644
--- a/src/session.cc
+++ b/src/session.cc
@@ -108,7 +108,7 @@ Client::Client(const std::string &host, unsigned port) :
asio::co_spawn(ioc, sender(connection), asio::detached);
// Run the event loop in separate thread until ioc.stop() is called
- ioc_thread = std::thread([this](){ ioc.run(); });
+ ioc_thread = std::thread([this]{ ioc.run(); });
std::cout << "[Client] connected to " << host << ":" << port << "\n";
}
@@ -145,7 +145,7 @@ Server::Server(unsigned port) : Session::Session(),
acceptor (tcp::acceptor(ioc, tcp::endpoint(tcp::v4(), static_cast(port)))) {
type = "Server";
asio::co_spawn(ioc, accept_loop(), asio::detached);
- ioc_thread = std::thread([this](){ ioc.run(); });
+ ioc_thread = std::thread([this]{ ioc.run(); });
std::cout << "[" + type + "] listening on port " << port << "\n";
}
diff --git a/tests/chat_app_tests.cc b/tests/chat_app_tests.cc
index 7072ea1..0fe8316 100644
--- a/tests/chat_app_tests.cc
+++ b/tests/chat_app_tests.cc
@@ -74,14 +74,14 @@ TEST_F(ChatTest, ChatFunctionalTest) {
ASSERT_THAT(std::regex_search(server->session->receive_queue.front(), std::regex("User\\d says Hi!!!")), ::testing::Eq(true));
// Check poster and disconnecter setters
- server->session->set_poster([this](){ std::cout << "Posting message from Server..." << std::endl; });
- server->session->set_disconnecter([this](){ std::cout << "Disconnecting from Server..." << std::endl; });
+ server->session->set_poster([this]{ std::cout << "Posting message from Server..." << std::endl; });
+ server->session->set_disconnecter([this]{ std::cout << "Disconnecting from Server..." << std::endl; });
ASSERT_THAT(server->session->poster, ::testing::NotNull());
ASSERT_THAT(server->session->disconnecter, ::testing::NotNull());
server->session->poster();
server->session->disconnecter();
- client_1->session->set_poster([this](){ std::cout << "Posting message from Client..." << std::endl; });
- client_1->session->set_disconnecter([this](){ std::cout << "Disconnecting from Client..." << std::endl; });
+ client_1->session->set_poster([this]{ std::cout << "Posting message from Client..." << std::endl; });
+ client_1->session->set_disconnecter([this]{ std::cout << "Disconnecting from Client..." << std::endl; });
ASSERT_THAT(client_1->session->poster, ::testing::NotNull());
ASSERT_THAT(client_1->session->disconnecter, ::testing::NotNull());
client_1->session->poster();
diff --git a/tests/fractal_app_tests.cc b/tests/fractal_app_tests.cc
index 0a0f673..efd7668 100644
--- a/tests/fractal_app_tests.cc
+++ b/tests/fractal_app_tests.cc
@@ -6,7 +6,8 @@
#include
-FractalTest::FractalTest() : fractal (Gtk::manage(new FractalBox())),
+FractalTest::FractalTest() :
+ fractal (Gtk::manage(new Fractal())),
menu (fractal->menu),
consts_box (fractal->consts_box),
reset_button (fractal->reset_button),
diff --git a/tests/include/tests.hpp b/tests/include/tests.hpp
index 0b42445..40ffba6 100644
--- a/tests/include/tests.hpp
+++ b/tests/include/tests.hpp
@@ -72,7 +72,7 @@ class FractalTest : public testing::Test {
* */
FractalTest();
- FractalBox *fractal{};
+ Fractal *fractal{};
Gtk::Box *menu{};
Gtk::Box *consts_box{};
Gtk::Button *reset_button{};