Compare commits

...

49 Commits

Author SHA1 Message Date
014e39e5ef Merge pull request 'a working gtk4 demo with cmake' (#30) from builder-demo into master
Reviewed-on: #30
2024-11-11 21:51:55 -05:00
oDinZu WenKi
ce58668f22 a working gtk4 demo with cmake 2024-11-11 18:47:16 -08:00
f1ac5817f8 Merge pull request 'Add development documentation and update Cambalache version' (#29) from drogonCMS-cmake into master
Reviewed-on: #29
2024-11-11 19:25:37 -05:00
oDinZu WenKi
8273ba0217 Add development documentation and update Cambalache version 2024-11-11 16:15:29 -08:00
384a175659 Merge pull request 'drogonCMS-cmake' (#28) from drogonCMS-cmake into master
Reviewed-on: #28
2024-02-25 22:14:15 -05:00
oDinZu WenKi
65da95ffa0 update README 2024-02-24 23:07:32 -05:00
oDinZu WenKi
b7690af06e update dev requirements 2024-02-23 19:56:36 -05:00
48a7c3fbb3 Merge pull request 'drogonCMS-cmake' (#27) from drogonCMS-cmake into master
Reviewed-on: #27
2024-02-23 18:46:28 -05:00
oDinZu WenKi
43c9cbb39b integrate sqlite and postgresql conditional 2024-02-23 18:42:13 -05:00
oDinZu WenKi
6227ab9bc3 update .gitignore 2024-02-23 15:05:20 -05:00
oDinZu WenKi
cae339e982 prepping CPM 2024-02-23 14:37:42 -05:00
c3e65babe6 Merge pull request 'fixes and external packages demo' (#26) from drogonCMS-cmake into master
Reviewed-on: #26
2024-01-24 17:41:00 -05:00
oDinZu WenKi
f0c5df763d fixes 2024-01-24 17:40:05 -05:00
0881980d42 Merge pull request 'drogonCMS-cmake' (#25) from drogonCMS-cmake into master
Reviewed-on: #25
2024-01-24 17:37:22 -05:00
oDinZu WenKi
2e82e6b5a1 add cpm add pkg template 2024-01-24 14:06:12 -05:00
oDinZu WenKi
9584e57b90 tidy and neat cmake goes into vendors 2024-01-24 13:40:25 -05:00
ab95a14957 Merge pull request 'add cpm' (#24) from drogonCMS-cmake into master
Reviewed-on: #24
2024-01-24 00:32:43 -05:00
oDinZu WenKi
24fe6569d9 add cpm 2024-01-24 00:32:15 -05:00
b2cd158c1c Merge pull request 'update readme with cpm feature' (#23) from drogonCMS-cmake into master
Reviewed-on: #23
2024-01-23 23:15:39 -05:00
oDinZu WenKi
6ade0faebb update readme with cpm feature 2024-01-23 23:15:06 -05:00
94361da4bc Merge pull request 'adding CPM' (#22) from drogonCMS-cmake into master
Reviewed-on: #22
2024-01-23 23:13:08 -05:00
oDinZu WenKi
11deec3ea5 add CPM for C 2024-01-23 23:11:11 -05:00
oDinZu WenKi
a5c4ebb65b add CPM for C 2024-01-23 23:00:57 -05:00
223c21198b Merge pull request 'update ui's' (#21) from drogonCMS-cmake into master
Reviewed-on: #21
2024-01-23 22:05:02 -05:00
oDinZu WenKi
092b56b16f update ui's 2024-01-23 22:03:58 -05:00
1614b6332c Merge pull request 'drogonCMS-cmake' (#20) from drogonCMS-cmake into master
Reviewed-on: #20
2024-01-23 01:37:00 -05:00
oDinZu WenKi
1f7f6a569c wheww more cleaning 2024-01-23 01:35:57 -05:00
oDinZu WenKi
002ffe3b0f more clean-up 2024-01-23 01:32:30 -05:00
oDinZu WenKi
04444a75ab clean up 2024-01-23 01:19:36 -05:00
fdb3df1b32 Merge pull request 'prettify readme' (#19) from drogonCMS-cmake into master
Reviewed-on: #19
2024-01-22 19:00:47 -05:00
oDinZu WenKi
f44cc9b9bf prettify readme 2024-01-22 19:00:21 -05:00
4ca10f27a0 Merge pull request 'typos' (#18) from drogonCMS-cmake into master
Reviewed-on: #18
2024-01-22 16:43:23 -05:00
0526e75a31 Merge pull request 'drogonCMS-cmake' (#17) from drogonCMS-cmake into master
Reviewed-on: #17
2024-01-22 15:47:22 -05:00
4e95142715 Merge pull request 'add 4 thread config for speedy server' (#16) from drogonCMS-cmake into master
Reviewed-on: #16
2024-01-22 15:16:13 -05:00
d3940036a2 Merge pull request 'drogonCMS-cmake' (#15) from drogonCMS-cmake into master
Reviewed-on: #15
2024-01-22 14:47:03 -05:00
5fd2fd89e3 Merge pull request 'add json api test server' (#14) from drogonCMS-cmake into master
Reviewed-on: #14
2024-01-22 00:24:30 -05:00
4f8b500ce8 Merge pull request 'fix typos' (#13) from drogonCMS-cmake into master
Reviewed-on: #13
2024-01-21 23:12:44 -05:00
2385a4e878 Merge pull request 'add web socket benchmark tests' (#12) from drogonCMS-cmake into master
Reviewed-on: #12
2024-01-21 22:36:41 -05:00
f75efeb0af Merge pull request 'fix typos' (#11) from drogonCMS-cmake into master
Reviewed-on: #11
2024-01-21 20:30:37 -05:00
b8adcfdc30 Merge pull request 'fix typos' (#10) from drogonCMS-cmake into master
Reviewed-on: #10
2024-01-21 20:24:35 -05:00
6518f7c9c6 Merge pull request 'web socket example test' (#9) from drogonCMS-cmake into master
Reviewed-on: #9
2024-01-21 18:41:05 -05:00
f7c389e6d5 Merge pull request 'add community plugins' (#8) from drogonCMS-cmake into master
Reviewed-on: #8
2024-01-21 14:02:35 -05:00
31af62a55d Merge pull request 'add drogon to libraries' (#7) from drogonCMS-cmake into master
Reviewed-on: #7
2024-01-19 00:43:16 -05:00
0698556a7e Merge pull request 'LLC' (#6) from drogonCMS-cmake into master
Reviewed-on: #6
2024-01-18 22:12:58 -05:00
ee4872a1fa Merge pull request 'tidbits' (#5) from drogonCMS-cmake into master
Reviewed-on: #5
2024-01-18 19:47:34 -05:00
125a6ebf8e Merge pull request 'rearrange dev docs' (#4) from drogonCMS-cmake into master
Reviewed-on: #4
2024-01-18 19:30:46 -05:00
b75a1f867e Merge pull request 'add benchmarks draft' (#3) from drogonCMS-cmake into master
Reviewed-on: #3
2024-01-18 19:29:08 -05:00
701349a115 Merge pull request 'add features draft' (#2) from drogonCMS-cmake into master
Reviewed-on: #2
2024-01-18 19:24:00 -05:00
022bcc2af8 Merge pull request 'drogonCMS-cmake into main branch that replaces make plus other things' (#1) from drogonCMS-cmake into master
Reviewed-on: #1
2024-01-18 19:01:07 -05:00
35 changed files with 1881 additions and 1203 deletions

10
.gitignore vendored
View File

@ -47,6 +47,10 @@ vendors/drogon/exports/
vendors/drogon/trantor/Doxyfile.doc_trantor vendors/drogon/trantor/Doxyfile.doc_trantor
vendors/drogon/trantor/TrantorConfigVersion.cmake vendors/drogon/trantor/TrantorConfigVersion.cmake
vendors/drogon/trantor/exports/ vendors/drogon/trantor/exports/
vendors/database/
postgresql-prefix/
CPM_modules/
_deps/
# https://www.gnu.org/software/libtool/ # https://www.gnu.org/software/libtool/
@ -68,9 +72,9 @@ m4/lt~obsolete.m4
/drogon_dashboard /drogon_dashboard
/DrogonCMS /DrogonCMS
vendors/local-api-server/local-drogon-api-server vendors/api-server/DrogonCMS_API_Server
vendors/local-api-server/test/local-server_test vendors/api-server/test/local-server_test
vendors/simple-reverse-proxy/simple_reverse_proxy vendors/simple-reverse-proxy/DrogonCMS_Reverse_Proxy
# Generated Makefile # Generated Makefile
# (meta build system like autotools, # (meta build system like autotools,

View File

@ -27,17 +27,26 @@
# and oldest tested versions of CMake. This will ensure # and oldest tested versions of CMake. This will ensure
# you pick up the best policies. # you pick up the best policies.
cmake_minimum_required(VERSION 3.1...3.28) cmake_minimum_required(VERSION 3.1...3.28)
file(GLOB_RECURSE SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.c")
# If you set any CMAKE_ variables, that can go here. # If you set any CMAKE_ variables, that can go here.
# (But usually don't do this, except maybe for C++ standard) # (But usually don't do this, except maybe for C++ standard)
set(CMAKE_PROJECT_DESCRIPTION "A GTK Drogon CMS") set(CMAKE_PROJECT_DESCRIPTION "A GTK Drogon CMS")
set(CMAKE_PROJECT_HOMEPAGE_URL "https://github.com/odinzu/drogoncms") set(CMAKE_PROJECT_HOMEPAGE_URL "https://github.com/odinzu/drogoncms")
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/vendors/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
# add CPM Deps. for C
# Note: only packages that have a CMakeLists.txt..
include(vendors/cmake/CPM_0.38.7.cmake)
#CPMAddPackage("gh:postgres/postgres#7.1.3")
#CPMAddPackage("gh:nlohmann/json@3.10.5")
# This is your project statement. You should always list languages; # This is your project statement. You should always list languages;
# Listing the version is nice here since it sets lots of useful variables # Listing the version is nice here since it sets lots of useful variables
# we removed LANGUAGES C from project to allow for automatic compiler/linker checks; we will use C and C++ libraries for this project. # we removed LANGUAGES C from project to allow for automatic compiler/linker checks; we will use C and C++ libraries for this project.
@ -46,6 +55,9 @@ project(
VERSION 1.0.0 VERSION 1.0.0
) )
# Adding something we can run - Output name matches target name
add_executable(DrogonCMS ${SOURCES})
#=============================================================================== #===============================================================================
# Setting compilation flags for various compilers and build types: # Setting compilation flags for various compilers and build types:
#=============================================================================== #===============================================================================
@ -81,6 +93,22 @@ set(WARNING_LEVELS_GCC_DEBUG
# Default build type is release # Default build type is release
# Uncomment this to debug or use "cmake -D CMAKE_BUILD_TYPE=debug .." # Uncomment this to debug or use "cmake -D CMAKE_BUILD_TYPE=debug .."
#=============================================================================== #===============================================================================
# External projects go here i.e. a project that isn't using cmake build
#include(ExternalProject)
#ExternalProject_Add(PostgreSQL
# GIT_REPOSITORY https://github.com/postgres/postgres.git
# GIT_TAG REL_16_1
# SOURCE_DIR ${CMAKE_SOURCE_DIR}/vendors/database/
# CONFIGURE_COMMAND ./configure
# CMAKE_ARGS ""
# INSTALL_COMMAND ""
# BUILD_IN_SOURCE 1
# BUILD_COMMAND $(MAKE) MAKELEVEL=0
# LOG_CONFIGURE 1
# LOG_BUILD 1
# LOG_INSTALL 1
#)
# set(CMAKE_BUILD_TYPE debug) # set(CMAKE_BUILD_TYPE debug)
if(NOT CMAKE_BUILD_TYPE) if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug CACHE STRING set(CMAKE_BUILD_TYPE Debug CACHE STRING
@ -88,35 +116,47 @@ if(NOT CMAKE_BUILD_TYPE)
FORCE) FORCE)
endif() endif()
# Find packages go here. # Find PkgConfig.
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK4 REQUIRED gtk4>=4.0) pkg_check_modules(GTK4 REQUIRED gtk4>=4.0)
message("GTK4 include dir: ${GTK4_INCLUDE_DIRS}") message("GTK4 include dir: ${GTK4_INCLUDE_DIRS}")
message("GTK4 libraries: ${GTK4_LIBRARY_DIRS}") message("GTK4 libraries: ${GTK4_LIBRARY_DIRS}")
message("GTK4 Other CFlags: ${GTK4_CFLAGS_OTHER}") message("GTK4 other Cflags: ${GTK4_CFLAGS_OTHER}")
pkg_check_modules(ADW REQUIRED libadwaita-1>=1.3.5) pkg_check_modules(ADW REQUIRED libadwaita-1>=1.3.5)
message("ADW include dir: ${ADW_INCLUDE_DIRS}") message("ADW include dir: ${ADW_INCLUDE_DIRS}")
message("ADW libraries: ${ADW_LIBRARY_DIRS}") message("ADW libraries: ${ADW_LIBRARY_DIRS}")
message("ADW Other CFlags: ${ADW_CFLAGS_OTHER}") message("ADW other Cflags: ${ADW_CFLAGS_OTHER}")
#pkg_check_modules(SSL REQUIRED openssl>=3.1.2) #pkg_check_modules(SSL REQUIRED openssl>=3.1.2)
#message("SSL libraries: ${SSL_LIBRARY_DIRS}") #message("SSL libraries: ${SSL_LIBRARY_DIRS}")
#pkg_check_modules(SSL REQUIRED zlib>=1.3) #pkg_check_modules(SSL REQUIRED zlib>=1.3)
# Make use of PostgreSQL if FOUND, else use SQLite3
find_package (PostgreSQL)
if (PostgreSQL_FOUND)
message("POSTGRESQL include dir: ${PostgreSQL_INCLUDE_DIRS}")
message("POSTGRESQL libraries: ${PostgreSQL_LIBRARIES}")
include_directories(${PostgreSQL_INCLUDE_DIRS} ${PostgreSQL_SERVER_INCLUDE_DIRS})
target_link_libraries (${PROJECT_NAME} PUBLIC ${PostgreSQL_LIBRARIES})
#pkg_check_modules(SQLite3 REQUIRED sqlite3>=3.43.1)
elseif (SQLITE3_FOUND)
find_package (SQLite3)
message("SQLITE3 include dir: ${SQLITE3_INCLUDE_DIRS}")
message("SQLITE3 libraries: ${SQLITE3_LIBRARIES}")
include_directories(${SQLITE3_INCLUDE_DIRS})
target_link_libraries (${PROJECT_NAME} PUBLIC ${SQLITE3_LIBRARIES})
endif (PostgreSQL_FOUND)
# Setup CMake to use GTK+, tell the compiler where to look for headers # Setup CMake to use GTK+, tell the compiler where to look for headers
# and to the linker where to look for libraries # and to the linker where to look for libraries
include_directories(${GTK4_INCLUDE_DIRS} ${ADW_INCLUDE_DIRS}) include_directories(${GTK4_INCLUDE_DIRS} ${ADW_INCLUDE_DIRS})
link_directories(${GTK4_LIBRARY_DIRS} ${ADW_LIBRARY_DIRS}) link_directories(${GTK4_LIBRARY_DIRS} ${ADW_LIBRARY_DIRS})
add_definitions(${GTK4_CFLAGS_OTHER} ${ADW_CFLAGS_OTHER}) add_definitions(${GTK4_CFLAGS_OTHER} ${ADW_CFLAGS_OTHER})
# Adding something we can run - Output name matches target name # Include vendor source code locally/manually
add_executable(DrogonCMS src/base.c) add_subdirectory(vendors/api-server/)
# Include drogon source code locally
add_subdirectory(vendors/local-api-server/)
add_subdirectory(vendors/simple-reverse-proxy/) add_subdirectory(vendors/simple-reverse-proxy/)
# This is a "default" library, and will match the *** variable setting. # This is a "default" library, and will match the *** variable setting.
@ -129,16 +169,11 @@ add_subdirectory(vendors/simple-reverse-proxy/)
# Make sure you link your targets with this command. It can also link libraries and # Make sure you link your targets with this command. It can also link libraries and
# even flags, so linking a target that does not exist will not give a configure-time error. # even flags, so linking a target that does not exist will not give a configure-time error.
target_include_directories(${PROJECT_NAME} PUBLIC ${GTK4_LIBRARIES} ${ADW_LIBRARIES}) target_include_directories(${PROJECT_NAME} PUBLIC ${GTK4_LIBRARIES} ${ADW_LIBRARIES})
target_link_libraries(${PROJECT_NAME} PRIVATE ${GTK4_LIBRARIES} ${ADW_LIBRARIES} drogon) target_link_libraries(${PROJECT_NAME} PRIVATE ${GTK4_LIBRARIES} ${ADW_LIBRARIES})
# Target Compile Options # Target Compile Options
target_compile_options(${PROJECT_NAME} PRIVATE ${WARNING_LEVELS_GCC} $<$<CONFIG:DEBUG>:${WARNING_LEVELS_GCC_DEBUG}>) target_compile_options(${PROJECT_NAME} PRIVATE ${WARNING_LEVELS_GCC} $<$<CONFIG:DEBUG>:${WARNING_LEVELS_GCC_DEBUG}>)
# This part is so the Modern CMake book can verify this example builds. For your code,
# you'll probably want tests too
enable_testing()
#add_test(NAME MyExample COMMAND MyExample)
#=============================================================================== #===============================================================================
# Package generation: # Package generation:
#=============================================================================== #===============================================================================

89
DEV_README.md Normal file
View File

@ -0,0 +1,89 @@
# DEVELOPER JOURNAL
# V1.0.0
# The Design Flow/Pattern of the GTK4/C Application
# Cambalche Update, Configure & Meson Install Instructions:
So, instructions that worked for me on Arch Linux if you want to manually build/install Cambalache v0.93.
0. `git clone https://gitlab.gnome.org/jpu/cambalache.git && cd cambalache`
1. `meson setup --wipe --prefix=~/.local _build .`
2. `ninja -C _build install`
3. Update `~/.bashrc paths`
```
# Add paths for Cambalache app
export PYTHONPATH=~/.local/lib/python3.12/site-packages/
export GI_TYPELIB_PATH=~/.local/lib/girepository-1.0/
export LD_LIBRARY_PATH=~/.local/lib/
```
4. *Optional* Add `~/.local/bin` to $PATH via `~/.bashrc` profile directly
```
# Then, export and append .local/bin PATH to PATHS for launching Cambalache application
export PATH=/home/username/.local/bin:$PATH
EXIT and SAVE the .bashrc file
```
4a. In the terminal/CLI, refresh .bashrc profile
`source ~/.bashrc`
4b. Launch Cambalache via terminal (CLI)
`cambalache`
Note 1: You also may need to copy libs over from local `./_build/cambalache/private` directory to `/home/username/.local/lib`.
### The specific files I copied
* CambalachePrivate-3.0.gir
* CambalachePrivate-3.0.typelib
* CambalachePrivate-4.0.gir
* CambalachePrivate-4.0.typelib
* libcambalacheprivate-3.so.p (DIR)
* libcambalacheprivate-4.so.p (DIR)
# Steps to Build *DrogonCMS* from Source Code
0. Clone the repository `git clone https://git.sharpetronics.com/sharpetronics/DrogonCMS` and `cd DrogonCMS/`
1. *optional* checkout correct branch e.g. `git checkout drogonCMS-cmake`
2. Run `cmake -D CMAKE_BUILD_TYPE=Release .`
3. Then, to build the executable, we do `cmake --build .`
4. Run the app with `./DrogonCMS`
## Developer Requirements
*Drogon* framework compile/build dependencies.
* Drogon >= 1.9.1 https://github.com/drogonframework/drogon/wiki/ENG-02-Installation#System-Preparation-Examples
## Developer Recommendations
A GTK4 editor is a recommended tool for this project; all UI's and project files **.cmb** are stored in `./src/ui/`.
* Cambalache >= 0.93 https://gitlab.gnome.org/jpu/cambalache
An optional recommendation is Geany IDE.
* Geany IDE https://www.geany.org/
## IDE build commands via Geany `Build -> Set Build Commands`
### This is what my build commands look like in *Geany IDE* with **GNU Automake Tools**.
| Name | Command | Working Directory |
| ----------- | ------------------ | -------------------------------------------------------------------- |
| Configure | ../configure | /home/username/Desktop/Local-Development/cplusplus/drogon-dash/build |
| AutoReconf | autoreconf -vi | /home/username/Desktop/Local-Development/cplusplus/drogon-dash |
| Make | make | /home/username/Desktop/Local-Development/cplusplus/drogon-dash/build |
| Run | ./drogon_dashboard | /home/username/Desktop/Local-Development/cplusplus/drogon-dash/build |
| Make Bins | make dist | /home/username/Desktop/Local-Development/cplusplus/drogon-dash/build |
### This is what my build commands look like in Geany IDE with **BSD CMake Tools**.
| Name | Command | Working Directory |
| ----------- | ------------------ | -------------------------------------------------------------------- |
| Configure | cmake -D CMAKE_BUILD_TYPE=Release | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ |
| Build | cmake --build . | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS |
| Run GUI | ./DrogonCMS | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ |
| Run API | ./DrogonCMS-API-Server | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/vendors/api-server/ |
| Install | cmake --install | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ |

View File

@ -4,13 +4,16 @@ This is a Drogon Content Management System(CMS).
### License ### License
* GPL-3.0 * GPL-3.0
## Features and Strengths ## Prominent Features and Strengths
- Faster than NginX, WordPress and Strapi - Faster than NginX, WordPress and Strapi
- Built on CMake/C/C++/GTK4/Drogon - Built on CMake/C/C++/GTK4/Drogon
- Built on Freedom Software - Built on Freedom Software
- Blazing Fast Website Architecture - Lightning Fast Architecture
- Headless CMS Ready for Site Generators - Headless CMS Ready for Site Generators
- Lightweight Security with _serverless_ architecture, plus optional proxy securities and caching. - Lightweight Reverse Proxy Security
- Database Ready for SQLite3 & PostgreSQL 15
- Custom API Configurations
- C Package Manager (CPM)
- Excellent Documentation - Excellent Documentation
## Community Plugins ## Community Plugins
@ -50,7 +53,7 @@ Requests/sec: 115151.94
Transfer/sec: 78.74MB Transfer/sec: 78.74MB
``` ```
### Getting a json token with web sockets and drogon proxy on 2 IO threads. ### Getting a JSON token with web sockets and Drogon proxy on 2 IO threads.
``` ```
wrk -c200 -d5 -t2 ws://localhost:8088/get-token wrk -c200 -d5 -t2 ws://localhost:8088/get-token
Running 5s test @ ws://localhost:8088/get-token Running 5s test @ ws://localhost:8088/get-token
@ -67,20 +70,21 @@ Transfer/sec: 21.24MB
### Developer Dependency Requirements ### Developer Dependency Requirements
* GCC (GNU C/C++ Compiler) >= 13.2.1 * GCC (GNU C/C++ Compiler) >= 13.2.1
* PostgreSQL >= 15.1(*Priority*) or SQLite3(*Default*) >= 3.43.1 [SEE 3RD PARTY SITE DEPENDENCIES]
* CMake >= 3.28 * CMake >= 3.28
* Drogon >= 1.9.1 [SEE REQUIREMENTS] * Drogon >= 1.9.1 [SEE 3RD PARTY SITE DEPENDENCIES]
* Pkg-Config >= 1.8.1 * Pkg-Config >= 1.8.1
* Gtk4 >= 4.0 * Gtk4 >= 4.0
* Adwaita >= 1.3.5 * Adwaita >= 1.3.5
* OpenSSL >= 3.1.2 * OpenSSL >= 3.1.2
* *Optional* PostgreSQL Database(*Default*) >= 2.39 * *Optional* Cambalache >= 0.93 (Gtk4 Editor) [SEE 3RD PARTY SITE DEPENDENCIES]
* *Optional* Cambalache >= 0.14 (Gtk4 Editor) [SEE REQUIREMENTS]
* *Optional* Geany IDE >= 1.38 * *Optional* Geany IDE >= 1.38
* CLI Experience * CLI Experience
* Git/Github Experience
*Note: This has been built and tested on Arch Linux* *Note: This has been built and tested on Arch Linux*
### Steps to Build DrogonCMS from Source Code ### Steps to Build *DrogonCMS* from Source Code
0. Clone the repository `git clone https://git.sharpetronics.com/sharpetronics/DrogonCMS` and `cd DrogonCMS/` 0. Clone the repository `git clone https://git.sharpetronics.com/sharpetronics/DrogonCMS` and `cd DrogonCMS/`
1. *optional* checkout correct branch e.g. `git checkout drogonCMS-cmake` 1. *optional* checkout correct branch e.g. `git checkout drogonCMS-cmake`
@ -90,20 +94,20 @@ Transfer/sec: 21.24MB
### Requirements ### Requirements
Drogon framework compile/build dependencies. *Drogon* framework compile/build dependencies.
* Drogon >= 1.9.1 https://github.com/drogonframework/drogon/wiki/ENG-02-Installation#System-Preparation-Examples * Drogon >= 1.9.1 https://github.com/drogonframework/drogon/wiki/ENG-02-Installation#System-Preparation-Examples
### Recommendations ### Recommendations
A GTK4 editor is a recommended tool for this project; all UI's and project files **.cmb** are stored in `./src/ui/`. A GTK4 editor is a recommended tool for this project; all UI's and project files **.cmb** are stored in `./src/ui/`.
* Cambalache >= 0.14 https://gitlab.gnome.org/jpu/cambalache * Cambalache >= 0.93 https://gitlab.gnome.org/jpu/cambalache
An optional recommendation is Geany IDE. An optional recommendation is Geany IDE.
* Geany IDE https://www.geany.org/ * Geany IDE https://www.geany.org/
### IDE build commands via Geany `Build -> Set Build Commands` ### IDE build commands via Geany `Build -> Set Build Commands`
#### This is what my build commands look like in Geany IDE with **GNU Automake Tools**. #### This is what my build commands look like in *Geany IDE* with **GNU Automake Tools**.
| Name | Command | Working Directory | | Name | Command | Working Directory |
| ----------- | ------------------ | -------------------------------------------------------------------- | | ----------- | ------------------ | -------------------------------------------------------------------- |
@ -120,7 +124,7 @@ An optional recommendation is Geany IDE.
| Configure | cmake -D CMAKE_BUILD_TYPE=Release | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ | | Configure | cmake -D CMAKE_BUILD_TYPE=Release | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ |
| Build | cmake --build . | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS | | Build | cmake --build . | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS |
| Run GUI | ./DrogonCMS | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ | | Run GUI | ./DrogonCMS | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ |
| Run API | ./local-drogon-server-api | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/vendors/drogon/local-api-server/ | | Run API | ./DrogonCMS-API-Server | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/vendors/api-server/ |
| Install | cmake --install | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ | | Install | cmake --install | /home/username/Desktop/Local-Development/cplusplus/DrogonCMS/ |
## Authors ## Authors
@ -143,6 +147,7 @@ oDinZu WenKi(Charles) https://liberapay.com/oDinZu/
* Cambalache https://gitlab.gnome.org/jpu/cambalache * Cambalache https://gitlab.gnome.org/jpu/cambalache
* C References https://en.cppreference.com/w/c * C References https://en.cppreference.com/w/c
* CMake Documentation https://cmake.org/cmake/help/book/mastering-cmake/index.html * CMake Documentation https://cmake.org/cmake/help/book/mastering-cmake/index.html
* CPM Make Github https://github.com/cpm-cmake/CPM.cmake#snippets
* Drogon Web Server https://github.com/drogonframework/drogon * Drogon Web Server https://github.com/drogonframework/drogon
* Geany IDE https://www.geany.org/ * Geany IDE https://www.geany.org/
* Gio Documentation https://docs.gtk.org/gio/index.html * Gio Documentation https://docs.gtk.org/gio/index.html
@ -150,5 +155,7 @@ oDinZu WenKi(Charles) https://liberapay.com/oDinZu/
* GObject Documentation https://docs.gtk.org/gobject/index.html * GObject Documentation https://docs.gtk.org/gobject/index.html
* GTK 4 Demos https://gitlab.gnome.org/GNOME/gtk/-/tree/main/demos * GTK 4 Demos https://gitlab.gnome.org/GNOME/gtk/-/tree/main/demos
* GTK 4 Documentation https://docs.gtk.org/gtk4/ * GTK 4 Documentation https://docs.gtk.org/gtk4/
* PostgreSQL 15 Documentation https://www.postgresql.org/docs/15/index.html
* SQLite3 Documentation https://www.sqlite.org/capi3ref.html
*Notice: We focus implementation with the C programming language and only add various features of C ++ code.* *Notice: We focus implementation with the C programming language and only add various features of C ++ code.*

3
cpm-package-lock.cmake Normal file
View File

@ -0,0 +1,3 @@
# CPM Package Lock
# This file should be committed to version control

View File

@ -10,7 +10,6 @@
# License: GPL-3.0 # License: GPL-3.0
# Version: 0.0.1 # Version: 0.0.1
# This is Free Software released under GPL-3.0. Any misuse of this software # This is Free Software released under GPL-3.0. Any misuse of this software
# will be followed up with GPL enforcement via Software Freedom Law Center: # will be followed up with GPL enforcement via Software Freedom Law Center:
# https://www.softwarefreedom.org/ # https://www.softwarefreedom.org/
@ -32,80 +31,185 @@
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <stdio.h>
/*#include <drogon/drogon.h>*/
/*
Static Variables
*/
static GtkWidget *p_input;
static GtkWidget *p_input_confirm;
static GtkWidget *register_button;
/*
Functions
*/
/* Compare password entries for admin registration confirmation */
static void static void
update_register_button(GObject *object, quit_activate (GSimpleAction *action,
GParamSpec *pspec, GVariant *parameter,
gpointer data) gpointer user_data)
{ {
const char *text = gtk_editable_get_text(GTK_EDITABLE(p_input)); GtkWidget *window = user_data;
const char *text2 = gtk_editable_get_text(GTK_EDITABLE(p_input_confirm));
//PLACEHOLDER Thish widget set needs to work with GtkBuilder. gtk_window_destroy (GTK_WINDOW (window));
//This can be done easily but may need a condiontal statement.
//Another issue is to use the gtkbuilder, I would have to duplicate code here or learn how to arrange each iteration in a module or easy to use function.
//gtk_widget_set_sensitive (register_button,
//text[0] != '\0' && g_str_equal (text, text2));
}
/* Launch the application from activate */
static void
activate(GtkApplication *app,
gpointer user_data)
{
/* Construct a GtkBuilder instance */
GtkBuilder *builder = gtk_builder_new();
/* Loads the UI objects */
gtk_builder_add_from_file(builder, "src/ui/admin-register.ui", NULL);
/* Register the ID's of gtk_object from admin-register.ui */
GObject *window = gtk_builder_get_object(builder, "register_window");
p_input = gtk_builder_get_object(builder, "p_input");
GObject *p_input_confirm = gtk_builder_get_object(builder, "p_input_confirm");
GObject *register_button = gtk_builder_get_object(builder, "register_button");
/* Connect the actions of XML UI objects's with Gtk Signals */
/* In Gtk_builder, we edit the specific widget; Gtk_builder contains all widgets created from Cambalache UI's */
/* Connect input text with update_button compariative function */
g_signal_connect(p_input, "notify::text", G_CALLBACK(update_register_button), NULL);
g_signal_connect(p_input_confirm, "notify::text", G_CALLBACK(update_register_button), NULL);
/* Sets the app window with *app GtkApplication */
gtk_window_set_application(GTK_WINDOW(window), app);
/* Display the Gtk GUI */
gtk_widget_set_visible(window, TRUE);
/*
* Adds a weak reference from weak_pointer object to indicate that the
* pointer located at weak_pointer_location is only valid during the lifetime of object.
* When the object is finalized, weak_pointer will be set to NULL.
*/
g_object_add_weak_pointer(G_OBJECT (window), (gpointer *)&window);
/* Dereference and free the computer memory */
g_object_unref(builder);
} }
static void
about_activate (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GtkWidget *window = user_data;
GtkWidget *about_dlg;
about_dlg = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "about"));
gtk_window_present (GTK_WINDOW (about_dlg));
}
static void
remove_timeout (gpointer data)
{
guint id = GPOINTER_TO_UINT (data);
g_source_remove (id);
}
static int
pop_message (gpointer data)
{
GtkWidget *status = data;
gtk_label_set_label (GTK_LABEL (status), "");
g_object_set_data (G_OBJECT (status), "timeout", GUINT_TO_POINTER (0));
return G_SOURCE_REMOVE;
}
static void
status_message (GtkWidget *status,
const char *text)
{
guint id;
id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (status), "timeout"));
if (id)
g_source_remove (id);
gtk_label_set_text (GTK_LABEL (status), text);
id = g_timeout_add (5000, pop_message, status);
g_object_set_data_full (G_OBJECT (status), "timeout", GUINT_TO_POINTER (id), remove_timeout);
}
static void
help_activate (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GtkWidget *status;
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (status, "Help not available");
}
static void
not_implemented (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
GtkWidget *status;
char *text;
text = g_strdup_printf ("Action “%s” not implemented", g_action_get_name (G_ACTION (action)));
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (status, text);
g_free (text);
}
static GActionEntry win_entries[] = {
{ "new", not_implemented, NULL, NULL, NULL },
{ "open", not_implemented, NULL, NULL, NULL },
{ "save", not_implemented, NULL, NULL, NULL },
{ "save-as", not_implemented, NULL, NULL, NULL },
{ "copy", not_implemented, NULL, NULL, NULL },
{ "cut", not_implemented, NULL, NULL, NULL },
{ "paste", not_implemented, NULL, NULL, NULL },
{ "quit", quit_activate, NULL, NULL, NULL },
{ "about", about_activate, NULL, NULL, NULL },
{ "help", help_activate, NULL, NULL, NULL }
};
static void
activate(GtkApplication *app)
{
static GtkWidget *window = NULL;
GActionGroup *actions;
if (!window)
{
GtkWidget *about;
GtkWidget *status;
GtkEventController *controller;
/* Construct a GtkBuilder instance */
GtkBuilder *builder = gtk_builder_new();
/* Loads the UI objects */
gtk_builder_add_from_file(builder, "src/ui/admin-register.ui", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
gtk_window_set_application (GTK_WINDOW (window),app);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
actions = (GActionGroup*)g_simple_action_group_new ();
g_action_map_add_action_entries (G_ACTION_MAP (actions),
win_entries, G_N_ELEMENTS (win_entries),
window);
gtk_widget_insert_action_group (window, "win", actions);
controller = gtk_shortcut_controller_new ();
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller),
GTK_SHORTCUT_SCOPE_GLOBAL);
gtk_widget_add_controller (window, controller);
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_n, GDK_CONTROL_MASK),
gtk_named_action_new ("win.new")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_o, GDK_CONTROL_MASK),
gtk_named_action_new ("win.open")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_s, GDK_CONTROL_MASK),
gtk_named_action_new ("win.save")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_s, GDK_CONTROL_MASK|GDK_SHIFT_MASK),
gtk_named_action_new ("win.save-as")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_q, GDK_CONTROL_MASK),
gtk_named_action_new ("win.quit")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_c, GDK_CONTROL_MASK),
gtk_named_action_new ("win.copy")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_x, GDK_CONTROL_MASK),
gtk_named_action_new ("win.cut")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_v, GDK_CONTROL_MASK),
gtk_named_action_new ("win.paste")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_F1, 0),
gtk_named_action_new ("win.help")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_F7, 0),
gtk_named_action_new ("win.about")));
about = GTK_WIDGET (gtk_builder_get_object (builder, "aboutdialog1"));
gtk_window_set_transient_for (GTK_WINDOW (about), GTK_WINDOW (window));
gtk_window_set_hide_on_close (GTK_WINDOW (about), TRUE);
g_object_set_data_full (G_OBJECT (window), "about",
about, (GDestroyNotify)gtk_window_destroy);
status = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar1"));
g_object_set_data (G_OBJECT (window), "status", status);
g_object_unref (builder);
}
if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE);
else
gtk_window_destroy (GTK_WINDOW (window));
}
/* /*
Main program begins here Main program begins here

View File

@ -1,63 +0,0 @@
#include <gtk/gtk.h>
#include "drogondashboardapplication.h"
#include "drogondashboardwindow.h"
struct _DrogonDashboardApp
{
GtkApplication parent;
};
G_DEFINE_TYPE(DrogonDashboardApp, drogondashboard_app, GTK_TYPE_APPLICATION);
static void
drogondashboard_app_init (DrogonDashboardApp *app)
{
}
static void
drogondashboard_app_activate (GApplication *app)
{
DrogonDashboardAppWindow *win;
win = drogondashboard_app_window_new (DROGONDASHBOARD_APP (app));
gtk_window_present (GTK_WINDOW (win));
}
static void
drogondashboard_app_open (GApplication *app,
GFile **files,
int n_files,
const char *hint)
{
GList *windows;
DrogonDashboardAppWindow *win;
int i;
windows = gtk_application_get_windows (GTK_APPLICATION (app));
if (windows)
win = DROGONDASHBOARD_APP_WINDOW (windows->data);
else
win = drogondashboard_app_window_new (DROGONDASHBOARD_APP (app));
for (i = 0; i < n_files; i++)
drogondashboard_app_window_open (win, files[i]);
gtk_window_present (GTK_WINDOW (win));
}
static void
drogondashboard_app_class_init (DrogonDashboardAppClass *class)
{
G_APPLICATION_CLASS (class)->activate = drogondashboard_app_activate;
G_APPLICATION_CLASS (class)->open = drogondashboard_app_open;
}
DrogonDashboardApp *
drogondashboard_app_new (void)
{
return g_object_new (DROGONDASHBOARD_APP_TYPE,
"application-id", "org.gtk.exampleapp",
"flags", G_APPLICATION_HANDLES_OPEN,
NULL);
}

View File

@ -1,13 +0,0 @@
#ifndef __DROGONDASHBOARDAPP_H
#define __DROGONDASHBOARDAPP_H
#include <gtk/gtk.h>
#define DROGONDASHBOARD_APP_TYPE (drogondashboard_app_get_type ())
G_DECLARE_FINAL_TYPE (DrogonDashboardApp, drogondashboard_app, DROGONDASHBOARD, APP, GtkApplication)
DrogonDashboardApp *drogondashboard_app_new (void);
#endif /* __DROGONDASHBOARDAPP_H */

View File

@ -1,46 +0,0 @@
#include <gtk/gtk.h>
#include "drogondashboardapplication.h"
#include "drogondashboardwindow.h"
struct _DrogonDashboardAppWindow
{
GtkApplicationWindow parent;
//GtkWidget *stack;
};
G_DEFINE_TYPE(DrogonDashboardAppWindow, drogondashboard_app_window, GTK_TYPE_APPLICATION_WINDOW);
static void
drogondashboard_app_window_init (DrogonDashboardAppWindow *win)
{
GtkBuilder *builder;
GtkWidget *window;
gtk_widget_init_template (GTK_WIDGET (win));
builder = gtk_builder_new_from_file("../src/ui/admin-register.ui");
//menu = G_MENU_MODEL (gtk_builder_get_object (builder, "menu"));
window = GTK_WIDGET(gtk_builder_get_object(builder, "registerWindow"));
//gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (win->gears), menu);
g_object_unref (builder);
}
static void
drogondashboard_app_window_class_init (DrogonDashboardAppWindowClass *class)
{
}
DrogonDashboardAppWindow *
drogondashboard_app_window_new (DrogonDashboardApp *app)
{
return g_object_new (DROGONDASHBOARD_APP_WINDOW_TYPE, "application", app, NULL);
}
void
drogondashboard_app_window_open (DrogonDashboardAppWindow *win,
GFile *file)
{
}

View File

@ -1,17 +0,0 @@
#ifndef __DROGONDASHBOARDAPPWIN_H
#define __DROGONDASHBOARDAPPWIN_H
#include <gtk/gtk.h>
#include "drogondashboardapplication.h"
#define DROGONDASHBOARD_APP_WINDOW_TYPE (drogondashboard_app_window_get_type ())
G_DECLARE_FINAL_TYPE (DrogonDashboardAppWindow, drogondashboard_app_window, DROGONDASHBOARD, APP_WINDOW, GtkApplicationWindow)
DrogonDashboardAppWindow *drogondashboard_app_window_new (DrogonDashboardApp *app);
void drogondashboard_app_window_open (DrogonDashboardAppWindow *win,
GFile *file);
#endif /* __DROGONDASHBOARDAPPWIN_H */

155
src/ui/DrogonCMS.cmb Normal file
View File

@ -0,0 +1,155 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE cambalache-project SYSTEM "cambalache-project.dtd">
<cambalache-project version="0.93.0" target_tk="gtk-4.0">
<ui>
(2,None,"admin-register.ui","admin-register.ui",None,None,None,None,None,None,None)
</ui>
<object>
(2,1,"GtkListStore","liststore1",None,None,None,None,0,None,None),
(2,2,"(menu)","menubar",None,None,None,None,1,None,None),
(2,3,"(submenu)",None,2,None,None,None,0,None,None),
(2,4,"(section)",None,3,None,None,None,0,None,None),
(2,5,"(item)",None,4,None,None,None,0,None,None),
(2,6,"(item)",None,4,None,None,None,1,None,None),
(2,7,"(item)",None,4,None,None,None,2,None,None),
(2,8,"(item)",None,4,None,None,None,3,None,None),
(2,9,"(section)",None,3,None,None,None,1,None,None),
(2,10,"(item)",None,9,None,None,None,0,None,None),
(2,11,"(submenu)",None,2,None,None,None,1,None,None),
(2,12,"(section)",None,11,None,None,None,0,None,None),
(2,13,"(item)",None,12,None,None,None,0,None,None),
(2,14,"(item)",None,12,None,None,None,1,None,None),
(2,15,"(item)",None,12,None,None,None,2,None,None),
(2,16,"(submenu)",None,2,None,None,None,2,None,None),
(2,17,"(section)",None,16,None,None,None,0,None,None),
(2,18,"(item)",None,17,None,None,None,0,None,None),
(2,19,"(item)",None,17,None,None,None,1,None,None),
(2,20,"GtkAboutDialog","aboutdialog1",None,None,None,None,2,None,None),
(2,21,"GtkWindow","window1",None,None,None,None,3,None,None),
(2,22,"GtkBox","vbox1",21,None,None,None,0,None,None),
(2,23,"GtkPopoverMenuBar","menubar1",22,None,None,None,0,None,None),
(2,24,"GtkBox","toolbar1",22,None,None,None,1,None,None),
(2,25,"GtkButton",None,24,None,None,None,0,None,None),
(2,26,"GtkButton",None,24,None,None,None,1,None,None),
(2,27,"GtkButton",None,24,None,None,None,2,None,None),
(2,28,"GtkSeparator",None,24,None,None,None,3,None,None),
(2,29,"GtkButton",None,24,None,None,None,4,None,None),
(2,30,"GtkButton",None,24,None,None,None,5,None,None),
(2,31,"GtkButton",None,24,None,None,None,6,None,None),
(2,32,"GtkScrolledWindow","scrolledwindow1",22,None,None,None,2,None,None),
(2,33,"GtkTreeView","treeview1",32,None,None,None,0,None,None),
(2,34,"GtkTreeViewColumn","column1",33,None,None,None,0,None,None),
(2,35,"GtkCellRendererText","renderer1",34,None,None,None,0,None,"&lt;attributes&gt;&lt;attribute name=\"text\"&gt;0&lt;/attribute&gt;&lt;/attributes&gt;"),
(2,36,"GtkTreeViewColumn","column2",33,None,None,None,1,None,None),
(2,37,"GtkCellRendererText","renderer2",36,None,None,None,0,None,"&lt;attributes&gt;&lt;attribute name=\"text\"&gt;1&lt;/attribute&gt;&lt;/attributes&gt;"),
(2,38,"GtkTreeViewColumn","column3",33,None,None,None,2,None,None),
(2,39,"GtkCellRendererText","renderer3",38,None,None,None,0,None,"&lt;attributes&gt;&lt;attribute name=\"text\"&gt;2&lt;/attribute&gt;&lt;/attributes&gt;"),
(2,40,"GtkLabel","statusbar1",22,None,None,None,3,None,None)
</object>
<object_property>
(2,3,"(submenu)","label","_File",1,None,None,None,None,None,None,None,None),
(2,5,"(item)","action","win.new",0,None,None,None,None,None,None,None,None),
(2,5,"(item)","label","_New",1,None,None,None,None,None,None,None,None),
(2,6,"(item)","action","win.open",0,None,None,None,None,None,None,None,None),
(2,6,"(item)","label","_Open",1,None,None,None,None,None,None,None,None),
(2,7,"(item)","action","win.save",0,None,None,None,None,None,None,None,None),
(2,7,"(item)","label","_Save",1,None,None,None,None,None,None,None,None),
(2,8,"(item)","action","win.save-as",0,None,None,None,None,None,None,None,None),
(2,8,"(item)","label","Save _As",1,None,None,None,None,None,None,None,None),
(2,10,"(item)","action","win.quit",0,None,None,None,None,None,None,None,None),
(2,10,"(item)","label","_Quit",1,None,None,None,None,None,None,None,None),
(2,11,"(submenu)","label","_Edit",1,None,None,None,None,None,None,None,None),
(2,13,"(item)","action","win.copy",0,None,None,None,None,None,None,None,None),
(2,13,"(item)","label","_Copy",1,None,None,None,None,None,None,None,None),
(2,14,"(item)","action","win.cut",0,None,None,None,None,None,None,None,None),
(2,14,"(item)","label","_Cut",1,None,None,None,None,None,None,None,None),
(2,15,"(item)","action","win.paste",0,None,None,None,None,None,None,None,None),
(2,15,"(item)","label","_Paste",1,None,None,None,None,None,None,None,None),
(2,16,"(submenu)","label","_Help",1,None,None,None,None,None,None,None,None),
(2,18,"(item)","action","win.help",0,None,None,None,None,None,None,None,None),
(2,18,"(item)","label","_Help",1,None,None,None,None,None,None,None,None),
(2,19,"(item)","action","win.about",0,None,None,None,None,None,None,None,None),
(2,19,"(item)","label","_About",1,None,None,None,None,None,None,None,None),
(2,20,"GtkAboutDialog","logo-icon-name","org.gtk.Demo4",1,None,None,None,None,None,None,None,None),
(2,20,"GtkAboutDialog","program-name","Builder demo",1,None,None,None,None,None,None,None,None),
(2,20,"GtkWindow","modal","True",0,None,None,None,None,None,None,None,None),
(2,21,"GtkWindow","default-height","250",0,None,None,None,None,None,None,None,None),
(2,21,"GtkWindow","default-width","440",0,None,None,None,None,None,None,None,None),
(2,21,"GtkWindow","title","Builder",1,None,None,None,None,None,None,None,None),
(2,22,"GtkOrientable","orientation","vertical",0,None,None,None,None,None,None,None,None),
(2,23,"CmbAccessibleProperty","cmb-a11y-property-label","Main Menu",0,None,None,None,None,None,None,None,None),
(2,23,"GtkPopoverMenuBar","menu-model","2",0,None,None,None,None,None,None,None,None),
(2,24,"CmbAccessibleProperty","cmb-a11y-property-label","Toolbar",0,None,None,None,None,None,None,None,None),
(2,24,"GtkAccessible","accessible-role","toolbar",0,None,None,None,None,None,None,None,None),
(2,24,"GtkWidget","css-classes","toolbar",0,None,None,None,None,None,None,None,None),
(2,25,"GtkActionable","action-name","win.new",0,None,None,None,None,None,None,None,None),
(2,25,"GtkButton","icon-name","document-new",0,None,None,None,None,None,None,None,None),
(2,25,"GtkButton","label","New",1,None,None,None,None,None,None,None,None),
(2,25,"GtkWidget","tooltip-text","Create a new file",1,None,None,None,None,None,None,None,None),
(2,26,"GtkActionable","action-name","win.open",0,None,None,None,None,None,None,None,None),
(2,26,"GtkButton","icon-name","document-open",0,None,None,None,None,None,None,None,None),
(2,26,"GtkButton","label","Open",1,None,None,None,None,None,None,None,None),
(2,26,"GtkWidget","tooltip-text","Open a file",1,None,None,None,None,None,None,None,None),
(2,27,"GtkActionable","action-name","win.save",0,None,None,None,None,None,None,None,None),
(2,27,"GtkButton","icon-name","document-save",0,None,None,None,None,None,None,None,None),
(2,27,"GtkButton","label","Save",1,None,None,None,None,None,None,None,None),
(2,27,"GtkWidget","tooltip-text","Save a file",1,None,None,None,None,None,None,None,None),
(2,29,"GtkActionable","action-name","win.copy",0,None,None,None,None,None,None,None,None),
(2,29,"GtkButton","icon-name","edit-copy",0,None,None,None,None,None,None,None,None),
(2,29,"GtkButton","label","Copy",1,None,None,None,None,None,None,None,None),
(2,29,"GtkWidget","tooltip-text","Copy selected object into the clipboard",1,None,None,None,None,None,None,None,None),
(2,30,"GtkActionable","action-name","win.cut",0,None,None,None,None,None,None,None,None),
(2,30,"GtkButton","icon-name","edit-cut",0,None,None,None,None,None,None,None,None),
(2,30,"GtkButton","label","Cut",1,None,None,None,None,None,None,None,None),
(2,30,"GtkWidget","tooltip-text","Cut selected object into the clipboard",1,None,None,None,None,None,None,None,None),
(2,31,"GtkActionable","action-name","win.paste",0,None,None,None,None,None,None,None,None),
(2,31,"GtkButton","icon-name","edit-paste",0,None,None,None,None,None,None,None,None),
(2,31,"GtkButton","label","Paste",1,None,None,None,None,None,None,None,None),
(2,31,"GtkWidget","tooltip-text","Paste object from the clipboard",1,None,None,None,None,None,None,None,None),
(2,32,"GtkScrolledWindow","has-frame","1",0,None,None,None,None,None,None,None,None),
(2,32,"GtkWidget","hexpand","1",0,None,None,None,None,None,None,None,None),
(2,32,"GtkWidget","vexpand","1",0,None,None,None,None,None,None,None,None),
(2,33,"GtkTreeView","model","1",0,None,None,None,None,None,None,None,None),
(2,33,"GtkTreeView","tooltip-column","3",0,None,None,None,None,None,None,None,None),
(2,34,"GtkTreeViewColumn","title","Name",0,None,None,None,None,None,None,None,None),
(2,36,"GtkTreeViewColumn","title","Surname",0,None,None,None,None,None,None,None,None),
(2,38,"GtkTreeViewColumn","title","Age",0,None,None,None,None,None,None,None,None),
(2,40,"GtkLabel","xalign","0",0,None,None,None,None,None,None,None,None),
(2,40,"GtkWidget","margin-bottom","2",0,None,None,None,None,None,None,None,None),
(2,40,"GtkWidget","margin-end","2",0,None,None,None,None,None,None,None,None),
(2,40,"GtkWidget","margin-start","2",0,None,None,None,None,None,None,None,None),
(2,40,"GtkWidget","margin-top","2",0,None,None,None,None,None,None,None,None)
</object_property>
<object_data>
(2,1,"GtkListStore",1,1,None,None,None,None,None,None),
(2,1,"GtkListStore",2,2,None,1,None,None,None,None),
(2,1,"GtkListStore",2,3,None,1,None,None,None,None),
(2,1,"GtkListStore",2,4,None,1,None,None,None,None),
(2,1,"GtkListStore",2,5,None,1,None,None,None,None),
(2,1,"GtkListStore",3,6,None,None,None,None,None,None),
(2,1,"GtkListStore",4,7,None,6,None,None,None,None),
(2,1,"GtkListStore",5,8,"John",7,None,None,None,None),
(2,1,"GtkListStore",5,9,"Doe",7,None,None,None,None),
(2,1,"GtkListStore",5,10,"25",7,None,None,None,None),
(2,1,"GtkListStore",5,11,"This is the John Doe row",7,None,None,None,None),
(2,1,"GtkListStore",4,12,None,6,None,None,None,None),
(2,1,"GtkListStore",5,13,"Mary",12,None,None,None,None),
(2,1,"GtkListStore",5,14,"Unknown",12,None,None,None,None),
(2,1,"GtkListStore",5,15,"50",12,None,None,None,None),
(2,1,"GtkListStore",5,16,"This is the Mary Unknown row",12,None,None,None,None)
</object_data>
<object_data_arg>
(2,1,"GtkListStore",2,2,"type","gchararray"),
(2,1,"GtkListStore",2,3,"type","gchararray"),
(2,1,"GtkListStore",2,4,"type","gint"),
(2,1,"GtkListStore",2,5,"type","gchararray"),
(2,1,"GtkListStore",5,8,"id","0"),
(2,1,"GtkListStore",5,9,"id","1"),
(2,1,"GtkListStore",5,10,"id","2"),
(2,1,"GtkListStore",5,11,"id","3"),
(2,1,"GtkListStore",5,13,"id","0"),
(2,1,"GtkListStore",5,14,"id","1"),
(2,1,"GtkListStore",5,15,"id","2"),
(2,1,"GtkListStore",5,16,"id","3")
</object_data_arg>
</cambalache-project>

View File

@ -1,179 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.14.0 -->
<!--License: GPL-3.0-->
<interface domain="https://sharpetronics.com">
<!-- interface-name drogon-dashboard.ui -->
<!-- interface-description A secure Drogon dashboard for managing content from a Drogon web server.
The admin dashboard after login user interface. -->
<!-- interface-copyright SharpeTronics, Inc. -->
<!-- interface-authors SharpeTronics, Inc.
oDinZu WenKi -->
<requires lib="gtk" version="4.6"/>
<requires lib="libadwaita" version="1.0"/>
<object class="GtkWindow" id="adminDash">
<property name="default-height">700</property>
<property name="default-width">500</property>
<property name="maximized">True</property>
<property name="title">A Drogon Content Manager</property>
<child>
<object class="GtkBox">
<property name="halign">start</property>
<property name="spacing">3</property>
<child>
<object class="GtkGrid">
<property name="halign">start</property>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label">SharpeTronics</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<layout>
<property name="column">0</property>
<property name="column-span">1</property>
<property name="row">0</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label">A Drogon Dashboard</property>
<property name="margin-bottom">3</property>
<property name="margin-start">15</property>
<property name="margin-top">5</property>
<layout>
<property name="column">0</property>
<property name="row">1</property>
<property name="row-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label">GENERAL</property>
<property name="margin-bottom">10</property>
<property name="margin-start">5</property>
<property name="margin-top">35</property>
<layout>
<property name="column">0</property>
<property name="row">8</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton">
<property name="child">
<object class="AdwButtonContent">
<property name="halign">start</property>
<property name="icon-name">text-x-generic</property>
<property name="label"> Content Manager</property>
</object>
</property>
<property name="margin-start">5</property>
<layout>
<property name="column">0</property>
<property name="row">5</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label">PLUGINS</property>
<property name="margin-bottom">10</property>
<property name="margin-start">5</property>
<property name="margin-top">35</property>
<layout>
<property name="column">0</property>
<property name="row">6</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton">
<property name="child">
<object class="AdwButtonContent">
<property name="halign">start</property>
<property name="icon-name">image-x-generic</property>
<property name="label"> Media Library</property>
</object>
</property>
<property name="margin-start">5</property>
<layout>
<property name="column">0</property>
<property name="row">7</property>
</layout>
</object>
</child>
<child>
<object class="GtkSeparator">
<property name="margin-bottom">15</property>
<layout>
<property name="column">0</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton">
<property name="child">
<object class="AdwButtonContent">
<property name="halign">start</property>
<property name="icon-name">application-x-addon-symbolic</property>
<property name="label"> Plugins</property>
</object>
</property>
<property name="margin-start">5</property>
<layout>
<property name="column">0</property>
<property name="row">9</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton">
<property name="child">
<object class="AdwButtonContent">
<property name="halign">start</property>
<property name="icon-name">org.gnome.Settings-default-apps-symbolic</property>
<property name="label"> Marketplace</property>
</object>
</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<layout>
<property name="column">0</property>
<property name="row">10</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton">
<property name="child">
<object class="AdwButtonContent">
<property name="halign">start</property>
<property name="icon-name">applications-system-symbolic</property>
<property name="label"> Settings</property>
</object>
</property>
<property name="margin-start">5</property>
<property name="margin-top">5</property>
<layout>
<property name="column">0</property>
<property name="row">11</property>
</layout>
</object>
</child>
</object>
</child>
<child>
<object class="GtkCenterBox"/>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,215 +1,223 @@
<?xml version='1.0' encoding='UTF-8'?> <?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.14.0 --> <!-- Created with Cambalache 0.93.0 -->
<!--License: GPL-3.0--> <interface>
<interface domain="https://sharpetronics.com"> <!-- interface-name admin-register.ui -->
<!-- interface-description A secure Drogon dashboard for managing content from a Drogon web server. <object class="GtkListStore" id="liststore1">
<columns>
The admin user registration user interface. --> <column type="gchararray"/>
<!-- interface-copyright SharpeTronics, Inc. --> <column type="gchararray"/>
<!-- interface-authors SharpeTronics, Inc. <column type="gint"/>
oDinZu WenKi --> <column type="gchararray"/>
<requires lib="gtk" version="4.6"/> </columns>
<requires lib="libadwaita" version="1.0"/> <data>
<object class="GtkWindow" id="register_window"> <row>
<property name="default-height">-1</property> <col id="0" translatable="yes">John</col>
<property name="default-width">-1</property> <col id="1" translatable="yes">Doe</col>
<property name="title">Admin Registration</property> <col id="2">25</col>
<col id="3" translatable="yes">This is the John Doe row</col>
</row>
<row>
<col id="0" translatable="yes">Mary</col>
<col id="1" translatable="yes">Unknown</col>
<col id="2">50</col>
<col id="3" translatable="yes">This is the Mary Unknown row</col>
</row>
</data>
</object>
<menu id="menubar">
<submenu>
<attribute name="label" translatable="yes">_File</attribute>
<section>
<item>
<attribute name="label" translatable="yes">_New</attribute>
<attribute name="action">win.new</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Open</attribute>
<attribute name="action">win.open</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Save</attribute>
<attribute name="action">win.save</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Save _As</attribute>
<attribute name="action">win.save-as</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Quit</attribute>
<attribute name="action">win.quit</attribute>
</item>
</section>
</submenu>
<submenu>
<attribute name="label" translatable="yes">_Edit</attribute>
<section>
<item>
<attribute name="label" translatable="yes">_Copy</attribute>
<attribute name="action">win.copy</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Cut</attribute>
<attribute name="action">win.cut</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_Paste</attribute>
<attribute name="action">win.paste</attribute>
</item>
</section>
</submenu>
<submenu>
<attribute name="label" translatable="yes">_Help</attribute>
<section>
<item>
<attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">win.help</attribute>
</item>
<item>
<attribute name="label" translatable="yes">_About</attribute>
<attribute name="action">win.about</attribute>
</item>
</section>
</submenu>
</menu>
<object class="GtkAboutDialog" id="aboutdialog1">
<property name="program-name" translatable="yes">Builder demo</property>
<property name="logo-icon-name" translatable="yes">org.gtk.Demo4</property>
<property name="modal">True</property>
</object>
<object class="GtkWindow" id="window1">
<property name="default-height">250</property>
<property name="default-width">440</property>
<property name="title" translatable="yes">Builder</property>
<child> <child>
<object class="GtkCenterBox"> <object class="GtkBox" id="vbox1">
<property name="halign">center</property> <property name="orientation">vertical</property>
<property name="width-request">500</property> <child>
<child type="center"> <object class="GtkPopoverMenuBar" id="menubar1">
<object class="GtkGrid"> <property name="menu-model">menubar</property>
<property name="column-spacing">7</property> <accessibility>
<property name="halign">center</property> <property name="label">Main Menu</property>
<property name="row-spacing">5</property> </accessibility>
<property name="width-request">450</property> </object>
</child>
<child>
<object class="GtkBox" id="toolbar1">
<property name="accessible-role">toolbar</property>
<property name="css-classes">toolbar</property>
<accessibility>
<property name="label">Toolbar</property>
</accessibility>
<child> <child>
<object class="GtkImage" id="logo"> <object class="GtkButton">
<property name="accessible-role">img</property> <property name="label" translatable="yes">New</property>
<property name="icon-name">application-x-executable</property> <property name="tooltip-text" translatable="yes">Create a new file</property>
<property name="icon-size">large</property> <property name="icon-name">document-new</property>
<property name="margin-bottom">10</property> <property name="action-name">win.new</property>
<property name="pixel-size">75</property>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">0</property>
<property name="row-span">1</property>
</layout>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="title_label"> <object class="GtkButton">
<property name="justify">center</property> <property name="label" translatable="yes">Open</property>
<property name="label">Welcome</property> <property name="tooltip-text" translatable="yes">Open a file</property>
<layout> <property name="icon-name">document-open</property>
<property name="column">0</property> <property name="action-name">win.open</property>
<property name="column-span">2</property>
<property name="row">1</property>
<property name="row-span">1</property>
</layout>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="moto_label"> <object class="GtkButton">
<property name="justify">center</property> <property name="label" translatable="yes">Save</property>
<property name="label">A Drogon Application</property> <property name="tooltip-text" translatable="yes">Save a file</property>
<property name="margin-bottom">15</property> <property name="icon-name">document-save</property>
<layout> <property name="action-name">win.save</property>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">2</property>
</layout>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="first_name_label"> <object class="GtkSeparator"/>
<property name="accessible-role">label</property> </child>
<property name="halign">start</property> <child>
<property name="label">First Name:</property> <object class="GtkButton">
<property name="margin-bottom">2</property> <property name="label" translatable="yes">Copy</property>
<layout> <property name="tooltip-text" translatable="yes">Copy selected object into the clipboard</property>
<property name="column">0</property> <property name="icon-name">edit-copy</property>
<property name="row">4</property> <property name="action-name">win.copy</property>
</layout>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkEntry" id="first_name_input"> <object class="GtkButton">
<property name="hexpand">True</property> <property name="label" translatable="yes">Cut</property>
<property name="placeholder-text">e.g. John</property> <property name="tooltip-text" translatable="yes">Cut selected object into the clipboard</property>
<property name="tooltip-text">Enter your first name</property> <property name="icon-name">edit-cut</property>
<layout> <property name="action-name">win.cut</property>
<property name="column">0</property>
<property name="row">5</property>
</layout>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="last_name_label"> <object class="GtkButton">
<property name="accessible-role">label</property> <property name="label" translatable="yes">Paste</property>
<property name="halign">start</property> <property name="tooltip-text" translatable="yes">Paste object from the clipboard</property>
<property name="label">Last Name:</property> <property name="icon-name">edit-paste</property>
<property name="margin-bottom">2</property> <property name="action-name">win.paste</property>
<layout>
<property name="column">1</property>
<property name="row">4</property>
</layout>
</object> </object>
</child> </child>
</object>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="has-frame">1</property>
<property name="hexpand">1</property>
<property name="vexpand">1</property>
<child> <child>
<object class="GtkEntry" id="last_name_input"> <object class="GtkTreeView" id="treeview1">
<property name="hexpand">True</property> <property name="model">liststore1</property>
<property name="placeholder-text">e.g. Jacobs</property> <property name="tooltip-column">3</property>
<property name="tooltip-text">Enter your last name</property>
<layout>
<property name="column">1</property>
<property name="row">5</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="register_button">
<property name="child">
<object class="AdwButtonContent">
<property name="icon-name">pan-start-symbolic-rtl</property>
<property name="label">Let's Start</property>
</object>
</property>
<property name="margin-bottom">50</property>
<property name="sensitive">False</property>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">12</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="email_label">
<property name="accessible-role">label</property>
<property name="label">Email:</property>
<property name="margin-bottom">2</property>
<property name="xalign">0.0</property>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">6</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="email_input">
<property name="placeholder-text">e.g. johnjacobs@email.com</property>
<property name="tooltip-text">Enter your email address</property>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">7</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="password_label">
<property name="label">Password:</property>
<property name="margin-bottom">2</property>
<property name="xalign">0.0</property>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">8</property>
</layout>
</object>
</child>
<child>
<object class="GtkPasswordEntry" id="p_input">
<property name="accessible-role">input</property>
<property name="margin-bottom">5</property>
<property name="placeholder-text">e.g. password test</property>
<property name="show-peek-icon">True</property>
<property name="tooltip-text">Enter your password</property>
<child> <child>
<object class="GtkPasswordEntryBuffer"> <object class="GtkTreeViewColumn" id="column1">
<property name="max-length">12</property> <property name="title">Name</property>
<child>
<object class="GtkCellRendererText" id="renderer1"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="column2">
<property name="title">Surname</property>
<child>
<object class="GtkCellRendererText" id="renderer2"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="column3">
<property name="title">Age</property>
<child>
<object class="GtkCellRendererText" id="renderer3"/>
<attributes>
<attribute name="text">2</attribute>
</attributes>
</child>
</object> </object>
</child> </child>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">9</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="password_label_confirm">
<property name="label">Confirm Password:</property>
<property name="margin-bottom">2</property>
<property name="xalign">0.0</property>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">10</property>
</layout>
</object>
</child>
<child>
<object class="GtkPasswordEntry" id="p_input_confirm">
<property name="accessible-role">input</property>
<property name="margin-bottom">5</property>
<property name="placeholder-text">e.g. password test</property>
<property name="show-peek-icon">True</property>
<property name="tooltip-text">Enter your password</property>
<layout>
<property name="column">0</property>
<property name="column-span">2</property>
<property name="row">11</property>
</layout>
</object> </object>
</child> </child>
</object> </object>
</child> </child>
<child>
<object class="GtkLabel" id="statusbar1">
<property name="xalign">0</property>
<property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
<property name="margin-bottom">2</property>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>

View File

@ -1,11 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.14.0 -->
<!--License: GPL-3.0-->
<interface>
<!-- interface-description A secure Drogon dashboard for managing content from a Drogon web server.
The content manager user interface. -->
<!-- interface-copyright SharpeTronics, Inc. -->
<!-- interface-authors SharpeTronics, Inc.
oDinZu WenKi -->
</interface>

View File

@ -1,346 +0,0 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE cambalache-project SYSTEM "cambalache-project.dtd">
<cambalache-project version="0.13.1" target_tk="gtk-4.0">
<ui>
(1,None,"drogon-dashboard.ui","admin-dashboard.ui","A secure Drogon dashboard for managing content from a Drogon web server.\n\nThe admin dashboard after login user interface.","SharpeTronics, Inc.","SharpeTronics, Inc.\noDinZu WenKi",None,"https://sharpetronics.com","License: GPL-3.0",None),
(2,None,None,"login.ui","A secure Drogon dashboard for managing content from a Drogon web server.\n\nThe login user interface.","SharpeTronics, Inc.","SharpeTronics, Inc.\noDinZu WenKi",None,"https://sharpetronics.com","License: GPL-3.0",None),
(3,None,None,"admin-register.ui","A secure Drogon dashboard for managing content from a Drogon web server.\n\nThe admin user registration user interface.","SharpeTronics, Inc.","SharpeTronics, Inc.\noDinZu WenKi",None,"https://sharpetronics.com","License: GPL-3.0",None),
(4,None,None,"password-recovery.ui","A secure Drogon dashboard for managing content from a Drogon web server.\n\nThe password recovery user interface.","SharpeTronics, Inc.","SharpeTronics, Inc.\noDinZu WenKi",None,None,"License: GPL-3.0",None),
(6,None,None,"content-manager.ui","A secure Drogon dashboard for managing content from a Drogon web server.\n\nThe content manager user interface.","SharpeTronics, Inc.","SharpeTronics, Inc.\noDinZu WenKi",None,None,"License: GPL-3.0",None)
</ui>
<css>
(1,"menu-buttons.css",None,1)
</css>
<object>
(1,1,"GtkWindow","adminDash",None,None,None,None,-1,None),
(1,4,"GtkBox",None,1,None,None,None,1,None),
(1,5,"GtkGrid",None,4,None,None,None,-1,None),
(1,8,"GtkLabel",None,5,None,None,None,None,None),
(1,9,"GtkLabel",None,5,None,None,None,1,None),
(1,10,"GtkSeparator",None,5,None,None,None,6,None),
(1,12,"GtkButton",None,5,None,None,None,3,None),
(1,13,"AdwButtonContent",None,12,None,None,None,-1,None),
(1,14,"GtkLabel",None,5,None,None,None,4,None),
(1,15,"GtkLabel",None,5,None,None,None,2,None),
(1,16,"GtkButton",None,5,None,None,None,5,None),
(1,17,"AdwButtonContent",None,16,None,None,None,None,None),
(1,18,"GtkButton",None,5,None,None,None,7,None),
(1,19,"AdwButtonContent",None,18,None,None,None,None,None),
(1,20,"GtkButton",None,5,None,None,None,8,None),
(1,21,"AdwButtonContent",None,20,None,None,None,None,None),
(1,22,"GtkButton",None,5,None,None,None,9,None),
(1,23,"AdwButtonContent",None,22,None,None,None,None,None),
(1,24,"GtkCenterBox",None,4,None,None,None,-1,None),
(2,1,"GtkWindow","loginWindow",None,None,None,None,-1,None),
(2,2,"GtkCenterBox",None,1,None,None,None,-1,None),
(2,3,"GtkGrid",None,2,None,"center",None,-1,None),
(2,4,"GtkImage","logo",3,None,None,None,None,None),
(2,5,"GtkLabel","titleLabel",3,None,None,None,1,None),
(2,6,"GtkLabel","mottoLabel",3,None,None,None,2,None),
(2,7,"GtkLabel","emailLabel",3,None,None,None,3,None),
(2,8,"GtkLabel","passwordLabel",3,None,None,None,5,None),
(2,10,"GtkTextView","emailid",3,None,None,None,4,None),
(2,11,"GtkTextView","password",3,None,None,None,6,None),
(2,12,"GtkSeparator",None,3,None,None,None,7,None),
(2,13,"GtkLabel","forgotPass",3,None,None,None,8,None),
(3,1,"GtkWindow","register_window",None,None,None,None,None,None),
(3,2,"GtkCenterBox",None,1,None,None,None,None,None),
(3,3,"GtkGrid",None,2,None,"center",None,None,None),
(3,4,"GtkImage","logo",3,None,None,None,None,None),
(3,5,"GtkLabel","title_label",3,None,None,None,1,None),
(3,6,"GtkLabel","moto_label",3,None,None,None,2,None),
(3,7,"GtkLabel","first_name_label",3,None,None,None,3,None),
(3,9,"GtkLabel","last_name_label",3,None,None,None,5,None),
(3,12,"GtkButton","register_button",3,None,None,None,7,None),
(3,13,"GtkLabel","email_label",3,None,None,None,8,None),
(3,15,"GtkLabel","password_label",3,None,None,None,10,None),
(3,17,"GtkLabel","password_label_confirm",3,None,None,None,12,None),
(3,20,"AdwButtonContent",None,12,None,None,None,-1,None),
(3,21,"GtkPasswordEntry","p_input",3,None,None,None,11,None),
(3,22,"GtkPasswordEntry","p_input_confirm",3,None,None,None,13,None),
(3,23,"GtkEntry","first_name_input",3,None,None,None,4,None),
(3,24,"GtkEntry","last_name_input",3,None,None,None,6,None),
(3,25,"GtkEntry","email_input",3,None,None,None,9,None),
(3,26,"GtkPasswordEntryBuffer",None,21,None,None,None,-1,None),
(4,1,"GtkWindow","passwordWindow",None,None,None,None,None,None),
(4,2,"GtkCenterBox",None,1,None,None,None,None,None),
(4,3,"GtkGrid",None,2,None,"center",None,None,None),
(4,4,"GtkImage","logo",3,None,None,None,None,None),
(4,5,"GtkLabel","titleLabel",3,None,None,None,1,None),
(4,7,"GtkLabel","emailLabel",3,None,None,None,3,None),
(4,8,"GtkTextView","emailid",3,None,None,None,3,None),
(4,9,"GtkButton","sendEmail",3,None,None,None,4,None)
</object>
<object_property>
(1,1,"GtkWindow","default-height","700",None,None,None,None,None,None,None,None,None),
(1,1,"GtkWindow","default-width","500",None,None,None,None,None,None,None,None,None),
(1,1,"GtkWindow","maximized","True",None,None,None,None,None,None,None,None,None),
(1,1,"GtkWindow","title","A Drogon Content Manager",None,None,None,None,None,None,None,None,None),
(1,4,"GtkBox","spacing","3",None,None,None,None,None,None,None,None,None),
(1,4,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,5,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,8,"GtkLabel","label","SharpeTronics",None,None,None,None,None,None,None,None,None),
(1,8,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,8,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,8,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(1,9,"GtkLabel","label","A Drogon Dashboard",None,None,None,None,None,None,None,None,None),
(1,9,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,9,"GtkWidget","margin-bottom","3",None,None,None,None,None,None,None,None,None),
(1,9,"GtkWidget","margin-start","15",None,None,None,None,None,None,None,None,None),
(1,9,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(1,10,"GtkWidget","margin-bottom","15",None,None,None,None,None,None,None,None,None),
(1,12,"GtkButton","child",None,None,None,None,None,13,None,None,None,None),
(1,12,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,13,"AdwButtonContent","icon-name","text-x-generic",None,None,None,None,None,None,None,None,None),
(1,13,"AdwButtonContent","label"," Content Manager",None,None,None,None,None,None,None,None,None),
(1,13,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,14,"GtkLabel","label","PLUGINS",None,None,None,None,None,None,None,None,None),
(1,14,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,14,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(1,14,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,14,"GtkWidget","margin-top","35",None,None,None,None,None,None,None,None,None),
(1,15,"GtkLabel","label","GENERAL",None,None,None,None,None,None,None,None,None),
(1,15,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,15,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(1,15,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,15,"GtkWidget","margin-top","35",None,None,None,None,None,None,None,None,None),
(1,16,"GtkButton","child",None,None,None,None,None,17,None,None,None,None),
(1,16,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,17,"AdwButtonContent","icon-name","image-x-generic",None,None,None,None,None,None,None,None,None),
(1,17,"AdwButtonContent","label"," Media Library",None,None,None,None,None,None,None,None,None),
(1,17,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,18,"GtkButton","child",None,None,None,None,None,19,None,None,None,None),
(1,18,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,19,"AdwButtonContent","icon-name","application-x-addon-symbolic",None,None,None,None,None,None,None,None,None),
(1,19,"AdwButtonContent","label"," Plugins",None,None,None,None,None,None,None,None,None),
(1,19,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,20,"GtkButton","child",None,None,None,None,None,21,None,None,None,None),
(1,20,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,20,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(1,21,"AdwButtonContent","icon-name","org.gnome.Settings-default-apps-symbolic",None,None,None,None,None,None,None,None,None),
(1,21,"AdwButtonContent","label"," Marketplace",None,None,None,None,None,None,None,None,None),
(1,21,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(1,22,"GtkButton","child",None,None,None,None,None,23,None,None,None,None),
(1,22,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(1,22,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(1,23,"AdwButtonContent","icon-name","applications-system-symbolic",None,None,None,None,None,None,None,None,None),
(1,23,"AdwButtonContent","label"," Settings",None,None,None,None,None,None,None,None,None),
(1,23,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(2,1,"GtkWindow","default-height","300",None,None,None,None,None,None,None,None,None),
(2,1,"GtkWindow","default-width","300",None,None,None,None,None,None,None,None,None),
(2,1,"GtkWindow","title","Login",None,None,None,None,None,None,None,None,None),
(2,4,"GtkImage","icon-name","audio-x-generic",None,None,None,None,None,None,None,None,None),
(2,4,"GtkImage","icon-size","large",None,None,None,None,None,None,None,None,None),
(2,4,"GtkImage","pixel-size","75",None,None,None,None,None,None,None,None,None),
(2,4,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(2,5,"GtkLabel","justify","center",None,None,None,None,None,None,None,None,None),
(2,5,"GtkLabel","label","Welcome to SharpeTronics",None,None,None,None,None,None,None,None,None),
(2,6,"GtkLabel","justify","center",None,None,None,None,None,None,None,None,None),
(2,6,"GtkLabel","label","A Drogon Dashboard",None,None,None,None,None,None,None,None,None),
(2,6,"GtkWidget","margin-bottom","15",None,None,None,None,None,None,None,None,None),
(2,7,"GtkLabel","label","Email:",None,None,None,None,None,None,None,None,None),
(2,7,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
(2,7,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(2,8,"GtkLabel","label","Password:",None,None,None,None,None,None,None,None,None),
(2,8,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
(2,8,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(2,10,"GtkAccessible","accessible-role","input",None,None,None,None,None,None,None,None,None),
(2,10,"GtkTextView","accepts-tab","False",None,None,None,None,None,None,None,None,None),
(2,10,"GtkTextView","indent","3",None,None,None,None,None,None,None,None,None),
(2,10,"GtkTextView","input-hints","no-emoji | no-spellcheck",None,None,None,None,None,None,None,None,None),
(2,10,"GtkTextView","input-purpose","email",None,None,None,None,None,None,None,None,None),
(2,10,"GtkTextView","left-margin","1",None,None,None,None,None,None,None,None,None),
(2,10,"GtkTextView","pixels-above-lines","5",None,None,None,None,None,None,None,None,None),
(2,10,"GtkTextView","pixels-below-lines","5",None,None,None,None,None,None,None,None,None),
(2,10,"GtkWidget","focus-on-click","False",None,None,None,None,None,None,None,None,None),
(2,10,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(2,10,"GtkWidget","tooltip-text","Enter the user email",None,None,None,None,None,None,None,None,None),
(2,11,"GtkAccessible","accessible-role","input",None,None,None,None,None,None,None,None,None),
(2,11,"GtkTextView","accepts-tab","False",None,None,None,None,None,None,None,None,None),
(2,11,"GtkTextView","indent","3",None,None,None,None,None,None,None,None,None),
(2,11,"GtkTextView","input-hints","no-emoji | no-spellcheck | private",None,None,None,None,None,None,None,None,None),
(2,11,"GtkTextView","input-purpose","password",None,None,None,None,None,None,None,None,None),
(2,11,"GtkTextView","left-margin","1",None,None,None,None,None,None,None,None,None),
(2,11,"GtkTextView","pixels-above-lines","5",None,None,None,None,None,None,None,None,None),
(2,11,"GtkTextView","pixels-below-lines","5",None,None,None,None,None,None,None,None,None),
(2,11,"GtkWidget","focus-on-click","False",None,None,None,None,None,None,None,None,None),
(2,11,"GtkWidget","tooltip-text","Enter the user password",None,None,None,None,None,None,None,None,None),
(2,12,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(2,12,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(2,13,"GtkLabel","label","Forgot password",None,None,None,None,None,None,None,None,None),
(3,1,"GtkWindow","default-height","-1",None,None,None,None,None,None,None,None,None),
(3,1,"GtkWindow","default-width","-1",None,None,None,None,None,None,None,None,None),
(3,1,"GtkWindow","title","Admin Registration",None,None,None,None,None,None,None,None,None),
(3,2,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
(3,2,"GtkWidget","width-request","500",None,None,None,None,None,None,None,None,None),
(3,3,"GtkGrid","column-spacing","7",None,None,None,None,None,None,None,None,None),
(3,3,"GtkGrid","row-spacing","5",None,None,None,None,None,None,None,None,None),
(3,3,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
(3,3,"GtkWidget","width-request","450",None,None,None,None,None,None,None,None,None),
(3,4,"GtkAccessible","accessible-role","img",None,None,None,None,None,None,None,None,None),
(3,4,"GtkImage","icon-name","application-x-executable",None,None,None,None,None,None,None,None,None),
(3,4,"GtkImage","icon-size","large",None,None,None,None,None,None,None,None,None),
(3,4,"GtkImage","pixel-size","75",None,None,None,None,None,None,None,None,None),
(3,4,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(3,5,"GtkLabel","justify","center",None,None,None,None,None,None,None,None,None),
(3,5,"GtkLabel","label","Welcome",None,None,None,None,None,None,None,None,None),
(3,6,"GtkLabel","justify","center",None,None,None,None,None,None,None,None,None),
(3,6,"GtkLabel","label","A Drogon Application",None,None,None,None,None,None,None,None,None),
(3,6,"GtkWidget","margin-bottom","15",None,None,None,None,None,None,None,None,None),
(3,7,"GtkAccessible","accessible-role","label",None,None,None,None,None,None,None,None,None),
(3,7,"GtkLabel","label","First Name:",None,None,None,None,None,None,None,None,None),
(3,7,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(3,7,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(3,9,"GtkAccessible","accessible-role","label",None,None,None,None,None,None,None,None,None),
(3,9,"GtkLabel","label","Last Name:",None,None,None,None,None,None,None,None,None),
(3,9,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(3,9,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(3,12,"GtkButton","child",None,None,None,None,None,20,None,None,None,None),
(3,12,"GtkWidget","margin-bottom","50",None,None,None,None,None,None,None,None,None),
(3,12,"GtkWidget","sensitive","False",None,None,None,None,None,None,None,None,None),
(3,13,"GtkAccessible","accessible-role","label",None,None,None,None,None,None,None,None,None),
(3,13,"GtkLabel","label","Email:",None,None,None,None,None,None,None,None,None),
(3,13,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
(3,13,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(3,15,"GtkLabel","label","Password:",None,None,None,None,None,None,None,None,None),
(3,15,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
(3,15,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(3,17,"GtkLabel","label","Confirm Password:",None,None,None,None,None,None,None,None,None),
(3,17,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
(3,17,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(3,20,"AdwButtonContent","icon-name","pan-start-symbolic-rtl",None,None,None,None,None,None,None,None,None),
(3,20,"AdwButtonContent","label","Let's Start",None,None,None,None,None,None,None,None,None),
(3,21,"GtkAccessible","accessible-role","input",None,None,None,None,None,None,None,None,None),
(3,21,"GtkPasswordEntry","placeholder-text","e.g. password test",None,None,None,None,None,None,None,None,None),
(3,21,"GtkPasswordEntry","show-peek-icon","True",None,None,None,None,None,None,None,None,None),
(3,21,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(3,21,"GtkWidget","tooltip-text","Enter your password",None,None,None,None,None,None,None,None,None),
(3,22,"GtkAccessible","accessible-role","input",None,None,None,None,None,None,None,None,None),
(3,22,"GtkPasswordEntry","placeholder-text","e.g. password test",None,None,None,None,None,None,None,None,None),
(3,22,"GtkPasswordEntry","show-peek-icon","True",None,None,None,None,None,None,None,None,None),
(3,22,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(3,22,"GtkWidget","tooltip-text","Enter your password",None,None,None,None,None,None,None,None,None),
(3,23,"GtkEntry","placeholder-text","e.g. John",None,None,None,None,None,None,None,None,None),
(3,23,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(3,23,"GtkWidget","tooltip-text","Enter your first name",None,None,None,None,None,None,None,None,None),
(3,24,"GtkEntry","placeholder-text","e.g. Jacobs",None,None,None,None,None,None,None,None,None),
(3,24,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(3,24,"GtkWidget","tooltip-text","Enter your last name",None,None,None,None,None,None,None,None,None),
(3,25,"GtkEntry","placeholder-text","e.g. johnjacobs@email.com",None,None,None,None,None,None,None,None,None),
(3,25,"GtkWidget","tooltip-text","Enter your email address",None,None,None,None,None,None,None,None,None),
(3,26,"GtkEntryBuffer","max-length","12",None,None,None,None,None,None,None,None,None),
(4,1,"GtkWindow","default-height","300",None,None,None,None,None,None,None,None,None),
(4,1,"GtkWindow","default-width","300",None,None,None,None,None,None,None,None,None),
(4,1,"GtkWindow","title","Login",None,None,None,None,None,None,None,None,None),
(4,4,"GtkImage","icon-name","audio-x-generic",None,None,None,None,None,None,None,None,None),
(4,4,"GtkImage","icon-size","large",None,None,None,None,None,None,None,None,None),
(4,4,"GtkImage","pixel-size","75",None,None,None,None,None,None,None,None,None),
(4,4,"GtkWidget","margin-bottom","10",None,None,None,None,None,None,None,None,None),
(4,5,"GtkAccessible","accessible-role","label",None,None,None,None,None,None,None,None,None),
(4,5,"GtkLabel","justify","center",None,None,None,None,None,None,None,None,None),
(4,5,"GtkLabel","label","Password Recovery",None,None,None,None,None,None,None,None,None),
(4,5,"GtkWidget","margin-bottom","15",None,None,None,None,None,None,None,None,None),
(4,7,"GtkLabel","label","Email:",None,None,None,None,None,None,None,None,None),
(4,7,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
(4,7,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
(4,8,"GtkAccessible","accessible-role","input",None,None,None,None,None,None,None,None,None),
(4,8,"GtkTextView","accepts-tab","False",None,None,None,None,None,None,None,None,None),
(4,8,"GtkTextView","indent","3",None,None,None,None,None,None,None,None,None),
(4,8,"GtkTextView","input-hints","no-emoji | no-spellcheck",None,None,None,None,None,None,None,None,None),
(4,8,"GtkTextView","input-purpose","email",None,None,None,None,None,None,None,None,None),
(4,8,"GtkTextView","left-margin","1",None,None,None,None,None,None,None,None,None),
(4,8,"GtkTextView","pixels-above-lines","5",None,None,None,None,None,None,None,None,None),
(4,8,"GtkTextView","pixels-below-lines","5",None,None,None,None,None,None,None,None,None),
(4,8,"GtkWidget","focus-on-click","False",None,None,None,None,None,None,None,None,None),
(4,8,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(4,8,"GtkWidget","tooltip-text","Enter the user email",None,None,None,None,None,None,None,None,None),
(4,8,"GtkWidget","width-request","275",None,None,None,None,None,None,None,None,None),
(4,9,"GtkButton","label","Send",None,None,None,None,None,None,None,None,None)
</object_property>
<object_layout_property>
(1,5,8,"GtkGridLayoutChild","column","0",None,None,None,None),
(1,5,8,"GtkGridLayoutChild","column-span","1",None,None,None,None),
(1,5,8,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(1,5,9,"GtkGridLayoutChild","row","1",None,None,None,None),
(1,5,9,"GtkGridLayoutChild","row-span","2",None,None,None,None),
(1,5,10,"GtkGridLayoutChild","row","3",None,None,None,None),
(1,5,12,"GtkGridLayoutChild","row","5",None,None,None,None),
(1,5,14,"GtkGridLayoutChild","row","6",None,None,None,None),
(1,5,15,"GtkGridLayoutChild","row","8",None,None,None,None),
(1,5,16,"GtkGridLayoutChild","row","7",None,None,None,None),
(1,5,18,"GtkGridLayoutChild","row","9",None,None,None,None),
(1,5,20,"GtkGridLayoutChild","row","10",None,None,None,None),
(1,5,22,"GtkGridLayoutChild","row","11",None,None,None,None),
(2,3,4,"GtkGridLayoutChild","column","0",None,None,None,None),
(2,3,4,"GtkGridLayoutChild","column-span","1",None,None,None,None),
(2,3,4,"GtkGridLayoutChild","row","0",None,None,None,None),
(2,3,4,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(2,3,5,"GtkGridLayoutChild","column","0",None,None,None,None),
(2,3,5,"GtkGridLayoutChild","column-span","1",None,None,None,None),
(2,3,5,"GtkGridLayoutChild","row","1",None,None,None,None),
(2,3,5,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(2,3,6,"GtkGridLayoutChild","row","2",None,None,None,None),
(2,3,7,"GtkGridLayoutChild","row","4",None,None,None,None),
(2,3,8,"GtkGridLayoutChild","row","7",None,None,None,None),
(2,3,10,"GtkGridLayoutChild","column","0",None,None,None,None),
(2,3,10,"GtkGridLayoutChild","row","5",None,None,None,None),
(2,3,11,"GtkGridLayoutChild","row","8",None,None,None,None),
(2,3,12,"GtkGridLayoutChild","column","0",None,None,None,None),
(2,3,12,"GtkGridLayoutChild","column-span","1",None,None,None,None),
(2,3,12,"GtkGridLayoutChild","row","9",None,None,None,None),
(2,3,12,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(2,3,13,"GtkGridLayoutChild","column","0",None,None,None,None),
(2,3,13,"GtkGridLayoutChild","column-span","1",None,None,None,None),
(2,3,13,"GtkGridLayoutChild","row","10",None,None,None,None),
(2,3,13,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(3,3,4,"GtkGridLayoutChild","column","0",None,None,None,None),
(3,3,4,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,4,"GtkGridLayoutChild","row","0",None,None,None,None),
(3,3,4,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(3,3,5,"GtkGridLayoutChild","column","0",None,None,None,None),
(3,3,5,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,5,"GtkGridLayoutChild","row","1",None,None,None,None),
(3,3,5,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(3,3,6,"GtkGridLayoutChild","column","0",None,None,None,None),
(3,3,6,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,6,"GtkGridLayoutChild","row","2",None,None,None,None),
(3,3,7,"GtkGridLayoutChild","column","0",None,None,None,None),
(3,3,7,"GtkGridLayoutChild","row","4",None,None,None,None),
(3,3,9,"GtkGridLayoutChild","column","1",None,None,None,None),
(3,3,9,"GtkGridLayoutChild","row","4",None,None,None,None),
(3,3,12,"GtkGridLayoutChild","column","0",None,None,None,None),
(3,3,12,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,12,"GtkGridLayoutChild","row","12",None,None,None,None),
(3,3,12,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(3,3,13,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,13,"GtkGridLayoutChild","row","6",None,None,None,None),
(3,3,15,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,15,"GtkGridLayoutChild","row","8",None,None,None,None),
(3,3,17,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,17,"GtkGridLayoutChild","row","10",None,None,None,None),
(3,3,21,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,21,"GtkGridLayoutChild","row","9",None,None,None,None),
(3,3,22,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,22,"GtkGridLayoutChild","row","11",None,None,None,None),
(3,3,23,"GtkGridLayoutChild","row","5",None,None,None,None),
(3,3,24,"GtkGridLayoutChild","column","1",None,None,None,None),
(3,3,24,"GtkGridLayoutChild","row","5",None,None,None,None),
(3,3,25,"GtkGridLayoutChild","column-span","2",None,None,None,None),
(3,3,25,"GtkGridLayoutChild","row","7",None,None,None,None),
(4,3,4,"GtkGridLayoutChild","column","0",None,None,None,None),
(4,3,4,"GtkGridLayoutChild","column-span","1",None,None,None,None),
(4,3,4,"GtkGridLayoutChild","row","0",None,None,None,None),
(4,3,4,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(4,3,5,"GtkGridLayoutChild","column","0",None,None,None,None),
(4,3,5,"GtkGridLayoutChild","column-span","1",None,None,None,None),
(4,3,5,"GtkGridLayoutChild","row","1",None,None,None,None),
(4,3,5,"GtkGridLayoutChild","row-span","1",None,None,None,None),
(4,3,7,"GtkGridLayoutChild","column","0",None,None,None,None),
(4,3,7,"GtkGridLayoutChild","row","2",None,None,None,None),
(4,3,8,"GtkGridLayoutChild","row","3",None,None,None,None),
(4,3,9,"GtkGridLayoutChild","row","4",None,None,None,None)
</object_layout_property>
<object_data>
(2,5,"GtkLabel",2,2,None,1,None,None,None,None)
</object_data>
</cambalache-project>

Binary file not shown.

View File

@ -1,144 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.14.0 -->
<!--License: GPL-3.0-->
<interface domain="https://sharpetronics.com">
<!-- interface-description A secure Drogon dashboard for managing content from a Drogon web server.
The login user interface. -->
<!-- interface-copyright SharpeTronics, Inc. -->
<!-- interface-authors SharpeTronics, Inc.
oDinZu WenKi -->
<requires lib="gtk" version="4.6"/>
<object class="GtkWindow" id="loginWindow">
<property name="default-height">300</property>
<property name="default-width">300</property>
<property name="title">Login</property>
<child>
<object class="GtkCenterBox">
<child type="center">
<object class="GtkGrid">
<child>
<object class="GtkImage" id="logo">
<property name="icon-name">audio-x-generic</property>
<property name="icon-size">large</property>
<property name="margin-bottom">10</property>
<property name="pixel-size">75</property>
<layout>
<property name="column">0</property>
<property name="column-span">1</property>
<property name="row">0</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="titleLabel">
<property name="justify">center</property>
<property name="label">Welcome to SharpeTronics</property>
<layout>
<property name="column">0</property>
<property name="column-span">1</property>
<property name="row">1</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="mottoLabel">
<property name="justify">center</property>
<property name="label">A Drogon Dashboard</property>
<property name="margin-bottom">15</property>
<layout>
<property name="column">0</property>
<property name="row">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="emailLabel">
<property name="label">Email:</property>
<property name="margin-bottom">2</property>
<property name="xalign">0.0</property>
<layout>
<property name="column">0</property>
<property name="row">4</property>
</layout>
</object>
</child>
<child>
<object class="GtkTextView" id="emailid">
<property name="accepts-tab">False</property>
<property name="accessible-role">input</property>
<property name="focus-on-click">False</property>
<property name="indent">3</property>
<property name="input-hints">no-emoji | no-spellcheck</property>
<property name="input-purpose">email</property>
<property name="left-margin">1</property>
<property name="margin-bottom">5</property>
<property name="pixels-above-lines">5</property>
<property name="pixels-below-lines">5</property>
<property name="tooltip-text">Enter the user email</property>
<layout>
<property name="column">0</property>
<property name="row">5</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="passwordLabel">
<property name="label">Password:</property>
<property name="margin-bottom">2</property>
<property name="xalign">0.0</property>
<layout>
<property name="column">0</property>
<property name="row">7</property>
</layout>
</object>
</child>
<child>
<object class="GtkTextView" id="password">
<property name="accepts-tab">False</property>
<property name="accessible-role">input</property>
<property name="focus-on-click">False</property>
<property name="indent">3</property>
<property name="input-hints">no-emoji | no-spellcheck | private</property>
<property name="input-purpose">password</property>
<property name="left-margin">1</property>
<property name="pixels-above-lines">5</property>
<property name="pixels-below-lines">5</property>
<property name="tooltip-text">Enter the user password</property>
<layout>
<property name="column">0</property>
<property name="row">8</property>
</layout>
</object>
</child>
<child>
<object class="GtkSeparator">
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
<layout>
<property name="column">0</property>
<property name="column-span">1</property>
<property name="row">9</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="forgotPass">
<property name="label">Forgot password</property>
<layout>
<property name="column">0</property>
<property name="column-span">1</property>
<property name="row">10</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,93 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.14.0 -->
<!--License: GPL-3.0-->
<interface>
<!-- interface-description A secure Drogon dashboard for managing content from a Drogon web server.
The password recovery user interface. -->
<!-- interface-copyright SharpeTronics, Inc. -->
<!-- interface-authors SharpeTronics, Inc.
oDinZu WenKi -->
<requires lib="gtk" version="4.6"/>
<object class="GtkWindow" id="passwordWindow">
<property name="default-height">300</property>
<property name="default-width">300</property>
<property name="title">Login</property>
<child>
<object class="GtkCenterBox">
<child type="center">
<object class="GtkGrid">
<child>
<object class="GtkImage" id="logo">
<property name="icon-name">audio-x-generic</property>
<property name="icon-size">large</property>
<property name="margin-bottom">10</property>
<property name="pixel-size">75</property>
<layout>
<property name="column">0</property>
<property name="column-span">1</property>
<property name="row">0</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="titleLabel">
<property name="accessible-role">label</property>
<property name="justify">center</property>
<property name="label">Password Recovery</property>
<property name="margin-bottom">15</property>
<layout>
<property name="column">0</property>
<property name="column-span">1</property>
<property name="row">1</property>
<property name="row-span">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="emailLabel">
<property name="label">Email:</property>
<property name="margin-bottom">2</property>
<property name="xalign">0.0</property>
<layout>
<property name="column">0</property>
<property name="row">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkTextView" id="emailid">
<property name="accepts-tab">False</property>
<property name="accessible-role">input</property>
<property name="focus-on-click">False</property>
<property name="indent">3</property>
<property name="input-hints">no-emoji | no-spellcheck</property>
<property name="input-purpose">email</property>
<property name="left-margin">1</property>
<property name="margin-bottom">5</property>
<property name="pixels-above-lines">5</property>
<property name="pixels-below-lines">5</property>
<property name="tooltip-text">Enter the user email</property>
<property name="width-request">275</property>
<layout>
<property name="column">0</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="sendEmail">
<property name="label">Send</property>
<layout>
<property name="column">0</property>
<property name="row">4</property>
</layout>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@ -1,7 +1,7 @@
# Note: drogon_ctl was implemented to create the local template architecture # Note: drogon_ctl was implemented to create the local template architecture
cmake_minimum_required(VERSION 3.5) cmake_minimum_required(VERSION 3.5)
project(local-drogon-api-server CXX) project(DrogonCMS_API_Server CXX)
include(CheckIncludeFileCXX) include(CheckIncludeFileCXX)

View File

@ -8,7 +8,7 @@
//port: server port, 5432 by default; //port: server port, 5432 by default;
"port": 5432, "port": 5432,
//dbname: Database name; //dbname: Database name;
"dbname": "", "dbname": "drogoncmsdb",
//schema: valid for postgreSQL, "public" by default; //schema: valid for postgreSQL, "public" by default;
"schema": "public", "schema": "public",
//user: User name //user: User name

1161
vendors/cmake/CPM_0.38.7.cmake vendored Normal file

File diff suppressed because it is too large Load Diff

24
vendors/cmake/cpm/get_cpm.cmake vendored Normal file
View File

@ -0,0 +1,24 @@
# SPDX-License-Identifier: MIT
#
# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors
set(CPM_DOWNLOAD_VERSION 0.38.7)
set(CPM_HASH_SUM "83e5eb71b2bbb8b1f2ad38f1950287a057624e385c238f6087f94cdfc44af9c5")
if(CPM_SOURCE_CACHE)
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
else()
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
endif()
# Expand relative path. This is important if the provided path contains a tilde (~)
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
file(DOWNLOAD
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}
)
include(${CPM_DOWNLOAD_LOCATION})

View File

@ -1,5 +1,5 @@
cmake_minimum_required (VERSION 3.5) cmake_minimum_required (VERSION 3.5)
project(simple_reverse_proxy CXX) project(DrogonCMS_Reverse_Proxy CXX)
include(CheckIncludeFileCXX) include(CheckIncludeFileCXX)
@ -14,7 +14,7 @@ endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(simple_reverse_proxy main.cc) add_executable(DrogonCMS_Reverse_Proxy main.cc)
########## ##########
# If you include the drogon source code locally in your project, use this method to add drogon # If you include the drogon source code locally in your project, use this method to add drogon
@ -23,13 +23,13 @@ add_executable(simple_reverse_proxy main.cc)
########## ##########
find_package(Drogon CONFIG REQUIRED) find_package(Drogon CONFIG REQUIRED)
target_link_libraries(simple_reverse_proxy PRIVATE Drogon::Drogon) target_link_libraries(DrogonCMS_Reverse_Proxy PRIVATE Drogon::Drogon)
if(CMAKE_CXX_STANDARD LESS 17) if(CMAKE_CXX_STANDARD LESS 17)
#With C++14, use boost to support any and string_view #With C++14, use boost to support any and string_view
message(STATUS "use c++14") message(STATUS "use c++14")
find_package(Boost 1.61.0 REQUIRED) find_package(Boost 1.61.0 REQUIRED)
target_include_directories(simple_reverse_proxy PRIVATE ${Boost_INCLUDE_DIRS}) target_include_directories(DrogonCMS_Reverse_Proxy PRIVATE ${Boost_INCLUDE_DIRS})
else() else()
message(STATUS "use c++17") message(STATUS "use c++17")
endif() endif()
@ -52,5 +52,5 @@ foreach(cspFile ${SCP_LIST})
set(VIEWSRC ${VIEWSRC} ${classname}.cc) set(VIEWSRC ${VIEWSRC} ${classname}.cc)
endforeach() endforeach()
target_include_directories(simple_reverse_proxy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models) target_include_directories(DrogonCMS_Reverse_Proxy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/models)
target_sources(simple_reverse_proxy PRIVATE ${SRC_DIR} ${CTL_SRC} ${FILTER_SRC} ${VIEWSRC} ${PLUGIN_SRC} ${MODEL_SRC}) target_sources(DrogonCMS_Reverse_Proxy PRIVATE ${SRC_DIR} ${CTL_SRC} ${FILTER_SRC} ${VIEWSRC} ${PLUGIN_SRC} ${MODEL_SRC})