move widgets into the Opaque submodule project #298

Merged
dan merged 8 commits from opaquemodules into master 2020-05-20 21:28:05 +00:00
71 changed files with 49 additions and 4076 deletions
Showing only changes of commit 92adc2a61d - Show all commits

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "qml/opaque"]
path = qml/opaque
url = https://git.openprivacy.ca/openprivacy/opaque

28
qml.qrc
View File

@ -13,38 +13,10 @@
<file>qml/panes/SplashPane.qml</file>
<file>qml/panes/ProfileManagerPane.qml</file>
<file>qml/panes/ProfileAddEditPane.qml</file>
<file>qml/styles/CwtchComboBoxStyle.qml</file>
<file>qml/styles/CwtchExpandingButton.qml</file>
<file>qml/styles/CwtchTextAreaStyle.qml</file>
<file>qml/styles/CwtchTextFieldStyle.qml</file>
<file>qml/widgets/ContactList.qml</file>
<file>qml/widgets/Portrait.qml</file>
<file>qml/widgets/Badge.qml</file>
<file>qml/widgets/PortraitRow.qml</file>
<file>qml/widgets/ProfileRow.qml</file>
<file>qml/widgets/ContactRow.qml</file>
<file>qml/widgets/EmojiDrawer.qml</file>
<file>qml/widgets/FontAwesome.qml</file>
<file>qml/widgets/IconTextField.qml</file>
<file>qml/widgets/InplaceEditText.qml</file>
<file>qml/widgets/Message.qml</file>
<file>qml/widgets/ScalingLabel.qml</file>
<file>qml/widgets/EllipsisLabel.qml</file>
<file>qml/widgets/MyProfile.qml</file>
<file>qml/widgets/ProfileList.qml</file>
<file>qml/widgets/RadioButton.qml</file>
<file>qml/widgets/Button.qml</file>
<file>qml/widgets/TextField.qml</file>
<file>qml/widgets/Toolbar.qml</file>
<file>qml/widgets/Statusbar.qml</file>
<file>qml/widgets/UnderlineTextField.qml</file>
<file>qml/widgets/controls/Loader.qml</file>
<file>qml/widgets/controls/Variables.qml</file>
<file>i18n/translation_de.qm</file>
<file>i18n/translation_en.qm</file>
<file>i18n/translation_fr.qm</file>
<file>i18n/translation_pt.qm</file>
<file>qml/images/cwtch_logo.png</file>
<file>qml/styles/CwtchProgress.qml</file>
</qresource>
</RCC>

Binary file not shown.

View File

@ -1,27 +0,0 @@
pragma Singleton
import QtQuick 2.5
QtObject {
property FontLoader applicationFontBold: FontLoader {
id: opensansBold
source: "qrc:/qml/fonts/opensans/OpenSans-Bold.ttf"
}
property FontLoader applicationFontExtrBold: FontLoader {
id: opensansExtraBold
source: "qrc:/qml/fonts/opensans/OpenSans-ExtraBold.ttf"
}
property FontLoader applicationFontRegular: FontLoader {
id: opensansRegular
source: "qrc:/qml/fonts/opensans/OpenSans-Regular.ttf"
}
property FontLoader applicationFontLight: FontLoader {
id: opensansLight
source: "qrc:/qml/fonts/opensans/OpenSans-Light.ttf"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
singleton Fonts Fonts.qml

View File

@ -5,13 +5,14 @@ import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import "fonts"
import "fonts/Twemoji.js" as T
import "fonts/MutantStandard.js" as Mutant
import "opaque"
import "opaque/fonts"
import "opaque/fonts/Twemoji.js" as T
import "opaque/fonts/MutantStandard.js" as Mutant
import "opaque/theme"
import "overlays"
import "panes"
import "widgets"
import "theme"
import "utils.js" as Utils
@ -29,17 +30,13 @@ ApplicationWindow {
readonly property real ratio: height / width
readonly property string cwtch_background_color: '#FF0000'
readonly property string cwtch_color: '#00FF00'
readonly property string cwtch_dark_color: '#0000FF'
FontAwesome { // PRETTY BUTTON ICONS
id: awesome
resource: "qrc:/qml/fonts/fontawesome.ttf"
resource: "qrc:/qml/opaque/fonts/fontawesome.ttf"
}
FontLoader {
source: "qrc:/qml/fonts/AdobeBlank.ttf"
source: "qrc:/qml/opaque/fonts/AdobeBlank.ttf"
}

1
qml/opaque Submodule

@ -0,0 +1 @@
Subproject commit 9a88a124e52ad68a0e32ae23d9e9247020b0266b

View File

@ -6,10 +6,10 @@ import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
import "../widgets" as Widgets
import "../fonts/Twemoji.js" as T
import "../opaque" as Widgets
import "../opaque/fonts/Twemoji.js" as T
import "../opaque/styles"
import "../utils.js" as Utils
import "../styles"
ColumnLayout {
Layout.fillWidth: true

View File

@ -4,9 +4,9 @@ import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../widgets" as Widgets
import "../widgets/controls" as Awesome
import "../fonts/Twemoji.js" as T
import "../opaque" as Widgets
import "../opaque/controls" as Awesome
import "../opaque/fonts/Twemoji.js" as T
import "../utils.js" as Utils
Item {

View File

@ -5,11 +5,11 @@ import QtQuick.Controls.Material 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
import "../widgets" as Widgets
import "../widgets/controls" as Awesome
import "../fonts/Twemoji.js" as T
import "../opaque" as Widgets
import "../opaque/controls" as Awesome
import "../opaque/fonts/Twemoji.js" as T
import "../utils.js" as Utils
import "../styles"
import "../opaque/styles"
ColumnLayout {
Layout.fillWidth: true

View File

@ -5,11 +5,11 @@ import QtQuick.Controls.Material 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
import "../widgets"
import "../widgets/controls" as Awesome
import "../fonts/Twemoji.js" as T
import "../opaque"
import "../opaque/controls" as Awesome
import "../opaque/fonts/Twemoji.js" as T
import "../opaque/styles"
import "../utils.js" as Utils
import "../styles"
ColumnLayout {
Text {

View File

@ -6,8 +6,8 @@ import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import "../widgets" as Widgets
import "../styles"
import "../opaque" as Widgets
import "../opaque/styles"
ColumnLayout { // settingsPane
id: root

View File

@ -6,8 +6,8 @@ import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import "../widgets" as Widgets
import "../styles"
import "../opaque" as Widgets
import "../opaque/styles"
import "../utils.js" as Utils
ColumnLayout { // groupSettingsPane

View File

@ -4,7 +4,8 @@ import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../widgets" as Widgets
import "../opaque" as Widgets
import "../opaque/styles"
import "../overlays"
ColumnLayout {

View File

@ -7,9 +7,9 @@ import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import "../widgets" as Widgets
import "../styles"
import "../theme"
import "../opaque" as Widgets
import "../opaque/styles"
import "../opaque/theme"
ColumnLayout { // peerSettingsPane
id: root

View File

@ -6,7 +6,7 @@ import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import "../widgets" as Widgets
import "../opaque" as Widgets
// import "../styles"
ColumnLayout { // Add Profile Pane

View File

@ -8,10 +8,10 @@ import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import "../widgets" as Widgets
import "../widgets/controls"
import "../styles"
import "../theme"
import "../opaque" as Widgets
import "../opaque/controls"
import "../opaque/styles"
import "../opaque/theme"
ColumnLayout {

View File

@ -7,8 +7,8 @@ import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import "../widgets"
import "../widgets/controls"
import "../opaque" as Widgets
import "../opaque/controls"
ColumnLayout { // settingsPane
id: root
@ -28,14 +28,14 @@ ColumnLayout { // settingsPane
spacing: 5
width: root.width
ScalingLabel {
Widgets.ScalingLabel {
width: parent.width
wrapMode: TextEdit.Wrap
//: Version: %1 Built on: %2
text: qsTr("version %1 builddate %2").arg(gcd.version).arg(gcd.buildDate)
}
ScalingLabel {
Widgets.ScalingLabel {
width: parent.width
wrapMode: TextEdit.Wrap
//: Interface zoom (mostly affects text and button sizes)
@ -67,26 +67,26 @@ ColumnLayout { // settingsPane
}
}
style: CheckBoxStyle {
label: ScalingLabel {
label: Widgets.ScalingLabel {
text: qsTr("block-unknown-label")
}
}
}
ScalingLabel {
Widgets.ScalingLabel {
wrapMode: TextEdit.Wrap
text: qsTr("large-text-label")
size: 20
}
ScalingLabel{
Widgets.ScalingLabel{
width: parent.width
wrapMode: TextEdit.Wrap
//: "Default size text (scale factor: "
text: qsTr("default-scaling-text") + " " + Math.round(zoomSlider.value * 100) / 100 + ")"
}
ScalingLabel {
Widgets.ScalingLabel {
text: qsTr("small-text-label")
size: 8
}

View File

@ -5,7 +5,7 @@ import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import "../styles"
import "../opaque/styles"
Item {
id: sp

View File

@ -1,7 +0,0 @@
import QtQuick.Controls.Styles 1.4
import QtQuick 2.7
ComboBoxStyle {
textColor: "#000"
}

View File

@ -1,21 +0,0 @@
import QtQuick.Controls.Styles 1.4
import QtQuick 2.7
ButtonStyle {
background: Rectangle {
width:25
height:25
color: windowItem.cwtch_dark_color
border.color: windowItem.cwtch_color
}
label: Text {
renderType: Text.NativeRendering
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
font.family: "Monospace"
font.pointSize: 8
color: windowItem.cwtch_background_color
text: control.text
}
}

View File

@ -1,39 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
Rectangle {
id: pb
border.color: "#FFFFFF"
border.width: 1
color: "#D2C0DD"
property bool running
// Indeterminate animation by animating alternating stripes:
Item {
anchors.fill: parent
anchors.margins: 1
visible: control.indeterminate
clip: true
Row {
Repeater {
Rectangle {
color: index % 2 ? "#D2C0DD" : "#b29dbe"
width: 20 ; height: control.height
}
model: control.width / 20 + 2
}
XAnimator on x {
from: 0 ; to: -40
loops: Animation.Infinite
running: pb.running
}
}
}
}

View File

@ -1,8 +0,0 @@
import QtQuick.Controls.Styles 1.4
import QtQuick 2.7
TextAreaStyle {
textColor: "black"
backgroundColor: windowItem.cwtch_background_color
}

View File

@ -1,15 +0,0 @@
import QtQuick.Controls.Styles 1.4
import QtQuick 2.7
TextFieldStyle {
id: root
textColor: "black"
font.pointSize: 10 * gcd.themeScale
property int width: parent.width
background: Rectangle {
radius: 2
color: windowItem.cwtch_background_color
border.color: windowItem.cwtch_color
}
}

View File

@ -1,51 +0,0 @@
ThemeType {
readonly property color darkGrayPurple: "#281831"
readonly property color deepPurple: "#422850"
readonly property color mauvePurple: "#8E64A5"
readonly property color purple: "#DFB9DE"
readonly property color whitePurple: "#FFFDFF"
readonly property color softPurple: "#FDF3FC"
readonly property color pink: "#E85DA1"
readonly property color hotPink: "#D01972"
backgroundMainColor: darkGrayPurple
backgroundPaneColor: deepPurple
mainTextColor: purple
altTextColor: mauvePurple
defaultButtonColor: mauvePurple
defaultButtonActiveColor: pink
defaultButtonTextColor: whitePurple
portraitOnlineBorderColor: whitePurple
portraitOnlineBackgroundColor: darkGrayPurple
portraitOnlineTextColor: whitePurple
portraitConnectingBorderColor: mauvePurple
portraitConnectingBackgroundColor: darkGrayPurple
portraitConnectingTextColor: whitePurple
portraitOfflineBorderColor: deepPurple
portraitOfflineBackgroundColor: darkGrayPurple
portraitOfflineTextColor: softPurple
portraitContactBadgeColor: hotPink
portraitContactBadgeTextColor: whitePurple
portraitProfileBadgeColor: mauvePurple
dropShadowColor: mauvePurple
dropShadowPaneColor: darkGrayPurple
toggleColor: darkGrayPurple
toggleOnColor: whitePurple
toggleOffColor: mauvePurple
toolbarIconColor: whitePurple
statusbarDisconnectedInternetColor: whitePurple
statusbarDisconnectedInternetFontColor: deepPurple
statusbarDisconnectedTorColor: darkGrayPurple
statusbarDisconnectedTorFontColor: whitePurple
statusbarConnectingColor: deepPurple
statusbarConnectingFontColor: whitePurple
statusbarOnlineColor: mauvePurple
statusbarOnlineFontColor: whitePurple
}

View File

@ -1,51 +0,0 @@
ThemeType {
readonly property color whitePurple: "#FFFDFF"
readonly property color softPurple: "#FDF3FC"
readonly property color purple: "#DFB9DE"
readonly property color brightPurple: "#760388"
readonly property color darkPurple: "#350052"
readonly property color greyPurple: "#775F84"
readonly property color pink: "#E85DA1"
readonly property color hotPink: "#D01972"
backgroundMainColor: whitePurple
backgroundPaneColor: softPurple
mainTextColor: darkPurple
altTextColor: purple
defaultButtonColor: hotPink
defaultButtonActiveColor: pink
defaultButtonTextColor: whitePurple
portraitOnlineBorderColor: darkPurple
portraitOnlineBackgroundColor: darkPurple
portraitOnlineTextColor: darkPurple
portraitConnectingBorderColor: greyPurple
portraitConnectingBackgroundColor: greyPurple
portraitConnectingTextColor: greyPurple
portraitOfflineBorderColor: purple
portraitOfflineBackgroundColor: purple
portraitOfflineTextColor: purple
portraitContactBadgeColor: hotPink
portraitContactBadgeTextColor: whitePurple
portraitProfileBadgeColor: brightPurple
dropShadowColor: purple
dropShadowPaneColor: purple
toggleColor: whitePurple
toggleOnColor: hotPink
toggleOffColor: purple
toolbarIconColor: darkPurple
statusbarDisconnectedInternetColor: softPurple
statusbarDisconnectedInternetFontColor: darkPurple
statusbarDisconnectedTorColor: purple
statusbarDisconnectedTorFontColor: darkPurple
statusbarConnectingColor: greyPurple
statusbarConnectingFontColor: whitePurple
statusbarOnlineColor: darkPurple
statusbarOnlineFontColor: whitePurple
}

View File

@ -1,61 +0,0 @@
pragma Singleton
import QtQuick 2.0
Item {
readonly property color backgroundMainColor: theme.backgroundMainColor
readonly property color backgroundPaneColor: theme.backgroundPaneColor
readonly property color mainTextColor: theme.mainTextColor
readonly property color altTextColor: theme.altTextColor
readonly property color defaultButtonColor: theme.defaultButtonColor
readonly property color defaultButtonActiveColor: theme.defaultButtonActiveColor
readonly property color defaultButtonTextColor: theme.defaultButtonTextColor
readonly property color dropShadowColor: theme.dropShadowColor
readonly property color dropShadowPaneColor: theme.dropShadowPaneColor
readonly property color portraitOnlineBorderColor: theme.portraitOnlineBorderColor
readonly property color portraitOnlineBackgroundColor: theme.portraitOnlineBackgroundColor
readonly property color portraitOnlineTextColor: theme.portraitOnlineTextColor
readonly property color portraitConnectingBorderColor: theme.portraitConnectingBorderColor
readonly property color portraitConnectingBackgroundColor: theme.portraitConnectingBackgroundColor
readonly property color portraitConnectingTextColor: theme.portraitConnectingTextColor
readonly property color portraitOfflineBorderColor: theme.portraitOfflineBorderColor
readonly property color portraitOfflineBackgroundColor: theme.portraitOfflineBackgroundColor
readonly property color portraitOfflineTextColor: theme.portraitOfflineTextColor
readonly property color portraitContactBadgeColor: theme.portraitContactBadgeColor
readonly property color portraitContactBadgeTextColor: theme.portraitContactBadgeTextColor
readonly property color portraitProfileBadgeColor: theme.portraitProfileBadgeColor
readonly property color toggleColor: theme.toggleColor
readonly property color toggleOffColor: theme.toggleOffColor
readonly property color toggleOnColor: theme.toggleOnColor
readonly property color toolbarIconColor: theme.toolbarIconColor
readonly property color statusbarDisconnectedInternetColor: theme.statusbarDisconnectedInternetColor
readonly property color statusbarDisconnectedInternetFontColor: theme.statusbarDisconnectedInternetFontColor
readonly property color statusbarDisconnectedTorFontColor: theme.statusbarDisconnectedTorFontColor
readonly property color statusbarDisconnectedTorColor: theme.statusbarDisconnectedTorColor
readonly property color statusbarConnectingColor: theme.statusbarConnectingColor
readonly property color statusbarConnectingFontColor: theme.statusbarConnectingFontColor
readonly property color statusbarOnlineColor: theme.statusbarOnlineColor
readonly property color statusbarOnlineFontColor: theme.statusbarOnlineFontColor
readonly property int headerSize: 50
readonly property int usernameSize: 30
readonly property int tabSize: 25
readonly property int chatSize: 20
readonly property int secondaryTextSize: 20 // address
readonly property int chatMetaTextSize: 15
readonly property int badgeTextSize: 12
readonly property int statusTextSize: 12
readonly property int sidePaneMinSize: 700
readonly property int doublePaneMinSize: 1000
property ThemeType theme: CwtchLight { }
}

View File

@ -1,46 +0,0 @@
import QtQuick 2.0
QtObject {
property color backgroundMainColor: "red"
property color backgroundPaneColor: "red"
property color mainTextColor: "red"
property color altTextColor: "red"
property color defaultButtonColor: "red"
property color defaultButtonActiveColor: "red"
property color defaultButtonTextColor: "red"
property color portraitOnlineBorderColor: "red"
property color portraitOnlineBackgroundColor: "red"
property color portraitOnlineTextColor: "red"
property color portraitConnectingBorderColor: "red"
property color portraitConnectingBackgroundColor: "red"
property color portraitConnectingTextColor: "red"
property color portraitOfflineBorderColor: "red"
property color portraitOfflineBackgroundColor: "red"
property color portraitOfflineTextColor: "red"
property color portraitContactBadgeColor: "red"
property color portraitContactBadgeTextColor: "red"
property color portraitProfileBadgeColor: "red"
property color dropShadowColor: "black"
property color dropShadowPaneColor: "black"
property color toggleColor: "black"
property color toggleOnColor: "black"
property color toggleOffColor: "black"
property color toolbarIconColor: "red"
property color statusbarDisconnectedInternetColor: "red"
property color statusbarDisconnectedInternetFontColor: "red"
property color statusbarDisconnectedTorFontColor: "red"
property color statusbarDisconnectedTorColor: "red"
property color statusbarConnectingColor: "red"
property color statusbarConnectingFontColor: "red"
property color statusbarOnlineColor: "red"
property color statusbarOnlineFontColor: "red"
// ... more to come
}

View File

@ -1 +0,0 @@
singleton Theme 1.0 Theme.qml

View File

@ -1,24 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import CustomQmlTypes 1.0
import "../theme"
Rectangle {
width: parent.width * 0.25
height: width
radius: width/2
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.margins: parent.width * 0.09
property alias content: container.children
Column {
id: container
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
}
}

View File

@ -1,79 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../fonts/Twemoji.js" as T
import "../theme"
import "../fonts"
Rectangle {
id: button
width: (text == undefined || text == "" ? 0 : buttonText.width) + (icon == undefined || icon == "" ? 0 : ico.width) + 24 * gcd.themeScale
Layout.minimumWidth: width
Layout.maximumWidth: width
height: 20 * gcd.themeScale
Layout.minimumHeight: height
Layout.maximumHeight: height
color: mousedown ? Theme.defaultButtonActiveColor : Theme.defaultButtonColor
border.color: mousedown ? Theme.defaultButtonActiveColor : Theme.defaultButtonColor
border.width: 1
radius: override_radius
antialiasing: true
property bool checked: false
property double override_radius: (height / 2.0)
property alias text: buttonText.text
property alias font: buttonText.font.family
property string icon
property bool mousedown
property string tooltip
signal clicked
RowLayout {
anchors.centerIn: parent
Image {
anchors.left: parent.left
id: ico
source: icon!="" ? gcd.assetPath + "fontawesome/"+icon+".svg" : "";
height: button.height / 2
sourceSize.height: button.height / 2
}
Label {
id: buttonText
font.family: Fonts.applicationFontRegular.name
font.styleName: "ExtraBold"
font.pixelSize: button.height / 2
color: Theme.defaultButtonTextColor
anchors.left: ico.right
anchors.leftMargin: 6
visible: button.text != "" && button.text != undefined
}
ToolTip.visible: tooltip != "" && mouseArea.containsMouse
ToolTip.text: tooltip
}
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
parent.focus = true
parent.clicked()
}
onPressed: mousedown = true
onReleased: mousedown = false
hoverEnabled: true
}
Keys.onSpacePressed: clicked()
}

View File

@ -1,49 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.13
import QtQuick.Controls.Styles 1.4
import QtGraphicalEffects 1.12
import "." as Widgets
import "../theme"
// ButtonTextField integrates a text field and a button
TextField {
id: tf
color: Theme.mainTextColor
font.pixelSize: Theme.secondaryTextSize * gcd.themeScale
width: parent.width - 20
property string icon
property string button_text
signal clicked
smooth: true
property color dropShadowColor: Theme.dropShadowColor
background: Rectangle {
radius: 10
color: Theme.backgroundMainColor
border.color: Theme.backgroundMainColor
layer.enabled: true
layer.effect: DropShadow {
transparentBorder: true
horizontalOffset: 4
verticalOffset: 4
samples:10
color: tf.dropShadowColor
}
}
Widgets.Button {
icon: ""
text: button_text
anchors { top: parent.top; right: parent.right }
override_radius: 10
height: parent.height; width: parent.height * 4
onClicked: {
parent.focus = true;
parent.clicked();
}
}
}

View File

@ -1,171 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../theme"
ColumnLayout {
id: root
property alias dualPane: myprof.dualPane
spacing: 10
MouseArea {
anchors.fill: parent
onClicked: {
forceActiveFocus()
}
}
MyProfile { // CURRENT PROFILE INFO AND CONTROL BAR
id: myprof
}
IconTextField {
id: searchAddText
anchors.horizontalCenter: parent.horizontalCenter
Layout.minimumWidth: parent.width - 60
Layout.maximumWidth: parent.width - 60
//: ex: "... paste an address here to add a contact ..."
placeholderText: qsTr("paste-address-to-add-contact")
horizontalAlignment: TextInput.AlignHCenter
icon: gcd.assetPath + "core/search-24px.svg"
onTextChanged: {
if (text != "") {
gcd.importString(text)
text = ""
}
}
}
Flickable { // THE ACTUAL CONTACT LIST
id: sv
//Layout.alignment: Qt.AlignLeft | Qt.AlignTop
clip: true
Layout.minimumHeight: 100
//Layout.maximumHeight: parent.height - 30
Layout.fillHeight: true
Layout.minimumWidth: parent.width
Layout.maximumWidth: parent.width
contentWidth: colContacts.width
contentHeight: colContacts.height
boundsBehavior: Flickable.StopAtBounds
maximumFlickVelocity: 400
ScrollBar.vertical: ScrollBar {
policy: ScrollBar.AsNeeded
background: Rectangle {
implicitWidth: 6
color: Theme.backgroundMainColor
}
contentItem: Rectangle {
implicitWidth: 6
implicitHeight:1
color: Theme.backgroundPaneColor
}
}
ColumnLayout {
id: colContacts
width: root.width
spacing: 0
Connections { // ADD/REMOVE CONTACT ENTRIES
target: gcd
onAddContact: function(handle, displayName, image, badge, status, blocked, loading, lastMsgTs) {
for (var i = 0; i < contactsModel.count; i++) {
if (contactsModel.get(i)["_handle"] == handle) {
return
}
}
var index = contactsModel.count
for (var i = 0; i < contactsModel.count; i++) {
if (contactsModel.get(i)["_lastMsgTs"] < lastMsgTs) {
index = i
break
}
}
var newContact = {
"_handle": handle,
"_displayName": displayName + (blocked ? " (blocked)" : "" ),
"_image": image,
"_badge": badge,
"_status": status,
"_blocked": blocked,
"_loading": loading,
"_loading": loading,
"_lastMsgTs": lastMsgTs
}
contactsModel.insert(index, newContact)
}
onRemoveContact: function(handle) {
for(var i = 0; i < contactsModel.count; i++){
if(contactsModel.get(i)["_handle"] == handle) {
console.log("deleting contact " + contactsModel.get(i)["_handle"])
contactsModel.remove(i)
return
}
}
}
onIncContactUnreadCount: function(handle) {
var ts = Math.round((new Date()).getTime() / 1000);
for(var i = 0; i < contactsModel.count; i++){
if(contactsModel.get(i)["_handle"] == handle) {
var contact = contactsModel.get(i)
contact["_lastMsgTs"] = ts
contactsModel.move(i, 0, 1)
}
}
}
onResetProfile: function() {
contactsModel.clear()
}
}
ListModel { // CONTACT OBJECTS ARE STORED HERE ...
id: contactsModel
}
Repeater {
model: contactsModel // ... AND DISPLAYED HERE
delegate: ContactRow {
handle: _handle
displayName: _displayName
image: _image
badge: _badge
status: _status
blocked: _blocked
loading: _loading
}
}
}
}
}

View File

@ -1,102 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import CustomQmlTypes 1.0
import "../styles"
import "../widgets" as Widgets
import "../theme"
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
PortraitRow {
property int status: 0
property int badge
property bool loading
badgeColor: Theme.portraitContactBadgeColor
badgeVisible: badge > 0
badgeContent: Label {
id: lblUnread
color: Theme.portraitContactBadgeTextColor
font.pixelSize: Theme.badgeTextSize * gcd.themeScale
font.weight: Font.Bold
text: badge > 99 ? "99+" : badge
}
ProgressBar { // LOADING ?
id: loadingProgress
property bool running
running: loading
visible: loading
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 1 * gcd.themeScale
anchors.rightMargin: 25 * gcd.themeScale
height: parent.height * .1
width: 100 * gcd.themeScale
indeterminate: true
style: ProgressBarStyle {
progress: CwtchProgress { running: loadingProgress.running}
}
}
onClicked: function(handle) {
gcd.broadcast("ResetMessagePane")
isActive = true
theStack.pane = theStack.messagePane
gcd.loadMessagesPane(handle)
badge = 0
if (handle.length == 32) {
gcd.requestGroupSettings(handle)
}
}
Component.onCompleted: { setColors(status) }
onStatusChanged: { setColors(status) }
function setColors(status) {
//-2:WtfCodeError,-1:Error,0:Disconnected,1:Connecting,2:Connected,3:Authenticated,4:Synced,5:Failed,6:Killed
if (status == 4 || status == 3) {
portraitBorderColor = Theme.portraitOnlineBorderColor
portraitColor = Theme.portraitOnlineBackgroundColor
nameColor = Theme.portraitOnlineTextColor
onionColor = Theme.portraitOnlineTextColor
} else if (status == 2 || status == 1) {
portraitBorderColor = Theme.portraitConnectingBorderColor
portraitColor = Theme.portraitConnectingBackgroundColor
nameColor = Theme.portraitConnectingTextColor
onionColor = Theme.portraitConnectingTextColor
} else {
portraitBorderColor = Theme.portraitOfflineBorderColor
portraitColor = Theme.portraitOfflineBackgroundColor
nameColor = Theme.portraitOfflineTextColor
onionColor = Theme.portraitOfflineTextColor
}
}
Connections { // UPDATE UNREAD MESSAGES COUNTER
target: gcd
onUpdateContactStatus: function(_handle, _status, _loading) {
if (handle == _handle) {
status = _status
loadingProgress.visible = loadingProgress.running = loading = _loading
}
}
onIncContactUnreadCount: function(handle) {
if (handle == _handle && gcd.selectedConversation != handle) {
badge++
}
}
}
}

View File

@ -1,59 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import CustomQmlTypes 1.0
import "../widgets" as Widgets
import "../theme"
// Needs the parent to have an onWidthChanged that calls .textResize()
Item {
anchors.right: parent.right
anchors.left: parent.left
property string text
property alias color: label.color
property alias pixelSize: label.font.pixelSize
property alias weight: label.font.weight
property alias strikeout: label.font.strikeout
property alias font: label.font
property int extraPadding: 0
property Item container: parent
height: textMetric.height
width: textMetric.width + 10
anchors.leftMargin: 10
Label {
id: label
textFormat: Text.PlainText
elide: Text.ElideRight
text: textMetric.text
}
TextMetrics {
id: textMetric
text: text
font: label.font
}
onTextChanged: {
textResize()
}
function textResize() {
textMetric.text = text
var i = 2
var containerWidth = container != null ? container.width : 50
// - 30 for padding
while (textMetric.width > containerWidth - ((30 + extraPadding) * gcd.themeScale) && containerWidth > 50) {
textMetric.text = text.slice(0, text.length - (i * 3)) + "..."
i++
}
}
}

View File

@ -1,400 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.13
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import Qt.labs.folderlistmodel 2.13
import QtQml.Models 2.13
import "../fonts/MutantStandard.js" as Mutant
import "controls"
Item {
id: root
height: 0
property int size: 24
property int requestedHeight: size * 8
property string morph: "clw"
property string color: "v1"
property bool narrowMode: width < (txtSearch.width + root.size * 14 + btnX.width)
signal picked(string shortcode)
signal slideopen()
signal slideclosed()
visible: height != 0
Rectangle {
color: windowItem.cwtch_dark_color
anchors.fill: parent
}
PropertyAnimation {
id: animClose;
target: root;
properties: "height";
to: 0;
duration: 400;
}
PropertyAnimation {
id: animOpen;
target: root;
properties: "height";
to: requestedHeight;
duration: 400;
}
Button {
id: btnX
anchors.top: parent.top
anchors.right: parent.right
text: "x"
onClicked: animClose.start()
}
ColumnLayout {
anchors.fill: parent
RowLayout {
TextField {
id: txtSearch
//: Search...
placeholderText: qsTr("search")
onTextChanged: {
if (text == "") emojiModel.model = folder_expressions
else emojiModel.model = folder_search
emojiModel.updatefilters()
}
}
ImageButton {
id: btnEmojiExpressionsGroup
visible: !root.narrowMode
//: Expressions
tooltip: qsTr("emojicat-expressions")
source: gcd.assetPath + "mutstd/smile.webp"
size: root.size
onClicked: emojiModel.model = folder_expressions
}
ImageButton {
visible: !root.narrowMode
//: Activities
tooltip: qsTr("emojicat-activities")
source: gcd.assetPath + "mutstd/artist_r1.webp"
size: root.size
onClicked: emojiModel.model = folder_activities_clothing
}
ImageButton {
visible: !root.narrowMode
//: Food, drink & herbs
tooltip: qsTr("emojicat-food")
source: gcd.assetPath + "mutstd/red_apple.webp"
size: root.size
onClicked: emojiModel.model = folder_food_drink_herbs
}
ImageButton {
visible: !root.narrowMode
//: Gender, relationships & sexuality
tooltip: qsTr("emojicat-gender")
size: root.size
source: gcd.assetPath + "mutstd/pride_100.webp"
onClicked: emojiModel.model = folder_gsr
}
ImageButton {
visible: !root.narrowMode
//: Nature and effects
tooltip: qsTr("emojicat-nature")
source: gcd.assetPath + "mutstd/sun_behind_small_cloud.webp"
size: root.size
onClicked: emojiModel.model = folder_nature
}
ImageButton {
visible: !root.narrowMode
//: Objects
tooltip: qsTr("emojicat-objects")
source: gcd.assetPath + "mutstd/crystal_ball.webp"
size: root.size
onClicked: emojiModel.model = folder_objects
}
ImageButton {
visible: !root.narrowMode
//: People and animals
tooltip: qsTr("emojicat-people")
source: gcd.assetPath + "mutstd/crow.webp"
size: root.size
onClicked: emojiModel.model = folder_people
}
ImageButton {
visible: !root.narrowMode
//: Symbols
tooltip: qsTr("emojicat-symbols")
source: gcd.assetPath + "mutstd/purple_heart.webp"
size: root.size
onClicked: emojiModel.model = folder_symbols
}
ImageButton {
visible: !root.narrowMode
//: Travel & places
tooltip: qsTr("emojicat-travel")
source: gcd.assetPath + "mutstd/airplane.webp"
size: root.size
onClicked: emojiModel.model = folder_travel_places
}
ImageButton {
visible: !root.narrowMode
//: Miscellaneous
tooltip: qsTr("emojicat-misc")
source: gcd.assetPath + "mutstd/hash_char.webp"
size: root.size
onClicked: emojiModel.model = folder_utils
}
ImageButton {
visible: !root.narrowMode
id: btnUndefinedGroup
// (no tooltip; this is a catchall group meant to detect unclassified emoji during development)
//TODO: remove this category upon finalizing the Emoji Drawer
source: gcd.assetPath + "mutstd/undefined_character.webp"
size: root.size
onClicked: emojiModel.model = folder_other
}
Item {
visible: root.narrowMode
height: root.size
width: root.size
Image {
id: imgCatRot
anchors.centerIn: parent
source: cats[index].source
property int index: 0
property var cats: [
{source: gcd.assetPath + "mutstd/smile.webp", model: folder_expressions},
{source: gcd.assetPath + "mutstd/artist_r1.webp", model: folder_activities_clothing},
{source: gcd.assetPath + "mutstd/red_apple.webp", model: folder_food_drink_herbs},
{source: gcd.assetPath + "mutstd/pride_100.webp", model: folder_gsr},
{source: gcd.assetPath + "mutstd/sun_behind_small_cloud.webp", model: folder_nature},
{source: gcd.assetPath + "mutstd/crystal_ball.webp", model: folder_objects},
{source: gcd.assetPath + "mutstd/crow.webp", model: folder_people},
{source: gcd.assetPath + "mutstd/purple_heart.webp", model: folder_symbols},
{source: gcd.assetPath + "mutstd/airplane.webp", model: folder_travel_places},
{source: gcd.assetPath + "mutstd/hash_char.webp", model: folder_utils},
{source: gcd.assetPath + "mutstd/undefined_character.webp", model: folder_other}
]
height: root.size * (maCatRot.pressed ? 0.8 : 1.0)
width: root.size * (maCatRot.pressed ? 0.8 : 1.0)
ToolTip.visible: maCatRot.containsMouse
ToolTip.text: gcd.os == "android" ? qsTr("cycle-cats-android") : qsTr("cycle-cats-desktop")
MouseArea {
id: maCatRot
hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.RightButton
anchors.fill: parent;
onClicked: {
if (mouse.button == Qt.RightButton) {//todo: long press on android
imgCatRot.index = 0
} else {
imgCatRot.index = (imgCatRot.index + 1) % imgCatRot.cats.length
}
emojiModel.model = imgCatRot.cats[imgCatRot.index].model
//root.morph = Mutant.standard.morphs[imgMorph.index]
//emojiModel.updatefilters()
}
}
}
}
Item {
height: root.size
width: root.size
Image {
id: imgMorph
anchors.centerIn: parent
source: gcd.assetPath + "mutstd/hand_"+Mutant.standard.morphs[index]+"_"+root.color+".webp"
property int index: 0
height: root.size
width: root.size
ToolTip.visible: maMorph.containsMouse
ToolTip.text: gcd.os == "android" ? qsTr("cycle-morphs-android") : qsTr("cycle-morphs-desktop")
MouseArea {
id: maMorph
hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.RightButton
anchors.fill: parent;
onClicked: {
if (mouse.button == Qt.RightButton) {//todo: long press on android
imgMorph.index = 0//TODO: saved morph
} else {
imgMorph.index = (imgMorph.index + 1) % Mutant.standard.morphs.length
}
root.morph = Mutant.standard.morphs[imgMorph.index]
emojiModel.updatefilters()
}
}
}
}
Item {
height: root.size
width: root.size
Image {
id: imgColor
anchors.centerIn: parent
source: gcd.assetPath + "mutstd/color_modifier_"+Mutant.standard.colorByIndex(index, root.morph)+".webp"
property int index: 0
height: root.size
width: root.size
ToolTip.visible: ma.containsMouse
ToolTip.text: gcd.os == "android" ? qsTr("cycle-colours-android") : qsTr("cycle-colours-desktop")
MouseArea {
id: ma
anchors.fill: parent;
hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: function(mouse){
if (mouse.button == Qt.RightButton) {//todo: long press on android
imgColor.index = 0//todo: saved color
} else {
imgColor.index = (imgColor.index + 1) % Mutant.standard.numColors(root.morph)
}
root.color = Mutant.standard.colorByIndex(imgColor.index, root.morph)
emojiModel.updatefilters()
}
}
}
}
}
GridView {
Layout.fillWidth: true
Layout.fillHeight: true
height: root.size * 3
cellWidth: root.size
cellHeight: root.size
clip: true
ScrollBar.vertical: ScrollBar {}
maximumFlickVelocity: 1250
boundsBehavior: GridView.StopAtBounds
model: emojiModel
}
}
ListModel { id: folder_activities_clothing }
ListModel { id: folder_expressions }
ListModel { id: folder_food_drink_herbs }
ListModel { id: folder_gsr }
ListModel { id: folder_nature }
ListModel { id: folder_objects }
ListModel { id: folder_people }
ListModel { id: folder_symbols }
ListModel { id: folder_travel_places }
ListModel { id: folder_utils }
ListModel { id: folder_other }
ListModel { id: folder_search }
DelegateModel {
id: emojiModel
model: folder_expressions
delegate: Item {
width: root.size
height: root.size
Image {
id: img
//source: "file://" + gcd.binaryPath + "/assets/mutstd/" + code + ".webp"
source: gcd.assetPath + "mutstd/" + code + ".webp"
width: root.size * (mouseArea.pressed ? 0.7 : 0.8)
height: width
anchors.centerIn: parent
property string shortcode: code
ToolTip.visible: mouseArea.containsMouse
ToolTip.text: desc + "\n:" + shortcode + ":"
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
onClicked: root.picked(img.shortcode)
}
}
}
Component.onCompleted: updatefilters()
function clearall() {
folder_activities_clothing.clear()
folder_expressions.clear()
folder_food_drink_herbs.clear()
folder_gsr.clear()
folder_nature.clear()
folder_objects.clear()
folder_people.clear()
folder_symbols.clear()
folder_travel_places.clear()
folder_utils.clear()
folder_other.clear()
folder_search.clear()
}
function updatefilters() {
clearall()
for (var i in Mutant.standard.manifest) {
if (typeof Mutant.standard.manifest[i].morph !== "undefined" && Mutant.standard.manifest[i].morph != root.morph)
continue;
if (typeof Mutant.standard.manifest[i].color !== "undefined" && Mutant.standard.manifest[i].color != root.color)
continue;
if (txtSearch.text != "" && !(Mutant.standard.manifest[i].code.includes(txtSearch.text) || Mutant.standard.manifest[i].desc.includes(txtSearch.text))) {
continue;
}
var model = folder_other
if (txtSearch.text == "") {
switch(Mutant.standard.manifest[i].cat) {
case "activities_clothing": model = folder_activities_clothing; break;
case "expressions": model = folder_expressions; break;
case "symbols": model = folder_symbols; break;
case "food_drink_herbs": model = folder_food_drink_herbs; break;
case "gsr": model = folder_gsr; break;
case "nature": model = folder_nature; break;
case "objects": model = folder_objects; break;
case "people": model = folder_people; break;
case "travel_places": model = folder_travel_places; break;
case "utils": model = folder_utils; break;
}
} else {
model = folder_search
}
model.append({
cat: Mutant.standard.manifest[i].cat,
code: Mutant.standard.manifest[i].code,
color: Mutant.standard.manifest[i].color,
morph: Mutant.standard.manifest[i].morph,
desc: Mutant.standard.manifest[i].desc
})
}
}
}
onSlideopen: animOpen.start()
onSlideclosed: animClose.start()
}

View File

@ -1,50 +0,0 @@
/****************************************************************************
**
** The MIT License (MIT)
**
** Copyright (c) 2014 Ricardo do Valle Flores de Oliveira
**
** $BEGIN_LICENSE:MIT$
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
** in the Software without restriction, including without limitation the rights
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
** copies of the Software, and to permit persons to whom the Software is
** furnished to do so, subject to the following conditions:
**
** The above copyright notice and this permission notice shall be included in
** all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
** SOFTWARE.
**
** $END_LICENSE$
**
****************************************************************************/
import QtQuick 2.0
import "controls" as Awesome
Item {
id: awesome
property alias icons: variables
property alias loaded: loader.loaded
property alias resource: loader.resource
readonly property string family: "FontAwesome"
Awesome.Loader {
id: loader
}
Awesome.Variables {
id: variables
}
}

View File

@ -1,28 +0,0 @@
import QtQuick 2.12
import "../theme"
Column {
width: parent.width
anchors.horizontalCenter: parent.horizontalCenter
Rectangle {
height: 10
color:"transparent"
width: parent.width
}
Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
height: 1
width: parent.width * 0.95
color: Theme.dropShadowColor
}
Rectangle {
height: 10
color:"transparent"
width: parent.width
}
}

View File

@ -1,63 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../fonts/Twemoji.js" as T
import "." as Widgets
import "../theme"
Rectangle {
id: root
property color backgroundColor: parent.color
property color hilightBackgroundColor: backgroundColor
property bool isHover: false
color: isHover ? backgroundColor : hilightBackgroundColor
property alias iconColor: iconColorOverlay.color
property alias source: srcImg.source
signal clicked()
Image {
id: srcImg
anchors.fill: parent
antialiasing: true
smooth: true
visible: false
// Apparently qml can now only DOWN-SCALE/SHRINK the SVG, so with this hack it which won't cause blurriness/pixelation
sourceSize.width: root.width*2
sourceSize.height: root.height*2
}
ColorOverlay{
id: iconColorOverlay
anchors.fill: srcImg
source: srcImg
antialiasing: true
smooth: true
}
MouseArea { // Full row mouse area triggering onClick
id: ma
anchors.fill: parent
hoverEnabled: true
onClicked: { root.clicked() }
onEntered: {
isHover = true
}
onExited: {
isHover = false
}
}
}

View File

@ -1,49 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.13
import QtQuick.Controls.Styles 1.4
import QtGraphicalEffects 1.12
import "." as Widgets
import "../theme"
// IconTextField integrates a text field and an icon
TextField {
color: Theme.mainTextColor
font.pixelSize: Theme.secondaryTextSize * gcd.themeScale * gcd.themeScale
width: parent.width - 20
property alias icon: icon_.source
signal clicked
smooth: true
placeholderTextColor: Theme.altTextColor
background: Rectangle {
radius: 10
color: Theme.backgroundMainColor
border.color: Theme.backgroundMainColor
layer.enabled: true
layer.effect: DropShadow {
transparentBorder: true
horizontalOffset: 0
verticalOffset: 0
samples: 10
radius: 8
color: Theme.dropShadowColor
}
}
Widgets.Icon {
id: icon_
anchors.right: parent.right
anchors.rightMargin: 4
anchors.verticalCenter: parent.verticalCenter
height: parent.height-4;
width: parent.height-4;
iconColor: Theme.altTextColor
backgroundColor: Theme.backgroundMainColor
}
}

View File

@ -1,92 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../widgets" as Widgets
Item {
id: root
height: lbl.visible ? lbl.height : txt.height + (gcd.os == "android" ? btn.height + 3 : 0) //lbl.height
implicitHeight: height //lbl.height
property alias text: lbl.text
signal updated
Text { // DISPLAY THE TEXT IN READONLY MODE
id: lbl
fontSizeMode: Text.HorizontalFit
font.pixelSize: 36
minimumPixelSize: 8
horizontalAlignment: Text.AlignHCenter
textFormat: Text.PlainText
anchors.horizontalCenter: parent.horizontalCenter
}
Image {
id: img
anchors.left: lbl.right
anchors.leftMargin: 3
source: gcd.assetPath + "fontawesome/solid/edit.svg"
height: 16
sourceSize.height: 16
}
MouseArea {
anchors.fill: lbl
onClicked: {
lbl.visible = img.visible = false
txt.visible = true
if (gcd.os == "android") btn.visible = true
txt.text = lbl.text
txt.selectAll()
txt.focus = true
}
}
TextEdit { // MAKE IT AN EDITOR WHEN EDITING
id: txt
text: root.text
visible: false
selectByMouse: true
font.pixelSize: lbl.font.pixelSize
anchors.horizontalCenter: parent.horizontalCenter
onActiveFocusChanged: {
if (!activeFocus) {
save()
}
}
Keys.onReturnPressed: {
if (event.modifiers == Qt.NoModifier) {
save()
}
}
function save() {
root.text = txt.text
txt.visible = btn.visible = false
lbl.visible = img.visible = true
root.updated(txt.text)
}
}
Widgets.Button {
id: btn
anchors.top: txt.bottom
anchors.topMargin: 3
anchors.horizontalCenter: parent.horizontalCenter
visible: false
text: qsTr("Update")
onClicked: txt.save()
}
}

View File

@ -1,192 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "controls" as Awesome
Item {
id: root
anchors.left: fromMe ? undefined : parent.left
anchors.right: fromMe ? parent.right : undefined
height: Math.max(imgProfile.height, rectMessageBubble.height)
property string message
property string rawMessage
property string from
property string handle
property string displayName
property string messageID
property bool fromMe
property bool ackd
property alias timestamp: ts.text
property alias image: imgProfile.source
property string error
Connections {
target: gcd
onAcknowledged: function(mid) {
if (mid == messageID) {
root.ackd = true
}
}
onGroupSendError: function(mid, error) {
if (mid == messageID) {
root.error = error
}
}
}
Portrait {
id: imgProfile
anchors.left: parent.left
// TODO: currently unused?
//handle: root.from
visible: !fromMe
//showStatus: false
//highlight: ima.containsMouse
ToolTip.visible: ima.containsMouse
//: Click to DM
ToolTip.text: qsTr("dm-tooltip")
MouseArea {
id: ima
anchors.fill: parent
hoverEnabled: overlay.inGroup
onClicked: {
gcd.createContact(from)
gcd.broadcast("ResetMessagePane")
theStack.pane = theStack.messagePane
gcd.loadMessagesPane(from)
overlayStack.overlay = overlayStack.chatOverlay
}
}
}
Rectangle { // THIS IS JUST A PRETTY MESSAGE-HOLDING RECTANGLE
id: rectMessageBubble
height: colMessageBubble.height + 8
width: colMessageBubble.width + 6
color: fromMe ? "#B09CBC" : "#4B3557"
radius: 5
// the console will complain constantly about me setting these anchors, but qt only allows margins if they've been set to something
// a kludge to fix this would be to have spacers before/after and set the widths according to the side they're on ^ea
anchors.left: fromMe ? undefined : imgProfile.right //parent.left
anchors.right: fromMe ? parent.right : undefined
anchors.leftMargin: 5
anchors.rightMargin: 9
anchors.topMargin: 5
ColumnLayout {
id: colMessageBubble
Column { // combine these into one element or else childrenRect won't play nicely
TextEdit { // this is used as a helper to calculate the message box width
id: dummy
visible: false
padding: 6
leftPadding: 10
font.pixelSize: gcd.themeScale * 12
wrapMode: TextEdit.NoWrap
text: lbl.text
textFormat: Text.RichText
}
TextEdit { // this is the actual text display
id: lbl
text: parse(message, 12, true)
color: "#FFFFFF"
padding: 6
leftPadding: 10
font.pixelSize: gcd.themeScale * 12
selectByMouse: gcd.os != "android"
readOnly: true
width: Math.min(dummy.width, root.parent.width - (imgProfile.visible ? imgProfile.width : 0) - 40)
wrapMode: TextEdit.Wrap
textFormat: Text.RichText
}
}
RowLayout {
id: rowBottom
anchors.left: parent.left
anchors.right: parent.right
Label { // TIMESTAMP
id: ts
color: "#FFFFFF"
font.pixelSize: 10 * gcd.themeScale
anchors.left: parent.left
leftPadding: 10
}
Label { // DISPLAY NAME FOR GROUPS
color: "#FFFFFF"
font.pixelSize: 10 * gcd.themeScale
anchors.right: parent.right
text: displayName.length > 12 ? displayName.substr(0,12) + "..." : displayName
visible: !fromMe
ToolTip.text: from
ToolTip.visible: ma2.containsMouse
ToolTip.delay: 200
MouseArea {
id: ma2
anchors.fill: parent
hoverEnabled: true
}
}
Image { // ACKNOWLEDGEMENT ICON
id: ack
anchors.right: parent.right
source: root.error != "" ? gcd.assetPath + "fontawesome/regular/window-close.svg" : (root.ackd ? gcd.assetPath + "fontawesome/regular/check-circle.svg" : gcd.assetPath + "fontawesome/regular/hourglass.svg")
height: 10 * gcd.themeScale
sourceSize.height: 10 * gcd.themeScale
visible: fromMe
ToolTip.visible: ma.containsMouse
ToolTip.delay: 200
//: Could not send this message
ToolTip.text: root.error != "" ? qsTr("could-not-send-msg-error") + ":" + root.error : (root.ackd ? qsTr("acknowledged-label") : qsTr("pending-label"))
MouseArea {
id: ma
anchors.fill: parent
hoverEnabled: true
}
}
}
}
TextEdit {
id: copyhelper
visible: false
text: root.rawMessage
}
MouseArea {
anchors.fill: gcd.os == "android" ? parent : null
onPressAndHold: {
copyhelper.selectAll()
copyhelper.copy()
gcd.popup("message copied")
}
}
}
}

View File

@ -1,155 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import QtQuick.Controls 1.4
import "." as Widgets
import "../styles"
import "../theme"
Item {
id: root
anchors.fill: parent
width: parent.width
height: profile.height
implicitHeight: profile.height
property string image
property string nick
property string onion
property string tag
property bool dualPane: false
property real logscale: 4 * Math.log10(gcd.themeScale + 1)
onDualPaneChanged: { realignProfile() }
function realignProfile() {
if (dualPane) {
profile.height = 78 * logscale
portrait.baseWidth = 78 * logscale
portrait.height = 78 * logscale
portrait.anchors.horizontalCenter = undefined
portrait.anchors.left = profile.left
portrait.anchors.leftMargin = 25 * logscale
nameRow.anchors.right = undefined
nameRow.anchors.left = portrait.right
nameRow.anchors.top = undefined
nameRow.anchors.verticalCenter = portrait.verticalCenter
nameCenter.anchors.horizontalCenter = undefined
nameCenter.anchors.left = nameRow.left
} else {
profile.height = (150 * logscale)
portrait.baseWidth = 100 * logscale
portrait.height = 100 * logscale
portrait.anchors.left = undefined
portrait.anchors.leftMargin = undefined
portrait.anchors.horizontalCenter = profile.horizontalCenter
nameRow.anchors.left = profile.left
nameRow.anchors.right = profile.right
nameRow.anchors.verticalCenter = undefined
nameRow.anchors.top = portrait.bottom
nameCenter.anchors.left = undefined
nameCenter.anchors.horizontalCenter = nameRow.horizontalCenter
}
}
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
width: parent.width
id: profile
color: Theme.backgroundMainColor
Portrait {
id: portrait
source: root.image
badgeColor: Theme.portraitProfileBadgeColor
portraitBorderColor: Theme.portraitOnlineBorderColor
portraitColor: Theme.portraitOnlineBackgroundColor
badgeContent: Image {// Profle Type
id: profiletype
source: tag == "v1-userPassword" ? gcd.assetPath + "/fontawesome/solid/lock.svg" : gcd.assetPath + "/fontawesome/solid/lock-open.svg"
height: Theme.badgeTextSize * gcd.themeScale
width: height
}
}
Rectangle {
id: nameRow
height: name.height
onWidthChanged: { name.textResize() }
color: Theme.backgroundMainColor
Rectangle {
id: nameCenter
width: name.width + addBtn.width
EllipsisLabel {
id: name
anchors.right: undefined
anchors.left: undefined
color: Theme.portraitOnlineTextColor
pixelSize: Theme.usernameSize * gcd.themeScale
weight: Font.Bold
text: nick
extraPadding: addBtn.width + 30
container: nameRow
}
Widgets.Button { // Add Button
id: addBtn
anchors.left: name.right
anchors.top: name.top
icon: "solid/plus"
height: name.height
width: height
radius: width * 0.3
onClicked: {
}
}
}
}
}
Connections {
target: gcd
onUpdateMyProfile: function(_nick, _onion, _image, _tag) {
nick = _nick
onion = _onion
image = _image
tag = _tag
//realignProfile()
}
onResetProfile: { realignProfile() }
}
}

View File

@ -1,71 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import CustomQmlTypes 1.0
import "../theme"
Item {
id: imgProfile
implicitWidth: baseWidth
implicitHeight: baseWidth
property string source
property alias badgeColor: badge.color
property real logscale: 4 * Math.log10(gcd.themeScale + 1)
property int baseWidth: 78 * logscale
height: 78 * logscale
property alias portraitBorderColor: mainImage.color
property alias portraitColor: imageInner.color
property alias badgeVisible: badge.visible
property alias badgeContent: badge.content
Rectangle {
id: mainImage
//anchors.leftMargin: baseWidth * 0.1
anchors.horizontalCenter: parent.horizontalCenter
width: baseWidth * 0.8
height: width
anchors.verticalCenter: parent.verticalCenter
color: Theme.portraitOfflineBorderColor
radius: width / 2
Rectangle {
id: imageInner
width: parent.width - 4
height: width
color: Theme.portraitOfflineBorderColor
radius: width / 2
anchors.centerIn:parent
Image { // PROFILE IMAGE
id: img
source: gcd.assetPath + imgProfile.source
anchors.fill: parent
fillMode: Image.PreserveAspectFit
visible: false
}
Image { // CIRCLE MASK
id: mask
fillMode: Image.PreserveAspectFit
visible: false
source: "qrc:/qml/images/extra/clipcircle.png"
}
OpacityMask {
anchors.fill: img
source: img
maskSource: mask
}
}
}
Badge {
id: badge
}
}

View File

@ -1,141 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import CustomQmlTypes 1.0
import "../styles"
import "../widgets" as Widgets
import "../theme"
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
Item { // LOTS OF NESTING TO DEAL WITH QT WEIRDNESS, SORRY
id: crItem
anchors.left: parent.left
anchors.right: parent.right
height: 78 * logscale + 3
implicitHeight: 78 * logscale + 3 //height
property real logscale: 4 * Math.log10(gcd.themeScale + 1)
property string displayName
property alias image: portrait.source
property string handle
property bool isActive
property bool isHover
property string tag // profile version/type
property alias badgeColor: portrait.badgeColor
property alias portraitBorderColor: portrait.portraitBorderColor
property alias portraitColor: portrait.portraitColor
property alias nameColor: cn.color
property alias onionColor: onion.color
property alias onionVisible: onion.visible
property alias badgeVisible: portrait.badgeVisible
property alias badgeContent: portrait.badgeContent
property alias hoverEnabled: buttonMA.hoverEnabled
property alias content: extraMeta.children
// TODO: should be in ContactRow
property bool blocked
signal clicked(string handle)
Rectangle { // CONTACT ENTRY BACKGROUND COLOR
id: crRect
anchors.left: parent.left
anchors.right: parent.right
height: crItem.height
width: parent.width
color: isHover ? Theme.backgroundPaneColor : (isActive ? Theme.backgroundPaneColor : Theme.backgroundMainColor)
Portrait {
id: portrait
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 25 * logscale
}
ColumnLayout {
id: portraitMeta
anchors.left: portrait.right
anchors.right: parent.right
anchors.leftMargin: 4 * logscale
anchors.verticalCenter: parent.verticalCenter
spacing: 2 * gcd.themeScale
EllipsisLabel { // CONTACT NAME
id: cn
pixelSize: Theme.usernameSize * gcd.themeScale
weight: Font.Bold
strikeout: blocked
text: displayName
}
EllipsisLabel { // Onion
id: onion
text: handle
pixelSize: Theme.secondaryTextSize * gcd.themeScale
strikeout: blocked
}
onWidthChanged: {
cn.textResize()
onion.textResize()
}
}
Column {
id: extraMeta
anchors.left: portraitMeta.right
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea { // Full row mouse area triggering onClick
id: buttonMA
anchors.fill: parent
hoverEnabled: true
onClicked: { crItem.clicked(crItem.handle) }
onEntered: {
isHover = true
}
onExited: {
isHover = false
}
}
Connections { // UPDATE UNREAD MESSAGES COUNTER
target: gcd
onResetMessagePane: function() {
isActive = false
}
onUpdateContactBlocked: function(_handle, _blocked) {
if (handle == _handle) {
blocked = _blocked
}
}
onUpdateContactDisplayName: function(_handle, _displayName) {
if (handle == _handle) {
displayName = _displayName + (blocked == true ? " (blocked)" : "")
}
}
onUpdateContactPicture: function(_handle, _image) {
if (handle == _handle) {
image = _image
}
}
}
}

View File

@ -1,124 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../theme"
ColumnLayout {
id: root
MouseArea {
anchors.fill: parent
onClicked: {
forceActiveFocus()
}
}
Flickable { // Profile List
id: sv
clip: true
Layout.minimumHeight: 100
Layout.fillHeight: true
Layout.minimumWidth: parent.width
Layout.maximumWidth: parent.width
contentWidth: colContacts.width
contentHeight: colContacts.height
boundsBehavior: Flickable.StopAtBounds
maximumFlickVelocity: 400
ScrollBar.vertical: ScrollBar {
policy: ScrollBar.AlwaysOn
}
ColumnLayout {
id: colContacts
width: root.width
spacing: 0
Connections { // ADD/REMOVE CONTACT ENTRIES
target: gcd
onAddProfile: function(handle, displayName, image, tag) {
// don't add duplicates
for (var i = 0; i < profilesModel.count; i++) {
if (profilesModel.get(i)["_handle"] == handle) {
return
}
}
// find index for insert (sort by onion)
var index = profilesModel.count
for (var i = 0; i < profilesModel.count; i++) {
if (profilesModel.get(i)["_handle"] > handle) {
index = i
break
}
}
profilesModel.insert(index,
{
_handle: handle,
_displayName: displayName,
_image: image,
_tag: tag,
_status: 4,
})
}
/*
onRemoveProfile: function(handle) {
for(var i = 0; i < profilesModel.count; i++){
if(profilesModel.get(i)["_handle"] == handle) {
console.log("deleting contact " + profilesModel.get(i)["_handle"])
profilesModel.remove(i)
return
}
}
}*/
onResetProfileList: function() {
profilesModel.clear()
}
}
ListModel { // Profile OBJECTS ARE STORED HERE ...
id: profilesModel
}
Repeater {
id: profileList
model: profilesModel // ... AND DISPLAYED HERE
delegate: ProfileRow {
handle: _handle
displayName: _displayName
image: _image
blocked: false
tag: _tag
}
}
PortraitRow {
handle: ""
displayName: qsTr("add-new-profile-btn")
nameColor: Theme.mainTextColor
image: "/fontawesome/regular/user.svg"
tag: ""
portraitBorderColor: Theme.portraitOnlineBorderColor
portraitColor: Theme.portraitOnlineBackgroundColor
badgeVisible: true
badgeContent: Image {
source: gcd.assetPath + "/fontawesome/solid/plus.svg"
height: Theme.badgeTextSize * gcd.themeScale
width: height
}
badgeColor: Theme.defaultButtonColor
onClicked: function(handle) { profileAddEditPane.reset(); parentStack.pane = parentStack.addEditProfilePane }
}
}
}
}

View File

@ -1,56 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import CustomQmlTypes 1.0
import "../styles"
import "../widgets" as Widgets
import "../theme"
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
PortraitRow {
badgeColor: Theme.portraitProfileBadgeColor
portraitBorderColor: Theme.portraitOnlineBorderColor
portraitColor: Theme.portraitOnlineBackgroundColor
nameColor: Theme.portraitOnlineTextColor
onionColor: Theme.portraitOnlineTextColor
badgeContent: Image {// Profle Type
id: profiletype
source: tag == "v1-userPassword" ? gcd.assetPath + "/fontawesome/solid/lock.svg" : gcd.assetPath + "/fontawesome/solid/lock-open.svg"
height: Theme.badgeTextSize * gcd.themeScale
width: height
}
Widgets.Button {// Edit BUTTON
id: btnEdit
icon: "solid/user-edit"
anchors.right: parent.right
//rectUnread.left
anchors.verticalCenter: parent.verticalCenter
anchors.leftMargin: 1 * gcd.themeScale
anchors.rightMargin: 20 * gcd.themeScale
height: parent.height * 0.75
onClicked: {
profileAddEditPane.load(handle, displayName, tag)
parentStack.pane = parentStack.addEditProfilePane
}
}
onClicked: function openClick(handle) {
gcd.broadcast("ResetMessagePane");
gcd.broadcast("ResetProfile");
gcd.selectedProfile = handle
gcd.loadProfile(handle)
parentStack.pane = parentStack.profilePane
}
}

View File

@ -1,27 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.13
RadioButton {
id: control
property real size: 12
spacing: 0
indicator: Rectangle {
width: 16 * gcd.themeScale
height: 16 * gcd.themeScale
anchors.verticalCenter: parent.verticalCenter
radius: 9
border.width: 1
Rectangle {
anchors.fill: parent
visible: control.checked
color: "black"
radius: 9
anchors.margins: 4
}
}
}

View File

@ -1,15 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
Label {
font.pixelSize: gcd.themeScale * size
wrapMode: Text.WordWrap
color: "#000000"
textFormat: Text.PlainText
property real size: 12
}

View File

@ -1,186 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.4
import "." as Widgets
import "../theme"
// Statusbar is a app wide 10-25 tall bar that should be place at the bottom of the app that gives network health information
// it changes color and text/icon message based on network health. when netowrk is not healthy it is always in fullsized mode
// when network is health it reduces to a minimal color strip unless mouse overed / clicked to reveal the text/icons
Rectangle {
id: statusbar
property int status: statusDisconnectedInternet
readonly property int statusDisconnectedInternet: 0
readonly property int statusDisconnectedTor: 1
readonly property int statusConnecting: 2
readonly property int statusOnline: 3
readonly property int openHeight: 25
readonly property int hideHeight: 10
property bool isHover: false
height: openHeight
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
Text {
id: statusMessage
opacity: 0
anchors.right: networkStatus.left
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: 5 * gcd.themeScale
font.pixelSize: Theme.statusTextSize * gcd.themeScale
}
Icon {
id: networkStatus
opacity: 0
anchors.right: connectionStatus.left
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: 5 * gcd.themeScale
height: 18
width: 18
}
Icon {
id: connectionStatus
opacity: 0
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.rightMargin: 10 * gcd.themeScale
height: 18 * gcd.themeScale
width: 18 * gcd.themeScale
}
function changeStatus() {
if (status == statusDisconnectedInternet) {
statusbar.color = Theme.statusbarDisconnectedInternetColor
statusMessage.color = Theme.statusbarDisconnectedInternetFontColor
networkStatus.iconColor = Theme.statusbarDisconnectedInternetFontColor
networkStatus.source = gcd.assetPath + "core/signal_cellular_off-24px.svg"
connectionStatus.iconColor = Theme.statusbarDisconnectedInternetFontColor
connectionStatus.source = gcd.assetPath + "core/syncing-03.svg"
//: Disconnected from the internet, check your connection
statusMessage.text = qsTr("network-status-disconnected")
show()
} else if (status == statusDisconnectedTor) {
statusbar.color = Theme.statusbarDisconnectedTorColor
statusMessage.color = Theme.statusbarDisconnectedTorFontColor
networkStatus.iconColor = Theme.statusbarDisconnectedTorFontColor
networkStatus.source = gcd.assetPath + "core/signal_cellular_connected_no_internet_4_bar-24px.svg"
connectionStatus.iconColor = Theme.statusbarDisconnectedTorFontColor
connectionStatus.source = gcd.assetPath + "core/syncing-03.svg"
//: Attempting to connect to Tor network
statusMessage.text = qsTr("network-status-attempting-tor")
show()
} else if (status == statusConnecting) {
statusbar.color = Theme.statusbarConnectingColor
statusMessage.color = Theme.statusbarConnectingFontColor
networkStatus.iconColor = Theme.statusbarConnectingFontColor
networkStatus.source = gcd.assetPath + "core/signal_cellular_connected_no_internet_4_bar-24px.svg"
connectionStatus.iconColor = Theme.statusbarConnectingFontColor
connectionStatus.source = gcd.assetPath + "core/syncing-02.svg"
//: Connecting...
statusMessage.text = qsTr("network-status-connecting")
show()
} else {
statusbar.color = Theme.statusbarOnlineColor
statusMessage.color = Theme.statusbarOnlineFontColor
networkStatus.iconColor = Theme.statusbarOnlineFontColor
networkStatus.source = gcd.assetPath + "core/signal_cellular_4_bar-24px.svg"
connectionStatus.iconColor = Theme.statusbarOnlineFontColor
connectionStatus.source = gcd.assetPath + "core/syncing-01.svg"
//: Online
statusMessage.text = qsTr("network-status-online")
hide()
}
}
MouseArea {
id: ma
anchors.fill: parent
hoverEnabled: true
SequentialAnimation {
id: showAnim
PropertyAnimation { id: openStatus; target: statusbar; property: "height"; to: openHeight}
ParallelAnimation {
PropertyAnimation { id: showStatus; target: statusMessage; property: "opacity"; to: 1}
PropertyAnimation { id: showNetIcon; target: networkStatus; property: "opacity"; to: 1}
PropertyAnimation { id: showConnIcon; target: connectionStatus; property: "opacity"; to: 1}
}
}
SequentialAnimation {
id: hideAnim
ParallelAnimation {
PropertyAnimation { id: hideStatus; target: statusMessage; property: "opacity"; to: 0}
PropertyAnimation { id: hideNetIcon; target: networkStatus; property: "opacity"; to: 0}
PropertyAnimation { id: hideConnIcon; target: connectionStatus; property: "opacity"; to: 0}
}
PropertyAnimation { id: closeStatus; target: statusbar; property: "height"; to: hideHeight; duration: 200 }
}
onEntered: {
isHover = true
show()
}
onExited: {
isHover = false
hide()
}
onPressed: {
isHover = true
show()
}
onReleased: {
isHover = false
hide()
}
}
function resetHeight() {
if (isHover || status != statusOnline) {
height = openHeight
} else {
height = hideHeight
}
}
function show() {
if (isHover || status != statusOnline) {
hideAnim.stop()
showAnim.start()
}
}
function hide() {
if (!isHover && status == statusOnline) {
showAnim.stop()
hideAnim.start()
}
}
onStatusChanged: { changeStatus() }
Component.onCompleted: { resetHeight() }
Connections {
target: gcd
onTorStatus: function(code) {
status = code
}
}
}

View File

@ -1,16 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.13
TextField {
color: "black"
font.pointSize: 10 * gcd.themeScale
width: 100
background: Rectangle {
radius: 2
color: windowItem.cwtch_background_color
border.color: windowItem.cwtch_color
}
}

View File

@ -1,32 +0,0 @@
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick 2.12
import "../theme"
// ToggleSwtch implements a stylized toggle switch. It requires the user create a function called onToggled to
// perform any additional operations needed to define the behavior of the toggle switch
Switch {
property bool isToggled
property var onToggled: function () { console.log("In Superclass") };
style: SwitchStyle {
handle: Rectangle {
implicitWidth: 25
implicitHeight: 25
radius: width*0.5
color: Theme.toggleColor
border.color: isToggled ? Theme.toggleOnColor :Theme.toggleOffColor
border.width:5
}
groove: Rectangle {
implicitWidth: 50
implicitHeight: 25
radius: 25*0.5
color: isToggled ? Theme.toggleOnColor :Theme.toggleOffColor
}
}
onClicked: function() {isToggled = !isToggled; onToggled()}
}

View File

@ -1,123 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import "../fonts/Twemoji.js" as T
import "." as Widgets
import "../theme"
Rectangle { // Global Toolbar
id: toolbar
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
height: 35 * gcd.themeScale
Layout.minimumHeight: height
Layout.maximumHeight: height
color: Theme.backgroundMainColor
property alias leftMenuVisible: btnLeftMenu.visible
property alias backVisible: btnLeftBack.visible
property alias rightMenuVisible: btnRightMenu.visible
property alias titleWidth: paneArea.width
signal leftMenu()
signal back()
signal rightMenu()
Icon {
id: btnLeftMenu
iconColor: Theme.toolbarIconColor
source: gcd.assetPath + "core/menu-24px.svg"
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
width: 30
height: 30
onClicked: { leftMenu() }
}
Icon {
id: btnLeftBack
iconColor: Theme.toolbarIconColor
source: gcd.assetPath + "core/chevron_left-24px.svg"
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
width: 30
height: 30
onClicked: { back() }
}
Rectangle {
id: paneArea
anchors.right: parent.right
EllipsisLabel {
id: paneTitle
visible: true
anchors.left: undefined
anchors.right: undefined
anchors.horizontalCenter: parent.horizontalCenter
color: Theme.mainTextColor
pixelSize: Theme.tabSize * gcd.themeScale
weight: Font.Bold
text: "global toolbar"
//extraPadding: btnRightMenu.width + 10
}
onWidthChanged: { paneTitle.textResize() }
}
Icon {
id: btnRightMenu
iconColor: Theme.toolbarIconColor
source: gcd.assetPath + "core/more_vert-24px.svg"
visible: false
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
width: 30
height: 30
onClicked: { rightMenu() }
}
function setTitle(text, width) {
paneTitle.text = text
paneArea.width = width
paneTitle.textResize()
paneTitle.visible = true
}
function hideTitle() {
paneTitle.visible = false
}
Connections {
target: gcd
onSetToolbarTitle: function(handle) {
setTitle(handle, theStack.width)
btnRightMenu.visible = true
}
}
}

View File

@ -1,34 +0,0 @@
import QtQuick 2.7
import QtQuick.Controls 2.13
import QtQuick.Controls.Styles 1.4
import QtGraphicalEffects 1.12
import "." as Widgets
import "../theme"
// UnderlineTextField is a textfield styled as just an underline
TextField {
property alias backgroundColor: bg.color
color: Theme.mainTextColor
font.pixelSize: Theme.secondaryTextSize * gcd.themeScale * gcd.themeScale
signal clicked
smooth: true
placeholderTextColor: Theme.altTextColor
background: Rectangle {
id: bg
anchors.fill: parent
color: Theme.backgroundMainColor
border.color: color
}
Rectangle {
id: bottomBar
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
height: 2
color: Theme.mainTextColor
}
}

View File

@ -1,43 +0,0 @@
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.11
import QtQuick.Controls 1.4
Rectangle {
width: img.width + 10
height: img.height + 5
property string emoji
color: selected ? windowItem.cwtch_color : windowItem.cwtch_background_color
property bool selected
property string locale
Image {
id: img
anchors.centerIn:parent
opacity: 1.0
source: gcd.assetPath + "twemoji/72x72/" + emoji + ".png"
MouseArea {
anchors.fill: parent
onClicked: {
gcd.setLocale(locale)
}
}
}
Connections {
target: gcd
onSupplySettings: function(zoom, newLocale) {
selected = newLocale == locale
}
}
}

View File

@ -1,33 +0,0 @@
import QtQuick 2.4
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
Item {
id: root
property alias source: img.source
property int size: 24
property string tooltip: ""
width: size
height: size
signal clicked()
ToolTip.visible: tooltip != "" && ma.containsMouse
ToolTip.text: tooltip
Image {
id: img
width: root.size * (ma.pressed ? 0.5 : 0.8)
height: root.size * (ma.pressed ? 0.5 : 0.8)
anchors.topMargin: ma.pressed ? 2 : 0
anchors.leftMargin: anchors.topMargin
anchors.centerIn: parent
}
MouseArea {
id: ma
anchors.fill: root
onClicked: root.clicked()
hoverEnabled: tooltip != ""
}
}

View File

@ -1,38 +0,0 @@
/****************************************************************************
**
** The MIT License (MIT)
**
** Copyright (c) 2014 Ricardo do Valle Flores de Oliveira
**
** $BEGIN_LICENSE:MIT$
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
** in the Software without restriction, including without limitation the rights
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
** copies of the Software, and to permit persons to whom the Software is
** furnished to do so, subject to the following conditions:
**
** The above copyright notice and this permission notice shall be included in
** all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
** SOFTWARE.
**
** $END_LICENSE$
**
****************************************************************************/
import QtQuick 2.0
FontLoader {
property string resource
property bool loaded: false
source: resource
onStatusChanged: (status === FontLoader.Ready) ? loaded = true : loaded = false
}

View File

@ -1,580 +0,0 @@
/****************************************************************************
**
** The MIT License (MIT)
**
** Copyright (c) 2014 Ricardo do Valle Flores de Oliveira
**
** $BEGIN_LICENSE:MIT$
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
** in the Software without restriction, including without limitation the rights
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
** copies of the Software, and to permit persons to whom the Software is
** furnished to do so, subject to the following conditions:
**
** The above copyright notice and this permission notice shall be included in
** all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
** SOFTWARE.
**
** $END_LICENSE$
**
****************************************************************************/
import QtQuick 2.0
QtObject {
readonly property string fa_adjust : "\uf042"
readonly property string fa_adn : "\uf170"
readonly property string fa_align_center : "\uf037"
readonly property string fa_align_justify : "\uf039"
readonly property string fa_align_left : "\uf036"
readonly property string fa_align_right : "\uf038"
readonly property string fa_ambulance : "\uf0f9"
readonly property string fa_anchor : "\uf13d"
readonly property string fa_android : "\uf17b"
readonly property string fa_angellist : "\uf209"
readonly property string fa_angle_double_down : "\uf103"
readonly property string fa_angle_double_left : "\uf100"
readonly property string fa_angle_double_right : "\uf101"
readonly property string fa_angle_double_up : "\uf102"
readonly property string fa_angle_down : "\uf107"
readonly property string fa_angle_left : "\uf104"
readonly property string fa_angle_right : "\uf105"
readonly property string fa_angle_up : "\uf106"
readonly property string fa_apple : "\uf179"
readonly property string fa_archive : "\uf187"
readonly property string fa_area_chart : "\uf1fe"
readonly property string fa_arrow_circle_down : "\uf0ab"
readonly property string fa_arrow_circle_left : "\uf0a8"
readonly property string fa_arrow_circle_o_down : "\uf01a"
readonly property string fa_arrow_circle_o_left : "\uf190"
readonly property string fa_arrow_circle_o_right : "\uf18e"
readonly property string fa_arrow_circle_o_up : "\uf01b"
readonly property string fa_arrow_circle_right : "\uf0a9"
readonly property string fa_arrow_circle_up : "\uf0aa"
readonly property string fa_arrow_down : "\uf063"
readonly property string fa_arrow_left : "\uf060"
readonly property string fa_arrow_right : "\uf061"
readonly property string fa_arrow_up : "\uf062"
readonly property string fa_arrows : "\uf047"
readonly property string fa_arrows_alt : "\uf0b2"
readonly property string fa_arrows_h : "\uf07e"
readonly property string fa_arrows_v : "\uf07d"
readonly property string fa_asterisk : "\uf069"
readonly property string fa_at : "\uf1fa"
readonly property string fa_automobile : "\uf1b9"
readonly property string fa_backward : "\uf04a"
readonly property string fa_ban : "\uf05e"
readonly property string fa_bank : "\uf19c"
readonly property string fa_bar_chart_o : "\uf080"
readonly property string fa_barcode : "\uf02a"
readonly property string fa_bars : "\uf0c9"
readonly property string fa_beer : "\uf0fc"
readonly property string fa_behance : "\uf1b4"
readonly property string fa_behance_square : "\uf1b5"
readonly property string fa_bell : "\uf0f3"
readonly property string fa_bell_o : "\uf0a2"
readonly property string fa_bell_slash : "\uf1f6"
readonly property string fa_bell_slash_o : "\uf1f7"
readonly property string fa_bicycle : "\uf206"
readonly property string fa_binoculars : "\uf1e5"
readonly property string fa_birthday_cake : "\uf1fd"
readonly property string fa_bitbucket : "\uf171"
readonly property string fa_bitbucket_square : "\uf172"
readonly property string fa_bitcoin : "\uf15a"
readonly property string fa_bold : "\uf032"
readonly property string fa_bolt : "\uf0e7"
readonly property string fa_bomb : "\uf1e2"
readonly property string fa_book : "\uf02d"
readonly property string fa_bookmark : "\uf02e"
readonly property string fa_bookmark_o : "\uf097"
readonly property string fa_briefcase : "\uf0b1"
readonly property string fa_btc : "\uf15a"
readonly property string fa_bug : "\uf188"
readonly property string fa_building : "\uf1ad"
readonly property string fa_building_o : "\uf0f7"
readonly property string fa_bullhorn : "\uf0a1"
readonly property string fa_bullseye : "\uf140"
readonly property string $fa_bus : "\uf207"
readonly property string fa_cab : "\uf1ba"
readonly property string $fa_calculator : "\uf1ec"
readonly property string fa_calendar : "\uf073"
readonly property string fa_calendar_o : "\uf133"
readonly property string fa_camera : "\uf030"
readonly property string fa_camera_retro : "\uf083"
readonly property string fa_car : "\uf1b9"
readonly property string fa_caret_down : "\uf0d7"
readonly property string fa_caret_left : "\uf0d9"
readonly property string fa_caret_right : "\uf0da"
readonly property string fa_caret_square_o_down : "\uf150"
readonly property string fa_caret_square_o_left : "\uf191"
readonly property string fa_caret_square_o_right : "\uf152"
readonly property string fa_caret_square_o_up : "\uf151"
readonly property string fa_caret_up : "\uf0d8"
readonly property string fa_cc : "\uf20a"
readonly property string fa_cc_amex : "\uf1f3"
readonly property string fa_cc_discover : "\uf1f2"
readonly property string fa_cc_mastercard : "\uf1f1"
readonly property string fa_cc_paypal : "\uf1f4"
readonly property string fa_cc_stripe : "\uf1f5"
readonly property string fa_cc_visa : "\uf1f0"
readonly property string fa_certificate : "\uf0a3"
readonly property string fa_chain : "\uf0c1"
readonly property string fa_chain_broken : "\uf127"
readonly property string fa_check : "\uf00c"
readonly property string fa_check_circle : "\uf058"
readonly property string fa_check_circle_o : "\uf05d"
readonly property string fa_check_square : "\uf14a"
readonly property string fa_check_square_o : "\uf046"
readonly property string fa_chevron_circle_down : "\uf13a"
readonly property string fa_chevron_circle_left : "\uf137"
readonly property string fa_chevron_circle_right : "\uf138"
readonly property string fa_chevron_circle_up : "\uf139"
readonly property string fa_chevron_down : "\uf078"
readonly property string fa_chevron_left : "\uf053"
readonly property string fa_chevron_right : "\uf054"
readonly property string fa_chevron_up : "\uf077"
readonly property string fa_child : "\uf1ae"
readonly property string fa_circle : "\uf111"
readonly property string fa_circle_o : "\uf10c"
readonly property string fa_circle_o_notch : "\uf1ce"
readonly property string fa_circle_thin : "\uf1db"
readonly property string fa_clipboard : "\uf0ea"
readonly property string fa_clock_o : "\uf017"
readonly property string fa_cloud : "\uf0c2"
readonly property string fa_cloud_download : "\uf0ed"
readonly property string fa_cloud_upload : "\uf0ee"
readonly property string fa_cny : "\uf157"
readonly property string fa_code : "\uf121"
readonly property string fa_code_fork : "\uf126"
readonly property string fa_codepen : "\uf1cb"
readonly property string fa_coffee : "\uf0f4"
readonly property string fa_cog : "\uf013"
readonly property string fa_cogs : "\uf085"
readonly property string fa_columns : "\uf0db"
readonly property string fa_comment : "\uf075"
readonly property string fa_comment_o : "\uf0e5"
readonly property string fa_comments : "\uf086"
readonly property string fa_comments_o : "\uf0e6"
readonly property string fa_compass : "\uf14e"
readonly property string fa_compress : "\uf066"
readonly property string fa_copy : "\uf0c5"
readonly property string fa_copyright : "\uf1f9"
readonly property string fa_credit_card : "\uf09d"
readonly property string fa_crop : "\uf125"
readonly property string fa_crosshairs : "\uf05b"
readonly property string fa_css3 : "\uf13c"
readonly property string fa_cube : "\uf1b2"
readonly property string fa_cubes : "\uf1b3"
readonly property string fa_cut : "\uf0c4"
readonly property string fa_cutlery : "\uf0f5"
readonly property string fa_dashboard : "\uf0e4"
readonly property string fa_database : "\uf1c0"
readonly property string fa_dedent : "\uf03b"
readonly property string fa_delicious : "\uf1a5"
readonly property string fa_desktop : "\uf108"
readonly property string fa_deviantart : "\uf1bd"
readonly property string fa_digg : "\uf1a6"
readonly property string fa_dollar : "\uf155"
readonly property string fa_dot_circle_o : "\uf192"
readonly property string fa_download : "\uf019"
readonly property string fa_dribbble : "\uf17d"
readonly property string fa_dropbox : "\uf16b"
readonly property string fa_drupal : "\uf1a9"
readonly property string fa_edit : "\uf044"
readonly property string fa_eject : "\uf052"
readonly property string fa_ellipsis_h : "\uf141"
readonly property string fa_ellipsis_v : "\uf142"
readonly property string fa_empire : "\uf1d1"
readonly property string fa_envelope : "\uf0e0"
readonly property string fa_envelope_o : "\uf003"
readonly property string fa_envelope_square : "\uf199"
readonly property string fa_eraser : "\uf12d"
readonly property string fa_eur : "\uf153"
readonly property string fa_euro : "\uf153"
readonly property string fa_exchange : "\uf0ec"
readonly property string fa_exclamation : "\uf12a"
readonly property string fa_exclamation_circle : "\uf06a"
readonly property string fa_exclamation_triangle : "\uf071"
readonly property string fa_expand : "\uf065"
readonly property string fa_external_link : "\uf08e"
readonly property string fa_external_link_square : "\uf14c"
readonly property string fa_eye : "\uf06e"
readonly property string fa_eye_slash : "\uf070"
readonly property string fa_eyedropper : "\uf1fb"
readonly property string fa_facebook : "\uf09a"
readonly property string fa_facebook_square : "\uf082"
readonly property string fa_fast_backward : "\uf049"
readonly property string fa_fast_forward : "\uf050"
readonly property string fa_fax : "\uf1ac"
readonly property string fa_female : "\uf182"
readonly property string fa_fighter_jet : "\uf0fb"
readonly property string fa_file : "\uf15b"
readonly property string fa_file_archive_o : "\uf1c6"
readonly property string fa_file_audio_o : "\uf1c7"
readonly property string fa_file_code_o : "\uf1c9"
readonly property string fa_file_excel_o : "\uf1c3"
readonly property string fa_file_image_o : "\uf1c5"
readonly property string fa_file_movie_o : "\uf1c8"
readonly property string fa_file_o : "\uf016"
readonly property string fa_file_pdf_o : "\uf1c1"
readonly property string fa_file_photo_o : "\uf1c5"
readonly property string fa_file_picture_o : "\uf1c5"
readonly property string fa_file_powerpoint_o : "\uf1c4"
readonly property string fa_file_sound_o : "\uf1c7"
readonly property string fa_file_text : "\uf15c"
readonly property string fa_file_text_o : "\uf0f6"
readonly property string fa_file_video_o : "\uf1c8"
readonly property string fa_file_word_o : "\uf1c2"
readonly property string fa_file_zip_o : "\uf1c6"
readonly property string fa_files_o : "\uf0c5"
readonly property string fa_film : "\uf008"
readonly property string fa_filter : "\uf0b0"
readonly property string fa_fire : "\uf06d"
readonly property string fa_fire_extinguisher : "\uf134"
readonly property string fa_flag : "\uf024"
readonly property string fa_flag_checkered : "\uf11e"
readonly property string fa_flag_o : "\uf11d"
readonly property string fa_flash : "\uf0e7"
readonly property string fa_flask : "\uf0c3"
readonly property string fa_flickr : "\uf16e"
readonly property string fa_floppy_o : "\uf0c7"
readonly property string fa_folder : "\uf07b"
readonly property string fa_folder_o : "\uf114"
readonly property string fa_folder_open : "\uf07c"
readonly property string fa_folder_open_o : "\uf115"
readonly property string fa_font : "\uf031"
readonly property string fa_forward : "\uf04e"
readonly property string fa_foursquare : "\uf180"
readonly property string fa_frown_o : "\uf119"
readonly property string fa_futbol_o : "\uf1e3"
readonly property string fa_gamepad : "\uf11b"
readonly property string fa_gavel : "\uf0e3"
readonly property string fa_gbp : "\uf154"
readonly property string fa_ge : "\uf1d1"
readonly property string fa_gear : "\uf013"
readonly property string fa_gears : "\uf085"
readonly property string fa_gift : "\uf06b"
readonly property string fa_git : "\uf1d3"
readonly property string fa_git_square : "\uf1d2"
readonly property string fa_github : "\uf09b"
readonly property string fa_github_alt : "\uf113"
readonly property string fa_github_square : "\uf092"
readonly property string fa_gittip : "\uf184"
readonly property string fa_glass : "\uf000"
readonly property string fa_globe : "\uf0ac"
readonly property string fa_google : "\uf1a0"
readonly property string fa_google_plus : "\uf0d5"
readonly property string fa_google_plus_square : "\uf0d4"
readonly property string fa_google_wallet : "\uf1ee"
readonly property string fa_graduation_cap : "\uf19d"
readonly property string fa_group : "\uf0c0"
readonly property string fa_h_square : "\uf0fd"
readonly property string fa_hacker_news : "\uf1d4"
readonly property string fa_hand_o_down : "\uf0a7"
readonly property string fa_hand_o_left : "\uf0a5"
readonly property string fa_hand_o_right : "\uf0a4"
readonly property string fa_hand_o_up : "\uf0a6"
readonly property string fa_hdd_o : "\uf0a0"
readonly property string fa_header : "\uf1dc"
readonly property string fa_headphones : "\uf025"
readonly property string fa_heart : "\uf004"
readonly property string fa_heart_o : "\uf08a"
readonly property string fa_history : "\uf1da"
readonly property string fa_home : "\uf015"
readonly property string fa_hospital_o : "\uf0f8"
readonly property string fa_html5 : "\uf13b"
readonly property string fa_ils : "\uf20b"
readonly property string fa_image : "\uf03e"
readonly property string fa_inbox : "\uf01c"
readonly property string fa_indent : "\uf03c"
readonly property string fa_info : "\uf129"
readonly property string fa_info_circle : "\uf05a"
readonly property string fa_inr : "\uf156"
readonly property string fa_instagram : "\uf16d"
readonly property string fa_institution : "\uf19c"
readonly property string fa_ioxhost : "\uf208"
readonly property string fa_italic : "\uf033"
readonly property string fa_joomla : "\uf1aa"
readonly property string fa_jpy : "\uf157"
readonly property string fa_jsfiddle : "\uf1cc"
readonly property string fa_key : "\uf084"
readonly property string fa_keyboard_o : "\uf11c"
readonly property string fa_krw : "\uf159"
readonly property string fa_language : "\uf1ab"
readonly property string fa_laptop : "\uf109"
readonly property string fa_lastfm : "\uf202"
readonly property string fa_lastfm_square : "\uf203"
readonly property string fa_leaf : "\uf06c"
readonly property string fa_legal : "\uf0e3"
readonly property string fa_lemon_o : "\uf094"
readonly property string fa_level_down : "\uf149"
readonly property string fa_level_up : "\uf148"
readonly property string fa_life_bouy : "\uf1cd"
readonly property string fa_life_buoy : "\uf1cd"
readonly property string fa_life_ring : "\uf1cd"
readonly property string fa_life_saver : "\uf1cd"
readonly property string fa_lightbulb_o : "\uf0eb"
readonly property string fa_line_chart : "\uf201"
readonly property string fa_link : "\uf0c1"
readonly property string fa_linkedin : "\uf0e1"
readonly property string fa_linkedin_square : "\uf08c"
readonly property string fa_linux : "\uf17c"
readonly property string fa_list : "\uf03a"
readonly property string fa_list_alt : "\uf022"
readonly property string fa_list_ol : "\uf0cb"
readonly property string fa_list_ul : "\uf0ca"
readonly property string fa_location_arrow : "\uf124"
readonly property string fa_lock : "\uf023"
readonly property string fa_long_arrow_down : "\uf175"
readonly property string fa_long_arrow_left : "\uf177"
readonly property string fa_long_arrow_right : "\uf178"
readonly property string fa_long_arrow_up : "\uf176"
readonly property string fa_magic : "\uf0d0"
readonly property string fa_magnet : "\uf076"
readonly property string fa_mail_forward : "\uf064"
readonly property string fa_mail_reply : "\uf112"
readonly property string fa_mail_reply_all : "\uf122"
readonly property string fa_male : "\uf183"
readonly property string fa_map_marker : "\uf041"
readonly property string fa_maxcdn : "\uf136"
readonly property string fa_meanpath : "\uf20c"
readonly property string fa_medkit : "\uf0fa"
readonly property string fa_meh_o : "\uf11a"
readonly property string fa_microphone : "\uf130"
readonly property string fa_microphone_slash : "\uf131"
readonly property string fa_minus : "\uf068"
readonly property string fa_minus_circle : "\uf056"
readonly property string fa_minus_square : "\uf146"
readonly property string fa_minus_square_o : "\uf147"
readonly property string fa_mobile : "\uf10b"
readonly property string fa_mobile_phone : "\uf10b"
readonly property string fa_money : "\uf0d6"
readonly property string fa_moon_o : "\uf186"
readonly property string fa_mortar_board : "\uf19d"
readonly property string fa_music : "\uf001"
readonly property string fa_navicon : "\uf0c9"
readonly property string fa_newspaper_o : "\uf1ea"
readonly property string fa_openid : "\uf19b"
readonly property string fa_outdent : "\uf03b"
readonly property string fa_pagelines : "\uf18c"
readonly property string fa_paint_brush : "\uf1fc"
readonly property string fa_paper_plane : "\uf1d8"
readonly property string fa_paper_plane_o : "\uf1d9"
readonly property string fa_paperclip : "\uf0c6"
readonly property string fa_paragraph : "\uf1dd"
readonly property string fa_paste : "\uf0ea"
readonly property string fa_pause : "\uf04c"
readonly property string fa_paw : "\uf1b0"
readonly property string fa_paypal : "\uf1ed"
readonly property string fa_pencil : "\uf040"
readonly property string fa_pencil_square : "\uf14b"
readonly property string fa_pencil_square_o : "\uf044"
readonly property string fa_phone : "\uf095"
readonly property string fa_phone_square : "\uf098"
readonly property string fa_photo : "\uf03e"
readonly property string fa_picture_o : "\uf03e"
readonly property string fa_pie_chart : "\uf200"
readonly property string fa_pied_piper : "\uf1a7"
readonly property string fa_pied_piper_alt : "\uf1a8"
readonly property string fa_pinterest : "\uf0d2"
readonly property string fa_pinterest_square : "\uf0d3"
readonly property string fa_plane : "\uf072"
readonly property string fa_play : "\uf04b"
readonly property string fa_play_circle : "\uf144"
readonly property string fa_play_circle_o : "\uf01d"
readonly property string fa_plug : "\uf1e6"
readonly property string fa_plus : "\uf067"
readonly property string fa_plus_circle : "\uf055"
readonly property string fa_plus_square : "\uf0fe"
readonly property string fa_plus_square_o : "\uf196"
readonly property string fa_power_off : "\uf011"
readonly property string fa_print : "\uf02f"
readonly property string fa_puzzle_piece : "\uf12e"
readonly property string fa_qq : "\uf1d6"
readonly property string fa_qrcode : "\uf029"
readonly property string fa_question : "\uf128"
readonly property string fa_question_circle : "\uf059"
readonly property string fa_quote_left : "\uf10d"
readonly property string fa_quote_right : "\uf10e"
readonly property string fa_ra : "\uf1d0"
readonly property string fa_random : "\uf074"
readonly property string fa_rebel : "\uf1d0"
readonly property string fa_recycle : "\uf1b8"
readonly property string fa_reddit : "\uf1a1"
readonly property string fa_reddit_square : "\uf1a2"
readonly property string fa_refresh : "\uf021"
readonly property string fa_remove : "\uf00d"
readonly property string fa_renren : "\uf18b"
readonly property string fa_reorder : "\uf0c9"
readonly property string fa_repeat : "\uf01e"
readonly property string fa_reply : "\uf112"
readonly property string fa_reply_all : "\uf122"
readonly property string fa_retweet : "\uf079"
readonly property string fa_rmb : "\uf157"
readonly property string fa_road : "\uf018"
readonly property string fa_rocket : "\uf135"
readonly property string fa_rotate_left : "\uf0e2"
readonly property string fa_rotate_right : "\uf01e"
readonly property string fa_rouble : "\uf158"
readonly property string fa_rss : "\uf09e"
readonly property string fa_rss_square : "\uf143"
readonly property string fa_rub : "\uf158"
readonly property string fa_ruble : "\uf158"
readonly property string fa_rupee : "\uf156"
readonly property string fa_save : "\uf0c7"
readonly property string fa_scissors : "\uf0c4"
readonly property string fa_search : "\uf002"
readonly property string fa_search_minus : "\uf010"
readonly property string fa_search_plus : "\uf00e"
readonly property string fa_send : "\uf1d8"
readonly property string fa_send_o : "\uf1d9"
readonly property string fa_share : "\uf064"
readonly property string fa_share_alt : "\uf1e0"
readonly property string fa_share_alt_square : "\uf1e1"
readonly property string fa_share_square : "\uf14d"
readonly property string fa_share_square_o : "\uf045"
readonly property string fa_shekel : "\uf20b"
readonly property string fa_sheqel : "\uf20b"
readonly property string fa_shield : "\uf132"
readonly property string fa_shopping_cart : "\uf07a"
readonly property string fa_sign_in : "\uf090"
readonly property string fa_sign_out : "\uf08b"
readonly property string fa_signal : "\uf012"
readonly property string fa_sitemap : "\uf0e8"
readonly property string fa_skype : "\uf17e"
readonly property string fa_slack : "\uf198"
readonly property string fa_sliders : "\uf1de"
readonly property string fa_slideshare : "\uf1e7"
readonly property string fa_smile_o : "\uf118"
readonly property string fa_soccer_ball_o : "\uf1e3"
readonly property string fa_sort : "\uf0dc"
readonly property string fa_sort_alpha_asc : "\uf15d"
readonly property string fa_sort_alpha_desc : "\uf15e"
readonly property string fa_sort_amount_asc : "\uf160"
readonly property string fa_sort_amount_desc : "\uf161"
readonly property string fa_sort_asc : "\uf0de"
readonly property string fa_sort_desc : "\uf0dd"
readonly property string fa_sort_down : "\uf0dd"
readonly property string fa_sort_numeric_asc : "\uf162"
readonly property string fa_sort_numeric_desc : "\uf163"
readonly property string fa_sort_up : "\uf0de"
readonly property string fa_soundcloud : "\uf1be"
readonly property string fa_space_shuttle : "\uf197"
readonly property string fa_spinner : "\uf110"
readonly property string fa_spoon : "\uf1b1"
readonly property string fa_spotify : "\uf1bc"
readonly property string fa_square : "\uf0c8"
readonly property string fa_square_o : "\uf096"
readonly property string fa_stack_exchange : "\uf18d"
readonly property string fa_stack_overflow : "\uf16c"
readonly property string fa_star : "\uf005"
readonly property string fa_star_half : "\uf089"
readonly property string fa_star_half_empty : "\uf123"
readonly property string fa_star_half_full : "\uf123"
readonly property string fa_star_half_o : "\uf123"
readonly property string fa_star_o : "\uf006"
readonly property string fa_steam : "\uf1b6"
readonly property string fa_steam_square : "\uf1b7"
readonly property string fa_step_backward : "\uf048"
readonly property string fa_step_forward : "\uf051"
readonly property string fa_stethoscope : "\uf0f1"
readonly property string fa_stop : "\uf04d"
readonly property string fa_strikethrough : "\uf0cc"
readonly property string fa_stumbleupon : "\uf1a4"
readonly property string fa_stumbleupon_circle : "\uf1a3"
readonly property string fa_subscript : "\uf12c"
readonly property string fa_suitcase : "\uf0f2"
readonly property string fa_sun_o : "\uf185"
readonly property string fa_superscript : "\uf12b"
readonly property string fa_support : "\uf1cd"
readonly property string fa_table : "\uf0ce"
readonly property string fa_tablet : "\uf10a"
readonly property string fa_tachometer : "\uf0e4"
readonly property string fa_tag : "\uf02b"
readonly property string fa_tags : "\uf02c"
readonly property string fa_tasks : "\uf0ae"
readonly property string fa_taxi : "\uf1ba"
readonly property string fa_tencent_weibo : "\uf1d5"
readonly property string fa_terminal : "\uf120"
readonly property string fa_text_height : "\uf034"
readonly property string fa_text_width : "\uf035"
readonly property string fa_th : "\uf00a"
readonly property string fa_th_large : "\uf009"
readonly property string fa_th_list : "\uf00b"
readonly property string fa_thumb_tack : "\uf08d"
readonly property string fa_thumbs_down : "\uf165"
readonly property string fa_thumbs_o_down : "\uf088"
readonly property string fa_thumbs_o_up : "\uf087"
readonly property string fa_thumbs_up : "\uf164"
readonly property string fa_ticket : "\uf145"
readonly property string fa_times : "\uf00d"
readonly property string fa_times_circle : "\uf057"
readonly property string fa_times_circle_o : "\uf05c"
readonly property string fa_tint : "\uf043"
readonly property string fa_toggle_down : "\uf150"
readonly property string fa_toggle_left : "\uf191"
readonly property string fa_toggle_off : "\uf204"
readonly property string fa_toggle_on : "\uf205"
readonly property string fa_toggle_right : "\uf152"
readonly property string fa_toggle_up : "\uf151"
readonly property string fa_trash : "\uf1f8"
readonly property string fa_trash_o : "\uf014"
readonly property string fa_tree : "\uf1bb"
readonly property string fa_trello : "\uf181"
readonly property string fa_trophy : "\uf091"
readonly property string fa_truck : "\uf0d1"
readonly property string fa_try : "\uf195"
readonly property string fa_tty : "\uf1e4"
readonly property string fa_tumblr : "\uf173"
readonly property string fa_tumblr_square : "\uf174"
readonly property string fa_turkish_lira : "\uf195"
readonly property string fa_twitch : "\uf1e8"
readonly property string fa_twitter : "\uf099"
readonly property string fa_twitter_square : "\uf081"
readonly property string fa_umbrella : "\uf0e9"
readonly property string fa_underline : "\uf0cd"
readonly property string fa_undo : "\uf0e2"
readonly property string fa_university : "\uf19c"
readonly property string fa_unlink : "\uf127"
readonly property string fa_unlock : "\uf09c"
readonly property string fa_unlock_alt : "\uf13e"
readonly property string fa_unsorted : "\uf0dc"
readonly property string fa_upload : "\uf093"
readonly property string fa_usd : "\uf155"
readonly property string fa_user : "\uf007"
readonly property string fa_user_md : "\uf0f0"
readonly property string fa_users : "\uf0c0"
readonly property string fa_video_camera : "\uf03d"
readonly property string fa_vimeo_square : "\uf194"
readonly property string fa_vine : "\uf1ca"
readonly property string fa_vk : "\uf189"
readonly property string fa_volume_down : "\uf027"
readonly property string fa_volume_off : "\uf026"
readonly property string fa_volume_up : "\uf028"
readonly property string fa_warning : "\uf071"
readonly property string fa_wechat : "\uf1d7"
readonly property string fa_weibo : "\uf18a"
readonly property string fa_weixin : "\uf1d7"
readonly property string fa_wheelchair : "\uf193"
readonly property string fa_wifi : "\uf1eb"
readonly property string fa_windows : "\uf17a"
readonly property string fa_won : "\uf159"
readonly property string fa_wordpress : "\uf19a"
readonly property string fa_wrench : "\uf0ad"
readonly property string fa_xing : "\uf168"
readonly property string fa_xing_square : "\uf169"
readonly property string fa_yahoo : "\uf19e"
readonly property string fa_yelp : "\uf1e9"
readonly property string fa_yen : "\uf157"
readonly property string fa_youtube : "\uf167"
readonly property string fa_youtube_play : "\uf16a"
readonly property string fa_youtube_square : "\uf166"
}