refs #227, view/model for client class

* model
* view
* and GUI component which now encapsulates the user table view
This commit is contained in:
Klaus Basan
2014-05-06 13:23:47 +02:00
parent 31b83e0f1e
commit 4686da4827
7 changed files with 296 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
#include "clientlistmodel.h"
#include "blackmisc/blackmiscfreefunctions.h"
#include <QMetaProperty>
#include <QBrush>
using namespace BlackMisc::Network;
namespace BlackGui
{
/*
* Constructor
*/
CClientListModel::CClientListModel(QObject *parent) :
CListModelBase<BlackMisc::Network::CClient, BlackMisc::Network::CClientList>("ViewClientList", parent)
{
this->m_columns.addColumn(CColumn("", CClient::IndexCallsignIcon));
this->m_columns.addColumn(CColumn("callsign", CClient::IndexCallsign));
this->m_columns.addColumn(CColumn("realname", CClient::IndexRealName));
this->m_columns.addColumn(CColumn("capabilities", CClient::IndexCapabilitiesString));
this->m_columns.addColumn(CColumn("model", CClient::IndexQueriedModelString));
this->m_columns.addColumn(CColumn("host", CClient::IndexHost));
// force strings for translation in resource files
// force strings for translation in resource files
(void)QT_TRANSLATE_NOOP("ViewClientList", "callsign");
(void)QT_TRANSLATE_NOOP("ViewClientList", "realname");
(void)QT_TRANSLATE_NOOP("ViewClientList", "userid");
(void)QT_TRANSLATE_NOOP("ViewClientList", "model");
(void)QT_TRANSLATE_NOOP("ViewClientList", "host");
}
/*
* Display icons
*/
QVariant CClientListModel::data(const QModelIndex &modelIndex, int role) const
{
// shortcut, fast check
if (role != Qt::DecorationRole) return CListModelBase::data(modelIndex, role);
if (this->columnToPropertyIndex(modelIndex.column()) == CClient::IndexCallsignIcon)
{
if (role == Qt::DecorationRole)
{
CClient u = this->at(modelIndex);
return u.toIcon();
}
}
return CListModelBase::data(modelIndex, role);
}
}

View File

@@ -0,0 +1,29 @@
#ifndef BLACKGUI_CLIENTLISTMODEL_H
#define BLACKGUI_CLIENTLISTMODEL_H
#include <QAbstractItemModel>
#include "blackmisc/nwclientlist.h"
#include "blackgui/listmodelbase.h"
namespace BlackGui
{
/*!
* \brief Server list model
*/
class CClientListModel : public CListModelBase<BlackMisc::Network::CClient, BlackMisc::Network::CClientList>
{
public:
//! \brief Constructor
explicit CClientListModel(QObject *parent = nullptr);
//! \brief Destructor
virtual ~CClientListModel() {}
//! \copydoc CListModelBase::data
QVariant data(const QModelIndex &modelIndex, int role = Qt::DisplayRole) const;
};
}
#endif // guard

View File

@@ -0,0 +1,19 @@
#include "clientview.h"
#include <QHeaderView>
using namespace BlackMisc;
namespace BlackGui
{
CClientView::CClientView(QWidget *parent) : CViewBase(parent)
{
this->m_model = new CClientListModel(this);
this->setModel(this->m_model); // via QTableView
this->m_model->setSortColumnByPropertyIndex(BlackMisc::Network::CClient::IndexRealName);
if (this->m_model->hasValidSortColumn())
this->horizontalHeader()->setSortIndicator(
this->m_model->getSortColumn(),
this->m_model->getSortOrder());
this->horizontalHeader()->setStretchLastSection(true);
}
}

21
src/blackgui/clientview.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef BLACKGUI_CLIENTVIEW_H
#define BLACKGUI_CLIENTVIEW_H
#include "viewbase.h"
#include "clientlistmodel.h"
namespace BlackGui
{
/*!
* \brief Client view
*/
class CClientView : public CViewBase<CClientListModel>
{
public:
//! Constructor
explicit CClientView(QWidget *parent = nullptr);
};
}
#endif // guard

View File

@@ -0,0 +1,43 @@
#include "usercomponent.h"
#include "ui_usercomponent.h"
namespace BlackGui
{
CUserComponent::CUserComponent(QWidget *parent) :
QTabWidget(parent), CRuntimeBasedComponent(nullptr, false), ui(new Ui::CUserComponent), m_timer(nullptr)
{
ui->setupUi(this);
this->m_timer = new QTimer(this);
this->connect(this->m_timer, &QTimer::timeout, this, &CUserComponent::update);
}
CUserComponent::~CUserComponent()
{
delete ui;
}
void CUserComponent::update()
{
Q_ASSERT(this->ui->tvp_AllUsers);
Q_ASSERT(this->ui->tvp_Clients);
Q_ASSERT(this->getIContextNetwork());
if (this->getIContextNetwork()->isConnected())
{
this->ui->tvp_Clients->update(this->getIContextNetwork()->getOtherClients());
this->ui->tvp_AllUsers->update(this->getIContextNetwork()->getUsers());
}
}
void CUserComponent::setUpdateInterval(int milliSeconds)
{
if (milliSeconds < 100)
this->m_timer->stop();
else
{
this->m_timer->setInterval(milliSeconds);
if (!this->m_timer->isActive()) this->m_timer->start();
}
}
} // guard

View File

@@ -0,0 +1,43 @@
#ifndef BLACKGUI_USERCOMPONENT_H
#define BLACKGUI_USERCOMPONENT_H
#include "blackgui/runtimebasedcomponent.h"
#include "blackmisc/nwuserlist.h"
#include <QTabWidget>
#include <QTimer>
namespace Ui { class CUserComponent; }
namespace BlackGui
{
//! User componenet (users, clients)
class CUserComponent : public QTabWidget, public CRuntimeBasedComponent
{
Q_OBJECT
public:
//! Constructor
explicit CUserComponent(QWidget *parent = nullptr);
//! Destructor
~CUserComponent();
public slots:
//! Update users
void update();
//! Update time, time < 100 stops updates
void setUpdateInterval(int milliSeconds);
//! Update time
void setUpdateIntervalSeconds(int seconds) { this->setUpdateInterval(1000 * seconds); }
private:
Ui::CUserComponent *ui;
QTimer *m_timer;
};
}
#endif // guard

View File

@@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CUserComponent</class>
<widget class="QTabWidget" name="CUserComponent">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>TabWidget</string>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tb_AllUsers">
<attribute name="title">
<string>Users</string>
</attribute>
<layout class="QVBoxLayout" name="vl_AllUsers">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="BlackGui::CUserView" name="tvp_AllUsers">
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tb_Clients">
<attribute name="title">
<string>Clients</string>
</attribute>
<layout class="QVBoxLayout" name="vl_Clients">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="BlackGui::CClientView" name="tvp_Clients">
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>BlackGui::CUserView</class>
<extends>QTableView</extends>
<header>blackgui/userview.h</header>
</customwidget>
<customwidget>
<class>BlackGui::CClientView</class>
<extends>QTableView</extends>
<header>blackgui/clientview.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>