aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop-unified/src-desktop/src-qml/NativeWindow.qml
blob: 2150e37cd1609c0ae8130044e7f9fe936c9bc4f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
// vi: ft=qml
import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3

import Lumina.Backend.NativeWindowObject 2.0
import Lumina.Backend.RootDesktopObject 2.0

Rectangle {
  property NativeWindowObject object
  property string window_id

  SystemPalette { id:palette }

  id: windowFrame
  border.width: 5
  border.color: palette.highlight
  radius: 5
  color: "transparent" //palette.window 
  x: object.frameGeometry.x
  y: object.frameGeometry.y
  width: object.frameGeometry.width
  height: object.frameGeometry.height

  onXChanged: {
    windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height)
  }
  onYChanged: {
    windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height)
  }

  MouseArea {
    id: resizeArea
    anchors.fill: parent
    drag.target: undefined
    property int resizeDirection: NativeWindowObject.TOP_LEFT
    property int positionX: -1
    property int positionY: -1

    onPressed: {
      //NOTE: This is only triggered for resize events
      var globalP = windowFrame.mapToItem(rootCanvas, mouse.x, mouse.y)
      positionX = globalP.x
      positionY = globalP.y
      if(positionY <= windowFrame.y + 10 ) {
        if(positionX <= windowFrame.x + 10)
          resizeDirection = NativeWindowObject.TOP_LEFT
        else if(positionX >= windowFrame.x + windowFrame.width - 10)
          resizeDirection = NativeWindowObject.TOP_RIGHT
        else
          resizeDirection = NativeWindowObject.TOP
      }else if(positionY >= windowFrame.y + windowFrame.height - 10) {
        if(positionX <= windowFrame.x + 10)
          resizeDirection = NativeWindowObject.BOTTOM_LEFT
        else if(positionX >= windowFrame.x + windowFrame.width - 10)
          resizeDirection = NativeWindowObject.BOTTOM_RIGHT
        else
          resizeDirection = NativeWindowObject.BOTTOM
      }else if(positionX <= windowFrame.x + 10) {
        resizeDirection = NativeWindowObject.LEFT
      }else if(positionX >= windowFrame.x + windowFrame.width - 10) {
        resizeDirection = NativeWindowObject.RIGHT
      }
      //console.log("Initial X: ", positionX, "Initial Y: ", positionY);
      //console.log("Initial X Frame: ", windowFrame.x, "Initial Y Frame: ", windowFrame.y);
    }

    onReleased: {
      positionX = -1
      positionY = -1
      //windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height)
    }

    onPositionChanged: {
      //NOTE: This is only triggered for resize events
      if(positionX != -1 && positionY != -1) {
        var globalP = windowFrame.mapToItem(rootCanvas, mouse.x, mouse.y)
        /*console.log("Global P: ", globalP);
        console.log("Position X: ", positionX, "Position Y: ", positionY)
        console.log("Old Position : ", windowFrame.x, " , ", windowFrame.y)
        console.log(resizeDirection);*/
        if(resizeDirection == NativeWindowObject.TOP_LEFT) {
          windowFrame.height -= globalP.y - positionY
          windowFrame.width -= globalP.x - positionX
          windowFrame.y = globalP.y
          windowFrame.x = globalP.x
        }else if(resizeDirection == NativeWindowObject.TOP_RIGHT) {
          //console.log("TOP RIGHT Old Height: ", windowFrame.height, "Old Width: ", windowFrame.width)
          windowFrame.height -= globalP.y - positionY
          windowFrame.width += globalP.x - positionX
          //console.log("New Height: ", windowFrame.height, "New Width: ", windowFrame.width)
          windowFrame.y = globalP.y
          //console.log("New Position : ", windowFrame.x, " , ", windowFrame.y)
        }else if(resizeDirection == NativeWindowObject.TOP) {
          windowFrame.height -= globalP.y - positionY
          windowFrame.y = globalP.y
        } else if(resizeDirection == NativeWindowObject.RIGHT) {
          windowFrame.width += globalP.x - positionX
        } else if(resizeDirection == NativeWindowObject.BOTTOM_RIGHT) {
          windowFrame.height += globalP.y - positionY
          windowFrame.width += globalP.x - positionX
        } else if(resizeDirection == NativeWindowObject.BOTTOM) {
          windowFrame.height += globalP.y - positionY
        } else if(resizeDirection == NativeWindowObject.BOTTOM_LEFT) {
          windowFrame.width -= globalP.x - positionX
          windowFrame.height += globalP.y - positionY
          windowFrame.x = globalP.x
        } else if(resizeDirection == NativeWindowObject.LEFT) {
          windowFrame.width -= globalP.x - positionX
          windowFrame.x = globalP.x
        }
        //Set a miniumum width and height as 80x50
        if(windowFrame.width < 80) {
          windowFrame.width = 80 
        }
        if(windowFrame.height < 50) {
          windowFrame.height = 50 
        }
        positionY = globalP.y
        positionX = globalP.x
      }
      windowFrame.object.updateGeometry(windowFrame.x, windowFrame.y, windowFrame.width, windowFrame.height)
    }
  }

  Rectangle {
    id: titleBar
    border.width: 0
    color: palette.window
    height: 25
    anchors.top: windowFrame.top
    anchors.right: windowFrame.right
    anchors.left: windowFrame.left
    anchors.margins: windowFrame.border.width
    width: parent.width

    MouseArea {
      id: dragArea
      anchors.fill: parent
      drag.target: windowFrame
      drag.axis: Drag.XAndYAxis
      //acceptedButtons: Qt.RightButton
      //onClicked: contextMenu.open()
      //released: { function(); }
    }

    ToolButton {
      id: otherButton
      anchors.left: parent.left
      height: parent.height
      iconSource: windowFrame.object.icon
    }

    Text {
      anchors.horizontalCenter: parent.horizontalCenter
      anchors.verticalCenter: parent.verticalCenter
      color: palette.windowText
      text: windowFrame.object.shortTitle
      fontSizeMode: Text.Fit
    }

    RowLayout {
      spacing: 0
      anchors.right: parent.right
      height: parent.height

      ToolButton {
        id: minButton
        Layout.fillHeight: true
        iconName: "window-minimize"
        onClicked: { windowFrame.object.toggleVisibility() }
      }

      ToolButton {
        id: maxButton
        Layout.fillHeight: true
        iconName: "window-maximize"
        //onClicked: { windowFrame.object.toggleMaximize() }
      }

      ToolButton {
        id: closeButton
        Layout.fillHeight: true
        iconName: "document-close"
        onClicked: { windowFrame.object.requestClose() }
      }
    }
  }

  Image {
    id: frameContents
    cache: false
    source: windowFrame.object.winImage
    anchors.top: titleBar.bottom
    anchors.bottom: parent.bottom
    anchors.left: windowFrame.left
    anchors.right: windowFrame.right
    anchors.leftMargin: windowFrame.border.width
    anchors.rightMargin: windowFrame.border.width
    anchors.bottomMargin: windowFrame.border.width
    width: parent.width
    height: parent.height

    MouseArea { 
      width: parent.width
      height: parent.height
      anchors.fill: frameContents
      onClicked: { console.log(parent.mapToGlobal(mouse.x, mouse.y)); }
    }
  }
}
bgstack15