wpa_gui-qt4: Add context menu for peers dialog
authorJouni Malinen <jouni.malinen@atheros.com>
Thu, 10 Sep 2009 11:43:08 +0000 (14:43 +0300)
committerJouni Malinen <j@w1.fi>
Thu, 10 Sep 2009 11:43:08 +0000 (14:43 +0300)
Replace the clicked() event with more appropriate context menu
and add a WPS PIN entry as an example command.

wpa_supplicant/wpa_gui-qt4/peers.cpp
wpa_supplicant/wpa_gui-qt4/peers.h
wpa_supplicant/wpa_gui-qt4/stringquery.cpp [new file with mode: 0644]
wpa_supplicant/wpa_gui-qt4/stringquery.h [new file with mode: 0644]
wpa_supplicant/wpa_gui-qt4/wpa_gui.pro

index f963e31..6cfb7a6 100644 (file)
 
 #include <cstdio>
 #include <QImageReader>
+#include <QMessageBox>
 
 #include "wpagui.h"
+#include "stringquery.h"
 #include "peers.h"
 
+
+static const int peer_role_address = Qt::UserRole + 1;
+
 /*
  * TODO:
  * - add pending WPS queries (from M1/PIN, PBC?)
@@ -30,9 +35,6 @@ Peers::Peers(QWidget *parent, const char *, bool, Qt::WFlags)
 {
        setupUi(this);
 
-       connect(peers, SIGNAL(clicked(QModelIndex)), this,
-               SLOT(clicked(QModelIndex)));
-
        if (QImageReader::supportedImageFormats().contains(QByteArray("svg")))
                default_icon = new QIcon(":/icons/wpa_gui.svg");
        else
@@ -41,6 +43,10 @@ Peers::Peers(QWidget *parent, const char *, bool, Qt::WFlags)
        peers->setModel(&model);
        peers->setResizeMode(QListView::Adjust);
 
+       peers->setContextMenuPolicy(Qt::CustomContextMenu);
+       connect(peers, SIGNAL(customContextMenuRequested(const QPoint &)),
+               this, SLOT(context_menu(const QPoint &)));
+
        wpagui = NULL;
 }
 
@@ -64,11 +70,56 @@ void Peers::languageChange()
 }
 
 
-void Peers::clicked(const QModelIndex & /*index*/)
+void Peers::context_menu(const QPoint &pos)
+{
+       QMenu *menu = new QMenu;
+       if (menu == NULL)
+               return;
+
+       QModelIndex idx = peers->indexAt(pos);
+       if (idx.isValid()) {
+               ctx_item = model.itemFromIndex(idx);
+               /* TODO: only for peers that are requesting WPS PIN method */
+               menu->addAction(QString("Enter WPS PIN"), this,
+                               SLOT(enter_pin()));
+       } else {
+               ctx_item = NULL;
+               menu->addAction(QString("Refresh"), this, SLOT(ctx_refresh()));
+       }
+
+       menu->exec(peers->mapToGlobal(pos));
+}
+
+
+void Peers::enter_pin()
 {
-       /* QStandardItem *item = model.itemFromIndex(index); */
-       /* TODO: give an option to provide PIN for WPS, etc. */
-       /* printf("Clicked: %s\n", item->text().toAscii().constData()); */
+       if (ctx_item == NULL)
+               return;
+       QString addr = ctx_item->data(peer_role_address).toString();
+       StringQuery input(tr("PIN:"));
+       input.setWindowTitle(tr("PIN for ") + ctx_item->text());
+       if (input.exec() != QDialog::Accepted)
+               return;
+
+       char cmd[100];
+       char reply[100];
+       size_t reply_len;
+       snprintf(cmd, sizeof(cmd), "WPS_PIN %s %s",
+                addr.toAscii().constData(),
+                input.get_string().toAscii().constData());
+       reply_len = sizeof(reply) - 1;
+       if (wpagui->ctrlRequest(cmd, reply, &reply_len) < 0) {
+               QMessageBox msg;
+               msg.setIcon(QMessageBox::Warning);
+               msg.setText("Failed to set the WPS PIN.");
+               msg.exec();
+       }
+}
+
+
+void Peers::ctx_refresh()
+{
+       update_peers();
 }
 
 
@@ -115,6 +166,7 @@ void Peers::update_peers()
 
                QStandardItem *item = new QStandardItem(*default_icon, name);
                if (item) {
+                       item->setData(QString(reply), peer_role_address);
                        item->setToolTip(info);
                        model.appendRow(item);
                }
index 67eaff4..b8c5056 100644 (file)
@@ -32,7 +32,9 @@ public:
        void setWpaGui(WpaGui *_wpagui);
 
 public slots:
-       virtual void clicked(const QModelIndex &index);
+       virtual void context_menu(const QPoint &pos);
+       virtual void enter_pin();
+       virtual void ctx_refresh();
 
 protected slots:
        virtual void languageChange();
@@ -43,6 +45,7 @@ private:
        WpaGui *wpagui;
        QStandardItemModel model;
        QIcon *default_icon;
+       QStandardItem *ctx_item;
 };
 
 #endif /* PEERS_H */
diff --git a/wpa_supplicant/wpa_gui-qt4/stringquery.cpp b/wpa_supplicant/wpa_gui-qt4/stringquery.cpp
new file mode 100644 (file)
index 0000000..1ca98d9
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * wpa_gui - StringQuery class
+ * Copyright (c) 2009, Atheros Communications
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
+ *
+ * See README and COPYING for more details.
+ */
+
+#include <cstdio>
+#include <QLabel>
+
+#include "stringquery.h"
+
+
+StringQuery::StringQuery(QString label)
+{
+       edit = new QLineEdit;
+       edit->setFocus();
+       QGridLayout *layout = new QGridLayout;
+       layout->addWidget(new QLabel(label), 0, 0);
+       layout->addWidget(edit, 0, 1);
+       setLayout(layout);
+
+       connect(edit, SIGNAL(returnPressed()), this, SLOT(accept()));
+}
+
+
+QString StringQuery::get_string()
+{
+       return edit->text();
+}
diff --git a/wpa_supplicant/wpa_gui-qt4/stringquery.h b/wpa_supplicant/wpa_gui-qt4/stringquery.h
new file mode 100644 (file)
index 0000000..1b68217
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * wpa_gui - StringQuery class
+ * Copyright (c) 2009, Atheros Communications
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
+ *
+ * See README and COPYING for more details.
+ */
+
+#ifndef STRINGQUERY_H
+#define STRINGQUERY_H
+
+#include <QDialog>
+#include <QLineEdit>
+#include <QGridLayout>
+
+class StringQuery : public QDialog
+{
+       Q_OBJECT
+
+public:
+       StringQuery(QString label);
+       QString get_string();
+
+private:
+       QLineEdit *edit;
+};
+
+#endif /* STRINGQUERY_H */
index 32272f6..ec01b3b 100644 (file)
@@ -36,7 +36,8 @@ HEADERS       += wpamsg.h \
        userdatarequest.h \
        networkconfig.h \
        addinterface.h \
-       peers.h
+       peers.h \
+       stringquery.h
 
 SOURCES        += main.cpp \
        wpagui.cpp \
@@ -46,6 +47,7 @@ SOURCES       += main.cpp \
        networkconfig.cpp \
        addinterface.cpp \
        peers.cpp \
+       stringquery.cpp \
        ../../src/common/wpa_ctrl.c
 
 RESOURCES += icons.qrc