Kaydet (Commit) 2c498cfe authored tarafından Caolán McNamara's avatar Caolán McNamara

block buttons with click handlers from setting a response

which is effectively what vcl buttons do

Change-Id: Ic4374b3a761b954548ff10d654422d14ef6e0763
Reviewed-on: https://gerrit.libreoffice.org/51710Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 678980ce
...@@ -1161,12 +1161,12 @@ namespace ...@@ -1161,12 +1161,12 @@ namespace
void set_help_id(const GtkWidget *pWidget, const OString& rHelpId) void set_help_id(const GtkWidget *pWidget, const OString& rHelpId)
{ {
gchar *helpid = g_strdup(rHelpId.getStr()); gchar *helpid = g_strdup(rHelpId.getStr());
g_object_set_data_full(G_OBJECT(pWidget), "helpid", helpid, g_free); g_object_set_data_full(G_OBJECT(pWidget), "g-lo-helpid", helpid, g_free);
} }
OString get_help_id(const GtkWidget *pWidget) OString get_help_id(const GtkWidget *pWidget)
{ {
void* pData = g_object_get_data(G_OBJECT(pWidget), "helpid"); void* pData = g_object_get_data(G_OBJECT(pWidget), "g-lo-helpid");
const gchar* pStr = static_cast<const gchar*>(pData); const gchar* pStr = static_cast<const gchar*>(pData);
return OString(pStr, pStr ? strlen(pStr) : 0); return OString(pStr, pStr ? strlen(pStr) : 0);
} }
...@@ -1563,6 +1563,8 @@ private: ...@@ -1563,6 +1563,8 @@ private:
help(); help();
return; return;
} }
else if (has_click_handler(ret))
return;
hide(); hide();
m_aFunc(GtkToVcl(ret)); m_aFunc(GtkToVcl(ret));
...@@ -1595,6 +1597,8 @@ public: ...@@ -1595,6 +1597,8 @@ public:
return true; return true;
} }
bool has_click_handler(int nResponse);
virtual int run() override virtual int run() override
{ {
sort_native_button_order(GTK_BOX(gtk_dialog_get_action_area(m_pDialog))); sort_native_button_order(GTK_BOX(gtk_dialog_get_action_area(m_pDialog)));
...@@ -1607,6 +1611,9 @@ public: ...@@ -1607,6 +1611,9 @@ public:
help(); help();
continue; continue;
} }
else if (has_click_handler(ret))
continue;
break; break;
} }
hide(); hide();
...@@ -1630,10 +1637,7 @@ public: ...@@ -1630,10 +1637,7 @@ public:
return nResponse; return nResponse;
} }
virtual void response(int nResponse) override virtual void response(int nResponse) override;
{
gtk_dialog_response(m_pDialog, VclToGtk(nResponse));
}
virtual void add_button(const OUString& rText, int nResponse, const OString& rHelpId) override virtual void add_button(const OUString& rText, int nResponse, const OString& rHelpId) override
{ {
...@@ -1834,12 +1838,14 @@ private: ...@@ -1834,12 +1838,14 @@ private:
GtkInstanceButton* pThis = static_cast<GtkInstanceButton*>(widget); GtkInstanceButton* pThis = static_cast<GtkInstanceButton*>(widget);
pThis->signal_clicked(); pThis->signal_clicked();
} }
public: public:
GtkInstanceButton(GtkButton* pButton, bool bTakeOwnership) GtkInstanceButton(GtkButton* pButton, bool bTakeOwnership)
: GtkInstanceContainer(GTK_CONTAINER(pButton), bTakeOwnership) : GtkInstanceContainer(GTK_CONTAINER(pButton), bTakeOwnership)
, m_pButton(pButton) , m_pButton(pButton)
, m_nSignalId(g_signal_connect(pButton, "clicked", G_CALLBACK(signalClicked), this)) , m_nSignalId(g_signal_connect(pButton, "clicked", G_CALLBACK(signalClicked), this))
{ {
g_object_set_data(G_OBJECT(m_pButton), "g-lo-GtkInstanceButton", this);
} }
virtual void set_label(const OUString& rText) override virtual void set_label(const OUString& rText) override
...@@ -1853,20 +1859,56 @@ public: ...@@ -1853,20 +1859,56 @@ public:
return OUString(pStr, pStr ? strlen(pStr) : 0, RTL_TEXTENCODING_UTF8); return OUString(pStr, pStr ? strlen(pStr) : 0, RTL_TEXTENCODING_UTF8);
} }
// allow us to block buttons with click handlers making dialogs return a response
bool has_click_handler() const
{
return m_aClickHdl.IsSet();
}
void clear_click_handler()
{
m_aClickHdl = Link<Button&, void>();
}
virtual ~GtkInstanceButton() override virtual ~GtkInstanceButton() override
{ {
g_object_steal_data(G_OBJECT(m_pButton), "g-lo-GtkInstanceButton");
g_signal_handler_disconnect(m_pButton, m_nSignalId); g_signal_handler_disconnect(m_pButton, m_nSignalId);
} }
}; };
weld::Button* GtkInstanceDialog::get_widget_for_response(int nResponse) weld::Button* GtkInstanceDialog::get_widget_for_response(int nResponse)
{ {
GtkButton* pButton = GTK_BUTTON(gtk_dialog_get_widget_for_response(m_pDialog, nResponse)); GtkButton* pButton = GTK_BUTTON(gtk_dialog_get_widget_for_response(m_pDialog, VclToGtk(nResponse)));
if (!pButton) if (!pButton)
return nullptr; return nullptr;
return new GtkInstanceButton(pButton, false); return new GtkInstanceButton(pButton, false);
} }
void GtkInstanceDialog::response(int nResponse)
{
//unblock this response now when activated through code
if (GtkWidget* pWidget = gtk_dialog_get_widget_for_response(m_pDialog, VclToGtk(nResponse)))
{
void* pData = g_object_get_data(G_OBJECT(pWidget), "g-lo-GtkInstanceButton");
GtkInstanceButton* pButton = static_cast<GtkInstanceButton*>(pData);
if (pButton)
pButton->clear_click_handler();
}
gtk_dialog_response(m_pDialog, VclToGtk(nResponse));
}
bool GtkInstanceDialog::has_click_handler(int nResponse)
{
if (GtkWidget* pWidget = gtk_dialog_get_widget_for_response(m_pDialog, VclToGtk(nResponse)))
{
void* pData = g_object_get_data(G_OBJECT(pWidget), "g-lo-GtkInstanceButton");
GtkInstanceButton* pButton = static_cast<GtkInstanceButton*>(pData);
return pButton && pButton->has_click_handler();
}
return false;
}
class GtkInstanceToggleButton : public GtkInstanceButton, public virtual weld::ToggleButton class GtkInstanceToggleButton : public GtkInstanceButton, public virtual weld::ToggleButton
{ {
private: private:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment