1 /**************************************************************************
2 * Otter Browser: Web browser controlled by the user, not vice-versa.
3 * Copyright (C) 2015 - 2018 Michal Dutkiewicz aka Emdek <michal@emdek.pl>
4 * Copyright (C) 2016 Piotr Wójcik <chocimier@tlen.pl>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 **************************************************************************/
20 
21 #ifndef OTTER_TOOLBARWIDGET_H
22 #define OTTER_TOOLBARWIDGET_H
23 
24 #include "../core/BookmarksModel.h"
25 #include "../core/SessionsManager.h"
26 #include "../core/ToolBarsManager.h"
27 
28 #include <QtCore/QMimeData>
29 #include <QtWidgets/QMenu>
30 #include <QtWidgets/QPushButton>
31 #include <QtWidgets/QToolBar>
32 
33 namespace Otter
34 {
35 
36 class MainWindow;
37 class SidebarWidget;
38 class TabBarWidget;
39 class Window;
40 
41 class ToolBarWidget : public QToolBar
42 {
43 	Q_OBJECT
44 
45 public:
46 	explicit ToolBarWidget(int identifier, Window *window, QWidget *parent);
47 
48 	static QMenu* createCustomizationMenu(int identifier, QVector<QAction*> actions = {}, QWidget *parent = nullptr);
49 	void setDefinition(const ToolBarsManager::ToolBarDefinition &definition);
50 	void setState(const ToolBarState &state);
51 	MainWindow* getMainWindow() const;
52 	Window* getWindow() const;
53 	QString getTitle() const;
54 	ToolBarsManager::ToolBarDefinition getDefinition() const;
55 	ToolBarState getState() const;
56 	QVector<QPointer<QWidget> > getAddressFields() const;
57 	QVector<QPointer<QWidget> > getSearchFields() const;
58 	Qt::ToolBarArea getArea() const;
59 	Qt::ToolButtonStyle getButtonStyle() const;
60 	int getIdentifier() const;
61 	int getIconSize() const;
62 	int getMaximumButtonSize() const;
63 	static bool calculateShouldBeVisible(const ToolBarsManager::ToolBarDefinition &definition, const ToolBarState &state, ToolBarsManager::ToolBarsMode mode);
64 	bool canDrop(QDropEvent *event) const;
65 	bool isCollapsed() const;
66 	virtual bool shouldBeVisible(ToolBarsManager::ToolBarsMode mode) const;
67 	bool event(QEvent *event) override;
68 
69 public slots:
70 	void reload();
71 	void resetGeometry();
72 	void setArea(Qt::ToolBarArea area);
73 
74 protected:
75 	void timerEvent(QTimerEvent *event) override;
76 	void changeEvent(QEvent *event) override;
77 	void paintEvent(QPaintEvent *event) override;
78 	void showEvent(QShowEvent *event) override;
79 	void resizeEvent(QResizeEvent *event) override;
80 	void enterEvent(QEvent *event) override;
81 	void leaveEvent(QEvent *event) override;
82 	void contextMenuEvent(QContextMenuEvent *event) override;
83 	void mousePressEvent(QMouseEvent *event) override;
84 	void mouseMoveEvent(QMouseEvent *event) override;
85 	void mouseReleaseEvent(QMouseEvent *event) override;
86 	void dragEnterEvent(QDragEnterEvent *event) override;
87 	void dragMoveEvent(QDragMoveEvent *event) override;
88 	void dragLeaveEvent(QDragLeaveEvent *event) override;
89 	void dropEvent(QDropEvent *event) override;
90 	virtual void clearEntries();
91 	virtual void populateEntries();
92 	void updateDropIndex(const QPoint &position);
93 	void updateToggleGeometry();
94 	void setAddressFields(QVector<QPointer<QWidget> > addressFields);
95 	void setSearchFields(QVector<QPointer<QWidget> > searchFields);
96 	bool isDragHandle(const QPoint &position) const;
97 
98 protected slots:
99 	void scheduleBookmarksReload();
100 	void loadBookmarks();
101 	void toggleVisibility();
102 	void notifyWindowChanged(quint64 identifier);
103 	void handleToolBarModified(int identifier);
104 	void handleToolBarRemoved(int identifier);
105 	void handleBookmarkModified(BookmarksModel::Bookmark *bookmark);
106 	void handleBookmarkMoved(BookmarksModel::Bookmark *bookmark, BookmarksModel::Bookmark *previousParent);
107 	void handleBookmarkRemoved(BookmarksModel::Bookmark *bookmark, BookmarksModel::Bookmark *previousParent);
108 	void handleFullScreenStateChanged(bool isFullScreen);
109 	void setToolBarLocked(bool locked);
110 
111 private:
112 	MainWindow *m_mainWindow;
113 	Window *m_window;
114 	SidebarWidget *m_sidebarWidget;
115 	BookmarksModel::Bookmark *m_bookmark;
116 	BookmarksModel::Bookmark *m_dropBookmark;
117 	QPushButton *m_toggleButton;
118 	QPoint m_dragStartPosition;
119 	QVector<QPointer<QWidget> > m_addressFields;
120 	QVector<QPointer<QWidget> > m_searchFields;
121 	ToolBarState m_state;
122 	Qt::ToolBarArea m_area;
123 	int m_reloadTimer;
124 	int m_identifier;
125 	int m_dropIndex;
126 	bool m_isCollapsed;
127 	bool m_isInitialized;
128 
129 signals:
130 	void windowChanged(Window *window);
131 	void areaChanged(Qt::ToolBarArea area);
132 	void buttonStyleChanged(Qt::ToolButtonStyle buttonStyle);
133 	void iconSizeChanged(int size);
134 	void maximumButtonSizeChanged(int size);
135 	void toolBarModified();
136 };
137 
138 class TabBarToolBarWidget final : public ToolBarWidget
139 {
140 	Q_OBJECT
141 
142 public:
143 	explicit TabBarToolBarWidget(int identifier, Window *window, QWidget *parent);
144 
145 	bool shouldBeVisible(ToolBarsManager::ToolBarsMode mode) const override;
146 	bool event(QEvent *event) override;
147 
148 protected:
149 	void paintEvent(QPaintEvent *event) override;
150 	void resizeEvent(QResizeEvent *event) override;
151 	void contextMenuEvent(QContextMenuEvent *event) override;
152 	void findTabBar();
153 	void clearEntries() override;
154 	void populateEntries() override;
155 
156 protected slots:
157 	void updateVisibility();
158 
159 private:
160 	TabBarWidget *m_tabBar;
161 };
162 
163 }
164 
165 #endif
166