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