~indicator-applet-developers/indicator-network/trunk.15.04

« back to all changes in this revision

Viewing changes to src/indicator/sections/wwan-section.cpp

  • Committer: Antti Kaijanmäki
  • Date: 2015-05-19 09:48:52 UTC
  • mfrom: (482.1.9 indicator-network)
  • Revision ID: antti.kaijanmaki@canonical.com-20150519094852-jzwlc4xfldqunxiw
sync from 15.10 to get the branch match the released packages.

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
#include "menumodel-cpp/action-group-merger.h"
25
25
#include "menumodel-cpp/menu-merger.h"
26
26
 
27
 
#include "modem-manager.h"
28
 
 
29
27
#include "url-dispatcher-cpp/url-dispatcher.h"
30
28
 
 
29
#include <util/qhash-sharedptr.h>
 
30
#include <util/localisation.h>
 
31
 
 
32
#include <QDebug>
 
33
 
 
34
using namespace std;
 
35
using namespace nmofono;
 
36
 
31
37
class WwanSection::Private: public QObject
32
38
{
33
39
    Q_OBJECT
44
50
    Menu::Ptr m_topMenu;
45
51
    MenuItem::Ptr m_topItem;
46
52
 
47
 
    ModemManager::Ptr m_modemManager;
 
53
    Manager::Ptr m_manager;
48
54
 
49
55
    TextItem::Ptr m_openCellularSettings;
50
56
 
51
 
    std::list<std::pair<Modem::Ptr, WwanLinkItem::Ptr>> m_items;
 
57
    QMap<wwan::Modem::Ptr, WwanLinkItem::Ptr> m_items;
52
58
 
53
59
    Private() = delete;
54
 
    Private(ModemManager::Ptr modemManager);
 
60
    Private(Manager::Ptr modemManager);
55
61
 
56
62
public Q_SLOTS:
57
 
    void modemsChanged(const QList<Modem::Ptr> &modems);
 
63
    void modemsChanged();
58
64
 
59
65
    void openCellularSettings()
60
66
    {
61
 
        UrlDispatcher::send("settings:///system/cellular", [](std::string url, bool success){
 
67
        UrlDispatcher::send("settings:///system/cellular", [](string url, bool success)
 
68
        {
62
69
            if (!success)
63
 
                std::cerr << "URL Dispatcher failed on " << url << std::endl;
 
70
            {
 
71
                cerr << "URL Dispatcher failed on " << url << endl;
 
72
            }
64
73
        });
65
74
    }
66
75
};
67
76
 
68
 
WwanSection::Private::Private(ModemManager::Ptr modemManager)
69
 
    : m_modemManager{modemManager}
 
77
WwanSection::Private::Private(Manager::Ptr modemManager)
 
78
    : m_manager{modemManager}
70
79
{
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>();
73
82
 
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>();
77
86
 
78
87
    m_menuMerger->append(m_upperMenu);
79
88
    m_menuMerger->append(m_linkMenuMerger);
81
90
 
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);
86
95
 
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());
90
99
 
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);
 
102
    modemsChanged();
94
103
}
95
104
 
96
105
void
97
 
WwanSection::Private::modemsChanged(const QList<Modem::Ptr> &modems)
 
106
WwanSection::Private::modemsChanged()
98
107
{
99
 
    std::set<Modem::Ptr> current;
100
 
    for (auto element : m_items)
101
 
    {
102
 
        current.insert(element.first);
103
 
    }
104
 
 
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()));
109
 
 
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);
119
 
            --iter;
120
 
        }
121
 
    }
122
 
 
123
 
    for (auto modem : added) {
124
 
        auto item = std::make_shared<WwanLinkItem>(modem, m_modemManager);
125
 
 
126
 
        m_items.push_back(std::make_pair(modem, item));
127
 
        m_actionGroupMerger->add(*item);
128
 
 
129
 
        // for now just throw everything away and rebuild
130
 
        /// @todo add MenuMerger::insert() and ::find()
131
 
        m_linkMenuMerger->clear();
132
 
 
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));
136
 
        }
137
 
        for (auto pair : sorted)
138
 
            m_linkMenuMerger->append(*(pair.second));
139
 
    }
140
 
 
141
 
    if (modems.size() == 0) {
 
108
    auto modems = m_manager->modemLinks();
 
109
    auto current(m_items.keys().toSet());
 
110
 
 
111
    auto removed(current);
 
112
    removed.subtract(modems);
 
113
 
 
114
    auto added(modems);
 
115
    added.subtract(current);
 
116
 
 
117
    for (auto modem : removed)
 
118
    {
 
119
        m_linkMenuMerger->remove(m_items[modem]->menuModel());
 
120
        m_actionGroupMerger->remove(m_items[modem]->actionGroup());
 
121
        m_items.remove(modem);
 
122
    }
 
123
 
 
124
    for (auto modem : added)
 
125
    {
 
126
        auto item = make_shared<WwanLinkItem>(modem, m_manager);
 
127
        m_items[modem] = item;
 
128
        m_actionGroupMerger->add(item->actionGroup());
 
129
    }
 
130
 
 
131
    // for now just throw everything away and rebuild
 
132
    /// @todo add MenuMerger::insert() and ::find()
 
133
    m_linkMenuMerger->clear();
 
134
 
 
135
    multimap<int, WwanLinkItem::Ptr, wwan::Modem::Compare> sorted;
 
136
    QMapIterator<wwan::Modem::Ptr, WwanLinkItem::Ptr> it(m_items);
 
137
    while (it.hasNext())
 
138
    {
 
139
        it.next();
 
140
        sorted.insert(make_pair(it.key()->index(), it.value()));
 
141
    }
 
142
    for (auto pair : sorted)
 
143
    {
 
144
        m_linkMenuMerger->append(pair.second->menuModel());
 
145
    }
 
146
 
 
147
    if (modems.size() == 0)
 
148
    {
142
149
        m_bottomMenu->clear();
143
 
    } else {
144
 
        if (m_bottomMenu->find(*m_openCellularSettings) == m_bottomMenu->end())
145
 
            m_bottomMenu->append(*m_openCellularSettings);
 
150
    }
 
151
    else
 
152
    {
 
153
        if (m_bottomMenu->find(m_openCellularSettings->menuItem()) == m_bottomMenu->end())
 
154
        {
 
155
            m_bottomMenu->append(m_openCellularSettings->menuItem());
 
156
        }
146
157
    }
147
158
 
148
 
    if (m_items.size() > 1) {
149
 
        for(auto i : m_items)
150
 
            i.second->showSimIdentifier(true);
151
 
    } else {
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())
 
161
    {
 
162
        item->showSimIdentifier(showSimIdentifier);
154
163
    }
155
164
}
156
165
 
157
 
WwanSection::WwanSection(ModemManager::Ptr modemManager)
158
 
    : d{new Private(modemManager)}
 
166
WwanSection::WwanSection(nmofono::Manager::Ptr manager)
 
167
    : d{new Private(manager)}
159
168
{
160
169
}
161
170
 
167
176
ActionGroup::Ptr
168
177
WwanSection::actionGroup()
169
178
{
170
 
    return *d->m_actionGroupMerger;
 
179
    return d->m_actionGroupMerger->actionGroup();
171
180
}
172
181
 
173
182
MenuModel::Ptr
179
188
void
180
189
WwanSection::unlockAllModems()
181
190
{
182
 
    d->m_modemManager->unlockAllModems();
 
191
    d->m_manager->unlockAllModems();
183
192
}
184
193
 
185
194
void
186
195
WwanSection::unlockModem(const QString &name)
187
196
{
188
 
    d->m_modemManager->unlockModemByName(name);
 
197
    d->m_manager->unlockModemByName(name);
189
198
}
190
199
 
191
200
#include "wwan-section.moc"