qeditor: introduce a message widget to display non-interactive messages

Change-Id: Iad43efa1f09428389fbd09403c1ae20d2805f1c5
Reviewed-on: http://gerrit.rockbox.org/987
Reviewed-by: Amaury Pouly <amaury.pouly@gmail.com>
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp
index c92dad4..32d08a7 100644
--- a/utils/regtools/qeditor/regtab.cpp
+++ b/utils/regtools/qeditor/regtab.cpp
@@ -149,8 +149,10 @@
     data_sel_layout->addWidget(m_data_sel_reload);
     data_sel_group->setLayout(data_sel_layout);
     m_data_soc_label->setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
+    m_msg = new MessageWidget(this);
 
     m_right_panel->addWidget(data_sel_group, 0);
+    m_right_panel->addWidget(m_msg, 0);
     m_right_content = 0;
     SetPanel(new EmptyRegTabPanel);
     QWidget *w = new QWidget;
@@ -176,6 +178,9 @@
     connect(m_data_sel_reload, SIGNAL(clicked(bool)), this, SLOT(OnBackendReload(bool)));
     connect(m_type_selector, SIGNAL(currentChanged(int)), this, SLOT(OnTypeChanged(int)));
 
+    SetMessage(MessageWidget::Information,
+        "You can browse the registers. Select a data source to analyse the values.");
+
     OnSocListChanged();
     SetDataSocName("");
     UpdateTabName();
@@ -310,6 +315,11 @@
     SetPanel(new SocDisplayPanel(this, ref));
 }
 
+void RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg)
+{
+    m_msg->SetMessage(type, msg);
+}
+
 void RegTab::SetPanel(RegTabPanel *panel)
 {
     delete m_right_content;
diff --git a/utils/regtools/qeditor/regtab.h b/utils/regtools/qeditor/regtab.h
index c19af0a..f088e7a 100644
--- a/utils/regtools/qeditor/regtab.h
+++ b/utils/regtools/qeditor/regtab.h
@@ -78,6 +78,7 @@
     void SetPanel(RegTabPanel *panel);
     void UpdateSocFilename();
     void UpdateTabName();
+    void SetMessage(MessageWidget::MessageType type, const QString& msg);
 
     QComboBox *m_soc_selector;
     BackendSelector *m_backend_selector;
@@ -93,6 +94,7 @@
     IoBackend *m_io_backend;
     QTabWidget *m_type_selector;
     QListWidget *m_analysers_list;
+    MessageWidget *m_msg;
 
 private slots:
     void SetReadOnlyIndicator();
diff --git a/utils/regtools/qeditor/utils.cpp b/utils/regtools/qeditor/utils.cpp
index cf8f104..677d24d 100644
--- a/utils/regtools/qeditor/utils.cpp
+++ b/utils/regtools/qeditor/utils.cpp
@@ -964,3 +964,83 @@
     delete m_io_backend;
     m_io_backend = new_backend;
 }
+
+/**
+ * MessageWidget
+ */
+MessageWidget::MessageWidget(QWidget *parent)
+    :QFrame(parent)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
+
+    m_icon = new QLabel(this);
+    m_icon->hide();
+    m_text = new QLabel(this);
+    m_text->setTextFormat(Qt::RichText);
+    m_close = new QToolButton(this);
+    m_close->setText("close");
+    m_close->setIcon(style()->standardIcon(QStyle::SP_DialogCloseButton));
+    m_close->setAutoRaise(true);
+
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->addWidget(m_icon, 0);
+    layout->addWidget(m_text, 1);
+    layout->addWidget(m_close, 0);
+
+    connect(m_close, SIGNAL(clicked(bool)), this, SLOT(OnClose(bool)));
+
+    hide();
+}
+
+MessageWidget::~MessageWidget()
+{
+}
+
+void MessageWidget::UpdateType()
+{
+    /* style stolen from KMessageWidget */
+    QColor bg, border;
+    switch(m_type)
+    {
+        case Positive:
+            bg.setRgb(140, 228, 124);
+            border.setRgb(56, 175, 58);
+            break;
+        case Information:
+            bg.setRgb(161, 178, 202);
+            border.setRgb(59, 79, 175);
+            break;
+        case Warning:
+            bg.setRgb(228, 227, 127);
+            border.setRgb(175, 169, 61);
+            break;
+        case Error:
+            bg.setRgb(233, 199, 196);
+            border.setRgb(175, 74, 60);
+            break;
+        default:
+            break;
+    }
+    setStyleSheet(QString(
+        "QFrame { background-color: %1;"
+            "border-radius: 5px;"
+            "border: 1px solid %2;"
+        "}"
+        "QLabel { border: none; }")
+        .arg(bg.name())
+        .arg(border.name()));
+}
+
+void MessageWidget::SetMessage(MessageType type, const QString& msg)
+{
+    m_type = type;
+    m_text->setText(msg);
+    UpdateType();
+    show();
+}
+
+void MessageWidget::OnClose(bool clicked)
+{
+    Q_UNUSED(clicked);
+    hide();
+}
diff --git a/utils/regtools/qeditor/utils.h b/utils/regtools/qeditor/utils.h
index 8bb1a70..ec3175b 100644
--- a/utils/regtools/qeditor/utils.h
+++ b/utils/regtools/qeditor/utils.h
@@ -338,4 +338,32 @@
     void OnDataSelChanged(int index);
 };
 
+class MessageWidget : public QFrame
+{
+    Q_OBJECT
+public:
+    enum MessageType
+    {
+        Positive,
+        Information,
+        Warning,
+        Error
+    };
+
+    MessageWidget(QWidget *parent = 0);
+    virtual ~MessageWidget();
+    void SetMessage(MessageType type, const QString& msg);
+
+protected:
+    void UpdateType();
+
+    QLabel *m_icon;
+    QLabel *m_text;
+    QToolButton *m_close;
+    MessageType m_type;
+
+private slots:
+    void OnClose(bool clicked);
+};
+
 #endif /* AUX_H */