1 /**************************************************************************
2 * Otter Browser: Web browser controlled by the user, not vice-versa.
3 * Copyright (C) 2013 - 2017 Michal Dutkiewicz aka Emdek <michal@emdek.pl>
4 * Copyright (C) 2016 - 2017 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 #include "ConfigurationOptionWidget.h"
22 #include "../../../core/ActionsManager.h"
23 #include "../../../core/SettingsManager.h"
24 #include "../../../ui/OptionWidget.h"
25 #include "../../../ui/ToolBarWidget.h"
26 
27 #include <QtWidgets/QHBoxLayout>
28 #include <QtWidgets/QLabel>
29 
30 namespace Otter
31 {
32 
ConfigurationOptionWidget(Window * window,const ToolBarsManager::ToolBarDefinition::Entry & definition,QWidget * parent)33 ConfigurationOptionWidget::ConfigurationOptionWidget(Window *window, const ToolBarsManager::ToolBarDefinition::Entry &definition, QWidget *parent) : QWidget(parent),
34 	m_optionWidget(nullptr),
35 	m_window(window),
36 	m_scope(WindowScope),
37 	m_identifier(SettingsManager::getOptionIdentifier(definition.options.value(QLatin1String("optionName")).toString()))
38 {
39 	QHBoxLayout *layout(new QHBoxLayout(this));
40 	layout->setContentsMargins(0, 0, 0, 0);
41 
42 	setLayout(layout);
43 
44 	if (m_identifier == -1)
45 	{
46 		layout->addWidget(new QLabel(tr("Choose option"), this));
47 
48 		return;
49 	}
50 
51 	if (definition.options.value(QLatin1String("scope")).toString() == QLatin1String("global"))
52 	{
53 		m_scope = GlobalScope;
54 	}
55 
56 	QString text;
57 
58 	if (definition.options.contains(QLatin1String("text")))
59 	{
60 		text = definition.options.value(QLatin1String("text")).toString();
61 	}
62 	else
63 	{
64 		text = definition.options.value(QLatin1String("optionName")).toString().section(QLatin1Char('/'), -1);
65 	}
66 
67 	layout->addWidget(new QLabel(text, this));
68 
69 	const SettingsManager::OptionDefinition optionDefinition(SettingsManager::getOptionDefinition(m_identifier));
70 	const QVariant value((m_scope == GlobalScope || !m_window) ? SettingsManager::getOption(m_identifier) : m_window->getOption(m_identifier));
71 
72 	m_optionWidget = new OptionWidget(value, optionDefinition.type, this);
73 	m_optionWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
74 
75 	if (optionDefinition.type == SettingsManager::EnumerationType)
76 	{
77 		m_optionWidget->setChoices(optionDefinition.choices);
78 	}
79 
80 	layout->addWidget(m_optionWidget);
81 
82 	if (m_scope == WindowScope)
83 	{
84 		setWindow(window);
85 
86 		const ToolBarWidget *toolBar(qobject_cast<ToolBarWidget*>(parent));
87 
88 		if (toolBar && toolBar->getDefinition().isGlobal())
89 		{
90 			connect(toolBar, &ToolBarWidget::windowChanged, this, &ConfigurationOptionWidget::setWindow);
91 		}
92 
93 		connect(SettingsManager::getInstance(), &SettingsManager::hostOptionChanged, this, &ConfigurationOptionWidget::updateValue);
94 	}
95 
96 	connect(SettingsManager::getInstance(), &SettingsManager::optionChanged, this, &ConfigurationOptionWidget::handleOptionChanged);
97 	connect(m_optionWidget, &OptionWidget::commitData, this, &ConfigurationOptionWidget::save);
98 }
99 
handleOptionChanged(int option,const QVariant & value)100 void ConfigurationOptionWidget::handleOptionChanged(int option, const QVariant &value)
101 {
102 	if (option == m_identifier)
103 	{
104 		m_optionWidget->setValue(value);
105 	}
106 }
107 
updateValue(int option)108 void ConfigurationOptionWidget::updateValue(int option)
109 {
110 	if (option == m_identifier && m_window)
111 	{
112 		m_optionWidget->setValue(m_window->getOption(m_identifier));
113 	}
114 }
115 
setWindow(Window * window)116 void ConfigurationOptionWidget::setWindow(Window *window)
117 {
118 	if (m_window && !m_window->isAboutToClose())
119 	{
120 		disconnect(m_window, &Window::optionChanged, this, &ConfigurationOptionWidget::handleOptionChanged);
121 	}
122 
123 	m_window = window;
124 
125 	m_optionWidget->setEnabled(m_window != nullptr);
126 	m_optionWidget->setValue(m_window ? m_window->getOption(m_identifier) : SettingsManager::getOption(m_identifier));
127 
128 	if (window)
129 	{
130 		connect(window, &Window::optionChanged, this, &ConfigurationOptionWidget::handleOptionChanged);
131 	}
132 }
133 
save()134 void ConfigurationOptionWidget::save()
135 {
136 	if (m_scope == GlobalScope)
137 	{
138 		SettingsManager::setOption(m_identifier, m_optionWidget->getValue());
139 	}
140 	else if (m_window)
141 	{
142 		m_window->setOption(m_identifier, m_optionWidget->getValue());
143 	}
144 }
145 
146 }
147