Home led with a diagram of the attached monitor -- DP-2, 4500 x 3000, 1.13x scale, XRGB2101010 -- which is Displays-page data, was the largest thing on the screen, and has never been needed there. Under it sat a permanently open search field for a weather location that is set about once a year, and then roughly half a page of nothing. It now opens with the two or three things somebody would open Home to do: starting or ending a focus session, Do Not Disturb, and what is running. The Do Not Disturb switch is disabled and says why while a mode is holding it, so it cannot appear to be a control that is being ignored. Findings sit above a reassurance line, the same shape the Firewall and Containers pages use. Each finding names the page that can resolve it, because a home page reporting a problem it cannot help with is only an alarm. On this machine that is one finding today -- PostgreSQL and Redis reachable from the network -- above "27 health checks pass, 522 GB free, snapshots ran at 02:00". "Do next" appears only when there is something in it. Weather stays, as the greeting's second line rather than a card with a search box open, and its picker is collapsed behind the current location. FocusModes was missing `import qs.config`, so DesktopPreferences was undefined and the modes list came back undefined with it -- shipped two commits ago with nothing noticing, because until Home referenced the service no isolated shell had ever instantiated it. Focus modes would have quietly had no modes. Pulling these services together on one page is what surfaced it. LocationPicker gained a picked signal, the same way DisplayModePicker did, so a container can put the search away without reaching into it. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
60 lines
1.7 KiB
QML
60 lines
1.7 KiB
QML
// Choosing where the weather reading is for.
|
|
//
|
|
// A search box rather than latitude and longitude fields: nobody knows their
|
|
// own coordinates, and a control that demands them is one nobody ever uses. The
|
|
// coordinates are what actually get stored -- the name is only a label.
|
|
|
|
import QtQuick
|
|
import qs.config
|
|
import qs.services
|
|
import qs.modules.clipboard
|
|
|
|
Column {
|
|
id: root
|
|
|
|
// Emitted once a place has been chosen, so a container can put the search
|
|
// away. Choosing is still this component's job; closing is not.
|
|
signal picked
|
|
|
|
spacing: 0
|
|
|
|
SearchField {
|
|
id: query
|
|
width: parent.width
|
|
placeholder: "Search for a town or city"
|
|
onTextChanged: Geocoding.search(query.text)
|
|
}
|
|
|
|
Repeater {
|
|
model: Geocoding.results
|
|
|
|
SettingRow {
|
|
id: place
|
|
|
|
required property var modelData
|
|
required property int index
|
|
|
|
label: place.modelData.name
|
|
detail: [place.modelData.admin, place.modelData.country].filter(part => !!part).join(", ")
|
|
value: place.modelData.latitude.toFixed(2) + ", " + place.modelData.longitude.toFixed(2)
|
|
controlWidth: 150
|
|
divider: place.index < Geocoding.results.length - 1
|
|
activatable: true
|
|
onActivated: {
|
|
if (Geocoding.choose(place.modelData)) {
|
|
query.text = "";
|
|
root.picked();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SettingRow {
|
|
width: parent.width
|
|
visible: Geocoding.searching || Geocoding.lastError !== ""
|
|
label: Geocoding.searching ? "Searching…" : "No result"
|
|
detail: Geocoding.searching ? "" : Geocoding.lastError
|
|
divider: false
|
|
}
|
|
}
|