File indexing completed on 2024-05-19 04:29:31

0001 /*
0002  *  SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef KISWIDGETCONNECTIONUTILS_H
0008 #define KISWIDGETCONNECTIONUTILS_H
0009 
0010 #include <QMetaType>
0011 #include <QStringList>
0012 
0013 #include "kritawidgets_export.h"
0014 
0015 class QAbstractButton;
0016 class QAction;
0017 class QComboBox;
0018 class QButtonGroup;
0019 class QSpinBox;
0020 class QDoubleSpinBox;
0021 class QObject;
0022 class KisSpacingSelectionWidget;
0023 class KisAngleSelector;
0024 class QLineEdit;
0025 class KisMultipliersDoubleSliderSpinBox;
0026 class KisFileNameRequester;
0027 
0028 namespace KisWidgetConnectionUtils {
0029 
0030 template<typename T>
0031 struct ControlState {
0032     T value = T{};
0033     bool enabled = true;
0034 };
0035 
0036 struct ToControlState {
0037     template<typename T>
0038     ControlState<std::decay_t<T>> operator()(T &&value, bool enabled) {
0039         return {std::forward<T>(value), enabled};
0040     }
0041 };
0042 
0043 using CheckBoxState = ControlState<bool>;
0044 using ButtonGroupState = ControlState<int>;
0045 
0046 struct ComboBoxState {
0047     QStringList items;
0048     int currentIndex = -1;
0049     bool enabled = true;
0050     QStringList toolTips;
0051 };
0052 
0053 struct SpacingState {
0054     qreal spacing = 0.05;
0055     bool useAutoSpacing = false;
0056     qreal autoSpacingCoeff = 1.0;
0057 };
0058 
0059 struct ToSpacingState {
0060     SpacingState operator() (qreal spacing, bool useAutoSpacing, qreal autoSpacingCoeff) {
0061         return {spacing, useAutoSpacing, autoSpacingCoeff};
0062     }
0063 };
0064 
0065 struct FromSpacingState {
0066     std::tuple<qreal, bool, qreal> operator() (const SpacingState &x) {
0067         return {x.spacing, x.useAutoSpacing, x.autoSpacingCoeff};
0068     }
0069 };
0070 
0071 template <typename T>
0072 struct SpinBoxState {
0073     T value = T{};
0074     T min = T{};
0075     T max = T{};
0076     bool enabled = true;
0077 };
0078 
0079 struct ToSpinBoxState {
0080     template <typename T>
0081     SpinBoxState<std::decay_t<T>> operator()(T &&value, T &&min, T &&max, bool enabled) {
0082         return {std::forward<T>(value), std::forward<T>(min), std::forward<T>(max), enabled};
0083     }
0084 };
0085 
0086 using IntSpinBoxState = SpinBoxState<int>;
0087 using DoubleSpinBoxState = SpinBoxState<qreal>;
0088 
0089 void KRITAWIDGETS_EXPORT connectControl(QAbstractButton *button, QObject *source, const char *property);
0090 void KRITAWIDGETS_EXPORT connectControl(QAction *button, QObject *source, const char *property);
0091 void KRITAWIDGETS_EXPORT connectControl(QSpinBox *spinBox, QObject *source, const char *property);
0092 void KRITAWIDGETS_EXPORT connectControl(QDoubleSpinBox *spinBox, QObject *source, const char *property);
0093 void KRITAWIDGETS_EXPORT connectControlState(QDoubleSpinBox *spinBox, QObject *source, const char *readStateProperty, const char *writeProperty);
0094 void KRITAWIDGETS_EXPORT connectControlState(QSpinBox *spinBox, QObject *source, const char *readStateProperty, const char *writeProperty);
0095 void KRITAWIDGETS_EXPORT connectControl(KisMultipliersDoubleSliderSpinBox *spinBox, QObject *source, const char *property);
0096 void KRITAWIDGETS_EXPORT connectControl(QButtonGroup *button, QObject *source, const char *property);
0097 void KRITAWIDGETS_EXPORT connectControl(QComboBox *button, QObject *source, const char *property);
0098 void KRITAWIDGETS_EXPORT connectControl(QComboBox *button, QObject *source, const char *property);
0099 void KRITAWIDGETS_EXPORT connectControlState(QAbstractButton *button, QObject *source, const char *readStateProperty, const char *writeProperty);
0100 void KRITAWIDGETS_EXPORT connectControlState(QButtonGroup *group, QObject *source, const char *readStateProperty, const char *writeProperty);
0101 void KRITAWIDGETS_EXPORT connectControlState(QComboBox *button, QObject *source, const char *readStateProperty, const char *writeProperty);
0102 void KRITAWIDGETS_EXPORT connectControl(KisSpacingSelectionWidget *widget, QObject *source, const char *property);
0103 void KRITAWIDGETS_EXPORT connectControl(KisAngleSelector *widget, QObject *source, const char *property);
0104 void KRITAWIDGETS_EXPORT connectControl(QLineEdit *widget, QObject *source, const char *property);
0105 void KRITAWIDGETS_EXPORT connectControl(KisFileNameRequester *widget, QObject *source, const char *property);
0106 void KRITAWIDGETS_EXPORT connectWidgetVisibleToProperty(QWidget* widget, QObject* source, const char* property);
0107 
0108 
0109 } // namespace KisWidgetConnectionUtils
0110 
0111 using KisWidgetConnectionUtils::CheckBoxState;
0112 using KisWidgetConnectionUtils::ButtonGroupState;
0113 using KisWidgetConnectionUtils::ComboBoxState;
0114 using KisWidgetConnectionUtils::SpacingState;
0115 using KisWidgetConnectionUtils::DoubleSpinBoxState;
0116 using KisWidgetConnectionUtils::IntSpinBoxState;
0117 
0118 Q_DECLARE_METATYPE(CheckBoxState)
0119 Q_DECLARE_METATYPE(ButtonGroupState)
0120 Q_DECLARE_METATYPE(ComboBoxState)
0121 Q_DECLARE_METATYPE(SpacingState)
0122 Q_DECLARE_METATYPE(DoubleSpinBoxState)
0123 Q_DECLARE_METATYPE(IntSpinBoxState)
0124 
0125 
0126 #endif // KISWIDGETCONNECTIONUTILS_H