You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

90 lines
2.6 KiB

#ifndef NAVIGATION_HISTORY_HPP
#define NAVIGATION_HISTORY_HPP
#include <memory>
#include <QObject>
#include <QtQml/QQmlPropertyMap>
class NavigationHistory : public QObject
{
Q_OBJECT
public:
Q_PROPERTY(bool previousEmpty READ isPreviousEmpty NOTIFY previousEmptyChanged FINAL)
/**
* current path
*/
Q_PROPERTY(QStringList viewPath READ viewPath NOTIFY viewPathChanged FINAL)
/**
* properties of the current view,
* * properties that are pushed will be accessible thru this property
* * views may store values in this property, they will be restored when navigating back
*/
Q_PROPERTY(QQmlPropertyMap* viewProp READ viewProp NOTIFY viewPropChanged FINAL)
enum class PostAction{
Stay,
Go
};
Q_ENUM(PostAction)
public:
explicit NavigationHistory(QObject *parent = nullptr);
QVariant getCurrent();
bool isPreviousEmpty();
QStringList viewPath() const;
QQmlPropertyMap* viewProp() const;
Q_INVOKABLE bool match(const QStringList& path, const QStringList& pattern);
Q_INVOKABLE bool exactMatch(const QStringList& path, const QStringList& pattern);
signals:
void navigate(Qt::FocusReason);
void previousEmptyChanged(bool empty);
void viewPathChanged(const QStringList& viewPath);
void viewPropChanged(QQmlPropertyMap*);
public slots:
/**
*
* navigate to a new page
*
* @param path: path of the page to load
* @param properties: values that will be set to the current viewProp
*
* example:
* \code
* //push the view foo, then bar, set baz to plop in the view "bar"
* push(["foo", "bar"], {baz: "plop"})
* \endcode
*/
Q_INVOKABLE void push(QStringList path, const QVariantMap& properties, Qt::FocusReason focusReason = Qt::OtherFocusReason);
Q_INVOKABLE void push(QStringList path, Qt::FocusReason focusReason = Qt::OtherFocusReason);
/**
* @brief modify the current history path
*
* @note:
* * invoking update won't cause page to be reloaded, this mainly affects history
* * invoking update when there is no path will create a node (the initial history node)
*/
Q_INVOKABLE void update(QStringList path);
Q_INVOKABLE void update(QStringList path, const QVariantMap& properties);
/// Go to previous page
void previous(Qt::FocusReason = Qt::OtherFocusReason);
private:
void updateCurrent();
std::vector<std::pair<QStringList, std::unique_ptr<QQmlPropertyMap>>> m_history;
QStringList m_viewPath;
QQmlPropertyMap* m_viewProperties = nullptr;
};
#endif // NAVIGATION_HISTORY_HPP