Started basic selcal functionality

This commit is contained in:
Jordan Sherer 2018-09-21 22:41:20 -04:00
parent f3f051d17c
commit a5b2eeab5d
3 changed files with 375 additions and 267 deletions

View File

@ -1678,6 +1678,7 @@ void MainWindow::writeSettings()
m_settings->setValue("TextVerticalSplitter", ui->textVerticalSplitter->saveState());
m_settings->setValue("ShowTimeDrift", ui->driftSyncFrame->isVisible());
m_settings->setValue("TimeDrift", ui->driftSpinBox->value());
m_settings->setValue("SelCal", ui->selcalButton->isChecked());
m_settings->endGroup();
@ -1783,6 +1784,7 @@ void MainWindow::readSettings()
}
ui->driftSyncFrame->setVisible(m_settings->value("ShowTimeDrift", false).toBool());
ui->driftSpinBox->setValue(m_settings->value("TimeDrift", 0).toInt());
ui->selcalButton->setChecked(m_settings->value("SelCal", false).toBool());
m_settings->endGroup();
@ -3695,6 +3697,7 @@ void MainWindow::readFromStdout() //readFromStdout
m_messageBuffer[d.freq/10*10].msgs.append(d);
}
m_rxActivityQueue.append(d);
m_bandActivity[offset].append(d);
while(m_bandActivity[offset].count() > 10){
@ -9183,7 +9186,7 @@ void MainWindow::updateButtonDisplay(){
if(isTransmitting){
int count = m_txFrameCount;
int sent = count - m_txFrameQueue.count();
ui->startTxButton->setText(QString("Sending (%1/%2)").arg(sent).arg(count));
ui->startTxButton->setText(m_tune ? "Tuning" : QString("Sending (%1/%2)").arg(sent).arg(count));
}
}
@ -9254,7 +9257,7 @@ void MainWindow::markOffsetRecent(int offset){
bool MainWindow::isDirectedOffset(int offset, bool *pIsAllCall){
bool isDirected = (
m_rxDirectedCache.contains(offset/10*10) &&
m_rxDirectedCache[offset/10*10]->date.secsTo(DriftingDateTime::currentDateTimeUtc()) < 300
m_rxDirectedCache[offset/10*10]->date.secsTo(DriftingDateTime::currentDateTimeUtc()) < 120
);
if(isDirected){
@ -9271,6 +9274,11 @@ void MainWindow::markOffsetDirected(int offset, bool isAllCall){
m_rxDirectedCache.insert(offset/10*10+10, d2, 10);
}
void MainWindow::clearOffsetDirected(int offset){
m_rxDirectedCache.remove(offset/10*10);
m_rxDirectedCache.remove(offset/10*10+10);
}
bool MainWindow::isMyCallIncluded(const QString &text){
QString myCall = Radio::base_callsign(m_config.my_callsign());
@ -9316,12 +9324,6 @@ void MainWindow::processRxActivity() {
while (!m_rxActivityQueue.isEmpty()) {
ActivityDetail d = m_rxActivityQueue.dequeue();
// if this is a compound message or it's a directed message needing a compound call, skip.
// these messages will be displayed when the compound calls come through
#if 0
if(d.isCompound || (d.isDirected && d.text.contains("<....>"))){
#endif
// if this is a _partial_ directed message, skip until the complete call comes through.
if(d.isDirected && d.text.contains("<....>")){
continue;
@ -9347,19 +9349,6 @@ void MainWindow::processRxActivity() {
shouldDisplay = shouldDisplay || !isDirectedAllCall;
}
// TODO: jsherer - develop a better way to determine if we can display this band activity...
#if 0
if(isRecentOffset(freq) || isAllCallIncluded(d.text)){
m_rxRecentCache.insert(freq, new QDateTime(DriftingDateTime::currentDateTimeUtc()), 25);
shouldDisplay = true;
}
if(isDirectedOffset(freq) || isMyCallIncluded(d.text)){
m_rxDirectedCache.insert(freq, new QDateTime(DriftingDateTime::currentDateTimeUtc()), 25);
shouldDisplay = true;
}
#endif
if(!shouldDisplay){
continue;
}
@ -9379,6 +9368,10 @@ void MainWindow::processRxActivity() {
// log it to the display!
displayTextForFreq(d.text, d.freq, d.utcTimestamp, false, isFirst, isLast);
if(isLast){
clearOffsetDirected(d.freq);
}
if(isLast && !d.isBuffered){
// buffered commands need the rxFrameBlockNumbers cache so it can fixup its display
// all other "last" data frames can clear the rxFrameBlockNumbers cache so the next message will be on a new line.
@ -9601,9 +9594,14 @@ void MainWindow::processCommandActivity() {
cd.utcTimestamp = d.utcTimestamp;
logCallActivity(cd, true);
bool toMe = d.to == m_config.my_callsign().trimmed() || d.to == Radio::base_callsign(m_config.my_callsign()).trimmed();
// we're only responding to allcall and our callsign at this point, so we'll end after logging the callsigns we've heard
if (!isAllCall && d.to != m_config.my_callsign().trimmed() && d.to != Radio::base_callsign(m_config.my_callsign()).trimmed()) {
if (!isAllCall && !toMe) {
continue;
}
if (isAllCall && ui->selcalButton->isChecked()) {
continue;
}

View File

@ -883,6 +883,7 @@ private:
void markOffsetRecent(int offset);
bool isDirectedOffset(int offset, bool *pIsAllCall);
void markOffsetDirected(int offset, bool isAllCall);
void clearOffsetDirected(int offset);
void processActivity(bool force=false);
void processRxActivity();
void processCompoundActivity();

View File

@ -6,10 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>960</width>
<height>563</height>
<width>872</width>
<height>566</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>FT8Call</string>
</property>
@ -105,6 +111,9 @@
<height>16777215</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">QFrame { background:black; }</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
@ -278,6 +287,22 @@ QPushButton[oob=&quot;true&quot;] {
</layout>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QFrame" name="frame_6">
<property name="styleSheet">
@ -419,6 +444,22 @@ color : white;
</layout>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QFrame" name="frame_2">
<property name="sizePolicy">
@ -440,22 +481,64 @@ color : white;
<enum>QFrame::Plain</enum>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<property name="leftMargin">
<number>18</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>18</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<property name="spacing">
<number>18</number>
</property>
<item row="3" column="1">
<item row="1" column="3">
<widget class="QPushButton" name="logQSOButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Insert a new entry into the log&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-family: helvetica;
font-weight: bold;
background-color: lightgray;
color: black;
border-style: solid;
border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:75px;
min-height:30px;
/*max-width:60px;*/
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
background-color: red;
}
QPushButton[state=&quot;warning&quot;] {
background-color: orange;
}
QPushButton[state=&quot;ok&quot;] {
background-color: #00ff00;
}</string>
</property>
<property name="text">
<string>LOG</string>
</property>
</widget>
</item>
<item row="5" column="2">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -468,17 +551,175 @@ color : white;
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QWidget" name="monitorContainer" native="true">
<item row="2" column="2">
<spacer name="verticalSpacer_9">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<spacer name="verticalSpacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="2">
<widget class="QPushButton" name="beaconButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable or disable the automatic beacon&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-family: helvetica;
font-weight: bold;
background-color: lightgray;
color: black;
border-style: solid;
border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:75px;
min-height:30px;
/*max-width:60px;*/
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
background-color: red;
}
QPushButton[state=&quot;warning&quot;] {
background-color: orange;
}
QPushButton[state=&quot;ok&quot;] {
background-color: #00ff00;
}
QPushButton:checked {
background-color: #6699ff;
}</string>
</property>
<property name="text">
<string>BCN</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QPushButton" name="selcalButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable or disable selective calling (i.e., only directed messages to you will be displayed)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-family: helvetica;
font-weight: bold;
background-color: lightgray;
color: black;
border-style: solid;
border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:75px;
min-height:30px;
/*max-width:60px;*/
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
background-color: red;
}
QPushButton[state=&quot;warning&quot;] {
background-color: orange;
}
QPushButton[state=&quot;ok&quot;] {
background-color: #00ff00;
}
QPushButton:checked {
background-color: #6699ff;
}</string>
</property>
<property name="text">
<string>SELCAL</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QWidget" name="monitorContainer" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
@ -490,25 +731,25 @@ color : white;
<rect>
<x>0</x>
<y>0</y>
<width>60</width>
<width>75</width>
<height>30</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<width>0</width>
<height>30</height>
</size>
</property>
@ -526,9 +767,9 @@ border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:60px;
min-width:75px;
min-height:30px;
max-width:60px;
/*max-width:60px;*/
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
@ -559,25 +800,25 @@ background-color: #00ff00;
<rect>
<x>0</x>
<y>0</y>
<width>60</width>
<width>75</width>
<height>30</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<width>0</width>
<height>30</height>
</size>
</property>
@ -594,9 +835,9 @@ border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:60px;
min-width:75px;
min-height:30px;
max-width:60px;
/*max-width:60px;*/
max-height:30px;
background-color: yellow;
}
@ -611,103 +852,26 @@ background-color: yellow;
</widget>
</widget>
</item>
<item row="0" column="1">
<spacer name="verticalSpacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="tuneButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Transmit a tuning tone&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-family: helvetica;
font-weight: bold;
background-color: lightgray;
color: black;
border-style: solid;
border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:60px;
min-height:30px;
max-width:60px;
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
background-color: red;
}
QPushButton[state=&quot;warning&quot;] {
background-color: orange;
}
QPushButton[state=&quot;ok&quot;] {
background-color: #00ff00;
}
QPushButton:checked {
background-color: yellow;
}</string>
</property>
<property name="text">
<string>TUNE</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="4" column="1">
<widget class="QPushButton" name="autoReplyButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<width>0</width>
<height>30</height>
</size>
</property>
@ -725,9 +889,9 @@ border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:60px;
min-width:75px;
min-height:30px;
max-width:60px;
/*max-width:60px;*/
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
@ -757,20 +921,20 @@ background-color: #6699ff;
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<width>75</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<width>0</width>
<height>30</height>
</size>
</property>
@ -788,9 +952,9 @@ border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:60px;
min-width:75px;
min-height:30px;
max-width:60px;
/*max-width:60px;*/
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
@ -814,126 +978,6 @@ background-color: #00ff00;
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="beaconButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enable or disable the automatic beacon&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-family: helvetica;
font-weight: bold;
background-color: lightgray;
color: black;
border-style: solid;
border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:60px;
min-height:30px;
max-width:60px;
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
background-color: red;
}
QPushButton[state=&quot;warning&quot;] {
background-color: orange;
}
QPushButton[state=&quot;ok&quot;] {
background-color: #00ff00;
}
QPushButton:checked {
background-color: #6699ff;
}</string>
</property>
<property name="text">
<string>BCN</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QPushButton" name="logQSOButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Insert a new entry into the log&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
font-family: helvetica;
font-weight: bold;
background-color: lightgray;
color: black;
border-style: solid;
border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:60px;
min-height:30px;
max-width:60px;
max-height:30px;
}
QPushButton[state=&quot;error&quot;] {
background-color: red;
}
QPushButton[state=&quot;warning&quot;] {
background-color: orange;
}
QPushButton[state=&quot;ok&quot;] {
background-color: #00ff00;
}</string>
</property>
<property name="text">
<string>LOG</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -1662,7 +1706,7 @@ background-color: #00ff00;
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
<height>30</height>
</size>
</property>
<property name="frameShadow">
@ -1687,7 +1731,7 @@ background-color: #00ff00;
<item>
<widget class="QSlider" name="outAttenuation">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@ -1752,6 +1796,71 @@ background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #2ecc71, stop:1 #00FF
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="tuneButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Transmit a tuning tone&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="styleSheet">
<string notr="true">QPushButton {
/*
font-family: helvetica;
font-weight: bold;
background-color: lightgray;
color: black;
border-style: solid;
border-radius:2px;
border-width:0px;
border-color: gray;
font-size:90%;
min-width:75px;
min-height:30px;
/*max-width:60px;*/
max-height:30px;
*/
}
QPushButton[state=&quot;error&quot;] {
background-color: red;
}
QPushButton[state=&quot;warning&quot;] {
background-color: orange;
}
QPushButton[state=&quot;ok&quot;] {
background-color: #00ff00;
}
QPushButton:checked {
background-color: yellow;
}</string>
</property>
<property name="text">
<string>Tune</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@ -4406,7 +4515,7 @@ list. The list can be maintained in Settings (F2).</string>
<rect>
<x>0</x>
<y>0</y>
<width>960</width>
<width>872</width>
<height>22</height>
</rect>
</property>