44
50
Menu::Ptr m_topMenu;
45
51
MenuItem::Ptr m_topItem;
47
ModemManager::Ptr m_modemManager;
53
Manager::Ptr m_manager;
49
55
TextItem::Ptr m_openCellularSettings;
51
std::list<std::pair<Modem::Ptr, WwanLinkItem::Ptr>> m_items;
57
QMap<wwan::Modem::Ptr, WwanLinkItem::Ptr> m_items;
53
59
Private() = delete;
54
Private(ModemManager::Ptr modemManager);
60
Private(Manager::Ptr modemManager);
57
void modemsChanged(const QList<Modem::Ptr> &modems);
59
65
void openCellularSettings()
61
UrlDispatcher::send("settings:///system/cellular", [](std::string url, bool success){
67
UrlDispatcher::send("settings:///system/cellular", [](string url, bool success)
63
std::cerr << "URL Dispatcher failed on " << url << std::endl;
71
cerr << "URL Dispatcher failed on " << url << endl;
68
WwanSection::Private::Private(ModemManager::Ptr modemManager)
69
: m_modemManager{modemManager}
77
WwanSection::Private::Private(Manager::Ptr modemManager)
78
: m_manager{modemManager}
71
m_actionGroupMerger = std::make_shared<ActionGroupMerger>();
72
m_menuMerger = std::make_shared<MenuMerger>();
80
m_actionGroupMerger = make_shared<ActionGroupMerger>();
81
m_menuMerger = make_shared<MenuMerger>();
74
m_upperMenu = std::make_shared<Menu>();
75
m_linkMenuMerger = std::make_shared<MenuMerger>();
76
m_bottomMenu = std::make_shared<Menu>();
83
m_upperMenu = make_shared<Menu>();
84
m_linkMenuMerger = make_shared<MenuMerger>();
85
m_bottomMenu = make_shared<Menu>();
78
87
m_menuMerger->append(m_upperMenu);
79
88
m_menuMerger->append(m_linkMenuMerger);
82
91
// have the modem list in their own section.
83
92
m_topItem = MenuItem::newSection(m_menuMerger);
84
m_topMenu = std::make_shared<Menu>();
93
m_topMenu = make_shared<Menu>();
85
94
m_topMenu->append(m_topItem);
87
m_openCellularSettings = std::make_shared<TextItem>(_("Cellular settings…"), "cellular", "settings");
96
m_openCellularSettings = make_shared<TextItem>(_("Cellular settings…"), "cellular", "settings");
88
97
connect(m_openCellularSettings.get(), &TextItem::activated, this, &Private::openCellularSettings);
89
m_actionGroupMerger->add(*m_openCellularSettings);
98
m_actionGroupMerger->add(m_openCellularSettings->actionGroup());
91
100
// already synced with GMainLoop
92
connect(m_modemManager.get(), &ModemManager::modemsUpdated, this, &Private::modemsChanged);
93
modemsChanged(m_modemManager->modems());
101
connect(m_manager.get(), &Manager::linksUpdated, this, &Private::modemsChanged);
97
WwanSection::Private::modemsChanged(const QList<Modem::Ptr> &modems)
106
WwanSection::Private::modemsChanged()
99
std::set<Modem::Ptr> current;
100
for (auto element : m_items)
102
current.insert(element.first);
105
std::set<Modem::Ptr> removed;
106
std::set_difference(current.begin(), current.end(),
107
modems.begin(), modems.end(),
108
std::inserter(removed, removed.begin()));
110
std::set<Modem::Ptr> added;
111
std::set_difference(modems.begin(), modems.end(),
112
current.begin(), current.end(),
113
std::inserter(added, added.begin()));
114
for (auto modem : removed) {
115
for (auto iter = m_items.begin(); iter != m_items.end(); ++iter) {
116
m_linkMenuMerger->remove(*(*iter).second);
117
m_actionGroupMerger->remove(*(*iter).second);
118
iter = m_items.erase(iter);
123
for (auto modem : added) {
124
auto item = std::make_shared<WwanLinkItem>(modem, m_modemManager);
126
m_items.push_back(std::make_pair(modem, item));
127
m_actionGroupMerger->add(*item);
129
// for now just throw everything away and rebuild
130
/// @todo add MenuMerger::insert() and ::find()
131
m_linkMenuMerger->clear();
133
std::multimap<int, WwanLinkItem::Ptr, Modem::Compare> sorted;
134
for (auto pair : m_items) {
135
sorted.insert(std::make_pair(pair.first->index(), pair.second));
137
for (auto pair : sorted)
138
m_linkMenuMerger->append(*(pair.second));
141
if (modems.size() == 0) {
108
auto modems = m_manager->modemLinks();
109
auto current(m_items.keys().toSet());
111
auto removed(current);
112
removed.subtract(modems);
115
added.subtract(current);
117
for (auto modem : removed)
119
m_linkMenuMerger->remove(m_items[modem]->menuModel());
120
m_actionGroupMerger->remove(m_items[modem]->actionGroup());
121
m_items.remove(modem);
124
for (auto modem : added)
126
auto item = make_shared<WwanLinkItem>(modem, m_manager);
127
m_items[modem] = item;
128
m_actionGroupMerger->add(item->actionGroup());
131
// for now just throw everything away and rebuild
132
/// @todo add MenuMerger::insert() and ::find()
133
m_linkMenuMerger->clear();
135
multimap<int, WwanLinkItem::Ptr, wwan::Modem::Compare> sorted;
136
QMapIterator<wwan::Modem::Ptr, WwanLinkItem::Ptr> it(m_items);
140
sorted.insert(make_pair(it.key()->index(), it.value()));
142
for (auto pair : sorted)
144
m_linkMenuMerger->append(pair.second->menuModel());
147
if (modems.size() == 0)
142
149
m_bottomMenu->clear();
144
if (m_bottomMenu->find(*m_openCellularSettings) == m_bottomMenu->end())
145
m_bottomMenu->append(*m_openCellularSettings);
153
if (m_bottomMenu->find(m_openCellularSettings->menuItem()) == m_bottomMenu->end())
155
m_bottomMenu->append(m_openCellularSettings->menuItem());
148
if (m_items.size() > 1) {
149
for(auto i : m_items)
150
i.second->showSimIdentifier(true);
152
for(auto i : m_items)
153
i.second->showSimIdentifier(false);
159
bool showSimIdentifier = (m_items.size() > 1);
160
for(auto item: m_items.values())
162
item->showSimIdentifier(showSimIdentifier);
157
WwanSection::WwanSection(ModemManager::Ptr modemManager)
158
: d{new Private(modemManager)}
166
WwanSection::WwanSection(nmofono::Manager::Ptr manager)
167
: d{new Private(manager)}