#include "quam/project.h" #include #include Project::Project(std::istream &st, QErrorMessage *errors, QWidget *parent) : QWidget{parent}, Ui::Project{}, m_seekingDir{false}, m_histPos{0}, m_hist(), m_arc{new Arc::Arc{st, this}}, m_errors{errors}, m_model{new Arc::Model{this}}, m_sorter{new QSortFilterProxyModel{this}} { setupUi(this); connect(m_model, &Arc::Model::dirChanged, this, &Project::dirChanged); connect(tableView, &QAbstractItemView::doubleClicked, m_model, &Arc::Model::setDirToIndex); connect(dirName, &QLineEdit::returnPressed, this, &Project::goPath); dirName->setValidator(m_arc->validator); m_sorter->setSourceModel(m_model); tableView->setModel(m_sorter); seekTop(); } Project::~Project() { } bool Project::seekHistory(std::ptrdiff_t newPos) { if(newPos < 0 || newPos >= m_hist.size()) { return false; } m_histPos = newPos; auto newPath = m_hist.at(newPos); if(auto node = m_model->findPath(newPath)) { if(auto dir = node->getDir()) { m_seekingDir = true; m_model->setDir(dir); return true; } else { m_errors->showMessage(QString::fromStdString("'"s + newPath + "' ") + tr("is not a directory")); return false; } } else { m_errors->showMessage(tr("could not find directory") + QString::fromStdString(" '"s + newPath + "'")); return false; } } bool Project::seekPath(std::string path) { return m_model->goPath(path); } void Project::seekTop() { m_model->setDir(&m_arc->root); } bool Project::goBack() { return seekHistory(std::ptrdiff_t(m_histPos) - 1); } bool Project::goForward() { return seekHistory(std::ptrdiff_t(m_histPos) + 1); } bool Project::goTop() { seekTop(); return true; } bool Project::goUp() { return m_model->goUp(); } bool Project::goPath() { auto newPath = dirName->text().toStdString(); if(!m_model->goPath(newPath)) { m_errors->showMessage(tr("could not find directory") + QString::fromStdString(" '"s + newPath + "'")); return false; } else { return true; } } void Project::dirChanged(Arc::Dir *from, Arc::Dir *to) { if(!m_seekingDir) { if(std::ptrdiff_t(m_histPos) < std::ptrdiff_t(m_hist.size()) - 1) { auto beg = m_hist.begin(); std::advance(beg, m_histPos + 1); m_hist.erase(beg, m_hist.end()); } m_hist.push_back(to->getPath()); m_histPos = m_hist.size() - 1; } else { m_seekingDir = false; } dirName->setText(QString::fromStdString(to->getPath())); tableView->sortByColumn(int(Arc::Column::Type), Qt::AscendingOrder); tableView->resizeColumnsToContents(); } // EOF