Skip to content

Commit 08f8e63

Browse files
Adjustments around language picking.
1 parent 7016868 commit 08f8e63

File tree

6 files changed

+152
-55
lines changed

6 files changed

+152
-55
lines changed

extensions/includes/auth.mjs

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,6 @@
11
import { getRestUrl, httpPost } from './api.mjs';
22
import { getStringProperty } from './util.mjs';
33

4-
/**
5-
* Retrieves the path to the Tiled session file.
6-
* @returns {string} Path to the Tiled session file
7-
*/
8-
function getSessionFilePath() {
9-
return tiled.projectFilePath.replace('.tiled-project', '.tiled-session');
10-
}
11-
12-
/**
13-
* Retrieves wiki access token from the Tiled session file.
14-
* @returns {string|undefined} Wiki access token, if found
15-
*/
16-
export function getStoredToken() {
17-
try {
18-
const sessionFile = new TextFile(getSessionFilePath(), TextFile.ReadOnly);
19-
const data = JSON.parse(sessionFile.readAll());
20-
sessionFile.close();
21-
return data.wikiAccessToken;
22-
} catch (error) {
23-
return;
24-
}
25-
}
26-
27-
/**
28-
* Writes wiki access token to the Tiled session file.
29-
* @param {string} token Wiki access token
30-
*/
31-
export function storeToken(token) {
32-
try {
33-
const sessionFile = new TextFile(getSessionFilePath(), TextFile.ReadWrite);
34-
const data = JSON.parse(sessionFile.readAll());
35-
data.wikiAccessToken = token;
36-
sessionFile.truncate();
37-
sessionFile.write(JSON.stringify(data, null, 4));
38-
sessionFile.commit();
39-
} catch (error) {
40-
tiled.log('Failed to write access token!');
41-
}
42-
}
43-
444
/**
455
* Generates a code challenge.
466
*

extensions/includes/language.mjs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { getLastLanguage, storeLastLanguage } from './session.mjs';
2+
import { getStringProperty } from './util.mjs';
3+
4+
/**
5+
* Gets all wiki language codes for the current Tiled project.
6+
* @returns {string[]} Available wiki language codes
7+
*/
8+
function getLanguageCodes() {
9+
const languagesStr = getStringProperty(tiled.project, 'languages') || 'en';
10+
return languagesStr.split(',').map(lang => lang.trim());
11+
}
12+
13+
export function getLanguageNames() {
14+
return getLanguageCodes().map(code => Qt.locale(code).nativeLanguageName);
15+
}
16+
17+
/**
18+
* Gets the index in the list of languages selected by default.
19+
* @returns {number} Language index selected by default
20+
*/
21+
export function getDefaultLanguageIndex() {
22+
const lastLanguage = getLastLanguage();
23+
if (!lastLanguage) {
24+
return 0;
25+
}
26+
const languages = getLanguageCodes();
27+
const languageIndex = languages.indexOf(lastLanguage);
28+
if (languageIndex === -1) {
29+
return 0;
30+
}
31+
return languageIndex;
32+
}
33+
34+
/**
35+
* Finds the language at a specified index and saves it as the last used
36+
* language.
37+
* @param {number} index Selected index in the list
38+
* @returns {string} Language code that was selected
39+
*/
40+
export function selectLanguage(index) {
41+
const language = getLanguageCodes()[index];
42+
if (language) {
43+
storeLastLanguage(language);
44+
return language;
45+
}
46+
return 'en';
47+
}

extensions/includes/popup.mjs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getLanguageNames, selectLanguage } from './language.mjs';
12
import { getBoolProperty, getStringProperty } from './util.mjs';
23

34
/**
@@ -193,24 +194,23 @@ export default function selectedObjectsChanged(objects) {
193194
tiled.alert('This object cannot be converted to DataMaps on the wiki!');
194195
return;
195196
}
196-
const languagesStr = getStringProperty(tiled.project, 'languages') || 'en';
197-
const languages = languagesStr.split(',').map(lang => lang.trim());
198197
const dialog = new Dialog('Editing map marker');
199198
dialog.minimumWidth = 600;
200-
const languageSelect = dialog.addComboBox('Wiki language:', languages);
201-
languageSelect.visible = languages.length > 1;
199+
const languageNames = getLanguageNames();
200+
const languageSelect = dialog.addComboBox('Wiki language:', languageNames);
201+
languageSelect.visible = languageNames.length > 1;
202202
dialog.addNewRow();
203203
const handler = handlerFunc(object, dialog);
204204
languageSelect.currentIndexChanged.connect(index => {
205-
handler.updateLanguage(languages[index]);
205+
handler.updateLanguage(selectLanguage(index));
206206
});
207207
dialog.addButton('OK').clicked.connect(() => {
208-
handler.performChanges(languages[languageSelect.currentIndex]);
208+
handler.performChanges(selectLanguage(languageSelect.currentIndex));
209209
dialog.done(Dialog.Accepted);
210210
});
211211
dialog.addButton('Cancel').clicked.connect(() => {
212212
dialog.done(Dialog.Rejected);
213213
});
214-
handler.updateLanguage(languages[languageSelect.currentIndex]);
214+
handler.updateLanguage(selectLanguage(languageSelect.currentIndex));
215215
dialog.show();
216216
}

extensions/includes/publish.mjs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
import { APIError, edit, getLoggedInUser } from "./api.mjs";
2-
import { generateCodeChallenge, generateOAuthUrl, getAccessToken, getStoredToken, storeToken } from "./auth.mjs";
3-
import { convertMap } from "./format.mjs";
4-
import { getStringProperty } from "./util.mjs";
1+
import { APIError, edit, getLoggedInUser } from './api.mjs';
2+
import {
3+
generateCodeChallenge,
4+
generateOAuthUrl,
5+
getAccessToken
6+
} from './auth.mjs';
7+
import { convertMap } from './format.mjs';
8+
import { getDefaultLanguageIndex, getLanguageNames, selectLanguage } from './language.mjs';
9+
import { getStoredToken, storeToken } from './session.mjs';
510

611
/**
712
* Opens a URL in the user's default web browser.
@@ -45,17 +50,18 @@ If that does not work for you, you can also copy the URL from the console instea
4550
* @returns {Promise<[string, string]>} Selected language code
4651
*/
4752
function getEditInfo() {
48-
const languagesStr = getStringProperty(tiled.project, 'languages') || 'en';
49-
const languages = languagesStr.split(',').map(lang => lang.trim());
5053
const dialog = new Dialog('Publishing map to the wiki');
5154
dialog.minimumWidth = 600;
52-
const languageSelect = dialog.addComboBox('Wiki language:', languages);
55+
const languageNames = getLanguageNames();
56+
const languageSelect = dialog.addComboBox('Wiki language:', languageNames);
57+
languageSelect.currentIndex = getDefaultLanguageIndex();
58+
languageSelect.visible = languageNames.length > 1;
5359
dialog.addNewRow();
5460
const summary = dialog.addTextInput('Edit summary:', 'Published with Tiled DataMaps extension');
5561
dialog.addNewRow();
5662
return new Promise((resolve, reject) => {
5763
dialog.addButton('OK').clicked.connect(() => {
58-
resolve([languages[languageSelect.currentIndex], summary.text]);
64+
resolve([selectLanguage(languageSelect.currentIndex), summary.text]);
5965
dialog.done(Dialog.Accepted);
6066
});
6167
dialog.addButton('Cancel').clicked.connect(() => {

extensions/includes/session.mjs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
const ACCESS_TOKEN_PROPERTY = 'wikiAccessToken';
2+
const LAST_LANGUAGE_PROPERTY = 'wikiLastLanguage';
3+
4+
/**
5+
* Retrieves the path to the Tiled session file.
6+
* @returns {string} Path to the Tiled session file
7+
*/
8+
function getSessionFilePath() {
9+
return tiled.projectFilePath.replace('.tiled-project', '.tiled-session');
10+
}
11+
12+
/**
13+
* Retrieves a property from the Tiled session file.
14+
* @param {string} name Name of the property to retrieve
15+
* @returns {any} Property value
16+
*/
17+
function getSessionProperty(name) {
18+
try {
19+
const sessionFile = new TextFile(getSessionFilePath(), TextFile.ReadOnly);
20+
const data = JSON.parse(sessionFile.readAll());
21+
sessionFile.close();
22+
return data[name];
23+
} catch (error) {
24+
return;
25+
}
26+
}
27+
28+
/**
29+
* Writes a property to the Tiled session file.
30+
* @param {string} name Name of the property to store
31+
* @param {any} value Value of the property
32+
*/
33+
function setSessionProperty(name, value) {
34+
try {
35+
const sessionFile = new TextFile(getSessionFilePath(), TextFile.ReadWrite);
36+
const data = JSON.parse(sessionFile.readAll());
37+
data[name] = value;
38+
sessionFile.truncate();
39+
sessionFile.write(JSON.stringify(data, null, 4));
40+
sessionFile.commit();
41+
} catch (error) {
42+
tiled.log('Failed to write access token!');
43+
}
44+
}
45+
46+
/**
47+
* Retrieves wiki access token from the Tiled session file.
48+
* @returns {string|undefined} Wiki access token, if found
49+
*/
50+
export function getStoredToken() {
51+
return getSessionProperty(ACCESS_TOKEN_PROPERTY);
52+
}
53+
54+
/**
55+
* Writes wiki access token to the Tiled session file.
56+
* @param {string} token Wiki access token
57+
*/
58+
export function storeToken(token) {
59+
setSessionProperty(ACCESS_TOKEN_PROPERTY, token);
60+
}
61+
62+
/**
63+
* Retrieves the last language used from the Tiled session file.
64+
* @returns {string|undefined} Last language used, if found
65+
*/
66+
export function getLastLanguage() {
67+
return getSessionProperty(LAST_LANGUAGE_PROPERTY);
68+
}
69+
70+
/**
71+
* Writes the last language used to the Tiled session file.
72+
* @param {string} language Last language used
73+
*/
74+
export function storeLastLanguage(language) {
75+
setSessionProperty(LAST_LANGUAGE_PROPERTY, language);
76+
}
77+

extensions/types/qt.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
interface QLocale {
2+
nativeLanguageName: string;
3+
}
4+
5+
declare namespace Qt {
6+
export function locale(name: string): QLocale;
7+
}

0 commit comments

Comments
 (0)