diff --git a/configuration/.vscode/c_cpp_properties.json b/configuration/.vscode/c_cpp_properties.json index 770cd3e..65cc337 100644 --- a/configuration/.vscode/c_cpp_properties.json +++ b/configuration/.vscode/c_cpp_properties.json @@ -5,6 +5,7 @@ "includePath": [ "${workspaceFolder}/**", "${workspaceFolder}/subprojects/animationwindow/include/**", + "${workspaceFolder}/subprojects/std_lib_facilities/**", "${workspaceFolder}/subprojects/sdl2_image_windows/include/**", "${workspaceFolder}/subprojects/sdl2_mixer_windows/include/**", "${workspaceFolder}/subprojects/sdl2_windows/include/**" @@ -15,7 +16,7 @@ "_UNICODE" ], "cStandard": "c17", - "cppStandard": "c++20", + "cppStandard": "c++23", "compilerPath": "C:\\TDT4102-mingw64\\bin\\gcc", "compileCommands": "${workspaceFolder}/build/compile_commands.json", "intelliSenseMode": "windows-gcc-x64" @@ -24,7 +25,8 @@ "name": "Mac", "includePath": [ "${workspaceFolder}/**", - "${workspaceFolder}/subprojects/animationwindow/include/**" + "${workspaceFolder}/subprojects/animationwindow/include/**", + "${workspaceFolder}/subprojects/std_lib_facilities/**" ], "defines": [ "_DEBUG", @@ -32,14 +34,16 @@ "_UNICODE" ], "cStandard": "c17", - "cppStandard": "c++20", + "cppStandard": "c++23", "compileCommands": "build/compile_commands.json", "intelliSenseMode": "macos-clang-x64" }, { "name": "Linux", "includePath": [ - "${workspaceFolder}/**" + "${workspaceFolder}/**", + "${workspaceFolder}/subprojects/animationwindow/include/**", + "${workspaceFolder}/subprojects/std_lib_facilities/**" ], "defines": [ "_DEBUG", @@ -47,7 +51,7 @@ "_UNICODE" ], "cStandard": "c17", - "cppStandard": "c++20", + "cppStandard": "c++23", "compileCommands": "build/compile_commands.json", "intelliSenseMode": "linux-gcc-x64" } diff --git a/configuration/.vscode/settings.json b/configuration/.vscode/settings.json index 798851d..9b31d5f 100644 --- a/configuration/.vscode/settings.json +++ b/configuration/.vscode/settings.json @@ -3,5 +3,22 @@ "cmake.configureOnOpen": false, "cmake.autoSelectActiveFolder": false, "cmake.configureOnEdit": false, - "makefile.alwaysPreConfigure": false + "makefile.alwaysPreConfigure": false, + "C_Cpp.default.compileCommands": [ + "${workspaceFolder}/build/compile_commands.json" + ], + "C_Cpp.codeAnalysis.clangTidy.args": [ + "-header-filter=^${workspaceFolder}/.*", + "--system-headers=false", + "--query-driver=/usr/bin/*, /usr/local/bin/*, C:/TDT4102-mingw64/bin/*", + ], + "C_Cpp.codeAnalysis.clangTidy.enabled": true, + "C_Cpp.codeAnalysis.exclude":{ + "subprojects/**": true, + "build/**": true + }, + "C_Cpp.codeAnalysis.runAutomatically": true, + "C_Cpp.codeAnalysis.clangTidy.useBuildPath": true, + "C_Cpp.errorSquiggles": "enabledIfIncludesResolve", + "C_Cpp.intelliSenseEngine": "default" } diff --git a/dependencies/meson.build b/dependencies/meson.build index 17d8011..e924fed 100644 --- a/dependencies/meson.build +++ b/dependencies/meson.build @@ -1,7 +1,7 @@ project('testproject', 'cpp', version : '0.1', default_options : ['warning_level=0', - 'cpp_std=c++20', + 'cpp_std=c++23', 'c_std=c17', 'default_library=static']) diff --git a/dependencies/subprojects/animationwindow/include/AnimationWindow.h b/dependencies/subprojects/animationwindow/include/AnimationWindow.h index f248619..4814a36 100644 --- a/dependencies/subprojects/animationwindow/include/AnimationWindow.h +++ b/dependencies/subprojects/animationwindow/include/AnimationWindow.h @@ -103,7 +103,8 @@ class AnimationWindow { void draw_circle(TDT4102::Point centre, int radius, TDT4102::Color color = TDT4102::Color::dark_blue, TDT4102::Color borderColor = TDT4102::Color::transparent); void draw_rectangle(TDT4102::Point topLeftPoint, int width, int height, TDT4102::Color color = TDT4102::Color::dark_green, TDT4102::Color borderColor = TDT4102::Color::transparent); void draw_image(TDT4102::Point topLeftPoint, TDT4102::Image& image, int imageWidth = 0, int imageHeight = 0, double rotationAngleDegrees = 0, TDT4102::Point rotationOrigin = {0, 0}); - void draw_text(TDT4102::Point bottomLeftPoint, std::string textToShow, TDT4102::Color color = TDT4102::Color::black, unsigned int fontSize = 20, TDT4102::Font font = TDT4102::Font::arial); + void draw_image_region(TDT4102::Point topLeftPoint, TDT4102::Image& image, int imageWidth = 0, int imageHeight = 0, TDT4102::Point sourceTopLeftPoint = {0, 0}, int sourceWidth = 0, int sourceHeight = 0, TDT4102::FlipImage flip = TDT4102::FlipImage::NONE); + void draw_text(TDT4102::Point topLeftPoint, std::string textToShow, TDT4102::Color color = TDT4102::Color::black, unsigned int fontSize = 20, TDT4102::Font font = TDT4102::Font::arial); void draw_line(TDT4102::Point start, TDT4102::Point end, TDT4102::Color color = TDT4102::Color::black); void draw_triangle(TDT4102::Point vertex0, TDT4102::Point vertex1, TDT4102::Point vertex2, TDT4102::Color color = TDT4102::Color::yellow); void draw_quad(TDT4102::Point vertex0, TDT4102::Point vertex1, TDT4102::Point vertex2, TDT4102::Point vertex3, TDT4102::Color color = TDT4102::Color::cyan); diff --git a/dependencies/subprojects/animationwindow/include/Image.h b/dependencies/subprojects/animationwindow/include/Image.h index abc79b3..1fc4409 100644 --- a/dependencies/subprojects/animationwindow/include/Image.h +++ b/dependencies/subprojects/animationwindow/include/Image.h @@ -9,6 +9,10 @@ namespace TDT4102 { struct ImageCache; + + enum class FlipImage { + NONE, HORIZONTAL, VERTICAL + }; struct Image { // Allow the texture to be read out and drawn despite being private @@ -89,5 +93,10 @@ namespace TDT4102 { void reset(); static ImageCache cache; + + void drawRegion(SDL_Renderer* renderer, TDT4102::Point location, + int imageWidth = 0, int imageHeight = 0, + TDT4102::Point sourceTopLeftPoint = {0, 0}, + int sourceWidth = 0, int sourceHeight = 0, SDL_RendererFlip flip = SDL_FLIP_NONE); }; } diff --git a/dependencies/subprojects/animationwindow/include/Widget.h b/dependencies/subprojects/animationwindow/include/Widget.h index a18db1d..97675d0 100644 --- a/dependencies/subprojects/animationwindow/include/Widget.h +++ b/dependencies/subprojects/animationwindow/include/Widget.h @@ -26,7 +26,7 @@ namespace TDT4102 { protected: void fire(); - virtual void update(nk_context* context) = 0; + virtual void update(nk_context* contex, bool& eventHandled) = 0; explicit Widget(TDT4102::Point position, unsigned int width, unsigned int height); public: void setCallback(std::function callback); diff --git a/dependencies/subprojects/animationwindow/include/widgets/Button.h b/dependencies/subprojects/animationwindow/include/widgets/Button.h index 99c7372..604a593 100644 --- a/dependencies/subprojects/animationwindow/include/widgets/Button.h +++ b/dependencies/subprojects/animationwindow/include/widgets/Button.h @@ -18,7 +18,7 @@ namespace TDT4102 { nk_color buttonColorBorder = nk_rgba(35, 35, 35,255); protected: - void update(nk_context* context) override; + void update(nk_context* context, bool& eventHandled) override; public: explicit Button(TDT4102::Point location, unsigned int width, unsigned int height, std::string label); void setLabel(std::string newLabel); diff --git a/dependencies/subprojects/animationwindow/include/widgets/CheckBox.h b/dependencies/subprojects/animationwindow/include/widgets/CheckBox.h index 26599ba..19d16a4 100644 --- a/dependencies/subprojects/animationwindow/include/widgets/CheckBox.h +++ b/dependencies/subprojects/animationwindow/include/widgets/CheckBox.h @@ -18,7 +18,7 @@ namespace TDT4102 { nk_color checkBoxColorActive = nk_rgba(150, 150, 150, 255); protected: - void update(nk_context* context) override; + void update(nk_context* context, bool& eventHandled) override; public: explicit CheckBox(TDT4102::Point location, unsigned int width, unsigned int height, std::string label); bool isSelected() const; diff --git a/dependencies/subprojects/animationwindow/include/widgets/DropdownList.h b/dependencies/subprojects/animationwindow/include/widgets/DropdownList.h index 56f34d2..195de34 100644 --- a/dependencies/subprojects/animationwindow/include/widgets/DropdownList.h +++ b/dependencies/subprojects/animationwindow/include/widgets/DropdownList.h @@ -10,7 +10,7 @@ namespace TDT4102 { std::vector options; unsigned int selectedIndex = 0; protected: - void update(nk_context* context) override; + void update(nk_context* context, bool& eventHandled) override; public: explicit DropdownList(TDT4102::Point location, unsigned int width, unsigned int height, std::vector &initialOptions); std::string getSelectedValue() const; diff --git a/dependencies/subprojects/animationwindow/include/widgets/RadioButton.h b/dependencies/subprojects/animationwindow/include/widgets/RadioButton.h index c968c99..33b2905 100644 --- a/dependencies/subprojects/animationwindow/include/widgets/RadioButton.h +++ b/dependencies/subprojects/animationwindow/include/widgets/RadioButton.h @@ -18,7 +18,7 @@ namespace TDT4102 { nk_color radioColorActive = nk_rgba(150, 150, 150, 255); protected: - void update(nk_context* context) override; + void update(nk_context* contex, bool& eventHandled) override; public: explicit RadioButton(TDT4102::Point location, unsigned int width, unsigned int height, std::string label); bool isSelected() const; diff --git a/dependencies/subprojects/animationwindow/include/widgets/Slider.h b/dependencies/subprojects/animationwindow/include/widgets/Slider.h index 280f071..a881bf4 100644 --- a/dependencies/subprojects/animationwindow/include/widgets/Slider.h +++ b/dependencies/subprojects/animationwindow/include/widgets/Slider.h @@ -19,7 +19,7 @@ namespace TDT4102 { nk_color sliderCursorColorActive = nk_rgba(180, 180, 180, 255); nk_color sliderCursorColorHover = nk_rgba(180, 180, 180, 255); protected: - void update(nk_context* context) override; + void update(nk_context* context, bool& eventHandled) override; public: explicit Slider(TDT4102::Point location, unsigned int width, unsigned int height, int min = 0, int max = 100, int initialValue = 0, int step = 1); int getValue() const; diff --git a/dependencies/subprojects/animationwindow/include/widgets/TextBox.h b/dependencies/subprojects/animationwindow/include/widgets/TextBox.h index c4ed8e2..6397906 100644 --- a/dependencies/subprojects/animationwindow/include/widgets/TextBox.h +++ b/dependencies/subprojects/animationwindow/include/widgets/TextBox.h @@ -17,7 +17,7 @@ namespace TDT4102 { nk_color boxColor = nk_rgba(50 , 50, 50, 255); nk_color borderColor = nk_rgba(50, 50, 50, 255); protected: - void update(nk_context* context) override; + void update(nk_context* context, bool& eventHandled) override; public: explicit TextBox(TDT4102::Point location, unsigned int width, unsigned int height, std::string initialText = ""); std::string getText() const; diff --git a/dependencies/subprojects/animationwindow/include/widgets/TextInput.h b/dependencies/subprojects/animationwindow/include/widgets/TextInput.h index 41edb7d..893c63f 100644 --- a/dependencies/subprojects/animationwindow/include/widgets/TextInput.h +++ b/dependencies/subprojects/animationwindow/include/widgets/TextInput.h @@ -20,7 +20,7 @@ namespace TDT4102 { nk_color boxColorActive = nk_rgba(50 , 50, 50, 255); nk_color borderColor = nk_rgba(50, 50, 50, 255); protected: - void update(nk_context* context) override; + void update(nk_context* context, bool& eventHandled) override; public: explicit TextInput(TDT4102::Point location, unsigned int width, unsigned int height, std::string initialText = ""); std::string getText() const; diff --git a/dependencies/subprojects/animationwindow/meson.build b/dependencies/subprojects/animationwindow/meson.build index ddc7f40..f524623 100644 --- a/dependencies/subprojects/animationwindow/meson.build +++ b/dependencies/subprojects/animationwindow/meson.build @@ -1,4 +1,4 @@ -project('animationwindow', ['c', 'cpp'], version: '0.01', default_options: ['cpp_std=c++20', 'c_std=c17', 'default_library=static', 'buildtype=debugoptimized']) +project('animationwindow', ['c', 'cpp'], version: '0.01', default_options: ['cpp_std=c++23', 'c_std=c17', 'default_library=static', 'buildtype=debugoptimized']) if host_machine.system() == 'windows' sdl2_dep = subproject('sdl2_windows').get_variable('sdl2_windows_dep') diff --git a/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp b/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp index d4e6a5d..ad7fb77 100644 --- a/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp +++ b/dependencies/subprojects/animationwindow/src/AnimationWindow.cpp @@ -129,11 +129,12 @@ void TDT4102::AnimationWindow::show_frame() { } void TDT4102::AnimationWindow::update_gui() { + bool eventHandled = false; for (Widget& widget : widgets) { fontCache.setFont(context, Font::arial, 18); if (widget.isVisible) { startNuklearDraw(widget.position, widget.uniqueWidgetName, widget.width, widget.height); - widget.update(context); + widget.update(context, eventHandled); endNuklearDraw(); } } @@ -259,6 +260,21 @@ void TDT4102::AnimationWindow::draw_image(TDT4102::Point topLeftPoint, TDT4102:: image.draw(rendererHandle, topLeftPoint, imageWidth, imageHeight, rotationAngleDegrees, rotationOrigin); } +void TDT4102::AnimationWindow::draw_image_region(TDT4102::Point topLeftPoint, TDT4102::Image& image, int imageWidth, int imageHeight, TDT4102::Point sourceTopLeftPoint, int sourceWidth, int sourceHeight, TDT4102::FlipImage flip) { + SDL_RendererFlip sdl_flip = SDL_FLIP_NONE; + switch (flip){ + case TDT4102::FlipImage::HORIZONTAL: + sdl_flip = SDL_FLIP_HORIZONTAL; + break; + case TDT4102::FlipImage::VERTICAL: + sdl_flip = SDL_FLIP_VERTICAL; + break; + default: + sdl_flip = SDL_FLIP_NONE; + } + image.drawRegion(rendererHandle, topLeftPoint, imageWidth, imageHeight, sourceTopLeftPoint, sourceWidth, sourceHeight, sdl_flip); +} + void TDT4102::AnimationWindow::draw_text(TDT4102::Point topLeftPoint, std::string textToShow, TDT4102::Color color, unsigned int fontSize, TDT4102::Font font) { textWindowCounter++; std::stringstream windowName; @@ -384,13 +400,14 @@ void TDT4102::AnimationWindow::startNuklearDraw(TDT4102::Point location, std::st // Compute a rectangle that spans the entire size of the window // Some padding is needed to accomplish this. const unsigned int drawAreaPadding = 20; + const unsigned int windowPaddingX = 2 * context->style.window.padding.x; // If no draw size was specified, use as much space as available inside the window struct nk_rect drawAreaSize; if (width == 0 && height == 0) { drawAreaSize = nk_rect(float(location.x), float(location.y), float(windowSize.x - location.x + drawAreaPadding), float(windowSize.y - location.y + drawAreaPadding)); } else { - drawAreaSize = nk_rect(float(location.x), float(location.y), float(width), float(height)); + drawAreaSize = nk_rect(float(location.x), float(location.y), float(width + windowPaddingX), float(height)); } // Ensuring that all GUI elements have a reasonable minimum height diff --git a/dependencies/subprojects/animationwindow/src/Image.cpp b/dependencies/subprojects/animationwindow/src/Image.cpp index 910dcb7..9e2b702 100644 --- a/dependencies/subprojects/animationwindow/src/Image.cpp +++ b/dependencies/subprojects/animationwindow/src/Image.cpp @@ -160,6 +160,29 @@ void TDT4102::Image::draw(SDL_Renderer *renderer, TDT4102::Point location, int i SDL_RenderCopyEx(renderer, texture, nullptr, &imageBounds, angleDegrees, &rotationOrigin_sdl, SDL_FLIP_NONE); } +void TDT4102::Image::drawRegion(SDL_Renderer* renderer, TDT4102::Point location, int imageWidth, int imageHeight, TDT4102::Point sourceTopLeftPoint, int sourceWidth, int sourceHeight, SDL_RendererFlip flip) { + if(texture == nullptr) { + load(renderer); + } + + SDL_Rect sourceBounds {sourceTopLeftPoint.x, sourceTopLeftPoint.y, width, height}; + + if(sourceWidth > 0 && sourceHeight > 0) { + sourceBounds.w = sourceWidth; + sourceBounds.h = sourceHeight; + } + + SDL_Rect imageBounds {location.x, location.y, width, height}; + + if(imageWidth > 0 && imageHeight > 0) { + imageBounds.w = imageWidth; + imageBounds.h = imageHeight; + } + + SDL_RenderCopyEx(renderer, texture, &sourceBounds, &imageBounds, 0.0, nullptr, flip); +} + + TDT4102::Image::~Image() { cleanupTexture(); cleanupSurface(); diff --git a/dependencies/subprojects/animationwindow/src/widgets/Button.cpp b/dependencies/subprojects/animationwindow/src/widgets/Button.cpp index 0398c39..238cc4b 100644 --- a/dependencies/subprojects/animationwindow/src/widgets/Button.cpp +++ b/dependencies/subprojects/animationwindow/src/widgets/Button.cpp @@ -5,15 +5,8 @@ TDT4102::Button::Button(TDT4102::Point location, unsigned int width, unsigned in TDT4102::Widget(location, width, height), label{std::move(label)} {} -void TDT4102::Button::update(nk_context *context) { +void TDT4102::Button::update(nk_context *context, bool& eventHandled) { - bool rightMouseIsDown = nk_input_has_mouse_click_down_in_rect(&context->input, NK_BUTTON_RIGHT, context->current->layout->clip, true); - bool rightMouseIsBeingPressed = rightMouseIsDown && !lastRightMouseButtonState; - lastRightMouseButtonState = rightMouseIsDown; - - bool leftMouseIsDown = nk_input_has_mouse_click_down_in_rect(&context->input, NK_BUTTON_LEFT, context->current->layout->clip, true); - bool leftMouseIsBeingPressed = leftMouseIsDown && !lastLeftMouseButtonState; - lastLeftMouseButtonState = leftMouseIsDown; struct nk_style* s = &context->style; nk_style_push_color(context, &s->button.text_normal, labelColor); nk_style_push_color(context, &s->button.text_hover, labelColor); @@ -22,8 +15,11 @@ void TDT4102::Button::update(nk_context *context) { nk_style_push_style_item(context, &s->button.normal, nk_style_item_color(buttonColor)); nk_style_push_style_item(context, &s->button.hover, nk_style_item_color(buttonColorHover)); nk_style_push_style_item(context, &s->button.active, nk_style_item_color(buttonColorActive)); - if (nk_button_label(context, label.c_str()) || rightMouseIsBeingPressed || leftMouseIsBeingPressed) { - fire(); + if (nk_button_label(context, label.c_str())) { + if(!eventHandled) { + fire(); + eventHandled = true; + } } nk_style_pop_color(context); nk_style_pop_color(context); diff --git a/dependencies/subprojects/animationwindow/src/widgets/CheckBox.cpp b/dependencies/subprojects/animationwindow/src/widgets/CheckBox.cpp index 0b9d463..12d27c2 100644 --- a/dependencies/subprojects/animationwindow/src/widgets/CheckBox.cpp +++ b/dependencies/subprojects/animationwindow/src/widgets/CheckBox.cpp @@ -5,7 +5,7 @@ TDT4102::CheckBox::CheckBox(TDT4102::Point location, unsigned int width, unsigne TDT4102::Widget(location, width, height), label{std::move(label)} {} -void TDT4102::CheckBox::update(nk_context *context) { +void TDT4102::CheckBox::update(nk_context *context, bool& eventHandled) { if (nk_input_has_mouse_click_down_in_rect(&context->input, NK_BUTTON_RIGHT, context->current->layout->clip, true)) { isSelected_ = false; } @@ -23,7 +23,10 @@ void TDT4102::CheckBox::update(nk_context *context) { if (nk_checkbox_label(context, label.data(), &isSelected_)) { isSelected_ = true; - fire(); + if(!eventHandled) { + fire(); + eventHandled = true; + } } nk_style_pop_color(context); diff --git a/dependencies/subprojects/animationwindow/src/widgets/DropdownList.cpp b/dependencies/subprojects/animationwindow/src/widgets/DropdownList.cpp index c22eedf..772cd56 100644 --- a/dependencies/subprojects/animationwindow/src/widgets/DropdownList.cpp +++ b/dependencies/subprojects/animationwindow/src/widgets/DropdownList.cpp @@ -14,14 +14,17 @@ std::string TDT4102::DropdownList::getSelectedValue() const { return options.at(selectedIndex); } -void TDT4102::DropdownList::update(nk_context *context) { +void TDT4102::DropdownList::update(nk_context *context, bool& eventHandled) { if (nk_combo_begin_label(context, options.at(selectedIndex).c_str(), nk_vec2(nk_widget_width(context), 200))) { nk_layout_row_dynamic(context, 35, 1); for(unsigned int i = 0; i < options.size(); i++) { if (nk_combo_item_label(context, options.at(i).c_str(), NK_TEXT_LEFT)) { // selection changed selectedIndex = i; - fire(); + if(!eventHandled) { + fire(); + eventHandled = true; + } } } nk_combo_end(context); diff --git a/dependencies/subprojects/animationwindow/src/widgets/RadioButton.cpp b/dependencies/subprojects/animationwindow/src/widgets/RadioButton.cpp index 59d9616..d1049fd 100644 --- a/dependencies/subprojects/animationwindow/src/widgets/RadioButton.cpp +++ b/dependencies/subprojects/animationwindow/src/widgets/RadioButton.cpp @@ -5,7 +5,7 @@ TDT4102::RadioButton::RadioButton(TDT4102::Point location, unsigned int width, u TDT4102::Widget(location, width, height), label{std::move(label)} {} -void TDT4102::RadioButton::update(nk_context *context) { +void TDT4102::RadioButton::update(nk_context *context, bool& eventHandled) { if (nk_input_has_mouse_click_down_in_rect(&context->input, NK_BUTTON_RIGHT, context->current->layout->clip, true)) { isSelected_ = false; } @@ -23,7 +23,10 @@ void TDT4102::RadioButton::update(nk_context *context) { if (nk_radio_label(context, label.data(), &isSelected_)) { isSelected_ = true; - fire(); + if(!eventHandled) { + fire(); + eventHandled = true; + } } nk_style_pop_color(context); diff --git a/dependencies/subprojects/animationwindow/src/widgets/Slider.cpp b/dependencies/subprojects/animationwindow/src/widgets/Slider.cpp index 2a80404..57c3d10 100644 --- a/dependencies/subprojects/animationwindow/src/widgets/Slider.cpp +++ b/dependencies/subprojects/animationwindow/src/widgets/Slider.cpp @@ -12,7 +12,7 @@ int TDT4102::Slider::getValue() const { return value; } -void TDT4102::Slider::update(nk_context *context) { +void TDT4102::Slider::update(nk_context *context, bool& eventHandled) { struct nk_style* s = &context->style; nk_style_push_color(context, &s->slider.bar_normal, sliderBarColor); @@ -24,7 +24,10 @@ void TDT4102::Slider::update(nk_context *context) { nk_style_push_style_item(context, &s->slider.cursor_active, nk_style_item_color(sliderCursorColorActive)); if (nk_slider_int(context, minValue, &value, maxValue, stepValue)) { - fire(); + if(!eventHandled) { + fire(); + eventHandled = true; + } } nk_style_pop_color(context); diff --git a/dependencies/subprojects/animationwindow/src/widgets/TextBox.cpp b/dependencies/subprojects/animationwindow/src/widgets/TextBox.cpp index ac0a8fa..4b16639 100644 --- a/dependencies/subprojects/animationwindow/src/widgets/TextBox.cpp +++ b/dependencies/subprojects/animationwindow/src/widgets/TextBox.cpp @@ -1,6 +1,6 @@ #include "widgets/TextBox.h" -void TDT4102::TextBox::update(nk_context *context) { +void TDT4102::TextBox::update(nk_context *context, bool& eventHandled) { struct nk_style* s = &context->style; nk_style_push_color(context, &s->edit.text_normal, textColor); nk_style_push_color(context, &s->edit.border_color, borderColor); diff --git a/dependencies/subprojects/animationwindow/src/widgets/TextInput.cpp b/dependencies/subprojects/animationwindow/src/widgets/TextInput.cpp index 40e3ac4..e37f6af 100644 --- a/dependencies/subprojects/animationwindow/src/widgets/TextInput.cpp +++ b/dependencies/subprojects/animationwindow/src/widgets/TextInput.cpp @@ -1,6 +1,6 @@ #include "widgets/TextInput.h" -void TDT4102::TextInput::update(nk_context *context) { +void TDT4102::TextInput::update(nk_context *context, bool& eventHandled) { struct nk_style* s = &context->style; nk_style_push_color(context, &s->edit.text_normal, textColor); nk_style_push_color(context, &s->edit.text_hover, textColor); @@ -13,7 +13,10 @@ void TDT4102::TextInput::update(nk_context *context) { // Detect whether any editing of the string has occurred // Nuklear only reports whether the text box has lost focus if(contents != previousContents) { - fire(); + if(!eventHandled) { + fire(); + eventHandled = true; + } } previousContents = contents; diff --git a/dependencies/subprojects/std_lib_facilities/meson.build b/dependencies/subprojects/std_lib_facilities/meson.build index dfefbc9..95d68ea 100644 --- a/dependencies/subprojects/std_lib_facilities/meson.build +++ b/dependencies/subprojects/std_lib_facilities/meson.build @@ -1,4 +1,4 @@ -project('std_lib_facilities', ['c', 'cpp'], version: '0.01', default_options: ['cpp_std=c++20', 'c_std=c17', 'default_library=static', 'buildtype=debugoptimized']) +project('std_lib_facilities', ['c', 'cpp'], version: '0.01', default_options: ['cpp_std=c++23', 'c_std=c17', 'default_library=static', 'buildtype=debugoptimized']) incdir = include_directories('.') install_subdir('include', install_dir: '.') diff --git a/dependencies/testproject_featuredemo.cpp b/dependencies/testproject_featuredemo.cpp index 494610c..024af56 100644 --- a/dependencies/testproject_featuredemo.cpp +++ b/dependencies/testproject_featuredemo.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "widgets/Button.h" #include "widgets/TextInput.h" @@ -215,6 +216,7 @@ int main(int argc, char* argv[]) { } window.next_frame(); } - + // new in c++23 + std::println("hello from println"); return 0; } \ No newline at end of file diff --git a/setup/mac_installer.sh b/setup/mac_installer.sh new file mode 100644 index 0000000..5bfd1cb --- /dev/null +++ b/setup/mac_installer.sh @@ -0,0 +1,211 @@ +#!/bin/bash + +# TDT4102 Tools Installation Script for macOS +# Installs: Xcode CLI Tools, Homebrew, Meson, Ninja, SDL2 libraries + +set -e # Exit on error +clear && printf '\033[3J' # clear window and scrollback + + +MIN_MACOS_VERSION="14.0.0" +MIN_MESON_VERSION="1.11.0" + +# flags +INSTALL_XCODE=0 +INSTALL_HOMEBREW=0 +INSTALL_MESON=0 +INSTALL_LIBS=0 + +version_gte() { + local v1 v2 + IFS='.' read -ra v1 <<< "$1" + IFS='.' read -ra v2 <<< "$2" + for i in 0 1 2; do + local n1=${v1[$i]:-0} n2=${v2[$i]:-0} + (( n1 > n2 )) && return 0 + (( n1 < n2 )) && return 1 + done + return 0 +} + +check_macos_version() { + local version + version=$(sw_vers -productVersion) + if ! version_gte "$version" "$MIN_MACOS_VERSION"; then + echo "macOS $version is not supported (minimum: $MIN_MACOS_VERSION)" + echo "Please update macOS or contact course staff." + return 1 + fi +} + +install_xcode() { + echo "Checking if Xcode Command Line Tools are installed... " + if xcode-select -p &>/dev/null; then + echo "Xcode Command Line Tools are already installed, skipping..." + return 0 + fi + + echo "Xcode Command Line Tools are not installed!" + echo "Installing Xcode Command Line Tools..." + echo "A dialog may appear - please follow the instructions." + echo "This may take a while..." + + xcode-select --install 2>/dev/null || true + + #xcode-select --install returns immediately (new process starts), so we timeout to wait for installation + local timeout=1800 elapsed=0 + while ! xcode-select -p &>/dev/null; do + sleep 5 + elapsed=$((elapsed + 5)) + if [ $elapsed -ge $timeout ]; then + echo "Xcode installation timed out. Run manually: xcode-select --install" + return 1 + fi + done + echo "Xcode Command Line Tools installed." + return 0 +} + +install_homebrew() { + echo "Checking if Homebrew is installed..." + if command -v brew &>/dev/null; then + echo "Homebrew is already installed, skipping..." + return 0 + fi + + echo "Homebrew is not installed!" + echo "Installing Homebrew..." + echo "You might be asked for your password during installation." + + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + local arch + arch=$(uname -m) + + # Apple Silicon + if [ "$arch" = "arm64" ]; then + if [ ! -f ~/.zshenv ] || ! grep -q '/opt/homebrew/bin/brew shellenv' ~/.zshenv; then + echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshenv + fi + eval "$(/opt/homebrew/bin/brew shellenv)" + else + # Intel + if [ ! -f ~/.zshenv ] || ! grep -q '/usr/local/opt' ~/.zshenv; then + echo 'PATH="/usr/local/opt:$PATH"' >> ~/.zshenv + fi + export PATH="/usr/local/opt:$PATH" + fi + + [ -f ~/.zshenv ] && source ~/.zshenv + + if ! command -v brew &>/dev/null; then + echo "Homebrew installation failed." + return 1 + fi + return 0 +} + +install_meson() { + echo "Installing Meson" + + brew install meson + + if ! command -v meson &>/dev/null; then + echo "Meson installation failed." + return 1 + fi + local meson_version + meson_version=$(meson --version) + if ! version_gte "$meson_version" "$MIN_MESON_VERSION"; then + echo "Meson version outdated. Try: brew upgrade meson" + return 1 + fi + + if ! command -v ninja &>/dev/null; then + echo "Ninja installation failed." + return 1 + fi + return 0 +} + + +install_libraries() { + echo "Installing required libraries..." + local libs=( + "sdl2" + "sdl2_image" + "sdl2_mixer" + "jpeg-turbo" + "libpng" + "libtiff" + "cmake" + ) + brew install "${libs[@]}" + + # Check libraries + local installed all_ok=true + installed=$(brew list) + for pkg in "sdl2" "sdl2_image" "sdl2_mixer" "jpeg-turbo" "libpng" "libtiff" "cmake"; do + if ! echo "$installed" | grep -q "$pkg"; then + echo "Package '$pkg' failed to install." + all_ok=false + fi + done + if [ "$all_ok" = true ]; then + echo "All libraries installed." + return 0 + else + echo "One or more libraries failed to install." + return 1 + fi +} + +main() { + echo "PLEASE KEEP THIS WINDOW OPEN UNTIL PROMPTED" + echo "TDT4102 Tools Installation Script for macOS" + echo + # default install everything + if [[ $# -eq 0 ]]; then + INSTALL_XCODE=1 + INSTALL_HOMEBREW=1 + INSTALL_MESON=1 + INSTALL_LIBS=1 + else + while [[ $# -gt 0 ]]; do + case $1 in + --xcode) INSTALL_XCODE=1 ;; + --homebrew) INSTALL_HOMEBREW=1 ;; + --meson) INSTALL_MESON=1 ;; + --libs) INSTALL_LIBS=1 ;; + *) err "Unknown option: $1";; + esac + shift + done + fi + + + # Check macOS version + if ! check_macos_version; then + exit 1 + fi + + + [[ $INSTALL_XCODE -eq 1 ]] && install_xcode + [[ $INSTALL_HOMEBREW -eq 1 ]] && install_homebrew + + if [[ $INSTALL_HOMEBREW -eq 1 || $INSTALL_MESON -eq 1 || $INSTALL_LIBS -eq 1 ]]; then + echo "Updating Homebrew..." + brew update || echo "update failed" + brew upgrade || echo "upgrade failed" + fi + + [[ $INSTALL_MESON -eq 1 ]] && install_meson + [[ $INSTALL_LIBS -eq 1 ]] && install_libraries + + echo + echo "Installation finished! Please restart VS Code." + read -r -p "Press enter to exit" +} + +#Run main +main "$@" diff --git a/setup/windows_installer.ps1 b/setup/windows_installer.ps1 new file mode 100644 index 0000000..a0f3fe7 --- /dev/null +++ b/setup/windows_installer.ps1 @@ -0,0 +1,74 @@ +# Powershell install script for tools required on Windows used in the C++ course TDT4102 given at NTNU + +param( + [Parameter()] + [string]$MinGWUrl = "https://studntnu.sharepoint.com/:u:/s/TDT4102/IQDj8vdM8om1RqALb3itQwyiAcTXcg7lYaIoW_CTs_p3KxA?e=T7JmRl&download=1", + [string]$MesonUrl = "https://github.com/mesonbuild/meson/releases/download/1.11.0/meson-1.11.0-64.msi", + [string]$MesonMsiPath = "meson-1.11.0-64.msi", + [switch]$SkipMinGW, + [switch]$SkipMeson, + [switch]$SkipEnv +) + +$MinGWZipPath = ".\MinGW.zip" + +Write-Host "PLEASE KEEP THIS WINDOW OPEN UNTIL PROMPTED" +Write-Host "TDT4102 Tools Installation Script for Windows`n" + +if (! $SkipMinGW ) { + + Write-Host "Downloading MinGW, this may take some time" + Invoke-WebRequest -Uri $MinGWUrl -OutFile $MinGWZipPath + Write-Host "Extracting MinGW to C:\" + # Force will overwrite the previous + Expand-Archive -Path $MinGWZipPath -DestinationPath "C:\" -Force + if (Test-Path -LiteralPath $MinGWZipPath) { + Remove-Item $MinGWZipPath + } +} + +if (! $SkipEnv) { + Write-Host "Setting environment variables and adding to PATH" + [Environment]::SetEnvironmentVariable("CC", "C:\TDT4102-mingw64\bin\gcc", [EnvironmentVariableTarget]::User) + [Environment]::SetEnvironmentVariable("CXX", "C:\TDT4102-mingw64\bin\g++", [EnvironmentVariableTarget]::User) + Write-Host "Environment variables CC and CXX set" + + $binFolder = "C:\TDT4102-mingw64\bin" + $userPath = [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::User) + $listy = $userPath -split ";" + $is_on_path_already = $listy.Contains($binFolder) + if (! $is_on_path_already) { + [Environment]::SetEnvironmentVariable( + "Path", + [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::User) + ";"+ $binFolder+ ";", + [EnvironmentVariableTarget]::User) + Write-Host "Added " $binFolder " to PATH" + } else { + Write-Host $binFolder " is already on PATH" + } +} + +if (! $SkipMeson) { + Write-Host "Installing Meson" + if ((Test-Path -LiteralPath "C:\Program Files\Meson")) { + Write-Host "Looks like Meson is already installed, skipping..." + } else { + if (-not (Test-Path -Path $MesonMsiPath)) { + Write-Host "Downloading Meson" + Invoke-WebRequest -Uri $MesonUrl -OutFile $MesonMsiPath + } else { + $msiArgs = @("/i", "`"$MesonMsiPath`"", "/norestart") + $p = Start-Process -FilePath "msiexec.exe" -ArgumentList $msiArgs -Wait -PassThru + if ($p.ExitCode -ne 0) { + throw "Failed to install Meson! This exit code might help explaining what went wrong. Exit code: $($p.ExitCode)" + } + Write-Host "Meson installed successfully." + if (Test-Path -LiteralPath $MesonMsiPath) { + Remove-Item $MesonMsiPath + } + } + } +} + +Write-Host "`nInstallation finished! Please restart VS Code." +Read-Host -Prompt "`nPress enter to exit" diff --git a/setup/windows_installer_scoop.ps1 b/setup/windows_installer_scoop.ps1 new file mode 100644 index 0000000..63fc962 --- /dev/null +++ b/setup/windows_installer_scoop.ps1 @@ -0,0 +1,58 @@ +# Powershell install script using scoop for tools required on Windows used in the C++ course TDT4102 given at NTNU + +Write-Host "PLEASE KEEP THIS WINDOW OPEN UNTIL PROMPTED" +Write-Host "TDT4102 Tools Installation Script for Windows`n" + +if (-not (Get-Command scoop -ErrorAction SilentlyContinue)) { + Write-Host "Installing Scoop..." + + Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression + + Write-Host "Scoop installed successfully!" +} else { + Write-Host "Scoop already installed." +} + +Write-Host "`nUpdating scoop..." +scoop update + +# Git is needed to get buckets and packages +if (-not (Get-Command git -ErrorAction SilentlyContinue)) { + Write-Host "Installing Git..." + scoop install git +} + +Write-Host "`nAdding buckets..." + +$buckets = @("main", "extras", "versions") + +foreach ($bucket in $buckets) { + if (-not (scoop bucket list | Select-String -SimpleMatch $bucket)) { + scoop bucket add $bucket + } else { + Write-Host "$bucket already added" + } +} + +Write-Host "`nInstalling required packages..." + +$packages = @( + "mingw-winlibs-ucrt", + "meson", + "sdl2", + "sdl2_image", + "sdl2_mixer" +) + +foreach ($pkg in $packages) { + if (scoop list | Select-String -SimpleMatch $pkg) { + Write-Host "$pkg already installed!" + } else { + Write-Host "Installing $pkg..." + scoop install $pkg + } +} + +Write-Host "`nInstallation finished! Please restart VS Code." +Read-Host -Prompt "`nPress enter to exit" diff --git a/templates/_folder_Projects/Sudoku/Documentation.pdf b/templates/_folder_Projects/Sudoku/Documentation.pdf new file mode 100644 index 0000000..7a9074c Binary files /dev/null and b/templates/_folder_Projects/Sudoku/Documentation.pdf differ diff --git a/templates/_folder_Projects/Sudoku/GUI.cpp b/templates/_folder_Projects/Sudoku/GUI.cpp new file mode 100644 index 0000000..9de634d --- /dev/null +++ b/templates/_folder_Projects/Sudoku/GUI.cpp @@ -0,0 +1,225 @@ +#include "GUI.h" + +// Konstruktør for grafikkvinduet +SudokuWindow::SudokuWindow(int x, int y, const std::string& title) : + // Initialiser medlemsvariabler, bruker konstruktøren til AnimationWindow-klassen + AnimationWindow{x, y, width, height, title}, + check_button{button_pos, button_width, button_height, "Check board"}, + victory_box{box_pos, box_width, box_height, "You won!"} + { + // Fyller brettet med tiles + tiles.resize(num_rows); + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + TDT4102::Point board_pos = {row, col}; + tiles.at(row).emplace_back(new Tile{board_pos, TDT4102::Point{pad_size + col * tile_size, pad_size + row * tile_size}, tile_size}); + tiles.at(row).back()->setCallback(std::bind(&SudokuWindow::cb_click, this)); + auto temp = tiles.at(row).back().get(); + add(*temp); + } + + } + + // Legger til knapp for å sjekke brett + check_button.setCallback(std::bind(&SudokuWindow::cb_check, this)); + victory_box.setVisible(false); + add(check_button); + add(victory_box); + +} + +// Returnerer tilen som inneholder spesifisert punkt i vinduet +std::shared_ptr& SudokuWindow::get_tile(TDT4102::Point xy) { + int row = xy.y / tile_size; + int col = xy.x / tile_size; + static std::shared_ptr null_tile = nullptr; + if (row < 0 || row >= num_rows || col < 0 || col >= num_cols) { + return null_tile; + } + return tiles[row][col]; +} + +// Velger en gitt tile, for å kunne endre tallet +void SudokuWindow::select_tile(std::shared_ptr& tile) { + // Deselect current tile if clicking out of bounds or on non-changeable tile + if(!tile || !tile->changeable) { + if(selected_tile) { + selected_tile->is_highlighted = false; + selected_tile->update(); + selected_tile = nullptr; + } + return; + } + + if(selected_tile) { + selected_tile->is_highlighted = false; + selected_tile->update(); + } + + selected_tile = tile; + selected_tile->is_highlighted = true; + selected_tile->update(); +} + +// Sjekker om et punkt er innenfor vinduet +bool SudokuWindow::in_range(TDT4102::Point xy) const { + return (xy.x >= 0 && xy.x< width && xy.y >= 0 && xy.y < height); +} + +// Kjører programmet. Tar inn et forhåndslagd brett fra en tekstfil +void SudokuWindow::run(std::string board_filename) { + while(!should_close()) { + + if(won) { + toggle_visible(false); + victory_box.setVisible(true); + next_frame(); + } + + else { + + if(!game_started) { + try{ + sudoku_board->load_board_from_file(board_filename); + } + catch(const std::ios_base::failure& e) { + std::cerr << "Error: " << e.what() << std::endl; + } + + initialize_tiles(); + game_started = true; + } + draw_grid(); + handle_input(); + next_frame(); + } + } +} + +// Initialiserer det grafiske brettet. Henter forhåndsbestemte tall fra spillbrettet +void SudokuWindow::initialize_tiles() { + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + int num = sudoku_board->get_cell(row, col); + std::shared_ptr tile = tiles.at(row).at(col); + if(num) { + tile->changeable = false; // Kan ikke endre på de forhåndsbestemte tallene + } + try{ + tile->set(num); + } + // Setter tile til 0 hvis den møter på et ugyldig tall + catch(const std::out_of_range& e) { + std::cerr << "Error: " << e.what() << std::endl + << "Could not load invalid number, tile set to 0" << std::endl; + } + } + } +} + +// Setter verdiene i spillbrettet basert på tallene i Tiles +void SudokuWindow::set_tiles() { + int num; + for(int row = 0; row < num_rows; row++) { + for(int col = 0; col < num_cols; col++) { + num = tiles.at(row).at(col)->number; + sudoku_board->set_cell(row, col, num); + } + } +} + +// Slår av eller på synligheten til brettet +void SudokuWindow::toggle_visible(bool visibility) { + for(int row = 0; row < num_rows; row++) { + for(int col = 0; col < num_cols; col++) { + tiles.at(row).at(col)->setVisible(visibility); + } + } +} + +// Tegner rutenett +void SudokuWindow::draw_grid() { + int corr = 3; // Korreksjonsfaktor for å få nettet til å line up + + for(int row = 0; row < num_rows; row++) { + for(int col = 0; col < num_cols; col++) { + if (col % 3 == 0 && col != 0) { + int x = pad_size + col * tile_size; + draw_line({x + corr, pad_size}, {x+ corr, pad_size + board_height}); + } + } + if (row % 3 == 0 && row != 0) { + int y = pad_size + row * tile_size; + draw_line({pad_size, y + corr}, {pad_size + board_height, y + corr}); + } + } +} + +// Callback-funksjon for når brukeren klikker på en tile +void SudokuWindow::cb_click() { + + std::shared_ptr tile; + TDT4102::Point xy{this->get_mouse_coordinates()}; + if (!in_range(xy)) { + std::cout << "Out of range!" << std::endl; + return; + } + if (this->is_left_mouse_button_down()) { + tile = get_tile(xy); + select_tile(tile); + } +} + +// Sjekker om hele brettet er fyllt inn, og gyldig +void SudokuWindow::cb_check() { + set_tiles(); + std::cout << "Board checked" << std::endl; + if (sudoku_board->check_board() && sudoku_board->check_complete()) { + std::cout << "You won!" << std::endl; + play_audio(victory); + won = true; + } + else { + std::cout << "Not quite, keep trying!" << std::endl; + play_audio(fiasco); + } +} + +// Sjekker for input fra tastaturet. Registerer om en tast går fra å ikke være trykket +// inn, til å være trykket inn +void SudokuWindow::handle_input() { + + static bool last_0_state = false; + static bool last_1_state = false; + static bool last_2_state = false; + static bool last_3_state = false; + static bool last_4_state = false; + static bool last_5_state = false; + static bool last_6_state = false; + static bool last_7_state = false; + static bool last_8_state = false; + static bool last_9_state = false; + + bool current_0_state = is_key_down(KeyboardKey::KEY_0); + bool current_1_state = is_key_down(KeyboardKey::KEY_1); + bool current_2_state = is_key_down(KeyboardKey::KEY_2); + bool current_3_state = is_key_down(KeyboardKey::KEY_3); + bool current_4_state = is_key_down(KeyboardKey::KEY_4); + bool current_5_state = is_key_down(KeyboardKey::KEY_5); + bool current_6_state = is_key_down(KeyboardKey::KEY_6); + bool current_7_state = is_key_down(KeyboardKey::KEY_7); + bool current_8_state = is_key_down(KeyboardKey::KEY_8); + bool current_9_state = is_key_down(KeyboardKey::KEY_9); + + if (current_0_state && !last_0_state) { selected_tile->set(0); } + if (current_1_state && !last_1_state) { selected_tile->set(1); } + if (current_2_state && !last_2_state) { selected_tile->set(2); } + if (current_3_state && !last_3_state) { selected_tile->set(3); } + if (current_4_state && !last_4_state) { selected_tile->set(4); } + if (current_5_state && !last_5_state) { selected_tile->set(5); } + if (current_6_state && !last_6_state) { selected_tile->set(6); } + if (current_7_state && !last_7_state) { selected_tile->set(7); } + if (current_8_state && !last_8_state) { selected_tile->set(8); } + if (current_9_state && !last_9_state) { selected_tile->set(9); } + +} \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/GUI.h b/templates/_folder_Projects/Sudoku/GUI.h new file mode 100644 index 0000000..6d7ac8e --- /dev/null +++ b/templates/_folder_Projects/Sudoku/GUI.h @@ -0,0 +1,64 @@ +#pragma once +#include +#include "AnimationWindow.h" +#include "Tile.h" +#include "Sudoku.h" +#include "widgets/TextInput.h" + +class SudokuWindow : public TDT4102::AnimationWindow +{ + private: + + // Konstanter for grafikkvinduet + static constexpr int tile_size = 33; + static constexpr int board_width = num_cols*tile_size; + static constexpr int board_height = num_rows*tile_size; + static constexpr int pad_size = 10; + static constexpr int button_width = board_width; + static constexpr int box_width = board_width; + static constexpr int button_height = 40; + static constexpr int box_height = 60; + + static constexpr int width = 2 * pad_size + board_width; + static constexpr int height = 3 * pad_size + board_height + button_height; + + static constexpr TDT4102::Point button_pos = {pad_size + tile_size/4, 2*pad_size + board_height}; + static constexpr TDT4102::Point box_pos = {pad_size, (height-box_height)/2}; + + static inline TDT4102::Audio victory{"assets/victory.mp3"}; + static inline TDT4102::Audio fiasco{"assets/fiasco.mp3"}; + + + // 2D-vektor med Tiles, som utgjør det grafiske brettet + std::vector>> tiles; + std::shared_ptr selected_tile; + + // Øvrige GUI-elementer + TDT4102::Button check_button; + TDT4102::TextInput victory_box; + + // Spillbrett-objektet som kjører spillogikken + std::shared_ptr sudoku_board = std::make_shared(); + bool game_started = false; + bool won = false; + + + // Medlemsfunksjoner + std::shared_ptr& get_tile(TDT4102::Point); + void select_tile(std::shared_ptr& tile); + bool in_range(TDT4102::Point xy) const; + void handle_input(); + void cb_click(); + void cb_check(); + void initialize_tiles(); + void set_tiles(); + void toggle_visible(bool visible); + void draw_grid(); + + public: + // konstruktør + SudokuWindow(int x, int y, const std::string& title); + // kjører programmet + void run(std::string board_filename); + +}; \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/README.md b/templates/_folder_Projects/Sudoku/README.md new file mode 100644 index 0000000..345a59b --- /dev/null +++ b/templates/_folder_Projects/Sudoku/README.md @@ -0,0 +1,5 @@ +# Sudoku + +En enkel versjon av Sudoku skrevet i C++. + +Dokumentasjon ligger i egen PDF-fil. Merk at denne er lenger og mer utfyllende enn det som er forventet av dere i prosjektet! diff --git a/templates/_folder_Projects/Sudoku/Sudoku.cpp b/templates/_folder_Projects/Sudoku/Sudoku.cpp new file mode 100644 index 0000000..7221771 --- /dev/null +++ b/templates/_folder_Projects/Sudoku/Sudoku.cpp @@ -0,0 +1,149 @@ +#include "Sudoku.h" + +// Default-konstruktør for spillbrettet +Sudoku::Sudoku() { + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + this->board[row][col] = 0; + } + } +} + +// Konstruktør som oppretter spillbrettet basert på et eksisterende array +Sudoku::Sudoku(int board[9][9]) { + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + this->board[row][col] = board[row][col]; + } + } +} + +// Printer ut spillbrettet til terminal +void Sudoku::print_board() { + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + std::cout << board[row][col] << " "; + if(col == 2 || col == 5){ + std::cout << "| "; + } + } + if(row == 2 || row == 5){ + std::cout << std::endl; + std::cout << "---------------------"; + } + std::cout << std::endl; + } + std::cout << std::endl; +} + +// Sjekker om en rad er gyldig +bool Sudoku::check_row(int row) { + + bool seen[10] = {false}; // Array to track numbers 1-9 (index 0 is unused) + + for (int col = 0; col < num_cols; col++) { + int num = board[row][col]; + if (num) { // Ignore empty tiles + if (seen[num]) { + std::cout << "Row " << row + 1 << " not valid" << std::endl; + return false; // Duplicate found + } + seen[num] = true; + } + } + return true; // No duplicates found +} + +// Sjekker om en kolonne er gyldig +bool Sudoku::check_col(int col) { + + bool seen[10] = {false}; // Array to track numbers 1-9 (index 0 is unused) + + for (int row = 0; row < num_rows; row++) { + int num = board[row][col]; + if (num) { // Ignore empty tiles + if (seen[num]) { + std::cout << "Column " << col + 1 << " not valid" << std::endl; + return false; // Duplicate found + } + seen[num] = true; + } + } + return true; // No duplicates found +} + +// Sjekker om en boks (3x3 seksjon) er gyldig +bool Sudoku::check_box(int box) { + bool seen[10] = {false}; + int start_row = (box/3) * 3; + int start_col = (box%3) * 3; + for (int row = start_row; row < start_row + 3; row++) { + for (int col = start_col; col < start_col + 3; col++) { + int num = board[row][col]; + if (num) { + if (seen[num]) { + std::cout << "Box " << box + 1 << " not valid" << std::endl; + return false; // Duplicate found + } + seen[num] = true; + } + } + } + return true; +} + +// Lagrer spillbrettet til spesifisert tekstfil +void Sudoku::save_board_to_file(std::string filename){ + std::filesystem::path save_file{filename}; + std::ofstream ofs{save_file}; + if(!ofs) { + throw std::ios_base::failure("Could not open file: " + filename); + } + + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + ofs << board[row][col] << " "; + } + ofs << '\n'; + } +} + +// Laster inn et spillbrett fra spesifisert tekstfil +void Sudoku::load_board_from_file(std::string filename) { + std::filesystem::path load_file{filename}; + std::ifstream ifs{load_file}; + if(!ifs) { + throw std::ios_base::failure("Could not open file: " + filename); + } + int num; + + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + ifs >> num; + set_cell(row, col, num); + } + } +} + +// Sjekker om hele brettet er gyldig +bool Sudoku::check_board() { + for (int i = 0; i < num_rows; i++) { + if(!check_row(i) || !check_col(i) || !check_box(i)) { + return false; + } + } + return true; +} + +// Sjekker om hele brettet er fylt inn +bool Sudoku::check_complete() { + for (int row = 0; row < num_rows; row++) { + for (int col = 0; col < num_cols; col++) { + if(!board[row][col]) { + std::cout << "Board incomplete" << std::endl; + return false; + } + } + } + return true; +} \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/Sudoku.h b/templates/_folder_Projects/Sudoku/Sudoku.h new file mode 100644 index 0000000..8d7c648 --- /dev/null +++ b/templates/_folder_Projects/Sudoku/Sudoku.h @@ -0,0 +1,30 @@ +#pragma once +#include "Tile.h" +#include +#include +#include + +constexpr int num_rows = 9; +constexpr int num_cols = 9; + + +class Sudoku { + private: + int board[9][9]; + public: + Sudoku(); + Sudoku(int board[9][9]); + + void set_cell(int row, int col, int num) {board[row][col] = num;} + int get_cell(int row, int col) { return board[row][col];} + void save_board_to_file(std::string filename); + void load_board_from_file(std::string filename); + void print_board(); + + bool check_row(int row); + bool check_col(int col); + bool check_box(int box); + bool check_board(); + bool check_complete(); + +}; \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/Tile.cpp b/templates/_folder_Projects/Sudoku/Tile.cpp new file mode 100644 index 0000000..2020ece --- /dev/null +++ b/templates/_folder_Projects/Sudoku/Tile.cpp @@ -0,0 +1,45 @@ +#include "Tile.h" + +Tile::Tile(TDT4102::Point board_pos, TDT4102::Point pos, int size, int num) : +Button(pos, 1.5*size, size, "") { + + if (num > 9 || num < 0) { + throw(std::out_of_range("Number " + std::to_string(num) + " not between 0-9")); + } + this->number = num; + this->is_highlighted = false; + update(); +} + +// Oppdaterer grafikken til tilen. Sjekker om den er tom, om den er valgt, og om den kan endres +void Tile::update() { + if(number) { + setLabel(std::to_string(number)); + } + else { + setLabel(""); + } + + if(is_highlighted) { + setButtonColor(highlight_color); + } + else { + setButtonColor(default_color); + } + if(changeable) { + setLabelColor(default_label_color); + } + else { + setLabelColor(unchangeable_label_color); + } + +} + +// Setter verdien på tilen til det gitte tallet +void Tile::set(int num) { + if (num > 9 || num < 0) { + throw(std::out_of_range("Number " + std::to_string(num) + " not between 0-9")); + } + number = num; + update(); +} \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/Tile.h b/templates/_folder_Projects/Sudoku/Tile.h new file mode 100644 index 0000000..ea2eb4c --- /dev/null +++ b/templates/_folder_Projects/Sudoku/Tile.h @@ -0,0 +1,23 @@ +#pragma once +#include +#include "AnimationWindow.h" +#include "widgets/Button.h" + +const TDT4102::Color default_color = TDT4102::Color::white; +const TDT4102::Color highlight_color = TDT4102::Color::sky_blue; +const TDT4102::Color default_label_color = TDT4102::Color::dim_grey; +const TDT4102::Color unchangeable_label_color = TDT4102::Color::black; + +struct Tile : public TDT4102::Button{ + + Tile(TDT4102::Point board_pos, TDT4102::Point pos, int size, int number = 0); + + int number; + bool is_highlighted; + bool changeable = true; + TDT4102::Point board_pos; + + void set(int num); + void update(); + +}; \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/assets/fiasco.mp3 b/templates/_folder_Projects/Sudoku/assets/fiasco.mp3 new file mode 100644 index 0000000..cf5c676 Binary files /dev/null and b/templates/_folder_Projects/Sudoku/assets/fiasco.mp3 differ diff --git a/templates/_folder_Projects/Sudoku/assets/victory.mp3 b/templates/_folder_Projects/Sudoku/assets/victory.mp3 new file mode 100644 index 0000000..2a4e7f8 Binary files /dev/null and b/templates/_folder_Projects/Sudoku/assets/victory.mp3 differ diff --git a/templates/_folder_Projects/Sudoku/game-files/almost_solved.txt b/templates/_folder_Projects/Sudoku/game-files/almost_solved.txt new file mode 100644 index 0000000..b0a2f51 --- /dev/null +++ b/templates/_folder_Projects/Sudoku/game-files/almost_solved.txt @@ -0,0 +1,9 @@ +0 3 5 2 6 9 7 8 1 +6 8 2 5 7 1 4 9 3 +1 9 7 8 3 4 5 6 2 +8 2 6 1 9 5 3 4 7 +3 7 4 6 8 2 9 1 5 +9 5 1 7 4 3 6 2 8 +5 1 9 3 2 6 8 7 4 +2 4 8 9 5 7 1 3 6 +7 6 3 4 1 8 2 5 9 \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/game-files/easy.txt b/templates/_folder_Projects/Sudoku/game-files/easy.txt new file mode 100644 index 0000000..9c8fc1e --- /dev/null +++ b/templates/_folder_Projects/Sudoku/game-files/easy.txt @@ -0,0 +1,9 @@ +0 0 2 6 0 7 0 1 0 +6 8 0 0 0 7 0 9 0 +1 9 0 0 4 5 0 0 0 +8 2 0 1 0 0 0 4 0 +0 4 6 0 2 9 0 0 0 +5 0 0 0 3 0 0 2 8 +0 9 3 0 0 7 0 4 0 +4 0 5 0 0 0 3 6 0 +7 3 0 1 8 0 0 0 0 \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/game-files/hard.txt b/templates/_folder_Projects/Sudoku/game-files/hard.txt new file mode 100644 index 0000000..c74b47e --- /dev/null +++ b/templates/_folder_Projects/Sudoku/game-files/hard.txt @@ -0,0 +1,9 @@ +2 0 0 5 0 7 4 0 6 +0 0 0 0 3 1 0 0 0 +0 0 0 0 0 0 2 3 0 +0 0 0 0 2 0 0 0 0 +8 6 0 3 1 0 0 0 0 +0 4 5 0 0 0 0 0 0 +0 0 9 0 0 0 7 0 0 +0 0 6 9 5 0 0 0 2 +0 0 1 0 0 6 0 0 8 \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/game-files/medium.txt b/templates/_folder_Projects/Sudoku/game-files/medium.txt new file mode 100644 index 0000000..815ad59 --- /dev/null +++ b/templates/_folder_Projects/Sudoku/game-files/medium.txt @@ -0,0 +1,9 @@ +0 0 0 5 0 7 0 0 0 +0 4 0 2 6 3 0 0 0 +1 0 7 4 0 0 0 0 0 +3 6 0 0 0 0 0 4 5 +0 0 2 0 5 0 7 0 0 +7 9 0 0 0 0 0 6 2 +0 0 0 0 0 9 4 0 1 +0 0 0 1 3 4 0 9 0 +0 0 0 6 0 5 0 0 0 \ No newline at end of file diff --git a/templates/_folder_Projects/Sudoku/main.cpp b/templates/_folder_Projects/Sudoku/main.cpp new file mode 100644 index 0000000..f435f50 --- /dev/null +++ b/templates/_folder_Projects/Sudoku/main.cpp @@ -0,0 +1,12 @@ +#include "Sudoku.h" +#include "GUI.h" + +int main() { + + TDT4102::Point start_point{200, 300}; + + SudokuWindow sw{start_point.x, start_point.y, "Sudoku"}; + sw.run("game-files/almost_solved.txt"); + + return 0; +} \ No newline at end of file diff --git a/templates/_folder_Projects/TextEditor/TextEditor.cpp b/templates/_folder_Projects/TextEditor/TextEditor.cpp new file mode 100644 index 0000000..25ac390 --- /dev/null +++ b/templates/_folder_Projects/TextEditor/TextEditor.cpp @@ -0,0 +1,67 @@ +#include "TextEditor.h" + +// Constructs and opens the text editor window +TextEditor::TextEditor(TDT4102::Point pos) : TDT4102::AnimationWindow{pos.x, pos.y, windowWidth, windowHeight, "Text Editor"}, + loadButton{loadPos, buttonWidth, buttonHeight, "Load text"}, + saveButton{savePos, buttonWidth, buttonHeight, "Save text"}, + textBox{textboxPos, textboxWidth, textboxHeight}, + fileTextBox{fileTextboxPos, fileTextboxWidth, fileTextboxHeight} +{ + // Adds GUI elements and sets callbacks + add(loadButton); + add(saveButton); + add(textBox); + add(fileTextBox); + loadButton.setCallback(std::bind(&TextEditor::cb_load, this)); + saveButton.setCallback(std::bind(&TextEditor::cb_save, this)); +} + +// Loads text from file specified in text box +void TextEditor::loadFromFile() { + storedText = ""; + filename = fileTextBox.getText(); + std::filesystem::path loadPath{filename}; + std::ifstream ifs{loadPath}; + if (!ifs) { + throw std::ios_base::failure("Could not open load file: " + filename); + } + std::string s; + while(getline(ifs, s)) { + storedText += s; + } + textBox.setText(storedText); +} + +// Saves text to file specified in text box +void TextEditor::saveToFile() { + storedText = textBox.getText(); + filename = fileTextBox.getText(); + std::filesystem::path savePath{filename}; + std::ofstream ofs{savePath}; + if (!ofs) { + throw std::ios_base::failure("Could not open save file: " + filename); + } + ofs << storedText; +} + +// Callback funtion for "Load text"-button +void TextEditor::cb_load() { + try{ + loadFromFile(); + play_audio(pling, 1); + } + catch(const std::ios_base::failure& e) { + std::cerr << "Error: " << e.what() << std::endl; + } +} + +// Callback function for "Save text"-button +void TextEditor::cb_save() { + try{ + saveToFile(); + play_audio(pling, 1); + } + catch(const std::ios_base::failure& e) { + std::cerr << "Error: " << e.what() << std::endl; + } +} diff --git a/templates/_folder_Projects/TextEditor/TextEditor.h b/templates/_folder_Projects/TextEditor/TextEditor.h new file mode 100644 index 0000000..2fef986 --- /dev/null +++ b/templates/_folder_Projects/TextEditor/TextEditor.h @@ -0,0 +1,54 @@ +#pragma once +#include +#include +#include "AnimationWindow.h" +#include "widgets/Button.h" +#include "widgets/TextInput.h" + + +class TextEditor : public TDT4102::AnimationWindow { + private: + // Constants defining GUI element sizes + static constexpr int textboxHeight = 400; + static constexpr int textboxWidth = 300; + static constexpr int padSize = 10; + static constexpr int fileTextboxHeight = 30; + static constexpr int fileTextboxWidth = textboxWidth; + static constexpr int buttonHeight = 50; + static constexpr int buttonWidth = 100; + + static constexpr int windowHeight = 3*padSize + textboxHeight + fileTextboxHeight; + static constexpr int windowWidth = 3*padSize + textboxWidth + buttonWidth; + + static constexpr TDT4102::Point loadPos = {2*padSize + textboxWidth, padSize}; + static constexpr TDT4102::Point savePos = {2*padSize + textboxWidth, 2*padSize + buttonHeight}; + static constexpr TDT4102::Point textboxPos = {padSize, padSize}; + static constexpr TDT4102::Point fileTextboxPos = {padSize, 2*padSize + textboxHeight}; + + inline static TDT4102::Audio pling{"assets/dingding.mp3"}; + + // Buttons + TDT4102::Button loadButton; + TDT4102::Button saveButton; + + // Text inputs + TDT4102::TextInput textBox; + TDT4102::TextInput fileTextBox; + + // Variables to store filename and text + std::string filename; + std::string storedText; + + // File handling + void loadFromFile(); + void saveToFile(); + + // Callback functions + void cb_load(); + void cb_save(); + + + public: + // Constructor + TextEditor(TDT4102::Point pos); +}; \ No newline at end of file diff --git a/templates/_folder_Projects/TextEditor/assets/dingding.mp3 b/templates/_folder_Projects/TextEditor/assets/dingding.mp3 new file mode 100644 index 0000000..963e952 Binary files /dev/null and b/templates/_folder_Projects/TextEditor/assets/dingding.mp3 differ diff --git a/templates/_folder_Projects/TextEditor/main.cpp b/templates/_folder_Projects/TextEditor/main.cpp new file mode 100644 index 0000000..a493387 --- /dev/null +++ b/templates/_folder_Projects/TextEditor/main.cpp @@ -0,0 +1,10 @@ +#include "TextEditor.h" + + +int main() { + + TextEditor te{{300, 200}}; + te.wait_for_close(); + + return 0; +} diff --git a/templates/_folder_Projects/Tic-Tac-Toe/README.md b/templates/_folder_Projects/Tic-Tac-Toe/README.md new file mode 100644 index 0000000..03fec51 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/README.md @@ -0,0 +1,27 @@ +# Tic Tac Toe Game + +A simple Tic Tac Toe game built using C++. + +## Documentation + +The documentation for this project is generated using [Doxygen](https://www.doxygen.nl/). The documentation can be found in the `docs` folder. Please note that the `html` folder needs to be downloaded for the Doxygen documentation to be opened properly. To view the documentation, navigate to the `docs/html` folder and open the `index.html` file in your web browser. + +## Mini Guide to Doxygen + +### Downloads +1. Download and install Doxygen from [here](https://www.doxygen.nl/download.html). + +### Create Config File +1. After downloading open a terminal or command prompt. +2. Navigate to your project directory. +3. Run the command: `doxygen -g Doxyfile` to generate a default configuration file named `Doxyfile`. + +### Generate Documentation +1. Open the `Doxyfile` in a text editor. For example, you can use the command `code Doxyfile` to open it in VS Code. +2. Set the `INPUT` field to the directories containing your source code. +3. Set the `OUTPUT_DIRECTORY` field to the desired output directory (e.g., `docs`). +4. Save the `Doxyfile`. +5. Run the command: `doxygen Doxyfile` to generate the documentation. + +The generated documentation will be available in the specified output directory. Note that it is recommended to adjust additional variables inside the `Doxyfile` to match the desired level of documentation for your project, such as `RECURSIVE`, `EXTRACT_ALL`, and `EXTRACT_PRIVATE`. + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/TicTacToeWindow.cpp b/templates/_folder_Projects/Tic-Tac-Toe/TicTacToeWindow.cpp new file mode 100644 index 0000000..9105b3a --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/TicTacToeWindow.cpp @@ -0,0 +1,228 @@ +/** + * @file TicTacToeWindow.cpp + * @brief Contains the implementation of the TicTacToeWindow class. + * + * @details This file uses the following libraries and resources: + * - TicTacToeWindow.h for class definition + * - iostream for standard input/output operations + */ + +#include "TicTacToeWindow.h" +#include + +constexpr int BUTTON_WIDTH = 100; +constexpr int BUTTON_HEIGHT = 30; +constexpr int RESET_BUTTON_X = 10; +constexpr int RESET_BUTTON_Y = 10; +constexpr int QUIT_BUTTON_X = 120; +constexpr int QUIT_BUTTON_Y = 10; +constexpr int RESULT_TEXT_X = 240; +constexpr int RESULT_TEXT_Y = 10; + +constexpr int BOARD_SIZE = 600; +constexpr int CELL_SIZE = BOARD_SIZE / 3; +constexpr int BOARD_X = 20; +constexpr int BOARD_Y = 60; +constexpr int FONT_SIZE = 100; + +/** + * @brief Constructs the TicTacToeWindow object and initializes the game. + * @param x X-coordinate of the window. + * @param y Y-coordinate of the window. + * @param width Width of the window. + * @param height Height of the window. + * @param title Title of the window. + */ +TicTacToeWindow::TicTacToeWindow(int x, int y, int width, int height, const std::string& title) + : AnimationWindow(x, y, width, height, title), current_player('X'), reset_button({RESET_BUTTON_X, RESET_BUTTON_Y}, BUTTON_WIDTH, BUTTON_HEIGHT, "Reset"), quit_button({QUIT_BUTTON_X, QUIT_BUTTON_Y}, BUTTON_WIDTH, BUTTON_HEIGHT, "Quit"), game_over(false) { + reset_game(); + add(reset_button); + add(quit_button); + reset_button.setCallback(std::bind(&TicTacToeWindow::cb_reset, this)); + quit_button.setCallback(std::bind(&TicTacToeWindow::cb_quit, this)); +} + +/** + * @brief Starts the game loop. + */ +void TicTacToeWindow::play() { + while (!should_close()) { + if (is_left_mouse_button_down() && !game_over) { + auto [x, y] = get_mouse_coordinates(); + if (x >= RESET_BUTTON_X && x <= RESET_BUTTON_X + BUTTON_WIDTH && y >= RESET_BUTTON_Y && y <= RESET_BUTTON_Y + BUTTON_HEIGHT) { + cb_reset(); + } else if (x >= QUIT_BUTTON_X && x <= QUIT_BUTTON_X + BUTTON_WIDTH && y >= QUIT_BUTTON_Y && y <= QUIT_BUTTON_Y + BUTTON_HEIGHT) { + cb_quit(); + } else { + try { + handle_click(x, y); + } catch (const std::out_of_range& e) { + std::cerr << "Error: " << e.what() << std::endl; + } + } + } + + if (check_winner()) { + result_text = "Player " + std::string(1, last_player) + " wins!"; + draw_winning_line(); + if (!game_over) { + write_result_to_file(result_text); + } + game_over = true; + } else if (check_draw()) { + result_text = "The game is a draw!"; + if (!game_over) { + write_result_to_file(result_text); + } + game_over = true; + } + + draw_board(); + draw_marks(); + draw_text({RESULT_TEXT_X, RESULT_TEXT_Y}, result_text, TDT4102::Color::black, 30); + + next_frame(); + } +} + +/** + * @brief Draws the Tic Tac Toe board grid. + */ +void TicTacToeWindow::draw_board() { + for (int i = 1; i < 3; ++i) { + draw_line({BOARD_X + i * CELL_SIZE, BOARD_Y}, {BOARD_X + i * CELL_SIZE, BOARD_Y + BOARD_SIZE}, TDT4102::Color::black); + draw_line({BOARD_X, BOARD_Y + i * CELL_SIZE}, {BOARD_X + BOARD_SIZE, BOARD_Y + i * CELL_SIZE}, TDT4102::Color::black); + } +} + +/** + * @brief Draws the marks (X and O) on the board. + */ +void TicTacToeWindow::draw_marks() { + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 3; ++col) { + if (board[row][col] == 'X') { + draw_text({BOARD_X * 3 / 2 + col * CELL_SIZE + FONT_SIZE / 2, BOARD_Y + row * CELL_SIZE + FONT_SIZE / 2}, "X", TDT4102::Color::red, FONT_SIZE); + } else if (board[row][col] == 'O') { + draw_text({BOARD_X * 3 / 2 + col * CELL_SIZE + FONT_SIZE / 2, BOARD_Y + row * CELL_SIZE + FONT_SIZE / 2}, "O", TDT4102::Color::blue, FONT_SIZE); + } + } + } +} + +/** + * @brief Draws the line indicating the winning combination on the board. + */ +void TicTacToeWindow::draw_winning_line() { + draw_line(winning_line.first, winning_line.second, TDT4102::Color::yellow); +} + +/** + * @brief Handles mouse click events and updates the board with marks. + * @param x X-coordinate of the mouse click. + * @param y Y-coordinate of the mouse click. + * @throws std::out_of_range if the clicked position is outside the board. + */ +void TicTacToeWindow::handle_click(int x, int y) { + int row = (y - BOARD_Y) / CELL_SIZE; + int col = (x - BOARD_X) / CELL_SIZE; + + if (row < 0 || row >= 3 || col < 0 || col >= 3) { + throw std::out_of_range("Invalid board position"); + } + + if (board[row][col] == ' ') { + board[row][col] = current_player; + last_player = current_player; + current_player = (current_player == 'X') ? 'O' : 'X'; + } +} + +/** + * @brief Checks if there is a winner in the game. + * @return true if there is a winner, false otherwise. + */ +bool TicTacToeWindow::check_winner() { + // Check rows and columns + for (int i = 0; i < 3; ++i) { + if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { + winning_line = {{BOARD_X, BOARD_Y + i * CELL_SIZE + CELL_SIZE / 2}, {BOARD_X + BOARD_SIZE, BOARD_Y + i * CELL_SIZE + CELL_SIZE / 2}}; + return true; + } + if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') { + winning_line = {{BOARD_X + i * CELL_SIZE + CELL_SIZE / 2, BOARD_Y}, {BOARD_X + i * CELL_SIZE + CELL_SIZE / 2, BOARD_Y + BOARD_SIZE}}; + return true; + } + } + + // Check diagonals + if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { + winning_line = {{BOARD_X, BOARD_Y}, {BOARD_X + BOARD_SIZE, BOARD_Y + BOARD_SIZE}}; + return true; + } + if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') { + winning_line = {{BOARD_X + BOARD_SIZE, BOARD_Y}, {BOARD_X, BOARD_Y + BOARD_SIZE}}; + return true; + } + + return false; +} + +/** + * @brief Checks if the game has ended in a draw. + * @return true if the game is a draw, false otherwise. + */ +bool TicTacToeWindow::check_draw() { + for (const auto& row : board) { + for (char cell : row) { + if (cell == ' ') { + return false; + } + } + } + return true; +} + +/** + * @brief Resets the game to its initial state. + */ +void TicTacToeWindow::reset_game() { + std::cout << "Resetting game..." << std::endl; + board = std::vector>(3, std::vector(3, ' ')); + current_player = 'X'; + game_over = false; + result_text.clear(); + std::cout << "Game reset complete." << std::endl; +} + +/** + * @brief Writes the game result to a file. + * @param result The result string to write. + */ +void TicTacToeWindow::write_result_to_file(const std::string& result) { + try { + std::ofstream file("game_results.txt", std::ios::app); + if (!file) { + throw std::ios_base::failure("Failed to open file"); + } + file << result << std::endl; + } catch (const std::ios_base::failure& e) { + show_error_dialog("Error writing to file: " + std::string(e.what())); + } +} + +/** + * @brief Callback function for the reset button. + */ +void TicTacToeWindow::cb_reset() { + std::cout << "Reset button pressed." << std::endl; + reset_game(); +} + +/** + * @brief Callback function for the quit button. + */ +void TicTacToeWindow::cb_quit() { + std::cout << "Quit button pressed." << std::endl; + close(); +} diff --git a/templates/_folder_Projects/Tic-Tac-Toe/TicTacToeWindow.h b/templates/_folder_Projects/Tic-Tac-Toe/TicTacToeWindow.h new file mode 100644 index 0000000..8c2e092 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/TicTacToeWindow.h @@ -0,0 +1,106 @@ +/** + * @file TicTacToeWindow.h + * @brief Defines the TicTacToeWindow class for handling game logic and UI. + * + * @details This file uses the following libraries and resources: + * - AnimationWindow from TDT4102 + * - Button widget from TDT4102 + * - Standard C++ libraries: vector, fstream, stdexcept + */ + +#pragma once + +#include "AnimationWindow.h" +#include "widgets/Button.h" +#include +#include +#include + +using namespace TDT4102; + +/** + * @class TicTacToeWindow + * @brief Handles the Tic Tac Toe game logic and user interface. + */ +class TicTacToeWindow : public TDT4102::AnimationWindow { +public: + /** + * @brief Constructs a TicTacToeWindow object. + * @param x X-coordinate of the window. + * @param y Y-coordinate of the window. + * @param width Width of the window. + * @param height Height of the window. + * @param title Title of the window. + */ + TicTacToeWindow(int x, int y, int width, int height, const std::string& title); + + /** + * @brief Starts the game loop. + */ + void play(); + +private: + /** + * @brief Draws the Tic Tac Toe board. + */ + void draw_board(); + + /** + * @brief Draws the marks (X and O) on the board. + */ + void draw_marks(); + + /** + * @brief Draws a line to indicate the winning combination. + */ + void draw_winning_line(); + + /** + * @brief Handles mouse click events to place marks. + * @param x X-coordinate of the click. + * @param y Y-coordinate of the click. + */ + void handle_click(int x, int y); + + /** + * @brief Checks if there is a winner. + * @return true if a player has won, false otherwise. + */ + bool check_winner(); + + /** + * @brief Checks if the game is a draw. + * @return true if the game is a draw, false otherwise. + */ + bool check_draw(); + + /** + * @brief Resets the game to its initial state. + */ + void reset_game(); + + /** + * @brief Writes the game result to a file. + * @param result The result string to write. + */ + void write_result_to_file(const std::string& result); + + /** + * @brief Callback function for the reset button. + */ + void cb_reset(); + + /** + * @brief Callback function for the quit button. + */ + void cb_quit(); + + std::vector> board; ///< 3x3 board representation. + char current_player; ///< Current player ('X' or 'O'). + char last_player; ///< Last player to have made a move. + Button reset_button; ///< Button to reset the game. + Button quit_button; ///< Button to quit the game. + bool game_over; ///< Flag indicating if the game is over. + std::string result_text; ///< Text indicating the winner. + std::pair winning_line; ///< Coordinates for the winning line. +}; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8cpp.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8cpp.html new file mode 100644 index 0000000..505c1d9 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8cpp.html @@ -0,0 +1,448 @@ + + + + + + + +My Project: TicTacToeWindow.cpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
TicTacToeWindow.cpp File Reference
+
+
+ +

Contains the implementation of the TicTacToeWindow class. +More...

+
#include "TicTacToeWindow.h"
+#include <iostream>
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Variables

constexpr int BUTTON_WIDTH = 100
 
constexpr int BUTTON_HEIGHT = 30
 
constexpr int RESET_BUTTON_X = 10
 
constexpr int RESET_BUTTON_Y = 10
 
constexpr int QUIT_BUTTON_X = 120
 
constexpr int QUIT_BUTTON_Y = 10
 
constexpr int RESULT_TEXT_X = 240
 
constexpr int RESULT_TEXT_Y = 10
 
constexpr int BOARD_SIZE = 600
 
constexpr int CELL_SIZE = BOARD_SIZE / 3
 
constexpr int BOARD_X = 20
 
constexpr int BOARD_Y = 60
 
constexpr int FONT_SIZE = 100
 
+

Detailed Description

+

Contains the implementation of the TicTacToeWindow class.

+

This file uses the following libraries and resources:

    +
  • TicTacToeWindow.h for class definition
  • +
  • iostream for standard input/output operations
  • +
+

Variable Documentation

+ +

◆ BOARD_SIZE

+ +
+
+ + + + + +
+ + + + +
int BOARD_SIZE = 600
+
+constexpr
+
+ +
+
+ +

◆ BOARD_X

+ +
+
+ + + + + +
+ + + + +
int BOARD_X = 20
+
+constexpr
+
+ +
+
+ +

◆ BOARD_Y

+ +
+
+ + + + + +
+ + + + +
int BOARD_Y = 60
+
+constexpr
+
+ +
+
+ +

◆ BUTTON_HEIGHT

+ +
+
+ + + + + +
+ + + + +
int BUTTON_HEIGHT = 30
+
+constexpr
+
+ +
+
+ +

◆ BUTTON_WIDTH

+ +
+
+ + + + + +
+ + + + +
int BUTTON_WIDTH = 100
+
+constexpr
+
+ +
+
+ +

◆ CELL_SIZE

+ +
+
+ + + + + +
+ + + + +
int CELL_SIZE = BOARD_SIZE / 3
+
+constexpr
+
+ +
+
+ +

◆ FONT_SIZE

+ +
+
+ + + + + +
+ + + + +
int FONT_SIZE = 100
+
+constexpr
+
+ +
+
+ +

◆ QUIT_BUTTON_X

+ +
+
+ + + + + +
+ + + + +
int QUIT_BUTTON_X = 120
+
+constexpr
+
+ +
+
+ +

◆ QUIT_BUTTON_Y

+ +
+
+ + + + + +
+ + + + +
int QUIT_BUTTON_Y = 10
+
+constexpr
+
+ +
+
+ +

◆ RESET_BUTTON_X

+ +
+
+ + + + + +
+ + + + +
int RESET_BUTTON_X = 10
+
+constexpr
+
+ +
+
+ +

◆ RESET_BUTTON_Y

+ +
+
+ + + + + +
+ + + + +
int RESET_BUTTON_Y = 10
+
+constexpr
+
+ +
+
+ +

◆ RESULT_TEXT_X

+ +
+
+ + + + + +
+ + + + +
int RESULT_TEXT_X = 240
+
+constexpr
+
+ +
+
+ +

◆ RESULT_TEXT_Y

+ +
+
+ + + + + +
+ + + + +
int RESULT_TEXT_Y = 10
+
+constexpr
+
+ +
+
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8cpp.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8cpp.js new file mode 100644 index 0000000..2a6ec32 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8cpp.js @@ -0,0 +1,16 @@ +var _tic_tac_toe_window_8cpp = +[ + [ "BOARD_SIZE", "_tic_tac_toe_window_8cpp.html#ad61312467c560853b884baba85ccb6cc", null ], + [ "BOARD_X", "_tic_tac_toe_window_8cpp.html#a734171bf86d25d8fea97ec3db770f339", null ], + [ "BOARD_Y", "_tic_tac_toe_window_8cpp.html#a7a25c54899aa5eb9067fa355bd0fd2f0", null ], + [ "BUTTON_HEIGHT", "_tic_tac_toe_window_8cpp.html#a3b3ba52cbf88acec5e16bc4637e77007", null ], + [ "BUTTON_WIDTH", "_tic_tac_toe_window_8cpp.html#a5abca8d83548cc8db6c91b204fc0fc3e", null ], + [ "CELL_SIZE", "_tic_tac_toe_window_8cpp.html#afb719a6797676ba986f056e63fa45a25", null ], + [ "FONT_SIZE", "_tic_tac_toe_window_8cpp.html#a36f8b4b0227f9dac9b5018b20c9a1f51", null ], + [ "QUIT_BUTTON_X", "_tic_tac_toe_window_8cpp.html#a907d240438ef5a233d89f060d2ab7ce6", null ], + [ "QUIT_BUTTON_Y", "_tic_tac_toe_window_8cpp.html#a7c67ea62ace270bfbc30fa241530f5f9", null ], + [ "RESET_BUTTON_X", "_tic_tac_toe_window_8cpp.html#a46907144aa852e2450a4784f7bd67702", null ], + [ "RESET_BUTTON_Y", "_tic_tac_toe_window_8cpp.html#a65f9c1ca2be2ebd241cba5b02ae39514", null ], + [ "RESULT_TEXT_X", "_tic_tac_toe_window_8cpp.html#ae32dfc3a976f735ff01c1757ba107610", null ], + [ "RESULT_TEXT_Y", "_tic_tac_toe_window_8cpp.html#aba7c1f86d23ea3fad3d8099789a51311", null ] +]; \ No newline at end of file diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h.html new file mode 100644 index 0000000..26ac491 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h.html @@ -0,0 +1,144 @@ + + + + + + + +My Project: TicTacToeWindow.h File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
TicTacToeWindow.h File Reference
+
+
+ +

Defines the TicTacToeWindow class for handling game logic and UI. +More...

+
#include "AnimationWindow.h"
+#include "widgets/Button.h"
+#include <vector>
+#include <fstream>
+#include <stdexcept>
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  TicTacToeWindow
 Handles the Tic Tac Toe game logic and user interface. More...
 
+

Detailed Description

+

Defines the TicTacToeWindow class for handling game logic and UI.

+

This file uses the following libraries and resources:

    +
  • AnimationWindow from TDT4102
  • +
  • Button widget from TDT4102
  • +
  • Standard C++ libraries: vector, fstream, stdexcept
  • +
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h.js new file mode 100644 index 0000000..5dfe35c --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h.js @@ -0,0 +1,4 @@ +var _tic_tac_toe_window_8h = +[ + [ "TicTacToeWindow", "class_tic_tac_toe_window.html", "class_tic_tac_toe_window" ] +]; \ No newline at end of file diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h_source.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h_source.html new file mode 100644 index 0000000..4c51852 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/_tic_tac_toe_window_8h_source.html @@ -0,0 +1,188 @@ + + + + + + + +My Project: TicTacToeWindow.h Source File + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
TicTacToeWindow.h
+
+
+Go to the documentation of this file.
1
+
10
+
11#pragma once
+
12
+
13#include "AnimationWindow.h"
+
14#include "widgets/Button.h"
+
15#include <vector>
+
16#include <fstream>
+
17#include <stdexcept>
+
18
+
19using namespace TDT4102;
+
20
+
+
25class TicTacToeWindow : public TDT4102::AnimationWindow {
+
26public:
+
35 TicTacToeWindow(int x, int y, int width, int height, const std::string& title);
+
36
+
40 void play();
+
41
+
42private:
+
46 void draw_board();
+
47
+
51 void draw_marks();
+
52
+
56 void draw_winning_line();
+
57
+
63 void handle_click(int x, int y);
+
64
+
69 bool check_winner();
+
70
+
75 bool check_draw();
+
76
+
80 void reset_game();
+
81
+
86 void write_result_to_file(const std::string& result);
+
87
+
91 void cb_reset();
+
92
+
96 void cb_quit();
+
97
+
98 std::vector<std::vector<char>> board;
+ + + +
102 Button quit_button;
+ +
104 std::string result_text;
+
105 std::pair<Point, Point> winning_line;
+
106};
+
+
void play()
Starts the game loop.
Definition TicTacToeWindow.cpp:48
+
std::pair< Point, Point > winning_line
Coordinates for the winning line.
Definition TicTacToeWindow.h:105
+
void reset_game()
Resets the game to its initial state.
Definition TicTacToeWindow.cpp:189
+
TicTacToeWindow(int x, int y, int width, int height, const std::string &title)
Constructs a TicTacToeWindow object.
Definition TicTacToeWindow.cpp:36
+
bool check_draw()
Checks if the game is a draw.
Definition TicTacToeWindow.cpp:175
+
bool game_over
Flag indicating if the game is over.
Definition TicTacToeWindow.h:103
+
void cb_reset()
Callback function for the reset button.
Definition TicTacToeWindow.cpp:217
+
void handle_click(int x, int y)
Handles mouse click events to place marks.
Definition TicTacToeWindow.cpp:126
+
void draw_marks()
Draws the marks (X and O) on the board.
Definition TicTacToeWindow.cpp:101
+
void write_result_to_file(const std::string &result)
Writes the game result to a file.
Definition TicTacToeWindow.cpp:202
+
std::string result_text
Text indicating the winner.
Definition TicTacToeWindow.h:104
+
Button reset_button
Button to reset the game.
Definition TicTacToeWindow.h:101
+
std::vector< std::vector< char > > board
3x3 board representation.
Definition TicTacToeWindow.h:98
+
Button quit_button
Button to quit the game.
Definition TicTacToeWindow.h:102
+
void draw_winning_line()
Draws a line to indicate the winning combination.
Definition TicTacToeWindow.cpp:116
+
char current_player
Current player ('X' or 'O').
Definition TicTacToeWindow.h:99
+
void draw_board()
Draws the Tic Tac Toe board.
Definition TicTacToeWindow.cpp:91
+
void cb_quit()
Callback function for the quit button.
Definition TicTacToeWindow.cpp:225
+
bool check_winner()
Checks if there is a winner.
Definition TicTacToeWindow.cpp:145
+
char last_player
Last player to have made a move.
Definition TicTacToeWindow.h:100
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/annotated.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/annotated.html new file mode 100644 index 0000000..35de5ae --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/annotated.html @@ -0,0 +1,122 @@ + + + + + + + +My Project: Class List + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + +
 CTicTacToeWindowHandles the Tic Tac Toe game logic and user interface
+
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/annotated_dup.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/annotated_dup.js new file mode 100644 index 0000000..ae5296c --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/annotated_dup.js @@ -0,0 +1,4 @@ +var annotated_dup = +[ + [ "TicTacToeWindow", "class_tic_tac_toe_window.html", "class_tic_tac_toe_window" ] +]; \ No newline at end of file diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/bc_s.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/bc_s.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/bc_sd.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/bc_sd.png new file mode 100644 index 0000000..31ca888 Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/bc_sd.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window-members.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window-members.html new file mode 100644 index 0000000..357f22e --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window-members.html @@ -0,0 +1,140 @@ + + + + + + + +My Project: Member List + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
TicTacToeWindow Member List
+
+
+ +

This is the complete list of members for TicTacToeWindow, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
boardTicTacToeWindowprivate
cb_quit()TicTacToeWindowprivate
cb_reset()TicTacToeWindowprivate
check_draw()TicTacToeWindowprivate
check_winner()TicTacToeWindowprivate
current_playerTicTacToeWindowprivate
draw_board()TicTacToeWindowprivate
draw_marks()TicTacToeWindowprivate
draw_winning_line()TicTacToeWindowprivate
game_overTicTacToeWindowprivate
handle_click(int x, int y)TicTacToeWindowprivate
last_playerTicTacToeWindowprivate
play()TicTacToeWindow
quit_buttonTicTacToeWindowprivate
reset_buttonTicTacToeWindowprivate
reset_game()TicTacToeWindowprivate
result_textTicTacToeWindowprivate
TicTacToeWindow(int x, int y, int width, int height, const std::string &title)TicTacToeWindow
winning_lineTicTacToeWindowprivate
write_result_to_file(const std::string &result)TicTacToeWindowprivate
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.html new file mode 100644 index 0000000..207ef00 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.html @@ -0,0 +1,777 @@ + + + + + + + +My Project: TicTacToeWindow Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +

Handles the Tic Tac Toe game logic and user interface. + More...

+ +

#include <TicTacToeWindow.h>

+
+Inheritance diagram for TicTacToeWindow:
+
+
+ +
+ + + + + + + + +

+Public Member Functions

 TicTacToeWindow (int x, int y, int width, int height, const std::string &title)
 Constructs a TicTacToeWindow object.
 
void play ()
 Starts the game loop.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

void draw_board ()
 Draws the Tic Tac Toe board.
 
void draw_marks ()
 Draws the marks (X and O) on the board.
 
void draw_winning_line ()
 Draws a line to indicate the winning combination.
 
void handle_click (int x, int y)
 Handles mouse click events to place marks.
 
bool check_winner ()
 Checks if there is a winner.
 
bool check_draw ()
 Checks if the game is a draw.
 
void reset_game ()
 Resets the game to its initial state.
 
void write_result_to_file (const std::string &result)
 Writes the game result to a file.
 
void cb_reset ()
 Callback function for the reset button.
 
void cb_quit ()
 Callback function for the quit button.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

std::vector< std::vector< char > > board
 3x3 board representation.
 
char current_player
 Current player ('X' or 'O').
 
char last_player
 Last player to have made a move.
 
Button reset_button
 Button to reset the game.
 
Button quit_button
 Button to quit the game.
 
bool game_over
 Flag indicating if the game is over.
 
std::string result_text
 Text indicating the winner.
 
std::pair< Point, Point > winning_line
 Coordinates for the winning line.
 
+

Detailed Description

+

Handles the Tic Tac Toe game logic and user interface.

+

Constructor & Destructor Documentation

+ +

◆ TicTacToeWindow()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
TicTacToeWindow::TicTacToeWindow (int x,
int y,
int width,
int height,
const std::string & title )
+
+ +

Constructs a TicTacToeWindow object.

+

Constructs the TicTacToeWindow object and initializes the game.

+
Parameters
+ + + + + + +
xX-coordinate of the window.
yY-coordinate of the window.
widthWidth of the window.
heightHeight of the window.
titleTitle of the window.
+
+
+ +
+
+

Member Function Documentation

+ +

◆ cb_quit()

+ +
+
+ + + + + +
+ + + + + + + +
void TicTacToeWindow::cb_quit ()
+
+private
+
+ +

Callback function for the quit button.

+ +
+
+ +

◆ cb_reset()

+ +
+
+ + + + + +
+ + + + + + + +
void TicTacToeWindow::cb_reset ()
+
+private
+
+ +

Callback function for the reset button.

+ +
+
+ +

◆ check_draw()

+ +
+
+ + + + + +
+ + + + + + + +
bool TicTacToeWindow::check_draw ()
+
+private
+
+ +

Checks if the game is a draw.

+

Checks if the game has ended in a draw.

+
Returns
true if the game is a draw, false otherwise.
+ +
+
+ +

◆ check_winner()

+ +
+
+ + + + + +
+ + + + + + + +
bool TicTacToeWindow::check_winner ()
+
+private
+
+ +

Checks if there is a winner.

+

Checks if there is a winner in the game.

+
Returns
true if a player has won, false otherwise.
+
+true if there is a winner, false otherwise.
+ +
+
+ +

◆ draw_board()

+ +
+
+ + + + + +
+ + + + + + + +
void TicTacToeWindow::draw_board ()
+
+private
+
+ +

Draws the Tic Tac Toe board.

+

Draws the Tic Tac Toe board grid.

+ +
+
+ +

◆ draw_marks()

+ +
+
+ + + + + +
+ + + + + + + +
void TicTacToeWindow::draw_marks ()
+
+private
+
+ +

Draws the marks (X and O) on the board.

+ +
+
+ +

◆ draw_winning_line()

+ +
+
+ + + + + +
+ + + + + + + +
void TicTacToeWindow::draw_winning_line ()
+
+private
+
+ +

Draws a line to indicate the winning combination.

+

Draws the line indicating the winning combination on the board.

+ +
+
+ +

◆ handle_click()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void TicTacToeWindow::handle_click (int x,
int y )
+
+private
+
+ +

Handles mouse click events to place marks.

+

Handles mouse click events and updates the board with marks.

+
Parameters
+ + + + + +
xX-coordinate of the click.
yY-coordinate of the click.
xX-coordinate of the mouse click.
yY-coordinate of the mouse click.
+
+
+
Exceptions
+ + +
std::out_of_rangeif the clicked position is outside the board.
+
+
+ +
+
+ +

◆ play()

+ +
+
+ + + + + + + +
void TicTacToeWindow::play ()
+
+ +

Starts the game loop.

+ +
+
+ +

◆ reset_game()

+ +
+
+ + + + + +
+ + + + + + + +
void TicTacToeWindow::reset_game ()
+
+private
+
+ +

Resets the game to its initial state.

+ +
+
+ +

◆ write_result_to_file()

+ +
+
+ + + + + +
+ + + + + + + +
void TicTacToeWindow::write_result_to_file (const std::string & result)
+
+private
+
+ +

Writes the game result to a file.

+
Parameters
+ + +
resultThe result string to write.
+
+
+ +
+
+

Member Data Documentation

+ +

◆ board

+ +
+
+ + + + + +
+ + + + +
std::vector<std::vector<char> > TicTacToeWindow::board
+
+private
+
+ +

3x3 board representation.

+ +
+
+ +

◆ current_player

+ +
+
+ + + + + +
+ + + + +
char TicTacToeWindow::current_player
+
+private
+
+ +

Current player ('X' or 'O').

+ +
+
+ +

◆ game_over

+ +
+
+ + + + + +
+ + + + +
bool TicTacToeWindow::game_over
+
+private
+
+ +

Flag indicating if the game is over.

+ +
+
+ +

◆ last_player

+ +
+
+ + + + + +
+ + + + +
char TicTacToeWindow::last_player
+
+private
+
+ +

Last player to have made a move.

+ +
+
+ +

◆ quit_button

+ +
+
+ + + + + +
+ + + + +
Button TicTacToeWindow::quit_button
+
+private
+
+ +

Button to quit the game.

+ +
+
+ +

◆ reset_button

+ +
+
+ + + + + +
+ + + + +
Button TicTacToeWindow::reset_button
+
+private
+
+ +

Button to reset the game.

+ +
+
+ +

◆ result_text

+ +
+
+ + + + + +
+ + + + +
std::string TicTacToeWindow::result_text
+
+private
+
+ +

Text indicating the winner.

+ +
+
+ +

◆ winning_line

+ +
+
+ + + + + +
+ + + + +
std::pair<Point, Point> TicTacToeWindow::winning_line
+
+private
+
+ +

Coordinates for the winning line.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.js new file mode 100644 index 0000000..e687632 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.js @@ -0,0 +1,23 @@ +var class_tic_tac_toe_window = +[ + [ "TicTacToeWindow", "class_tic_tac_toe_window.html#a2fa1df2b5d6d7f69eef48cd28d588562", null ], + [ "cb_quit", "class_tic_tac_toe_window.html#af06d97a6bc5af57d20496efef4b42205", null ], + [ "cb_reset", "class_tic_tac_toe_window.html#a721a06d7b66e4891e1c4e4714828e9e4", null ], + [ "check_draw", "class_tic_tac_toe_window.html#a3ecf87bb2c63d9173859ffc791dba65a", null ], + [ "check_winner", "class_tic_tac_toe_window.html#af31e8259796b4c713695f76a2e9ebbb4", null ], + [ "draw_board", "class_tic_tac_toe_window.html#aea9364e6964b4d713db301e1dca05870", null ], + [ "draw_marks", "class_tic_tac_toe_window.html#a80d700fab549c892da6454ddf134e73f", null ], + [ "draw_winning_line", "class_tic_tac_toe_window.html#ad6b36f228408151798ccf6f93ae6bb9c", null ], + [ "handle_click", "class_tic_tac_toe_window.html#a7e59cd0a04b03284ce8a95ae104a40a0", null ], + [ "play", "class_tic_tac_toe_window.html#a02a67ddb17bb56a4e34ce07b75d4c4c8", null ], + [ "reset_game", "class_tic_tac_toe_window.html#a256a8423cb3c6e7b6e3ca6251866867d", null ], + [ "write_result_to_file", "class_tic_tac_toe_window.html#a87e9e26b5d34f5bd3cadee4e2778df3e", null ], + [ "board", "class_tic_tac_toe_window.html#ac5767923f6cfdd1cdc0e38646817c0ec", null ], + [ "current_player", "class_tic_tac_toe_window.html#ae1d2eddf2ec46d88ec2850088bf83801", null ], + [ "game_over", "class_tic_tac_toe_window.html#a43bc194a5b454fdd4e586b29862ead48", null ], + [ "last_player", "class_tic_tac_toe_window.html#afacdc2b25347aec3b74b3a0a89cf121b", null ], + [ "quit_button", "class_tic_tac_toe_window.html#ac85e0fda6ce6f20bfad83a38cf7d6b40", null ], + [ "reset_button", "class_tic_tac_toe_window.html#aa984f2d95bc444451acfb242a0cd3644", null ], + [ "result_text", "class_tic_tac_toe_window.html#a98f8a4942b7eb70471c720297c492925", null ], + [ "winning_line", "class_tic_tac_toe_window.html#a0fde7a5bc88317c24139a2a997f49b0e", null ] +]; \ No newline at end of file diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.png new file mode 100644 index 0000000..9908752 Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/class_tic_tac_toe_window.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/classes.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/classes.html new file mode 100644 index 0000000..1e036b5 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/classes.html @@ -0,0 +1,123 @@ + + + + + + + +My Project: Class Index + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+ + +
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/clipboard.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/clipboard.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/closed.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/closed.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/cookie.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doc.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doc.svg new file mode 100644 index 0000000..0b928a5 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/docd.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/docd.svg new file mode 100644 index 0000000..ac18b27 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen.css b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen.css new file mode 100644 index 0000000..4947e24 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen.css @@ -0,0 +1,2255 @@ +/* The standard CSS for doxygen 1.13.2*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a:hover > span.arrow { + text-decoration: none; + background : var(--nav-background-color); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: hidden; + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .4; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname, .fieldtable td.fieldinit { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fieldinit { + padding-top: 3px; + text-align: right; +} + + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* + +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention, dl.important { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +*/ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#side-nav #projectname +{ + font-size: 130%; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li[class^='level'] { + margin-left: 15px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.empty { + background-image: none; + margin-top: 0px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd +{ + display: inline-block; +} +tt, code, kbd +{ + vertical-align: top; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen_crawl.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen_crawl.html new file mode 100644 index 0000000..c71878f --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/doxygen_crawl.html @@ -0,0 +1,65 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/dynsections.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/dynsections.js new file mode 100644 index 0000000..b05f4c8 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/dynsections.js @@ -0,0 +1,198 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/files.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/files.html new file mode 100644 index 0000000..b283855 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/files.html @@ -0,0 +1,124 @@ + + + + + + + +My Project: File List + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all files with brief descriptions:
+ + + + +
 main.cppEntry point for the Tic Tac Toe game
 TicTacToeWindow.cppContains the implementation of the TicTacToeWindow class
 TicTacToeWindow.hDefines the TicTacToeWindow class for handling game logic and UI
+
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/files_dup.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/files_dup.js new file mode 100644 index 0000000..0fb50fd --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/files_dup.js @@ -0,0 +1,6 @@ +var files_dup = +[ + [ "main.cpp", "main_8cpp.html", "main_8cpp" ], + [ "TicTacToeWindow.cpp", "_tic_tac_toe_window_8cpp.html", "_tic_tac_toe_window_8cpp" ], + [ "TicTacToeWindow.h", "_tic_tac_toe_window_8h.html", "_tic_tac_toe_window_8h" ] +]; \ No newline at end of file diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderclosed.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderclosed.svg new file mode 100644 index 0000000..b04bed2 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderclosedd.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderclosedd.svg new file mode 100644 index 0000000..52f0166 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderopen.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderopen.svg new file mode 100644 index 0000000..f6896dd --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderopend.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderopend.svg new file mode 100644 index 0000000..2d1f06e --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions.html new file mode 100644 index 0000000..84c1022 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions.html @@ -0,0 +1,136 @@ + + + + + + + +My Project: Class Members + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all class members with links to the classes they belong to:
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions_func.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions_func.html new file mode 100644 index 0000000..16beade --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions_func.html @@ -0,0 +1,128 @@ + + + + + + + +My Project: Class Members - Functions + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all functions with links to the classes they belong to:
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions_vars.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions_vars.html new file mode 100644 index 0000000..23e683d --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/functions_vars.html @@ -0,0 +1,124 @@ + + + + + + + +My Project: Class Members - Variables + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all variables with links to the classes they belong to:
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals.html new file mode 100644 index 0000000..7091b61 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals.html @@ -0,0 +1,131 @@ + + + + + + + +My Project: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all file members with links to the files they belong to:
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals_func.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals_func.html new file mode 100644 index 0000000..78c413e --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals_func.html @@ -0,0 +1,118 @@ + + + + + + + +My Project: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all functions with links to the files they belong to:
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals_vars.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals_vars.html new file mode 100644 index 0000000..d71648a --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/globals_vars.html @@ -0,0 +1,129 @@ + + + + + + + +My Project: File Members + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all variables with links to the files they belong to:
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/hierarchy.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/hierarchy.html new file mode 100644 index 0000000..f9eb97d --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/hierarchy.html @@ -0,0 +1,123 @@ + + + + + + + +My Project: Class Hierarchy + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + +
 CTDT4102::AnimationWindow
 CTicTacToeWindowHandles the Tic Tac Toe game logic and user interface
+
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/hierarchy.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/hierarchy.js new file mode 100644 index 0000000..4c044ae --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/hierarchy.js @@ -0,0 +1,6 @@ +var hierarchy = +[ + [ "TDT4102::AnimationWindow", null, [ + [ "TicTacToeWindow", "class_tic_tac_toe_window.html", null ] + ] ] +]; \ No newline at end of file diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/index.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/index.html new file mode 100644 index 0000000..7667759 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/index.html @@ -0,0 +1,118 @@ + + + + + + + +My Project: Main Page + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
My Project Documentation
+
+
+ +
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/jquery.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/jquery.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/jquery.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/main_8cpp.html b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/main_8cpp.html new file mode 100644 index 0000000..a1ae9d8 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/main_8cpp.html @@ -0,0 +1,184 @@ + + + + + + + +My Project: main.cpp File Reference + + + + + + + + + + + + + + + + +
+
+ + + + + + + +
+
My Project +
+
+ +   + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
main.cpp File Reference
+
+
+ +

Entry point for the Tic Tac Toe game. +More...

+
#include "TicTacToeWindow.h"
+
+ + + + + + + +

+Functions

void play_tick_tack_toe ()
 Initializes and starts the Tic Tac Toe game.
 
int main ()
 Main function, starts the game.
 
+

Detailed Description

+

Entry point for the Tic Tac Toe game.

+

This file uses the following libraries and resources:

+

Function Documentation

+ +

◆ main()

+ +
+
+ + + + + + + +
int main ()
+
+ +

Main function, starts the game.

+
Returns
int Exit status.
+ +
+
+ +

◆ play_tick_tack_toe()

+ +
+
+ + + + + + + +
void play_tick_tack_toe ()
+
+ +

Initializes and starts the Tic Tac Toe game.

+

< X-coordinate of the window.

+

< Y-coordinate of the window.

+

< Width of the window.

+

< Height of the window.

+

< Title of the game window.

+ +
+
+
+
+ + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/main_8cpp.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/main_8cpp.js new file mode 100644 index 0000000..0cfc8e6 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/main_8cpp.js @@ -0,0 +1,5 @@ +var main_8cpp = +[ + [ "main", "main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ], + [ "play_tick_tack_toe", "main_8cpp.html#adfe9299470a3da06f80456efb1e52945", null ] +]; \ No newline at end of file diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/minus.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/minus.svg new file mode 100644 index 0000000..f70d0c1 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/minusd.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_f.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_f.png new file mode 100644 index 0000000..72a58a5 Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_f.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_fd.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_fd.png new file mode 100644 index 0000000..032fbdd Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_fd.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_g.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_g.png new file mode 100644 index 0000000..2093a23 Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_g.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_h.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_h.png new file mode 100644 index 0000000..33389b1 Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_h.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_hd.png b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_hd.png new file mode 100644 index 0000000..de80f18 Binary files /dev/null and b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/nav_hd.png differ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/navtree.css b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/navtree.css new file mode 100644 index 0000000..69211d4 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/navtree.css @@ -0,0 +1,149 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: var(--nav-text-active-color); + text-shadow: var(--nav-text-active-shadow); +} + +#nav-tree .selected .arrow { + color: var(--nav-arrow-selected-color); + text-shadow: none; +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--nav-text-active-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: $width; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:var(--nav-splitbar-image); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-repeat:repeat-x; + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/navtree.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/navtree.js new file mode 100644 index 0000000..2d4fa84 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/navtree.js @@ -0,0 +1,483 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath) { + let navTreeSubIndices = []; + const ARROW_DOWN = '▼'; + const ARROW_RIGHT = '►'; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/-/g,'_')); + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=ARROW_RIGHT; + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + label : document.createTextNode(text), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(node.label); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = ARROW_DOWN; + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + $('#nav-sync').css('top',topOffset+'px'); + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = ARROW_DOWN; + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+11 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/plusd.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/plusd.svg new file mode 100644 index 0000000..0c65bfe --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/resize.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/resize.js new file mode 100644 index 0000000..178d03b --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/resize.js @@ -0,0 +1,147 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initResizable(treeview) { + let sidenav,navtree,content,header,footer,barWidth=6; + const RESIZE_COOKIE_NAME = ''+'width'; + + function resizeWidth() { + const sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); + } + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + function restoreWidth(navWidth) { + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + } + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight(treeview) { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + if (treeview) + { + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + } + else + { + contentHeight = windowHeight - headerHeight; + } + content.css({height:contentHeight + "px"}); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + function collapseExpand() { + let newWidth; + if (sidenav.width()>0) { + newWidth=0; + } else { + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + newWidth = (width>250 && width<$(window).width()) ? width : 250; + } + restoreWidth(newWidth); + const sidenavWidth = $(sidenav).outerWidth(); + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (!treeview) { +// title = $("#titlearea"); +// titleH = $(title).height(); +// let animating = false; +// content.on("scroll", function() { +// slideOpts = { duration: 200, +// step: function() { +// contentHeight = $(window).height() - header.outerHeight(); +// content.css({ height : contentHeight + "px" }); +// }, +// done: function() { animating=false; } +// }; +// if (content.scrollTop()>titleH && title.css('display')!='none' && !animating) { +// title.slideUp(slideOpts); +// animating=true; +// } else if (content.scrollTop()<=titleH && title.css('display')=='none' && !animating) { +// title.slideDown(slideOpts); +// animating=true; +// } +// }); + } else { + navtree = $("#nav-tree"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + } + $(window).resize(function() { resizeHeight(treeview); }); + if (treeview) + { + const device = navigator.userAgent.toLowerCase(); + const touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + if (width) { restoreWidth(width); } else { resizeWidth(); } + } + resizeHeight(treeview); + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + if (treeview) + { + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + // workaround for firefox + $("body").css({overflow: "hidden"}); + } + $(window).on('load',function() { resizeHeight(treeview); }); +} +/* @license-end */ diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_0.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_0.js new file mode 100644 index 0000000..9c4e6b4 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['board_0',['board',['../class_tic_tac_toe_window.html#ac5767923f6cfdd1cdc0e38646817c0ec',1,'TicTacToeWindow']]], + ['board_5fsize_1',['BOARD_SIZE',['../_tic_tac_toe_window_8cpp.html#ad61312467c560853b884baba85ccb6cc',1,'TicTacToeWindow.cpp']]], + ['board_5fx_2',['BOARD_X',['../_tic_tac_toe_window_8cpp.html#a734171bf86d25d8fea97ec3db770f339',1,'TicTacToeWindow.cpp']]], + ['board_5fy_3',['BOARD_Y',['../_tic_tac_toe_window_8cpp.html#a7a25c54899aa5eb9067fa355bd0fd2f0',1,'TicTacToeWindow.cpp']]], + ['button_5fheight_4',['BUTTON_HEIGHT',['../_tic_tac_toe_window_8cpp.html#a3b3ba52cbf88acec5e16bc4637e77007',1,'TicTacToeWindow.cpp']]], + ['button_5fwidth_5',['BUTTON_WIDTH',['../_tic_tac_toe_window_8cpp.html#a5abca8d83548cc8db6c91b204fc0fc3e',1,'TicTacToeWindow.cpp']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_1.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_1.js new file mode 100644 index 0000000..5ee50af --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['cb_5fquit_0',['cb_quit',['../class_tic_tac_toe_window.html#af06d97a6bc5af57d20496efef4b42205',1,'TicTacToeWindow']]], + ['cb_5freset_1',['cb_reset',['../class_tic_tac_toe_window.html#a721a06d7b66e4891e1c4e4714828e9e4',1,'TicTacToeWindow']]], + ['cell_5fsize_2',['CELL_SIZE',['../_tic_tac_toe_window_8cpp.html#afb719a6797676ba986f056e63fa45a25',1,'TicTacToeWindow.cpp']]], + ['check_5fdraw_3',['check_draw',['../class_tic_tac_toe_window.html#a3ecf87bb2c63d9173859ffc791dba65a',1,'TicTacToeWindow']]], + ['check_5fwinner_4',['check_winner',['../class_tic_tac_toe_window.html#af31e8259796b4c713695f76a2e9ebbb4',1,'TicTacToeWindow']]], + ['current_5fplayer_5',['current_player',['../class_tic_tac_toe_window.html#ae1d2eddf2ec46d88ec2850088bf83801',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_2.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_2.js new file mode 100644 index 0000000..baca892 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['draw_5fboard_0',['draw_board',['../class_tic_tac_toe_window.html#aea9364e6964b4d713db301e1dca05870',1,'TicTacToeWindow']]], + ['draw_5fmarks_1',['draw_marks',['../class_tic_tac_toe_window.html#a80d700fab549c892da6454ddf134e73f',1,'TicTacToeWindow']]], + ['draw_5fwinning_5fline_2',['draw_winning_line',['../class_tic_tac_toe_window.html#ad6b36f228408151798ccf6f93ae6bb9c',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_3.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_3.js new file mode 100644 index 0000000..6787f05 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['font_5fsize_0',['FONT_SIZE',['../_tic_tac_toe_window_8cpp.html#a36f8b4b0227f9dac9b5018b20c9a1f51',1,'TicTacToeWindow.cpp']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_4.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_4.js new file mode 100644 index 0000000..9573636 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['game_5fover_0',['game_over',['../class_tic_tac_toe_window.html#a43bc194a5b454fdd4e586b29862ead48',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_5.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_5.js new file mode 100644 index 0000000..cb3fc35 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handle_5fclick_0',['handle_click',['../class_tic_tac_toe_window.html#a7e59cd0a04b03284ce8a95ae104a40a0',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_6.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_6.js new file mode 100644 index 0000000..91d457d --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['last_5fplayer_0',['last_player',['../class_tic_tac_toe_window.html#afacdc2b25347aec3b74b3a0a89cf121b',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_7.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_7.js new file mode 100644 index 0000000..6e458bb --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['main_0',['main',['../main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main.cpp']]], + ['main_2ecpp_1',['main.cpp',['../main_8cpp.html',1,'']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_8.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_8.js new file mode 100644 index 0000000..f443a5b --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['play_0',['play',['../class_tic_tac_toe_window.html#a02a67ddb17bb56a4e34ce07b75d4c4c8',1,'TicTacToeWindow']]], + ['play_5ftick_5ftack_5ftoe_1',['play_tick_tack_toe',['../main_8cpp.html#adfe9299470a3da06f80456efb1e52945',1,'main.cpp']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_9.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_9.js new file mode 100644 index 0000000..6511a11 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['quit_5fbutton_0',['quit_button',['../class_tic_tac_toe_window.html#ac85e0fda6ce6f20bfad83a38cf7d6b40',1,'TicTacToeWindow']]], + ['quit_5fbutton_5fx_1',['QUIT_BUTTON_X',['../_tic_tac_toe_window_8cpp.html#a907d240438ef5a233d89f060d2ab7ce6',1,'TicTacToeWindow.cpp']]], + ['quit_5fbutton_5fy_2',['QUIT_BUTTON_Y',['../_tic_tac_toe_window_8cpp.html#a7c67ea62ace270bfbc30fa241530f5f9',1,'TicTacToeWindow.cpp']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_a.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_a.js new file mode 100644 index 0000000..c3a41e3 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_a.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['reset_5fbutton_0',['reset_button',['../class_tic_tac_toe_window.html#aa984f2d95bc444451acfb242a0cd3644',1,'TicTacToeWindow']]], + ['reset_5fbutton_5fx_1',['RESET_BUTTON_X',['../_tic_tac_toe_window_8cpp.html#a46907144aa852e2450a4784f7bd67702',1,'TicTacToeWindow.cpp']]], + ['reset_5fbutton_5fy_2',['RESET_BUTTON_Y',['../_tic_tac_toe_window_8cpp.html#a65f9c1ca2be2ebd241cba5b02ae39514',1,'TicTacToeWindow.cpp']]], + ['reset_5fgame_3',['reset_game',['../class_tic_tac_toe_window.html#a256a8423cb3c6e7b6e3ca6251866867d',1,'TicTacToeWindow']]], + ['result_5ftext_4',['result_text',['../class_tic_tac_toe_window.html#a98f8a4942b7eb70471c720297c492925',1,'TicTacToeWindow']]], + ['result_5ftext_5fx_5',['RESULT_TEXT_X',['../_tic_tac_toe_window_8cpp.html#ae32dfc3a976f735ff01c1757ba107610',1,'TicTacToeWindow.cpp']]], + ['result_5ftext_5fy_6',['RESULT_TEXT_Y',['../_tic_tac_toe_window_8cpp.html#aba7c1f86d23ea3fad3d8099789a51311',1,'TicTacToeWindow.cpp']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_b.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_b.js new file mode 100644 index 0000000..17b0d26 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['tictactoewindow_0',['TicTacToeWindow',['../class_tic_tac_toe_window.html',1,'TicTacToeWindow'],['../class_tic_tac_toe_window.html#a2fa1df2b5d6d7f69eef48cd28d588562',1,'TicTacToeWindow::TicTacToeWindow()']]], + ['tictactoewindow_2ecpp_1',['TicTacToeWindow.cpp',['../_tic_tac_toe_window_8cpp.html',1,'']]], + ['tictactoewindow_2eh_2',['TicTacToeWindow.h',['../_tic_tac_toe_window_8h.html',1,'']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_c.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_c.js new file mode 100644 index 0000000..dac93d1 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/all_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['winning_5fline_0',['winning_line',['../class_tic_tac_toe_window.html#a0fde7a5bc88317c24139a2a997f49b0e',1,'TicTacToeWindow']]], + ['write_5fresult_5fto_5ffile_1',['write_result_to_file',['../class_tic_tac_toe_window.html#a87e9e26b5d34f5bd3cadee4e2778df3e',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/classes_0.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/classes_0.js new file mode 100644 index 0000000..bed3446 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tictactoewindow_0',['TicTacToeWindow',['../class_tic_tac_toe_window.html',1,'']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/close.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/close.svg new file mode 100644 index 0000000..337d6cc --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/files_0.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/files_0.js new file mode 100644 index 0000000..695b4fd --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['main_2ecpp_0',['main.cpp',['../main_8cpp.html',1,'']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/files_1.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/files_1.js new file mode 100644 index 0000000..6c30e31 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/files_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tictactoewindow_2ecpp_0',['TicTacToeWindow.cpp',['../_tic_tac_toe_window_8cpp.html',1,'']]], + ['tictactoewindow_2eh_1',['TicTacToeWindow.h',['../_tic_tac_toe_window_8h.html',1,'']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_0.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_0.js new file mode 100644 index 0000000..3cc2582 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['cb_5fquit_0',['cb_quit',['../class_tic_tac_toe_window.html#af06d97a6bc5af57d20496efef4b42205',1,'TicTacToeWindow']]], + ['cb_5freset_1',['cb_reset',['../class_tic_tac_toe_window.html#a721a06d7b66e4891e1c4e4714828e9e4',1,'TicTacToeWindow']]], + ['check_5fdraw_2',['check_draw',['../class_tic_tac_toe_window.html#a3ecf87bb2c63d9173859ffc791dba65a',1,'TicTacToeWindow']]], + ['check_5fwinner_3',['check_winner',['../class_tic_tac_toe_window.html#af31e8259796b4c713695f76a2e9ebbb4',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_1.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_1.js new file mode 100644 index 0000000..baca892 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['draw_5fboard_0',['draw_board',['../class_tic_tac_toe_window.html#aea9364e6964b4d713db301e1dca05870',1,'TicTacToeWindow']]], + ['draw_5fmarks_1',['draw_marks',['../class_tic_tac_toe_window.html#a80d700fab549c892da6454ddf134e73f',1,'TicTacToeWindow']]], + ['draw_5fwinning_5fline_2',['draw_winning_line',['../class_tic_tac_toe_window.html#ad6b36f228408151798ccf6f93ae6bb9c',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_2.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_2.js new file mode 100644 index 0000000..cb3fc35 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handle_5fclick_0',['handle_click',['../class_tic_tac_toe_window.html#a7e59cd0a04b03284ce8a95ae104a40a0',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_3.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_3.js new file mode 100644 index 0000000..8abf631 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['main_0',['main',['../main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main.cpp']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_4.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_4.js new file mode 100644 index 0000000..f443a5b --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['play_0',['play',['../class_tic_tac_toe_window.html#a02a67ddb17bb56a4e34ce07b75d4c4c8',1,'TicTacToeWindow']]], + ['play_5ftick_5ftack_5ftoe_1',['play_tick_tack_toe',['../main_8cpp.html#adfe9299470a3da06f80456efb1e52945',1,'main.cpp']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_5.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_5.js new file mode 100644 index 0000000..6d64820 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['reset_5fgame_0',['reset_game',['../class_tic_tac_toe_window.html#a256a8423cb3c6e7b6e3ca6251866867d',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_6.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_6.js new file mode 100644 index 0000000..d2dfc6a --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tictactoewindow_0',['TicTacToeWindow',['../class_tic_tac_toe_window.html#a2fa1df2b5d6d7f69eef48cd28d588562',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_7.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_7.js new file mode 100644 index 0000000..cbf9998 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/functions_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['write_5fresult_5fto_5ffile_0',['write_result_to_file',['../class_tic_tac_toe_window.html#a87e9e26b5d34f5bd3cadee4e2778df3e',1,'TicTacToeWindow']]] +]; diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag.svg new file mode 100644 index 0000000..ffb6cf0 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_d.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_d.svg new file mode 100644 index 0000000..4122773 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_sel.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_sel.svg new file mode 100644 index 0000000..553dba8 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_seld.svg b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_seld.svg new file mode 100644 index 0000000..c906f84 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/search.css b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/search.css new file mode 100644 index 0000000..a53214f --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/search.css @@ -0,0 +1,286 @@ +/*---------------- Search Box */ + +#MSearchBox { + position: absolute; + right: 5px; +} +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/search.js b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/search.js new file mode 100644 index 0000000..666af01 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/docs/html/search/search.js @@ -0,0 +1,694 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = elem[1][0]; + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = elem[1][1][2]; + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; cli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/templates/_folder_Projects/Tic-Tac-Toe/game_results.txt b/templates/_folder_Projects/Tic-Tac-Toe/game_results.txt new file mode 100644 index 0000000..17998eb --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/game_results.txt @@ -0,0 +1,58 @@ +The game is a draw! +The game is a draw! +Player O wins! +Player O wins! +Player X wins! +The game is a draw! +The game is a draw! +Player O wins! +Player O wins! +The game is a draw! +The game is a draw! +Player O wins! +Player O wins! +The game is a draw! +Player O wins! +Player O wins! +Player X wins! +Player O wins! +Player X wins! +Player X wins! +Player O wins! +Player O wins! +Player X wins! +Player X wins! +Player O wins! +The game is a draw! +Player O wins! +Player X wins! +The game is a draw! +The game is a draw! +Player X wins! +Player X wins! +The game is a draw! +The game is a draw! +The game is a draw! +Player O wins! +Player O wins! +Player X wins! +Player O wins! +Player O wins! +Player O wins! +Player X wins! +The game is a draw! +Player O wins! +Player X wins! +The game is a draw! +The game is a draw! +Player O wins! +Player X wins! +Player X wins! +Player X wins! +Player X wins! +Player X wins! +Player X wins! +Player X wins! +Player X wins! +Player O wins! +The game is a draw! diff --git a/templates/_folder_Projects/Tic-Tac-Toe/main.cpp b/templates/_folder_Projects/Tic-Tac-Toe/main.cpp new file mode 100644 index 0000000..8ccdd43 --- /dev/null +++ b/templates/_folder_Projects/Tic-Tac-Toe/main.cpp @@ -0,0 +1,32 @@ +/** + * @file main.cpp + * @brief Entry point for the Tic Tac Toe game. + * + * @details This file uses the following libraries and resources: + * - TicTacToeWindow.h for the game window class + */ + +#include "TicTacToeWindow.h" + +/** + * @brief Initializes and starts the Tic Tac Toe game. + */ +void play_tick_tack_toe() { + int x = 100; ///< X-coordinate of the window. + int y = 50; ///< Y-coordinate of the window. + int width = 640; ///< Width of the window. + int height = 660; ///< Height of the window. + std::string title = "Tic Tac Toe"; ///< Title of the game window. + + TicTacToeWindow game(x, y, width, height, title); + game.play(); +} + +/** + * @brief Main function, starts the game. + * @return int Exit status. + */ +int main() { + play_tick_tack_toe(); + return 0; +} diff --git a/windows/README.md b/windows/README.md deleted file mode 100644 index d9e8047..0000000 --- a/windows/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Meson installer for windows and Powershell scripts - -The version of meson is 1.10.0 - -Don't blindly update. diff --git a/windows/add_to_path.ps1 b/windows/add_to_path.ps1 deleted file mode 100644 index 4abbacb..0000000 --- a/windows/add_to_path.ps1 +++ /dev/null @@ -1,21 +0,0 @@ -param( - [Parameter()] - [String]$absolute_path -) -$absolute_path - -# Check if it already is on path -$oldpath = [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::User) -$listy = $oldpath -split ";" -$is_on_path_already = $listy.Contains($absolute_path) - -# Add to path -if (! $is_on_path_already) { - [Environment]::SetEnvironmentVariable( - "Path", - [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::User) + ";"+ $absolute_path+ ";", - [EnvironmentVariableTarget]::User) - Write-Host "Added" $absolute_path "to PATH" -} else { - Write-Host $absolute_path "is already on PATH" -} \ No newline at end of file diff --git a/windows/meson.msi b/windows/meson.msi deleted file mode 100644 index f7eea2e..0000000 Binary files a/windows/meson.msi and /dev/null differ diff --git a/windows/set_env_vars.ps1 b/windows/set_env_vars.ps1 deleted file mode 100644 index 63d34b8..0000000 --- a/windows/set_env_vars.ps1 +++ /dev/null @@ -1,10 +0,0 @@ -[Environment]::SetEnvironmentVariable( - "CC", - "C:\TDT4102-mingw64\bin\gcc", - [EnvironmentVariableTarget]::User) - - -[Environment]::SetEnvironmentVariable( - "CXX", - "C:\TDT4102-mingw64\bin\g++", - [EnvironmentVariableTarget]::User)