├── qtquickcontrols2.conf ├── Assets ├── Icons │ ├── home.png │ ├── sett.png │ ├── usb.png │ ├── homes.png │ ├── update.png │ ├── backhome.png │ ├── battery.png │ ├── bluetoot.png │ ├── bluetooth.png │ ├── download.png │ ├── greyHome.png │ ├── settings.png │ ├── icons8-info-50.png │ ├── icons8-ok-30.png │ ├── icons8-plus-48.png │ ├── icons8-plus-50.png │ ├── icons8-refresh-30.png │ └── icons8-cloud-cross-24.png ├── Images │ ├── dongle.png │ ├── speaker.png │ ├── 18362309891600040225-512.png │ └── Microsoft_Teams-Logo.wine.png └── ScreenShots │ ├── jabra1.png │ ├── jabra2.png │ ├── jabra3.png │ ├── jabra4.png │ ├── jabra5.png │ ├── jabra6.png │ └── jabra7.png ├── Components ├── CStackView.qml ├── ResponsiveLayout.qml ├── CCheckBox.qml ├── CButton.qml ├── IconButton.qml ├── IconWithTitle.qml └── SideBarButtons.qml ├── main.qml ├── main.cpp ├── Connect.pro ├── Models ├── NotConnectedModel.qml ├── ConnectModel.qml └── ConnectDelegate.qml ├── README.md ├── qml.qrc ├── Screens ├── Blutooth.qml ├── Home.qml ├── Settings.qml └── Update.qml ├── Connect.pro.user └── LICENSE /qtquickcontrols2.conf: -------------------------------------------------------------------------------- 1 | [Controls] 2 | Style=Material 3 | [Material] 4 | Theme=Dark 5 | Accent=Red 6 | Primary=#313a41 7 | -------------------------------------------------------------------------------- /Assets/Icons/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/home.png -------------------------------------------------------------------------------- /Assets/Icons/sett.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/sett.png -------------------------------------------------------------------------------- /Assets/Icons/usb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/usb.png -------------------------------------------------------------------------------- /Assets/Icons/homes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/homes.png -------------------------------------------------------------------------------- /Assets/Icons/update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/update.png -------------------------------------------------------------------------------- /Assets/Icons/backhome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/backhome.png -------------------------------------------------------------------------------- /Assets/Icons/battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/battery.png -------------------------------------------------------------------------------- /Assets/Icons/bluetoot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/bluetoot.png -------------------------------------------------------------------------------- /Assets/Icons/bluetooth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/bluetooth.png -------------------------------------------------------------------------------- /Assets/Icons/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/download.png -------------------------------------------------------------------------------- /Assets/Icons/greyHome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/greyHome.png -------------------------------------------------------------------------------- /Assets/Icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/settings.png -------------------------------------------------------------------------------- /Assets/Images/dongle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Images/dongle.png -------------------------------------------------------------------------------- /Assets/Images/speaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Images/speaker.png -------------------------------------------------------------------------------- /Assets/Icons/icons8-info-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/icons8-info-50.png -------------------------------------------------------------------------------- /Assets/Icons/icons8-ok-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/icons8-ok-30.png -------------------------------------------------------------------------------- /Assets/Icons/icons8-plus-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/icons8-plus-48.png -------------------------------------------------------------------------------- /Assets/Icons/icons8-plus-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/icons8-plus-50.png -------------------------------------------------------------------------------- /Assets/ScreenShots/jabra1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/ScreenShots/jabra1.png -------------------------------------------------------------------------------- /Assets/ScreenShots/jabra2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/ScreenShots/jabra2.png -------------------------------------------------------------------------------- /Assets/ScreenShots/jabra3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/ScreenShots/jabra3.png -------------------------------------------------------------------------------- /Assets/ScreenShots/jabra4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/ScreenShots/jabra4.png -------------------------------------------------------------------------------- /Assets/ScreenShots/jabra5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/ScreenShots/jabra5.png -------------------------------------------------------------------------------- /Assets/ScreenShots/jabra6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/ScreenShots/jabra6.png -------------------------------------------------------------------------------- /Assets/ScreenShots/jabra7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/ScreenShots/jabra7.png -------------------------------------------------------------------------------- /Assets/Icons/icons8-refresh-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/icons8-refresh-30.png -------------------------------------------------------------------------------- /Assets/Icons/icons8-cloud-cross-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Icons/icons8-cloud-cross-24.png -------------------------------------------------------------------------------- /Assets/Images/18362309891600040225-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Images/18362309891600040225-512.png -------------------------------------------------------------------------------- /Assets/Images/Microsoft_Teams-Logo.wine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yasir-shahzad/Qt-QML-Jabra-Speaker-Connect-Project/HEAD/Assets/Images/Microsoft_Teams-Logo.wine.png -------------------------------------------------------------------------------- /Components/CStackView.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 2.5 3 | import "../Components" 4 | StackView{ 5 | id:stackView 6 | initialItem: "qrc:/Screens/Home.qml" 7 | } 8 | -------------------------------------------------------------------------------- /main.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.15 2 | import QtQuick.Window 2.15 3 | import QtQuick.Controls 2.5 4 | import QtQuick.Layouts 1.3 5 | import QtQuick.Controls.Material 2.4 6 | import "./Components" 7 | ApplicationWindow { 8 | id: window 9 | width: 1200 10 | height: 700 11 | visible: true 12 | title: qsTr("Jabra Connect") 13 | property color homeColor: "#313a41" 14 | //color: homeColor 15 | Loader{ 16 | anchors.fill: parent 17 | sourceComponent: resLayout 18 | } 19 | Component{ 20 | id:resLayout 21 | ResponsiveLayout{ 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 8 | QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 9 | #endif 10 | QGuiApplication app(argc, argv); 11 | 12 | QQmlApplicationEngine engine; 13 | const QUrl url(QStringLiteral("qrc:/main.qml")); 14 | QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, 15 | &app, [url](QObject *obj, const QUrl &objUrl) { 16 | if (!obj && url == objUrl) 17 | QCoreApplication::exit(-1); 18 | }, Qt::QueuedConnection); 19 | engine.load(url); 20 | 21 | return app.exec(); 22 | } 23 | -------------------------------------------------------------------------------- /Connect.pro: -------------------------------------------------------------------------------- 1 | QT += quick 2 | 3 | # You can make your code fail to compile if it uses deprecated APIs. 4 | # In order to do so, uncomment the following line. 5 | #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 6 | 7 | SOURCES += \ 8 | main.cpp 9 | 10 | RESOURCES += qml.qrc 11 | 12 | # Additional import path used to resolve QML modules in Qt Creator's code model 13 | QML_IMPORT_PATH = 14 | 15 | # Additional import path used to resolve QML modules just for Qt Quick Designer 16 | QML_DESIGNER_IMPORT_PATH = 17 | 18 | # Default rules for deployment. 19 | qnx: target.path = /tmp/$${TARGET}/bin 20 | else: unix:!android: target.path = /opt/$${TARGET}/bin 21 | !isEmpty(target.path): INSTALLS += target 22 | -------------------------------------------------------------------------------- /Components/ResponsiveLayout.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 2.5 3 | import QtQuick.Layouts 1.3 4 | Item { 5 | anchors.fill: parent 6 | RowLayout{ 7 | spacing: 0 8 | anchors.fill: parent 9 | Rectangle{ 10 | Layout.preferredWidth: parent.width / 9 11 | Layout.fillHeight: true 12 | color: homeColor 13 | SideBarButtons{ 14 | id:sideBar 15 | width: parent.width*0.7 16 | height: parent.height*0.7 17 | radius: 6 18 | anchors.centerIn: parent 19 | } 20 | } 21 | CStackView{ 22 | id:mainStackView 23 | Layout.fillWidth: true 24 | Layout.fillHeight: true 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Models/NotConnectedModel.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.11 2 | 3 | // Populate the model with some sample data. 4 | ListModel { 5 | ListElement { 6 | activated: true 7 | speakerName:"Jabra Speaker 210" 8 | label: "Not Paired" 9 | pressColor:"#ef4948" 10 | normalColor:"#4990e2" 11 | icon:"qrc:/Assets/Images/speaker.png" 12 | connectedIcon:"qrc:/Assets/Icons/icons8-cloud-cross-24.png" 13 | buttonStatus:"Pair" 14 | } 15 | // ListElement { 16 | // activated: true 17 | // speakerName:"Jebra Speaker" 18 | // label: "Not Connected" 19 | // pressColor:"#ef4948" 20 | // normalColor:"#4990e2" 21 | // icon:"qrc:/Assets/Images/speaker.png" 22 | // connectedIcon:"qrc:/Assets/Icons/icons8-cloud-cross-24.png" 23 | // } 24 | } 25 | -------------------------------------------------------------------------------- /Models/ConnectModel.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.11 2 | 3 | // Populate the model with some sample data. 4 | ListModel { 5 | ListElement { 6 | activated: true 7 | speakerName:"Jabra CalmTalk" 8 | label: "Paired Device" 9 | pressColor:"#ef4948" 10 | normalColor:"#4990e2" 11 | icon:"qrc:/Assets/Images/speaker.png" 12 | connectedIcon:"qrc:/Assets/Icons/icons8-ok-30.png" 13 | buttonStatus:"Disconnect" 14 | } 15 | ListElement { 16 | activated: true 17 | speakerName:"Jebra Speaker" 18 | label: "Not Connected" 19 | pressColor:"#ef4948" 20 | normalColor:"#4990e2" 21 | icon:"qrc:/Assets/Images/speaker.png" 22 | connectedIcon:"qrc:/Assets/Icons/icons8-cloud-cross-24.png" 23 | buttonStatus:"Connect" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Components/CCheckBox.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 2.0 3 | 4 | Switch { 5 | id: root 6 | property color checkedColor: "#0ACF97" 7 | 8 | indicator: Rectangle { 9 | width: 54 10 | height: 34 11 | radius: height / 2 12 | color: root.checked ? checkedColor : "white" 13 | border.width: 2 14 | border.color: root.checked ? checkedColor : "#E5E5E5" 15 | 16 | Rectangle { 17 | x: root.checked ? parent.width - width - 2 : 1 18 | width: root.checked ? parent.height - 4 : parent.height - 2 19 | height: width 20 | radius: width / 2 21 | anchors.verticalCenter: parent.verticalCenter 22 | color: "white" 23 | border.color: "#D5D5D5" 24 | 25 | Behavior on x { 26 | NumberAnimation { duration: 200 } 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Jabra-Speaker-Connect-Project 2 | Jabra Speaker Connect Project 3 | 4 | ## Design screen 5 | ![alt text](https://github.com/cppqtdev/Jabra-Speaker-Connect-Project/blob/main/Assets/ScreenShots/jabra1.png?raw=true) 6 | 7 | ## Projects screen 8 | 9 | ## Projects screen 1 10 | ![alt text](https://github.com/cppqtdev/Jabra-Speaker-Connect-Project/blob/main/Assets/ScreenShots/jabra2.png?raw=true) 11 | ## Projects screen 2 12 | ![alt text](https://github.com/cppqtdev/Jabra-Speaker-Connect-Project/blob/main/Assets/ScreenShots/jabra3.png?raw=true) 13 | 14 | ## Projects screen 3 15 | ![alt text](https://github.com/cppqtdev/Jabra-Speaker-Connect-Project/blob/main/Assets/ScreenShots/jabra4.png?raw=true) 16 | ## Projects screen 4 17 | ![alt text](https://github.com/cppqtdev/Jabra-Speaker-Connect-Project/blob/main/Assets/ScreenShots/jabra5.png?raw=true) 18 | 19 | ## Projects screen 5 20 | ![alt text](https://github.com/cppqtdev/Jabra-Speaker-Connect-Project/blob/main/Assets/ScreenShots/jabra6.png?raw=true) 21 | ## Projects screen 6 22 | ![alt text](https://github.com/cppqtdev/Jabra-Speaker-Connect-Project/blob/main/Assets/ScreenShots/jabra7.png?raw=true) 23 | 24 | -------------------------------------------------------------------------------- /qml.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | main.qml 4 | Components/CButton.qml 5 | Components/IconWithTitle.qml 6 | Screens/Home.qml 7 | Screens/Blutooth.qml 8 | Screens/Update.qml 9 | Screens/Settings.qml 10 | Components/CStackView.qml 11 | Components/SideBarButtons.qml 12 | Components/ResponsiveLayout.qml 13 | Assets/Icons/bluetooth.png 14 | Assets/Icons/home.png 15 | Assets/Icons/settings.png 16 | Assets/Icons/update.png 17 | Assets/Images/dongle.png 18 | Assets/Images/speaker.png 19 | Assets/Icons/battery.png 20 | Assets/Icons/bluetoot.png 21 | Assets/Icons/usb.png 22 | Assets/Icons/download.png 23 | Assets/Icons/homes.png 24 | Assets/Icons/sett.png 25 | Models/ConnectModel.qml 26 | Models/ConnectDelegate.qml 27 | qtquickcontrols2.conf 28 | Assets/Icons/icons8-cloud-cross-24.png 29 | Assets/Icons/icons8-ok-30.png 30 | Models/NotConnectedModel.qml 31 | Assets/Icons/icons8-refresh-30.png 32 | Components/IconButton.qml 33 | Assets/Icons/greyHome.png 34 | Assets/Icons/backhome.png 35 | Assets/Icons/icons8-info-50.png 36 | Components/CCheckBox.qml 37 | Assets/Icons/icons8-plus-50.png 38 | Assets/Icons/icons8-plus-48.png 39 | Assets/Images/18362309891600040225-512.png 40 | Assets/Images/Microsoft_Teams-Logo.wine.png 41 | 42 | 43 | -------------------------------------------------------------------------------- /Models/ConnectDelegate.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.11 2 | import QtQuick.Controls 2.4 3 | import QtQuick.Controls.Material 2.4 4 | import QtQuick.Layouts 1.11 5 | import QtQuick.Window 2.11 6 | import "../Components" 7 | ItemDelegate { 8 | id: root 9 | width: parent.width 10 | height: 100 11 | checkable: true 12 | hoverEnabled: false 13 | 14 | onClicked: ListView.view.currentIndex = index 15 | Rectangle{ 16 | radius: 8 17 | color: "#373e44" 18 | anchors.fill: parent 19 | border.width:1 20 | border.color : "#444b51" 21 | ColumnLayout { 22 | anchors.fill: parent 23 | RowLayout { 24 | RowLayout{ 25 | id: dateColumn 26 | Image{ 27 | id:speakerLogo 28 | source:model.icon 29 | sourceSize: Qt.size(100,100) 30 | } 31 | 32 | ColumnLayout { 33 | Label { 34 | id: timeLabel 35 | font.pixelSize: Qt.application.font.pixelSize * 1.5 36 | text:model.speakerName 37 | } 38 | RowLayout { 39 | Image{ 40 | source: model.connectedIcon 41 | sourceSize: Qt.size(20,20) 42 | Layout.alignment: Qt.AlignVCenter 43 | } 44 | 45 | Label { 46 | id: alarmAbout 47 | font.pixelSize: 12 48 | font.bold: true 49 | text: model.label 50 | } 51 | } 52 | } 53 | } 54 | Item { 55 | Layout.fillWidth: true 56 | } 57 | CButton{ 58 | id:connectButton 59 | property string connectColor: model.normalColor 60 | color:connectColor 61 | borderColor:connectColor 62 | pressColor: connectColor 63 | hoverColor: connectColor 64 | borderRadius: 18 65 | width: 150 66 | height: 40 67 | innerText.color: "White" 68 | fontSize: 14 69 | buttonText:model.buttonStatus 70 | Layout.alignment: Qt.AlignVCenter 71 | Layout.rightMargin: 10 72 | onClicked: { 73 | connectColor = model.pressColor 74 | buttonText = "Disconnect" 75 | } 76 | } 77 | } 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /Components/CButton.qml: -------------------------------------------------------------------------------- 1 | //Import the declarative plugins 2 | import QtQuick 2.0 3 | 4 | //Implementation of the Button control. 5 | Item { 6 | id: button 7 | width: 30 8 | height: 30 9 | property alias buttonText: innerText.text; 10 | property alias innerText: innerText 11 | property color color: "white" 12 | property color hoverColor: "#aaaaaa" 13 | property color pressColor: "slategray" 14 | property color borderColor: "white" 15 | property string sourceIcon: "" 16 | property int fontSize: 10 17 | property int borderWidth: 1 18 | property int borderRadius: 2 19 | property int iconWidth: 20 20 | property int iconHeight: 20 21 | scale: state === "Pressed" ? 1.2 : 1.0 22 | onEnabledChanged: state = "" 23 | signal clicked 24 | 25 | //define a scale animation 26 | Behavior on scale { 27 | NumberAnimation { 28 | duration: 100 29 | easing.type: Easing.InOutQuad 30 | } 31 | } 32 | 33 | //Rectangle to draw the button 34 | Rectangle { 35 | id: rectangleButton 36 | anchors.fill: parent 37 | radius: borderRadius 38 | color: button.enabled ? button.color : "grey" 39 | border.width: borderWidth 40 | border.color:borderColor 41 | Image{ 42 | source:sourceIcon 43 | sourceSize: Qt.size(iconWidth,iconHeight) 44 | anchors.centerIn: parent 45 | } 46 | 47 | Text { 48 | id: innerText 49 | font.pointSize: fontSize 50 | anchors.centerIn: parent 51 | } 52 | } 53 | 54 | //change the color of the button in differen button states 55 | states: [ 56 | State { 57 | name: "Hovering" 58 | PropertyChanges { 59 | target: rectangleButton 60 | color: hoverColor 61 | border.color:hoverColor 62 | } 63 | }, 64 | State { 65 | name: "Pressed" 66 | PropertyChanges { 67 | target: rectangleButton 68 | color: pressColor 69 | border.color: pressColor 70 | } 71 | } 72 | ] 73 | 74 | //define transmission for the states 75 | transitions: [ 76 | Transition { 77 | from: ""; to: "Hovering" 78 | ColorAnimation { duration: 200 } 79 | }, 80 | Transition { 81 | from: "*"; to: "Pressed" 82 | ColorAnimation { duration: 10 } 83 | } 84 | ] 85 | 86 | //Mouse area to react on click events 87 | MouseArea { 88 | hoverEnabled: true 89 | anchors.fill: button 90 | onEntered: { button.state='Hovering'} 91 | onExited: { button.state=''} 92 | onClicked: { button.clicked();} 93 | onPressed: { button.state="Pressed" } 94 | onReleased: { 95 | if (containsMouse) 96 | button.state="Hovering"; 97 | else 98 | button.state=""; 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /Components/IconButton.qml: -------------------------------------------------------------------------------- 1 | //Import the declarative plugins 2 | import QtQuick 2.0 3 | import QtQuick.Layouts 1.3 4 | //Implementation of the Button control. 5 | Item { 6 | id: button 7 | width: 30 8 | height: 30 9 | property alias buttonText: innerText.text; 10 | property alias innerText: innerText 11 | property color color: "white" 12 | property color hoverColor: "#aaaaaa" 13 | property color pressColor: "slategray" 14 | property color borderColor: "white" 15 | property string sourceIcon: "" 16 | property int fontSize: 10 17 | property int borderWidth: 1 18 | property int borderRadius: 2 19 | property int iconWidth: 20 20 | property int iconHeight: 20 21 | scale: state === "Pressed" ? 1.2 : 1.0 22 | onEnabledChanged: state = "" 23 | signal clicked 24 | 25 | //define a scale animation 26 | Behavior on scale { 27 | NumberAnimation { 28 | duration: 100 29 | easing.type: Easing.InOutQuad 30 | } 31 | } 32 | 33 | //Rectangle to draw the button 34 | Rectangle { 35 | id: rectangleButton 36 | anchors.fill: parent 37 | radius: borderRadius 38 | color: button.enabled ? button.color : "grey" 39 | border.width: borderWidth 40 | border.color:borderColor 41 | RowLayout{ 42 | anchors.centerIn: parent 43 | spacing: 5 44 | Image{ 45 | source:sourceIcon 46 | sourceSize: Qt.size(iconWidth,iconHeight) 47 | Layout.alignment: Qt.AlignVCenter 48 | } 49 | 50 | Text { 51 | id: innerText 52 | font.pointSize: fontSize 53 | Layout.alignment: Qt.AlignVCenter 54 | } 55 | } 56 | } 57 | 58 | //change the color of the button in differen button states 59 | states: [ 60 | State { 61 | name: "Hovering" 62 | PropertyChanges { 63 | target: rectangleButton 64 | color: hoverColor 65 | border.color:hoverColor 66 | } 67 | }, 68 | State { 69 | name: "Pressed" 70 | PropertyChanges { 71 | target: rectangleButton 72 | color: pressColor 73 | border.color: pressColor 74 | } 75 | } 76 | ] 77 | 78 | //define transmission for the states 79 | transitions: [ 80 | Transition { 81 | from: ""; to: "Hovering" 82 | ColorAnimation { duration: 200 } 83 | }, 84 | Transition { 85 | from: "*"; to: "Pressed" 86 | ColorAnimation { duration: 10 } 87 | } 88 | ] 89 | 90 | //Mouse area to react on click events 91 | MouseArea { 92 | hoverEnabled: true 93 | anchors.fill: button 94 | onEntered: { button.state='Hovering'} 95 | onExited: { button.state=''} 96 | onClicked: { button.clicked();} 97 | onPressed: { button.state="Pressed" } 98 | onReleased: { 99 | if (containsMouse) 100 | button.state="Hovering"; 101 | else 102 | button.state=""; 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /Components/IconWithTitle.qml: -------------------------------------------------------------------------------- 1 | //Import the declarative plugins 2 | import QtQuick 2.0 3 | import QtQuick.Layouts 1.3 4 | //Implementation of the Button control. 5 | Item { 6 | id: button 7 | width: 30 8 | height: 30 9 | property alias buttonText: innerText.text; 10 | property alias innerTextLabel: innerText 11 | property color color: "white" 12 | property color hoverColor: "#aaaaaa" 13 | property color pressColor: "slategray" 14 | property color borderColor: "white" 15 | property string sourceIcon: "" 16 | property int fontSize: 10 17 | property int borderWidth: 1 18 | property int borderRadius: 2 19 | property int iconWidth: 10 20 | property int iconHeight: 10 21 | scale: state === "Pressed" ? 1.1 : 1.0 22 | onEnabledChanged: state = "" 23 | signal clicked 24 | 25 | //define a scale animation 26 | Behavior on scale { 27 | NumberAnimation { 28 | duration: 100 29 | easing.type: Easing.InOutQuad 30 | } 31 | } 32 | 33 | //Rectangle to draw the button 34 | Rectangle { 35 | id: rectangleButton 36 | anchors.fill: parent 37 | radius: borderRadius 38 | color: button.enabled ? button.color : "grey" 39 | border.width: borderWidth 40 | border.color:borderColor 41 | ColumnLayout{ 42 | anchors.centerIn: parent 43 | spacing: 5 44 | Image{ 45 | source:sourceIcon 46 | sourceSize: Qt.size(iconWidth,iconHeight) 47 | Layout.alignment: Qt.AlignHCenter 48 | } 49 | 50 | Text { 51 | id: innerText 52 | font.pointSize: fontSize 53 | Layout.alignment: Qt.AlignHCenter 54 | } 55 | } 56 | } 57 | 58 | //change the color of the button in differen button states 59 | states: [ 60 | State { 61 | name: "Hovering" 62 | PropertyChanges { 63 | target: rectangleButton 64 | color: hoverColor 65 | border.color:hoverColor 66 | } 67 | }, 68 | State { 69 | name: "Pressed" 70 | PropertyChanges { 71 | target: rectangleButton 72 | color: pressColor 73 | border.color: pressColor 74 | } 75 | } 76 | ] 77 | 78 | //define transmission for the states 79 | transitions: [ 80 | Transition { 81 | from: ""; to: "Hovering" 82 | ColorAnimation { duration: 200 } 83 | }, 84 | Transition { 85 | from: "*"; to: "Pressed" 86 | ColorAnimation { duration: 10 } 87 | } 88 | ] 89 | 90 | //Mouse area to react on click events 91 | MouseArea { 92 | hoverEnabled: true 93 | anchors.fill: button 94 | onEntered: { button.state='Hovering'} 95 | onExited: { button.state=''} 96 | onClicked: { button.clicked();} 97 | onPressed: { button.state="Pressed" } 98 | onReleased: { 99 | if (containsMouse) 100 | button.state="Hovering"; 101 | else 102 | button.state=""; 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /Components/SideBarButtons.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 2.5 3 | import QtQuick.Layouts 1.3 4 | Rectangle{ 5 | property color buttonColor: "#373e44" 6 | property color textColor: "#EBEBEB" 7 | property color hightLighted: "#4990e2" 8 | property color home: hightLighted 9 | property color bluetooth:buttonColor 10 | property color updateColor: buttonColor 11 | property color settings: buttonColor 12 | color: buttonColor 13 | radius: 10 14 | ColumnLayout{ 15 | anchors.fill: parent 16 | spacing: 0 17 | IconWithTitle{ 18 | Layout.fillHeight: true 19 | Layout.fillWidth: true 20 | buttonText: qsTr("Home") 21 | color: home 22 | hoverColor: home 23 | borderColor: home 24 | pressColor: home 25 | innerTextLabel.color: textColor 26 | fontSize: 12 27 | sourceIcon: "qrc:/Assets/Icons/backhome.png" 28 | iconWidth: 30 29 | iconHeight: 30 30 | borderRadius: 10 31 | onClicked: { 32 | mainStackView.replace("qrc:/Screens/Home.qml") 33 | home=hightLighted 34 | bluetooth=buttonColor 35 | updateColor=buttonColor 36 | settings=buttonColor 37 | } 38 | } 39 | IconWithTitle{ 40 | Layout.fillHeight: true 41 | Layout.fillWidth: true 42 | buttonText: qsTr("Bluetooth") 43 | color: bluetooth 44 | hoverColor: bluetooth 45 | borderColor: bluetooth 46 | pressColor: bluetooth 47 | innerTextLabel.color: textColor 48 | fontSize: 12 49 | sourceIcon: "qrc:/Assets/Icons/bluetoot.png" 50 | iconWidth: 30 51 | iconHeight: 30 52 | onClicked: { 53 | mainStackView.replace("qrc:/Screens/Blutooth.qml") 54 | home=buttonColor 55 | bluetooth=hightLighted 56 | updateColor=buttonColor 57 | settings=buttonColor 58 | } 59 | } 60 | IconWithTitle{ 61 | Layout.fillHeight: true 62 | Layout.fillWidth: true 63 | buttonText: qsTr("Update") 64 | color: updateColor 65 | hoverColor: updateColor 66 | borderColor: updateColor 67 | pressColor: updateColor 68 | innerTextLabel.color: textColor 69 | fontSize: 12 70 | sourceIcon: "qrc:/Assets/Icons/download.png" 71 | iconWidth: 30 72 | iconHeight: 30 73 | onClicked: { 74 | mainStackView.replace("qrc:/Screens/Update.qml") 75 | home=buttonColor 76 | bluetooth=buttonColor 77 | updateColor=hightLighted 78 | settings=buttonColor 79 | } 80 | 81 | } 82 | IconWithTitle{ 83 | Layout.fillHeight: true 84 | Layout.fillWidth: true 85 | buttonText: qsTr("Settings") 86 | color: settings 87 | hoverColor: settings 88 | borderColor: settings 89 | pressColor: settings 90 | innerTextLabel.color: textColor 91 | fontSize: 12 92 | sourceIcon: "qrc:/Assets/Icons/sett.png" 93 | iconWidth: 30 94 | iconHeight: 30 95 | borderRadius: 10 96 | onClicked: { 97 | mainStackView.replace("qrc:/Screens/Settings.qml") 98 | home=buttonColor 99 | bluetooth=buttonColor 100 | updateColor=buttonColor 101 | settings=hightLighted 102 | } 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /Screens/Blutooth.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.15 2 | import QtQuick.Controls 2.1 3 | import QtQuick.Layouts 1.3 4 | import "../Models" 5 | import "../Components" 6 | Page { 7 | Rectangle{ 8 | anchors.fill: parent 9 | color: homeColor 10 | } 11 | ColumnLayout{ 12 | anchors.fill: parent 13 | anchors.rightMargin: 10 14 | spacing: 0 15 | Rectangle{ 16 | Layout.fillWidth: true 17 | Layout.preferredHeight: 150 18 | color: homeColor 19 | Label { 20 | id: label 21 | font.pixelSize: Qt.application.font.pixelSize * 3 22 | text:qsTr("Bluetooth") 23 | y:20 24 | anchors{ 25 | topMargin: 50 26 | left: parent.left 27 | } 28 | } 29 | Rectangle{ 30 | id:line 31 | width: parent.width*0.99 32 | height: 2 33 | color: "#444b51" 34 | anchors{ 35 | top:label.bottom 36 | topMargin: 10 37 | } 38 | 39 | } 40 | 41 | Label { 42 | font.pixelSize: Qt.application.font.pixelSize*1.2 43 | text:qsTr("Connected") 44 | anchors{ 45 | top: line.bottom 46 | topMargin: 20 47 | } 48 | } 49 | } 50 | 51 | ListView { 52 | spacing:20 53 | clip: true 54 | Layout.fillHeight: true 55 | Layout.fillWidth: true 56 | model: ConnectModel {} 57 | delegate: ConnectDelegate {} 58 | flickableDirection: Flickable.VerticalFlick 59 | boundsBehavior: Flickable.StopAtBounds 60 | ScrollBar.vertical: ScrollBar { 61 | visible: false 62 | } 63 | } 64 | Rectangle{ 65 | Layout.fillWidth: true 66 | Layout.preferredHeight: 80 67 | color: homeColor 68 | Rectangle{ 69 | id:line2 70 | width: parent.width*0.99 71 | height: 2 72 | color: "#444b51" 73 | anchors{ 74 | topMargin: 20 75 | } 76 | } 77 | Label { 78 | id:otherLabel 79 | font.pixelSize: Qt.application.font.pixelSize*1.2 80 | text:qsTr("Other Devices Available") 81 | anchors{ 82 | top: line2.bottom 83 | topMargin: 20 84 | } 85 | } 86 | IconButton{ 87 | color:"#444b51" 88 | borderColor:"#444b51" 89 | pressColor: "#444b51" 90 | hoverColor: "#444b51" 91 | borderRadius: 18 92 | width: 120 93 | height: 30 94 | innerText.color: "White" 95 | fontSize: 10 96 | iconWidth: 20 97 | iconHeight: 20 98 | sourceIcon: "qrc:/Assets/Icons/icons8-refresh-30.png" 99 | buttonText: qsTr("Refresh") 100 | anchors{ 101 | verticalCenter: otherLabel.verticalCenter 102 | right: parent.right 103 | rightMargin: 20 104 | } 105 | } 106 | } 107 | 108 | ListView { 109 | spacing:20 110 | clip: true 111 | Layout.fillHeight: true 112 | Layout.fillWidth: true 113 | model: NotConnectedModel {} 114 | delegate: ConnectDelegate {} 115 | flickableDirection: Flickable.VerticalFlick 116 | boundsBehavior: Flickable.StopAtBounds 117 | ScrollBar.vertical: ScrollBar { 118 | visible: false 119 | } 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /Screens/Home.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.15 2 | import QtQuick.Controls 2.5 3 | import "../" 4 | import QtQuick.Layouts 1.3 5 | 6 | Rectangle{ 7 | color: homeColor 8 | property color layerColor: "#373e44" 9 | property color titleColor: "#ffffff" 10 | 11 | RowLayout{ 12 | anchors.centerIn: parent 13 | width: parent.width*0.98 14 | height: parent.height*0.8 15 | spacing: 30 16 | Rectangle{ 17 | id:speakerRec 18 | color: layerColor 19 | Layout.fillHeight: true 20 | Layout.fillWidth: true 21 | visible: true 22 | radius: 12 23 | border.width:2 24 | border.color : "#444b51" 25 | Label{ 26 | text: qsTr("Jabra Speaker") 27 | color:titleColor 28 | font.pixelSize: 32 29 | font.family: "Times New Roman" 30 | anchors{ 31 | left: parent.left 32 | top: parent.top 33 | topMargin: 20 34 | leftMargin: 20 35 | } 36 | 37 | } 38 | 39 | Image { 40 | id: speaker 41 | source: "qrc:/Assets/Images/speaker.png" 42 | anchors.centerIn: parent 43 | sourceSize: Qt.size(speakerRec.width*0.9,speakerRec.height*0.9) 44 | } 45 | Row{ 46 | spacing: 10 47 | anchors{ 48 | right: parent.right 49 | bottom: parent.bottom 50 | bottomMargin: 15 51 | rightMargin: 20 52 | } 53 | 54 | RowLayout{ 55 | spacing: 5 56 | Image{ 57 | source: "qrc:/Assets/Icons/bluetoot.png" 58 | sourceSize: Qt.size(20,20) 59 | } 60 | Label{ 61 | text: qsTr("Bluetooth") 62 | color:titleColor 63 | font.pixelSize: 12 64 | font.bold: true 65 | Layout.alignment: Qt.AlignVCenter 66 | } 67 | } 68 | RowLayout{ 69 | spacing: 5 70 | Image{ 71 | source: "qrc:/Assets/Icons/battery.png" 72 | sourceSize: Qt.size(20,20) 73 | } 74 | Label{ 75 | text: qsTr("75%") 76 | color:titleColor 77 | font.pixelSize: 12 78 | font.bold: true 79 | Layout.alignment: Qt.AlignVCenter 80 | } 81 | } 82 | } 83 | 84 | } 85 | Rectangle{ 86 | color: layerColor 87 | Layout.fillHeight: true 88 | Layout.fillWidth: true 89 | visible: true 90 | radius: 12 91 | border.width:2 92 | border.color : "#444b51" 93 | Label{ 94 | text: qsTr("Jabra Connect Link") 95 | font.family: "Times New Roman" 96 | color:titleColor 97 | font.pixelSize: 32 98 | anchors{ 99 | left: parent.left 100 | top: parent.top 101 | topMargin: 20 102 | leftMargin: 20 103 | } 104 | 105 | } 106 | Image { 107 | id: dongle 108 | source: "qrc:/Assets/Images/dongle.png" 109 | anchors.centerIn: parent 110 | } 111 | RowLayout{ 112 | spacing: 10 113 | anchors{ 114 | right: parent.right 115 | bottom: parent.bottom 116 | bottomMargin: 15 117 | rightMargin: 20 118 | } 119 | RowLayout{ 120 | spacing: 5 121 | Image{ 122 | source: "qrc:/Assets/Icons/usb.png" 123 | sourceSize: Qt.size(20,20) 124 | } 125 | Label{ 126 | text: qsTr("USB") 127 | color:titleColor 128 | font.pixelSize: 12 129 | font.bold: true 130 | Layout.alignment: Qt.AlignVCenter 131 | } 132 | } 133 | } 134 | 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /Screens/Settings.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.15 2 | import QtQuick.Controls 2.1 3 | import QtQuick.Layouts 1.3 4 | import "../Models" 5 | import "../Components" 6 | Item { 7 | Rectangle{ 8 | anchors.fill: parent 9 | color: homeColor 10 | } 11 | ColumnLayout{ 12 | anchors.fill: parent 13 | anchors.rightMargin: 10 14 | spacing: 0 15 | Rectangle{ 16 | Layout.fillWidth: true 17 | Layout.preferredHeight: 150 18 | color: homeColor 19 | Label { 20 | id: label 21 | font.pixelSize: Qt.application.font.pixelSize * 3 22 | text:qsTr("Settings") 23 | y:20 24 | anchors{ 25 | topMargin: 50 26 | left: parent.left 27 | } 28 | } 29 | Rectangle{ 30 | id:line 31 | width: parent.width*0.99 32 | height: 2 33 | color: "#444b51" 34 | anchors{ 35 | top:label.bottom 36 | topMargin: 10 37 | } 38 | 39 | } 40 | 41 | Label { 42 | id:deviceLabel 43 | font.pixelSize: Qt.application.font.pixelSize*1.2 44 | text:qsTr("General Settings") 45 | anchors{ 46 | top: line.bottom 47 | topMargin: 20 48 | } 49 | } 50 | Label { 51 | font.pixelSize: Qt.application.font.pixelSize*0.9 52 | text:qsTr("All devices related settings configuration") 53 | color: "light grey" 54 | font.family: "Times New Roman" 55 | anchors{ 56 | top: deviceLabel.bottom 57 | topMargin: 5 58 | } 59 | } 60 | } 61 | 62 | Rectangle{ 63 | Layout.fillHeight: true 64 | Layout.fillWidth: true 65 | color: homeColor 66 | ColumnLayout{ 67 | anchors{ 68 | top: parent.top 69 | topMargin: 5 70 | horizontalCenter: parent.horizontalCenter 71 | } 72 | spacing: 5 73 | 74 | Label { 75 | font.pixelSize: Qt.application.font.pixelSize*1.2 76 | text:qsTr("Allow Notification") 77 | } 78 | Label { 79 | font.pixelSize: Qt.application.font.pixelSize*0.9 80 | text: qsTr("Allows jabra to send notification about available\nUpdates and other relavant information") 81 | color: "light grey" 82 | } 83 | } 84 | CCheckBox{ 85 | checkedColor: "#228BE6" 86 | checked: true 87 | anchors{ 88 | right: parent.right 89 | rightMargin: 20 90 | } 91 | } 92 | 93 | } 94 | Rectangle{ 95 | Layout.fillHeight: true 96 | Layout.fillWidth: true 97 | color: homeColor 98 | ColumnLayout{ 99 | anchors{ 100 | top: parent.top 101 | topMargin: 5 102 | horizontalCenter: parent.horizontalCenter 103 | } 104 | spacing: 5 105 | 106 | Label { 107 | font.pixelSize: Qt.application.font.pixelSize*1.2 108 | text:qsTr("Enbale Jabra in Tray") 109 | } 110 | Label { 111 | font.pixelSize: Qt.application.font.pixelSize*0.9 112 | text: qsTr("Enable overview and notification from KENT which\nIs accessibile in the notification area") 113 | color: "light grey" 114 | } 115 | } 116 | 117 | CCheckBox{ 118 | checkedColor: "#228BE6" 119 | checked: true 120 | anchors{ 121 | right: parent.right 122 | rightMargin: 20 123 | } 124 | } 125 | 126 | } 127 | Rectangle{ 128 | Layout.fillWidth: true 129 | Layout.preferredHeight: 20 130 | color: homeColor 131 | Rectangle{ 132 | id:line2 133 | width: parent.width*0.99 134 | height: 2 135 | color: "#444b51" 136 | anchors{ 137 | topMargin: 20 138 | } 139 | } 140 | 141 | } 142 | 143 | Rectangle{ 144 | Layout.fillHeight: true 145 | Layout.fillWidth: true 146 | color: homeColor 147 | 148 | Label { 149 | id:otherLabel 150 | font.pixelSize: Qt.application.font.pixelSize*1.2 151 | text:qsTr("Softphone Integration") 152 | anchors{ 153 | left: parent.left 154 | leftMargin: 10 155 | topMargin: 10 156 | } 157 | } 158 | 159 | ColumnLayout{ 160 | id:topLayout 161 | anchors{ 162 | top: parent.top 163 | topMargin: 5 164 | horizontalCenter: parent.horizontalCenter 165 | } 166 | spacing: 20 167 | Column{ 168 | spacing: 5 169 | Label { 170 | font.pixelSize: Qt.application.font.pixelSize*1.2 171 | text:qsTr("Presence Synchronization") 172 | } 173 | Label { 174 | font.pixelSize: Qt.application.font.pixelSize*0.9 175 | text:qsTr("Syncs connected device status soft phone status") 176 | color:"light grey" 177 | } 178 | } 179 | Column{ 180 | spacing: 5 181 | Label { 182 | font.pixelSize: Qt.application.font.pixelSize*1.2 183 | text:qsTr("Preferred Softphone") 184 | } 185 | Label { 186 | font.pixelSize: Qt.application.font.pixelSize*0.9 187 | text:qsTr("Choose a preferred softphone to be used with connected device") 188 | color:"light grey" 189 | } 190 | } 191 | } 192 | ColumnLayout{ 193 | spacing: 20 194 | anchors{ 195 | right: parent.right 196 | rightMargin: 20 197 | top: parent.top 198 | } 199 | CCheckBox{ 200 | id:checkedBox 201 | checkedColor: "#228BE6" 202 | checked: true 203 | Layout.alignment: Qt.AlignRight 204 | } 205 | RowLayout{ 206 | Layout.alignment: Qt.AlignHCenter 207 | spacing: 5 208 | CButton{ 209 | id:addButton 210 | color:"#444b51" 211 | borderColor:"#444b51" 212 | pressColor:"#444b51" 213 | hoverColor:"#444b51" 214 | borderRadius: 18 215 | width: 45 216 | height: 45 217 | iconWidth: 35 218 | iconHeight: 35 219 | sourceIcon:"qrc:/Assets/Images/18362309891600040225-512.png" 220 | 221 | } 222 | CButton{ 223 | color:"#444b51" 224 | borderColor:"#444b51" 225 | pressColor:"#444b51" 226 | hoverColor:"#444b51" 227 | borderRadius: 18 228 | width: 45 229 | height: 45 230 | iconWidth: 50 231 | iconHeight: 50 232 | sourceIcon:"qrc:/Assets/Images/Microsoft_Teams-Logo.wine.png" 233 | 234 | } 235 | CButton{ 236 | color:"#444b51" 237 | borderColor:"#444b51" 238 | pressColor:"#444b51" 239 | hoverColor:"#444b51" 240 | borderRadius: 18 241 | width: 45 242 | height: 45 243 | sourceIcon:"qrc:/Assets/Icons/icons8-plus-48.png" 244 | 245 | } 246 | } 247 | } 248 | 249 | } 250 | } 251 | } 252 | -------------------------------------------------------------------------------- /Screens/Update.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.15 2 | import QtQuick.Controls 2.1 3 | import QtQuick.Layouts 1.3 4 | import "../Models" 5 | import "../Components" 6 | Page { 7 | Rectangle{ 8 | anchors.fill: parent 9 | color: homeColor 10 | } 11 | ColumnLayout{ 12 | anchors.fill: parent 13 | anchors.rightMargin: 10 14 | spacing: 0 15 | Rectangle{ 16 | Layout.fillWidth: true 17 | Layout.preferredHeight: 150 18 | color: homeColor 19 | Label { 20 | id: label 21 | font.pixelSize: Qt.application.font.pixelSize * 3 22 | text:qsTr("Update") 23 | y:20 24 | anchors{ 25 | topMargin: 50 26 | left: parent.left 27 | } 28 | } 29 | CButton{ 30 | id:checkUpdate 31 | y:25 32 | color:"transparent" 33 | borderColor:"#228BE6" 34 | pressColor:"transparent" 35 | hoverColor:"transparent" 36 | borderRadius: 18 37 | width: 200 38 | height: 30 39 | innerText.color:"#228BE6" 40 | buttonText:qsTr("Check For Update") 41 | anchors{ 42 | right: parent.right 43 | rightMargin: 20 44 | } 45 | onClicked: { 46 | 47 | } 48 | } 49 | Rectangle{ 50 | id:line 51 | width: parent.width*0.99 52 | height: 2 53 | color: "#444b51" 54 | anchors{ 55 | top:label.bottom 56 | topMargin: 10 57 | } 58 | 59 | } 60 | 61 | Label { 62 | id:deviceLabel 63 | font.pixelSize: Qt.application.font.pixelSize*1.2 64 | text:qsTr("Devices") 65 | anchors{ 66 | top: line.bottom 67 | topMargin: 20 68 | } 69 | } 70 | Label { 71 | font.pixelSize: Qt.application.font.pixelSize*0.9 72 | text:qsTr("All devices are up to date ") 73 | color: "light grey" 74 | font.family: "Times New Roman" 75 | anchors{ 76 | top: deviceLabel.bottom 77 | topMargin: 5 78 | } 79 | } 80 | } 81 | 82 | Rectangle{ 83 | Layout.fillHeight: true 84 | Layout.fillWidth: true 85 | color: homeColor 86 | ColumnLayout{ 87 | anchors{ 88 | top: parent.top 89 | topMargin: 5 90 | horizontalCenter: parent.horizontalCenter 91 | } 92 | spacing: 5 93 | 94 | Label { 95 | font.pixelSize: Qt.application.font.pixelSize*1.3 96 | text:qsTr("Jabra Speaker") 97 | } 98 | Label { 99 | font.pixelSize: Qt.application.font.pixelSize*0.9 100 | text:infoButton2.updateAvailable ? qsTr("Current : 2.10.0") : qsTr("Update available : 2.11.0") 101 | color:infoButton2.updateAvailable ? "light grey" :"#FAB005" 102 | font.family: "Times New Roman" 103 | } 104 | IconButton{ 105 | id:infoButton2 106 | property bool updateAvailable: updateButton2.updateAvailable 107 | color: "transparent" 108 | borderColor:"transparent" 109 | pressColor:"transparent" 110 | hoverColor:"transparent" 111 | borderRadius: 18 112 | width: 100 113 | height: 20 114 | innerText.color: "#FAB005" 115 | fontSize: 10 116 | iconWidth: 15 117 | iconHeight: 15 118 | sourceIcon:"qrc:/Assets/Icons/icons8-info-50.png" 119 | buttonText: qsTr("Release notes") 120 | Layout.alignment: Qt.AlignLeft 121 | } 122 | } 123 | 124 | IconButton{ 125 | id:updateButton2 126 | property bool updateAvailable: true 127 | color:updateAvailable ? "transparent" : "#444b51" 128 | borderColor:updateAvailable ? "transparent" :"#444b51" 129 | pressColor:updateAvailable ? "transparent" : "#444b51" 130 | hoverColor:updateAvailable ? "transparent" : "#444b51" 131 | borderRadius: 18 132 | width: 100 133 | height: 30 134 | innerText.color:updateAvailable ? "White" :"#FAB005" 135 | fontSize: 10 136 | iconWidth: 20 137 | iconHeight: 20 138 | sourceIcon:updateAvailable ? "qrc:/Assets/Icons/icons8-ok-30.png" : "qrc:/Assets/Icons/icons8-info-50.png" 139 | buttonText:updateAvailable ? qsTr("Up to date") : qsTr("Update") 140 | anchors{ 141 | right: parent.right 142 | rightMargin: 20 143 | } 144 | } 145 | 146 | } 147 | Rectangle{ 148 | Layout.fillHeight: true 149 | Layout.fillWidth: true 150 | color: homeColor 151 | ColumnLayout{ 152 | anchors{ 153 | top: parent.top 154 | topMargin: 5 155 | horizontalCenter: parent.horizontalCenter 156 | } 157 | spacing: 5 158 | 159 | Label { 160 | font.pixelSize: Qt.application.font.pixelSize*1.3 161 | text:qsTr("Jabra Connect Link") 162 | } 163 | Label { 164 | font.pixelSize: Qt.application.font.pixelSize*0.9 165 | text:infoButton3.updateAvailable ? qsTr("Current : 5.10.2") : qsTr("Update available : 5.11.5") 166 | color:infoButton3.updateAvailable ? "light grey" :"#FAB005" 167 | font.family: "Times New Roman" 168 | } 169 | IconButton{ 170 | id:infoButton3 171 | property bool updateAvailable: updateButton3.updateAvailable 172 | color: "transparent" 173 | borderColor:"transparent" 174 | pressColor:"transparent" 175 | hoverColor:"transparent" 176 | borderRadius: 18 177 | width: 100 178 | height: 20 179 | innerText.color: "#FAB005" 180 | fontSize: 10 181 | iconWidth: 15 182 | iconHeight: 15 183 | sourceIcon:"qrc:/Assets/Icons/icons8-info-50.png" 184 | buttonText: qsTr("Release notes") 185 | Layout.alignment: Qt.AlignLeft 186 | } 187 | } 188 | 189 | IconButton{ 190 | id:updateButton3 191 | property bool updateAvailable: true 192 | color:updateAvailable ? "transparent" : "#444b51" 193 | borderColor:updateAvailable ? "transparent" :"#444b51" 194 | pressColor:updateAvailable ? "transparent" : "#444b51" 195 | hoverColor:updateAvailable ? "transparent" : "#444b51" 196 | borderRadius: 18 197 | width: 100 198 | height: 30 199 | innerText.color:updateAvailable ? "White" :"#FAB005" 200 | fontSize: 10 201 | iconWidth: 20 202 | iconHeight: 20 203 | sourceIcon:updateAvailable ? "qrc:/Assets/Icons/icons8-ok-30.png" : "qrc:/Assets/Icons/icons8-info-50.png" 204 | buttonText:updateAvailable ? qsTr("Up to date") : qsTr("Update") 205 | anchors{ 206 | right: parent.right 207 | rightMargin: 20 208 | } 209 | } 210 | 211 | } 212 | Rectangle{ 213 | Layout.fillWidth: true 214 | Layout.preferredHeight: 20 215 | color: homeColor 216 | Rectangle{ 217 | id:line2 218 | width: parent.width*0.99 219 | height: 2 220 | color: "#444b51" 221 | anchors{ 222 | topMargin: 20 223 | } 224 | } 225 | 226 | } 227 | 228 | Rectangle{ 229 | Layout.fillHeight: true 230 | Layout.fillWidth: true 231 | color: homeColor 232 | 233 | Label { 234 | id:otherLabel 235 | font.pixelSize: Qt.application.font.pixelSize*1.2 236 | text:qsTr("Software") 237 | anchors{ 238 | left: parent.left 239 | leftMargin: 10 240 | topMargin: 10 241 | } 242 | } 243 | 244 | ColumnLayout{ 245 | anchors{ 246 | top: parent.top 247 | topMargin: 5 248 | horizontalCenter: parent.horizontalCenter 249 | } 250 | spacing: 5 251 | 252 | Label { 253 | font.pixelSize: Qt.application.font.pixelSize*1.3 254 | text:qsTr("Jabra Speaker 210") 255 | } 256 | Label { 257 | font.pixelSize: Qt.application.font.pixelSize*0.9 258 | text:infoButton.updateAvailable ? qsTr("Current : 5.10.2") : qsTr("Update available : 5.11.5") 259 | color:infoButton.updateAvailable ? "light grey" :"#FAB005" 260 | font.family: "Times New Roman" 261 | } 262 | IconButton{ 263 | id:infoButton 264 | property bool updateAvailable: updateButton.updateAvailable 265 | color: "transparent" 266 | borderColor:"transparent" 267 | pressColor:"transparent" 268 | hoverColor:"transparent" 269 | borderRadius: 18 270 | width: 100 271 | height: 20 272 | innerText.color: "#FAB005" 273 | fontSize: 10 274 | iconWidth: 15 275 | iconHeight: 15 276 | sourceIcon:"qrc:/Assets/Icons/icons8-info-50.png" 277 | buttonText: qsTr("Release notes") 278 | Layout.alignment: Qt.AlignLeft 279 | } 280 | } 281 | 282 | IconButton{ 283 | id:updateButton 284 | property bool updateAvailable: false 285 | color:updateAvailable ? "transparent" : "#444b51" 286 | borderColor:updateAvailable ? "transparent" :"#444b51" 287 | pressColor:updateAvailable ? "transparent" : "#444b51" 288 | hoverColor:updateAvailable ? "transparent" : "#444b51" 289 | borderRadius: 18 290 | width: 100 291 | height: 30 292 | innerText.color:updateAvailable ? "White" :"#FAB005" 293 | fontSize: 10 294 | iconWidth: 20 295 | iconHeight: 20 296 | sourceIcon:updateAvailable ? "qrc:/Assets/Icons/icons8-ok-30.png" : "qrc:/Assets/Icons/icons8-info-50.png" 297 | buttonText:updateAvailable ? qsTr("Up to date") : qsTr("Update") 298 | anchors{ 299 | verticalCenter: otherLabel.verticalCenter 300 | right: parent.right 301 | rightMargin: 20 302 | } 303 | onClicked: { 304 | 305 | } 306 | } 307 | 308 | } 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /Connect.pro.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | EnvironmentId 7 | {32fa5611-543e-4e9b-b489-650fc7f5e550} 8 | 9 | 10 | ProjectExplorer.Project.ActiveTarget 11 | 0 12 | 13 | 14 | ProjectExplorer.Project.EditorSettings 15 | 16 | true 17 | false 18 | true 19 | 20 | Cpp 21 | 22 | CppGlobal 23 | 24 | 25 | 26 | QmlJS 27 | 28 | QmlJSGlobal 29 | 30 | 31 | 2 32 | UTF-8 33 | false 34 | 4 35 | false 36 | 80 37 | true 38 | true 39 | 1 40 | false 41 | true 42 | false 43 | 0 44 | true 45 | true 46 | 0 47 | 8 48 | true 49 | false 50 | 1 51 | true 52 | true 53 | true 54 | *.md, *.MD, Makefile 55 | false 56 | true 57 | 58 | 59 | 60 | ProjectExplorer.Project.PluginSettings 61 | 62 | 63 | true 64 | false 65 | true 66 | true 67 | true 68 | true 69 | 70 | 71 | 0 72 | true 73 | 74 | true 75 | true 76 | Builtin.DefaultTidyAndClazy 77 | 2 78 | 79 | 80 | 81 | true 82 | 83 | 84 | 85 | 86 | ProjectExplorer.Project.Target.0 87 | 88 | Desktop 89 | Desktop Qt 5.15.2 GCC 64bit 90 | Desktop Qt 5.15.2 GCC 64bit 91 | qt.qt5.5152.gcc_64_kit 92 | 0 93 | 0 94 | 0 95 | 96 | 0 97 | /home/adeshsingh/build-Connect-Desktop_Qt_5_15_2_GCC_64bit-Debug 98 | /home/adeshsingh/build-Connect-Desktop_Qt_5_15_2_GCC_64bit-Debug 99 | 100 | 101 | true 102 | QtProjectManager.QMakeBuildStep 103 | false 104 | 105 | 106 | 107 | true 108 | Qt4ProjectManager.MakeStep 109 | 110 | 2 111 | Build 112 | Build 113 | ProjectExplorer.BuildSteps.Build 114 | 115 | 116 | 117 | true 118 | Qt4ProjectManager.MakeStep 119 | clean 120 | 121 | 1 122 | Clean 123 | Clean 124 | ProjectExplorer.BuildSteps.Clean 125 | 126 | 2 127 | false 128 | 129 | false 130 | 131 | Debug 132 | Qt4ProjectManager.Qt4BuildConfiguration 133 | 2 134 | 135 | 136 | /home/adeshsingh/build-Connect-Desktop_Qt_5_15_2_GCC_64bit-Release 137 | /home/adeshsingh/build-Connect-Desktop_Qt_5_15_2_GCC_64bit-Release 138 | 139 | 140 | true 141 | QtProjectManager.QMakeBuildStep 142 | false 143 | 144 | 145 | 146 | true 147 | Qt4ProjectManager.MakeStep 148 | 149 | 2 150 | Build 151 | Build 152 | ProjectExplorer.BuildSteps.Build 153 | 154 | 155 | 156 | true 157 | Qt4ProjectManager.MakeStep 158 | clean 159 | 160 | 1 161 | Clean 162 | Clean 163 | ProjectExplorer.BuildSteps.Clean 164 | 165 | 2 166 | false 167 | 168 | false 169 | 170 | Release 171 | Qt4ProjectManager.Qt4BuildConfiguration 172 | 0 173 | 0 174 | 175 | 176 | 0 177 | /home/adeshsingh/build-Connect-Desktop_Qt_5_15_2_GCC_64bit-Profile 178 | /home/adeshsingh/build-Connect-Desktop_Qt_5_15_2_GCC_64bit-Profile 179 | 180 | 181 | true 182 | QtProjectManager.QMakeBuildStep 183 | false 184 | 185 | 186 | 187 | true 188 | Qt4ProjectManager.MakeStep 189 | 190 | 2 191 | Build 192 | Build 193 | ProjectExplorer.BuildSteps.Build 194 | 195 | 196 | 197 | true 198 | Qt4ProjectManager.MakeStep 199 | clean 200 | 201 | 1 202 | Clean 203 | Clean 204 | ProjectExplorer.BuildSteps.Clean 205 | 206 | 2 207 | false 208 | 209 | false 210 | 211 | Profile 212 | Qt4ProjectManager.Qt4BuildConfiguration 213 | 0 214 | 0 215 | 0 216 | 217 | 3 218 | 219 | 220 | 0 221 | Deploy 222 | Deploy 223 | ProjectExplorer.BuildSteps.Deploy 224 | 225 | 1 226 | 227 | false 228 | ProjectExplorer.DefaultDeployConfiguration 229 | 230 | 1 231 | 232 | true 233 | true 234 | true 235 | 236 | 2 237 | 238 | Qt4ProjectManager.Qt4RunConfiguration:/home/adeshsingh/Connect/Connect.pro 239 | /home/adeshsingh/Connect/Connect.pro 240 | false 241 | true 242 | true 243 | false 244 | true 245 | /home/adeshsingh/build-Connect-Desktop_Qt_5_15_2_GCC_64bit-Debug 246 | 247 | 1 248 | 249 | 250 | 251 | ProjectExplorer.Project.TargetCount 252 | 1 253 | 254 | 255 | ProjectExplorer.Project.Updater.FileVersion 256 | 22 257 | 258 | 259 | Version 260 | 22 261 | 262 | 263 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | --------------------------------------------------------------------------------