Commit 5e909017 authored by Andreas Traczyk's avatar Andreas Traczyk

settings: refactor

- fixes programmatic slot triggering
- overhauls ui
- standardizes layouts
- fixes file path elide
- adds win10 style toggle switches
- fixes toggle state comparisons
- fixes registry settings
- fixes minimize on close function
- fixes navigate to settings from tray icon
- removes blocking calls to stopPreview
- enhances system notifications
- fixes codec selection
- fixes photobooth in settings
- fixes avatar cropping and scaling

Change-Id: I1fb7669e3cd5dc1c23743ccfe0b54c3e6ac5078b
parent 5b3a7eb1
......@@ -69,7 +69,7 @@ QVariant AccountListModel::data(const QModelIndex &index, int role) const
return QVariant(Utils::toUnderlyingValue<lrc::api::account::Status>(accountInfo.status));
case Role::Picture:
case Qt::DecorationRole:
return PixbufManipulator::accountPhoto(accountInfo);
return Utils::accountPhoto(accountInfo);
case Role::ID:
return QVariant(QString::fromStdString(accountInfo.id));
}
......
/***************************************************************************
* Copyright (C) 2019-2019 by Savoir-faire Linux *
* Copyright (C) 2019 by Savoir-faire Linux *
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com> *
* Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
......@@ -20,11 +21,11 @@
#include <QFileDialog>
#include "api/newcodecmodel.h"
#include "lrcinstance.h"
#include "utils.h"
#include "api/newcodecmodel.h"
AdvancedSettingsWidget::AdvancedSettingsWidget(QWidget* parent)
:QWidget(parent),
ui(new Ui::AdvancedSettingsWidget)
......@@ -73,9 +74,28 @@ AdvancedSettingsWidget::AdvancedSettingsWidget(QWidget* parent)
connect(ui->audioDownPushButton, &QPushButton::clicked, this, &AdvancedSettingsWidget::decreaseAudioCodecPriority);
connect(ui->audioUpPushButton, &QPushButton::clicked, this, &AdvancedSettingsWidget::increaseAudioCodecPriority);
ui->audioDownPushButton->setEnabled(false);
ui->audioUpPushButton->setEnabled(false);
connect(ui->audioListWidget, &QListWidget::itemSelectionChanged,
[this] {
bool enabled = ui->audioListWidget->selectedItems().size();
ui->audioDownPushButton->setEnabled(enabled);
ui->audioUpPushButton->setEnabled(enabled);
});
connect(ui->videoDownPushButton, &QPushButton::clicked, this, &AdvancedSettingsWidget::decreaseVideoCodecPriority);
connect(ui->videoUpPushButton, &QPushButton::clicked, this, &AdvancedSettingsWidget::increaseVideoCodecPriority);
ui->videoDownPushButton->setEnabled(false);
ui->videoUpPushButton->setEnabled(false);
connect(ui->videoListWidget, &QListWidget::itemSelectionChanged,
[this] {
bool enabled = ui->videoListWidget->selectedItems().size();
ui->videoDownPushButton->setEnabled(enabled);
ui->videoUpPushButton->setEnabled(enabled);
});
}
AdvancedSettingsWidget::~AdvancedSettingsWidget()
......@@ -311,11 +331,8 @@ AdvancedSettingsWidget::updateAudioCodecs()
for (auto it = audioCodecList.begin(); it != audioCodecList.end(); ++it, ++i) {
QListWidgetItem* audioItem = new QListWidgetItem(ui->audioListWidget);
audioItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
Qt::CheckState state;
it->enabled ? state = Qt::Checked : state = Qt::Unchecked;
audioItem->setCheckState(state);
audioItem->setData(Qt::DisplayRole, QString::fromStdString(it->name) + "\n" + QString::fromStdString(it->samplerate)
+ " Hz");
audioItem->setCheckState(it->enabled ? Qt::Checked : Qt::Unchecked);
audioItem->setData(Qt::DisplayRole, QString::fromStdString(it->name) + " " + QString::fromStdString(it->samplerate) + " Hz");
ui->audioListWidget->addItem(audioItem);
}
......@@ -325,21 +342,15 @@ void
AdvancedSettingsWidget::updateVideoCodecs()
{
ui->videoListWidget->clear();
auto videoCodecList = LRCInstance::getCurrentAccountInfo().codecModel->getVideoCodecs();
int i = 0;
for (auto it = videoCodecList.begin(); it != videoCodecList.end(); ++it, ++i) {
if (it->name.length()) { // [temporary fix]
QListWidgetItem* videoItem = new QListWidgetItem(ui->videoListWidget);
videoItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
Qt::CheckState state;
it->enabled ? state = Qt::Checked : state = Qt::Unchecked;
videoItem->setCheckState(state);
videoItem->setData(Qt::DisplayRole, QString::fromStdString(it->name) + "\n");
ui->audioListWidget->addItem(videoItem);
}
if (!it->name.length()) { continue; } // temporary fix for empty codec entries
QListWidgetItem* videoItem = new QListWidgetItem(ui->videoListWidget);
videoItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
videoItem->setCheckState(it->enabled ? Qt::Checked : Qt::Unchecked);
videoItem->setData(Qt::DisplayRole, QString::fromStdString(it->name));
ui->audioListWidget->addItem(videoItem);
}
}
......@@ -374,7 +385,9 @@ AdvancedSettingsWidget::decreaseAudioCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->decreasePriority(it->id, false);
updateAudioCodecs();
// swap current item down
Utils::swapQListWidgetItems(ui->audioListWidget, true);
}
void
......@@ -386,7 +399,9 @@ AdvancedSettingsWidget::increaseAudioCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->increasePriority(it->id, false);
updateAudioCodecs();
// swap current item up
Utils::swapQListWidgetItems(ui->audioListWidget, false);
}
void
......@@ -398,7 +413,9 @@ AdvancedSettingsWidget::decreaseVideoCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->decreasePriority(it->id, true);
updateVideoCodecs();
// swap current item down
Utils::swapQListWidgetItems(ui->videoListWidget, true);
}
void
......@@ -410,7 +427,9 @@ AdvancedSettingsWidget::increaseVideoCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->increasePriority(it->id, true);
updateVideoCodecs();
// swap current item up
Utils::swapQListWidgetItems(ui->videoListWidget, false);
}
void
......
This diff is collapsed.
/***************************************************************************
* Copyright (C) 2019-2019 by Savoir-faire Linux *
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com>
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com> *
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
......@@ -21,14 +21,14 @@
#include <QFileDialog>
#include "api/newcodecmodel.h"
#include "lrcinstance.h"
#include "utils.h"
#include "api/newcodecmodel.h"
AdvancedSIPSettingsWidget::AdvancedSIPSettingsWidget(QWidget* parent)
:QWidget(parent),
ui(new Ui::AdvancedSIPSettingsWidget)
: QWidget(parent)
, ui(new Ui::AdvancedSIPSettingsWidget)
{
ui->setupUi(this);
......@@ -61,9 +61,28 @@ AdvancedSIPSettingsWidget::AdvancedSIPSettingsWidget(QWidget* parent)
connect(ui->audioDownPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::decreaseAudioCodecPriority);
connect(ui->audioUpPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::increaseAudioCodecPriority);
ui->audioDownPushButtonSIP->setEnabled(false);
ui->audioUpPushButtonSIP->setEnabled(false);
connect(ui->audioListWidgetSIP, &QListWidget::itemSelectionChanged,
[this] {
bool enabled = ui->audioListWidgetSIP->selectedItems().size();
ui->audioDownPushButtonSIP->setEnabled(enabled);
ui->audioUpPushButtonSIP->setEnabled(enabled);
});
connect(ui->videoDownPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::decreaseVideoCodecPriority);
connect(ui->videoUpPushButtonSIP, &QPushButton::clicked, this, &AdvancedSIPSettingsWidget::increaseVideoCodecPriority);
ui->videoDownPushButtonSIP->setEnabled(false);
ui->videoUpPushButtonSIP->setEnabled(false);
connect(ui->videoListWidgetSIP, &QListWidget::itemSelectionChanged,
[this] {
bool enabled = ui->videoListWidgetSIP->selectedItems().size();
ui->videoDownPushButtonSIP->setEnabled(enabled);
ui->videoUpPushButtonSIP->setEnabled(enabled);
});
}
AdvancedSIPSettingsWidget::~AdvancedSIPSettingsWidget()
......@@ -71,8 +90,7 @@ AdvancedSIPSettingsWidget::~AdvancedSIPSettingsWidget()
delete ui;
}
void
AdvancedSIPSettingsWidget::updateAdvancedSIPSettings()
void AdvancedSIPSettingsWidget::updateAdvancedSIPSettings()
{
auto config = LRCInstance::getCurrAccConfig();
//Call Settings
......@@ -103,23 +121,20 @@ AdvancedSIPSettingsWidget::updateAdvancedSIPSettings()
}
// call settings
void
AdvancedSIPSettingsWidget::setAutoAnswerCalls(bool state)
void AdvancedSIPSettingsWidget::setAutoAnswerCalls(bool state)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.autoAnswer = state;
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::setEnableRingtone(bool state)
void AdvancedSIPSettingsWidget::setEnableRingtone(bool state)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.Ringtone.ringtoneEnabled = state;
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::openFileCustomRingtone()
void AdvancedSIPSettingsWidget::openFileCustomRingtone()
{
QString fileUrl;
auto oldPath = QString::fromStdString(LRCInstance::getCurrAccConfig().Ringtone.ringtonePath);
......@@ -138,22 +153,19 @@ AdvancedSIPSettingsWidget::openFileCustomRingtone()
}
// connectivity
void
AdvancedSIPSettingsWidget::setUseUPnP(bool state)
void AdvancedSIPSettingsWidget::setUseUPnP(bool state)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.upnpEnabled = state;
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::setUseTURN(bool state)
void AdvancedSIPSettingsWidget::setUseTURN(bool state)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.TURN.enable = state;
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::setUseSTUN(bool state)
void AdvancedSIPSettingsWidget::setUseSTUN(bool state)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.STUN.enable = state;
......@@ -162,37 +174,32 @@ AdvancedSIPSettingsWidget::setUseSTUN(bool state)
state ? ui->lineEditSTUNAddressSIP->setEnabled(true) : ui->lineEditSTUNAddressSIP->setEnabled(false);
}
void
AdvancedSIPSettingsWidget::setTURNAddress(const QString& name)
void AdvancedSIPSettingsWidget::setTURNAddress(const QString& name)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.TURN.server = name.toStdString();
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::setTURNUsername(const QString& name)
void AdvancedSIPSettingsWidget::setTURNUsername(const QString& name)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.TURN.username = name.toStdString();
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::setTURNPsswd(const QString& name)
void AdvancedSIPSettingsWidget::setTURNPsswd(const QString& name)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.TURN.password = name.toStdString();
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::setSTUNAddress(const QString& name)
void AdvancedSIPSettingsWidget::setSTUNAddress(const QString& name)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.STUN.server = name.toStdString();
LRCInstance::editableAccountModel()->setAccountConfig(LRCInstance::getCurrAccId(), confProps);
}
void
AdvancedSIPSettingsWidget::updateAudioCodecs()
void AdvancedSIPSettingsWidget::updateAudioCodecs()
{
ui->audioListWidgetSIP->clear();
......@@ -202,18 +209,14 @@ AdvancedSIPSettingsWidget::updateAudioCodecs()
for (auto it = audioCodecList.begin(); it != audioCodecList.end(); ++it, ++i) {
QListWidgetItem* audioItem = new QListWidgetItem(ui->audioListWidgetSIP);
audioItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
Qt::CheckState state;
it->enabled ? state = Qt::Checked : state = Qt::Unchecked;
audioItem->setCheckState(state);
audioItem->setData(Qt::DisplayRole, QString::fromStdString(it->name) + "\n" + QString::fromStdString(it->samplerate)
+ " Hz");
audioItem->setCheckState(it->enabled ? Qt::Checked : Qt::Unchecked);
audioItem->setData(Qt::DisplayRole, QString::fromStdString(it->name) + " " + QString::fromStdString(it->samplerate) + " Hz");
ui->audioListWidgetSIP->addItem(audioItem);
}
}
void
AdvancedSIPSettingsWidget::updateVideoCodecs()
void AdvancedSIPSettingsWidget::updateVideoCodecs()
{
ui->videoListWidgetSIP->clear();
......@@ -221,21 +224,16 @@ AdvancedSIPSettingsWidget::updateVideoCodecs()
int i = 0;
for (auto it = videoCodecList.begin(); it != videoCodecList.end(); ++it, ++i) {
if (it->name.length()) { // [temporary fix]
QListWidgetItem* videoItem = new QListWidgetItem(ui->videoListWidgetSIP);
videoItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
Qt::CheckState state;
it->enabled ? state = Qt::Checked : state = Qt::Unchecked;
videoItem->setCheckState(state);
videoItem->setData(Qt::DisplayRole, QString::fromStdString(it->name) + "\n");
ui->audioListWidgetSIP->addItem(videoItem);
}
if (!it->name.length()) { continue; } // temporary fix for empty codec entries
QListWidgetItem* videoItem = new QListWidgetItem(ui->videoListWidgetSIP);
videoItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
videoItem->setCheckState(it->enabled ? Qt::Checked : Qt::Unchecked);
videoItem->setData(Qt::DisplayRole, QString::fromStdString(it->name) + "\n");
ui->audioListWidgetSIP->addItem(videoItem);
}
}
void
AdvancedSIPSettingsWidget::audioCodecsStateChange(QListWidgetItem* item)
void AdvancedSIPSettingsWidget::audioCodecsStateChange(QListWidgetItem* item)
{
auto audioCodecList = LRCInstance::getCurrentAccountInfo().codecModel->getAudioCodecs();
auto it = audioCodecList.begin();
......@@ -245,8 +243,7 @@ AdvancedSIPSettingsWidget::audioCodecsStateChange(QListWidgetItem* item)
LRCInstance::getCurrentAccountInfo().codecModel->enable(it->id, !(it->enabled));
}
void
AdvancedSIPSettingsWidget::videoCodecsStateChange(QListWidgetItem* item)
void AdvancedSIPSettingsWidget::videoCodecsStateChange(QListWidgetItem* item)
{
auto videoCodecList = LRCInstance::getCurrentAccountInfo().codecModel->getVideoCodecs();
auto it = videoCodecList.begin();
......@@ -256,8 +253,7 @@ AdvancedSIPSettingsWidget::videoCodecsStateChange(QListWidgetItem* item)
LRCInstance::getCurrentAccountInfo().codecModel->enable(it->id, !(it->enabled));
}
void
AdvancedSIPSettingsWidget::decreaseAudioCodecPriority()
void AdvancedSIPSettingsWidget::decreaseAudioCodecPriority()
{
int selectedRow = ui->audioListWidgetSIP->row(ui->audioListWidgetSIP->selectedItems().at(0));
auto audioCodecList = LRCInstance::getCurrentAccountInfo().codecModel->getAudioCodecs();
......@@ -265,11 +261,12 @@ AdvancedSIPSettingsWidget::decreaseAudioCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->decreasePriority(it->id, false);
updateAudioCodecs();
// swap current item down
Utils::swapQListWidgetItems(ui->audioListWidgetSIP, true);
}
void
AdvancedSIPSettingsWidget::increaseAudioCodecPriority()
void AdvancedSIPSettingsWidget::increaseAudioCodecPriority()
{
int selectedRow = ui->audioListWidgetSIP->row(ui->audioListWidgetSIP->selectedItems().at(0));
auto audioCodecList = LRCInstance::getCurrentAccountInfo().codecModel->getAudioCodecs();
......@@ -278,10 +275,12 @@ AdvancedSIPSettingsWidget::increaseAudioCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->increasePriority(it->id, false);
updateAudioCodecs();
// swap current item up
Utils::swapQListWidgetItems(ui->audioListWidgetSIP, false);
}
void
AdvancedSIPSettingsWidget::decreaseVideoCodecPriority()
void AdvancedSIPSettingsWidget::decreaseVideoCodecPriority()
{
int selectedRow = ui->videoListWidgetSIP->row(ui->videoListWidgetSIP->selectedItems().at(0));
auto videoCodecList = LRCInstance::getCurrentAccountInfo().codecModel->getVideoCodecs();
......@@ -289,11 +288,12 @@ AdvancedSIPSettingsWidget::decreaseVideoCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->decreasePriority(it->id, true);
updateVideoCodecs();
// swap current item down
Utils::swapQListWidgetItems(ui->videoListWidgetSIP, true);
}
void
AdvancedSIPSettingsWidget::increaseVideoCodecPriority()
void AdvancedSIPSettingsWidget::increaseVideoCodecPriority()
{
int selectedRow = ui->videoListWidgetSIP->row(ui->videoListWidgetSIP->selectedItems().at(0));
auto videoCodecList = LRCInstance::getCurrentAccountInfo().codecModel->getVideoCodecs();
......@@ -301,11 +301,12 @@ AdvancedSIPSettingsWidget::increaseVideoCodecPriority()
advance(it, selectedRow);
LRCInstance::getCurrentAccountInfo().codecModel->increasePriority(it->id, true);
updateVideoCodecs();
// swap current item up
Utils::swapQListWidgetItems(ui->videoListWidgetSIP, false);
}
void
AdvancedSIPSettingsWidget::setVideoState(int state)
void AdvancedSIPSettingsWidget::setVideoState(int state)
{
auto confProps = LRCInstance::accountModel().getAccountConfig(LRCInstance::getCurrAccId());
confProps.Video.videoEnabled = (bool)state;
......
/***************************************************************************
* Copyright (C) 2019-2019 by Savoir-faire Linux *
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com>
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
* Author: Isa Nanic <isa.nanic@savoirfairelinux.com> *
* Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
......@@ -19,16 +19,14 @@
#pragma once
#include <QWidget>
#include <QListWidgetItem>
#include <QWidget>
namespace Ui
{
namespace Ui {
class AdvancedSIPSettingsWidget;
}
class AdvancedSIPSettingsWidget : public QWidget
{
class AdvancedSIPSettingsWidget : public QWidget {
Q_OBJECT
AdvancedSIPSettingsWidget(const AdvancedSIPSettingsWidget& cpy);
......@@ -74,5 +72,4 @@ private slots:
void increaseVideoCodecPriority();
void setVideoState(int state);
};
\ No newline at end of file
};
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BannedContactsWidget</class>
<widget class="QWidget" name="BannedContactsWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>712</width>
<height>544</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,2">
<property name="sizeConstraint">
<enum>QLayout::SetNoConstraint</enum>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QListView" name="bannedList">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Banned contacts list</string>
</property>
</widget>
</item>
<item>
<widget class="QStackedWidget" name="debanStack">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="cleanPage"/>
<widget class="QWidget" name="debanPage">
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0,0,0,1">
<item>
<spacer name="verticalSpacer">
<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 alignment="Qt::AlignHCenter|Qt::AlignVCenter">
<widget class="QLabel" name="bannedIdLabel">
<property name="text">
<string>Banned ID</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<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 alignment="Qt::AlignHCenter">
<widget class="QPushButton" name="debanButton">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>265</width>
<height>30</height>
</size>
</property>
<property name="toolTip">
<string>Deban contact button</string>
</property>
<property name="text">
<string>Deban contact, and add to contact list</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>