Fix: Multiple UI bugs - settings display, dark mode, double buttons
- ComboSetting: Fix saved values not showing for language/accent color - Add valueRole/textRole and fix comparison logic - TextField: Fix CardDAV username/realm not displaying when saved - Re-establish Qt.binding after Windows password workaround - Dark Mode fixes: - ComboBox popup: Add background color for dark mode - DisplaySettingsLayout: Fix typo main2_500main -> main2_500_main - CallsWindow: Add window background color for dark mode - Double buttons fix: - CallPage: Clear rightPanelStackView on component creation - CallHistoryLayout: Remove explicit sizes, add Layout.alignment Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
bcab149969
commit
ae94b325b1
11 changed files with 277 additions and 24 deletions
213
BUGFIX_DOUBLE_BUTTONS.md
Normal file
213
BUGFIX_DOUBLE_BUTTONS.md
Normal file
|
|
@ -0,0 +1,213 @@
|
||||||
|
# Bugfix: Doppelte Buttons in der Anrufdetailansicht
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
In der Anrufdetailansicht (CallHistoryLayout) wurden die drei Aktionsbuttons "Anrufen", "Nachricht" und "Videoanruf" nach mehrmaligem Wechseln zwischen Tabs doppelt angezeigt. Sowohl die Icons als auch die Labels erschienen zweimal untereinander.
|
||||||
|
|
||||||
|
### Symptome
|
||||||
|
- Buttons erscheinen normal beim ersten Besuch der Anrufe-Seite
|
||||||
|
- Nach Navigation zu einem anderen Tab (z.B. Kontakte) und Rückkehr zu Anrufe: noch OK
|
||||||
|
- Nach erneutem Wechsel (2-3 mal): Buttons werden doppelt angezeigt
|
||||||
|
- Besuch der Einstellungen (als Overlay) und Rückkehr behob das Problem temporär
|
||||||
|
|
||||||
|
### Betroffene Dateien
|
||||||
|
- `Linphone/view/Page/Main/Call/CallPage.qml`
|
||||||
|
- `Linphone/view/Control/Container/Call/CallHistoryLayout.qml`
|
||||||
|
- `Linphone/view/Control/Button/LabelButton.qml`
|
||||||
|
|
||||||
|
## Ursachen
|
||||||
|
|
||||||
|
### 1. Nicht bereinigter StackView-Zustand
|
||||||
|
Die CallPage wird bei Tab-Wechseln durch einen Loader zerstört und neu erstellt. Der `rightPanelStackView` wurde bei der Neuerstellung nicht bereinigt, was zu Zustandsproblemen führte.
|
||||||
|
|
||||||
|
### 2. Fehlerhafte Größenangaben bei LabelButtons
|
||||||
|
Die LabelButtons hatten explizite `width: 56` und `height: 56` Angaben, obwohl der tatsächliche Inhalt (Button 56x56 + Spacing 8 + Text ~20) größer war. Dies führte zu Layout-Inkonsistenzen bei der Neuberechnung.
|
||||||
|
|
||||||
|
### 3. Fehlende Layout-Ausrichtung
|
||||||
|
Nach Entfernung der expliziten Größen fehlte eine konsistente vertikale Ausrichtung, was zu Verschiebungen des Videoanruf-Buttons führte.
|
||||||
|
|
||||||
|
## Lösung
|
||||||
|
|
||||||
|
### CallPage.qml
|
||||||
|
```qml
|
||||||
|
Component.onCompleted: {
|
||||||
|
console.log("[CallPage] Created, rightPanelStackView.depth:", rightPanelStackView.depth)
|
||||||
|
// Ensure clean state on creation
|
||||||
|
rightPanelStackView.clear()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Erklärung:** Bei jeder Neuerstellung der CallPage wird der StackView geleert, um einen sauberen Zustand sicherzustellen.
|
||||||
|
|
||||||
|
### CallHistoryLayout.qml
|
||||||
|
```qml
|
||||||
|
RowLayout {
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
spacing: Utils.getSizeWithScreenRatio(72)
|
||||||
|
visible: !mainItem.isConference
|
||||||
|
|
||||||
|
LabelButton {
|
||||||
|
Layout.alignment: Qt.AlignTop // Hinzugefügt
|
||||||
|
button.icon.width: Utils.getSizeWithScreenRatio(24)
|
||||||
|
button.icon.height: Utils.getSizeWithScreenRatio(24)
|
||||||
|
button.icon.source: AppIcons.phone
|
||||||
|
label: qsTr("contact_call_action")
|
||||||
|
// ... onClick handler
|
||||||
|
}
|
||||||
|
// Gleiche Änderung für alle drei LabelButtons
|
||||||
|
}
|
||||||
|
```
|
||||||
|
**Änderungen:**
|
||||||
|
- Entfernt: `width: Utils.getSizeWithScreenRatio(56)` und `height: Utils.getSizeWithScreenRatio(56)` von allen LabelButtons
|
||||||
|
- Entfernt: `Layout.fillWidth: true` und `Layout.preferredHeight: childrenRect.height` vom RowLayout
|
||||||
|
- Hinzugefügt: `Layout.alignment: Qt.AlignTop` für konsistente vertikale Ausrichtung
|
||||||
|
|
||||||
|
## Technischer Hintergrund
|
||||||
|
|
||||||
|
### Navigation und Loader-Verhalten
|
||||||
|
Die CallPage befindet sich in einem Loader mit `active: mainStackLayout.currentIndex === 0`. Bei Tab-Wechseln:
|
||||||
|
1. `currentIndex` ändert sich
|
||||||
|
2. Loader wird inaktiv → CallPage wird zerstört
|
||||||
|
3. Bei Rückkehr wird Loader aktiv → Neue CallPage wird erstellt
|
||||||
|
|
||||||
|
Im Gegensatz dazu öffnen die Einstellungen als Overlay (contextual menu), ohne die CallPage zu zerstören.
|
||||||
|
|
||||||
|
### StackView-Verhalten
|
||||||
|
Der `rightPanelStackView` verwendet `replace()` für Übergänge. Bei schneller Neuerstellung und property-Änderungen (durch `onSelectedRowHistoryGuiChanged`) konnte es zu Race-Conditions kommen, die zu doppelten Einträgen führten.
|
||||||
|
|
||||||
|
## Test-Szenario
|
||||||
|
1. App starten
|
||||||
|
2. Zu "Anrufe" navigieren
|
||||||
|
3. Einen Anruf in der Liste anklicken (Details werden rechts angezeigt)
|
||||||
|
4. Zu "Kontakte" wechseln
|
||||||
|
5. Zurück zu "Anrufe" wechseln
|
||||||
|
6. Schritte 4-5 mehrmals wiederholen
|
||||||
|
7. **Erwartetes Ergebnis:** Buttons bleiben korrekt (nicht doppelt, korrekt ausgerichtet)
|
||||||
|
|
||||||
|
## Datum
|
||||||
|
2026-02-08
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Weitere Bugfixes (2026-02-08)
|
||||||
|
|
||||||
|
## 1. ComboSetting zeigt gespeicherte Werte nicht an
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
Die Dropdown-Menüs für Sprache und Akzentfarbe in den Anzeigeeinstellungen zeigten den gespeicherten Wert nicht an. Das erste Element wurde immer angezeigt, auch wenn ein anderer Wert gespeichert war.
|
||||||
|
|
||||||
|
### Ursache
|
||||||
|
Die `currentIndex`-Berechnung verglich das gesamte Model-Entry-Objekt (z.B. `{text: "English", value: "en"}`) mit dem gespeicherten String-Wert (`"en"`) mit `Utils.equalObject()`. Dies ergab immer `false`, da die Typen nicht übereinstimmen.
|
||||||
|
|
||||||
|
### Lösung
|
||||||
|
**Datei:** `Linphone/view/Control/Button/Settings/ComboSetting.qml`
|
||||||
|
|
||||||
|
```qml
|
||||||
|
ComboBox {
|
||||||
|
id: comboBox
|
||||||
|
// ...
|
||||||
|
valueRole: "value"
|
||||||
|
textRole: "text"
|
||||||
|
currentIndex: Utils.findIndex(model, function (entry) {
|
||||||
|
var currentVal = propertyOwnerGui
|
||||||
|
? propertyOwnerGui.core[mainItem.propertyName]
|
||||||
|
: propertyOwner[mainItem.propertyName]
|
||||||
|
// Compare entry.value with the stored value (both are simple strings)
|
||||||
|
return entry.value === currentVal
|
||||||
|
})
|
||||||
|
onCurrentValueChanged: {
|
||||||
|
var storedVal = propertyOwnerGui
|
||||||
|
? propertyOwnerGui.core[mainItem.propertyName]
|
||||||
|
: propertyOwner[mainItem.propertyName]
|
||||||
|
// currentValue is now just the value string
|
||||||
|
binding.when = currentValue !== storedVal
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. CardDAV Benutzername und Realm werden nicht angezeigt
|
||||||
|
|
||||||
|
### Problem
|
||||||
|
In den CardDAV-Einstellungen wurden gespeicherte Werte für Benutzername und Realm nicht in den Textfeldern angezeigt.
|
||||||
|
|
||||||
|
### Ursache
|
||||||
|
Das `TextField.qml` hat einen Windows-Workaround im `Component.onCompleted`:
|
||||||
|
```qml
|
||||||
|
Component.onCompleted: {
|
||||||
|
text = "workaround"
|
||||||
|
resetText()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Die imperative Zuweisung `text = "workaround"` bricht den deklarativen Binding zu `initialText`. Wenn der Core-Wert erst nach der Komponentenerstellung verfügbar ist, wird er nicht angezeigt.
|
||||||
|
|
||||||
|
### Lösung
|
||||||
|
**Datei:** `Linphone/view/Control/Input/TextField.qml`
|
||||||
|
|
||||||
|
```qml
|
||||||
|
Component.onCompleted: {
|
||||||
|
text = "workaround"
|
||||||
|
// Re-establish binding to initialText after workaround
|
||||||
|
text = Qt.binding(function() { return initialText })
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Dark Mode Probleme
|
||||||
|
|
||||||
|
### 3a. ComboBox-Popup ist weiß im Dark Mode
|
||||||
|
|
||||||
|
**Problem:** Das Dropdown-Popup der ComboBox hatte einen weißen Hintergrund im Dark Mode.
|
||||||
|
|
||||||
|
**Ursache:** Das `Rectangle` im Popup-Hintergrund hatte keine `color`-Eigenschaft.
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
**Datei:** `Linphone/view/Control/Button/ComboBox.qml`
|
||||||
|
|
||||||
|
```qml
|
||||||
|
background: Item {
|
||||||
|
// ...
|
||||||
|
Rectangle {
|
||||||
|
id: cboxBg
|
||||||
|
anchors.fill: parent
|
||||||
|
radius: Utils.getSizeWithScreenRatio(15)
|
||||||
|
color: DefaultStyle.grey_100 // Hinzugefügt - passt sich Dark Mode an
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3b. Beschreibungstext schwarz im Dark Mode
|
||||||
|
|
||||||
|
**Problem:** Hinweistexte in den Anzeigeeinstellungen waren schwarz und kaum lesbar im Dark Mode.
|
||||||
|
|
||||||
|
**Ursache:** Tippfehler: `main2_500main` statt `main2_500_main`
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
**Datei:** `Linphone/view/Page/Layout/Settings/DisplaySettingsLayout.qml`
|
||||||
|
|
||||||
|
```qml
|
||||||
|
color: DefaultStyle.main2_500_main // Korrigiert von main2_500main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3c. Anruffenster hell im Dark Mode
|
||||||
|
|
||||||
|
**Problem:** Das Anruffenster hatte einen weißen Hintergrund im Dark Mode.
|
||||||
|
|
||||||
|
**Ursache:** Die `color`-Eigenschaft wurde nicht gesetzt (fehlt im Gegensatz zu MainWindow.qml).
|
||||||
|
|
||||||
|
**Lösung:**
|
||||||
|
**Datei:** `Linphone/view/Page/Window/Call/CallsWindow.qml`
|
||||||
|
|
||||||
|
```qml
|
||||||
|
AbstractWindow {
|
||||||
|
id: mainWindow
|
||||||
|
flags: Qt.Window
|
||||||
|
color: DefaultStyle.grey_0 // Hinzugefügt
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Zusammenfassung der geänderten Dateien
|
||||||
|
|
||||||
|
| Datei | Änderung |
|
||||||
|
|-------|----------|
|
||||||
|
| `ComboSetting.qml` | valueRole/textRole und korrekter Wertvergleich |
|
||||||
|
| `TextField.qml` | Binding nach Windows-Workaround wiederherstellen |
|
||||||
|
| `ComboBox.qml` | Popup-Hintergrundfarbe für Dark Mode |
|
||||||
|
| `DisplaySettingsLayout.qml` | Tippfehler bei Farbname korrigiert |
|
||||||
|
| `CallsWindow.qml` | Window-Hintergrundfarbe für Dark Mode |
|
||||||
|
|
@ -2033,6 +2033,18 @@
|
||||||
<extracomment>"Stocker ici les contacts nouvellement crées"</extracomment>
|
<extracomment>"Stocker ici les contacts nouvellement crées"</extracomment>
|
||||||
<translation>Neu erstellte Kontakte hier speichern</translation>
|
<translation>Neu erstellte Kontakte hier speichern</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../view/Page/Layout/Settings/CarddavSettingsLayout.qml" line="135"/>
|
||||||
|
<source>settings_contacts_carddav_store_plain_password_title</source>
|
||||||
|
<extracomment>"Passwort im Klartext speichern (für HTTP Basic Auth)"</extracomment>
|
||||||
|
<translation>Passwort im Klartext speichern (für HTTP Basic Auth)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../view/Page/Layout/Settings/CarddavSettingsLayout.qml" line="137"/>
|
||||||
|
<source>settings_contacts_carddav_store_plain_password_subtitle</source>
|
||||||
|
<extracomment>"Für Nextcloud/WebDAV-Server erforderlich. Passwort wird nicht gehasht."</extracomment>
|
||||||
|
<translation>Für Nextcloud/WebDAV-Server erforderlich. Passwort wird nicht gehasht.</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ChangeLayoutForm</name>
|
<name>ChangeLayoutForm</name>
|
||||||
|
|
@ -2712,13 +2724,13 @@ Error</extracomment>
|
||||||
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="50"/>
|
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="50"/>
|
||||||
<source>settings_chat_display_notification_content_title</source>
|
<source>settings_chat_display_notification_content_title</source>
|
||||||
<extracomment>"Display notification content"</extracomment>
|
<extracomment>"Display notification content"</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Benachrichtigungsinhalt anzeigen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="52"/>
|
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="52"/>
|
||||||
<source>settings_chat_display_notification_content_subtitle</source>
|
<source>settings_chat_display_notification_content_subtitle</source>
|
||||||
<extracomment>"Display the content of the received message"</extracomment>
|
<extracomment>"Display the content of the received message"</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Inhalt der empfangenen Nachricht in Benachrichtigungen anzeigen</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
|
|
||||||
|
|
@ -2026,6 +2026,18 @@
|
||||||
<extracomment>"Stocker ici les contacts nouvellement crées"</extracomment>
|
<extracomment>"Stocker ici les contacts nouvellement crées"</extracomment>
|
||||||
<translation>Store newly created contacts here</translation>
|
<translation>Store newly created contacts here</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../view/Page/Layout/Settings/CarddavSettingsLayout.qml" line="135"/>
|
||||||
|
<source>settings_contacts_carddav_store_plain_password_title</source>
|
||||||
|
<extracomment>"Store password in plain text (for HTTP Basic Auth)"</extracomment>
|
||||||
|
<translation>Store password in plain text (for HTTP Basic Auth)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../../view/Page/Layout/Settings/CarddavSettingsLayout.qml" line="137"/>
|
||||||
|
<source>settings_contacts_carddav_store_plain_password_subtitle</source>
|
||||||
|
<extracomment>"Required for Nextcloud/WebDAV servers. Password is not hashed."</extracomment>
|
||||||
|
<translation>Required for Nextcloud/WebDAV servers. Password is not hashed.</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>ChangeLayoutForm</name>
|
<name>ChangeLayoutForm</name>
|
||||||
|
|
@ -2697,13 +2709,13 @@ Only your correspondent can decrypt them.</translation>
|
||||||
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="50"/>
|
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="50"/>
|
||||||
<source>settings_chat_display_notification_content_title</source>
|
<source>settings_chat_display_notification_content_title</source>
|
||||||
<extracomment>"Display notification content"</extracomment>
|
<extracomment>"Display notification content"</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Display notification content</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="52"/>
|
<location filename="../../view/Page/Layout/Settings/ChatSettingsLayout.qml" line="52"/>
|
||||||
<source>settings_chat_display_notification_content_subtitle</source>
|
<source>settings_chat_display_notification_content_subtitle</source>
|
||||||
<extracomment>"Display the content of the received message"</extracomment>
|
<extracomment>"Display the content of the received message"</extracomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation>Display the content of the received message</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,7 @@ Control.ComboBox {
|
||||||
id: cboxBg
|
id: cboxBg
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
radius: Utils.getSizeWithScreenRatio(15)
|
radius: Utils.getSizeWithScreenRatio(15)
|
||||||
|
color: DefaultStyle.grey_100
|
||||||
}
|
}
|
||||||
MultiEffect {
|
MultiEffect {
|
||||||
anchors.fill: cboxBg
|
anchors.fill: cboxBg
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,9 @@ ColumnLayout {
|
||||||
property alias text: text
|
property alias text: text
|
||||||
property string label
|
property string label
|
||||||
spacing: Utils.getSizeWithScreenRatio(8)
|
spacing: Utils.getSizeWithScreenRatio(8)
|
||||||
|
|
||||||
|
Component.onCompleted: console.log("[LabelButton] Created:", label, "parent:", parent)
|
||||||
|
Component.onDestruction: console.log("[LabelButton] Destroyed:", label)
|
||||||
Button {
|
Button {
|
||||||
id: button
|
id: button
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
|
|
||||||
|
|
@ -49,18 +49,21 @@ RowLayout {
|
||||||
Layout.preferredWidth: titleText.length > 0 ? Utils.getSizeWithScreenRatio(200) : undefined
|
Layout.preferredWidth: titleText.length > 0 ? Utils.getSizeWithScreenRatio(200) : undefined
|
||||||
Layout.fillWidth: titleText.length === 0
|
Layout.fillWidth: titleText.length === 0
|
||||||
oneLine: true
|
oneLine: true
|
||||||
|
valueRole: "value"
|
||||||
|
textRole: "text"
|
||||||
currentIndex: Utils.findIndex(model, function (entry) {
|
currentIndex: Utils.findIndex(model, function (entry) {
|
||||||
if(propertyOwnerGui)
|
var currentVal = propertyOwnerGui
|
||||||
return Utils.equalObject(entry, propertyOwnerGui.core[mainItem.propertyName])
|
? propertyOwnerGui.core[mainItem.propertyName]
|
||||||
else
|
: propertyOwner[mainItem.propertyName]
|
||||||
return Utils.equalObject(entry, propertyOwner[mainItem.propertyName])
|
// Compare entry.value with the stored value (both are simple strings like "en", "orange")
|
||||||
|
return entry.value === currentVal
|
||||||
})
|
})
|
||||||
onCurrentValueChanged: {
|
onCurrentValueChanged: {
|
||||||
if(propertyOwnerGui) {
|
var storedVal = propertyOwnerGui
|
||||||
binding.when = !Utils.equalObject(currentValue, propertyOwnerGui.core[mainItem.propertyName])
|
? propertyOwnerGui.core[mainItem.propertyName]
|
||||||
} else {
|
: propertyOwner[mainItem.propertyName]
|
||||||
binding.when = !Utils.equalObject(currentValue, propertyOwner[mainItem.propertyName])
|
// currentValue is now just the value string (e.g., "en", "orange")
|
||||||
}
|
binding.when = currentValue !== storedVal
|
||||||
}
|
}
|
||||||
Binding {
|
Binding {
|
||||||
id: binding
|
id: binding
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,9 @@ ColumnLayout {
|
||||||
id: mainItem
|
id: mainItem
|
||||||
spacing: Utils.getSizeWithScreenRatio(30)
|
spacing: Utils.getSizeWithScreenRatio(30)
|
||||||
|
|
||||||
|
Component.onCompleted: console.log("[CallHistoryLayout] Created, parent:", parent)
|
||||||
|
Component.onDestruction: console.log("[CallHistoryLayout] Destroyed")
|
||||||
|
|
||||||
property var callHistoryGui
|
property var callHistoryGui
|
||||||
|
|
||||||
property FriendGui contact
|
property FriendGui contact
|
||||||
|
|
@ -122,12 +125,9 @@ ColumnLayout {
|
||||||
RowLayout {
|
RowLayout {
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
spacing: Utils.getSizeWithScreenRatio(72)
|
spacing: Utils.getSizeWithScreenRatio(72)
|
||||||
Layout.fillWidth: true
|
|
||||||
Layout.preferredHeight: childrenRect.height
|
|
||||||
visible: !mainItem.isConference
|
visible: !mainItem.isConference
|
||||||
LabelButton {
|
LabelButton {
|
||||||
width: Utils.getSizeWithScreenRatio(56)
|
Layout.alignment: Qt.AlignTop
|
||||||
height: Utils.getSizeWithScreenRatio(56)
|
|
||||||
button.icon.width: Utils.getSizeWithScreenRatio(24)
|
button.icon.width: Utils.getSizeWithScreenRatio(24)
|
||||||
button.icon.height: Utils.getSizeWithScreenRatio(24)
|
button.icon.height: Utils.getSizeWithScreenRatio(24)
|
||||||
button.icon.source: AppIcons.phone
|
button.icon.source: AppIcons.phone
|
||||||
|
|
@ -139,9 +139,8 @@ ColumnLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LabelButton {
|
LabelButton {
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
visible: !SettingsCpp.disableChatFeature
|
visible: !SettingsCpp.disableChatFeature
|
||||||
width: Utils.getSizeWithScreenRatio(56)
|
|
||||||
height: Utils.getSizeWithScreenRatio(56)
|
|
||||||
button.icon.width: Utils.getSizeWithScreenRatio(24)
|
button.icon.width: Utils.getSizeWithScreenRatio(24)
|
||||||
button.icon.height: Utils.getSizeWithScreenRatio(24)
|
button.icon.height: Utils.getSizeWithScreenRatio(24)
|
||||||
button.icon.source: AppIcons.chatTeardropText
|
button.icon.source: AppIcons.chatTeardropText
|
||||||
|
|
@ -159,9 +158,8 @@ ColumnLayout {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LabelButton {
|
LabelButton {
|
||||||
|
Layout.alignment: Qt.AlignTop
|
||||||
visible: SettingsCpp.videoEnabled
|
visible: SettingsCpp.videoEnabled
|
||||||
width: Utils.getSizeWithScreenRatio(56)
|
|
||||||
height: Utils.getSizeWithScreenRatio(56)
|
|
||||||
button.icon.width: Utils.getSizeWithScreenRatio(24)
|
button.icon.width: Utils.getSizeWithScreenRatio(24)
|
||||||
button.icon.height: Utils.getSizeWithScreenRatio(24)
|
button.icon.height: Utils.getSizeWithScreenRatio(24)
|
||||||
button.icon.source: AppIcons.videoCamera
|
button.icon.source: AppIcons.videoCamera
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,8 @@ Control.TextField {
|
||||||
// due to Qt not initializing the Password echo mode before the first letter is typed
|
// due to Qt not initializing the Password echo mode before the first letter is typed
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
text = "workaround"
|
text = "workaround"
|
||||||
resetText()
|
// Re-establish binding to initialText after workaround
|
||||||
|
text = Qt.binding(function() { return initialText })
|
||||||
}
|
}
|
||||||
|
|
||||||
verticalAlignment: TextInput.AlignVCenter
|
verticalAlignment: TextInput.AlignVCenter
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ AbstractSettingsLayout {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
//: Restart required for language change
|
//: Restart required for language change
|
||||||
text: qsTr("settings_display_language_restart_hint")
|
text: qsTr("settings_display_language_restart_hint")
|
||||||
color: DefaultStyle.main2_500main
|
color: DefaultStyle.main2_500_main
|
||||||
font.pixelSize: Typography.p2.pixelSize
|
font.pixelSize: Typography.p2.pixelSize
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
|
|
@ -101,7 +101,7 @@ AbstractSettingsLayout {
|
||||||
text: DefaultStyle.systemDarkMode
|
text: DefaultStyle.systemDarkMode
|
||||||
? qsTr("settings_display_system_dark_detected")
|
? qsTr("settings_display_system_dark_detected")
|
||||||
: qsTr("settings_display_system_light_detected")
|
: qsTr("settings_display_system_light_detected")
|
||||||
color: DefaultStyle.main2_500main
|
color: DefaultStyle.main2_500_main
|
||||||
font.pixelSize: Typography.p2.pixelSize
|
font.pixelSize: Typography.p2.pixelSize
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,13 @@ AbstractMainPage {
|
||||||
emptyListText: qsTr("call_history_empty_title")
|
emptyListText: qsTr("call_history_empty_title")
|
||||||
newItemIconSource: AppIcons.newCall
|
newItemIconSource: AppIcons.newCall
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
console.log("[CallPage] Created, rightPanelStackView.depth:", rightPanelStackView.depth)
|
||||||
|
// Ensure clean state on creation
|
||||||
|
rightPanelStackView.clear()
|
||||||
|
}
|
||||||
|
Component.onDestruction: console.log("[CallPage] Destroyed")
|
||||||
|
|
||||||
property var selectedRowHistoryGui
|
property var selectedRowHistoryGui
|
||||||
signal listViewUpdated
|
signal listViewUpdated
|
||||||
signal goToCallForwardSettings
|
signal goToCallForwardSettings
|
||||||
|
|
@ -51,12 +58,14 @@ AbstractMainPage {
|
||||||
}
|
}
|
||||||
|
|
||||||
onSelectedRowHistoryGuiChanged: {
|
onSelectedRowHistoryGuiChanged: {
|
||||||
|
console.log("[CallPage] selectedRowHistoryGuiChanged:", selectedRowHistoryGui ? "has value" : "null/undefined", "depth before:", rightPanelStackView.depth)
|
||||||
if (selectedRowHistoryGui)
|
if (selectedRowHistoryGui)
|
||||||
rightPanelStackView.replace(contactDetailComp,
|
rightPanelStackView.replace(contactDetailComp,
|
||||||
Control.StackView.Immediate)
|
Control.StackView.Immediate)
|
||||||
else
|
else
|
||||||
rightPanelStackView.replace(emptySelection,
|
rightPanelStackView.replace(emptySelection,
|
||||||
Control.StackView.Immediate)
|
Control.StackView.Immediate)
|
||||||
|
console.log("[CallPage] depth after:", rightPanelStackView.depth)
|
||||||
}
|
}
|
||||||
rightPanelStackView.initialItem: emptySelection
|
rightPanelStackView.initialItem: emptySelection
|
||||||
rightPanelStackView.width: Utils.getSizeWithScreenRatio(360)
|
rightPanelStackView.width: Utils.getSizeWithScreenRatio(360)
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import "qrc:/qt/qml/Linphone/view/Style/buttonStyle.js" as ButtonStyle
|
||||||
AbstractWindow {
|
AbstractWindow {
|
||||||
id: mainWindow
|
id: mainWindow
|
||||||
flags: Qt.Window
|
flags: Qt.Window
|
||||||
|
color: DefaultStyle.grey_0
|
||||||
minimumWidth: Utils.getSizeWithScreenRatio(1020)
|
minimumWidth: Utils.getSizeWithScreenRatio(1020)
|
||||||
minimumHeight: Utils.getSizeWithScreenRatio(700)
|
minimumHeight: Utils.getSizeWithScreenRatio(700)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue