Allow searching USA by 'United States'.

This commit is contained in:
John Preston 2019-06-22 14:01:54 +02:00
parent dc102bd9e8
commit a4d83b679a
10 changed files with 493 additions and 481 deletions

View File

@ -11,7 +11,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "storage/localstorage.h" #include "storage/localstorage.h"
#include "mainwidget.h" #include "mainwidget.h"
#include "mainwindow.h" #include "mainwindow.h"
#include "countries.h"
#include "auth_session.h" #include "auth_session.h"
#include "data/data_session.h" #include "data/data_session.h"
#include "boxes/confirm_box.h" #include "boxes/confirm_box.h"

View File

@ -1,255 +0,0 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
struct CountryInfo {
CountryInfo(const char *_name, const char *_iso2, const char *_code) : name(_name), iso2(_iso2), code(_code) {
}
const char *name, *iso2, *code;
};
static const CountryInfo countries[] = {
CountryInfo("Afghanistan", "AF", "93"),
CountryInfo("Albania", "AL", "355"),
CountryInfo("Algeria", "DZ", "213"),
CountryInfo("American Samoa", "AS", "1684"),
CountryInfo("Andorra", "AD", "376"),
CountryInfo("Angola", "AO", "244"),
CountryInfo("Anguilla", "AI", "1264"),
CountryInfo("Antigua & Barbuda", "AG", "1268"),
CountryInfo("Argentina", "AR", "54"),
CountryInfo("Armenia", "AM", "374"),
CountryInfo("Aruba", "AW", "297"),
CountryInfo("Australia", "AU", "61"),
CountryInfo("Austria", "AT", "43"),
CountryInfo("Azerbaijan", "AZ", "994"),
CountryInfo("Bahamas", "BS", "1242"),
CountryInfo("Bahrain", "BH", "973"),
CountryInfo("Bangladesh", "BD", "880"),
CountryInfo("Barbados", "BB", "1246"),
CountryInfo("Belarus", "BY", "375"),
CountryInfo("Belgium", "BE", "32"),
CountryInfo("Belize", "BZ", "501"),
CountryInfo("Benin", "BJ", "229"),
CountryInfo("Bermuda", "BM", "1441"),
CountryInfo("Bhutan", "BT", "975"),
CountryInfo("Bolivia", "BO", "591"),
CountryInfo("Bonaire, Sint Eustatius & Saba", "BQ", "599"),
CountryInfo("Bosnia & Herzegovina", "BA", "387"),
CountryInfo("Botswana", "BW", "267"),
CountryInfo("Brazil", "BR", "55"),
CountryInfo("British Virgin Islands", "VG", "1284"),
CountryInfo("Brunei Darussalam", "BN", "673"),
CountryInfo("Bulgaria", "BG", "359"),
CountryInfo("Burkina Faso", "BF", "226"),
CountryInfo("Burundi", "BI", "257"),
CountryInfo("Cambodia", "KH", "855"),
CountryInfo("Cameroon", "CM", "237"),
CountryInfo("Canada", "CA", "1"),
CountryInfo("Cape Verde", "CV", "238"),
CountryInfo("Cayman Islands", "KY", "1345"),
CountryInfo("Central African Republic", "CF", "236"),
CountryInfo("Chad", "TD", "235"),
CountryInfo("Chile", "CL", "56"),
CountryInfo("China", "CN", "86"),
CountryInfo("Colombia", "CO", "57"),
CountryInfo("Comoros", "KM", "269"),
CountryInfo("Congo", "CG", "242"),
CountryInfo("Congo, Democratic Republic", "CD", "243"),
CountryInfo("Cook Islands", "CK", "682"),
CountryInfo("Costa Rica", "CR", "506"),
CountryInfo("Croatia", "HR", "385"),
CountryInfo("Cuba", "CU", "53"),
CountryInfo("Curaçao", "CW", "599"),
CountryInfo("Cyprus", "CY", "357"),
CountryInfo("Czech Republic", "CZ", "420"),
CountryInfo("Côte d`Ivoire", "CI", "225"),
CountryInfo("Denmark", "DK", "45"),
CountryInfo("Diego Garcia", "IO", "246"),
CountryInfo("Djibouti", "DJ", "253"),
CountryInfo("Dominica", "DM", "1767"),
CountryInfo("Dominican Republic", "DO", "1"),
CountryInfo("Ecuador", "EC", "593"),
CountryInfo("Egypt", "EG", "20"),
CountryInfo("El Salvador", "SV", "503"),
CountryInfo("Equatorial Guinea", "GQ", "240"),
CountryInfo("Eritrea", "ER", "291"),
CountryInfo("Estonia", "EE", "372"),
CountryInfo("Ethiopia", "ET", "251"),
CountryInfo("Falkland Islands", "FK", "500"),
CountryInfo("Faroe Islands", "FO", "298"),
CountryInfo("Fiji", "FJ", "679"),
CountryInfo("Finland", "FI", "358"),
CountryInfo("France", "FR", "33"),
CountryInfo("French Guiana", "GF", "594"),
CountryInfo("French Polynesia", "PF", "689"),
CountryInfo("Gabon", "GA", "241"),
CountryInfo("Gambia", "GM", "220"),
CountryInfo("Georgia", "GE", "995"),
CountryInfo("Germany", "DE", "49"),
CountryInfo("Ghana", "GH", "233"),
CountryInfo("Gibraltar", "GI", "350"),
CountryInfo("Greece", "GR", "30"),
CountryInfo("Greenland", "GL", "299"),
CountryInfo("Grenada", "GD", "1473"),
CountryInfo("Guadeloupe", "GP", "590"),
CountryInfo("Guam", "GU", "1671"),
CountryInfo("Guatemala", "GT", "502"),
CountryInfo("Guinea", "GN", "224"),
CountryInfo("Guinea-Bissau", "GW", "245"),
CountryInfo("Guyana", "GY", "592"),
CountryInfo("Haiti", "HT", "509"),
CountryInfo("Honduras", "HN", "504"),
CountryInfo("Hong Kong", "HK", "852"),
CountryInfo("Hungary", "HU", "36"),
CountryInfo("Iceland", "IS", "354"),
CountryInfo("India", "IN", "91"),
CountryInfo("Indonesia", "ID", "62"),
CountryInfo("Iran", "IR", "98"),
CountryInfo("Iraq", "IQ", "964"),
CountryInfo("Ireland", "IE", "353"),
CountryInfo("Israel", "IL", "972"),
CountryInfo("Italy", "IT", "39"),
CountryInfo("Jamaica", "JM", "1876"),
CountryInfo("Japan", "JP", "81"),
CountryInfo("Jordan", "JO", "962"),
CountryInfo("Kazakhstan", "KZ", "7"),
CountryInfo("Kenya", "KE", "254"),
CountryInfo("Kiribati", "KI", "686"),
CountryInfo("Kuwait", "KW", "965"),
CountryInfo("Kyrgyzstan", "KG", "996"),
CountryInfo("Laos", "LA", "856"),
CountryInfo("Latvia", "LV", "371"),
CountryInfo("Lebanon", "LB", "961"),
CountryInfo("Lesotho", "LS", "266"),
CountryInfo("Liberia", "LR", "231"),
CountryInfo("Libya", "LY", "218"),
CountryInfo("Liechtenstein", "LI", "423"),
CountryInfo("Lithuania", "LT", "370"),
CountryInfo("Luxembourg", "LU", "352"),
CountryInfo("Macau", "MO", "853"),
CountryInfo("Macedonia", "MK", "389"),
CountryInfo("Madagascar", "MG", "261"),
CountryInfo("Malawi", "MW", "265"),
CountryInfo("Malaysia", "MY", "60"),
CountryInfo("Maldives", "MV", "960"),
CountryInfo("Mali", "ML", "223"),
CountryInfo("Malta", "MT", "356"),
CountryInfo("Marshall Islands", "MH", "692"),
CountryInfo("Martinique", "MQ", "596"),
CountryInfo("Mauritania", "MR", "222"),
CountryInfo("Mauritius", "MU", "230"),
CountryInfo("Mexico", "MX", "52"),
CountryInfo("Micronesia", "FM", "691"),
CountryInfo("Moldova", "MD", "373"),
CountryInfo("Monaco", "MC", "377"),
CountryInfo("Mongolia", "MN", "976"),
CountryInfo("Montenegro", "ME", "382"),
CountryInfo("Montserrat", "MS", "1664"),
CountryInfo("Morocco", "MA", "212"),
CountryInfo("Mozambique", "MZ", "258"),
CountryInfo("Myanmar", "MM", "95"),
CountryInfo("Namibia", "NA", "264"),
CountryInfo("Nauru", "NR", "674"),
CountryInfo("Nepal", "NP", "977"),
CountryInfo("Netherlands", "NL", "31"),
CountryInfo("New Caledonia", "NC", "687"),
CountryInfo("New Zealand", "NZ", "64"),
CountryInfo("Nicaragua", "NI", "505"),
CountryInfo("Niger", "NE", "227"),
CountryInfo("Nigeria", "NG", "234"),
CountryInfo("Niue", "NU", "683"),
CountryInfo("Norfolk Island", "NF", "672"),
CountryInfo("North Korea", "KP", "850"),
CountryInfo("Northern Mariana Islands", "MP", "1670"),
CountryInfo("Norway", "NO", "47"),
CountryInfo("Oman", "OM", "968"),
CountryInfo("Pakistan", "PK", "92"),
CountryInfo("Palau", "PW", "680"),
CountryInfo("Palestine", "PS", "970"),
CountryInfo("Panama", "PA", "507"),
CountryInfo("Papua New Guinea", "PG", "675"),
CountryInfo("Paraguay", "PY", "595"),
CountryInfo("Peru", "PE", "51"),
CountryInfo("Philippines", "PH", "63"),
CountryInfo("Poland", "PL", "48"),
CountryInfo("Portugal", "PT", "351"),
CountryInfo("Puerto Rico", "PR", "1"),
CountryInfo("Qatar", "QA", "974"),
CountryInfo("Romania", "RO", "40"),
CountryInfo("Russian Federation", "RU", "7"),
CountryInfo("Rwanda", "RW", "250"),
CountryInfo("Réunion", "RE", "262"),
CountryInfo("Saint Helena", "SH", "247"),
CountryInfo("Saint Helena", "SH2", "290"),
CountryInfo("Saint Kitts & Nevis", "KN", "1869"),
CountryInfo("Saint Lucia", "LC", "1758"),
CountryInfo("Saint Pierre & Miquelon", "PM", "508"),
CountryInfo("Saint Vincent & the Grenadines", "VC", "1784"),
CountryInfo("Samoa", "WS", "685"),
CountryInfo("San Marino", "SM", "378"),
CountryInfo("Saudi Arabia", "SA", "966"),
CountryInfo("Senegal", "SN", "221"),
CountryInfo("Serbia", "RS", "381"),
CountryInfo("Seychelles", "SC", "248"),
CountryInfo("Sierra Leone", "SL", "232"),
CountryInfo("Singapore", "SG", "65"),
CountryInfo("Sint Maarten", "SX", "1721"),
CountryInfo("Slovakia", "SK", "421"),
CountryInfo("Slovenia", "SI", "386"),
CountryInfo("Solomon Islands", "SB", "677"),
CountryInfo("Somalia", "SO", "252"),
CountryInfo("South Africa", "ZA", "27"),
CountryInfo("South Korea", "KR", "82"),
CountryInfo("South Sudan", "SS", "211"),
CountryInfo("Spain", "ES", "34"),
CountryInfo("Sri Lanka", "LK", "94"),
CountryInfo("Sudan", "SD", "249"),
CountryInfo("Suriname", "SR", "597"),
CountryInfo("Swaziland", "SZ", "268"),
CountryInfo("Sweden", "SE", "46"),
CountryInfo("Switzerland", "CH", "41"),
CountryInfo("Syrian Arab Republic", "SY", "963"),
CountryInfo("São Tomé & Príncipe", "ST", "239"),
CountryInfo("Taiwan", "TW", "886"),
CountryInfo("Tajikistan", "TJ", "992"),
CountryInfo("Tanzania", "TZ", "255"),
CountryInfo("Thailand", "TH", "66"),
CountryInfo("Timor-Leste", "TL", "670"),
CountryInfo("Togo", "TG", "228"),
CountryInfo("Tokelau", "TK", "690"),
CountryInfo("Tonga", "TO", "676"),
CountryInfo("Trinidad & Tobago", "TT", "1868"),
CountryInfo("Tunisia", "TN", "216"),
CountryInfo("Turkey", "TR", "90"),
CountryInfo("Turkmenistan", "TM", "993"),
CountryInfo("Turks & Caicos Islands", "TC", "1649"),
CountryInfo("Tuvalu", "TV", "688"),
CountryInfo("US Virgin Islands", "VI", "1340"),
CountryInfo("USA", "US", "1"),
CountryInfo("Uganda", "UG", "256"),
CountryInfo("Ukraine", "UA", "380"),
CountryInfo("United Arab Emirates", "AE", "971"),
CountryInfo("United Kingdom", "GB", "44"),
CountryInfo("Uruguay", "UY", "598"),
CountryInfo("Uzbekistan", "UZ", "998"),
CountryInfo("Vanuatu", "VU", "678"),
CountryInfo("Venezuela", "VE", "58"),
CountryInfo("Vietnam", "VN", "84"),
CountryInfo("Wallis & Futuna", "WF", "681"),
CountryInfo("Yemen", "YE", "967"),
CountryInfo("Zambia", "ZM", "260"),
CountryInfo("Zimbabwe", "ZW", "263"),
};
typedef QHash<QString, const CountryInfo *> CountriesByCode;
typedef QHash<QString, const CountryInfo *> CountriesByISO2;
const CountriesByCode &countriesByCode();
const CountriesByISO2 &countriesByISO2();

View File

@ -0,0 +1,301 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "data/data_countries.h"
namespace Data {
namespace {
const std::array<CountryInfo, 231> List = { {
{ "Afghanistan", "AF", "93" },
{ "Albania", "AL", "355" },
{ "Algeria", "DZ", "213" },
{ "American Samoa", "AS", "1684" },
{ "Andorra", "AD", "376" },
{ "Angola", "AO", "244" },
{ "Anguilla", "AI", "1264" },
{ "Antigua & Barbuda", "AG", "1268" },
{ "Argentina", "AR", "54" },
{ "Armenia", "AM", "374" },
{ "Aruba", "AW", "297" },
{ "Australia", "AU", "61" },
{ "Austria", "AT", "43" },
{ "Azerbaijan", "AZ", "994" },
{ "Bahamas", "BS", "1242" },
{ "Bahrain", "BH", "973" },
{ "Bangladesh", "BD", "880" },
{ "Barbados", "BB", "1246" },
{ "Belarus", "BY", "375" },
{ "Belgium", "BE", "32" },
{ "Belize", "BZ", "501" },
{ "Benin", "BJ", "229" },
{ "Bermuda", "BM", "1441" },
{ "Bhutan", "BT", "975" },
{ "Bolivia", "BO", "591" },
{ "Bonaire, Sint Eustatius & Saba", "BQ", "599" },
{ "Bosnia & Herzegovina", "BA", "387" },
{ "Botswana", "BW", "267" },
{ "Brazil", "BR", "55" },
{ "British Virgin Islands", "VG", "1284" },
{ "Brunei Darussalam", "BN", "673" },
{ "Bulgaria", "BG", "359" },
{ "Burkina Faso", "BF", "226" },
{ "Burundi", "BI", "257" },
{ "Cambodia", "KH", "855" },
{ "Cameroon", "CM", "237" },
{ "Canada", "CA", "1" },
{ "Cape Verde", "CV", "238" },
{ "Cayman Islands", "KY", "1345" },
{ "Central African Republic", "CF", "236" },
{ "Chad", "TD", "235" },
{ "Chile", "CL", "56" },
{ "China", "CN", "86" },
{ "Colombia", "CO", "57" },
{ "Comoros", "KM", "269" },
{ "Congo", "CG", "242" },
{ "Congo, Democratic Republic", "CD", "243" },
{ "Cook Islands", "CK", "682" },
{ "Costa Rica", "CR", "506" },
{ "Croatia", "HR", "385" },
{ "Cuba", "CU", "53" },
{ "Curaçao", "CW", "599" },
{ "Cyprus", "CY", "357" },
{ "Czech Republic", "CZ", "420" },
{ "Côte d`Ivoire", "CI", "225" },
{ "Denmark", "DK", "45" },
{ "Diego Garcia", "IO", "246" },
{ "Djibouti", "DJ", "253" },
{ "Dominica", "DM", "1767" },
{ "Dominican Republic", "DO", "1" },
{ "Ecuador", "EC", "593" },
{ "Egypt", "EG", "20" },
{ "El Salvador", "SV", "503" },
{ "Equatorial Guinea", "GQ", "240" },
{ "Eritrea", "ER", "291" },
{ "Estonia", "EE", "372" },
{ "Ethiopia", "ET", "251" },
{ "Falkland Islands", "FK", "500" },
{ "Faroe Islands", "FO", "298" },
{ "Fiji", "FJ", "679" },
{ "Finland", "FI", "358" },
{ "France", "FR", "33" },
{ "French Guiana", "GF", "594" },
{ "French Polynesia", "PF", "689" },
{ "Gabon", "GA", "241" },
{ "Gambia", "GM", "220" },
{ "Georgia", "GE", "995" },
{ "Germany", "DE", "49" },
{ "Ghana", "GH", "233" },
{ "Gibraltar", "GI", "350" },
{ "Greece", "GR", "30" },
{ "Greenland", "GL", "299" },
{ "Grenada", "GD", "1473" },
{ "Guadeloupe", "GP", "590" },
{ "Guam", "GU", "1671" },
{ "Guatemala", "GT", "502" },
{ "Guinea", "GN", "224" },
{ "Guinea-Bissau", "GW", "245" },
{ "Guyana", "GY", "592" },
{ "Haiti", "HT", "509" },
{ "Honduras", "HN", "504" },
{ "Hong Kong", "HK", "852" },
{ "Hungary", "HU", "36" },
{ "Iceland", "IS", "354" },
{ "India", "IN", "91" },
{ "Indonesia", "ID", "62" },
{ "Iran", "IR", "98" },
{ "Iraq", "IQ", "964" },
{ "Ireland", "IE", "353" },
{ "Israel", "IL", "972" },
{ "Italy", "IT", "39" },
{ "Jamaica", "JM", "1876" },
{ "Japan", "JP", "81" },
{ "Jordan", "JO", "962" },
{ "Kazakhstan", "KZ", "7" },
{ "Kenya", "KE", "254" },
{ "Kiribati", "KI", "686" },
{ "Kuwait", "KW", "965" },
{ "Kyrgyzstan", "KG", "996" },
{ "Laos", "LA", "856" },
{ "Latvia", "LV", "371" },
{ "Lebanon", "LB", "961" },
{ "Lesotho", "LS", "266" },
{ "Liberia", "LR", "231" },
{ "Libya", "LY", "218" },
{ "Liechtenstein", "LI", "423" },
{ "Lithuania", "LT", "370" },
{ "Luxembourg", "LU", "352" },
{ "Macau", "MO", "853" },
{ "Macedonia", "MK", "389" },
{ "Madagascar", "MG", "261" },
{ "Malawi", "MW", "265" },
{ "Malaysia", "MY", "60" },
{ "Maldives", "MV", "960" },
{ "Mali", "ML", "223" },
{ "Malta", "MT", "356" },
{ "Marshall Islands", "MH", "692" },
{ "Martinique", "MQ", "596" },
{ "Mauritania", "MR", "222" },
{ "Mauritius", "MU", "230" },
{ "Mexico", "MX", "52" },
{ "Micronesia", "FM", "691" },
{ "Moldova", "MD", "373" },
{ "Monaco", "MC", "377" },
{ "Mongolia", "MN", "976" },
{ "Montenegro", "ME", "382" },
{ "Montserrat", "MS", "1664" },
{ "Morocco", "MA", "212" },
{ "Mozambique", "MZ", "258" },
{ "Myanmar", "MM", "95" },
{ "Namibia", "NA", "264" },
{ "Nauru", "NR", "674" },
{ "Nepal", "NP", "977" },
{ "Netherlands", "NL", "31" },
{ "New Caledonia", "NC", "687" },
{ "New Zealand", "NZ", "64" },
{ "Nicaragua", "NI", "505" },
{ "Niger", "NE", "227" },
{ "Nigeria", "NG", "234" },
{ "Niue", "NU", "683" },
{ "Norfolk Island", "NF", "672" },
{ "North Korea", "KP", "850" },
{ "Northern Mariana Islands", "MP", "1670" },
{ "Norway", "NO", "47" },
{ "Oman", "OM", "968" },
{ "Pakistan", "PK", "92" },
{ "Palau", "PW", "680" },
{ "Palestine", "PS", "970" },
{ "Panama", "PA", "507" },
{ "Papua New Guinea", "PG", "675" },
{ "Paraguay", "PY", "595" },
{ "Peru", "PE", "51" },
{ "Philippines", "PH", "63" },
{ "Poland", "PL", "48" },
{ "Portugal", "PT", "351" },
{ "Puerto Rico", "PR", "1" },
{ "Qatar", "QA", "974" },
{ "Romania", "RO", "40" },
{ "Russian Federation", "RU", "7" },
{ "Rwanda", "RW", "250" },
{ "Réunion", "RE", "262" },
{ "Saint Helena", "SH", "247" },
{ "Saint Helena", "SH2", "290" },
{ "Saint Kitts & Nevis", "KN", "1869" },
{ "Saint Lucia", "LC", "1758" },
{ "Saint Pierre & Miquelon", "PM", "508" },
{ "Saint Vincent & the Grenadines", "VC", "1784" },
{ "Samoa", "WS", "685" },
{ "San Marino", "SM", "378" },
{ "Saudi Arabia", "SA", "966" },
{ "Senegal", "SN", "221" },
{ "Serbia", "RS", "381" },
{ "Seychelles", "SC", "248" },
{ "Sierra Leone", "SL", "232" },
{ "Singapore", "SG", "65" },
{ "Sint Maarten", "SX", "1721" },
{ "Slovakia", "SK", "421" },
{ "Slovenia", "SI", "386" },
{ "Solomon Islands", "SB", "677" },
{ "Somalia", "SO", "252" },
{ "South Africa", "ZA", "27" },
{ "South Korea", "KR", "82" },
{ "South Sudan", "SS", "211" },
{ "Spain", "ES", "34" },
{ "Sri Lanka", "LK", "94" },
{ "Sudan", "SD", "249" },
{ "Suriname", "SR", "597" },
{ "Swaziland", "SZ", "268" },
{ "Sweden", "SE", "46" },
{ "Switzerland", "CH", "41" },
{ "Syrian Arab Republic", "SY", "963" },
{ "São Tomé & Príncipe", "ST", "239" },
{ "Taiwan", "TW", "886" },
{ "Tajikistan", "TJ", "992" },
{ "Tanzania", "TZ", "255" },
{ "Thailand", "TH", "66" },
{ "Timor-Leste", "TL", "670" },
{ "Togo", "TG", "228" },
{ "Tokelau", "TK", "690" },
{ "Tonga", "TO", "676" },
{ "Trinidad & Tobago", "TT", "1868" },
{ "Tunisia", "TN", "216" },
{ "Turkey", "TR", "90" },
{ "Turkmenistan", "TM", "993" },
{ "Turks & Caicos Islands", "TC", "1649" },
{ "Tuvalu", "TV", "688" },
{ "US Virgin Islands", "VI", "1340" },
{ "USA", "US", "1", "United States of America" },
{ "Uganda", "UG", "256" },
{ "Ukraine", "UA", "380" },
{ "United Arab Emirates", "AE", "971" },
{ "United Kingdom", "GB", "44" },
{ "Uruguay", "UY", "598" },
{ "Uzbekistan", "UZ", "998" },
{ "Vanuatu", "VU", "678" },
{ "Venezuela", "VE", "58" },
{ "Vietnam", "VN", "84" },
{ "Wallis & Futuna", "WF", "681" },
{ "Yemen", "YE", "967" },
{ "Zambia", "ZM", "260" },
{ "Zimbabwe", "ZW", "263" },
} };
QHash<QString, const CountryInfo *> ByCode;
QHash<QString, const CountryInfo *> ByISO2;
} // namespace
const std::array<CountryInfo, 231> &Countries() {
return List;
}
const QHash<QString, const CountryInfo *> &CountriesByCode() {
if (ByCode.isEmpty()) {
ByCode.reserve(List.size());
for (const auto &entry : List) {
ByCode.insert(entry.code, &entry);
}
}
return ByCode;
}
const QHash<QString, const CountryInfo *> &CountriesByISO2() {
if (ByISO2.isEmpty()) {
ByISO2.reserve(List.size());
for (const auto &entry : List) {
ByISO2.insert(entry.iso2, &entry);
}
}
return ByISO2;
}
QString ValidPhoneCode(QString fullCode) {
const auto &byCode = CountriesByCode();
while (fullCode.length()) {
const auto i = byCode.constFind(fullCode);
if (i != byCode.cend()) {
return (*i)->code;
}
fullCode.chop(1);
}
return QString();
}
QString CountryNameByISO2(const QString &iso) {
const auto &byISO2 = CountriesByISO2();
const auto i = byISO2.constFind(iso);
return (i != byISO2.cend()) ? QString::fromUtf8((*i)->name) : QString();
}
QString CountryISO2ByPhone(const QString &phone) {
const auto &byCode = Data::CountriesByCode();
const auto code = Data::ValidPhoneCode(phone);
const auto i = byCode.find(code);
return (i != byCode.cend()) ? QString::fromUtf8((*i)->iso2) : QString();
}
} // namespace Data

View File

@ -0,0 +1,29 @@
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
namespace Data {
struct CountryInfo {
const char *name = nullptr;
const char *iso2 = nullptr;
const char *code = nullptr;
const char *alternativeName = nullptr;
};
[[nodiscard]] const std::array<CountryInfo, 231> &Countries();
[[nodiscard]] const QHash<QString, const CountryInfo *> &CountriesByCode();
[[nodiscard]] const QHash<QString, const CountryInfo *> &CountriesByISO2();
[[nodiscard]] QString ValidPhoneCode(QString fullCode);
[[nodiscard]] QString CountryNameByISO2(const QString &iso);
[[nodiscard]] QString CountryISO2ByPhone(const QString &phone);
} // namespace Data

View File

@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/rp_widget.h" #include "ui/rp_widget.h"
#include "ui/countryinput.h" #include "ui/countryinput.h"
#include "core/update_checker.h" #include "core/update_checker.h"
#include "data/data_countries.h"
#include "layout.h" #include "layout.h"
#include "styles/style_boxes.h" #include "styles/style_boxes.h"
@ -114,7 +115,7 @@ EditDocumentScheme GetDocumentScheme(
using ValueClass = Scheme::ValueClass; using ValueClass = Scheme::ValueClass;
const auto DontFormat = nullptr; const auto DontFormat = nullptr;
const auto CountryFormat = [](const QString &value) { const auto CountryFormat = [](const QString &value) {
const auto result = CountrySelectBox::NameByISO(value); const auto result = Data::CountryNameByISO2(value);
return result.isEmpty() ? value : result; return result.isEmpty() ? value : result;
}; };
const auto GenderFormat = [](const QString &value) { const auto GenderFormat = [](const QString &value) {
@ -313,7 +314,7 @@ EditDocumentScheme GetDocumentScheme(
if (!language.isEmpty()) { if (!language.isEmpty()) {
return tr::lng_passport_native_name_language_about(tr::now); return tr::lng_passport_native_name_language_about(tr::now);
} }
const auto name = CountrySelectBox::NameByISO(countryCode); const auto name = Data::CountryNameByISO2(countryCode);
Assert(!name.isEmpty()); Assert(!name.isEmpty());
return tr::lng_passport_native_name_about( return tr::lng_passport_native_name_about(
tr::now, tr::now,

View File

@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/countryinput.h" #include "ui/countryinput.h"
#include "auth_session.h" #include "auth_session.h"
#include "data/data_user.h" #include "data/data_user.h"
#include "data/data_countries.h"
#include "styles/style_boxes.h" #include "styles/style_boxes.h"
#include "styles/style_passport.h" #include "styles/style_passport.h"
@ -301,7 +302,7 @@ void AbstractTextRow<Input>::finishInnerAnimating() {
} }
QString CountryString(const QString &code) { QString CountryString(const QString &code) {
const auto name = CountrySelectBox::NameByISO(code); const auto name = Data::CountryNameByISO2(code);
return name.isEmpty() ? tr::lng_passport_country_choose(tr::now) : name; return name.isEmpty() ? tr::lng_passport_country_choose(tr::now) : name;
} }
@ -378,8 +379,8 @@ void CountryRow::errorAnimationCallback() {
void CountryRow::chooseCountry() { void CountryRow::chooseCountry() {
const auto top = _value.current(); const auto top = _value.current();
const auto name = CountrySelectBox::NameByISO(top); const auto name = Data::CountryNameByISO2(top);
const auto isoByPhone = CountrySelectBox::ISOByPhone( const auto isoByPhone = Data::CountryISO2ByPhone(
Auth().user()->phone()); Auth().user()->phone());
const auto box = _controller->show(Box<CountrySelectBox>(!name.isEmpty() const auto box = _controller->show(Box<CountrySelectBox>(!name.isEmpty()
? top ? top

View File

@ -11,74 +11,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/widgets/scroll_area.h" #include "ui/widgets/scroll_area.h"
#include "ui/widgets/multi_select.h" #include "ui/widgets/multi_select.h"
#include "ui/effects/ripple_animation.h" #include "ui/effects/ripple_animation.h"
#include "countries.h" #include "data/data_countries.h"
#include "styles/style_boxes.h" #include "styles/style_boxes.h"
#include "styles/style_intro.h" #include "styles/style_intro.h"
namespace { namespace {
typedef QList<const CountryInfo *> CountriesFiltered; QString LastValidISO;
typedef QVector<int> CountriesIds;
typedef QHash<QChar, CountriesIds> CountriesByLetter;
typedef QVector<QString> CountryNames;
typedef QVector<CountryNames> CountriesNames;
CountriesByCode _countriesByCode;
CountriesByISO2 _countriesByISO2;
CountriesFiltered countriesFiltered, countriesAll, *countriesNow = &countriesAll;
CountriesByLetter countriesByLetter;
CountriesNames countriesNames;
QString lastValidISO;
int countriesCount = sizeof(countries) / sizeof(countries[0]);
void initCountries() {
if (!_countriesByCode.isEmpty()) return;
_countriesByCode.reserve(countriesCount);
_countriesByISO2.reserve(countriesCount);
for (int i = 0; i < countriesCount; ++i) {
const CountryInfo *info(countries + i);
_countriesByCode.insert(info->code, info);
CountriesByISO2::const_iterator already = _countriesByISO2.constFind(info->iso2);
if (already != _countriesByISO2.cend()) {
QString badISO = info->iso2;
(void)badISO;
}
_countriesByISO2.insert(info->iso2, info);
}
countriesAll.reserve(countriesCount);
countriesFiltered.reserve(countriesCount);
countriesNames.resize(countriesCount);
}
} // namespace } // namespace
const CountriesByCode &countriesByCode() {
initCountries();
return _countriesByCode;
}
const CountriesByISO2 &countriesByISO2() {
initCountries();
return _countriesByISO2;
}
QString findValidCode(QString fullCode) {
while (fullCode.length()) {
CountriesByCode::const_iterator i = _countriesByCode.constFind(fullCode);
if (i != _countriesByCode.cend()) {
return (*i)->code;
}
fullCode = fullCode.mid(0, fullCode.length() - 1);
}
return "";
}
CountryInput::CountryInput(QWidget *parent, const style::InputField &st) : TWidget(parent) CountryInput::CountryInput(QWidget *parent, const style::InputField &st) : TWidget(parent)
, _st(st) , _st(st)
, _text(tr::lng_country_code(tr::now)) { , _text(tr::lng_country_code(tr::now)) {
initCountries();
resize(_st.width, _st.heightMin); resize(_st.width, _st.heightMin);
auto availableWidth = width() - _st.textMargins.left() - _st.textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1; auto availableWidth = width() - _st.textMargins.left() - _st.textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1;
@ -163,10 +108,11 @@ void CountryInput::onChooseCode(const QString &code) {
Ui::hideLayer(); Ui::hideLayer();
_chosenIso = QString(); _chosenIso = QString();
if (code.length()) { if (code.length()) {
CountriesByCode::const_iterator i = _countriesByCode.constFind(code); const auto &byCode = Data::CountriesByCode();
if (i != _countriesByCode.cend()) { const auto i = byCode.constFind(code);
const CountryInfo *info = *i; if (i != byCode.cend()) {
_chosenIso = lastValidISO = info->iso2; const auto info = *i;
_chosenIso = LastValidISO = info->iso2;
setText(QString::fromUtf8(info->name)); setText(QString::fromUtf8(info->name));
} else { } else {
setText(tr::lng_bad_country_code(tr::now)); setText(tr::lng_bad_country_code(tr::now));
@ -180,12 +126,13 @@ void CountryInput::onChooseCode(const QString &code) {
bool CountryInput::onChooseCountry(const QString &iso) { bool CountryInput::onChooseCountry(const QString &iso) {
Ui::hideLayer(); Ui::hideLayer();
CountriesByISO2::const_iterator i = _countriesByISO2.constFind(iso); const auto &byISO2 = Data::CountriesByISO2();
const CountryInfo *info = (i == _countriesByISO2.cend()) ? 0 : (*i); const auto i = byISO2.constFind(iso);
const auto info = (i != byISO2.cend()) ? (*i) : nullptr;
_chosenIso = QString(); _chosenIso = QString();
if (info) { if (info) {
_chosenIso = lastValidISO = info->iso2; _chosenIso = LastValidISO = info->iso2;
setText(QString::fromUtf8(info->name)); setText(QString::fromUtf8(info->name));
emit codeChanged(info->code); emit codeChanged(info->code);
update(); update();
@ -205,28 +152,7 @@ CountrySelectBox::CountrySelectBox(QWidget*)
CountrySelectBox::CountrySelectBox(QWidget*, const QString &iso, Type type) CountrySelectBox::CountrySelectBox(QWidget*, const QString &iso, Type type)
: _type(type) : _type(type)
, _select(this, st::contactsMultiSelect, tr::lng_country_ph()) { , _select(this, st::contactsMultiSelect, tr::lng_country_ph()) {
lastValidISO = iso; LastValidISO = iso;
}
QString CountrySelectBox::NameByISO(const QString &iso) {
if (_countriesByISO2.isEmpty()) {
initCountries();
}
const auto i = _countriesByISO2.constFind(iso);
return (i == _countriesByISO2.cend())
? QString()
: QString::fromUtf8((*i)->name);
}
QString CountrySelectBox::ISOByPhone(const QString &phone) {
if (_countriesByCode.isEmpty()) {
initCountries();
}
const auto code = findValidCode(phone);
const auto i = _countriesByCode.find(code);
return (i == _countriesByCode.cend())
? QString()
: QString::fromUtf8((*i)->iso2);
} }
void CountrySelectBox::prepare() { void CountrySelectBox::prepare() {
@ -295,45 +221,47 @@ CountrySelectBox::Inner::Inner(QWidget *parent, Type type)
, _rowHeight(st::countryRowHeight) { , _rowHeight(st::countryRowHeight) {
setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_OpaquePaintEvent);
if (countriesNames.isEmpty()) { const auto &byISO2 = Data::CountriesByISO2();
initCountries();
_list.reserve(byISO2.size());
_namesList.reserve(byISO2.size());
const auto l = byISO2.constFind(LastValidISO);
const auto lastValid = (l != byISO2.cend()) ? (*l) : nullptr;
if (lastValid) {
_list.emplace_back(lastValid);
} }
for (const auto &entry : Data::Countries()) {
CountriesByISO2::const_iterator l = _countriesByISO2.constFind(lastValidISO); if (&entry != lastValid) {
bool seenLastValid = false; _list.emplace_back(&entry);
int already = countriesAll.size();
countriesByLetter.clear();
const CountryInfo *lastValid = (l == _countriesByISO2.cend()) ? 0 : (*l);
for (int i = 0; i < countriesCount; ++i) {
const CountryInfo *ins = lastValid ? (i ? (countries + i - (seenLastValid ? 0 : 1)) : lastValid) : (countries + i);
if (lastValid && i && ins == lastValid) {
seenLastValid = true;
++ins;
} }
if (already > i) { }
countriesAll[i] = ins; auto index = 0;
} else { for (const auto info : _list) {
countriesAll.push_back(ins); auto full = QString::fromUtf8(info->name)
} + ' '
+ (info->alternativeName
auto namesList = QString::fromUtf8(ins->name).toLower().split(QRegularExpression("[\\s\\-]"), QString::SkipEmptyParts); ? QString::fromUtf8(info->alternativeName)
auto &names = countriesNames[i]; : QString());
int l = namesList.size(); const auto namesList = std::move(full).toLower().split(
names.resize(0); QRegularExpression("[\\s\\-]"),
names.reserve(l); QString::SkipEmptyParts);
for (int j = 0, l = namesList.size(); j < l; ++j) { auto &names = _namesList.emplace_back();
auto name = namesList[j].trimmed(); names.reserve(namesList.size());
if (!name.length()) continue; for (const auto &name : namesList) {
const auto part = name.trimmed();
auto ch = name[0]; if (part.isEmpty()) {
auto &v = countriesByLetter[ch]; continue;
if (v.isEmpty() || v.back() != i) {
v.push_back(i);
} }
names.push_back(name); const auto ch = part[0];
auto &byLetter = _byLetter[ch];
if (byLetter.empty() || byLetter.back() != index) {
byLetter.push_back(index);
}
names.push_back(part);
} }
++index;
} }
_filter = qsl("a"); _filter = qsl("a");
@ -345,51 +273,52 @@ void CountrySelectBox::Inner::paintEvent(QPaintEvent *e) {
QRect r(e->rect()); QRect r(e->rect());
p.setClipRect(r); p.setClipRect(r);
int l = countriesNow->size(); const auto &list = current();
if (l) { if (list.empty()) {
if (r.intersects(QRect(0, 0, width(), st::countriesSkip))) {
p.fillRect(r.intersected(QRect(0, 0, width(), st::countriesSkip)), st::countryRowBg);
}
int32 from = floorclamp(r.y() - st::countriesSkip, _rowHeight, 0, l);
int32 to = ceilclamp(r.y() + r.height() - st::countriesSkip, _rowHeight, 0, l);
for (int32 i = from; i < to; ++i) {
auto selected = (i == (_pressed >= 0 ? _pressed : _selected));
auto y = st::countriesSkip + i * _rowHeight;
p.fillRect(0, y, width(), _rowHeight, selected ? st::countryRowBgOver : st::countryRowBg);
if (_ripples.size() > i && _ripples[i]) {
_ripples[i]->paint(p, 0, y, width());
if (_ripples[i]->empty()) {
_ripples[i].reset();
}
}
auto code = QString("+") + (*countriesNow)[i]->code;
auto codeWidth = st::countryRowCodeFont->width(code);
auto name = QString::fromUtf8((*countriesNow)[i]->name);
auto nameWidth = st::countryRowNameFont->width(name);
auto availWidth = width() - st::countryRowPadding.left() - st::countryRowPadding.right() - codeWidth - st::boxLayerScroll.width;
if (nameWidth > availWidth) {
name = st::countryRowNameFont->elided(name, availWidth);
nameWidth = st::countryRowNameFont->width(name);
}
p.setFont(st::countryRowNameFont);
p.setPen(st::countryRowNameFg);
p.drawTextLeft(st::countryRowPadding.left(), y + st::countryRowPadding.top(), width(), name);
if (_type == Type::Phones) {
p.setFont(st::countryRowCodeFont);
p.setPen(selected ? st::countryRowCodeFgOver : st::countryRowCodeFg);
p.drawTextLeft(st::countryRowPadding.left() + nameWidth + st::countryRowPadding.right(), y + st::countryRowPadding.top(), width(), code);
}
}
} else {
p.fillRect(r, st::boxBg); p.fillRect(r, st::boxBg);
p.setFont(st::noContactsFont); p.setFont(st::noContactsFont);
p.setPen(st::noContactsColor); p.setPen(st::noContactsColor);
p.drawText(QRect(0, 0, width(), st::noContactsHeight), tr::lng_country_none(tr::now), style::al_center); p.drawText(QRect(0, 0, width(), st::noContactsHeight), tr::lng_country_none(tr::now), style::al_center);
return;
}
const auto l = list.size();
if (r.intersects(QRect(0, 0, width(), st::countriesSkip))) {
p.fillRect(r.intersected(QRect(0, 0, width(), st::countriesSkip)), st::countryRowBg);
}
int32 from = floorclamp(r.y() - st::countriesSkip, _rowHeight, 0, l);
int32 to = ceilclamp(r.y() + r.height() - st::countriesSkip, _rowHeight, 0, l);
for (int32 i = from; i < to; ++i) {
auto selected = (i == (_pressed >= 0 ? _pressed : _selected));
auto y = st::countriesSkip + i * _rowHeight;
p.fillRect(0, y, width(), _rowHeight, selected ? st::countryRowBgOver : st::countryRowBg);
if (_ripples.size() > i && _ripples[i]) {
_ripples[i]->paint(p, 0, y, width());
if (_ripples[i]->empty()) {
_ripples[i].reset();
}
}
auto code = QString("+") + list[i]->code;
auto codeWidth = st::countryRowCodeFont->width(code);
auto name = QString::fromUtf8(list[i]->name);
auto nameWidth = st::countryRowNameFont->width(name);
auto availWidth = width() - st::countryRowPadding.left() - st::countryRowPadding.right() - codeWidth - st::boxLayerScroll.width;
if (nameWidth > availWidth) {
name = st::countryRowNameFont->elided(name, availWidth);
nameWidth = st::countryRowNameFont->width(name);
}
p.setFont(st::countryRowNameFont);
p.setPen(st::countryRowNameFg);
p.drawTextLeft(st::countryRowPadding.left(), y + st::countryRowPadding.top(), width(), name);
if (_type == Type::Phones) {
p.setFont(st::countryRowCodeFont);
p.setPen(selected ? st::countryRowCodeFgOver : st::countryRowCodeFg);
p.drawTextLeft(st::countryRowPadding.left() + nameWidth + st::countryRowPadding.right(), y + st::countryRowPadding.top(), width(), code);
}
} }
} }
@ -416,7 +345,8 @@ void CountrySelectBox::Inner::mousePressEvent(QMouseEvent *e) {
updateSelected(e->pos()); updateSelected(e->pos());
setPressed(_selected); setPressed(_selected);
if (_pressed >= 0 && _pressed < countriesNow->size()) { const auto &list = current();
if (_pressed >= 0 && _pressed < list.size()) {
if (_ripples.size() <= _pressed) { if (_ripples.size() <= _pressed) {
_ripples.reserve(_pressed + 1); _ripples.reserve(_pressed + 1);
while (_ripples.size() <= _pressed) { while (_ripples.size() <= _pressed) {
@ -445,55 +375,54 @@ void CountrySelectBox::Inner::mouseReleaseEvent(QMouseEvent *e) {
} }
void CountrySelectBox::Inner::updateFilter(QString filter) { void CountrySelectBox::Inner::updateFilter(QString filter) {
auto words = TextUtilities::PrepareSearchWords(filter); const auto words = TextUtilities::PrepareSearchWords(filter);
filter = words.isEmpty() ? QString() : words.join(' '); filter = words.isEmpty() ? QString() : words.join(' ');
if (_filter != filter) { if (_filter == filter) {
_filter = filter; return;
if (_filter.isEmpty()) {
countriesNow = &countriesAll;
} else {
QChar first = _filter[0].toLower();
CountriesIds &ids(countriesByLetter[first]);
QStringList::const_iterator fb = words.cbegin(), fe = words.cend(), fi;
countriesFiltered.clear();
for (CountriesIds::const_iterator i = ids.cbegin(), e = ids.cend(); i != e; ++i) {
int index = *i;
CountryNames &names(countriesNames[index]);
CountryNames::const_iterator nb = names.cbegin(), ne = names.cend(), ni;
for (fi = fb; fi != fe; ++fi) {
QString filterName(*fi);
for (ni = nb; ni != ne; ++ni) {
if (ni->startsWith(*fi)) {
break;
}
}
if (ni == ne) {
break;
}
}
if (fi == fe) {
countriesFiltered.push_back(countriesAll[index]);
}
}
countriesNow = &countriesFiltered;
}
refresh();
_selected = countriesNow->isEmpty() ? -1 : 0;
update();
} }
_filter = filter;
const auto findWord = [&](
const std::vector<QString> &names,
const QString &word) {
for (const auto &name : names) {
if (name.startsWith(word)) {
return true;
}
}
return false;
};
const auto hasAllWords = [&](const std::vector<QString> &names) {
for (const auto &word : words) {
if (!findWord(names, word)) {
return false;
}
}
return true;
};
if (!_filter.isEmpty()) {
_filtered.clear();
for (const auto index : _byLetter[_filter[0].toLower()]) {
const auto &names = _namesList[index];
if (hasAllWords(_namesList[index])) {
_filtered.push_back(_list[index]);
}
}
}
refresh();
_selected = current().empty() ? -1 : 0;
update();
} }
void CountrySelectBox::Inner::selectSkip(int32 dir) { void CountrySelectBox::Inner::selectSkip(int32 dir) {
_mouseSelection = false; _mouseSelection = false;
const auto &list = current();
int cur = (_selected >= 0) ? _selected : -1; int cur = (_selected >= 0) ? _selected : -1;
cur += dir; cur += dir;
if (cur <= 0) { if (cur <= 0) {
_selected = countriesNow->isEmpty() ? -1 : 0; _selected = list.empty() ? -1 : 0;
} else if (cur >= countriesNow->size()) { } else if (cur >= list.size()) {
_selected = -1; _selected = -1;
} else { } else {
_selected = cur; _selected = cur;
@ -511,21 +440,15 @@ void CountrySelectBox::Inner::selectSkipPage(int32 h, int32 dir) {
} }
void CountrySelectBox::Inner::chooseCountry() { void CountrySelectBox::Inner::chooseCountry() {
QString result; const auto &list = current();
if (_filter.isEmpty()) { emit countryChosen((_selected >= 0 && _selected < list.size())
if (_selected >= 0 && _selected < countriesAll.size()) { ? QString(list[_selected]->iso2)
result = countriesAll[_selected]->iso2; : QString());
}
} else {
if (_selected >= 0 && _selected < countriesFiltered.size()) {
result = countriesFiltered[_selected]->iso2;
}
}
emit countryChosen(result);
} }
void CountrySelectBox::Inner::refresh() { void CountrySelectBox::Inner::refresh() {
resize(width(), countriesNow->length() ? (countriesNow->length() * _rowHeight + st::countriesSkip) : st::noContactsHeight); const auto &list = current();
resize(width(), list.empty() ? st::noContactsHeight : (list.size() * _rowHeight + st::countriesSkip));
} }
void CountrySelectBox::Inner::updateSelected(QPoint localPos) { void CountrySelectBox::Inner::updateSelected(QPoint localPos) {
@ -533,7 +456,8 @@ void CountrySelectBox::Inner::updateSelected(QPoint localPos) {
auto in = parentWidget()->rect().contains(parentWidget()->mapFromGlobal(QCursor::pos())); auto in = parentWidget()->rect().contains(parentWidget()->mapFromGlobal(QCursor::pos()));
auto selected = (in && localPos.y() >= st::countriesSkip && localPos.y() < st::countriesSkip + countriesNow->size() * _rowHeight) ? ((localPos.y() - st::countriesSkip) / _rowHeight) : -1; const auto &list = current();
auto selected = (in && localPos.y() >= st::countriesSkip && localPos.y() < st::countriesSkip + list.size() * _rowHeight) ? ((localPos.y() - st::countriesSkip) / _rowHeight) : -1;
if (_selected != selected) { if (_selected != selected) {
updateSelectedRow(); updateSelectedRow();
_selected = selected; _selected = selected;
@ -541,6 +465,11 @@ void CountrySelectBox::Inner::updateSelected(QPoint localPos) {
} }
} }
auto CountrySelectBox::Inner::current() const
-> const std::vector<not_null<const Data::CountryInfo*>> & {
return _filter.isEmpty() ? _list : _filtered;
}
void CountrySelectBox::Inner::updateSelectedRow() { void CountrySelectBox::Inner::updateSelectedRow() {
updateRow(_selected); updateRow(_selected);
} }

View File

@ -10,7 +10,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "boxes/abstract_box.h" #include "boxes/abstract_box.h"
#include "styles/style_widgets.h" #include "styles/style_widgets.h"
QString findValidCode(QString fullCode); namespace Data {
struct CountryInfo;
} // namespace Data
namespace Ui { namespace Ui {
class MultiSelect; class MultiSelect;
@ -64,9 +66,6 @@ public:
CountrySelectBox(QWidget*); CountrySelectBox(QWidget*);
CountrySelectBox(QWidget*, const QString &iso, Type type); CountrySelectBox(QWidget*, const QString &iso, Type type);
static QString NameByISO(const QString &iso);
static QString ISOByPhone(const QString &phone);
signals: signals:
void countryChosen(const QString &iso); void countryChosen(const QString &iso);
@ -127,6 +126,7 @@ private:
void updateSelectedRow(); void updateSelectedRow();
void updateRow(int index); void updateRow(int index);
void setPressed(int pressed); void setPressed(int pressed);
const std::vector<not_null<const Data::CountryInfo*>> &current() const;
Type _type = Type::Phones; Type _type = Type::Phones;
int _rowHeight = 0; int _rowHeight = 0;
@ -138,4 +138,9 @@ private:
std::vector<std::unique_ptr<Ui::RippleAnimation>> _ripples; std::vector<std::unique_ptr<Ui::RippleAnimation>> _ripples;
std::vector<not_null<const Data::CountryInfo*>> _list;
std::vector<not_null<const Data::CountryInfo*>> _filtered;
base::flat_map<QChar, std::vector<int>> _byLetter;
std::vector<std::vector<QString>> _namesList;
}; };

View File

@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "window/themes/window_theme.h" #include "window/themes/window_theme.h"
#include "lang/lang_keys.h" #include "lang/lang_keys.h"
#include "data/data_user.h" #include "data/data_user.h"
#include "data/data_countries.h" // Data::ValidPhoneCode
#include "mainwindow.h" #include "mainwindow.h"
#include "numbers.h" #include "numbers.h"
#include "auth_session.h" #include "auth_session.h"
@ -3968,7 +3969,7 @@ void CountryCodeInput::correctValue(
} }
} }
if (!addToNumber.isEmpty()) { if (!addToNumber.isEmpty()) {
auto validCode = findValidCode(newText.mid(1)); auto validCode = Data::ValidPhoneCode(newText.mid(1));
addToNumber = newText.mid(1 + validCode.length()) + addToNumber; addToNumber = newText.mid(1 + validCode.length()) + addToNumber;
newText = '+' + validCode; newText = '+' + validCode;
} }

View File

@ -174,6 +174,8 @@
<(src_loc)/data/data_channel.h <(src_loc)/data/data_channel.h
<(src_loc)/data/data_channel_admins.cpp <(src_loc)/data/data_channel_admins.cpp
<(src_loc)/data/data_channel_admins.h <(src_loc)/data/data_channel_admins.h
<(src_loc)/data/data_countries.cpp
<(src_loc)/data/data_countries.h
<(src_loc)/data/data_document.cpp <(src_loc)/data/data_document.cpp
<(src_loc)/data/data_document.h <(src_loc)/data/data_document.h
<(src_loc)/data/data_document_good_thumbnail.cpp <(src_loc)/data/data_document_good_thumbnail.cpp
@ -874,7 +876,6 @@
<(src_loc)/auth_session.cpp <(src_loc)/auth_session.cpp
<(src_loc)/auth_session.h <(src_loc)/auth_session.h
<(src_loc)/config.h <(src_loc)/config.h
<(src_loc)/countries.h
<(src_loc)/facades.cpp <(src_loc)/facades.cpp
<(src_loc)/facades.h <(src_loc)/facades.h
<(src_loc)/layout.cpp <(src_loc)/layout.cpp