summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--api/plugin-api.hpp2
-rw-r--r--compat/correlation-calibrator.hpp26
-rw-r--r--compat/mutex.hpp4
-rw-r--r--cv/numeric.hpp4
-rw-r--r--cv/translation-calibrator.cpp2
-rw-r--r--cv/translation-calibrator.hpp8
-rw-r--r--dinput/win32-joystick.hpp14
-rw-r--r--filter-accela/ftnoir_filter_accela.cpp14
-rw-r--r--filter-accela/ftnoir_filter_accela.h6
-rw-r--r--filter-accela/ftnoir_filter_accela_dialog.cpp4
-rw-r--r--filter-ewma2/ftnoir_filter_ewma2.cpp2
-rw-r--r--filter-kalman/kalman.h14
-rw-r--r--gui/process_detector.cpp4
-rw-r--r--options/base-value.hpp2
-rw-r--r--options/connector.cpp7
-rw-r--r--options/connector.hpp14
-rw-r--r--options/value-traits.hpp3
-rw-r--r--pose-widget/pose-widget.hpp2
-rw-r--r--tracker-aruco/ftnoir_tracker_aruco.h18
-rw-r--r--tracker-joystick/ftnoir_tracker_joystick.h2
-rw-r--r--tracker-pt/module/camera.h2
-rw-r--r--tracker-pt/module/point_extractor.h2
-rw-r--r--tracker-pt/point_tracker.h2
-rw-r--r--tracker-steamvr/steamvr.hpp2
-rw-r--r--variant/trackmouse/window.hpp2
25 files changed, 79 insertions, 83 deletions
diff --git a/api/plugin-api.hpp b/api/plugin-api.hpp
index a4573c85..1bfce7d5 100644
--- a/api/plugin-api.hpp
+++ b/api/plugin-api.hpp
@@ -120,7 +120,7 @@ struct OTR_API_EXPORT IFilter : module_status_mixin
IFilter();
// optional destructor
- virtual ~IFilter();
+ ~IFilter() override;
// perform filtering step.
// you have to take care of dt on your own, try "opentrack-compat/timer.hpp"
virtual void filter(const double *input, double *output) = 0;
diff --git a/compat/correlation-calibrator.hpp b/compat/correlation-calibrator.hpp
index cc168fcd..44aee537 100644
--- a/compat/correlation-calibrator.hpp
+++ b/compat/correlation-calibrator.hpp
@@ -9,7 +9,7 @@
namespace correlation_calibrator_impl {
-static constexpr inline double min[6] = {
+static constexpr double min[6] = {
-50,
-50,
250,
@@ -19,7 +19,7 @@ static constexpr inline double min[6] = {
-180,
};
-static constexpr inline double max[6] = {
+static constexpr double max[6] = {
50,
50,
250,
@@ -29,18 +29,18 @@ static constexpr inline double max[6] = {
180,
};
-static constexpr inline double yaw_spacing_in_degrees = 1.5;
-static constexpr inline double pitch_spacing_in_degrees = 1;
-static constexpr inline double roll_spacing_in_degrees = 1;
+static constexpr double yaw_spacing_in_degrees = 1.5;
+static constexpr double pitch_spacing_in_degrees = 1;
+static constexpr double roll_spacing_in_degrees = 1;
-static constexpr inline unsigned yaw_nbuckets = unsigned(1+ 360./yaw_spacing_in_degrees);
-static constexpr inline unsigned pitch_nbuckets = unsigned(1+ 360./pitch_spacing_in_degrees);
-static constexpr inline unsigned roll_nbuckets = unsigned(1+ 360./roll_spacing_in_degrees);
+static constexpr unsigned yaw_nbuckets = unsigned(1+ 360./yaw_spacing_in_degrees);
+static constexpr unsigned pitch_nbuckets = unsigned(1+ 360./pitch_spacing_in_degrees);
+static constexpr unsigned roll_nbuckets = unsigned(1+ 360./roll_spacing_in_degrees);
-static constexpr inline double translation_spacing = .25;
-static constexpr inline unsigned x_nbuckets = unsigned(1+ (max[0]-min[0])/translation_spacing);
-static constexpr inline unsigned y_nbuckets = unsigned(1+ (max[1]-min[1])/translation_spacing);
-static constexpr inline unsigned z_nbuckets = unsigned(1+ (max[2]-min[2])/translation_spacing);
+static constexpr double translation_spacing = .25;
+static constexpr unsigned x_nbuckets = unsigned(1+ (max[0]-min[0])/translation_spacing);
+static constexpr unsigned y_nbuckets = unsigned(1+ (max[1]-min[1])/translation_spacing);
+static constexpr unsigned z_nbuckets = unsigned(1+ (max[2]-min[2])/translation_spacing);
using vec6 = Mat<double, 6, 1>;
using mat66 = Mat<double, 6, 6>;
@@ -68,7 +68,7 @@ public:
mat66 get_coefficients() const;
unsigned sample_count() const;
- static constexpr inline unsigned min_samples = 25;
+ static constexpr unsigned min_samples = 25;
};
} // ns correlation_calibrator_impl
diff --git a/compat/mutex.hpp b/compat/mutex.hpp
index e142fd0b..e4d0fee6 100644
--- a/compat/mutex.hpp
+++ b/compat/mutex.hpp
@@ -10,8 +10,8 @@ class OTR_COMPAT_EXPORT mutex
public:
using RecursionMode = QMutex::RecursionMode;
- static constexpr inline RecursionMode Recursive = RecursionMode::Recursive;
- static constexpr inline RecursionMode NonRecursive = RecursionMode::NonRecursive;
+ static constexpr RecursionMode Recursive = RecursionMode::Recursive;
+ static constexpr RecursionMode NonRecursive = RecursionMode::NonRecursive;
mutex& operator=(const mutex& datum);
mutex(const mutex& datum);
diff --git a/cv/numeric.hpp b/cv/numeric.hpp
index 87fe7a69..ce8f7e82 100644
--- a/cv/numeric.hpp
+++ b/cv/numeric.hpp
@@ -8,8 +8,8 @@ namespace numeric_types {
static_assert(std::is_floating_point_v<f>);
- static constexpr inline f eps = f(1e-8);
- static constexpr inline f pi = f(M_PI);
+ static constexpr f eps = f(1e-8);
+ static constexpr f pi = f(M_PI);
template<int n> using vec = cv::Vec<f, n>;
using vec2 = vec<2>;
diff --git a/cv/translation-calibrator.cpp b/cv/translation-calibrator.cpp
index 9ead888e..8117b1e7 100644
--- a/cv/translation-calibrator.cpp
+++ b/cv/translation-calibrator.cpp
@@ -80,7 +80,7 @@ tt TranslationCalibrator::get_estimate()
};
}
-static constexpr inline double r2d = 180/M_PI;
+static constexpr double r2d = 180/M_PI;
bool TranslationCalibrator::check_bucket(const cv::Matx33d& R_CM_k)
{
diff --git a/cv/translation-calibrator.hpp b/cv/translation-calibrator.hpp
index da052526..406edb72 100644
--- a/cv/translation-calibrator.hpp
+++ b/cv/translation-calibrator.hpp
@@ -41,8 +41,8 @@ public:
// we're bringing in 3DOF samples but the calibrator only
// checks yaw and pitch
- static constexpr inline unsigned num_cal_axis = 3;
- static constexpr inline unsigned num_nsample_axis = 2;
+ static constexpr unsigned num_cal_axis = 3;
+ static constexpr unsigned num_nsample_axis = 2;
using cv_cal_vec = cv::Vec<float, num_cal_axis>;
using cv_nsample_vec = cv::Vec<unsigned, num_nsample_axis>;
@@ -51,6 +51,6 @@ public:
// get the current estimate for t_MH
tt get_estimate();
- static constexpr inline double yaw_spacing_in_degrees = 2;
- static constexpr inline double pitch_spacing_in_degrees = 1.5;
+ static constexpr double yaw_spacing_in_degrees = 2;
+ static constexpr double pitch_spacing_in_degrees = 1.5;
};
diff --git a/dinput/win32-joystick.hpp b/dinput/win32-joystick.hpp
index 59ec0c49..331e4968 100644
--- a/dinput/win32-joystick.hpp
+++ b/dinput/win32-joystick.hpp
@@ -23,22 +23,22 @@
namespace win32_joy_impl {
-static constexpr inline unsigned max_buttons = std::size(DIJOYSTATE2().rgbButtons);
-static constexpr inline unsigned max_pov_hats = std::size(DIJOYSTATE2().rgdwPOV);
+static constexpr unsigned max_buttons = std::size(DIJOYSTATE2().rgbButtons);
+static constexpr unsigned max_pov_hats = std::size(DIJOYSTATE2().rgdwPOV);
-static constexpr inline unsigned pov_hat_directions = 8;
+static constexpr unsigned pov_hat_directions = 8;
// cf. https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee416628(v=vs.85)
// see also remarks on the page
// no need to check for pos == unsigned(-1) || pos == 0xffff,
// this logic doesn't require that
-static constexpr inline unsigned value_per_pov_hat_direction = 36000 / pov_hat_directions;
-static constexpr inline unsigned max_buttons_and_pov_hats = max_buttons + max_pov_hats * pov_hat_directions;
+static constexpr unsigned value_per_pov_hat_direction = 36000 / pov_hat_directions;
+static constexpr unsigned max_buttons_and_pov_hats = max_buttons + max_pov_hats * pov_hat_directions;
//static_assert(pov_hat_directions == 4 || pov_hat_directions == 8);
// XXX how many axis update events can we reasonably get in a short time frame?
-static constexpr inline unsigned num_buffers = 16;
+static constexpr unsigned num_buffers = 16;
//#define WIN32_JOY_DEBUG
@@ -63,7 +63,7 @@ struct OTR_DINPUT_EXPORT win32_joy_ctx final
using joys_t = std::unordered_map<QString, std::shared_ptr<joy>>;
- static constexpr inline int joy_axis_size = 65536;
+ static constexpr int joy_axis_size = 65536;
struct joy_info
{
diff --git a/filter-accela/ftnoir_filter_accela.cpp b/filter-accela/ftnoir_filter_accela.cpp
index 56ac9b5c..9e973586 100644
--- a/filter-accela/ftnoir_filter_accela.cpp
+++ b/filter-accela/ftnoir_filter_accela.cpp
@@ -31,7 +31,7 @@ static void do_deltas(const double* deltas, double* output, F&& fun)
dist += deltas[k]*deltas[k];
dist = sqrt(dist);
- const double value = double(fun(dist));
+ const double value = fun(dist);
for (unsigned k = 0; k < N; k++)
{
@@ -82,14 +82,14 @@ void accela::filter(const double* input, double *output)
return;
}
- const double rot_thres { s.rot_smoothing };
- const double pos_thres { s.pos_smoothing };
+ const double rot_thres{s.rot_smoothing};
+ const double pos_thres{s.pos_smoothing};
const double dt = t.elapsed_seconds();
t.start();
- const double rot_dz = s.rot_deadzone.to<double>();
- const double pos_dz = s.pos_deadzone.to<double>();
+ const double rot_dz{ s.rot_deadzone};
+ const double pos_dz{ s.pos_deadzone};
// rot
@@ -142,10 +142,10 @@ void settings_accela::make_splines(spline& rot, spline& pos)
rot.clear(); pos.clear();
for (const auto& val : rot_gains)
- rot.add_point(QPointF(val.x, val.y));
+ rot.add_point({ val.x, val.y });
for (const auto& val : pos_gains)
- pos.add_point(QPointF(val.x, val.y));
+ pos.add_point({ val.x, val.y });
}
OPENTRACK_DECLARE_FILTER(accela, dialog_accela, accelaDll)
diff --git a/filter-accela/ftnoir_filter_accela.h b/filter-accela/ftnoir_filter_accela.h
index a3f93756..9112b0b8 100644
--- a/filter-accela/ftnoir_filter_accela.h
+++ b/filter-accela/ftnoir_filter_accela.h
@@ -17,6 +17,8 @@
#include <QMutex>
#include <QTimer>
+//#define DEBUG_ACCELA
+
class accela : public IFilter
{
public:
@@ -57,6 +59,6 @@ class accelaDll : public Metadata
{
Q_OBJECT
- QString name() { return tr("Accela"); }
- QIcon icon() { return QIcon(":/images/filter-16.png"); }
+ QString name() override { return tr("Accela"); }
+ QIcon icon() override { return QIcon(":/images/filter-16.png"); }
};
diff --git a/filter-accela/ftnoir_filter_accela_dialog.cpp b/filter-accela/ftnoir_filter_accela_dialog.cpp
index 51c31ca4..d63f27fd 100644
--- a/filter-accela/ftnoir_filter_accela_dialog.cpp
+++ b/filter-accela/ftnoir_filter_accela_dialog.cpp
@@ -42,7 +42,7 @@ dialog_accela::dialog_accela()
QDialog dr;
spline_widget r(&dr);
dr.setWindowTitle("Accela rotation gain"); r.set_preview_only(true); r.setEnabled(true);
- r.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); r.setConfig(&rot);
+ r.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); r.set_config(&rot);
r.setFixedSize(1024, 600);
dr.show();
dr.exec();
@@ -52,7 +52,7 @@ dialog_accela::dialog_accela()
QDialog dt;
spline_widget t(&dt);
dt.setWindowTitle("Accela translation gain"); t.set_preview_only(true); t.setEnabled(true);
- dt.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); t.setConfig(&pos);
+ dt.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); t.set_config(&pos);
t.setFixedSize(1024, 600);
dt.show();
dt.exec();
diff --git a/filter-ewma2/ftnoir_filter_ewma2.cpp b/filter-ewma2/ftnoir_filter_ewma2.cpp
index 46c4796d..ce6cd040 100644
--- a/filter-ewma2/ftnoir_filter_ewma2.cpp
+++ b/filter-ewma2/ftnoir_filter_ewma2.cpp
@@ -48,7 +48,7 @@ void ewma::filter(const double *input, double *output)
// scale curve .01->1 where 1.0 is sqrt(norm_noise).
const double smoothing_scale_curve = *s.kSmoothingScaleCurve;
// min/max smoothing .01->1
- const double min_smoothing = *s.kMinSmoothing;
+ const double min_smoothing{s.kMinSmoothing};
const double max_smoothing = std::fmax(min_smoothing, *s.kMaxSmoothing);
// Calculate the new camera position.
diff --git a/filter-kalman/kalman.h b/filter-kalman/kalman.h
index ad5e3e20..2d8db86e 100644
--- a/filter-kalman/kalman.h
+++ b/filter-kalman/kalman.h
@@ -26,8 +26,8 @@ using namespace options;
#include <QString>
#include <QWidget>
-static constexpr inline int NUM_STATE_DOF = 12;
-static constexpr inline int NUM_MEASUREMENT_DOF = 6;
+static constexpr int NUM_STATE_DOF = 12;
+static constexpr int NUM_MEASUREMENT_DOF = 6;
// These vectors are compile time fixed size, stack allocated
using StateToMeasureMatrix = Eigen::Matrix<double, NUM_MEASUREMENT_DOF, NUM_STATE_DOF>;
using StateMatrix = Eigen::Matrix<double, NUM_STATE_DOF, NUM_STATE_DOF>;
@@ -86,11 +86,11 @@ struct settings : opts {
value<slider_value> noise_rot_slider_value { b, "noise-rotation-slider", { .5, 0, 1 } };
value<slider_value> noise_pos_slider_value { b, "noise-position-slider", { .5, 0, 1 } };
- static constexpr inline double adaptivity_window_length = 0.25; // seconds
- static constexpr inline double deadzone_scale = 8;
- static constexpr inline double deadzone_exponent = 2.0;
- static constexpr inline double process_sigma_pos = 0.5;
- static constexpr inline double process_sigma_rot = 0.5;
+ static constexpr double adaptivity_window_length = 0.25; // seconds
+ static constexpr double deadzone_scale = 8;
+ static constexpr double deadzone_exponent = 2.0;
+ static constexpr double process_sigma_pos = 0.5;
+ static constexpr double process_sigma_rot = 0.5;
static double map_slider_value(const slider_value &v);
diff --git a/gui/process_detector.cpp b/gui/process_detector.cpp
index ef65ca9a..67b05c7c 100644
--- a/gui/process_detector.cpp
+++ b/gui/process_detector.cpp
@@ -20,8 +20,8 @@
#include <QSettings>
#include <QtEvents>
-static constexpr inline auto RECORD_SEPARATOR = QChar(char(0x1e)); // RS ^]
-static constexpr inline auto UNIT_SEPARATOR = QChar(char(0x1f)); // US ^_
+static constexpr auto RECORD_SEPARATOR = QChar(char(0x1e)); // RS ^]
+static constexpr auto UNIT_SEPARATOR = QChar(char(0x1f)); // US ^_
using namespace options;
using namespace options::globals;
diff --git a/options/base-value.hpp b/options/base-value.hpp
index 11d17c00..7a3ac420 100644
--- a/options/base-value.hpp
+++ b/options/base-value.hpp
@@ -17,7 +17,7 @@
#include <utility>
-#define OTR_OPTIONS_SLOT(t) void setValue(t datum) { store_(datum); }
+#define OTR_OPTIONS_SLOT(t) void setValue(t datum) noexcept { store_(datum); }
#define OTR_OPTIONS_SIGNAL(t) void valueChanged(t) const
namespace options {
diff --git a/options/connector.cpp b/options/connector.cpp
index 90770167..35d408d5 100644
--- a/options/connector.cpp
+++ b/options/connector.cpp
@@ -78,4 +78,11 @@ void connector::notify_all_values() const
val->notify();
}
+void connector::set_all_to_default_()
+{
+ for (auto& pair : connected_values)
+ for (auto& val : pair.second)
+ val->set_to_default();
+}
+
} // ns options::detail
diff --git a/options/connector.hpp b/options/connector.hpp
index 11aa94da..e22cb20f 100644
--- a/options/connector.hpp
+++ b/options/connector.hpp
@@ -39,23 +39,11 @@ protected:
void notify_values(const QString& name) const;
void notify_all_values() const;
virtual QMutex* get_mtx() const = 0;
-
- template<typename F>
- void forall(F&& fun)
- {
- QMutexLocker l(get_mtx());
-
- for (auto& pair : connected_values)
- for (auto& val : pair.second)
- fun(val);
- }
+ void set_all_to_default_();
public:
connector();
virtual ~connector();
-
- connector(const connector&) = default;
- connector& operator=(const connector&) = default;
};
} // ns options::detail
diff --git a/options/value-traits.hpp b/options/value-traits.hpp
index 21e00d80..aeb34cfa 100644
--- a/options/value-traits.hpp
+++ b/options/value-traits.hpp
@@ -45,8 +45,7 @@ struct default_value_traits
return self::qvariant_from_storage(self::storage_from_value(val));
}
- static constexpr inline
- value_type pass_value(const value_type& x)
+ static constexpr value_type pass_value(const value_type& x)
{
if constexpr(std::is_same_v<value_type, stored_type>)
return x;
diff --git a/pose-widget/pose-widget.hpp b/pose-widget/pose-widget.hpp
index 4a97b789..87367b96 100644
--- a/pose-widget/pose-widget.hpp
+++ b/pose-widget/pose-widget.hpp
@@ -85,7 +85,7 @@ struct pose_transform final : QThread
std::vector<uv_> uv_vec;
std::atomic<bool> fresh;
- static constexpr inline int w = 320, h = 240;
+ static constexpr int w = 320, h = 240;
};
class OTR_POSE_WIDGET_EXPORT pose_widget final : public QWidget
diff --git a/tracker-aruco/ftnoir_tracker_aruco.h b/tracker-aruco/ftnoir_tracker_aruco.h
index 2c2a1e05..1d6fd107 100644
--- a/tracker-aruco/ftnoir_tracker_aruco.h
+++ b/tracker-aruco/ftnoir_tracker_aruco.h
@@ -67,7 +67,7 @@ struct settings : opts {
class aruco_tracker : protected virtual QThread, public ITracker
{
Q_OBJECT
- static constexpr inline float c_search_window = 1.3f;
+ static constexpr float c_search_window = 1.3f;
public:
aruco_tracker();
~aruco_tracker() override;
@@ -120,21 +120,21 @@ private:
bool use_otsu = false;
#if !defined USE_EXPERIMENTAL_CANNY
- static constexpr inline int adaptive_thres = 6;
+ static constexpr int adaptive_thres = 6;
#else
- static constexpr inline int adaptive_thres = 3;
+ static constexpr int adaptive_thres = 3;
#endif
- static constexpr inline double timeout = .35;
- static constexpr inline double timeout_backoff_c = .25;
+ static constexpr double timeout = .35;
+ static constexpr double timeout_backoff_c = .25;
- static constexpr inline float size_min = 0.05f;
- static constexpr inline float size_max = 0.5f;
+ static constexpr float size_min = 0.05f;
+ static constexpr float size_max = 0.5f;
- static constexpr inline double RC = .25;
+ static constexpr double RC = .25;
#ifdef DEBUG_UNSHARP_MASKING
- static constexpr inline double gauss_kernel_size = 3;
+ static constexpr double gauss_kernel_size = 3;
cv::Mat blurred;
#endif
};
diff --git a/tracker-joystick/ftnoir_tracker_joystick.h b/tracker-joystick/ftnoir_tracker_joystick.h
index 2fd1068f..d59c70de 100644
--- a/tracker-joystick/ftnoir_tracker_joystick.h
+++ b/tracker-joystick/ftnoir_tracker_joystick.h
@@ -45,7 +45,7 @@ public:
void data(double *data);
settings s;
QString guid;
- static constexpr inline int AXIS_MAX = win32_joy_ctx::joy_axis_size;
+ static constexpr int AXIS_MAX = win32_joy_ctx::joy_axis_size;
win32_joy_ctx joy_ctx;
};
diff --git a/tracker-pt/module/camera.h b/tracker-pt/module/camera.h
index 69b2f860..2ea633d0 100644
--- a/tracker-pt/module/camera.h
+++ b/tracker-pt/module/camera.h
@@ -56,7 +56,7 @@ private:
pt_settings s;
- static constexpr inline f dt_eps = f{1}/256;
+ static constexpr f dt_eps = f{1}/256;
};
} // ns pt_module
diff --git a/tracker-pt/module/point_extractor.h b/tracker-pt/module/point_extractor.h
index 06948ac7..a6103667 100644
--- a/tracker-pt/module/point_extractor.h
+++ b/tracker-pt/module/point_extractor.h
@@ -36,7 +36,7 @@ public:
void extract_points(const pt_frame& frame, pt_preview& preview_frame, std::vector<vec2>& points) override;
PointExtractor(const QString& module_name);
private:
- static constexpr inline int max_blobs = 16;
+ static constexpr int max_blobs = 16;
pt_settings s;
diff --git a/tracker-pt/point_tracker.h b/tracker-pt/point_tracker.h
index c39774cd..6f3e0cee 100644
--- a/tracker-pt/point_tracker.h
+++ b/tracker-pt/point_tracker.h
@@ -32,7 +32,7 @@ using namespace numeric_types;
struct PointModel final
{
- static constexpr inline unsigned N_POINTS = 3;
+ static constexpr unsigned N_POINTS = 3;
vec3 M01; // M01 in model frame
vec3 M02; // M02 in model frame
diff --git a/tracker-steamvr/steamvr.hpp b/tracker-steamvr/steamvr.hpp
index 8c76ad17..1a16f002 100644
--- a/tracker-steamvr/steamvr.hpp
+++ b/tracker-steamvr/steamvr.hpp
@@ -56,7 +56,7 @@ struct device_list final
static cc_noinline maybe_pose get_pose(int k);
static QString error_string(vr_error_t error);
- static constexpr inline unsigned max_devices = vr::k_unMaxTrackedDeviceCount;
+ static constexpr unsigned max_devices = vr::k_unMaxTrackedDeviceCount;
template<typename F>
friend auto with_vr_lock(F&& fun) -> decltype(fun(vr_t(), vr_error_t()));
diff --git a/variant/trackmouse/window.hpp b/variant/trackmouse/window.hpp
index fd5d5f44..2c196852 100644
--- a/variant/trackmouse/window.hpp
+++ b/variant/trackmouse/window.hpp
@@ -70,7 +70,7 @@ class main_window final : public QMainWindow, private State
bool maybe_die_on_config_not_writable(const QString& current);
void die_on_config_not_writable();
- static constexpr inline int save_settings_interval_ms = 2500;
+ static constexpr int save_settings_interval_ms = 2500;
private slots:
void save_modules();