NPanel fixes
This commit is contained in:
commit
6a9dee38ef
6 changed files with 92 additions and 23 deletions
|
|
@ -188,8 +188,9 @@ Singleton {
|
||||||
property JsonObject appLauncher: JsonObject {
|
property JsonObject appLauncher: JsonObject {
|
||||||
// When disabled, Launcher hides clipboard command and ignores cliphist
|
// When disabled, Launcher hides clipboard command and ignores cliphist
|
||||||
property bool enableClipboardHistory: true
|
property bool enableClipboardHistory: true
|
||||||
// Position: center, top_left, top_right, bottom_left, bottom_right
|
// Position: center, top_left, top_right, bottom_left, bottom_right, bottom_center, top_center
|
||||||
property string position: "center"
|
property string position: "center"
|
||||||
|
property real backgroundOpacity: 1.0
|
||||||
property list<string> pinnedExecs: []
|
property list<string> pinnedExecs: []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,19 @@ NPanel {
|
||||||
panelHeight: Math.min(550 * scaling, screen?.height * 0.8)
|
panelHeight: Math.min(550 * scaling, screen?.height * 0.8)
|
||||||
// Positioning derives from Settings.data.bar.position for vertical (top/bottom)
|
// Positioning derives from Settings.data.bar.position for vertical (top/bottom)
|
||||||
// and from Settings.data.appLauncher.position for horizontal vs center.
|
// and from Settings.data.appLauncher.position for horizontal vs center.
|
||||||
// Options: center, top_left, top_right, bottom_left, bottom_right
|
// Options: center, top_left, top_right, bottom_left, bottom_right, bottom_center, top_center
|
||||||
readonly property string launcherPosition: Settings.data.appLauncher.position
|
readonly property string launcherPosition: Settings.data.appLauncher.position
|
||||||
panelAnchorCentered: launcherPosition === "center"
|
|
||||||
|
panelAnchorHorizontalCenter: launcherPosition === "center" || (launcherPosition.endsWith("_center"))
|
||||||
|
panelAnchorVerticalCenter: launcherPosition === "center"
|
||||||
panelAnchorLeft: launcherPosition !== "center" && (launcherPosition.endsWith("_left"))
|
panelAnchorLeft: launcherPosition !== "center" && (launcherPosition.endsWith("_left"))
|
||||||
panelAnchorRight: launcherPosition !== "center" && (launcherPosition.endsWith("_right"))
|
panelAnchorRight: launcherPosition !== "center" && (launcherPosition.endsWith("_right"))
|
||||||
|
panelAnchorBottom: launcherPosition.startsWith("bottom_")
|
||||||
|
panelAnchorTop: launcherPosition.startsWith("top_")
|
||||||
|
|
||||||
|
// Background opacity following bar's approach
|
||||||
|
panelBackgroundColor: Qt.rgba(Color.mSurface.r, Color.mSurface.g, Color.mSurface.b,
|
||||||
|
Settings.data.appLauncher.backgroundOpacity)
|
||||||
|
|
||||||
// Properties
|
// Properties
|
||||||
property string searchText: ""
|
property string searchText: ""
|
||||||
|
|
@ -41,6 +49,8 @@ NPanel {
|
||||||
searchText = ""
|
searchText = ""
|
||||||
selectedIndex = 0
|
selectedIndex = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onClosed: {
|
onClosed: {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@ NPanel {
|
||||||
|
|
||||||
panelWidth: 440 * scaling
|
panelWidth: 440 * scaling
|
||||||
panelHeight: 380 * scaling
|
panelHeight: 380 * scaling
|
||||||
panelAnchorCentered: true
|
panelAnchorHorizontalCenter: true
|
||||||
|
panelAnchorVerticalCenter: true
|
||||||
|
|
||||||
// Timer properties
|
// Timer properties
|
||||||
property int timerDuration: 9000 // 9 seconds
|
property int timerDuration: 9000 // 9 seconds
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ NPanel {
|
||||||
|
|
||||||
panelWidth: Math.max(screen?.width * 0.5, 1280) * scaling
|
panelWidth: Math.max(screen?.width * 0.5, 1280) * scaling
|
||||||
panelHeight: Math.max(screen?.height * 0.5, 720) * scaling
|
panelHeight: Math.max(screen?.height * 0.5, 720) * scaling
|
||||||
panelAnchorCentered: true
|
panelAnchorHorizontalCenter: true
|
||||||
|
panelAnchorVerticalCenter: true
|
||||||
|
|
||||||
// Tabs enumeration, order is NOT relevant
|
// Tabs enumeration, order is NOT relevant
|
||||||
enum Tab {
|
enum Tab {
|
||||||
|
|
|
||||||
|
|
@ -89,12 +89,54 @@ ColumnLayout {
|
||||||
key: "bottom_right"
|
key: "bottom_right"
|
||||||
name: "Bottom Right"
|
name: "Bottom Right"
|
||||||
}
|
}
|
||||||
|
ListElement {
|
||||||
|
key: "bottom_center"
|
||||||
|
name: "Bottom Center"
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
key: "top_center"
|
||||||
|
name: "Top Center"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
currentKey: Settings.data.appLauncher.position
|
currentKey: Settings.data.appLauncher.position
|
||||||
onSelected: function (key) {
|
onSelected: function (key) {
|
||||||
Settings.data.appLauncher.position = key
|
Settings.data.appLauncher.position = key
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NDivider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
Layout.topMargin: Style.marginL * scaling
|
||||||
|
Layout.bottomMargin: Style.marginS * scaling
|
||||||
|
}
|
||||||
|
|
||||||
|
NText {
|
||||||
|
text: "Launcher Background"
|
||||||
|
font.pointSize: Style.fontSizeXXL * scaling
|
||||||
|
font.weight: Style.fontWeightBold
|
||||||
|
color: Color.mOnSurface
|
||||||
|
Layout.bottomMargin: Style.marginS * scaling
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
NSlider {
|
||||||
|
id: launcherBgOpacity
|
||||||
|
Layout.fillWidth: true
|
||||||
|
from: 0.0
|
||||||
|
to: 1.0
|
||||||
|
stepSize: 0.01
|
||||||
|
value: Settings.data.appLauncher.backgroundOpacity
|
||||||
|
onMoved: Settings.data.appLauncher.backgroundOpacity = value
|
||||||
|
cutoutColor: Color.mSurface
|
||||||
|
}
|
||||||
|
|
||||||
|
NText {
|
||||||
|
text: Math.floor(Settings.data.appLauncher.backgroundOpacity * 100) + "%"
|
||||||
|
Layout.alignment: Qt.AlignVCenter
|
||||||
|
Layout.leftMargin: Style.marginS * scaling
|
||||||
|
color: Color.mOnSurface
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,12 @@ Loader {
|
||||||
property Component panelContent: null
|
property Component panelContent: null
|
||||||
property int panelWidth: 1500
|
property int panelWidth: 1500
|
||||||
property int panelHeight: 400
|
property int panelHeight: 400
|
||||||
property bool panelAnchorCentered: false
|
property color panelBackgroundColor: Color.mSurface
|
||||||
|
|
||||||
|
property bool panelAnchorHorizontalCenter: false
|
||||||
|
property bool panelAnchorVerticalCenter: false
|
||||||
|
property bool panelAnchorTop: false
|
||||||
|
property bool panelAnchorBottom: false
|
||||||
property bool panelAnchorLeft: false
|
property bool panelAnchorLeft: false
|
||||||
property bool panelAnchorRight: false
|
property bool panelAnchorRight: false
|
||||||
|
|
||||||
|
|
@ -153,7 +158,7 @@ Loader {
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
id: panelBackground
|
id: panelBackground
|
||||||
color: Color.mSurface
|
color: panelBackgroundColor
|
||||||
radius: Style.radiusL * scaling
|
radius: Style.radiusL * scaling
|
||||||
border.color: Color.mOutline
|
border.color: Color.mOutline
|
||||||
border.width: Math.max(1, Style.borderS * scaling)
|
border.width: Math.max(1, Style.borderS * scaling)
|
||||||
|
|
@ -161,6 +166,12 @@ Loader {
|
||||||
width: panelWidth
|
width: panelWidth
|
||||||
height: panelHeight
|
height: panelHeight
|
||||||
|
|
||||||
|
scale: root.scaleValue
|
||||||
|
opacity: root.opacityValue
|
||||||
|
|
||||||
|
x: calculatedX
|
||||||
|
y: calculatedY
|
||||||
|
|
||||||
property int calculatedX: {
|
property int calculatedX: {
|
||||||
if (root.useButtonPosition) {
|
if (root.useButtonPosition) {
|
||||||
// Position panel relative to button
|
// Position panel relative to button
|
||||||
|
|
@ -171,9 +182,9 @@ Loader {
|
||||||
var minX = Style.marginS * scaling
|
var minX = Style.marginS * scaling
|
||||||
|
|
||||||
return Math.max(minX, Math.min(targetX, maxX))
|
return Math.max(minX, Math.min(targetX, maxX))
|
||||||
} else if (!panelAnchorCentered && panelAnchorLeft) {
|
} else if (!panelAnchorHorizontalCenter && panelAnchorLeft) {
|
||||||
return Style.marginS * scaling
|
return Style.marginS * scaling
|
||||||
} else if (!panelAnchorCentered && panelAnchorRight) {
|
} else if (!panelAnchorHorizontalCenter && panelAnchorRight) {
|
||||||
return panelWindow.width - panelWidth - (Style.marginS * scaling)
|
return panelWindow.width - panelWidth - (Style.marginS * scaling)
|
||||||
} else {
|
} else {
|
||||||
return (panelWindow.width - panelWidth) / 2
|
return (panelWindow.width - panelWidth) / 2
|
||||||
|
|
@ -181,24 +192,27 @@ Loader {
|
||||||
}
|
}
|
||||||
|
|
||||||
property int calculatedY: {
|
property int calculatedY: {
|
||||||
// Position panel below or above the bar
|
if (panelAnchorVerticalCenter) {
|
||||||
if (!panelAnchorCentered) {
|
|
||||||
if (!barAtBottom) {
|
|
||||||
return Style.marginS * scaling
|
|
||||||
} else {
|
|
||||||
return panelWindow.height - panelHeight - (Style.marginS * scaling)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return (panelWindow.height - panelHeight) / 2
|
return (panelWindow.height - panelHeight) / 2
|
||||||
}
|
}
|
||||||
|
else if (panelAnchorBottom) {
|
||||||
|
return panelWindow.height - panelHeight - (Style.marginS * scaling)
|
||||||
|
}
|
||||||
|
else if (panelAnchorTop) {
|
||||||
|
return (Style.marginS * scaling)
|
||||||
|
}
|
||||||
|
else if (panelAnchorBottom) {
|
||||||
|
panelWindow.height - panelHeight - (Style.marginS * scaling)
|
||||||
|
}
|
||||||
|
else if (!barAtBottom) {
|
||||||
|
// Below the top bar
|
||||||
|
return Style.marginS * scaling
|
||||||
|
} else {
|
||||||
|
// Above the bottom bar
|
||||||
|
return panelWindow.height - panelHeight - (Style.marginS * scaling)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
x: calculatedX
|
|
||||||
y: calculatedY
|
|
||||||
|
|
||||||
scale: root.scaleValue
|
|
||||||
opacity: root.opacityValue
|
|
||||||
|
|
||||||
// Animate in when component is completed
|
// Animate in when component is completed
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
root.scaleValue = 1.0
|
root.scaleValue = 1.0
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue