// ============================================================================
//  qt_model_view_basics —— 教学补充示例（非 wiki 生成，手工维护）
//  用途：方案书「C++方向 Day3」要求的 Model/View 模型视图架构，仓库 p03/ 原有
//        wiki 抓取内容未覆盖这一点，故补一个最小示例。
//  配套文档：docs/teaching/examples/model_view/README.md
//  离屏验证：QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_model_view_basics（自动退出）
// ============================================================================

#include <QApplication>
#include <QWidget>
#include <QListView>
#include <QLabel>
#include <QVBoxLayout>
#include <QStandardItemModel>
#include <QTimer>
#include <QItemSelectionModel>

class ModelViewDemo : public QWidget {
    Q_OBJECT
public:
    explicit ModelViewDemo(QWidget* parent = nullptr) : QWidget(parent) {
        // 模型：数据本身，与展示方式无关
        auto* model = new QStandardItemModel(this);
        model->appendRow(new QStandardItem(QStringLiteral("需求分析")));
        model->appendRow(new QStandardItem(QStringLiteral("项目设计")));
        model->appendRow(new QStandardItem(QStringLiteral("编码实现")));
        model->appendRow(new QStandardItem(QStringLiteral("测试及回归")));

        // 视图：只负责展示，不持有数据
        auto* view = new QListView(this);
        view->setModel(model);

        auto* selectedLabel = new QLabel(QStringLiteral("当前选中：（无）"), this);

        // 选中项变化 → 视图层通知 → 界面同步更新，模型和视图之间没有直接耦合
        connect(view->selectionModel(), &QItemSelectionModel::currentChanged,
                this, [selectedLabel](const QModelIndex& current, const QModelIndex&) {
                    if (current.isValid())
                        selectedLabel->setText(QStringLiteral("当前选中：%1").arg(current.data().toString()));
                });

        auto* layout = new QVBoxLayout(this);
        layout->addWidget(view);
        layout->addWidget(selectedLabel);

        // 离屏自动化验证：选中第一行，触发一次 currentChanged
        view->setCurrentIndex(model->index(0, 0));
    }
};

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    ModelViewDemo w;
    w.resize(280, 220);
    w.show();
    // 仅在离屏自动化验证时（QT_QPA_PLATFORM=offscreen）200ms 后自动退出；
    // 正常运行（有显示环境）窗口保持打开，不自动退出。
    if (qgetenv("QT_QPA_PLATFORM") == "offscreen") {
        QTimer::singleShot(200, &app, &QApplication::quit);
    }
    return app.exec();
}

#include "qt_model_view_basics.moc"
