This commit is contained in:
IlyaShurupov 2023-09-03 10:48:24 +03:00
parent b3d06906ff
commit b0d5226915
7 changed files with 317 additions and 52 deletions

View file

@ -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

View file

@ -1,4 +1,6 @@
#include "NewPlacement.hpp"
#include "ClientGui.hpp"
#include "Window.hpp"

View file

@ -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");
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);
}

View file

@ -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();
static char buff[1000];
InputTextMultiline("Message", buff, 1000);
if (Button("Send")) {
}
} else {
InputText("Name", mCredentials.name, ChatAPI::Credentials::SIZE);
InputText("Pass", mCredentials.pass, ChatAPI::Credentials::SIZE);
if (mInvalidCredentials) {
Text("Invalid Credentials");
}
if (Button("Login")) {
api.login(mCredentials);
mInvalidCredentials = !api.isLogged();
}
}
} End();
if (Button("Login")) {
api.login(mCredentials);
mInvalidCredentials = !api.isLogged();
}
}
End();
}
}
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 (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();
if (Begin("History")) {
Text("%s", mActiveChatName.read());
auto history = api.getChatHistory(mActiveChatName);
if (history) {
if (BeginListBox("##History", GetContentRegionAvail())) {
for (auto message : *history) {
Text("%s : %s", message->user.read(), message->text.read());
Separator();
}
}
EndListBox();
} else {
Text("No History");
}
}
End();
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();
}

View file

@ -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<String> ChatsList;
struct Message {
String user;
String text;
};
typedef List<Message> 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<String, ChatHistory> mChatHistories;
};
}

View file

@ -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);
};
}

View file

@ -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);
}