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