10#include <config-libkleo.h>
12#include "dnattributeorderconfigwidget.h"
14#include <libkleo/dn.h>
16#include <libkleo_debug.h>
18#include <KLazyLocalizedString>
19#include <KLocalizedString>
45 void forceAccessibleFocusEventForCurrentItem()
50 const auto current = currentItem();
51 setCurrentItem(
nullptr);
52 setCurrentItem(current);
57class Kleo::DNAttributeOrderConfigWidget::DNAttributeOrderConfigWidgetPrivate
60 enum { Right = 0, Left = 1, UUp = 2, Up = 3, Down = 4, DDown = 5 };
62 TreeWidget *availableLV =
nullptr;
63 TreeWidget *currentLV =
nullptr;
64 std::vector<QToolButton *> navTB;
78 , d(new DNAttributeOrderConfigWidgetPrivate)
81 glay->setContentsMargins(0, 0, 0, 0);
82 glay->setColumnStretch(0, 1);
83 glay->setColumnStretch(2, 1);
88 auto availableAttributesLabel =
new QLabel(
i18nc(
"@label:textbox",
"Available attributes:"),
this);
89 glay->addWidget(availableAttributesLabel, row, 0);
90 auto currentAttributesLabel =
new QLabel(
i18nc(
"@label:textbox",
"Current attribute order:"),
this);
91 glay->addWidget(currentAttributesLabel, row, 2);
94 glay->setRowStretch(row, 1);
96 d->availableLV =
new TreeWidget(
this);
97 availableAttributesLabel->setBuddy(d->availableLV);
98 d->availableLV->setAccessibleName(
i18n(
"available attributes"));
99 prepare(d->availableLV);
101 glay->addWidget(d->availableLV, row, 0);
104 d->placeHolderItem->setText(0, QStringLiteral(
"_X_"));
105 d->placeHolderItem->setText(1,
i18n(
"All others"));
108 struct NavButtonInfo {
112 void (DNAttributeOrderConfigWidget::*slot)();
115 static const std::vector<NavButtonInfo> navButtons = {
118 kli18nc(
"@action:button",
"Add"),
119 kli18n(
"Add to current attribute order"),
120 &DNAttributeOrderConfigWidget::slotRightButtonClicked,
125 kli18nc(
"@action:button",
"Remove"),
126 kli18n(
"Remove from current attribute order"),
127 &DNAttributeOrderConfigWidget::slotLeftButtonClicked,
132 kli18nc(
"@action:button",
"Move to Top"),
133 kli18n(
"Move to top"),
134 &DNAttributeOrderConfigWidget::slotDoubleUpButtonClicked,
139 kli18nc(
"@action:button",
"Move Up"),
140 kli18n(
"Move one up"),
141 &DNAttributeOrderConfigWidget::slotUpButtonClicked,
146 kli18nc(
"@action:button",
"Move Down"),
147 kli18n(
"Move one down"),
148 &DNAttributeOrderConfigWidget::slotDownButtonClicked,
153 kli18nc(
"@action:button",
"Move to Bottom"),
154 kli18n(
"Move to bottom"),
155 &DNAttributeOrderConfigWidget::slotDoubleDownButtonClicked,
160 const auto createToolButton = [
this](
const NavButtonInfo &navButton) {
163 tb->setEnabled(
false);
166 tb->setAutoRepeat(navButton.autorepeat);
168 d->navTB.push_back(tb);
175 buttonCol->addWidget(createToolButton(navButtons[DNAttributeOrderConfigWidgetPrivate::Right]));
176 buttonCol->addWidget(createToolButton(navButtons[DNAttributeOrderConfigWidgetPrivate::Left]));
177 buttonCol->addStretch();
179 glay->addLayout(buttonCol, row, 1);
182 d->currentLV =
new TreeWidget(
this);
183 currentAttributesLabel->setBuddy(d->currentLV);
184 d->currentLV->setAccessibleName(
i18n(
"current attribute order"));
185 prepare(d->currentLV);
186 glay->addWidget(d->currentLV, row, 2);
191 buttonCol->addWidget(createToolButton(navButtons[DNAttributeOrderConfigWidgetPrivate::UUp]));
192 buttonCol->addWidget(createToolButton(navButtons[DNAttributeOrderConfigWidgetPrivate::Up]));
193 buttonCol->addWidget(createToolButton(navButtons[DNAttributeOrderConfigWidgetPrivate::Down]));
194 buttonCol->addWidget(createToolButton(navButtons[DNAttributeOrderConfigWidgetPrivate::DDown]));
195 buttonCol->addStretch();
197 glay->addLayout(buttonCol, row, 3);
201 Q_ASSERT(d->navTB.size() == navButtons.size());
202 for (uint i = 0; i < navButtons.size(); ++i) {
211Kleo::DNAttributeOrderConfigWidget::~DNAttributeOrderConfigWidget() =
default;
213void Kleo::DNAttributeOrderConfigWidget::setAttributeOrder(
const QStringList &order)
216 takePlaceHolderItem();
218 d->availableLV->clear();
219 d->currentLV->clear();
223 for (
const auto &entry : order) {
226 takePlaceHolderItem();
227 d->currentLV->insertTopLevelItem(d->currentLV->topLevelItemCount(), d->placeHolderItem);
228 last = d->placeHolderItem;
232 const auto label = DN::attributeNameToLabel(attr);
238 d->currentLV->setCurrentItem(d->currentLV->topLevelItem(0));
243 for (
const auto &attr : all) {
246 item->setText(0, attr);
247 const auto label = DN::attributeNameToLabel(attr);
248 item->setText(1, label);
254 if (!d->placeHolderItem->treeWidget()) {
255 d->availableLV->addTopLevelItem(d->placeHolderItem);
257 d->availableLV->setCurrentItem(d->availableLV->topLevelItem(0));
260void Kleo::DNAttributeOrderConfigWidget::takePlaceHolderItem()
262 if (
QTreeWidget *lv = d->placeHolderItem->treeWidget()) {
267QStringList Kleo::DNAttributeOrderConfigWidget::attributeOrder()
const
276void Kleo::DNAttributeOrderConfigWidget::slotAvailableSelectionChanged()
278 d->navTB[DNAttributeOrderConfigWidgetPrivate::Right]->setEnabled(!d->availableLV->selectedItems().empty());
281void Kleo::DNAttributeOrderConfigWidget::slotCurrentOrderSelectionChanged()
283 const auto selectedItems = d->currentLV->selectedItems();
284 auto selectedItem = selectedItems.empty() ? nullptr : selectedItems.front();
285 enableDisableButtons(selectedItem);
288void Kleo::DNAttributeOrderConfigWidget::enableDisableButtons(
QTreeWidgetItem *item)
290 d->navTB[DNAttributeOrderConfigWidgetPrivate::UUp]->setEnabled(item && d->currentLV->itemAbove(item));
291 d->navTB[DNAttributeOrderConfigWidgetPrivate::Up]->setEnabled(item && d->currentLV->itemAbove(item));
292 d->navTB[DNAttributeOrderConfigWidgetPrivate::Left]->setEnabled(item);
293 d->navTB[DNAttributeOrderConfigWidgetPrivate::Down]->setEnabled(item && d->currentLV->itemBelow(item));
294 d->navTB[DNAttributeOrderConfigWidgetPrivate::DDown]->setEnabled(item && d->currentLV->itemBelow(item));
297void Kleo::DNAttributeOrderConfigWidget::slotUpButtonClicked()
299 if (d->currentLV->selectedItems().isEmpty()) {
303 int itemIndex = d->currentLV->indexOfTopLevelItem(item);
304 if (itemIndex <= 0) {
307 d->currentLV->takeTopLevelItem(itemIndex);
308 d->currentLV->insertTopLevelItem(itemIndex - 1, item);
309 d->currentLV->setCurrentItem(item);
310 enableDisableButtons(item);
314void Kleo::DNAttributeOrderConfigWidget::slotDoubleUpButtonClicked()
316 if (d->currentLV->selectedItems().isEmpty()) {
320 int itemIndex = d->currentLV->indexOfTopLevelItem(item);
321 if (itemIndex == 0) {
324 d->currentLV->takeTopLevelItem(itemIndex);
325 d->currentLV->insertTopLevelItem(0, item);
326 d->currentLV->setCurrentItem(item);
327 enableDisableButtons(item);
331void Kleo::DNAttributeOrderConfigWidget::slotDownButtonClicked()
333 if (d->currentLV->selectedItems().isEmpty()) {
337 int itemIndex = d->currentLV->indexOfTopLevelItem(item);
338 if (itemIndex + 1 >= d->currentLV->topLevelItemCount()) {
341 d->currentLV->takeTopLevelItem(itemIndex);
342 d->currentLV->insertTopLevelItem(itemIndex + 1, item);
343 d->currentLV->setCurrentItem(item);
344 enableDisableButtons(item);
348void Kleo::DNAttributeOrderConfigWidget::slotDoubleDownButtonClicked()
350 if (d->currentLV->selectedItems().isEmpty()) {
354 const int itemIndex = d->currentLV->indexOfTopLevelItem(item);
355 if (itemIndex + 1 >= d->currentLV->topLevelItemCount()) {
358 d->currentLV->takeTopLevelItem(itemIndex);
359 d->currentLV->addTopLevelItem(item);
360 d->currentLV->setCurrentItem(item);
361 enableDisableButtons(item);
365void Kleo::DNAttributeOrderConfigWidget::slotLeftButtonClicked()
367 if (d->currentLV->selectedItems().isEmpty()) {
373 next = d->currentLV->itemAbove(right);
375 d->currentLV->takeTopLevelItem(d->currentLV->indexOfTopLevelItem(right));
376 d->availableLV->addTopLevelItem(right);
378 d->availableLV->setCurrentItem(right);
380 d->currentLV->setCurrentItem(next);
382 enableDisableButtons(next);
386void Kleo::DNAttributeOrderConfigWidget::slotRightButtonClicked()
388 if (d->availableLV->selectedItems().isEmpty()) {
394 next = d->availableLV->itemAbove(left);
396 d->availableLV->takeTopLevelItem(d->availableLV->indexOfTopLevelItem(left));
397 int newRightIndex = d->currentLV->topLevelItemCount();
398 if (!d->currentLV->selectedItems().isEmpty()) {
400 newRightIndex = d->currentLV->indexOfTopLevelItem(right);
402 d->currentLV->insertTopLevelItem(newRightIndex, left);
403 d->currentLV->setCurrentItem(left);
404 enableDisableButtons(left);
405 d->navTB[DNAttributeOrderConfigWidgetPrivate::Right]->setEnabled(next);
407 d->availableLV->setCurrentItem(next);
412void Kleo::DNAttributeOrderConfigWidget::virtual_hook(
int,
void *)
416#include "dnattributeorderconfigwidget.moc"
418#include "moc_dnattributeorderconfigwidget.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
QAction * next(const QObject *recvr, const char *slot, QObject *parent)
virtual void focusInEvent(QFocusEvent *event) override
void addStretch(int stretch)
QIcon fromTheme(const QString &name)
void push_back(parameter_type value)
QString toUpper() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QTextStream & left(QTextStream &stream)
QTextStream & right(QTextStream &stream)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void setAllColumnsShowFocus(bool enable)
void setText(int column, const QString &text)