Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 40 additions & 34 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Include Qt
find_package(Qt6 COMPONENTS Core Widgets WebSockets REQUIRED)
find_package(Qt6 COMPONENTS Core Widgets WebSockets Network REQUIRED)

# Set automoc for Qt
set(CMAKE_AUTOMOC ON)
Expand All @@ -15,50 +15,55 @@ set(CMAKE_AUTORCC ON)

set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/forms)


# Include directories
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)

# Source files
set(SOURCES
src/main.cpp
src/MainWindow.cpp
src/CodeEditorWidget.cpp
src/SyntaxHighlighter.cpp
src/LoginDialog.cpp
src/Document.cpp
src/User.cpp
src/CollaborationClient.cpp
src/CollaborationManager.cpp
src/CollaborationServer.cpp
src/EditOperation.cpp

src/main.cpp
src/MainWindow.cpp
src/CodeEditorWidget.cpp
src/SyntaxHighlighter.cpp
src/LoginDialog.cpp
src/Document.cpp
src/User.cpp
src/CollaborationClient.cpp
src/CollaborationManager.cpp
src/CollaborationServer.cpp
src/EditOperation.cpp
src/NetworkServer.cpp # ✅ New
src/NetworkClient.cpp # ✅ New
)

# Header files
set(HEADERS
include/MainWindow.h
include/CodeEditorWidget.h
include/SyntaxHighlighter.h
include/LoginDialog.h
include/Document.h
include/User.h
include/CollaborationClient.h
include/CollaborationManager.h
include/CollaborationServer.h
include/EditOperation.h
include/MainWindow.h
include/CodeEditorWidget.h
include/SyntaxHighlighter.h
include/LoginDialog.h
include/Document.h
include/User.h
include/CollaborationClient.h
include/CollaborationManager.h
include/CollaborationServer.h
include/EditOperation.h
include/NetworkServer.h # ✅ New
include/NetworkClient.h # ✅ New

)

# UI files
set(UI_FILES
forms/MainWindow.ui
forms/LoginDialog.ui
forms/MainWindow.ui
forms/LoginDialog.ui
)

# Add resources
# Resource files
set(RESOURCE_FILES
resources/CodeColab.qrc
resources/CodeColab.qrc
)

# Create executable
Expand All @@ -69,17 +74,18 @@ add_executable(codecolab ${SOURCES} ${HEADERS} ${UI_FILES} ${RESOURCE_FILES}

# Link Qt libraries
target_link_libraries(codecolab PRIVATE
Qt6::Core
Qt6::Widgets
Qt6::WebSockets
Qt6::Core
Qt6::Widgets
Qt6::WebSockets
Qt6::Network # ✅ Added
)

# Install
# Install step
install(TARGETS codecolab
RUNTIME DESTINATION bin
RUNTIME DESTINATION bin
)

# Create a resource file if it doesn't exist yet
# Resource setup if not present
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/CodeColab.qrc")
file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/resources/CodeColab.qrc" "<!DOCTYPE RCC>
<RCC version=\"1.0\">
Expand All @@ -101,6 +107,6 @@ if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/CodeColab.qrc")
")
endif()

# Create directories for resources
# Ensure directories exist
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/resources/icons")
file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/resources/styles")
8 changes: 6 additions & 2 deletions codecolab.pro
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ SOURCES += \
src/CollaborationManager.cpp \
src/CollaborationServer.cpp \
src/EditOperation.cpp \
src/UserStorage.cpp
src/UserStorage.cpp \
src/NetworkClient.cpp \
src/NetworkServer.cpp

HEADERS += \
include/MainWindow.h \
Expand All @@ -37,7 +39,9 @@ HEADERS += \
include/CollaborationManager.h \
include/CollaborationServer.h \
include/EditOperation.h \
include/UserStorage.h
include/UserStorage.h \
include/NetworkClient.h \
include/NetworkServer.h

FORMS += \
forms/MainWindow.ui \
Expand Down
5 changes: 4 additions & 1 deletion include/CodeEditorWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ class CodeEditorWidget : public QPlainTextEdit
void applyRemoteEdit(const EditOperation& operation);

void removeRemoteCursor(const QString& userId);
bool ignoreChanges;

signals:
void editorContentChanged(const QString& content);
void cursorPositionChanged(int position);
void textChangedAt(int pos, int charsRemoved, const QString& insertedText);

protected:
void paintEvent(QPaintEvent *event) override;
Expand All @@ -51,6 +53,7 @@ class CodeEditorWidget : public QPlainTextEdit
void resizeEvent(QResizeEvent *event) override;

private slots:
void onDocumentContentsChange(int position, int charsRemoved, int charsAdded);
void onTextChanged();
void onCursorPositionChanged();
void updateLineNumberAreaWidth(int newBlockCount);
Expand Down Expand Up @@ -89,7 +92,7 @@ private slots:
QMap<QString, RemoteCursor> remoteCursors;

// Track local changes to avoid loops
bool ignoreChanges;

};

#endif // CODEEDITORWIDGET_H
65 changes: 33 additions & 32 deletions include/MainWindow.h
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QString>
#include <memory>
#include <QElapsedTimer> // Add for Qt 6
#include <QRandomGenerator> // Add for Qt 6

#include "User.h"
#include <QElapsedTimer> // Qt 6
#include <QRandomGenerator> // Qt 6
#include <QMap>
#include <QJsonDocument>
#include <QTimer>
#include "ui_MainWindow.h"
#include "CodeEditorWidget.h"
#include "Document.h"
#include "CollaborationManager.h"
#include "User.h"
#include "CollaborationClient.h"
#include "CollaborationManager.h"
#include "NetworkServer.h"
#include "NetworkClient.h"

class CodeEditorWidget;
// Forward declarations
class LoginDialog;
class QTextEdit;
class QSplitter;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT
Expand All @@ -34,46 +35,46 @@ class MainWindow : public QMainWindow
// Add document to the editor
void addDocument(std::shared_ptr<Document> document);

private slots:
void onLogin();
private slots:
void showLoginDialog();
void onLogin();
void onLogout();
void onNewDocument();
void onOpenDocument();
void onSaveDocument();
void onShareDocument();
void onUserConnected(const QString &userId, const QString &username);
void onUserDisconnected(const QString &userId);
void onTextChanged();
void onCursorPositionChanged();
void onChatMessageReceived(const QString &userId, const QString &username, const QString &message);
void onSendChatMessage();
void onUserConnected(const QString& userId, const QString& username);
void onUserDisconnected(const QString& userId);
void onChatMessageReceived(const QString& userId, const QString& username, const QString& message);
void onRemoteTextChanged(const QString &message);

private:
void setupUI();
void setupConnections();
void updateTitle();
void updateStatusBar();
void updateUserList();
void showLoginDialog();
bool eventFilter(QObject *obj, QEvent *event) override;

Ui::MainWindow *ui;
std::unique_ptr<Ui::MainWindow> ui;
std::shared_ptr<CollaborationManager> collaborationManager;
std::unique_ptr<CollaborationClient> collaborationClient;
std::shared_ptr<Document> currentDocument;
std::shared_ptr<User> currentUser;
std::unique_ptr<CodeEditorWidget> codeEditor;
std::unique_ptr<QSplitter> mainSplitter;
std::unique_ptr<QSplitter> rightSplitter;
std::unique_ptr<QTextEdit> chatBox;
std::unique_ptr<QTextEdit> chatInput;
std::unique_ptr<QLabel> statusLabel;
std::unique_ptr<QSplitter> mainSplitter;
std::unique_ptr<QSplitter> rightSplitter;

// Core objects
std::shared_ptr<User> currentUser;
std::shared_ptr<Document> currentDocument;
std::shared_ptr<CollaborationManager> collaborationManager;
std::unique_ptr<CollaborationClient> collaborationClient;

// Track collaboration state
QMap<QString, QString> connectedUsers; // userId -> username
bool isCollaborating = false;
QMap<QString, QString> connectedUsers;
bool isCollaborating;
NetworkServer *server;
NetworkClient *client;
QString lastSentText;
QTimer *typingTimer;
};

#endif // MAINWINDOW_H
#endif // MAINWINDOW_H
25 changes: 25 additions & 0 deletions include/NetworkClient.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#ifndef NETWORKCLIENT_H
#define NETWORKCLIENT_H

#include <QObject>
#include <QTcpSocket>

class NetworkClient : public QObject {
Q_OBJECT

public:
explicit NetworkClient(QObject *parent = nullptr);
void connectToHost(const QString &host, quint16 port);
void sendMessage(const QString &message);

signals:
void messageReceived(const QString &message);

private slots:
void readData();

private:
QTcpSocket *socket;
};

#endif // NETWORKCLIENT_H
32 changes: 32 additions & 0 deletions include/NetworkServer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef NETWORKSERVER_H
#define NETWORKSERVER_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QList>

class NetworkServer : public QObject {
Q_OBJECT

public:
explicit NetworkServer(QObject *parent = nullptr);
bool startServer(quint16 port);
bool isListening() const { return server->isListening(); }

signals:
void dataReceived(const QString &data);

public slots:
void sendToClients(const QString &message);

private slots:
void onNewConnection();
void readClientData();

private:
QTcpServer *server;
QList<QTcpSocket*> clients;
};

#endif // NETWORKSERVER_H
Loading