Files
qad/libs/piqt_utils/pivaluetree_edit.h

151 lines
4.3 KiB
C++

/*
PIQt Utils - Qt utilites for PIP
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef pivaluetree_edit_H
#define pivaluetree_edit_H
#include "pivaluetree.h"
#include "qad_piqt_utils_export.h"
#include <QIcon>
#include <QLabel>
#include <QMenu>
#include <QWidget>
class QGridLayout;
class QToolButton;
class QTabWidget;
class PIVariantEdit;
class PIValueTreeEditParameters;
class PIValueTreeEditReorder;
namespace Ui {
class PIValueTreeEditArray;
}
class QAD_PIQT_UTILS_EXPORT PIValueTreeEdit: public QWidget {
Q_OBJECT
Q_ENUMS(Grouping)
public:
PIValueTreeEdit(QWidget * parent = nullptr);
~PIValueTreeEdit();
enum Grouping {
Indent,
Groups,
Tabs,
Parent = 0xFF
};
void setValue(const PIValueTree & v);
PIValueTree value() const;
Grouping grouping() const { return cur_grouping; }
void setGrouping(Grouping g);
bool isFullEditMode() const { return is_full_edit; }
void setFullEditMode(bool yes);
void setAllowedNamesFunction(std::function<PIStringList()> f) { allowed_names = f; }
void setValueForNameFunction(std::function<PIVariant(PIString)> f) { value_by_name = f; }
void rollback();
void clear();
void retranslate();
private:
enum class NewType {
Value,
Group,
Array
};
void changeEvent(QEvent * e) override;
void removeAll();
void build();
void applyValues() const;
void actionTriggered(QToolButton * button, const PIString & vn, QAction * a);
void newRequest(NewType type);
PIValueTreeEdit * addTreeEdit(const PIValueTree & vt);
PIValueTreeEdit * rootTreeEdit();
void addValueEdit(const PIValueTree & vt);
void applyArrayAttributes();
QLabel * newLabel(const PIValueTree & vt);
void applyVariantEdit(PIVariantEdit * ve, const PIValueTree & vt);
void createTabWidget();
void resizeArray();
class GridWidgets: public QWidget {
public:
GridWidgets(PIValueTreeEdit * p);
~GridWidgets();
int rowCount() const { return row_count; }
int getRow(QWidget * w) const;
void removeRow(int index);
void add(const PIValueTree & vt, const PIString & label, QWidget * w, const PIString & comment, bool is_group = false);
void add(const PIValueTree & vt, QWidget * w, bool is_group = false);
void addRow(QWidget * w);
QToolButton * createConfigButton(const PIValueTree & vt, bool is_group);
void replace(int row, QWidget * w);
void replace(int row, const PIString & label, QWidget * w, const PIString & comment);
int beginRow(const PIValueTree & vt, bool is_group);
void rename(const PIString & prev_name, const PIString & new_name);
void reorder(const PIMap<int, int> & map) { simplify(map); }
void simplify(const PIMap<int, int> & map = PIMap<int, int>());
void clear();
void changed();
void retranslate();
bool create_edit_buttons = false;
QToolButton * button_add;
private:
int removeRowEdits(int row);
int row_count = 0;
QGridLayout * lay = nullptr;
PIValueTreeEdit * parent;
QMenu menu_group, menu_conf, menu_new;
QWidgetList widgets;
QList<QLabel *> labels;
QIcon icon_conf;
};
QWidget * widget_array = nullptr;
PIValueTreeEdit * parent_tree = nullptr;
PIValueTreeEditParameters * widget_params;
PIValueTreeEditReorder * widget_reorder;
PIStringList root_path;
PIVector<PIVariantEdit *> array_edits;
PIMap<PIString, PIVariantEdit *> value_edits;
PIMap<PIString, PIValueTreeEdit *> tree_edits;
PIMap<PIString, QLabel *> comm_labels, label_labels;
QTabWidget * tab_widget = nullptr;
Ui::PIValueTreeEditArray * ui_array;
GridWidgets * grid = nullptr;
Grouping cur_grouping = Parent, real_grouping = Indent;
mutable PIValueTree source, current;
bool is_full_edit = false;
std::function<PIStringList()> allowed_names;
std::function<PIVariant(PIString)> value_by_name;
};
#endif