Compare commits

..

2 Commits

Author SHA1 Message Date
aoife cassidy
41193dfe37
add location autocomplete 2025-03-02 21:48:07 -08:00
aoife cassidy
4da8c423c0
spell out Enter for terminals with bad fonts (cmd) 2025-02-28 18:27:11 -08:00
4 changed files with 613 additions and 137 deletions

View File

@ -31,7 +31,7 @@ func (view *Help) Event(state *ui.State, event vaxis.Event) (processed bool) {
vaxis.Segment{Text: "town mail", Style: vaxis.Style{Foreground: vaxis.IndexColor(3)}},
vaxis.Segment{Text: ` to see who it's from :)
press to quit to a shell!
press Enter to quit to a shell!
`},
)
return

View File

@ -13,7 +13,7 @@ func (view *Introduction) Event(state *ui.State, event vaxis.Event) (processed b
case "Ctrl+c", "Ctrl+d":
close(ui.Quit)
case "Enter":
ui.ViewChange <- &Settings{}
ui.ViewChange <- NewSettings()
}
processed = true
}
@ -24,6 +24,6 @@ func (view *Introduction) Event(state *ui.State, event vaxis.Event) (processed b
this short tutorial will help you get accustomed to the terminal the text-based user interface that you will do most of your interacting with town on. if you're here, this means you've successfully connected to town over ssh good job! you can handle the rest. i believe in you <3
press to continue to the next page. if you know what you're doing, you can press Ctrl+c or Ctrl+d at any point to exit to a shell.`})
press Enter to continue to the next page. if you know what you're doing, you can press Ctrl+C or Ctrl+D at any point to exit to a shell.`})
return
}

View File

@ -7,13 +7,19 @@ import (
"strings"
"git.sr.ht/~rockorager/vaxis"
"git.sr.ht/~rockorager/vaxis/widgets/textinput"
"git.tilde.town/nbsp/welcome/ui"
)
type Settings struct {
index int
inputs [3]textinput.Model
inputs [3]ui.Input
}
func NewSettings() *Settings {
s := &Settings{}
s.inputs[2].Placeholder = "e.g. America/New_York"
s.inputs[2].AutoComplete = TIMEZONES
return s
}
func (view *Settings) Event(state *ui.State, event vaxis.Event) (processed bool) {
@ -82,19 +88,7 @@ func (view *Settings) Event(state *ui.State, event vaxis.Event) (processed bool)
_, q3 := win.New(0, q1+q2, 80, state.Window().Height).Wrap(vaxis.Segment{Text: `
3. `}, vaxis.Segment{Text: "what's your timezone?", Style: vaxis.Style{Foreground: vaxis.IndexColor(1)}}, vaxis.Segment{Text: ` this will change all times you view in town to your local timezone, so you don't have to convert from utc in your head. the format for timezones can be found here:
`},
vaxis.Segment{
Text: "https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List",
Style: vaxis.Style{
Foreground: vaxis.IndexColor(4),
UnderlineStyle: vaxis.UnderlineSingle,
},
},
vaxis.Segment{Text: `
it should look something like America/New_York.
3. `}, vaxis.Segment{Text: "what's your timezone?", Style: vaxis.Style{Foreground: vaxis.IndexColor(1)}}, vaxis.Segment{Text: ` this will change all times you view in town to your local timezone, so you don't have to convert from utc in your head. just start typing your continent and a big city in your area.
>
@ -133,28 +127,615 @@ it should look something like America/New_York.
view.inputs[1].Draw(vaxis.Window{win.Vx, &win, 5, h, int(math.Min(73.0, float64(win.Width)-7)), 1})
win.SetStyle(3, h, vaxis.Style{Attribute: vaxis.AttrReverse})
case 3:
_, h := win.Wrap(vaxis.Segment{Text: `3. `}, vaxis.Segment{Text: "what's your timezone?", Style: vaxis.Style{Foreground: vaxis.IndexColor(1)}}, vaxis.Segment{Text: ` this will change all times you view in town to your local timezone, so you don't have to convert from utc in your head. the format for timezones can be found here:
`},
vaxis.Segment{
Text: "https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List",
Style: vaxis.Style{
Foreground: vaxis.IndexColor(4),
UnderlineStyle: vaxis.UnderlineSingle,
},
},
vaxis.Segment{Text: `
it should look something like America/New_York.
_, h := win.Wrap(vaxis.Segment{Text: `3. `}, vaxis.Segment{Text: "what's your timezone?", Style: vaxis.Style{Foreground: vaxis.IndexColor(1)}}, vaxis.Segment{Text: ` this will change all times you view in town to your local timezone, so you don't have to convert from utc in your head. just start typing your continent and a big city in your area.
>`})
view.inputs[2].Draw(vaxis.Window{win.Vx, &win, 5, h, int(math.Min(73.0, float64(win.Width)-7)), 1})
win.SetStyle(3, h, vaxis.Style{Attribute: vaxis.AttrReverse})
case 4:
win.Wrap(vaxis.Segment{Text: " press to continue ", Style: vaxis.Style{Attribute: enterStyle}})
win.Wrap(vaxis.Segment{Text: " press Enter to continue ", Style: vaxis.Style{Attribute: enterStyle}})
}
}
state.HideCursor()
return
}
var TIMEZONES = []string{
"Africa/Abidjan",
"Africa/Accra",
"Africa/Bamako",
"Africa/Banjul",
"Africa/Conakry",
"Africa/Dakar",
"Africa/Freetown",
"Africa/Lome",
"Africa/Nouakchott",
"Africa/Ouagadougou",
"Africa/Timbuktu",
"Atlantic/Reykjavik",
"Atlantic/St_Helena",
"Iceland",
"Africa/Algiers",
"Africa/Bissau",
"Africa/Cairo",
"Egypt",
"Africa/Casablanca",
"Africa/Ceuta",
"Africa/El_Aaiun",
"Africa/Johannesburg",
"Africa/Maseru",
"Africa/Mbabane",
"Africa/Juba",
"Africa/Khartoum",
"Africa/Lagos",
"Africa/Bangui",
"Africa/Brazzaville",
"Africa/Douala",
"Africa/Kinshasa",
"Africa/Libreville",
"Africa/Luanda",
"Africa/Malabo",
"Africa/Niamey",
"Africa/Porto-Novo",
"Africa/Maputo",
"Africa/Blantyre",
"Africa/Bujumbura",
"Africa/Gaborone",
"Africa/Harare",
"Africa/Kigali",
"Africa/Lubumbashi",
"Africa/Lusaka",
"Africa/Monrovia",
"Africa/Nairobi",
"Africa/Addis_Ababa",
"Africa/Asmara",
"Africa/Asmera",
"Africa/Dar_es_Salaam",
"Africa/Djibouti",
"Africa/Kampala",
"Africa/Mogadishu",
"Indian/Antananarivo",
"Indian/Comoro",
"Indian/Mayotte",
"Africa/Ndjamena",
"Africa/Sao_Tome",
"Africa/Tripoli",
"Libya",
"Africa/Tunis",
"Africa/Windhoek",
"America/Adak",
"America/Atka",
"US/Aleutian",
"America/Anchorage",
"US/Alaska",
"America/Araguaina",
"America/Argentina/Buenos_Aires",
"America/Buenos_Aires",
"America/Argentina/Catamarca",
"America/Argentina/ComodRivadavia",
"America/Catamarca",
"America/Argentina/Cordoba",
"America/Cordoba",
"America/Rosario",
"America/Argentina/Jujuy",
"America/Jujuy",
"America/Argentina/La_Rioja",
"America/Argentina/Mendoza",
"America/Mendoza",
"America/Argentina/Rio_Gallegos",
"America/Argentina/Salta",
"America/Argentina/San_Juan",
"America/Argentina/San_Luis",
"America/Argentina/Tucuman",
"America/Argentina/Ushuaia",
"America/Asuncion",
"America/Bahia",
"America/Bahia_Banderas",
"America/Barbados",
"America/Belem",
"America/Belize",
"America/Boa_Vista",
"America/Bogota",
"America/Boise",
"America/Cambridge_Bay",
"America/Campo_Grande",
"America/Cancun",
"America/Caracas",
"America/Cayenne",
"America/Chicago",
"CST6CDT",
"US/Central",
"America/Chihuahua",
"America/Ciudad_Juarez",
"America/Costa_Rica",
"America/Cuiaba",
"America/Danmarkshavn",
"America/Dawson",
"America/Dawson_Creek",
"America/Denver",
"America/Shiprock",
"MST7MDT",
"Navajo",
"US/Mountain",
"America/Detroit",
"US/Michigan",
"America/Edmonton",
"America/Yellowknife",
"Canada/Mountain",
"America/Eirunepe",
"America/El_Salvador",
"America/Fort_Nelson",
"America/Fortaleza",
"America/Glace_Bay",
"America/Goose_Bay",
"America/Grand_Turk",
"America/Guatemala",
"America/Guayaquil",
"America/Guyana",
"America/Halifax",
"Canada/Atlantic",
"America/Havana",
"Cuba",
"America/Hermosillo",
"America/Indiana/Indianapolis",
"America/Fort_Wayne",
"America/Indianapolis",
"US/East-Indiana",
"America/Indiana/Knox",
"America/Knox_IN",
"US/Indiana-Starke",
"America/Indiana/Marengo",
"America/Indiana/Petersburg",
"America/Indiana/Tell_City",
"America/Indiana/Vevay",
"America/Indiana/Vincennes",
"America/Indiana/Winamac",
"America/Inuvik",
"America/Iqaluit",
"America/Pangnirtung",
"America/Jamaica",
"Jamaica",
"America/Juneau",
"America/Kentucky/Louisville",
"America/Louisville",
"America/Kentucky/Monticello",
"America/La_Paz",
"America/Lima",
"America/Los_Angeles",
"PST8PDT",
"US/Pacific",
"America/Maceio",
"America/Managua",
"America/Manaus",
"Brazil/West",
"America/Martinique",
"America/Matamoros",
"America/Mazatlan",
"Mexico/BajaSur",
"America/Menominee",
"America/Merida",
"America/Metlakatla",
"America/Mexico_City",
"Mexico/General",
"America/Miquelon",
"America/Moncton",
"America/Monterrey",
"America/Montevideo",
"America/New_York",
"EST5EDT",
"US/Eastern",
"America/Nome",
"America/Noronha",
"Brazil/DeNoronha",
"America/North_Dakota/Beulah",
"America/North_Dakota/Center",
"America/North_Dakota/New_Salem",
"America/Nuuk",
"America/Godthab",
"America/Ojinaga",
"America/Panama",
"America/Atikokan",
"America/Cayman",
"America/Coral_Harbour",
"EST",
"America/Paramaribo",
"America/Phoenix",
"America/Creston",
"MST",
"US/Arizona",
"America/Port-au-Prince",
"America/Porto_Velho",
"America/Puerto_Rico",
"America/Anguilla",
"America/Antigua",
"America/Aruba",
"America/Blanc-Sablon",
"America/Curacao",
"America/Dominica",
"America/Grenada",
"America/Guadeloupe",
"America/Kralendijk",
"America/Lower_Princes",
"America/Marigot",
"America/Montserrat",
"America/Port_of_Spain",
"America/St_Barthelemy",
"America/St_Kitts",
"America/St_Lucia",
"America/St_Thomas",
"America/St_Vincent",
"America/Tortola",
"America/Virgin",
"America/Punta_Arenas",
"America/Rankin_Inlet",
"America/Recife",
"America/Regina",
"Canada/Saskatchewan",
"America/Resolute",
"America/Rio_Branco",
"America/Porto_Acre",
"Brazil/Acre",
"America/Santarem",
"America/Santiago",
"Chile/Continental",
"America/Santo_Domingo",
"America/Sao_Paulo",
"Brazil/East",
"America/Scoresbysund",
"America/Sitka",
"America/St_Johns",
"Canada/Newfoundland",
"America/Swift_Current",
"America/Tegucigalpa",
"America/Thule",
"America/Tijuana",
"America/Ensenada",
"America/Santa_Isabel",
"Mexico/BajaNorte",
"America/Toronto",
"America/Montreal",
"America/Nassau",
"America/Nipigon",
"America/Thunder_Bay",
"Canada/Eastern",
"America/Vancouver",
"Canada/Pacific",
"America/Whitehorse",
"Canada/Yukon",
"America/Winnipeg",
"America/Rainy_River",
"Canada/Central",
"America/Yakutat",
"Antarctica/Casey",
"Antarctica/Davis",
"Antarctica/Macquarie",
"Antarctica/Mawson",
"Antarctica/Palmer",
"Antarctica/Rothera",
"Antarctica/Troll",
"Antarctica/Vostok",
"Asia/Almaty",
"Asia/Amman",
"Asia/Anadyr",
"Asia/Aqtau",
"Asia/Aqtobe",
"Asia/Ashgabat",
"Asia/Ashkhabad",
"Asia/Atyrau",
"Asia/Baghdad",
"Asia/Baku",
"Asia/Bangkok",
"Asia/Phnom_Penh",
"Asia/Vientiane",
"Indian/Christmas",
"Asia/Barnaul",
"Asia/Beirut",
"Asia/Bishkek",
"Asia/Chita",
"Asia/Colombo",
"Asia/Damascus",
"Asia/Dhaka",
"Asia/Dacca",
"Asia/Dili",
"Asia/Dubai",
"Asia/Muscat",
"Indian/Mahe",
"Indian/Reunion",
"Asia/Dushanbe",
"Asia/Famagusta",
"Asia/Gaza",
"Asia/Hebron",
"Asia/Ho_Chi_Minh",
"Asia/Saigon",
"Asia/Hong_Kong",
"Hongkong",
"Asia/Hovd",
"Asia/Irkutsk",
"Asia/Jakarta",
"Asia/Jayapura",
"Asia/Jerusalem",
"Asia/Tel_Aviv",
"Israel",
"Asia/Kabul",
"Asia/Kamchatka",
"Asia/Karachi",
"Asia/Kathmandu",
"Asia/Katmandu",
"Asia/Khandyga",
"Asia/Kolkata",
"Asia/Calcutta",
"Asia/Krasnoyarsk",
"Asia/Kuching",
"Asia/Brunei",
"Asia/Macau",
"Asia/Macao",
"Asia/Magadan",
"Asia/Makassar",
"Asia/Ujung_Pandang",
"Asia/Manila",
"Asia/Nicosia",
"Europe/Nicosia",
"Asia/Novokuznetsk",
"Asia/Novosibirsk",
"Asia/Omsk",
"Asia/Oral",
"Asia/Pontianak",
"Asia/Pyongyang",
"Asia/Qatar",
"Asia/Bahrain",
"Asia/Qostanay",
"Asia/Qyzylorda",
"Asia/Riyadh",
"Antarctica/Syowa",
"Asia/Aden",
"Asia/Kuwait",
"Asia/Sakhalin",
"Asia/Samarkand",
"Asia/Seoul",
"ROK",
"Asia/Shanghai",
"Asia/Chongqing",
"Asia/Chungking",
"Asia/Harbin",
"PRC",
"Asia/Singapore",
"Asia/Kuala_Lumpur",
"Singapore",
"Asia/Srednekolymsk",
"Asia/Taipei",
"ROC",
"Asia/Tashkent",
"Asia/Tbilisi",
"Asia/Tehran",
"Iran",
"Asia/Thimphu",
"Asia/Thimbu",
"Asia/Tokyo",
"Japan",
"Asia/Tomsk",
"Asia/Ulaanbaatar",
"Asia/Choibalsan",
"Asia/Ulan_Bator",
"Asia/Urumqi",
"Asia/Kashgar",
"Asia/Ust-Nera",
"Asia/Vladivostok",
"Asia/Yakutsk",
"Asia/Yangon",
"Asia/Rangoon",
"Indian/Cocos",
"Asia/Yekaterinburg",
"Asia/Yerevan",
"Atlantic/Azores",
"Atlantic/Bermuda",
"Atlantic/Canary",
"Atlantic/Cape_Verde",
"Atlantic/Faroe",
"Atlantic/Faeroe",
"Atlantic/Madeira",
"Atlantic/South_Georgia",
"Atlantic/Stanley",
"Australia/Adelaide",
"Australia/South",
"Australia/Brisbane",
"Australia/Queensland",
"Australia/Broken_Hill",
"Australia/Yancowinna",
"Australia/Darwin",
"Australia/North",
"Australia/Eucla",
"Australia/Hobart",
"Australia/Currie",
"Australia/Tasmania",
"Australia/Lindeman",
"Australia/Lord_Howe",
"Australia/LHI",
"Australia/Melbourne",
"Australia/Victoria",
"Australia/Perth",
"Australia/West",
"Australia/Sydney",
"Australia/ACT",
"Australia/Canberra",
"Australia/NSW",
"Etc/GMT",
"Etc/GMT+0",
"Etc/GMT-0",
"Etc/GMT0",
"Etc/Greenwich",
"GMT",
"GMT+0",
"GMT-0",
"GMT0",
"Greenwich",
"Etc/GMT-1",
"Etc/GMT-10",
"Etc/GMT-11",
"Etc/GMT-12",
"Etc/GMT-13",
"Etc/GMT-14",
"Etc/GMT-2",
"Etc/GMT-3",
"Etc/GMT-4",
"Etc/GMT-5",
"Etc/GMT-6",
"Etc/GMT-7",
"Etc/GMT-8",
"Etc/GMT-9",
"Etc/GMT+1",
"Etc/GMT+10",
"Etc/GMT+11",
"Etc/GMT+12",
"Etc/GMT+2",
"Etc/GMT+3",
"Etc/GMT+4",
"Etc/GMT+5",
"Etc/GMT+6",
"Etc/GMT+7",
"Etc/GMT+8",
"Etc/GMT+9",
"Etc/UTC",
"Etc/UCT",
"Etc/Universal",
"Etc/Zulu",
"UCT",
"UTC",
"Universal",
"Zulu",
"Europe/Andorra",
"Europe/Astrakhan",
"Europe/Athens",
"EET",
"Europe/Belgrade",
"Europe/Ljubljana",
"Europe/Podgorica",
"Europe/Sarajevo",
"Europe/Skopje",
"Europe/Zagreb",
"Europe/Berlin",
"Arctic/Longyearbyen",
"Atlantic/Jan_Mayen",
"Europe/Copenhagen",
"Europe/Oslo",
"Europe/Stockholm",
"Europe/Brussels",
"CET",
"Europe/Amsterdam",
"Europe/Luxembourg",
"MET",
"Europe/Bucharest",
"Europe/Budapest",
"Europe/Chisinau",
"Europe/Tiraspol",
"Europe/Dublin",
"Eire",
"Europe/Gibraltar",
"Europe/Helsinki",
"Europe/Mariehamn",
"Europe/Istanbul",
"Asia/Istanbul",
"Turkey",
"Europe/Kaliningrad",
"Europe/Kirov",
"Europe/Kyiv",
"Europe/Kiev",
"Europe/Uzhgorod",
"Europe/Zaporozhye",
"Europe/Lisbon",
"Portugal",
"WET",
"Europe/London",
"Europe/Belfast",
"Europe/Guernsey",
"Europe/Isle_of_Man",
"Europe/Jersey",
"GB",
"GB-Eire",
"Europe/Madrid",
"Europe/Malta",
"Europe/Minsk",
"Europe/Moscow",
"W-SU",
"Europe/Paris",
"Europe/Monaco",
"Europe/Prague",
"Europe/Bratislava",
"Europe/Riga",
"Europe/Rome",
"Europe/San_Marino",
"Europe/Vatican",
"Europe/Samara",
"Europe/Saratov",
"Europe/Simferopol",
"Europe/Sofia",
"Europe/Tallinn",
"Europe/Tirane",
"Europe/Ulyanovsk",
"Europe/Vienna",
"Europe/Vilnius",
"Europe/Volgograd",
"Europe/Warsaw",
"Poland",
"Europe/Zurich",
"Europe/Busingen",
"Europe/Vaduz",
"Indian/Chagos",
"Indian/Maldives",
"Indian/Kerguelen",
"Indian/Mauritius",
"Pacific/Apia",
"Pacific/Auckland",
"Antarctica/McMurdo",
"Antarctica/South_Pole",
"NZ",
"Pacific/Bougainville",
"Pacific/Chatham",
"NZ-CHAT",
"Pacific/Easter",
"Chile/EasterIsland",
"Pacific/Efate",
"Pacific/Fakaofo",
"Pacific/Fiji",
"Pacific/Galapagos",
"Pacific/Gambier",
"Pacific/Guadalcanal",
"Pacific/Pohnpei",
"Pacific/Ponape",
"Pacific/Guam",
"Pacific/Saipan",
"Pacific/Honolulu",
"HST",
"Pacific/Johnston",
"US/Hawaii",
"Pacific/Kanton",
"Pacific/Enderbury",
"Pacific/Kiritimati",
"Pacific/Kosrae",
"Pacific/Kwajalein",
"Kwajalein",
"Pacific/Marquesas",
"Pacific/Nauru",
"Pacific/Niue",
"Pacific/Norfolk",
"Pacific/Noumea",
"Pacific/Pago_Pago",
"Pacific/Midway",
"Pacific/Samoa",
"US/Samoa",
"Pacific/Palau",
"Pacific/Pitcairn",
"Pacific/Port_Moresby",
"Antarctica/DumontDUrville",
"Pacific/Chuuk",
"Pacific/Truk",
"Pacific/Yap",
"Pacific/Rarotonga",
"Pacific/Tahiti",
"Pacific/Tarawa",
"Pacific/Funafuti",
"Pacific/Majuro",
"Pacific/Wake",
"Pacific/Wallis",
"Pacific/Tongatapu",
}

View File

@ -1,105 +0,0 @@
/**
* vaxis/widget/list, edited to support wraparounds and number seeking
* soon to support confirmations, once i get around to that
*/
package ui
import (
"fmt"
"strconv"
"git.sr.ht/~rockorager/vaxis"
)
type List struct {
index int
items []string
offset int
}
func NewList(items []string, index int) List {
return List{
items: items,
index: index,
}
}
func (m *List) Draw(win vaxis.Window) {
_, height := win.Size()
if m.index >= m.offset+height {
m.offset = m.index - height + 1
} else if m.index < m.offset {
m.offset = m.index
}
defaultStyle := vaxis.Style{}
selectedStyle := vaxis.Style{Attribute: vaxis.AttrReverse}
index := m.index - m.offset
for i, subject := range m.items[m.offset:] {
var style vaxis.Style
if i == index {
style = selectedStyle
} else {
style = defaultStyle
}
win.Println(i, vaxis.Segment{Text: fmt.Sprintf(" %-"+strconv.Itoa(win.Width-2)+"s", subject), Style: style})
}
}
func (m *List) Down() {
if m.index == len(m.items)-1 {
m.index = 0
} else {
m.index++
}
}
func (m *List) Up() {
if m.index == 0 {
m.index = len(m.items) - 1
} else {
m.index--
}
}
func (m *List) Home() {
m.index = 0
}
func (m *List) End() {
m.index = len(m.items) - 1
}
func (m *List) PageDown(win vaxis.Window) {
_, height := win.Size()
m.index = min(len(m.items)-1, m.index+height)
}
func (m *List) PageUp(win vaxis.Window) {
_, height := win.Size()
m.index = max(0, m.index-height)
}
func (m *List) Items() []string {
return m.items
}
func (m *List) SetItems(items []string) {
m.items = items
m.index = min(len(items)-1, m.index)
}
func (m *List) SetItem(index int, item string) {
m.items[index] = item
}
// Returns the index of the currently selected item.
func (m *List) Index() int {
return m.index
}
func (m *List) SetIndex(index int) {
m.index = index
}