FluentUI/src/FluViewModel.cpp

120 lines
3.4 KiB
C++
Raw Normal View History

2023-09-12 18:45:15 +08:00
#include "FluViewModel.h"
#include <QQuickItem>
#include "Def.h"
2023-09-13 15:11:22 +08:00
Model::Model(QObject *parent):QObject{parent}{
2023-09-12 18:45:15 +08:00
}
2023-09-13 15:11:22 +08:00
Model::~Model(){
2023-09-12 18:45:15 +08:00
}
2023-09-13 15:11:22 +08:00
ViewModelManager::ViewModelManager(QObject *parent): QObject{parent}{
2023-09-12 18:45:15 +08:00
}
void ViewModelManager::insertViewModel(FluViewModel* value){
2023-09-13 15:11:22 +08:00
_viewmodel.append(value);
2023-09-12 18:45:15 +08:00
}
void ViewModelManager::deleteViewModel(FluViewModel* value){
2023-09-13 15:11:22 +08:00
_viewmodel.removeOne(value);
2023-09-12 18:45:15 +08:00
}
QObject* ViewModelManager::getModel(const QString& key){
2023-09-13 15:11:22 +08:00
return _data.value(key);
2023-09-12 18:45:15 +08:00
}
void ViewModelManager::insert(const QString& key,QObject* value){
2023-09-13 15:11:22 +08:00
_data.insert(key,value);
2023-09-12 18:45:15 +08:00
}
bool ViewModelManager::exist(const QString& key){
2023-09-13 15:11:22 +08:00
return _data.contains(key);
2023-09-12 18:45:15 +08:00
}
void ViewModelManager::refreshViewModel(FluViewModel* viewModel,QString key,QVariant value){
2023-09-13 15:11:22 +08:00
foreach (auto item, _viewmodel) {
2023-09-12 18:45:15 +08:00
if(item->getKey() == viewModel->getKey()){
2023-11-02 11:34:02 +08:00
item->enablePropertyChange = false;
2023-11-07 14:01:28 +08:00
item->setProperty(key.toLatin1().constData(),value);
2023-11-02 11:34:02 +08:00
item->enablePropertyChange = true;
2023-09-12 18:45:15 +08:00
}
}
}
2023-09-13 15:11:22 +08:00
PropertyObserver::PropertyObserver(QString name,QObject* model,QObject *parent):QObject{parent}{
2023-09-12 18:45:15 +08:00
_name = name;
_model = model;
_property = QQmlProperty(parent,_name);
_property.connectNotifySignal(this,SLOT(_propertyChange()));
}
PropertyObserver::~PropertyObserver(){
}
void PropertyObserver::_propertyChange(){
2023-11-02 11:34:02 +08:00
auto viewModel = (FluViewModel*)parent();
if(viewModel->enablePropertyChange){
auto value = _property.read();
2023-11-07 14:01:28 +08:00
_model->setProperty(_name.toLatin1().constData(),value);
2023-11-02 11:34:02 +08:00
ViewModelManager::getInstance()->refreshViewModel(viewModel,_name,value);
}
2023-09-12 18:45:15 +08:00
}
2023-09-13 15:11:22 +08:00
FluViewModel::FluViewModel(QObject *parent):QObject{parent}{
2023-09-12 18:45:15 +08:00
scope(FluViewModelType::Scope::Window);
2023-09-17 20:36:33 +08:00
ViewModelManager::getInstance()->insertViewModel(this);
2023-09-12 18:45:15 +08:00
}
FluViewModel::~FluViewModel(){
ViewModelManager::getInstance()->deleteViewModel(this);
}
2023-09-13 15:11:22 +08:00
void FluViewModel::classBegin(){
2023-09-12 18:45:15 +08:00
}
2023-09-13 15:11:22 +08:00
void FluViewModel::componentComplete(){
2023-09-12 18:45:15 +08:00
auto o = parent();
while (nullptr != o) {
_window = o;
o = o->parent();
}
const QMetaObject* obj = metaObject();
if(_scope == FluViewModelType::Scope::Window){
2023-11-02 11:34:02 +08:00
_key = property("objectName").toString()+"-"+QString::number(reinterpret_cast<qulonglong>(_window), 16);
2023-09-12 18:45:15 +08:00
}else{
_key = property("objectName").toString();
}
QObject * model;
if(!ViewModelManager::getInstance()->exist(_key)){
if(_scope == FluViewModelType::Scope::Window){
model = new Model(_window);
}else{
model = new Model();
}
Q_EMIT initData();
for (int i = 0; i < obj->propertyCount(); ++i) {
const QMetaProperty property = obj->property(i);
QString propertyName = property.name();
auto value = property.read(this);
2023-11-07 14:01:28 +08:00
model->setProperty(propertyName.toLatin1().constData(),value);
2023-09-12 18:45:15 +08:00
new PropertyObserver(propertyName,model,this);
}
ViewModelManager::getInstance()->insert(_key,model);
}else{
model = ViewModelManager::getInstance()->getModel(_key);
for (int i = 0; i < obj->propertyCount(); ++i) {
const QMetaProperty property = obj->property(i);
QString propertyName = property.name();
new PropertyObserver(propertyName,model,this);
}
}
foreach (auto key, model->dynamicPropertyNames()) {
setProperty(key,model->property(key));
}
}
QString FluViewModel::getKey(){
return _key;
}