diff --git a/.clang-format b/.clang-format index 4d990a5..6270299 100644 --- a/.clang-format +++ b/.clang-format @@ -1,21 +1,55 @@ -# Generated from CLion C/C++ Code Style settings +--- BasedOnStyle: LLVM AccessModifierOffset: -2 AlignAfterOpenBracket: Align -AlignConsecutiveAssignments: None +AlignArrayOfStructures: Left +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + PadOperators: false +AlignEscapedNewlines: Left AlignOperands: Align -AllowAllArgumentsOnNextLine: false -AllowAllConstructorInitializersOnNextLine: false -AllowAllParametersOfDeclarationOnNextLine: false +AlignTrailingComments: + Kind: Always + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true AllowShortBlocksOnASingleLine: Always -AllowShortCaseLabelsOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: true +AllowShortEnumsOnASingleLine: true AllowShortFunctionsOnASingleLine: All -AllowShortIfStatementsOnASingleLine: Always +AllowShortIfStatementsOnASingleLine: Never AllowShortLambdasOnASingleLine: All -AllowShortLoopsOnASingleLine: true +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: Yes -BreakBeforeBraces: Custom +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both BraceWrapping: AfterCaseLabel: false AfterClass: false @@ -23,44 +57,172 @@ BraceWrapping: AfterEnum: false AfterFunction: false AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false AfterUnion: false + AfterExternBlock: false BeforeCatch: false BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false IndentBraces: false - SplitEmptyFunction: false + SplitEmptyFunction: true SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAfterAttributes: Never +BreakAfterJavaFieldAnnotations: false +BreakArrays: true BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeConceptDeclarations: Always +BreakBeforeInlineASMColon: OnlyMultiline BreakBeforeTernaryOperators: true BreakConstructorInitializers: BeforeColon BreakInheritanceList: BeforeColon -ColumnLimit: 0 +BreakStringLiterals: true +ColumnLimit: 180 +CommentPragmas: "^ IWYU pragma:" CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: true +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: ^"(llvm|llvm-c|clang|clang-c)/ + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: ^(<|"(gtest|gmock|isl|json)/) + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: .* + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: (Test)?$ +IncludeIsMainSourceRegex: "" +IndentAccessModifiers: false +IndentCaseBlocks: true IndentCaseLabels: true -IndentPPDirectives: None +IndentExternBlock: Indent +IndentGotoLabels: true +IndentPPDirectives: BeforeHash +IndentRequiresClause: true IndentWidth: 2 -KeepEmptyLinesAtTheStartOfBlocks: true -MaxEmptyLinesToKeep: 2 +IndentWrappedFunctionNames: false +InsertBraces: true +InsertNewlineAtEOF: true +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: false +LambdaBodyIndentation: Signature +Language: Cpp +LineEnding: DeriveLF +MacroBlockBegin: "" +MacroBlockEnd: "" +MaxEmptyLinesToKeep: 1 NamespaceIndentation: All +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 2 +ObjCBreakBeforeNestedBlockParam: true ObjCSpaceAfterProperty: false ObjCSpaceBeforeProtocolList: true +PPIndentWidth: -1 +PackConstructorInitializers: CurrentLine +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Left -ReflowComments: false +QualifierAlignment: Custom +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveSemicolon: true +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Always +ShortNamespaceLines: 1000 +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric SpaceAfterCStyleCast: true SpaceAfterLogicalNot: false -SpaceAfterTemplateKeyword: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default SpaceBeforeAssignmentOperators: true -SpaceBeforeCpp11BracedList: false +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatements -SpaceBeforeRangeBasedForLoopColon: false +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDeclarationName: false + AfterFunctionDefinitionName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: false SpaceInEmptyParentheses: false -SpacesBeforeTrailingComments: 0 -SpacesInAngles: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never SpacesInCStyleCastParentheses: false -SpacesInContainerLiterals: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 SpacesInParentheses: false SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION TabWidth: 2 -UseTab: Always +UseTab: Never +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +QualifierOrder: + - inline + - static + - const + - type diff --git a/Chat/applications/ChatGUI.cpp b/Chat/applications/ChatGUI.cpp index 305dee1..2981be1 100644 --- a/Chat/applications/ChatGUI.cpp +++ b/Chat/applications/ChatGUI.cpp @@ -1,4 +1,6 @@ +#include "NewPlacement.hpp" + #include "ClientGui.hpp" #include "Window.hpp" diff --git a/Chat/private/Chat.cpp b/Chat/private/Chat.cpp index 52fd26b..49c6a6d 100644 --- a/Chat/private/Chat.cpp +++ b/Chat/private/Chat.cpp @@ -1,4 +1,6 @@ +#include "NewPlacement.hpp" + #include "Chat.hpp" #include "Graphics.hpp" @@ -14,5 +16,36 @@ bool ChatAPI::isLogged() const { } void ChatAPI::login(const Credentials& credentials) { - mLogged = String::Logic::isEqualLogic(credentials.name, "111"); -} \ No newline at end of file + mLogged = String::Logic::isEqualLogic(credentials.pass, "1812") && String::Logic::isEqualLogic(credentials.name, "Igor"); + mChatsList = { "Serg", "Friends" }; + mChatHistories.put("Serg", { { "Serg", "Hello wanna some coke-cola?" }, { "Serg", "Will be in 5 mins" } }); + mChatHistories.put("Friends", { { "Artem", "Whos is that Serg?" }, { "Erog", "idunno" } }); +} + +void ChatAPI::logout() { + mLogged = false; + mChatsList.removeAll(); + mChatHistories.removeAll(); +} + +const ChatAPI::ChatsList* ChatAPI::getChatsList() const { + return mLogged ? &mChatsList : nullptr; +} + +const ChatAPI::ChatHistory* ChatAPI::getChatHistory(const String& chatName) const { + if (!mLogged) return nullptr; + + auto history = mChatHistories.presents(chatName); + return history ? &mChatHistories.getSlotVal(history) : nullptr; +} + +void ChatAPI::send(const String& chatName, const Message& message) { + if (!mLogged) return; + + auto iter = mChatHistories.presents(chatName); + auto history = iter ? &mChatHistories.getSlotVal(iter) : nullptr; + + if (!history) return; + + history->pushBack(message); +} diff --git a/Chat/private/ClientGUI.cpp b/Chat/private/ClientGUI.cpp index c30755b..75738ca 100644 --- a/Chat/private/ClientGUI.cpp +++ b/Chat/private/ClientGUI.cpp @@ -1,46 +1,89 @@ #include "ClientGui.hpp" #include "imgui.h" +#include "imgui_internal.h" using namespace tp; using namespace ImGui; void ClientGUI::draw(ChatAPI& api) { + DockSpaceOverViewport(GetWindowViewport()); - if (Begin("window_name")) { + if (api.isLogged()) { + drawChat(api); - if (api.isLogged()) { + } else { + if (Begin("Authentication")) { + InputText("Name", mCredentials.name, ChatAPI::Credentials::SIZE); + InputText("Pass", mCredentials.pass, ChatAPI::Credentials::SIZE); - static int item_current1 = 0; - const char *items1[] = {"Never", "Gonna", "Give", "You", "Up"}; - Combo("User", &item_current1, items1, IM_ARRAYSIZE(items1)); + if (mInvalidCredentials) { + Text("Invalid Credentials"); + } - BeginListBox("History"); - Text("as"); - Text("asa"); - EndListBox(); + if (Button("Login")) { + api.login(mCredentials); + mInvalidCredentials = !api.isLogged(); + } + } + End(); + } +} - static char buff[1000]; - InputTextMultiline("Message", buff, 1000); +void ClientGUI::drawChat(tp::ChatAPI& api) { + if (Begin("Chats")) { + if (Button("Logout", {GetContentRegionAvail().x, 0})) { + api.logout(); + mCredentials.pass[0] = 0; + mActiveChatName = "Not Selected"; + } - if (Button("Send")) { + if (BeginListBox("##chats", GetContentRegionAvail())) { + auto chats = api.getChatsList(); + if (chats) { + for (auto user : *chats) { + if (Selectable(user->read())) { + mActiveChatName = user.data(); + } + } + } else { + Text("Error"); + } - } + EndListBox(); + } + } + End(); - } else { + if (Begin("History")) { + Text("%s", mActiveChatName.read()); - InputText("Name", mCredentials.name, ChatAPI::Credentials::SIZE); - InputText("Pass", mCredentials.pass, ChatAPI::Credentials::SIZE); + auto history = api.getChatHistory(mActiveChatName); - if (mInvalidCredentials) { - Text("Invalid Credentials"); - } + if (history) { + if (BeginListBox("##History", GetContentRegionAvail())) { + for (auto message : *history) { + Text("%s : %s", message->user.read(), message->text.read()); + Separator(); + } + } - if (Button("Login")) { - api.login(mCredentials); - mInvalidCredentials = !api.isLogged(); - } - } + EndListBox(); + } else { + Text("No History"); + } + } + End(); - } End(); -} \ No newline at end of file + if (Begin("Message")) { + if (Button("Send")) { + if (String::Logic::calcLength(mMessageBuff) > 0) { + api.send(mActiveChatName, {mCredentials.name, mMessageBuff}); + } + mMessageBuff[0] = 0; + } + + InputTextMultiline("##Message", mMessageBuff, MESSAGE_SIZE, GetContentRegionAvail()); + } + End(); +} diff --git a/Chat/public/Chat.hpp b/Chat/public/Chat.hpp index f76b0a4..e89af19 100644 --- a/Chat/public/Chat.hpp +++ b/Chat/public/Chat.hpp @@ -1,6 +1,8 @@ #pragma once -#include "Module.hpp" +#include "Strings.hpp" +#include "Map.hpp" +#include "List.hpp" namespace tp { @@ -14,14 +16,30 @@ namespace tp { tp::int1 pass[SIZE] {0}; }; + typedef List ChatsList; + + struct Message { + String user; + String text; + }; + + typedef List ChatHistory; + public: ChatAPI() = default; [[nodiscard]] bool isLogged() const; void login(const Credentials& credentials); + [[nodiscard]] const ChatsList* getChatsList() const; + [[nodiscard]] const ChatHistory* getChatHistory(const String& chatName) const; + void logout(); + void send(const String& chatName, const Message& message); private: bool mLogged = false; Credentials mCredentials; + ChatsList mChatsList; + + Map mChatHistories; }; } diff --git a/Chat/public/ClientGui.hpp b/Chat/public/ClientGui.hpp index 189fdb0..b037b45 100644 --- a/Chat/public/ClientGui.hpp +++ b/Chat/public/ClientGui.hpp @@ -4,10 +4,17 @@ namespace tp { class ClientGUI { + enum { MESSAGE_SIZE = 1024 }; ChatAPI::Credentials mCredentials; bool mInvalidCredentials = false; + char mMessageBuff[1000] {0}; + String mActiveChatName = "Not Selected"; + public: ClientGUI() = default; void draw(ChatAPI& api); + + private: + void drawChat(ChatAPI& api); }; } \ No newline at end of file diff --git a/Strings/public/Strings.hpp b/Strings/public/Strings.hpp index 5bdf9f8..6fedcc9 100644 --- a/Strings/public/Strings.hpp +++ b/Strings/public/Strings.hpp @@ -102,7 +102,7 @@ namespace tp { // Creates new string data from raw data pointer. // Does not own string buffer - string buffer will not be freed. Initializes as const memory. StringTemplate(const tChar* raw) { - mData = new (sStringPool.allocate(0)) StringData(raw, true); + mData = new (sStringPool.allocate(0)) StringData(raw, true); incReference(mData); }