Skip to content

Commit 871b8a8

Browse files
authored
Merge pull request #496 from minorsecond/develop
BuzzBot - v2.5.0
2 parents 5dda5ae + f8f3e76 commit 871b8a8

37 files changed

+3061
-2533
lines changed

CMakeLists.txt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ IF(APPLE)
1515
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
1616
set(LIBPROC_SRC "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/libproc.h")
1717
ENDIF()
18+
1819
project(BuzzBot)
1920

2021
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
@@ -50,11 +51,11 @@ ENDIF()
5051
set(PROJECT_SRC_FILES src/main.cpp src/mainwindow.cpp src/database.cpp
5152
src/usersettings.cpp src/calculate.cpp src/beer.cpp
5253
src/liquor.cpp src/wine.cpp src/filters.cpp src/about.cpp src/exporters.cpp
53-
src/standard_drink_calculator.cpp src/confirm_dialog.cpp
54+
src/standard_drink_calculator.cpp
5455
src/graphing.cpp include/qcustomplot.cpp
5556
src/table_manipulation.cpp src/stats_updaters.cpp src/utilities.cpp
5657
src/graphing_calculations.cpp src/drink.cpp
57-
src/drink_standards.cpp src/options.cpp)
58+
src/drink_standards.cpp src/options.cpp src/reports.cpp src/reports.h)
5859

5960
IF(APPLE)
6061
add_executable(BuzzBot MACOSX_BUNDLE ${ICON_PATH} ${PROJECT_SRC_FILES})
@@ -77,6 +78,12 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
7778
elseif(CMAKE_BUILD_TYPE MATCHES Release)
7879
message(STATUS "Building release")
7980
add_compile_options(-Wall -Werror -Wextra -gdwarf-2 -O2 -pedantic -Wno-error=deprecated-enum-enum-conversion -Wno-error=extra-semi -Wno-error=old-style-cast)
81+
elseif(CMAKE_BUILD_TYPE MATCHES RelLocalCpu)
82+
add_compile_options(-Wall -Werror -Wextra -gdwarf-2 -O2 -pedantic -Wno-error=deprecated-enum-enum-conversion -Wno-error=extra-semi -Wno-error=old-style-cast)
83+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
84+
elseif(CMAKE_BUILD_TYPE MATCHES AppleM1)
85+
add_compile_options(-Wall -Werror -Wextra -gdwarf-2 -O2 -pedantic -Wno-error=deprecated-enum-enum-conversion -Wno-error=extra-semi -Wno-error=old-style-cast)
86+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=apple-m1")
8087
endif ()
8188

8289
target_precompile_headers(BuzzBot PRIVATE include/sqlite_orm.h)
@@ -92,11 +99,11 @@ IF(APPLE)
9299

93100
set_target_properties(BuzzBot PROPERTIES
94101
MACOSX_BUNDLE_BUNDLE_NAME "BuzzBot"
95-
MACOSX_BUNDLE_BUNDLE_VERSION "v2.4.1"
102+
MACOSX_BUNDLE_BUNDLE_VERSION "2.5.0"
96103
MACOSX_BUNDLE TRUE
97104
MACOSX_BUNDLE_ICON_FILE icon.icns
98-
MACOSX_BUNDLE_LONG_VERSION_STRING "v2.4.1"
99-
MACOSX_BUNDLE_SHORT_VERSION_STRING "v2.4.1"
105+
MACOSX_BUNDLE_LONG_VERSION_STRING "2.5.0"
106+
MACOSX_BUNDLE_SHORT_VERSION_STRING "2.5.0"
100107
MACOSX_BUNDLE_COPYRIGHT "2021 Ross Wardrup"
101108
MACOSX_BUNDLE_GUI_IDENTIFIER com.rwardrup.buzzbot
102109
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@loader_path/Libraries"

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ BuzzBot on Windows
4444
- `git clone https://github.com/minorsecond/BuzzBot.git`
4545
- `cd BuzzBot`
4646
- `mkdir build && cd build`
47-
- `cmake -DCMAKE_BUILD_TYPE=Release ..`
47+
- `cmake -DCMAKE_BUILD_TYPE=Release ..` If you'd like to build the app custom for your CPU, run
48+
`cmake -DCMAKE_BUILD_TYPE=RelLocalCpu`
4849
- `cmake --build . --target BuzzBot`. If you want to run tests, run `cmake --build . --target functions_test`.
4950
- If you're running macOS, you'll have a `BuzzBot.app` file in the `build` directory.
5051
- If you're running Linux, you can install the app in `~/.local/bin` by running `cmake --install .`.

VERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,4 @@
3636
2.3.0 2022-09-20-06-43-55
3737
2.4.0 2022-09-25-12-39-36
3838
v2.4.1 2022-10-01-13-58-02
39+
2.5.0 2022-10-16-15-26-24

Windows_InstallerForge_Config.ifp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ Uninstaller filename = Uninstall
3535
UseCustomDisplayIcon = 0
3636
CustomDisplayIcon = <InstallPath>\
3737
[Licence]
38-
Licence dialog = 0
38+
Licence dialog = 1
3939
[Finish]
4040
Sart program = 1
4141
Reboot computer = 0
@@ -55,7 +55,7 @@ Time = 2
5555
PlaySound = 0
5656
Allow = 0
5757
[Build]
58-
File = C:\Users/rossw\Desktop\BuzzBot-Setup.exe
58+
File = C:\Users\rossw\CLionProjects\BuzzBot\cmake-build-release\BuzzBot-Setup.exe
5959
SetupIconPath = ..\icons\ancient.ico
6060
UninstallIconPath = ..\icons\ancient.ico
6161
CompressionMethod = 0

build_gui.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
/Users/rwardrup/Qt/6.0.0/clang_64/bin/uic ui/about.ui -o ui/ui_about.h
2-
/Users/rwardrup/Qt/6.0.0/clang_64/bin/uic ui/delete_confirm.ui -o ui/ui_delete_confirm.h
3-
/Users/rwardrup/Qt/6.0.0/clang_64/bin/uic ui/mainwindow.ui -o ui/ui_mainwindow.h
4-
/Users/rwardrup/Qt/6.0.0/clang_64/bin/uic ui/standard_drink_calc.ui -o ui/ui_standard_drink_calc.h
5-
/Users/rwardrup/Qt/6.0.0/clang_64/bin/uic ui/user_settings.ui -o ui/ui_user_settings.h
6-
/Users/rwardrup/Qt/6.0.0/clang_64/bin/uic ui/graph_window.ui -o ui/ui_graph_window.h
1+
~/Qt/6.2.4/*/libexec/uic ui/about.ui -o ui/ui_about.h
2+
~/Qt/6.2.4/*/libexec/uic ui/delete_confirm.ui -o ui/ui_delete_confirm.h
3+
~/Qt/6.2.4/*/libexec/uic ui/mainwindow.ui -o ui/ui_mainwindow.h
4+
~/Qt/6.2.4/*/libexec/uic ui/standard_drink_calc.ui -o ui/ui_standard_drink_calc.h
5+
~/Qt/6.2.4/*/libexec/uic ui/user_settings.ui -o ui/ui_user_settings.h
6+
~/Qt/6.2.4/*/libexec/uic ui/graph_window.ui -o ui/ui_graph_window.h

linter.sh

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1 @@
1-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/mainwindow.cpp
2-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/database.cpp
3-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/calculate.cpp
4-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/table_manipulation.cpp
5-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/stats_updaters.cpp
6-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/filters.cpp
7-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/exporters.cpp
8-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/about.cpp
9-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/beer.cpp
10-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/confirm_dialog.cpp
11-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/liquor.cpp
12-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/usersettings.cpp
13-
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/wine.cpp
1+
cppcheck --enable=all --suppress=missingIncludeSystem --check-config src/*

src/about.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ About::About() {
1919
this->setFixedSize(237, 272);
2020

2121
// Version text
22-
const std::string version = "v2.4.1";
22+
const std::string version = "2.5.0";
2323
ui.versionLabel->setText(QString::fromStdString("Version " + version));
2424

2525
// Make Qt URL clickable

src/beer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,9 @@ Drink MainWindow::get_beer_attrs_from_fields(std::string alcohol_type) {
170170
}
171171

172172
const std::string drink_date = ui->beerDateInput->date().toString("yyyy-MM-dd").toStdString();
173+
const int drink_date_int {utilities::date_string_to_date_int(drink_date)};
173174
drink.set_date(drink_date);
175+
drink.set_sort_date(drink_date_int);
174176
drink.set_name(drink_name);;
175177
drink.set_type(ui->beerTypeInput->currentText().toStdString());
176178
drink.set_subtype(ui->beerSubtypeInput->currentText().toStdString());

src/confirm_dialog.cpp

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/confirm_dialog.h

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/database.cpp

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <iostream>
55
#include <filesystem>
66
#include <string>
7+
#include <ctime>
78

89
using namespace sqlite_orm;
910

@@ -238,6 +239,8 @@ int Database::increment_version(Storage storage, int current_version) {
238239
* @return: An integer denoting new DB version, straight from the DB.
239240
*/
240241

242+
populate_date_sort_field(storage);
243+
241244
std::cout << "Using DB version " << storage.pragma.user_version() << std::endl;
242245
const int version = get_version(storage);
243246
if (version < 8 && current_version == 9) { //version 9 implements the new size column and version 10 will remove the _size column
@@ -336,3 +339,94 @@ DbMoveStatus Database::move_db(const std::string &current_path, const std::strin
336339

337340
return DbMoveStatus::ErrorCopyingDb;
338341
}
342+
343+
std::vector<Drink> Database::report_query(Storage &storage, const unsigned rating, const unsigned num,
344+
const std::string& types, const std::string& start_date,
345+
const std::string& end_date) {
346+
/*
347+
* Run a top n query for reports.
348+
* @param num: number of results to get
349+
* @param types: All, Beer, Liquor, or Wine
350+
* @param start_date: Start date of query
351+
* @parma end_date: End date of query
352+
* @return: a vector of Drink objects within the query parameters
353+
*/
354+
355+
const int start_date_int {utilities::date_string_to_date_int(start_date)};
356+
const int end_date_int {utilities::date_string_to_date_int(end_date)};
357+
std::vector<std::tuple<std::unique_ptr<int, std::default_delete<int>>, std::string, std::string, std::string, std::string, int>> query_r{};
358+
std::vector<Drink> drinks{};
359+
360+
if (types == "All Types") {
361+
query_r = storage.select(columns(
362+
sqlite_orm::max(&Drink::id),
363+
&Drink::name,
364+
&Drink::type,
365+
&Drink::subtype,
366+
&Drink::producer,
367+
&Drink::rating),
368+
where(c(&Drink::rating) >= rating
369+
and c(&Drink::sort_date) >= start_date_int
370+
and c(&Drink::sort_date) <= end_date_int),
371+
sqlite_orm::group_by(&Drink::name),
372+
sqlite_orm::order_by(sqlite_orm::cast<int>(&Drink::rating)).desc(),
373+
sqlite_orm::limit(num));
374+
} else {
375+
query_r = storage.select(columns(
376+
sqlite_orm::max(&Drink::id),
377+
&Drink::name,
378+
&Drink::type,
379+
&Drink::subtype,
380+
&Drink::producer,
381+
&Drink::rating),
382+
where(c(&Drink::rating) >= rating
383+
and c(&Drink::sort_date) >= start_date_int
384+
and c(&Drink::sort_date) <= end_date_int
385+
and c(&Drink::alcohol_type) == types),
386+
sqlite_orm::group_by(&Drink::name),
387+
sqlite_orm::order_by(sqlite_orm::cast<int>(&Drink::rating)).desc(),
388+
sqlite_orm::limit(num));
389+
}
390+
391+
for (const auto &drink : query_r) {
392+
const int _pkey {*std::get<0>(drink).get()};
393+
const std::string _drink_name {std::get<1>(drink)};
394+
const std::string _drink_type {std::get<2>(drink)};
395+
const std::string _drink_subtype {std::get<3>(drink)};
396+
const std::string _drink_producer {std::get<4>(drink)};
397+
const int _rating {std::get<5>(drink)};
398+
399+
Drink _drink{};
400+
_drink.set_id(_pkey);
401+
_drink.set_name(_drink_name);
402+
_drink.set_type(_drink_type);
403+
_drink.set_subtype(_drink_subtype);
404+
_drink.set_producer(_drink_producer);
405+
_drink.set_rating(_rating);
406+
drinks.push_back(_drink);
407+
};
408+
409+
return drinks;
410+
}
411+
412+
void Database::populate_date_sort_field(Storage &storage) {
413+
for (Drink &drink : storage.get_all<Drink>()) {
414+
const int date_int {utilities::date_string_to_date_int(drink.get_date())};
415+
416+
if(drink.get_sort_date() != date_int) {
417+
drink.set_sort_date(date_int);
418+
storage.update(drink);
419+
}
420+
}
421+
}
422+
423+
Drink Database::get_drink_at_place(Storage &storage, RecordPlace place) {
424+
int id {};
425+
if (place == RecordPlace::First) {
426+
id = *storage.min(&Drink::id).get();
427+
} else if (place == RecordPlace::Last) {
428+
id = *storage.max(&Drink::id).get();
429+
}
430+
431+
return storage.get_all<Drink>(where(c(&Drink::id) == id)).at(0);
432+
}

src/database.h

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ inline auto initStorage(const std::string &file_name) {
1818
*/
1919

2020
const std::string table_name = "drinks";
21+
22+
// WARNING: When adding columns, if a default value isn't specified, the database will be erased!
2123
return sqlite_orm::make_storage(file_name,
2224
sqlite_orm::make_table(table_name,
2325
sqlite_orm::make_column("id", &Drink::id,
@@ -51,14 +53,24 @@ inline auto initStorage(const std::string &file_name) {
5153
&Drink::timestamp,
5254
sqlite_orm::default_value(
5355
sqlite_orm::datetime(
54-
"now", "localtime")))));
56+
"now", "localtime"))),
57+
sqlite_orm::make_column("sort_date",
58+
&Drink::sort_date,
59+
sqlite_orm::default_value(
60+
utilities::date_string_to_date_int(
61+
utilities::get_local_date())
62+
))));
5563
}
5664

5765
using Storage = decltype(initStorage(""));
5866

5967
class Database {
6068
public:
61-
static const int db_version {8};
69+
enum class RecordPlace {
70+
First,
71+
Last
72+
};
73+
static const int db_version {9};
6274
static std::vector<Drink> read(Storage storage);
6375
static Storage write(Drink drink, Storage storage);
6476
static void truncate(Storage storage);
@@ -76,12 +88,14 @@ class Database {
7688
static int increment_version(Storage storage, int current_version);
7789
static void sort_by_date_id(std::vector<Drink> &drinks);
7890
static std::string get_latest_notes(Storage &storage, const std::string& name, const std::string& alcohol_type);
91+
static std::vector<Drink> report_query(Storage &storage, const unsigned rating, const unsigned num,
92+
const std::string& types, const std::string& start_date, const std::string& end_date);
93+
static Drink get_drink_at_place(Storage &storage, RecordPlace place);
94+
static DbMoveStatus move_db(const std::string &current_path, const std::string &new_path);
7995

8096
private:
8197
static bool compare_date(const Drink &a, const Drink &b);
82-
83-
public:
84-
static DbMoveStatus move_db(const std::string &current_path, const std::string &new_path);
98+
static void populate_date_sort_field(Storage &storage);
8599
};
86100

87101
#endif // DATABASE_H

0 commit comments

Comments
 (0)