Allow to select COM frequencies from ATC view (context menu)

* added functions in component to select COM frequencies
* changed views to contain ObjectType in template
* function to obtain selected objects in view base class
This commit is contained in:
Klaus Basan
2014-12-22 21:17:13 +01:00
parent d0b5fc1249
commit b26fa651ed
25 changed files with 182 additions and 55 deletions

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! Aircrafts view
class CAircraftModelView : public CViewBase<Models::CAircraftModelListModel, BlackMisc::Network::CAircraftModelList>
class CAircraftModelView : public CViewBase<Models::CAircraftModelListModel, BlackMisc::Network::CAircraftModelList, BlackMisc::Network::CAircraftModel>
{
public:

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! Aircrafts view
class CAircraftView : public CViewBase<Models::CAircraftListModel, BlackMisc::Aviation::CAircraftList>
class CAircraftView : public CViewBase<Models::CAircraftListModel, BlackMisc::Aviation::CAircraftList, BlackMisc::Aviation::CAircraft>
{
public:

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! Airports view
class CAirportView : public CViewBase<Models::CAirportListModel, BlackMisc::Aviation::CAirportList>
class CAirportView : public CViewBase<Models::CAirportListModel, BlackMisc::Aviation::CAirportList, BlackMisc::Aviation::CAirport>
{
public:

View File

@@ -8,10 +8,12 @@
*/
#include "atcstationview.h"
#include "blackmisc/avatcstationlist.h"
#include "blackmisc/testing.h"
#include <QHeaderView>
using namespace BlackMisc;
using namespace BlackMisc::Aviation;
using namespace BlackGui::Models;
namespace BlackGui
@@ -59,7 +61,29 @@ namespace BlackGui
menu.addAction(CIcons::tableSheet16(), "Test: 3k ATC online stations", this, SLOT(ps_testRequest3kAtcOnlineDummies()));
menu.addSeparator();
}
if (this->hasSelection())
{
menu.addAction(CIcons::appCockpit16(), "Tune in COM1", this, SLOT(ps_tuneInAtcCom1()));
menu.addAction(CIcons::appCockpit16(), "Tune in COM2", this, SLOT(ps_tuneInAtcCom2()));
menu.addSeparator();
}
CViewBase::customMenu(menu);
}
}
}
void CAtcStationView::ps_tuneInAtcCom1()
{
CAtcStationList l = this->selectedObjects();
if (l.isEmpty()) { return; }
emit this->requestComFrequency(l.front().getFrequency(), CComSystem::Com1);
}
void CAtcStationView::ps_tuneInAtcCom2()
{
CAtcStationList l = this->selectedObjects();
if (l.isEmpty()) { return; }
emit this->requestComFrequency(l.front().getFrequency(), CComSystem::Com2);
}
} // namespace
} // namespace

View File

@@ -21,7 +21,7 @@ namespace BlackGui
namespace Views
{
//! ATC stations view
class CAtcStationView : public CViewBase<Models::CAtcStationListModel, BlackMisc::Aviation::CAtcStationList>
class CAtcStationView : public CViewBase<Models::CAtcStationListModel, BlackMisc::Aviation::CAtcStationList, BlackMisc::Aviation::CAtcStation>
{
Q_OBJECT
@@ -37,6 +37,9 @@ namespace BlackGui
//! Request some dummy ATC stations
void testRequestDummyAtcOnlineStations(int number);
//! Request COM frequency
void requestComFrequency(const BlackMisc::PhysicalQuantities::CFrequency &frequency, BlackMisc::Aviation::CComSystem::ComUnit unit);
public slots:
//! \copydoc CAtcStationListModel::changedAtcStationConnectionStatus
void changedAtcStationConnectionStatus(const BlackMisc::Aviation::CAtcStation &station, bool added);
@@ -48,6 +51,8 @@ namespace BlackGui
private slots:
void ps_testRequest1kAtcOnlineDummies() { emit this->testRequestDummyAtcOnlineStations(1000); }
void ps_testRequest3kAtcOnlineDummies() { emit this->testRequestDummyAtcOnlineStations(3000); }
void ps_tuneInAtcCom1();
void ps_tuneInAtcCom2();
};
}
}

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! Client view
class CClientView : public CViewBase<Models::CClientListModel, BlackMisc::Network::CClientList>
class CClientView : public CViewBase<Models::CClientListModel, BlackMisc::Network::CClientList, BlackMisc::Network::CClient>
{
public:
//! Constructor

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! Keyboard key view
class CKeyboardKeyView : public CViewBase<Models::CKeyboardKeyListModel, BlackMisc::Settings::CSettingKeyboardHotkeyList>
class CKeyboardKeyView : public CViewBase<Models::CKeyboardKeyListModel, BlackMisc::Settings::CSettingKeyboardHotkeyList, BlackMisc::Settings::CSettingKeyboardHotkey>
{
public:

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! User view
class CNameVariantPairView : public CViewBase<Models::CNameVariantPairModel, BlackMisc::CNameVariantPairList>
class CNameVariantPairView : public CViewBase<Models::CNameVariantPairModel, BlackMisc::CNameVariantPairList, BlackMisc::CNameVariantPair>
{
public:

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! Network servers
class CServerView : public CViewBase<Models::CServerListModel, BlackMisc::Network::CServerList>
class CServerView : public CViewBase<Models::CServerListModel, BlackMisc::Network::CServerList, BlackMisc::Network::CServer>
{
public:

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! Status message view
class CStatusMessageView : public CViewBase<Models::CStatusMessageListModel, BlackMisc::CStatusMessageList>
class CStatusMessageView : public CViewBase<Models::CStatusMessageListModel, BlackMisc::CStatusMessageList, BlackMisc::CStatusMessage>
{
public:

View File

@@ -20,7 +20,7 @@ namespace BlackGui
namespace Views
{
//! User view
class CUserView : public CViewBase<Models::CUserListModel, BlackMisc::Network::CUserList>
class CUserView : public CViewBase<Models::CUserListModel, BlackMisc::Network::CUserList, BlackMisc::Network::CUser>
{
public:

View File

@@ -46,7 +46,6 @@ namespace BlackGui
// scroll modes
this->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
this->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
}
void CViewBaseNonTemplate::customMenu(QMenu &menu) const
@@ -77,6 +76,16 @@ namespace BlackGui
return h;
}
bool CViewBaseNonTemplate::hasSelection() const
{
return this->selectionModel()->hasSelection();
}
QModelIndexList CViewBaseNonTemplate::selectedRows() const
{
return this->selectionModel()->selectedRows();
}
void CViewBaseNonTemplate::init()
{
int fh = qRound(1.5 * this->getHorizontalHeaderFontHeight());
@@ -152,7 +161,7 @@ namespace BlackGui
}
}
template <class ModelClass, class ContainerType> int CViewBase<ModelClass, ContainerType>::updateContainer(const ContainerType &container, bool sort, bool resize)
template <class ModelClass, class ContainerType, class ObjectType> int CViewBase<ModelClass, ContainerType, ObjectType>::updateContainer(const ContainerType &container, bool sort, bool resize)
{
Q_ASSERT(this->m_model);
int c = this->m_model->update(container, sort);
@@ -160,7 +169,7 @@ namespace BlackGui
return c;
}
template <class ModelClass, class ContainerType> BlackMisc::CWorker *CViewBase<ModelClass, ContainerType>::updateContainerAsync(const ContainerType &container, bool sort, bool resize)
template <class ModelClass, class ContainerType, class ObjectType> BlackMisc::CWorker *CViewBase<ModelClass, ContainerType, ObjectType>::updateContainerAsync(const ContainerType &container, bool sort, bool resize)
{
ModelClass *model = this->derivedModel();
auto sortColumn = model->getSortColumn();
@@ -175,7 +184,7 @@ namespace BlackGui
return worker;
}
template <class ModelClass, class ContainerType> void CViewBase<ModelClass, ContainerType>::updateContainerMaybeAsync(const ContainerType &container, bool sort, bool resize)
template <class ModelClass, class ContainerType, class ObjectType> void CViewBase<ModelClass, ContainerType, ObjectType>::updateContainerMaybeAsync(const ContainerType &container, bool sort, bool resize)
{
if (container.size() > asyncRowsCountThreshold && sort)
{
@@ -188,25 +197,37 @@ namespace BlackGui
}
}
template <class ModelClass, class ContainerType> int CViewBase<ModelClass, ContainerType>::rowCount() const
template <class ModelClass, class ContainerType, class ObjectType> ContainerType CViewBase<ModelClass, ContainerType, ObjectType>::selectedObjects() const
{
if (!this->hasSelection()) { return ContainerType(); }
ContainerType c;
QModelIndexList indexes = this->selectedRows();
for (QModelIndex &i : indexes)
{
c.push_back(this->at(i));
}
return c;
}
template <class ModelClass, class ContainerType, class ObjectType> int CViewBase<ModelClass, ContainerType, ObjectType>::rowCount() const
{
Q_ASSERT(this->m_model);
return this->m_model->rowCount();
}
template <class ModelClass, class ContainerType> int CViewBase<ModelClass, ContainerType>::columnCount() const
template <class ModelClass, class ContainerType, class ObjectType> int CViewBase<ModelClass, ContainerType, ObjectType>::columnCount() const
{
Q_ASSERT(this->m_model);
return this->m_model->columnCount(QModelIndex());
}
template <class ModelClass, class ContainerType> bool CViewBase<ModelClass, ContainerType>::isEmpty() const
template <class ModelClass, class ContainerType, class ObjectType> bool CViewBase<ModelClass, ContainerType, ObjectType>::isEmpty() const
{
Q_ASSERT(this->m_model);
return this->m_model->rowCount() < 1;
}
template <class ModelClass, class ContainerType> void CViewBase<ModelClass, ContainerType>::setObjectName(const QString &name)
template <class ModelClass, class ContainerType, class ObjectType> void CViewBase<ModelClass, ContainerType, ObjectType>::setObjectName(const QString &name)
{
// then name here is mainly set for debugging purposes so each model can be identified
Q_ASSERT(m_model);
@@ -215,7 +236,7 @@ namespace BlackGui
this->m_model->setObjectName(modelName);
}
template <class ModelClass, class ContainerType> void CViewBase<ModelClass, ContainerType>::setSortIndicator()
template <class ModelClass, class ContainerType, class ObjectType> void CViewBase<ModelClass, ContainerType, ObjectType>::setSortIndicator()
{
if (this->m_model->hasValidSortColumn())
{
@@ -226,7 +247,7 @@ namespace BlackGui
}
}
template <class ModelClass, class ContainerType> void CViewBase<ModelClass, ContainerType>::standardInit(ModelClass *model)
template <class ModelClass, class ContainerType, class ObjectType> void CViewBase<ModelClass, ContainerType, ObjectType>::standardInit(ModelClass *model)
{
Q_ASSERT(model || this->m_model);
if (model)
@@ -239,7 +260,7 @@ namespace BlackGui
this->setSortIndicator();
}
template <class ModelClass, class ContainerType> void CViewBase<ModelClass, ContainerType>::performResizeToContents()
template <class ModelClass, class ContainerType, class ObjectType> void CViewBase<ModelClass, ContainerType, ObjectType>::performResizeToContents()
{
// small set or large set?
if (this->performResizing())
@@ -252,7 +273,7 @@ namespace BlackGui
}
}
template <class ModelClass, class ContainerType> int CViewBase<ModelClass, ContainerType>::performUpdateContainer(const BlackMisc::CVariant &variant, bool sort, bool resize)
template <class ModelClass, class ContainerType, class ObjectType> int CViewBase<ModelClass, ContainerType, ObjectType>::performUpdateContainer(const BlackMisc::CVariant &variant, bool sort, bool resize)
{
ContainerType c;
c.convertFromCVariant(variant);
@@ -261,16 +282,16 @@ namespace BlackGui
// see here for the reason of thess forward instantiations
// http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html
template class CViewBase<BlackGui::Models::CStatusMessageListModel, BlackMisc::CStatusMessageList>;
template class CViewBase<BlackGui::Models::CNameVariantPairModel, BlackMisc::CNameVariantPairList>;
template class CViewBase<BlackGui::Models::CAtcStationListModel, BlackMisc::Aviation::CAtcStationList>;
template class CViewBase<BlackGui::Models::CAircraftListModel, BlackMisc::Aviation::CAircraftList>;
template class CViewBase<BlackGui::Models::CAirportListModel, BlackMisc::Aviation::CAirportList>;
template class CViewBase<BlackGui::Models::CServerListModel, BlackMisc::Network::CServerList>;
template class CViewBase<BlackGui::Models::CUserListModel, BlackMisc::Network::CUserList>;
template class CViewBase<BlackGui::Models::CClientListModel, BlackMisc::Network::CClientList>;
template class CViewBase<BlackGui::Models::CAircraftModelListModel, BlackMisc::Network::CAircraftModelList>;
template class CViewBase<BlackGui::Models::CKeyboardKeyListModel, BlackMisc::Settings::CSettingKeyboardHotkeyList>;
template class CViewBase<BlackGui::Models::CStatusMessageListModel, BlackMisc::CStatusMessageList, BlackMisc::CStatusMessage>;
template class CViewBase<BlackGui::Models::CNameVariantPairModel, BlackMisc::CNameVariantPairList, BlackMisc::CNameVariantPair>;
template class CViewBase<BlackGui::Models::CAtcStationListModel, BlackMisc::Aviation::CAtcStationList, BlackMisc::Aviation::CAtcStation>;
template class CViewBase<BlackGui::Models::CAircraftListModel, BlackMisc::Aviation::CAircraftList, BlackMisc::Aviation::CAircraft>;
template class CViewBase<BlackGui::Models::CAirportListModel, BlackMisc::Aviation::CAirportList, BlackMisc::Aviation::CAirport>;
template class CViewBase<BlackGui::Models::CServerListModel, BlackMisc::Network::CServerList, BlackMisc::Network::CServer>;
template class CViewBase<BlackGui::Models::CUserListModel, BlackMisc::Network::CUserList, BlackMisc::Network::CUser>;
template class CViewBase<BlackGui::Models::CClientListModel, BlackMisc::Network::CClientList, BlackMisc::Network::CClient>;
template class CViewBase<BlackGui::Models::CAircraftModelListModel, BlackMisc::Network::CAircraftModelList, BlackMisc::Network::CAircraftModel>;
template class CViewBase<BlackGui::Models::CKeyboardKeyListModel, BlackMisc::Settings::CSettingKeyboardHotkeyList, BlackMisc::Settings::CSettingKeyboardHotkey>;
} // namespace
} // namespace

View File

@@ -20,6 +20,7 @@
#include <QMenu>
#include <QPoint>
#include <QFont>
#include <QList>
namespace BlackGui
{
@@ -63,6 +64,12 @@ namespace BlackGui
//! Horizontal font height
int getHorizontalHeaderFontHeight() const;
//! Selection (selected rows)
bool hasSelection() const;
//! Selected rows if any
QModelIndexList selectedRows() const;
signals:
//! Ask for new data
void requestUpdate();
@@ -140,7 +147,7 @@ namespace BlackGui
};
//! Base class for views
template <class ModelClass, class ContainerType> class CViewBase : public CViewBaseNonTemplate
template <class ModelClass, class ContainerType, class ObjectType> class CViewBase : public CViewBaseNonTemplate
{
public:
@@ -166,7 +173,7 @@ namespace BlackGui
void updateContainerMaybeAsync(const ContainerType &container, bool sort = true, bool performResizing = true);
//! Insert
template<class ObjectType> void insert(const ObjectType &value, bool resize = true)
void insert(const ObjectType &value, bool resize = true)
{
Q_ASSERT(this->m_model);
this->m_model->insert(value);
@@ -174,12 +181,15 @@ namespace BlackGui
}
//! Value object at
template<class ObjectType> const ObjectType &at(const QModelIndex &index) const
const ObjectType &at(const QModelIndex &index) const
{
Q_ASSERT(this->m_model);
return this->m_model->at(index);
}
//! Selected objects
ContainerType selectedObjects() const;
//! Row count
int rowCount() const;