Skip to content

Commit 58cf850

Browse files
authored
Make dictionary editable (#31)
* Make dictionary configurable
1 parent 11bd9bd commit 58cf850

19 files changed

+1044
-78
lines changed

CMakeLists.txt

+19
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,25 @@ find_package(PkgConfig REQUIRED)
1414
find_package(Fcitx5Core 5.0.6 REQUIRED)
1515
pkg_check_modules(LIBCSKK REQUIRED "cskk>=0.6.0")
1616

17+
option(ENABLE_QT "Enable Qt for GUI configuration" On)
18+
1719
include("${FCITX_INSTALL_CMAKECONFIG_DIR}/Fcitx5Utils/Fcitx5CompilerSettings.cmake")
1820

21+
# GUI related libs
22+
if (ENABLE_QT)
23+
find_package(Qt5 5.7 REQUIRED COMPONENTS Core Gui Widgets)
24+
find_package(Fcitx5Qt5WidgetsAddons REQUIRED)
25+
endif ()
26+
27+
# make default value header searchable
28+
set(SKK_DICT_DEFAULT_PATH "/usr/share/skk/SKK-JISYO.L" CACHE STRING "Default path of SKK Dictionary file")
29+
set(SKK_DICT_DEFAULT_ENCODING "euc-jp" CACHE STRING "Default encoding of SKK Dictionary file")
30+
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/skk_dict_config.h.in"
31+
"${CMAKE_CURRENT_BINARY_DIR}/skk_dict_config.h"
32+
IMMEDIATE @ONLY)
33+
include_directories(${CMAKE_CURRENT_BINARY_DIR})
34+
35+
# Googletest submodule setup
1936
find_package(Git QUIET)
2037
if (GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git")
2138
enable_testing()
@@ -46,6 +63,8 @@ add_subdirectory(src)
4663
add_subdirectory(data)
4764
add_subdirectory(po)
4865
add_subdirectory(test)
66+
add_subdirectory(gui)
67+
4968

5069
fcitx5_translate_desktop_file(
5170
org.fcitx.Fcitx5.Addon.Cskk.metainfo.xml.in

README.md

+25-5
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,33 @@ GOOGLETESTフラグはキャッシュされるのでライブラリ生成時に
4343
- [x] 変換候補リストのサイズ
4444

4545
### 実装内容・予定不明
46-
- [ ] 優先度、読み書き可不可の辞書リスト設定
46+
- [x] 優先度、読み書き可不可の辞書リスト設定
47+
48+
49+
### 辞書
50+
辞書の形式は [skk-dev](https://skk-dev.github.io/dict/) で配布されているものを想定している。
51+
52+
デフォルトでは/usr/share/skk/SKK-JISYO.L が euc-jp の読み取り専用辞書として使われる。
53+
54+
辞書はfcitx5のconfigtoolから設定可能。
55+
56+
57+
直接編集する場合は `~/.local/share/fcitx5/cskk/dictionary_list` に保存されている。
58+
','区切りのkey=valueリストで、type,file,mode,encodingを指定する。
59+
例として、
60+
61+
type=file,file=/usr/share/skk/SKK-JISYO.L,mode=readonly,encoding=euc-jp
62+
type=file,file=$FCITX_CONFIG_DIR/cskk/user.dict,mode=readwrite
63+
64+
typeはfileのみ。必須。
65+
66+
fileはファイルへのパスを指定する。必須。唯一文頭でのみ$FCITX_CONFIG_DIRのみ変数として使え、fcitx5の設定ディレクトリ(通常は~/.local/share/fcitx5)を指す。
67+
68+
modeはreadonlyまたはreadwrite。必須。
69+
70+
encodingに指定できる内容はlibcskkに準じる。必須。少なくとも"euc-jp"や"utf-8"が使える。
4771

4872

49-
### じしょ
50-
現在のところ $XDG_DATA_HOME/fcitx5-cskk/dictionary/\*.dict (多くの環境では$HOME/.local/share/fctix5-cskk/dictionary/\*.dict ) を読み書き可能な辞書として優先して読む。
51-
$XDG_DATA_DIRS/fcitx5-cskk/dictionary/\* (/usr/local/share/fcitx5-cskk/dictionary/\* 等) を読みとり専用辞書とする。
52-
文字コードはUTF-8のみに対応。ファイル名順。
5373

5474
## 著作権表示
5575

gui/CMakeLists.txt

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
set(CSKK_CONFIG_SRCS
2+
main.cpp
3+
dictwidget.cpp
4+
adddictdialog.cpp
5+
dictmodel.cpp
6+
)
7+
8+
if(NOT ENABLE_QT)
9+
return()
10+
endif()
11+
12+
add_library(fcitx5-cskk-config
13+
MODULE ${CSKK_CONFIG_SRCS})
14+
15+
set_target_properties(fcitx5-cskk-config PROPERTIES
16+
AUTOMOC TRUE
17+
AUTOUIC TRUE
18+
AUTOUIC_OPTIONS "-tr=fcitx::tr2fcitx;--include=fcitxqti18nhelper.h"
19+
)
20+
target_link_libraries(fcitx5-cskk-config
21+
Qt5::Core
22+
Qt5::Widgets
23+
Fcitx5Qt5::WidgetsAddons
24+
Fcitx5::Utils
25+
${LIBCSKK_LIBRARIES}
26+
)
27+
28+
install(TARGETS fcitx5-cskk-config DESTINATION ${CMAKE_INSTALL_LIBDIR}/fcitx5/qt5)

gui/adddictdialog.cpp

+114
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2013~2020 CSSlayer <[email protected]>
3+
*
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*
6+
*/
7+
8+
#include "adddictdialog.h"
9+
#include "skk_dict_config.h"
10+
#include <QDebug>
11+
#include <QFileDialog>
12+
#include <fcitx-utils/standardpath.h>
13+
#include <fcitxqti18nhelper.h>
14+
15+
#define FCITX_CONFIG_DIR "$FCITX_CONFIG_DIR"
16+
17+
namespace fcitx {
18+
19+
enum DictType { DictType_Static, DictType_User };
20+
21+
AddDictDialog::AddDictDialog(QWidget *parent)
22+
: QDialog(parent), m_ui(std::make_unique<Ui::AddDictDialog>()) {
23+
m_ui->setupUi(this);
24+
m_ui->typeComboBox->addItem(_("System"));
25+
m_ui->typeComboBox->addItem(_("User"));
26+
m_ui->typeComboBox->setCurrentIndex(1);
27+
28+
indexChanged(0);
29+
30+
connect(m_ui->browseButton, &QPushButton::clicked, this,
31+
&AddDictDialog::browseClicked);
32+
connect(m_ui->typeComboBox,
33+
QOverload<int>::of(&QComboBox::currentIndexChanged), this,
34+
&AddDictDialog::indexChanged);
35+
connect(m_ui->urlLineEdit, &QLineEdit::textChanged, this,
36+
&AddDictDialog::validate);
37+
}
38+
39+
QMap<QString, QString> AddDictDialog::dictionary() {
40+
int idx = m_ui->typeComboBox->currentIndex();
41+
idx = idx < 0 ? 0 : idx;
42+
idx = idx > 1 ? 0 : idx;
43+
44+
QMap<QString, QString> dict;
45+
const char *type[] = {"readonly", "readwrite"};
46+
47+
dict["type"] = "file";
48+
dict["file"] = m_ui->urlLineEdit->text();
49+
dict["mode"] = type[idx];
50+
dict["encoding"] = m_ui->encodingEdit->text();
51+
52+
return dict;
53+
}
54+
55+
void AddDictDialog::indexChanged([[maybe_unused]] int _idx) {
56+
validate();
57+
}
58+
59+
void AddDictDialog::validate() {
60+
const auto index = m_ui->typeComboBox->currentIndex();
61+
bool valid = true;
62+
switch (index) {
63+
case DictType_Static:
64+
case DictType_User:
65+
if (m_ui->urlLineEdit->text().isEmpty() || m_ui->encodingEdit->text().isEmpty()) {
66+
valid = false;
67+
}
68+
break;
69+
}
70+
m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid);
71+
}
72+
73+
void AddDictDialog::browseClicked() {
74+
QString path = m_ui->urlLineEdit->text();
75+
if (m_ui->typeComboBox->currentIndex() == DictType_Static) {
76+
QString dir;
77+
if (path.isEmpty()) {
78+
path = SKK_DICT_DEFAULT_PATH;
79+
}
80+
QFileInfo info(path);
81+
path = QFileDialog::getOpenFileName(this, _("Select Dictionary File"),
82+
info.path());
83+
} else {
84+
auto fcitxBasePath = stringutils::joinPath(
85+
StandardPath::global().userDirectory(StandardPath::Type::PkgData),
86+
"cskk");
87+
fs::makePath(fcitxBasePath);
88+
QString fcitxConfigBasePath =
89+
QDir::cleanPath(QString::fromStdString(fcitxBasePath));
90+
91+
if (path.isEmpty()) {
92+
auto baseDataPath = stringutils::joinPath(
93+
StandardPath::global().userDirectory(StandardPath::Type::Data), "fcitx5-cskk");
94+
fs::makePath(baseDataPath);
95+
QString basePath = QDir::cleanPath(QString::fromStdString(baseDataPath));
96+
path = basePath;
97+
} else if (path.startsWith(FCITX_CONFIG_DIR "/")) {
98+
99+
QDir dir(fcitxConfigBasePath);
100+
path = dir.filePath(path.mid(strlen(FCITX_CONFIG_DIR) + 1));
101+
}
102+
path =
103+
QFileDialog::getOpenFileName(this, _("Select Dictionary File"), path);
104+
if (path.startsWith(fcitxConfigBasePath + "/")) {
105+
path = FCITX_CONFIG_DIR + path.mid(fcitxConfigBasePath.length(), -1);
106+
}
107+
}
108+
109+
if (!path.isEmpty()) {
110+
m_ui->urlLineEdit->setText(path);
111+
}
112+
}
113+
114+
} // namespace fcitx

gui/adddictdialog.h

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2013~2020 CSSlayer <[email protected]>
3+
*
4+
* SPDX-License-Identifier: GPL-3.0-or-later
5+
*
6+
*/
7+
8+
#ifndef ADDDICTDIALOG_H
9+
#define ADDDICTDIALOG_H
10+
11+
#include <memory>
12+
#include <QDialog>
13+
#include <QMap>
14+
#include "ui_adddictdialog.h"
15+
16+
namespace fcitx {
17+
18+
class AddDictDialog : public QDialog {
19+
Q_OBJECT
20+
public:
21+
explicit AddDictDialog(QWidget *parent = 0);
22+
QMap<QString, QString> dictionary();
23+
24+
public Q_SLOTS:
25+
void browseClicked();
26+
void indexChanged([[maybe_unused]] int);
27+
void validate();
28+
29+
private:
30+
std::unique_ptr<Ui::AddDictDialog> m_ui;
31+
};
32+
33+
} // namespace fcitx
34+
35+
#endif // ADDDICTDIALOG_H

0 commit comments

Comments
 (0)