Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_lod_availability_widget.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QPushButton>
10#include <QCheckBox>
11#include <QHBoxLayout>
12#include <QToolTip>
13
14
16#include <kis_slider_spin_box.h>
17#include "kis_image_config.h"
18#include <QWidgetAction>
19#include <QMenu>
21
22#include "kis_signals_blocker.h"
23
24
25namespace {
30static const KLocalizedString stringForInstantPreviewThreshold1 = ki18nc("@label:slider", "Threshold:");
31static const KLocalizedString stringForInstantPreviewThreshold2 = ki18nc("@label:slider", "Instant preview threshold:");
32}
33
35{
36 QCheckBox *chkLod {nullptr};
37 QPushButton *btnLod {nullptr};
38 QScopedPointer<QMenu> thresholdMenu;
40
41 QScopedPointer<KisLodAvailabilityModel> model;
42};
43
45 : QWidget(parent),
46 m_d(new Private)
47{
48 m_d->chkLod = new QCheckBox(this);
49
50 m_d->btnLod = new QPushButton(this);
51 m_d->btnLod->setFlat(true);
52
53 connect(m_d->btnLod, SIGNAL(clicked()), SLOT(showLodToolTip()));
54
55 {
56 m_d->thresholdMenu.reset(new QMenu());
57 m_d->thresholdMenu->addSection(i18n("Enable after:"));
58
59 m_d->btnLod->setContextMenuPolicy(Qt::CustomContextMenu);
60 connect(m_d->btnLod, SIGNAL(customContextMenuRequested(QPoint)),
61 this, SLOT(showLodThresholdWidget(QPoint)));
62
63 KisImageConfig cfg(true);
64 m_d->thresholdSlider = new KisDoubleSliderSpinBox(m_d->thresholdMenu.data());
65
66 m_d->thresholdSlider->setRange(0, cfg.maxBrushSize(), 2);
67 m_d->thresholdSlider->setValue(100);
68 m_d->thresholdSlider->setSingleStep(1);
69 m_d->thresholdSlider->setExponentRatio(3.0);
70 m_d->thresholdSlider->setSuffix(i18n(" px"));
71 m_d->thresholdSlider->setBlockUpdateSignalOnDrag(true);
72
73 QWidgetAction *sliderAction = new QWidgetAction(this);
74 sliderAction->setDefaultWidget(m_d->thresholdSlider);
75
76 m_d->thresholdMenu->addAction(sliderAction);
77 }
78
79 QHBoxLayout *layout = new QHBoxLayout(this);
80 layout->setSpacing(0);
81 layout->addWidget(m_d->chkLod);
82 layout->addWidget(m_d->btnLod);
83}
84
88
90{
91 m_d->model.reset(model);
92
93 m_d->model->LAGER_QT(availabilityState).bind(
95 this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)));
96
97 connect(m_d->chkLod, &QCheckBox::toggled,
98 m_d->model.data(), &KisLodAvailabilityModel::setisLodUserAllowed);
99
100 using namespace KisWidgetConnectionUtils;
101 connectControl(m_d->thresholdSlider, m_d->model.data(), "lodSizeThreshold");
102}
103
105{
106 QToolTip::showText(QCursor::pos(), m_d->btnLod->toolTip(), m_d->btnLod);
107}
108
110{
111 Q_UNUSED(pos);
112
113 if (m_d->model && m_d->model->isLodSizeThresholdSupported()) {
114 m_d->thresholdMenu->popup(QCursor::pos());
115 }
116}
117
119{
120 QString toolTip;
121
123 QString blockersText;
124 Q_FOREACH (const KoID &id, l.blockers) {
125 blockersText.append("<li>");
126 blockersText.append(id.name());
127 blockersText.append("</li>");
128 }
129
130 toolTip = i18nc("@info:tooltip",
131 "<p>Instant Preview Mode is "
132 "disabled by the following options:"
133 "<ul>%1</ul></p>", blockersText);
135
136 const qreal effectiveBrushSize = m_d->model->effectiveBrushSize.get();
137 const qreal sizeThreshold = m_d->model->lodSizeThreshold();
138
139 toolTip = i18nc("@info:tooltip",
140 "<p>Instant Preview Mode is "
141 "disabled by instant preview threshold. "
142 "Please right-click here to change the threshold"
143 "<ul><li>Brush size %1</li>"
144 "<li>Threshold: %2</li></ul></p>",
145 effectiveBrushSize, sizeThreshold);
146
147 } else if (state == KisLodAvailabilityModel::Limited) {
148
149 QString limitationsText;
150 Q_FOREACH (const KoID &id, l.limitations) {
151 limitationsText.append("<li>");
152 limitationsText.append(id.name());
153 limitationsText.append("</li>");
154 }
155
156 toolTip = i18nc("@info:tooltip",
157 "<p>Instant Preview may look different "
158 "from the final result. In case of troubles "
159 "try disabling the following options:"
160 "<ul>%1</ul></p>", limitationsText);
161 } else {
162 toolTip = i18nc("@info:tooltip", "<p>Instant Preview Mode is available</p>");
163 }
164
165 const QString text = state == KisLodAvailabilityModel::Limited ?
166 i18n("(Instant Preview)*") : i18n("Instant Preview");
167
168
169 {
170 QFont font;
171 font.setStrikeOut(state >= KisLodAvailabilityModel::BlockedByThreshold);
172 m_d->chkLod->setEnabled(state < KisLodAvailabilityModel::BlockedFully);
173 m_d->btnLod->setEnabled(state < KisLodAvailabilityModel::BlockedFully);
174 m_d->btnLod->setFont(font);
175 m_d->btnLod->setText(text);
176 m_d->btnLod->setToolTip(toolTip);
177
184 KisSignalsBlocker b(m_d->chkLod);
185 m_d->chkLod->setChecked(false);
186 } else {
187 KisSignalsBlocker b(m_d->chkLod);
188 m_d->chkLod->setChecked(isLodUserAllowed);
189 }
190 }
191}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
This class is a spinbox in which you can click and drag to set the value. A slider like bar is displa...
int maxBrushSize(bool defaultValue=false) const
void showLodThresholdWidget(const QPoint &pos)
void setLodAvailabilityModel(KisLodAvailabilityModel *model)
const QScopedPointer< Private > m_d
void slotLodAvailabilityStateChanged(KisLodAvailabilityModel::AvailabilityState state, const KisPaintopLodLimitations &l, bool isLodUserAllowed)
Definition KoID.h:30
constexpr auto unzip_wrapper
Definition KisMpl.h:70
QScopedPointer< KisLodAvailabilityModel > model