From 4686da482740d68867ef863864a5e07aee03d4e5 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 6 May 2014 13:23:47 +0200 Subject: [PATCH] refs #227, view/model for client class * model * view * and GUI component which now encapsulates the user table view --- src/blackgui/clientlistmodel.cpp | 49 +++++++++++++++++ src/blackgui/clientlistmodel.h | 29 ++++++++++ src/blackgui/clientview.cpp | 19 +++++++ src/blackgui/clientview.h | 21 ++++++++ src/blackgui/usercomponent.cpp | 43 +++++++++++++++ src/blackgui/usercomponent.h | 43 +++++++++++++++ src/blackgui/usercomponent.ui | 92 ++++++++++++++++++++++++++++++++ 7 files changed, 296 insertions(+) create mode 100644 src/blackgui/clientlistmodel.cpp create mode 100644 src/blackgui/clientlistmodel.h create mode 100644 src/blackgui/clientview.cpp create mode 100644 src/blackgui/clientview.h create mode 100644 src/blackgui/usercomponent.cpp create mode 100644 src/blackgui/usercomponent.h create mode 100644 src/blackgui/usercomponent.ui diff --git a/src/blackgui/clientlistmodel.cpp b/src/blackgui/clientlistmodel.cpp new file mode 100644 index 000000000..e6580d0cc --- /dev/null +++ b/src/blackgui/clientlistmodel.cpp @@ -0,0 +1,49 @@ +#include "clientlistmodel.h" +#include "blackmisc/blackmiscfreefunctions.h" +#include +#include + +using namespace BlackMisc::Network; + +namespace BlackGui +{ + /* + * Constructor + */ + CClientListModel::CClientListModel(QObject *parent) : + CListModelBase("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); + } +} diff --git a/src/blackgui/clientlistmodel.h b/src/blackgui/clientlistmodel.h new file mode 100644 index 000000000..37ad07e1d --- /dev/null +++ b/src/blackgui/clientlistmodel.h @@ -0,0 +1,29 @@ +#ifndef BLACKGUI_CLIENTLISTMODEL_H +#define BLACKGUI_CLIENTLISTMODEL_H + +#include +#include "blackmisc/nwclientlist.h" +#include "blackgui/listmodelbase.h" + +namespace BlackGui +{ + /*! + * \brief Server list model + */ + class CClientListModel : public CListModelBase + { + + 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 diff --git a/src/blackgui/clientview.cpp b/src/blackgui/clientview.cpp new file mode 100644 index 000000000..29c71f6fb --- /dev/null +++ b/src/blackgui/clientview.cpp @@ -0,0 +1,19 @@ +#include "clientview.h" +#include + +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); + } +} diff --git a/src/blackgui/clientview.h b/src/blackgui/clientview.h new file mode 100644 index 000000000..895a576e2 --- /dev/null +++ b/src/blackgui/clientview.h @@ -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 + { + + public: + + //! Constructor + explicit CClientView(QWidget *parent = nullptr); + }; +} +#endif // guard diff --git a/src/blackgui/usercomponent.cpp b/src/blackgui/usercomponent.cpp new file mode 100644 index 000000000..8448fffda --- /dev/null +++ b/src/blackgui/usercomponent.cpp @@ -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 diff --git a/src/blackgui/usercomponent.h b/src/blackgui/usercomponent.h new file mode 100644 index 000000000..bfef027b7 --- /dev/null +++ b/src/blackgui/usercomponent.h @@ -0,0 +1,43 @@ +#ifndef BLACKGUI_USERCOMPONENT_H +#define BLACKGUI_USERCOMPONENT_H + +#include "blackgui/runtimebasedcomponent.h" +#include "blackmisc/nwuserlist.h" + +#include +#include + +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 diff --git a/src/blackgui/usercomponent.ui b/src/blackgui/usercomponent.ui new file mode 100644 index 000000000..35f08ba7f --- /dev/null +++ b/src/blackgui/usercomponent.ui @@ -0,0 +1,92 @@ + + + CUserComponent + + + + 0 + 0 + 400 + 300 + + + + TabWidget + + + 0 + + + + Users + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + false + + + + + + + + Clients + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + false + + + + + + + + + BlackGui::CUserView + QTableView +
blackgui/userview.h
+
+ + BlackGui::CClientView + QTableView +
blackgui/clientview.h
+
+
+ + +