File indexing completed on 2024-05-12 16:23:41

0001 /*
0002  *  SPDX-FileCopyrightText: 2020 Jonah BrĂ¼chert <jbb@kaidan.im>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.0-only
0005  */
0006 
0007 #ifndef TABSMODEL_H
0008 #define TABSMODEL_H
0009 
0010 #include <QAbstractListModel>
0011 #include <QUrl>
0012 
0013 class QJsonObject;
0014 
0015 class TabState
0016 {
0017 public:
0018     static TabState fromJson(const QJsonObject &obj);
0019     QJsonObject toJson() const;
0020 
0021     TabState() = default;
0022     TabState(const QUrl &url, const bool isMobile);
0023 
0024     bool operator==(const TabState &other) const;
0025 
0026     bool isMobile() const;
0027     void setIsMobile(bool isMobile);
0028 
0029     bool isDeveloperToolsOpen() const;
0030     void setIsDeveloperToolsOpen(bool isDeveloperToolsOpen);
0031 
0032     QUrl url() const;
0033     void setUrl(const QUrl &url);
0034 
0035 private:
0036     QUrl m_url;
0037     bool m_isMobile = true;
0038     bool m_isDeveloperToolsOpen = false;
0039 };
0040 
0041 class TabsModel : public QAbstractListModel
0042 {
0043     Q_OBJECT
0044 
0045     Q_PROPERTY(int currentTab READ currentTab WRITE setCurrentTab NOTIFY currentTabChanged)
0046     Q_PROPERTY(bool isMobileDefault READ isMobileDefault WRITE setIsMobileDefault NOTIFY isMobileDefaultChanged)
0047     Q_PROPERTY(bool privateMode READ privateMode WRITE setPrivateMode NOTIFY privateModeChanged REQUIRED)
0048 
0049     enum RoleNames { UrlRole = Qt::UserRole + 1, IsMobileRole, IsDeveloperToolsOpen };
0050 
0051 public:
0052     explicit TabsModel(QObject *parent = nullptr);
0053 
0054     QHash<int, QByteArray> roleNames() const override;
0055     QVariant data(const QModelIndex &index, int role) const override;
0056     int rowCount(const QModelIndex &parent = QModelIndex()) const override;
0057 
0058     int currentTab() const;
0059     void setCurrentTab(int index);
0060 
0061     const std::vector<TabState> &tabs() const;
0062 
0063     Q_INVOKABLE TabState tab(int index);
0064 
0065     Q_INVOKABLE void loadInitialTabs();
0066 
0067     Q_INVOKABLE void newTab(const QUrl &url);
0068     Q_INVOKABLE void createEmptyTab();
0069     Q_INVOKABLE void closeTab(int index);
0070 
0071     Q_INVOKABLE void setUrl(int index, const QUrl &url);
0072     Q_INVOKABLE void setIsMobile(int index, bool isMobile);
0073     Q_INVOKABLE void toggleDeveloperTools(int index);
0074 
0075     Q_INVOKABLE bool isDeveloperToolsOpen(int index);
0076     bool isMobileDefault() const;
0077     void setIsMobileDefault(bool def);
0078 
0079     bool privateMode() const;
0080     void setPrivateMode(bool privateMode);
0081 
0082 protected:
0083     bool loadTabs();
0084     bool saveTabs() const;
0085 
0086 private:
0087     int m_currentTab = 0;
0088     std::vector<TabState> m_tabs{};
0089     bool m_privateMode = false;
0090     bool m_tabsReadOnly = false;
0091     bool m_isMobileDefault = false;
0092     bool m_initialTabsLoaded = false;
0093 
0094 Q_SIGNALS:
0095     void currentTabChanged();
0096     void isMobileDefaultChanged();
0097     void privateModeChanged();
0098 };
0099 
0100 #endif // TABSMODEL_H