Skip to content

Commit 7ebe7a4

Browse files
committed
Improve language/layout order in layout selector
1 parent 84c5d21 commit 7ebe7a4

File tree

9 files changed

+102
-42
lines changed

9 files changed

+102
-42
lines changed

src/kcm/ui/SelectLayoutSheet.qml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Kirigami.OverlaySheet {
2525
}
2626

2727
Kirigami.FormLayout {
28-
implicitWidth: Kirigami.Units.gridUnit * 45
28+
implicitWidth: Kirigami.Units.gridUnit * 30
2929

3030
ComboBox {
3131
id: languageComboBox

src/lib/configlib/addonmodel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ bool AddonProxyModel::lessThan(const QModelIndex &left,
362362

363363
QString l = left.data(Qt::DisplayRole).toString();
364364
QString r = right.data(Qt::DisplayRole).toString();
365-
return QCollator().compare(l, r) < 0;
365+
return QString::localeAwareCompare(l, r) < 0;
366366
}
367367

368368
void AddonProxyModel::setFilterText(const QString &text) {

src/lib/configlib/layoutmodel.cpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,35 @@
55
*
66
*/
77
#include "layoutmodel.h"
8+
#include <QHash>
9+
#include <QObject>
10+
#include <QStandardItem>
11+
#include <QStringList>
12+
#include <Qt>
13+
#include <fcitx-utils/i18n.h>
14+
#include <fcitxqtdbustypes.h>
15+
#include <utility>
816

9-
namespace fcitx {
10-
namespace kcm {
17+
namespace fcitx::kcm {
1118

1219
LanguageModel::LanguageModel(QObject *parent) : QStandardItemModel(parent) {
1320
setItemRoleNames({{Qt::DisplayRole, "name"}, {Qt::UserRole, "language"}});
1421
}
1522

16-
QString LanguageModel::language(int row) const {
23+
void LanguageModel::append(const QString &name, const QString &language) {
24+
QStandardItem *item = new QStandardItem(name);
25+
item->setData(language, Qt::UserRole);
26+
appendRow(item);
27+
}
28+
29+
QString SortedLanguageModel::language(int row) const {
1730
auto idx = index(row, 0);
1831
if (idx.isValid()) {
1932
return idx.data(Qt::UserRole).toString();
2033
}
2134
return QString();
2235
}
2336

24-
void LanguageModel::append(const QString &name, const QString &language) {
25-
QStandardItem *item = new QStandardItem(name);
26-
item->setData(language, Qt::UserRole);
27-
appendRow(item);
28-
}
29-
3037
void LanguageFilterModel::setLanguage(const QString &language) {
3138
if (language_ != language) {
3239
language_ = language;
@@ -56,8 +63,9 @@ bool LanguageFilterModel::filterAcceptsRow(int source_row,
5663
}
5764
bool LanguageFilterModel::lessThan(const QModelIndex &left,
5865
const QModelIndex &right) const {
59-
return data(left, Qt::DisplayRole).toString() <
60-
data(right, Qt::DisplayRole).toString();
66+
return QString::localeAwareCompare(left.data(Qt::DisplayRole).toString(),
67+
right.data(Qt::DisplayRole).toString()) <
68+
0;
6169
}
6270

6371
QHash<int, QByteArray> LayoutInfoModel::roleNames() const {
@@ -157,5 +165,4 @@ int VariantInfoModel::rowCount(const QModelIndex &parent) const {
157165
return variantInfo_.size();
158166
}
159167

160-
} // namespace kcm
161-
} // namespace fcitx
168+
} // namespace fcitx::kcm

src/lib/configlib/layoutmodel.h

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,57 @@
77
#ifndef _CONFIGLIB_LAYOUTMODEL_H_
88
#define _CONFIGLIB_LAYOUTMODEL_H_
99

10+
#include <QAbstractItemModel>
11+
#include <QHash>
12+
#include <QObject>
1013
#include <QSortFilterProxyModel>
1114
#include <QStandardItemModel>
15+
#include <QString>
16+
#include <Qt>
1217
#include <fcitx-utils/i18n.h>
1318
#include <fcitxqtdbustypes.h>
19+
#include <qdebug.h>
20+
#include <qlogging.h>
21+
#include <qnamespace.h>
1422

15-
namespace fcitx {
16-
namespace kcm {
23+
namespace fcitx::kcm {
1724

1825
enum { LayoutLanguageRole = 0x3423545, LayoutInfoRole };
1926

2027
class LanguageModel : public QStandardItemModel {
2128
Q_OBJECT
2229
public:
2330
LanguageModel(QObject *parent = nullptr);
24-
Q_INVOKABLE QString language(int row) const;
2531
void append(const QString &name, const QString &language);
2632
};
2733

34+
class SortedLanguageModel : public QSortFilterProxyModel {
35+
Q_OBJECT
36+
public:
37+
using QSortFilterProxyModel::QSortFilterProxyModel;
38+
// Forward role names.
39+
QHash<int, QByteArray> roleNames() const override {
40+
if (sourceModel()) {
41+
return sourceModel()->roleNames();
42+
}
43+
return QSortFilterProxyModel::roleNames();
44+
}
45+
Q_INVOKABLE QString language(int row) const;
46+
47+
protected:
48+
bool lessThan(const QModelIndex &left,
49+
const QModelIndex &right) const override {
50+
const bool leftIsAny = left.data(Qt::UserRole).toString().isEmpty();
51+
const bool rightIsAny = right.data(Qt::UserRole).toString().isEmpty();
52+
if (leftIsAny || rightIsAny) {
53+
return leftIsAny > rightIsAny;
54+
}
55+
return QString::localeAwareCompare(
56+
left.data(Qt::DisplayRole).toString(),
57+
right.data(Qt::DisplayRole).toString()) < 0;
58+
}
59+
};
60+
2861
class LanguageFilterModel : public QSortFilterProxyModel {
2962
Q_OBJECT
3063
Q_PROPERTY(QString language READ language WRITE setLanguage);
@@ -89,7 +122,6 @@ class VariantInfoModel : public QAbstractListModel {
89122
FcitxQtVariantInfoList variantInfo_;
90123
};
91124

92-
} // namespace kcm
93-
} // namespace fcitx
125+
} // namespace fcitx::kcm
94126

95127
#endif // _CONFIGLIB_LAYOUTMODEL_H_

src/lib/configlib/layoutprovider.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,34 @@
66
*/
77
#include "layoutprovider.h"
88
#include "dbusprovider.h"
9+
#include "layoutmodel.h"
10+
#include <QDBusPendingReply>
11+
#include <QObject>
12+
#include <QSet>
13+
#include <QStandardItem>
14+
#include <QString>
15+
#include <QStringList>
16+
#include <Qt>
17+
#include <algorithm>
18+
#include <fcitx-utils/i18n.h>
19+
#include <fcitxqtdbustypes.h>
20+
#include <iterator>
21+
#include <utility>
922

10-
namespace fcitx {
11-
namespace kcm {
23+
namespace fcitx::kcm {
1224

1325
LayoutProvider::LayoutProvider(DBusProvider *dbus, QObject *parent)
1426
: QObject(parent), dbus_(dbus), languageModel_(new LanguageModel(this)),
27+
sortedLanguageModel_(new SortedLanguageModel(this)),
1528
layoutModel_(new LayoutInfoModel(this)),
1629
variantModel_(new VariantInfoModel(this)),
1730
layoutFilterModel_(new LanguageFilterModel(this)),
1831
variantFilterModel_(new LanguageFilterModel(this)) {
1932
layoutFilterModel_->setSourceModel(layoutModel_);
2033
variantFilterModel_->setSourceModel(variantModel_);
21-
34+
sortedLanguageModel_->setSourceModel(languageModel_);
35+
sortedLanguageModel_->sort(0);
36+
layoutFilterModel_->sort(0);
2237
connect(dbus, &DBusProvider::availabilityChanged, this,
2338
&LayoutProvider::availabilityChanged);
2439
availabilityChanged();
@@ -154,5 +169,4 @@ QString LayoutProvider::layoutDescription(const QString &layoutString) {
154169
.arg(iter->description(), variantIter->description());
155170
}
156171

157-
} // namespace kcm
158-
} // namespace fcitx
172+
} // namespace fcitx::kcm

src/lib/configlib/layoutprovider.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@
99

1010
#include "iso639.h"
1111
#include "layoutmodel.h"
12+
#include <QAbstractItemModel>
13+
#include <QObject>
1214
#include <QSortFilterProxyModel>
1315
#include <QStandardItemModel>
16+
#include <QString>
1417
#include <QStringListModel>
18+
#include <QStringLiteral>
19+
#include <Qt>
1520
#include <fcitxqtdbustypes.h>
1621

1722
class QDBusPendingCallWatcher;
@@ -26,15 +31,14 @@ class VariantInfoModel;
2631

2732
class LayoutProvider : public QObject {
2833
Q_OBJECT
29-
Q_PROPERTY(
30-
fcitx::kcm::LanguageModel *languageModel READ languageModel CONSTANT)
34+
Q_PROPERTY(QAbstractItemModel *languageModel READ languageModel CONSTANT)
3135
Q_PROPERTY(LanguageFilterModel *layoutModel READ layoutModel CONSTANT)
3236
Q_PROPERTY(LanguageFilterModel *variantModel READ variantModel CONSTANT)
3337
public:
3438
LayoutProvider(DBusProvider *dbus, QObject *parent = nullptr);
3539
~LayoutProvider();
3640

37-
auto languageModel() const { return languageModel_; }
41+
QAbstractItemModel *languageModel() const { return sortedLanguageModel_; }
3842
auto layoutModel() const { return layoutFilterModel_; }
3943
auto variantModel() const { return variantFilterModel_; }
4044

@@ -83,6 +87,7 @@ private Q_SLOTS:
8387
DBusProvider *dbus_;
8488
bool loaded_ = false;
8589
LanguageModel *languageModel_;
90+
SortedLanguageModel *sortedLanguageModel_;
8691
LayoutInfoModel *layoutModel_;
8792
VariantInfoModel *variantModel_;
8893
LanguageFilterModel *layoutFilterModel_;

src/lib/configlib/model.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ bool IMProxyModel::lessThan(const QModelIndex &left,
342342

343343
QString l = left.data(Qt::DisplayRole).toString();
344344
QString r = right.data(Qt::DisplayRole).toString();
345-
return QCollator().compare(l, r) < 0;
345+
return QString::localeAwareCompare(l, r) < 0;
346346
}
347347

348348
int IMProxyModel::compareCategories(const QModelIndex &left,

src/lib/configwidgetslib/layoutselector.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,8 @@ void LayoutSelector::setLayout(const QString &layout, const QString &variant) {
9595
}
9696
ui_->languageComboBox->setCurrentIndex(0);
9797
ui_->layoutComboBox->setCurrentIndex(layoutProvider_->layoutIndex(layout));
98-
if (variant.isEmpty()) {
99-
ui_->variantComboBox->setCurrentIndex(0);
100-
} else {
101-
ui_->variantComboBox->setCurrentIndex(
102-
layoutProvider_->variantIndex(variant));
103-
}
98+
ui_->variantComboBox->setCurrentIndex(
99+
layoutProvider_->variantIndex(variant));
104100
preSelectLayout_.clear();
105101
preSelectVariant_.clear();
106102
}

src/lib/configwidgetslib/layoutselector.ui

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>400</width>
9+
<width>600</width>
1010
<height>300</height>
1111
</rect>
1212
</property>
@@ -16,31 +16,37 @@
1616
<layout class="QVBoxLayout" name="verticalLayout">
1717
<item>
1818
<layout class="QFormLayout" name="formLayout">
19-
<item row="1" column="0">
19+
<item row="0" column="0">
2020
<widget class="QLabel" name="label_3">
2121
<property name="text">
2222
<string>Language:</string>
2323
</property>
2424
</widget>
2525
</item>
26-
<item row="1" column="1">
26+
<item row="0" column="1">
2727
<widget class="QComboBox" name="languageComboBox">
2828
<property name="sizePolicy">
2929
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
3030
<horstretch>0</horstretch>
3131
<verstretch>0</verstretch>
3232
</sizepolicy>
3333
</property>
34+
<property name="minimumSize">
35+
<size>
36+
<width>400</width>
37+
<height>0</height>
38+
</size>
39+
</property>
3440
</widget>
3541
</item>
36-
<item row="2" column="0">
42+
<item row="1" column="0">
3743
<widget class="QLabel" name="label">
3844
<property name="text">
3945
<string>Layout:</string>
4046
</property>
4147
</widget>
4248
</item>
43-
<item row="2" column="1">
49+
<item row="1" column="1">
4450
<widget class="QComboBox" name="layoutComboBox">
4551
<property name="sizePolicy">
4652
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
@@ -50,14 +56,14 @@
5056
</property>
5157
</widget>
5258
</item>
53-
<item row="3" column="0">
59+
<item row="2" column="0">
5460
<widget class="QLabel" name="label_2">
5561
<property name="text">
5662
<string>Variant:</string>
5763
</property>
5864
</widget>
5965
</item>
60-
<item row="3" column="1">
66+
<item row="2" column="1">
6167
<widget class="QComboBox" name="variantComboBox">
6268
<property name="sizePolicy">
6369
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">

0 commit comments

Comments
 (0)