From e5ab3e063ba6e95f76a6d4431585e8cfb0c50d33 Mon Sep 17 00:00:00 2001 From: dabrain34 Date: Mon, 2 Jan 2017 11:20:16 +0100 Subject: [PATCH] Add tooltip for pad Display the pad caps when the mouse is over an element's pad. --- src/GraphDisplay.cpp | 39 ++++++++++++++++++++++++ src/GraphDisplay.h | 3 ++ src/GraphManager.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++++ src/GraphManager.h | 10 ++++++ 4 files changed, 124 insertions(+) diff --git a/src/GraphDisplay.cpp b/src/GraphDisplay.cpp index 55fb780..212c149 100644 --- a/src/GraphDisplay.cpp +++ b/src/GraphDisplay.cpp @@ -24,6 +24,33 @@ GraphDisplay::GraphDisplay(QWidget *parent, Qt::WindowFlags f): QWidget(parent, f) { setFocusPolicy(Qt::WheelFocus); + setMouseTracking(true); +} + +ElementInfo* GraphDisplay::getElement(std::size_t elementId) +{ + ElementInfo* element = NULL; + std::size_t i=0; + for(; im_pads.size(); j++) + if(element->m_pads[j].m_id == padId) { + pad = &element->m_pads[j]; + break; + } + return pad; } void GraphDisplay::updateDisplayInfoIds() @@ -457,6 +484,18 @@ void GraphDisplay::mouseMoveEvent(QMouseEvent *event) { m_moveInfo.m_position = event -> pos(); repaint(); + } else { + std::size_t elementId, padId; + getIdByPosition(event -> pos(), elementId, padId); + if (padId != ((size_t)-1)) { + ElementInfo* element = getElement(elementId); + PadInfo* pad = getPad(element, padId); + QString caps = m_pGraph->getPadCaps(element,pad,PAD_CAPS_ALL,true); + setToolTip(caps); + } + else + setToolTip(""); + } } diff --git a/src/GraphDisplay.h b/src/GraphDisplay.h index 36e0773..db5cdc8 100644 --- a/src/GraphDisplay.h +++ b/src/GraphDisplay.h @@ -79,6 +79,9 @@ private: void disconnect(std::size_t elementId, std::size_t padId); void requestPad(std::size_t elementId); + ElementInfo* getElement(std::size_t elementId); + PadInfo* getPad(ElementInfo* element, std::size_t padId); + std::vector m_info; std::vector m_displayInfo; diff --git a/src/GraphManager.cpp b/src/GraphManager.cpp index 2bd47c6..5ecd91a 100644 --- a/src/GraphManager.cpp +++ b/src/GraphManager.cpp @@ -8,6 +8,19 @@ #include "CustomSettings.h" +#define MAX_STR_CAPS_SIZE 150 +gchar* get_str_caps_limited(gchar* str) +{ + gchar* result; + if(strlen(str) > MAX_STR_CAPS_SIZE) { + result = g_strndup(str, MAX_STR_CAPS_SIZE); + for(int i = strlen(result)-1;i > strlen(result)-4 ;i--) + result[i] = '.'; + } else + result = g_strdup(str); + return result; +} + GraphManager::GraphManager() { m_pGraph = gst_pipeline_new ("pipeline"); @@ -19,6 +32,65 @@ GraphManager::~GraphManager() } +QString GraphManager::getPadCaps(ElementInfo* elementInfo, PadInfo* padInfo, ePadCapsSubset subset, bool afTruncated) +{ + QString padCaps = ""; + if(!elementInfo || !padInfo) + return padCaps; + + GstElement *element = gst_bin_get_by_name (GST_BIN(m_pGraph), elementInfo->m_name.c_str()); + + if(!element) + return padCaps; + GstPad *pad = gst_element_get_static_pad(GST_ELEMENT(element), padInfo->m_name.c_str()); + if(!pad) { + gst_object_unref(element); + return padCaps; + } + GstCaps *caps; + switch(subset) + { + case PAD_CAPS_ALLOWED: + caps = gst_pad_get_allowed_caps(pad); + break; + case PAD_CAPS_NEGOCIATED: +#if GST_VERSION_MAJOR >= 1 + caps = gst_pad_get_current_caps(pad, NULL); +#else + caps = gst_pad_get_negotiated_caps(pad); +#endif + break; + case PAD_CAPS_ALL: + default: +#if GST_VERSION_MAJOR >= 1 + caps = gst_pad_query_caps(pad, NULL); +#else + caps = gst_pad_get_caps(pad); +#endif + } +#if GST_VERSION_MAJOR >= 1 + caps = gst_pad_query_caps(pad, NULL); +#else + caps = gst_pad_get_caps(pad); +#endif + if(caps) { + gchar* str = gst_caps_to_string(caps); + if (afTruncated) { + gchar* str_limited = get_str_caps_limited(str); + g_free(str); + padCaps = str_limited; + g_free(str_limited); + } else { + padCaps = str; + g_free(str); + } + + } + + gst_object_unref(element); + gst_object_unref (pad); + return padCaps; +} bool GraphManager::AddPlugin(const char *plugin, const char *name) { diff --git a/src/GraphManager.h b/src/GraphManager.h index be5735f..8ee88c4 100644 --- a/src/GraphManager.h +++ b/src/GraphManager.h @@ -6,6 +6,14 @@ #include #include +class QString; + +enum ePadCapsSubset { + PAD_CAPS_ALLOWED = 0, + PAD_CAPS_NEGOCIATED, + PAD_CAPS_ALL +}; + struct PadInfo { public: @@ -94,6 +102,8 @@ public: bool Pause(); bool Stop(); + QString getPadCaps(ElementInfo* elementInfo, PadInfo* padInfo, ePadCapsSubset subset, bool afTruncated = false); + GstElement *m_pGraph; };