Compare commits

...

5 Commits

128 changed files with 11788 additions and 147 deletions

View File

@ -3,7 +3,7 @@
This repository is a collection of useful code snippets and configurations. This repository is a collection of useful code snippets and configurations.
```bash ```bash
github.com/shaunrd0/klips/ shaunrd0/klips/
├── ansible # Ansible roles, playbooks, and examples ├── ansible # Ansible roles, playbooks, and examples
├── blockchain # Blockchain related project templates and examples ├── blockchain # Blockchain related project templates and examples
├── cpp # C++ programs, datastructures, and other examples ├── cpp # C++ programs, datastructures, and other examples
@ -12,6 +12,6 @@ github.com/shaunrd0/klips/
├── figlet # Figlet fonts I like :) ├── figlet # Figlet fonts I like :)
├── javascript # Javascript projects and examples ├── javascript # Javascript projects and examples
├── python # Python scripts and tools I've made ├── python # Python scripts and tools I've made
├── README.md ├── scripts # Bash scripts
└── scripts # Bash scripts └── README.md
``` ```

View File

@ -1,6 +1,6 @@
################################################################################ ################################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## ## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
## About: A root project for practicing C++ ## ## About: A root project for practicing C++ ##
## This project can be built to debug and run all nested projects ## ## This project can be built to debug and run all nested projects ##
## Or, any subdirectory with a project() statement can be selected ## ## Or, any subdirectory with a project() statement can be selected ##
@ -16,10 +16,32 @@ project(
DESCRIPTION "A root project for several small cpp practice projects" DESCRIPTION "A root project for several small cpp practice projects"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_compile_options("-Wall") add_compile_options("-Wall")
option(KLIPS_CCACHE "Enable ccache" ON)
if (KLIPS_CCACHE)
find_program(SCCACHE_PATH sccache)
if(SCCACHE_PATH)
message(STATUS "[Klips] Found sccache: ${SCCACHE_PATH}")
set(CMAKE_CXX_COMPILER_LAUNCHER ${SCCACHE_PATH})
set(CMAKE_C_COMPILER_LAUNCHER ${SCCACHE_PATH})
else()
message(STATUS "[Klips] Failed to find sccache, falling back to ccache.")
find_program(CCACHE_PATH ccache)
if(CCACHE_PATH)
message(STATUS "[Klips] Found ccache: ${CCACHE_PATH}")
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PATH})
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PATH})
else()
message(WARNING "[Klips] Failed to find sccache and ccache. Compilation will not be cached.")
endif()
endif()
endif()
add_subdirectory(algorithms) add_subdirectory(algorithms)
add_subdirectory(catch2) add_subdirectory(catch2)
add_subdirectory(cmake-example) add_subdirectory(cmake-example)
@ -28,4 +50,15 @@ add_subdirectory(datastructs)
add_subdirectory(graphics) add_subdirectory(graphics)
add_subdirectory(multithreading) add_subdirectory(multithreading)
add_subdirectory(patterns) add_subdirectory(patterns)
find_package(Qt6 COMPONENTS UiPlugin Core Gui Widgets)
if (NOT Qt6_FOUND)
message(
WARNING
"[Klips] Qt examples will not be built.\n"
"On Ubuntu 24.04 Qt6 can be installed using apt:\n"
" sudo apt install qt6-base-dev qt6-tools-dev\n"
)
else()
add_subdirectory(qt) add_subdirectory(qt)
endif()

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing various algorithms in C++" DESCRIPTION "A project for practicing various algorithms in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing algorithms using graphs in C++" DESCRIPTION "A project for practicing algorithms using graphs in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "Practice implementing and using object graphs in C++" DESCRIPTION "Practice implementing and using object graphs in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-graphs-object graph.cpp algo-graphs-object graph.cpp

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "Practice implementing and using simple graphs in C++" DESCRIPTION "Practice implementing and using simple graphs in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-graphs-simple graph.cpp algo-graphs-simple graph.cpp

View File

@ -8,9 +8,8 @@
################################################################################ ################################################################################
*/ */
#include <algorithm>
#include "lib-graph.hpp" #include "lib-graph.hpp"
#include <algorithm>
void Graph::BFS(int startNode) void Graph::BFS(int startNode)
{ {

View File

@ -15,6 +15,7 @@
#include <unordered_map> #include <unordered_map>
#include <unordered_set> #include <unordered_set>
#include <vector> #include <vector>
#include <cstdint>
class Graph { class Graph {

View File

@ -14,5 +14,6 @@ project(
DESCRIPTION "Practice implementing and using templated graphs in C++" DESCRIPTION "Practice implementing and using templated graphs in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable(algo-graphs-templated graph.cpp) add_executable(algo-graphs-templated graph.cpp)

View File

@ -18,6 +18,7 @@
#include <unordered_set> #include <unordered_set>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <cstdint>
/******************************************************************************/ /******************************************************************************/

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "Practice implementing and using weighted graphs in C++" DESCRIPTION "Practice implementing and using weighted graphs in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-graphs-weighted graph.cpp algo-graphs-weighted graph.cpp

View File

@ -18,6 +18,7 @@
#include <unordered_set> #include <unordered_set>
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <cstdint>
/******************************************************************************/ /******************************************************************************/

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing various sorting algorithms in C++" DESCRIPTION "A project for practicing various sorting algorithms in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing insertion sort in C++" DESCRIPTION "A project for practicing insertion sort in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-sort-insertion insertion-sort.cpp algo-sort-insertion insertion-sort.cpp

View File

@ -14,6 +14,8 @@ project (
DESCRIPTION "A project for practicing merge sort in C++" DESCRIPTION "A project for practicing merge sort in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-sort-merge merge-sort.cpp algo-sort-merge merge-sort.cpp
lib-merge.cpp lib-merge.h lib-merge.cpp lib-merge.h

View File

@ -12,6 +12,7 @@
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include <cstdint>
void MergeSort(std::vector<int> &array, size_t lhs, size_t rhs) void MergeSort(std::vector<int> &array, size_t lhs, size_t rhs)
{ {

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing quick sort in C++" DESCRIPTION "A project for practicing quick sort in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-sort-quick quick-sort.cpp algo-sort-quick quick-sort.cpp

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing radix sort in C++" DESCRIPTION "A project for practicing radix sort in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-sort-radix radix-sort.cpp algo-sort-radix radix-sort.cpp

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing selection sort in C++" DESCRIPTION "A project for practicing selection sort in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-sort-select select-sort.cpp algo-sort-select select-sort.cpp

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing algorithms using trees in C++" DESCRIPTION "A project for practicing algorithms using trees in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing BST algorithms" DESCRIPTION "A project for testing BST algorithms"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-trees-bst driver.cpp algo-trees-bst driver.cpp

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing red-black tree algorithms" DESCRIPTION "A project for testing red-black tree algorithms"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
algo-trees-redblack driver.cpp algo-trees-redblack driver.cpp

View File

@ -12,6 +12,7 @@
#define REDBLACK_H #define REDBLACK_H
#include <iostream> #include <iostream>
#include <cstdint>
enum Color {Black, Red}; enum Color {Black, Red};

View File

@ -14,18 +14,22 @@ project(
DESCRIPTION "Practice project for learning Catch2" DESCRIPTION "Practice project for learning Catch2"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options(-Wall) add_compile_options(-Wall)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
Include(FetchContent) Include(FetchContent)
FetchContent_Declare( FetchContent_Declare(
Catch2 Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.0.1 GIT_TAG v3.4.0
) )
FetchContent_MakeAvailable(Catch2) FetchContent_MakeAvailable(Catch2)
add_subdirectory(src) add_library(klips SHARED src/klips.cpp)
add_subdirectory(test) target_include_directories(klips PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
add_executable(test_klips src/test_klips.cpp)
target_link_libraries(test_klips PUBLIC Catch2::Catch2WithMain klips)

View File

@ -1,22 +0,0 @@
################################################################################
## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
## About: Practice project for testing with catch2 framework ##
## ##
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
################################################################################
cmake_minimum_required(VERSION 3.15)
project(
#[[NAME]] Catch2
VERSION 1.0
DESCRIPTION "Practice project for learning Catch2"
LANGUAGES CXX
)
add_compile_options(-Wall)
add_definitions("-std=c++17")
add_library(klips SHARED klips.cpp)
target_include_directories(klips PRIVATE ${CMAKE_SOURCE_DIR}/include)

View File

@ -2,7 +2,8 @@
#include <iostream> #include <iostream>
#include "../bin/catch.hpp" #include "catch2/catch_all.hpp"
#include "klips.hpp" #include "klips.hpp"
#include "type_name.hpp" #include "type_name.hpp"
@ -139,7 +140,7 @@ template <> template <bool must_find> void test_config_get<std::string>::run() {
TEMPLATE_PRODUCT_TEST_CASE("Test", "[test]", test_config_get, TEMPLATE_PRODUCT_TEST_CASE("Test", "[test]", test_config_get,
(int, std::string)) { (int, std::string)) {
TT(); TT();
TestType t; // TestType t;
test_config_get<int> s; test_config_get<int> s;
s.template run<true>(); s.template run<true>();
// TestType t; // TestType t;

View File

@ -1,22 +0,0 @@
################################################################################
## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ##
## About: Practice project for testing with catch2 framework ##
## ##
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
################################################################################
cmake_minimum_required(VERSION 3.15)
project(
#[[NAME]] Catch2
VERSION 1.0
DESCRIPTION "Practice project for learning Catch2"
LANGUAGES CXX
)
add_compile_options(-Wall)
add_executable(test_klips test_klips.cpp)
target_link_libraries(test_klips PRIVATE Catch2::Catch2WithMain klips)
target_include_directories(test_klips PRIVATE ${CMAKE_SOURCE_DIR}/include)

View File

@ -22,6 +22,7 @@ project (
DESCRIPTION "A basic CMake template for C++ projects" DESCRIPTION "A basic CMake template for C++ projects"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
# Include any directories the compiler may need # Include any directories the compiler may need
include_directories(./include) include_directories(./include)

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing cryptography in C++" DESCRIPTION "A project for practicing cryptography in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "Practice implementing columnar transposition in C++" DESCRIPTION "Practice implementing columnar transposition in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
crypto-columnar-transposition driver.cpp crypto-columnar-transposition driver.cpp

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing various data structures in C++" DESCRIPTION "A project for practicing various data structures in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing a basic implementation of a BST" DESCRIPTION "A project for testing a basic implementation of a BST"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-bst driver.cpp data-bst driver.cpp

View File

@ -10,6 +10,7 @@
#include "bst.h" #include "bst.h"
#include <cstdint>
/******************************************************************************** /********************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "Project for testing circular doubly linked list implementation" DESCRIPTION "Project for testing circular doubly linked list implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-circular-doubly-linked-list driver.cpp data-circular-doubly-linked-list driver.cpp

View File

@ -10,6 +10,7 @@
#include "circledoublelist.h" #include "circledoublelist.h"
#include <cstdint>
/****************************************************************************** /******************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "Project for testing circular singly linked list implementation" DESCRIPTION "Project for testing circular singly linked list implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-circular-singly-linked-list driver.cpp data-circular-singly-linked-list driver.cpp

View File

@ -10,6 +10,7 @@
#include "circlesinglelist.h" #include "circlesinglelist.h"
#include <cstdint>
/****************************************************************************** /******************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing a doubly linked list implementation" DESCRIPTION "A project for testing a doubly linked list implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-doubly-linked-list driver.cpp data-doubly-linked-list driver.cpp

View File

@ -10,6 +10,7 @@
#include "doublelist.h" #include "doublelist.h"
#include <cstdint>
/****************************************************************************** /******************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing a max heap implementation" DESCRIPTION "A project for testing a max heap implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-max-heap driver.cpp data-max-heap driver.cpp

View File

@ -10,6 +10,7 @@
#include "maxheap.h" #include "maxheap.h"
#include <cstdint>
/******************************************************************************** /********************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "Project for testing queue implementation" DESCRIPTION "Project for testing queue implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-queue driver.cpp data-queue driver.cpp

View File

@ -10,6 +10,7 @@
#include "queuelist.h" #include "queuelist.h"
#include <cstdint>
/****************************************************************************** /******************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing a singly linked list implementation" DESCRIPTION "A project for testing a singly linked list implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-singly-linked-list driver.cpp data-singly-linked-list driver.cpp

View File

@ -10,6 +10,7 @@
#include "singlelist.h" #include "singlelist.h"
#include <cstdint>
/****************************************************************************** /******************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing a Stack implementation" DESCRIPTION "A project for testing a Stack implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-stack driver.cpp data-stack driver.cpp

View File

@ -10,6 +10,7 @@
#include "stacklist.h" #include "stacklist.h"
#include <cstdint>
/****************************************************************************** /******************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for practicing templated data structures in C++" DESCRIPTION "A project for practicing templated data structures in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_subdirectory(doublelist) add_subdirectory(doublelist)
add_subdirectory(queuelist) add_subdirectory(queuelist)

View File

@ -14,5 +14,6 @@ project (
DESCRIPTION "A project for practicing templated doubly linked list implementations" DESCRIPTION "A project for practicing templated doubly linked list implementations"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable(data-templates-doubly-linked-list driver.cpp) add_executable(data-templates-doubly-linked-list driver.cpp)

View File

@ -14,5 +14,6 @@ project (
DESCRIPTION "A project for practicing templated queue implementations" DESCRIPTION "A project for practicing templated queue implementations"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable(data-templates-queue driver.cpp) add_executable(data-templates-queue driver.cpp)

View File

@ -14,5 +14,6 @@ project (
DESCRIPTION "A project for practicing templated Stack implementations" DESCRIPTION "A project for practicing templated Stack implementations"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable(data-templates-stack driver.cpp) add_executable(data-templates-stack driver.cpp)

View File

@ -14,5 +14,6 @@ project (
DESCRIPTION "A project for practicing templated Vector implementations" DESCRIPTION "A project for practicing templated Vector implementations"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable(data-templates-vectors driver.cpp) add_executable(data-templates-vectors driver.cpp)

View File

@ -14,6 +14,7 @@ project (
DESCRIPTION "A project for testing a basic Vector implementation" DESCRIPTION "A project for testing a basic Vector implementation"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
data-vectors driver.cpp data-vectors driver.cpp

View File

@ -10,6 +10,7 @@
#include "vector.h" #include "vector.h"
#include <cstdint>
/****************************************************************************** /******************************************************************************
* Constructors, Destructors, Operators * Constructors, Destructors, Operators

View File

@ -1,6 +1,6 @@
################################################################################ ################################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ## ## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
## About: A root project for practicing C++ ## ## About: A root project for practicing C++ ##
## This project can be built to debug and run all nested projects ## ## This project can be built to debug and run all nested projects ##
## Or, any subdirectory with a project() statement can be selected ## ## Or, any subdirectory with a project() statement can be selected ##
@ -16,6 +16,7 @@ project(
DESCRIPTION "A root project for practicing graphics programming in C++" DESCRIPTION "A root project for practicing graphics programming in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -1,6 +1,6 @@
################################################################################ ################################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ## ## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
## ## ## ##
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
################################################################################ ################################################################################
@ -8,40 +8,46 @@
# Define CMake version # Define CMake version
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.15)
include(FetchContent)
project( project(
#[[NAME]] OpenGL-Cmake #[[NAME]] OpenGL-Cmake
DESCRIPTION "Example project for building OpenGL projects with CMake" DESCRIPTION "Example project for building OpenGL projects with CMake"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_library(graphics-lib-opengl src/lib-opengl-test.cpp) add_library(graphics-lib-opengl src/lib-opengl-test.cpp)
target_include_directories(graphics-lib-opengl PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) target_include_directories(graphics-lib-opengl PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
# Find OpenGL package # Find OpenGL package
find_package(OpenGL REQUIRED) find_package(OpenGL)
if (OPENGL_FOUND) if (NOT OPENGL_FOUND)
# Link opengl-test executable to OpenGL
target_include_directories(graphics-lib-opengl PUBLIC ${OPENGL_INCLUDE_DIR})
target_link_libraries(graphics-lib-opengl PUBLIC ${OPENGL_LIBRARIES})
else()
message( message(
"Error: CMake was unable to find the OpenGL package\n" "[Klips] Error: CMake was unable to find OpenGL.\n"
"Please install OpenGL and try again\n" "On Ubuntu 24.04 OpenGL can be installed using apt:\n"
" sudo apt install libopengl-dev libgl1-mesa-dev mesa-common-dev libglu1-mesa-dev\n"
) )
endif() endif()
# Link opengl-test executable to OpenGL
message(STATUS "[Klips] Found OpenGL: ${OPENGL_INCLUDE_DIR}")
target_include_directories(graphics-lib-opengl PUBLIC ${OPENGL_INCLUDE_DIR})
target_link_libraries(graphics-lib-opengl PUBLIC ${OPENGL_LIBRARIES})
# Find GLUT package find_package(GLUT QUIET)
find_package(GLUT REQUIRED) if(NOT GLUT_FOUND)
if (GLUT_FOUND) message(
FATAL_ERROR
"[Klips] Failed to fetch GLUT. Could not find dependency X11 input libraries.\n"
"On Ubuntu 24.04 Xi can be installed using apt:\n"
" sudo apt install libxi-dev\n"
"Alternatively, on Ubuntu 24.04 GLUT can be installed with apt:\n"
" sudo apt install freeglut3-dev\n"
)
endif()
message(STATUS "[Klips] Found GLUT: ${GLUT_INCLUDE_DIR}")
# Link lib-opengl-test executable to GLUT # Link lib-opengl-test executable to GLUT
target_include_directories(graphics-lib-opengl PUBLIC ${GLUT_INCLUDE_DIR}) target_include_directories(graphics-lib-opengl PUBLIC ${GLUT_INCLUDE_DIR})
target_link_libraries(graphics-lib-opengl PUBLIC ${GLUT_LIBRARIES}) target_link_libraries(graphics-lib-opengl PUBLIC ${GLUT_LIBRARIES})
else()
message(
"Error: CMake was unable to find the GLUT package\n"
"Please install GLUT (freeglut3-dev) and try again\n"
)
endif()
# Add test executable # Add test executable
add_executable(graphics-cmake-opengl apps/test-gl.cpp) add_executable(graphics-cmake-opengl apps/test-gl.cpp)

View File

@ -1,6 +1,6 @@
################################################################################ ################################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ## ## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
## ## ## ##
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
################################################################################ ################################################################################
@ -13,6 +13,7 @@ project(
DESCRIPTION "Example project for building SDL projects with CMake" DESCRIPTION "Example project for building SDL projects with CMake"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
# Add Library # Add Library
add_library( add_library(
@ -27,10 +28,16 @@ target_include_directories( # When calling library, include a directo
) )
# Search for SDL2 package # Search for SDL2 package
find_package(SDL2 REQUIRED sdl2) find_package(SDL2 QUIET)
if (NOT SDL2_FOUND)
message(FATAL_ERROR
"[Klips] Failed to find SDL2.\n"
"On Ubuntu 24.04 SDL2 can be installed using apt:\n"
" sudo apt install libsdl2-dev\n"
)
endif()
message(STATUS "[Klips] Found SDL2: ${SDL2_INCLUDE_DIRS}")
# If SDL2 was found successfully, link to lib-sdl-test
if (SDL2_FOUND)
# Any target that links with this library will also link to SDL2 # Any target that links with this library will also link to SDL2
# + Because we choose PUBLIC visibility # + Because we choose PUBLIC visibility
target_include_directories(graphics-lib-sdl PUBLIC ${SDL2_INCLUDE_DIRS}) target_include_directories(graphics-lib-sdl PUBLIC ${SDL2_INCLUDE_DIRS})
@ -48,10 +55,3 @@ if (SDL2_FOUND)
PRIVATE # Visibility PRIVATE # Visibility
graphics-lib-sdl # Library to link graphics-lib-sdl # Library to link
) )
else()
message(
"Error: CMake was unable to find SDL2 package.\n"
"Please install the libsdl2-dev package and try again.\n"
)
endif()

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "Practice with multithreaded programming in C++" DESCRIPTION "Practice with multithreaded programming in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_compile_options("-Wall") add_compile_options("-Wall")

View File

@ -18,6 +18,7 @@ project(
DESCRIPTION "Example of condition_variables in multithreaded C++" DESCRIPTION "Example of condition_variables in multithreaded C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
multithread-conditions driver.cpp multithread-conditions driver.cpp

View File

@ -18,6 +18,7 @@ project(
DESCRIPTION "Example and solution for deadlocks in C++" DESCRIPTION "Example and solution for deadlocks in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
multithread-deadlock driver.cpp multithread-deadlock driver.cpp

View File

@ -18,6 +18,7 @@ project(
DESCRIPTION "Example and solution for livelocks in C++" DESCRIPTION "Example and solution for livelocks in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
multithread-livelock driver.cpp multithread-livelock driver.cpp

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "Example and solution for race conditions" DESCRIPTION "Example and solution for race conditions"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
multithread-race-condition driver.cpp multithread-race-condition driver.cpp

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "A project for practicing various design patterns in C++" DESCRIPTION "A project for practicing various design patterns in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

View File

@ -13,6 +13,7 @@ project(
DESCRIPTION "An example of the abstract factory design pattern in C++" DESCRIPTION "An example of the abstract factory design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the adapter design pattern in C++" DESCRIPTION "An example of the adapter design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -2,6 +2,7 @@
#ifndef ADAPTER_HPP #ifndef ADAPTER_HPP
#define ADAPTER_HPP #define ADAPTER_HPP
#include <ctime>
#include <random> #include <random>
// Target implementation to adapt to a new interface // Target implementation to adapt to a new interface

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the bridge design pattern in C++" DESCRIPTION "An example of the bridge design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the factory design pattern in C++" DESCRIPTION "An example of the factory design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the state design pattern in C++" DESCRIPTION "An example of the state design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the prototype design pattern in C++" DESCRIPTION "An example of the prototype design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the singleton design pattern in C++" DESCRIPTION "An example of the singleton design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_executable( add_executable(
patterns-singleton main.cpp patterns-singleton main.cpp

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the state design pattern in C++" DESCRIPTION "An example of the state design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "An example of the visitor design pattern in C++" DESCRIPTION "An example of the visitor design pattern in C++"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options("-Wall") add_compile_options("-Wall")
add_executable( add_executable(

View File

@ -14,6 +14,7 @@ project(
DESCRIPTION "A root project for several small Qt6 practice projects" DESCRIPTION "A root project for several small Qt6 practice projects"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_compile_options("-Wall") add_compile_options("-Wall")

View File

@ -14,6 +14,9 @@ project(
DESCRIPTION "Example of a widget plugin collection for Qt Designer" DESCRIPTION "Example of a widget plugin collection for Qt Designer"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
# Lowercase string to use as a slug for executable names for identification.
string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
include(GenerateExportHeader) include(GenerateExportHeader)
@ -51,43 +54,56 @@ endif()
set(QT_INSTALL_DIR "${QT_DIR}/6.3.1/gcc_64/" CACHE PATH "Path to Qt6 install") set(QT_INSTALL_DIR "${QT_DIR}/6.3.1/gcc_64/" CACHE PATH "Path to Qt6 install")
list(APPEND CMAKE_PREFIX_PATH "${QT_INSTALL_DIR}") list(APPEND CMAKE_PREFIX_PATH "${QT_INSTALL_DIR}")
find_package(Qt6 REQUIRED COMPONENTS UiPlugin Core Gui Widgets) find_package(Qt6 COMPONENTS UiPlugin Core Gui Widgets)
if (NOT Qt6_FOUND)
message(
FATAL_ERROR
"[Klips] Error: CMake was unable to find Qt6 libraries.\n"
"The example will not be built until the build is configured with these packages installed.\n"
"On Ubuntu 24.04 Qt6 can be installed using apt:\n"
" sudo apt-get install qt6-base-dev qt6-tools-dev\n"
)
endif()
# Creating a library with two plugins for the collection. # Creating a library with two plugins for the collection.
qt_add_library(widget-plugin-library set(WIDGET_PLUGIN_LIBRARY widget-plugin-library_${PROJECT_NAME_LOWER})
qt_add_library(${WIDGET_PLUGIN_LIBRARY}
textview.cpp textview.h textview.cpp textview.h
widgetplugin.cpp widgetplugin.h widgetplugin.cpp widgetplugin.h
) )
target_sources(widget-plugin-library PRIVATE target_sources(${WIDGET_PLUGIN_LIBRARY} PRIVATE
textview.cpp textview.h textview.cpp textview.h
treeview.cpp treeview.h treeview.cpp treeview.h
widgetplugin.cpp widgetplugin.h widgetplugin.cpp widgetplugin.h
) )
set_target_properties(widget-plugin-library PROPERTIES set_target_properties(${WIDGET_PLUGIN_LIBRARY} PROPERTIES
WIN32_EXECUTABLE TRUE WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE MACOSX_BUNDLE TRUE
) )
target_link_libraries(widget-plugin-library target_link_libraries(${WIDGET_PLUGIN_LIBRARY}
PUBLIC Qt::UiPlugin Qt::Core Qt::Gui Qt::Widgets PUBLIC Qt::UiPlugin Qt::Core Qt::Gui Qt::Widgets
) )
install(TARGETS widget-plugin-library install(TARGETS ${WIDGET_PLUGIN_LIBRARY}
RUNTIME DESTINATION "${QT_PLUGIN_LIBRARY_DIR}" RUNTIME DESTINATION "${QT_PLUGIN_LIBRARY_DIR}"
BUNDLE DESTINATION "${QT_PLUGIN_LIBRARY_DIR}" BUNDLE DESTINATION "${QT_PLUGIN_LIBRARY_DIR}"
LIBRARY DESTINATION "${QT_PLUGIN_LIBRARY_DIR}" LIBRARY DESTINATION "${QT_PLUGIN_LIBRARY_DIR}"
) )
generate_export_header(widget-plugin-library) generate_export_header(${WIDGET_PLUGIN_LIBRARY}
BASE_NAME widget_plugin_library
EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/widget-plugin-library_export.h"
)
# Creating the collection # Creating the collection
set(WIDGET_PLUGIN_COLLECTION widget-plugin-collection_${PROJECT_NAME_LOWER})
qt_add_library(widget-plugin-collection qt_add_library(${WIDGET_PLUGIN_COLLECTION}
widgetplugincollection.cpp widgetplugincollection.h widgetplugincollection.cpp widgetplugincollection.h
) )
target_link_libraries(widget-plugin-collection target_link_libraries(${WIDGET_PLUGIN_COLLECTION}
Qt6::Widgets Qt6::UiPlugin widget-plugin-library Qt6::Widgets Qt6::UiPlugin ${WIDGET_PLUGIN_LIBRARY}
) )
install(TARGETS widget-plugin-collection install(TARGETS ${WIDGET_PLUGIN_COLLECTION}
RUNTIME DESTINATION "${QT_PLUGIN_INSTALL_DIR}" RUNTIME DESTINATION "${QT_PLUGIN_INSTALL_DIR}"
BUNDLE DESTINATION "${QT_PLUGIN_INSTALL_DIR}" BUNDLE DESTINATION "${QT_PLUGIN_INSTALL_DIR}"
LIBRARY DESTINATION "${QT_PLUGIN_INSTALL_DIR}" LIBRARY DESTINATION "${QT_PLUGIN_INSTALL_DIR}"
@ -101,10 +117,11 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/app-dir.h.in"
@ONLY @ONLY
) )
qt_add_executable(widget-app set(WIDGET_APP widget-app_${PROJECT_NAME_LOWER})
qt_add_executable(${WIDGET_APP}
widgetapp.cpp widgetapp.h widgetapp.ui widgetapp.cpp widgetapp.h widgetapp.ui
main.cpp main.cpp
) )
target_link_libraries(widget-app target_link_libraries(${WIDGET_APP}
PRIVATE Qt::Widgets widget-plugin-library PRIVATE Qt::Widgets ${WIDGET_PLUGIN_LIBRARY}
) )

View File

@ -1,6 +1,6 @@
#ifndef APPDIR_H_IN #ifndef APPDIR_H_IN
#define APPDIR_H_IN #define APPDIR_H_IN
#define APP_DIR "/home/kapper/Code/klips/cpp/qt/designer-plugin-collection" #define APP_DIR "/media/shaun/Storage/Code/klips/cpp/qt/designer-plugin-collection"
#endif // APPDIR_H_IN #endif // APPDIR_H_IN

View File

@ -1,6 +1,6 @@
################################################################################ ################################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## ## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
## About: Example of making widget plugins for Qt Designer ## ## About: Example of making widget plugins for Qt Designer ##
## ## ## ##
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
@ -14,6 +14,9 @@ project(
DESCRIPTION "Example of a widget plugin for Qt Designer" DESCRIPTION "Example of a widget plugin for Qt Designer"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
# Lowercase string to use as a slug for executable names for identification.
string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
include(GenerateExportHeader) include(GenerateExportHeader)
@ -42,35 +45,44 @@ endif()
set(QT_INSTALL_DIR "${QT_DIR}/6.3.1/gcc_64/" CACHE PATH "Path to Qt6 install") set(QT_INSTALL_DIR "${QT_DIR}/6.3.1/gcc_64/" CACHE PATH "Path to Qt6 install")
list(APPEND CMAKE_PREFIX_PATH "${QT_INSTALL_DIR}") list(APPEND CMAKE_PREFIX_PATH "${QT_INSTALL_DIR}")
find_package(Qt6 REQUIRED COMPONENTS UiPlugin Core Gui Widgets) find_package(Qt6 COMPONENTS UiPlugin Core Gui Widgets)
if (NOT Qt6_FOUND)
message(
FATAL_ERROR
"[Klips] Error: CMake was unable to find Qt6 libraries.\n"
"The example will not be built until the build is configured with these packages installed.\n"
"On Ubuntu 24.04 Qt6 can be installed using apt:\n"
" sudo apt-get install qt6-base-dev qt6-tools-dev\n"
)
endif()
# Creating the plugin # Creating the plugin
set(WIDGET_PLUGIN widget-plugin_${PROJECT_NAME_LOWER})
qt_add_library(widget-plugin) qt_add_library(${WIDGET_PLUGIN})
target_sources(widget-plugin PRIVATE target_sources(${WIDGET_PLUGIN} PRIVATE
text-view.cpp text-view.h text-view.cpp text-view.h
widget-plugin.cpp widget-plugin.h widget-plugin.cpp widget-plugin.h
) )
set_target_properties(widget-plugin PROPERTIES set_target_properties(${WIDGET_PLUGIN} PROPERTIES
WIN32_EXECUTABLE TRUE WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE MACOSX_BUNDLE TRUE
) )
target_link_libraries(widget-plugin PUBLIC target_link_libraries(${WIDGET_PLUGIN} PUBLIC
Qt::UiPlugin Qt::Core Qt::Gui Qt::Widgets Qt::UiPlugin Qt::Core Qt::Gui Qt::Widgets
) )
install(TARGETS widget-plugin install(TARGETS ${WIDGET_PLUGIN}
RUNTIME DESTINATION "${QT_PLUGIN_INSTALL_DIR}" RUNTIME DESTINATION "${QT_PLUGIN_INSTALL_DIR}"
BUNDLE DESTINATION "${QT_PLUGIN_INSTALL_DIR}" BUNDLE DESTINATION "${QT_PLUGIN_INSTALL_DIR}"
LIBRARY DESTINATION "${QT_PLUGIN_INSTALL_DIR}" LIBRARY DESTINATION "${QT_PLUGIN_INSTALL_DIR}"
) )
# Application that will use the widget plugin # Application that will use the widget plugin
set(WIDGET_APP widget-app_${PROJECT_NAME_LOWER})
qt_add_executable(widget-app qt_add_executable(${WIDGET_APP}
widget-app.cpp widget-app.h widget-app.ui widget-app.cpp widget-app.h widget-app.ui
main.cpp main.cpp
) )
target_link_libraries(widget-app PRIVATE target_link_libraries(${WIDGET_APP} PRIVATE
Qt::Widgets widget-plugin Qt::Widgets ${WIDGET_PLUGIN}
) )

View File

@ -1,6 +1,6 @@
################################################################################ ################################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## ## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
## About: Practice project for using Qt Designer with custom C++ widgets ## ## About: Practice project for using Qt Designer with custom C++ widgets ##
## ## ## ##
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
@ -14,6 +14,7 @@ project(
DESCRIPTION "Practice using Qt designer for desktop applications" DESCRIPTION "Practice using Qt designer for desktop applications"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options(-Wall) add_compile_options(-Wall)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
@ -28,7 +29,16 @@ set(QT_DIR "$ENV{HOME}/Code/Clones/Qt/6.3.1/gcc_64/" CACHE PATH "Path to Qt6")
list(APPEND CMAKE_PREFIX_PATH "${QT_DIR}") list(APPEND CMAKE_PREFIX_PATH "${QT_DIR}")
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) find_package(Qt6 COMPONENTS Core Gui Widgets)
if (NOT Qt6_FOUND)
message(
FATAL_ERROR
"[Klips] Error: CMake was unable to find Qt6 libraries.\n"
"The example will not be built until the build is configured with these packages installed.\n"
"On Ubuntu 24.04 Qt6 can be installed using apt:\n"
" sudo apt-get install qt6-base-dev qt6-tools-dev\n"
)
endif()
qt_add_executable(designer qt_add_executable(designer
designer.cpp designer.h designer.ui designer.cpp designer.h designer.ui

View File

@ -1,6 +1,6 @@
################################################################################ ################################################################################
## Author: Shaun Reed ## ## Author: Shaun Reed ##
## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## ## Legal: All Content (c) 2025 Shaun Reed, all rights reserved ##
## About: Practice project for using signals and slots in Qt ## ## About: Practice project for using signals and slots in Qt ##
## ## ## ##
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
@ -14,6 +14,7 @@ project(
DESCRIPTION "Practice using signals and slots in Qt 6" DESCRIPTION "Practice using signals and slots in Qt 6"
LANGUAGES CXX LANGUAGES CXX
) )
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
add_compile_options(-Wall) add_compile_options(-Wall)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
@ -28,7 +29,16 @@ set(QT_DIR "$ENV{HOME}/Code/Clones/Qt/6.3.1/gcc_64/" CACHE PATH "Path to Qt6")
list(APPEND CMAKE_PREFIX_PATH "${QT_DIR}") list(APPEND CMAKE_PREFIX_PATH "${QT_DIR}")
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) find_package(Qt6 COMPONENTS Core Gui Widgets)
if (NOT Qt6_FOUND)
message(
FATAL_ERROR
"[Klips] Error: CMake was unable to find Qt6 libraries.\n"
"The example will not be built until the build is configured with these packages installed.\n"
"On Ubuntu 24.04 Qt6 can be installed using apt:\n"
" sudo apt-get install qt6-base-dev qt6-tools-dev\n"
)
endif()
qt_add_executable(slots qt_add_executable(slots
text-view.cpp text-view.h text-view.cpp text-view.h

View File

@ -22,7 +22,7 @@ public:
public: public:
signals: signals:
void sendTest()QWidget; void sendTest();
private: private:
signals: signals:

View File

@ -1,5 +1,9 @@
# 01_led-button # 01_led-button
This example is largely adapted from those in [ESP32-basic-starter-kit.pdf](./ESP32-basic-starter-kit.pdf).
The APIs in the original examples paired with this PDF have changed, and I decided to do some different things with the code and/or circuits, but the original code can be [found here](https://www.dropbox.com/scl/fo/6znlij3eb23ih4jxcpv2w/AKvB1t9CCUgoVRVtGen8Yrw?rlkey=z84anl0hs940qf9fpl7l8q8q2&e=1&dl=0).
![schematic](./schematic.png) ![schematic](./schematic.png)
Simple LED controlled by an on-board button. Simple LED controlled by an on-board button.

View File

@ -1,5 +1,9 @@
# 02_led-button-web # 02_led-button-web
This example is largely adapted from those in [ESP32-basic-starter-kit.pdf](./ESP32-basic-starter-kit.pdf).
The APIs in the original examples paired with this PDF have changed, and I decided to do some different things with the code and/or circuits, but the original code can be [found here](https://www.dropbox.com/scl/fo/6znlij3eb23ih4jxcpv2w/AKvB1t9CCUgoVRVtGen8Yrw?rlkey=z84anl0hs940qf9fpl7l8q8q2&e=1&dl=0).
![schematic](./schematic.png) ![schematic](./schematic.png)
This example uses the same schematic as [01_led-button](../01_led-button/). This example uses the same schematic as [01_led-button](../01_led-button/).

View File

@ -1,5 +1,9 @@
# 03_temp-humidity-web # 03_temp-humidity-web
This example is largely adapted from those in [ESP32-basic-starter-kit.pdf](./ESP32-basic-starter-kit.pdf).
The APIs in the original examples paired with this PDF have changed, and I decided to do some different things with the code and/or circuits, but the original code can be [found here](https://www.dropbox.com/scl/fo/6znlij3eb23ih4jxcpv2w/AKvB1t9CCUgoVRVtGen8Yrw?rlkey=z84anl0hs940qf9fpl7l8q8q2&e=1&dl=0).
![schematic](./schematic.png) ![schematic](./schematic.png)
Temperature and humidity sensor served on a web page within the local network. Temperature and humidity sensor served on a web page within the local network.

4
esp/cpp/04_esp-idf-arduino/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
build
managed_components
dependencies.lock
sdkconfig.old

View File

@ -0,0 +1,19 @@
# For more information about build system see
# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.26)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(
#[[NAME]] esp-idf-arduino
VERSION 0.1
DESCRIPTION "Example ESP-IDF cmake project"
LANGUAGES CXX
)
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
# For writing pure cmake components, see the documentation
# https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/build-system.html#writing-pure-cmake-components
idf_build_set_property(COMPILE_OPTIONS "-Wno-error" APPEND)

View File

@ -0,0 +1,81 @@
# 04_esp-idf-arduino
There is no schematic for this example, it simply prints some output to the serial monitor at 115200.
This is more of a build system example for untethering yourself from the Arduino IDE.
To build this example you can run the following commands.
```bash
# See Dependencies section below for instructions.
source ~/path/to/esp-idf/export.sh
mkdir build
cd build
cmake ..
make -j $(nproc)
# Flash the example to the ESP.
make flash
# Check the serial monitor for 'Hello world!' output.
idf.py monitor -b 115200
```
To flash to your ESP or access the `idf.py menuconfig` menu from the ESP-IDF you can run the same commands with `make`.
```bash
make flash
make menuconfig
```
If Ninja is preferred:
```bash
mkdir build
cd build
cmake .. -G Nina
ninja
```
## Dependencies
Install the [ESP-IDF](https://github.com/espressif/esp-idf?tab=readme-ov-file#setup-build-environment)
```bash
# https://docs.espressif.com/projects/esp-idf/en/v5.3.2/esp32/get-started/linux-macos-setup.html#for-linux-users
sudo apt-get install -y git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
git clone -b v5.3.2 --recursive https://github.com/espressif/esp-idf
cd esp-idf
./install.sh
. ./export.sh
```
In CLion there is an official [Serial Monitor](https://plugins.jetbrains.com/plugin/8031-serial-port-monitor) plugin, or use ESP-IDF -
```bash
idf.py monitor -b 115200
```
## Starting Over
To set up this project from scratch the following commands were used
```bash
# My example project directory
cd ~/Code/klips/esp/cpp/04_esp-idf-arduino
idf.py set-target esp32
idf.py add-dependency "espressif/arduino-esp32^3.1.1"
# Autostart Arduino for use of `loop()` and `setup()` functions
# You can also use the esp-idf `app_main()` function if preferred
# https://docs.espressif.com/projects/arduino-esp32/en/latest/esp-idf_component.html#configuration
# You can alternatively do this in the GUI tool `idf.py menuconfig`
echo "CONFIG_AUTOSTART_ARDUINO=y" >> sdkconfig
sed -i -e 's/CONFIG_FREERTOS_HZ=100/CONFIG_FREERTOS_HZ=1000/' sdkconfig
# Build the project
idf.py build
```
To set this project up in CLion, see [JetBrains documentation](https://www.jetbrains.com/help/clion/esp-idf.html#env-vars).

View File

@ -0,0 +1,4 @@
idf_component_register(
SRCS "main.cpp"
INCLUDE_DIRS "."
)

View File

@ -0,0 +1,17 @@
## IDF Component Manager Manifest File
dependencies:
## Required IDF version
idf:
version: '>=4.1.0'
# # Put list of dependencies here
# # For components maintained by Espressif:
# component: "~1.0.0"
# # For 3rd party components:
# username/component: ">=1.0.0,<2.0.0"
# username2/component2:
# version: "~1.0.0"
# # For transient dependencies `public` flag can be set.
# # `public` flag doesn't have an effect dependencies of the `main` component.
# # All dependencies of `main` are public by default.
# public: true
espressif/arduino-esp32: ^3.1.1

View File

@ -0,0 +1,10 @@
#include "Arduino.h"
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Hello world!");
delay(1000);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,4 @@
build
managed_components
dependencies.lock
sdkconfig.old

View File

@ -0,0 +1,19 @@
# For more information about build system see
# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.26)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(
#[[NAME]] temp-humidity-web
VERSION 0.1
DESCRIPTION "Temperature and humidity from DHT sensor served on a web page"
LANGUAGES CXX
)
message(STATUS "[Klips] Configuring example: ${PROJECT_NAME}")
# For writing pure cmake components, see the documentation
# https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/build-system.html#writing-pure-cmake-components
idf_build_set_property(COMPILE_OPTIONS "-Wno-error" APPEND)

View File

@ -0,0 +1,27 @@
# 05_temp-humidity-web
This is the same example in [03_temp-humidity-web](./../03_temp-humidity-web), ported to the cmake ESP-IDF build system.
For instructions on setting up the ESP-IDF see [04_-esp-idf-arduino](./../04_esp-idf-arduino)
This example is largely adapted from those in [ESP32-basic-starter-kit.pdf](./ESP32-basic-starter-kit.pdf).
The APIs in the original examples paired with this PDF have changed, and I decided to do some different things with the code and/or circuits, but the original code can be [found here](https://www.dropbox.com/scl/fo/6znlij3eb23ih4jxcpv2w/AKvB1t9CCUgoVRVtGen8Yrw?rlkey=z84anl0hs940qf9fpl7l8q8q2&e=1&dl=0).
![schematic](./schematic.png)
Temperature and humidity sensor served on a web page within the local network.
![screenshot](./screenshot.png)
To build this example run the following commands.
```bash
source ~/path/to/esp-idf/export.sh
mkdir build
cd build
cmake ..
make -j $(nproc)
make flash
```

View File

@ -0,0 +1,4 @@
idf_component_register(
SRCS "main.cpp"
INCLUDE_DIRS "."
)

View File

@ -0,0 +1,19 @@
## IDF Component Manager Manifest File
dependencies:
## Required IDF version
idf:
version: '>=4.1.0'
# # Put list of dependencies here
# # For components maintained by Espressif:
# component: "~1.0.0"
# # For 3rd party components:
# username/component: ">=1.0.0,<2.0.0"
# username2/component2:
# version: "~1.0.0"
# # For transient dependencies `public` flag can be set.
# # `public` flag doesn't have an effect dependencies of the `main` component.
# # All dependencies of `main` are public by default.
# public: true
espressif/arduino-esp32: ^3.1.1
zorxx/dht: ^1.0.1
esp32async/espasyncwebserver: ^3.7.0~1

View File

@ -0,0 +1,189 @@
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
#include "main.h"
// Replace with your network credentials
const char *ssid = "wifi";
const char *password = "password";
#define DHTPIN GPIO_NUM_4 // Digital pin connected to the DHT sensor
// Uncomment the type of sensor in use:
#define DHTTYPE DHT_TYPE_DHT11 // DHT 11
//#define DHTTYPE DHT_TYPE_DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT_TYPE_DHT21 // DHT 21 (AM2301)
float DHT::readTemperature(bool f)
{
float humidity = 0;
float temperature = 0;
esp_err_t result = dht_read_float_data(type_, gpio_, &humidity,
&temperature);
if (result == ESP_OK) {
ESP_LOGI("[DHT::readTemperature]", "Humidity: %.1f%% Temperature: %.1f°C",
humidity,
temperature);
} else {
ESP_LOGE("[DHT::readTemperature]", "Failed to read sensor data: %s",
esp_err_to_name(result));
}
return f ? (temperature * 1.8f) + 32 : temperature;
}
float DHT::readHumidity()
{
float humidity = 0;
float temperature = 0;
esp_err_t result = dht_read_float_data(type_, gpio_, &humidity,
&temperature);
if (result == ESP_OK) {
ESP_LOGI("[DHT::readTemperature]", "Humidity: %.1f%% Temperature: %.1f°C",
humidity,
temperature);
} else {
ESP_LOGE("[DHT::readTemperature]", "Failed to read sensor data: %s",
esp_err_to_name(result));
}
return humidity;
}
DHT dht(DHTPIN, DHTTYPE);
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
String readDHTTemperature()
{
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float t = dht.readTemperature();
// Check if any reads failed and exit early (to try again).
if (isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return "--";
} else {
Serial.println(t);
return String(t);
}
}
String readDHTHumidity()
{
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
if (isnan(h)) {
Serial.println("Failed to read from DHT sensor!");
return "--";
} else {
Serial.println(h);
return String(h);
}
}
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<style>
html {
font-family: Arial;
display: inline-block;
margin: 0px auto;
text-align: center;
}
h2 { font-size: 3.0rem; }
p { font-size: 3.0rem; }
.units { font-size: 1.2rem; }
.dht-labels{
font-size: 1.5rem;
vertical-align:middle;
padding-bottom: 15px;
}
</style>
</head>
<body>
<h2>ESP32 DHT Server</h2>
<p>
<i class="fas fa-thermometer-half" style="color:#059e8a;"></i>
<span class="dht-labels">Temperature</span>
<span id="temperature">%TEMPERATURE%</span>
<sup class="units">&deg;C</sup>
</p>
<p>
<i class="fas fa-tint" style="color:#00add6;"></i>
<span class="dht-labels">Humidity</span>
<span id="humidity">%HUMIDITY%</span>
<sup class="units">&percnt;</sup>
</p>
</body>
<script>
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("temperature").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/temperature", true);
xhttp.send();
}, 10000 ) ;
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("humidity").innerHTML = this.responseText;
}
};
xhttp.open("GET", "/humidity", true);
xhttp.send();
}, 10000 ) ;
</script>
</html>)rawliteral";
// Replaces placeholder with DHT values
String processor(const String &var)
{
//Serial.println(var);
if (var == "TEMPERATURE") {
return readDHTTemperature();
} else if (var == "HUMIDITY") {
return readDHTHumidity();
}
return String();
}
void setup()
{
// Serial port for debugging purposes
Serial.begin(115200);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
// Print ESP32 Local IP Address
Serial.println(WiFi.localIP());
// Route for root / web page
server.on("/", HTTP_GET, [ ](AsyncWebServerRequest *request) {
request->send(200, "text/html", index_html, processor);
});
server.on("/temperature", HTTP_GET, [ ](AsyncWebServerRequest *request) {
request->send(200, "text/plain", readDHTTemperature().c_str());
});
server.on("/humidity", HTTP_GET, [ ](AsyncWebServerRequest *request) {
request->send(200, "text/plain", readDHTHumidity().c_str());
});
// Start server
server.begin();
}
void loop()
{
}

View File

@ -0,0 +1,33 @@
#ifndef MAIN_H
#define MAIN_H
#include <cstdint>
#include "dht.h"
class DHT {
public:
DHT(gpio_num_t gpio, dht_sensor_type_t type) :
gpio_(gpio), type_(type) { }
~DHT() = default;
/**
* Read temperature from DHT sensor
*
* @param f True to return in Fahrenheit, False for Celsius.
*/
float readTemperature(bool f = true);
/**
* Read humidity from DHT sensor.
*/
float readHumidity();
private:
gpio_num_t gpio_;
dht_sensor_type_t type_;
};
#endif // MAIN_H

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More