From 417bfa9c32645cf5584aea626b8b8f721627e10b Mon Sep 17 00:00:00 2001
From: hex <hex@iwakura.rip>
Date: Sat, 8 Feb 2025 13:28:45 +0000
Subject: [PATCH 1/3] feat: create base class for xmpp connections

---
 App.h | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/App.h b/App.h
index 4c75c69..961acee 100644
--- a/App.h
+++ b/App.h
@@ -3,6 +3,8 @@
 
 #include <Message.h>
 #include <Window.h>
+#include <gloox/connectionlistener.h>
+#include <gloox/presencehandler.h>
 
 #define APP_NAME   "Renga"
 #define APP_AUTHOR "hex_andre"
@@ -11,6 +13,10 @@ const uint32 msgConnectButtonClicked = 'mCBC';
 
 #include <Application.h>
 
+class Client : public gloox::ConnectionListener, gloox::PresenceHandler {
+
+};
+
 class App : public BApplication
 {
 	public:
@@ -18,7 +24,7 @@ class App : public BApplication
 		virtual void MessageReceived(BMessage *msg);
 		BWindow *ConnectWindow;
 		BWindow *ContactsWindow;
+		Client *client;
 };
 
-
 #endif

From 43deda8646fe497449b0d5c39fbb3dc57701cdde Mon Sep 17 00:00:00 2001
From: hex <hex@iwakura.rip>
Date: Sat, 8 Feb 2025 15:16:28 +0000
Subject: [PATCH 2/3] temp

---
 App.cpp | 32 +++++++++++++++++++++++++-------
 App.h   |  2 +-
 2 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/App.cpp b/App.cpp
index b725e5a..4f8f2e9 100644
--- a/App.cpp
+++ b/App.cpp
@@ -1,5 +1,6 @@
 #include "App.h"
 #include <Application.h>
+#include <GridLayout.h>
 #include <GroupLayout.h>
 #include <InterfaceDefs.h>
 #include <Layout.h>
@@ -8,13 +9,14 @@
 #include <Rect.h>
 #include <String.h>
 #include <StringView.h>
-#include <GroupLayoutBuilder.h>
 #include <Window.h>
+#include <GroupLayoutBuilder.h>
+#include <GridLayoutBuilder.h>
 #include <Button.h>
 #include <cstdio>
 #include <format>
-#include <iostream>
 #include "Contacts.h"
+#include <TextControl.h>
 
 // quick and dirty function to quickly make text labels
 BStringView *MakeText(const char* text) 
@@ -24,18 +26,21 @@ BStringView *MakeText(const char* text)
 
 App::App(void) : BApplication(std::format("application/x-vnd.{}-{}", APP_AUTHOR, APP_NAME).c_str())
 {
-	std::cout << "hello world!!\n";
 	// Initialize BRect frame for window
 	BRect frame(100, 100, 500, 400);
-
+	
 	// Initialize parent group for all UI elements to sit in. This is so they all get grouped nicely together
 	BGroupLayout *pGroup = new BGroupLayout(B_HORIZONTAL);
+
 	// Create window
-	BWindow *window = new BWindow(frame, std::format("{} by {}", APP_NAME, APP_AUTHOR).c_str(), B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS);
+	BWindow *window = new BWindow(frame, std::format("{}", APP_NAME).c_str(), B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS);
 
 	// Set window layout to parent group created earlier
 	window->SetLayout(pGroup);
 
+	pGroup->View()->AdoptSystemColors();
+
+	/*
 	// Initialize special UI group for all of our "real" elements
 	BGroupLayout *uGroup = new BGroupLayout(B_HORIZONTAL, 100);
 	// Add label group to parent group
@@ -45,10 +50,23 @@ App::App(void) : BApplication(std::format("application/x-vnd.{}-{}", APP_AUTHOR,
 	uGroup->SetExplicitAlignment(BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
 
 	// And finally, add a button!!
-	BButton *connectButton = new BButton(frame, "connect", "Connect to XMPP", new BMessage(msgConnectButtonClicked));
-	connectButton->SetTarget(this);
 
 	uGroup->AddView(connectButton);
+	*/
+	BGridLayout *uiElems = new BGridLayout(10, 0);
+	pGroup->AddItem(uiElems);
+	uiElems->SetExplicitAlignment(BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
+
+	BButton *connectButton = new BButton(frame, "connect", "Connect!", new BMessage(msgConnectButtonClicked));
+	connectButton->SetTarget(this);
+
+	BTextControl *jidInput = new BTextControl("jidinput", "JID:", "Placeholder", new BMessage(msgConnectButtonClicked));
+	BTextControl *pwInput = new BTextControl("jidinput", "JID:", "Placeholder", new BMessage(msgConnectButtonClicked));
+
+	uiElems->AddView(jidInput, 0, 0);
+	uiElems->AddView(MakeText("Password placeholder"), 0, 1);
+	uiElems->AddView(connectButton, 0, 2);
+	uiElems->SetMinRowHeight(2, 75);
 
 	window->Show();
 
diff --git a/App.h b/App.h
index 961acee..92db1db 100644
--- a/App.h
+++ b/App.h
@@ -7,7 +7,7 @@
 #include <gloox/presencehandler.h>
 
 #define APP_NAME   "Renga"
-#define APP_AUTHOR "hex_andre"
+#define APP_AUTHOR "hex&andre"
 
 const uint32 msgConnectButtonClicked = 'mCBC';
 

From f33e0aca06a988fcd5eaecfe9a8644ec7e649010 Mon Sep 17 00:00:00 2001
From: hex <hex@iwakura.rip>
Date: Sat, 8 Feb 2025 20:48:05 +0000
Subject: [PATCH 3/3] feat: finish UI + chore: organize all windows into
 separate files

---
 App.cpp                | 102 -----------------------------------------
 Contacts.cpp           |  14 ------
 Contacts.h             |   3 --
 Makefile               |   2 +-
 src/App.cpp            |  17 +++++++
 App.h => src/App.h     |  11 +----
 src/gui/Contacts.cpp   |  11 +++++
 src/gui/Contacts.h     |  12 +++++
 src/gui/MainWindow.cpp |  87 +++++++++++++++++++++++++++++++++++
 src/gui/MainWindow.h   |  19 ++++++++
 10 files changed, 149 insertions(+), 129 deletions(-)
 delete mode 100644 App.cpp
 delete mode 100644 Contacts.cpp
 delete mode 100644 Contacts.h
 create mode 100644 src/App.cpp
 rename App.h => src/App.h (61%)
 create mode 100644 src/gui/Contacts.cpp
 create mode 100644 src/gui/Contacts.h
 create mode 100644 src/gui/MainWindow.cpp
 create mode 100644 src/gui/MainWindow.h

diff --git a/App.cpp b/App.cpp
deleted file mode 100644
index 4f8f2e9..0000000
--- a/App.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "App.h"
-#include <Application.h>
-#include <GridLayout.h>
-#include <GroupLayout.h>
-#include <InterfaceDefs.h>
-#include <Layout.h>
-#include <LayoutItem.h>
-#include <Message.h>
-#include <Rect.h>
-#include <String.h>
-#include <StringView.h>
-#include <Window.h>
-#include <GroupLayoutBuilder.h>
-#include <GridLayoutBuilder.h>
-#include <Button.h>
-#include <cstdio>
-#include <format>
-#include "Contacts.h"
-#include <TextControl.h>
-
-// quick and dirty function to quickly make text labels
-BStringView *MakeText(const char* text) 
-{
-	return new BStringView("rstr", text);
-}
-
-App::App(void) : BApplication(std::format("application/x-vnd.{}-{}", APP_AUTHOR, APP_NAME).c_str())
-{
-	// Initialize BRect frame for window
-	BRect frame(100, 100, 500, 400);
-	
-	// Initialize parent group for all UI elements to sit in. This is so they all get grouped nicely together
-	BGroupLayout *pGroup = new BGroupLayout(B_HORIZONTAL);
-
-	// Create window
-	BWindow *window = new BWindow(frame, std::format("{}", APP_NAME).c_str(), B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS);
-
-	// Set window layout to parent group created earlier
-	window->SetLayout(pGroup);
-
-	pGroup->View()->AdoptSystemColors();
-
-	/*
-	// Initialize special UI group for all of our "real" elements
-	BGroupLayout *uGroup = new BGroupLayout(B_HORIZONTAL, 100);
-	// Add label group to parent group
-	pGroup->AddItem(uGroup);
-
-	// Center label group
-	uGroup->SetExplicitAlignment(BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
-
-	// And finally, add a button!!
-
-	uGroup->AddView(connectButton);
-	*/
-	BGridLayout *uiElems = new BGridLayout(10, 0);
-	pGroup->AddItem(uiElems);
-	uiElems->SetExplicitAlignment(BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
-
-	BButton *connectButton = new BButton(frame, "connect", "Connect!", new BMessage(msgConnectButtonClicked));
-	connectButton->SetTarget(this);
-
-	BTextControl *jidInput = new BTextControl("jidinput", "JID:", "Placeholder", new BMessage(msgConnectButtonClicked));
-	BTextControl *pwInput = new BTextControl("jidinput", "JID:", "Placeholder", new BMessage(msgConnectButtonClicked));
-
-	uiElems->AddView(jidInput, 0, 0);
-	uiElems->AddView(MakeText("Password placeholder"), 0, 1);
-	uiElems->AddView(connectButton, 0, 2);
-	uiElems->SetMinRowHeight(2, 75);
-
-	window->Show();
-
-	App::ConnectWindow = window;
-}
-
-void App::MessageReceived(BMessage *msg) 
-{
-	switch(msg->what) {
-		case msgConnectButtonClicked:
-			{	
-				printf("Connect button clicked...\n");
-				App::ConnectWindow->Hide();
-				App::ContactsWindow = ShowContacts();
-				break;
-			}
-		default:
-			{
-				printf("Unknown message received: %d\n", msg->what);
-				BApplication::MessageReceived(msg);
-				break;
-			}
-	}
-}
-
-int main(void)
-{
-	App *app = new App();
-	app->Run();
-
-	delete app;
-	return 0;
-}
diff --git a/Contacts.cpp b/Contacts.cpp
deleted file mode 100644
index 587ea3f..0000000
--- a/Contacts.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "Contacts.h"
-#include "App.h"
-#include <Application.h>
-#include <Rect.h>
-#include <Window.h>
-
-BWindow *ShowContacts()
-{
-	//          POS     W   H
-	BRect frame(200,200,600,400);
-	BWindow *window = new BWindow(frame, "Contacts List", B_TITLED_WINDOW, B_NOT_MINIMIZABLE | B_QUIT_ON_WINDOW_CLOSE); 
-	window->Show();
-	return window;
-}
diff --git a/Contacts.h b/Contacts.h
deleted file mode 100644
index fc892f5..0000000
--- a/Contacts.h
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "App.h"
-#include <Window.h>
-extern BWindow *ShowContacts();
diff --git a/Makefile b/Makefile
index ac34d7b..de29a3a 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ FLAGS=-lbe -std=c++20 -lstdc++
 all: build
 
 build:
-	$(CPP) *.cpp -o $(BINARY) $(FLAGS) 
+	$(CPP) $(shell find ./src | grep cpp) -o $(BINARY) $(FLAGS) 
 test: build
 	./renga
 
diff --git a/src/App.cpp b/src/App.cpp
new file mode 100644
index 0000000..e06bb8b
--- /dev/null
+++ b/src/App.cpp
@@ -0,0 +1,17 @@
+#include "App.h"
+#include "gui/MainWindow.h"
+
+App::App(void) : BApplication(kSignature)
+{
+	MainWindow *mainWindow = new MainWindow();
+	mainWindow->Show();
+}
+
+int main(void)
+{
+	App *app = new App();
+	app->Run();
+
+	delete app;
+	return 0;
+}
diff --git a/App.h b/src/App.h
similarity index 61%
rename from App.h
rename to src/App.h
index 92db1db..462a3a2 100644
--- a/App.h
+++ b/src/App.h
@@ -5,14 +5,10 @@
 #include <Window.h>
 #include <gloox/connectionlistener.h>
 #include <gloox/presencehandler.h>
-
-#define APP_NAME   "Renga"
-#define APP_AUTHOR "hex&andre"
-
-const uint32 msgConnectButtonClicked = 'mCBC';
-
 #include <Application.h>
 
+#define kSignature "application/x-vnd.iwakura-Renga"
+
 class Client : public gloox::ConnectionListener, gloox::PresenceHandler {
 
 };
@@ -21,9 +17,6 @@ class App : public BApplication
 {
 	public:
 		App(void);
-		virtual void MessageReceived(BMessage *msg);
-		BWindow *ConnectWindow;
-		BWindow *ContactsWindow;
 		Client *client;
 };
 
diff --git a/src/gui/Contacts.cpp b/src/gui/Contacts.cpp
new file mode 100644
index 0000000..3276cb6
--- /dev/null
+++ b/src/gui/Contacts.cpp
@@ -0,0 +1,11 @@
+#include "Contacts.h"
+#include <Application.h>
+#include <Rect.h>
+#include <Window.h>
+#include <StringView.h>
+
+Contacts::Contacts(void) 
+	: 	BWindow(BRect(200,200,600,400), TITLE, B_TITLED_WINDOW, B_NOT_MINIMIZABLE | B_QUIT_ON_WINDOW_CLOSE)
+{
+	AddChild(new BStringView("label", "Placeholder label (contact list to be added)"));
+}
diff --git a/src/gui/Contacts.h b/src/gui/Contacts.h
new file mode 100644
index 0000000..21ac43d
--- /dev/null
+++ b/src/gui/Contacts.h
@@ -0,0 +1,12 @@
+#ifndef CONTACTS_H
+#define CONTACTS_H
+
+#include <Window.h>
+#define TITLE "Contact List"
+
+class Contacts : public BWindow {
+	public:
+		Contacts(void);
+};
+
+#endif
diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp
new file mode 100644
index 0000000..8ef0143
--- /dev/null
+++ b/src/gui/MainWindow.cpp
@@ -0,0 +1,87 @@
+#include "MainWindow.h"
+#include <Alignment.h>
+#include <Application.h>
+#include <GridLayout.h>
+#include <GroupLayout.h>
+#include <InterfaceDefs.h>
+#include <Layout.h>
+#include <LayoutItem.h>
+#include <Message.h>
+#include <Rect.h>
+#include <String.h>
+#include <StringView.h>
+#include <TextView.h>
+#include <View.h>
+#include <Window.h>
+#include <GroupLayoutBuilder.h>
+#include <GridLayoutBuilder.h>
+#include <Button.h>
+#include <cstdio>
+#include "Contacts.h"
+#include <TextControl.h>
+
+MainWindow::MainWindow(void) 
+	:	BWindow(BRect(100, 100, 500, 400), "Renga", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE)
+{
+	// parent layout (defines the entire window layout)
+	BGroupLayout *pGroup = new BGroupLayout(B_HORIZONTAL);
+	SetLayout(pGroup);
+
+	// make sure window uses window colors set in haiku preferences (equivelant to system themes)
+	pGroup->View()->AdoptSystemColors();
+
+	// prepare "renga" text banner
+	BStringView *banner = new BStringView("banner", "Renga");
+
+	banner->SetHighColor(135,1,1);
+	banner->SetFontSize(28.0);
+
+	// ui layout (parent of all UI elements visible to the user)
+	BGridLayout *uiElems = new BGridLayout(10, 0);
+
+	pGroup->AddItem(uiElems);
+
+	// center the entire UI
+	uiElems->SetExplicitAlignment(BAlignment(B_ALIGN_HORIZONTAL_CENTER, B_ALIGN_VERTICAL_CENTER));
+
+	BButton *connectButton = new BButton(Frame(), "connect", "Connect!", new BMessage(msgConnectButtonClicked));
+	connectButton->SetTarget(this);
+
+	BTextControl *jidInput = new BTextControl("jidinput", "JID:", "Placeholder", new BMessage(msgConnectButtonClicked));
+	BTextControl *pwInput = new BTextControl("pwinput", "Password:", "Placeholder", new BMessage(msgConnectButtonClicked));
+
+	pwInput->TextView()->HideTyping(true);
+
+	jidInput->SetExplicitSize(BSize(200,23));
+	pwInput->SetExplicitSize(BSize(200,23));
+
+	uiElems->AddView(banner, 0, 0);
+	uiElems->AddView(jidInput, 0, 1);
+	uiElems->AddView(pwInput, 0, 2);
+	uiElems->AddView(connectButton, 0, 3);
+	uiElems->SetMinRowHeight(3, 75);
+	uiElems->SetMinRowHeight(0, 25);
+
+	Show();
+}
+
+
+void MainWindow::MessageReceived(BMessage *msg) 
+{
+	switch(msg->what) {
+		case msgConnectButtonClicked:
+			{	
+				printf("Connect button clicked...\n");
+
+				Hide();
+				Contacts *contacts = new Contacts();
+				contacts->Show();
+				break;
+			}
+		default:
+			{
+				printf("Unknown message received: %d\n", msg->what);
+				break;
+			}
+	}
+}
diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h
new file mode 100644
index 0000000..0af4989
--- /dev/null
+++ b/src/gui/MainWindow.h
@@ -0,0 +1,19 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <Message.h>
+#include <Window.h>
+#include <Application.h>
+#include <gloox/connectionlistener.h>
+#include <gloox/presencehandler.h>
+
+const uint32 msgConnectButtonClicked = 'mCBC';
+
+class MainWindow : public BWindow
+{
+	public:
+		MainWindow(void);
+		virtual void MessageReceived(BMessage *msg);
+};
+
+#endif