summaryrefslogtreecommitdiff
path: root/libreofficekit
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-03-10 12:50:59 +0100
committerMiklos Vajna <vmiklos@collabora.co.uk>2015-03-16 09:38:04 +0100
commit5fb4e35f3454cb49bf5e5f611224216862f6f611 (patch)
tree09664e0322bf5e4eb3ed608be3964681bd1fc64b /libreofficekit
parent997ca80cc9da940adbd59ce83999e4ffaf4f64d0 (diff)
lokdocview: add edit-changed signal, so toolbar toggle button is in sync
Editing can start by clicking into the widget or by pressing the toggle button on the toolbar. In the first case the widget should emit a signal, so the the toggle button's state can be up to date. In both toggle button <-> LOK widget direction only update the state if it's not yet up to date to avoid infinite loops. Change-Id: I84c9e7757cd7cde42a95f67f0cb28f9ad6984e7a
Diffstat (limited to 'libreofficekit')
-rw-r--r--libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx19
-rw-r--r--libreofficekit/source/gtk/lokdocview.c26
2 files changed, 40 insertions, 5 deletions
diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
index 360d9f49712c..32a107ee9fca 100644
--- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
+++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx
@@ -34,6 +34,7 @@ static int help()
}
static GtkWidget* pDocView;
+static GtkToolItem* pEnableEditing;
static GtkWidget* pDocViewQuad;
static GtkWidget* pVBox;
// GtkComboBox requires gtk 2.24 or later
@@ -105,11 +106,22 @@ void changeZoom( GtkWidget* pButton, gpointer /* pItem */ )
}
}
+/// User clicked on the button -> inform LOKDocView.
void toggleEditing(GtkWidget* /*pButton*/, gpointer /*pItem*/)
{
LOKDocView* pLOKDocView = LOK_DOCVIEW(pDocView);
- bool bEdit = lok_docview_get_edit(pLOKDocView);
- lok_docview_set_edit(pLOKDocView, !bEdit);
+ bool bActive = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pEnableEditing));
+ if (lok_docview_get_edit(pLOKDocView) != bActive)
+ lok_docview_set_edit(pLOKDocView, bActive);
+}
+
+/// LOKDocView changed edit state -> inform the tool button.
+static void signalEdit(LOKDocView* pLOKDocView, gboolean bWasEdit, gpointer /*pData*/)
+{
+ gboolean bEdit = lok_docview_get_edit(pLOKDocView);
+ g_info("signalEdit: %d -> %d", bWasEdit, lok_docview_get_edit(pLOKDocView));
+ if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(pEnableEditing)) != bEdit)
+ gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(pEnableEditing), bEdit);
}
void changeQuadView( GtkWidget* /*pButton*/, gpointer /* pItem */ )
@@ -347,7 +359,7 @@ int main( int argc, char* argv[] )
g_signal_connect( G_OBJECT(pEnableQuadView), "toggled", G_CALLBACK(changeQuadView), NULL );
gtk_toolbar_insert( GTK_TOOLBAR(pToolbar), gtk_separator_tool_item_new(), -1);
- GtkToolItem* pEnableEditing = gtk_toggle_tool_button_new();
+ pEnableEditing = gtk_toggle_tool_button_new();
gtk_tool_button_set_label(GTK_TOOL_BUTTON(pEnableEditing), "Editing");
gtk_toolbar_insert(GTK_TOOLBAR(pToolbar), pEnableEditing, -1);
g_signal_connect(G_OBJECT(pEnableEditing), "toggled", G_CALLBACK(toggleEditing), NULL);
@@ -357,6 +369,7 @@ int main( int argc, char* argv[] )
// Docview
pDocView = lok_docview_new( pOffice );
pDocViewQuad = 0;
+ g_signal_connect(pDocView, "edit-changed", G_CALLBACK(signalEdit), NULL);
// Input handling.
g_signal_connect(pWindow, "key-press-event", G_CALLBACK(signalKey), NULL);
diff --git a/libreofficekit/source/gtk/lokdocview.c b/libreofficekit/source/gtk/lokdocview.c
index e12266b5c29b..3980a50edd8c 100644
--- a/libreofficekit/source/gtk/lokdocview.c
+++ b/libreofficekit/source/gtk/lokdocview.c
@@ -232,7 +232,8 @@ gboolean lcl_signalButton(GtkWidget* pEventBox, GdkEventButton* pEvent, LOKDocVi
}
}
- lok_docview_set_edit(pDocView, TRUE);
+ if (!pDocView->m_bEdit)
+ lok_docview_set_edit(pDocView, TRUE);
switch (pEvent->type)
{
@@ -289,9 +290,27 @@ SAL_DLLPUBLIC_EXPORT guint lok_docview_get_type()
return lok_docview_type;
}
+enum
+{
+ EDIT_CHANGED,
+ LAST_SIGNAL
+};
+
+static guint docview_signals[LAST_SIGNAL] = { 0 };
+
static void lok_docview_class_init( LOKDocViewClass* pClass )
{
- (void)pClass;
+ GObjectClass *gobject_class = G_OBJECT_CLASS(pClass);
+ pClass->edit_changed = NULL;
+ docview_signals[EDIT_CHANGED] =
+ g_signal_new("edit-changed",
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (LOKDocViewClass, edit_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__BOOLEAN,
+ G_TYPE_NONE, 1,
+ G_TYPE_BOOLEAN);
}
static void lok_docview_init( LOKDocView* pDocView )
@@ -950,9 +969,12 @@ SAL_DLLPUBLIC_EXPORT void lok_docview_set_partmode( LOKDocView* pDocView,
SAL_DLLPUBLIC_EXPORT void lok_docview_set_edit( LOKDocView* pDocView,
gboolean bEdit )
{
+ gboolean bWasEdit = pDocView->m_bEdit;
+
if (!pDocView->m_bEdit && bEdit)
g_info("lok_docview_set_edit: entering edit mode");
pDocView->m_bEdit = bEdit;
+ g_signal_emit(pDocView, docview_signals[EDIT_CHANGED], 0, bWasEdit);
gtk_widget_queue_draw(GTK_WIDGET(pDocView->pEventBox));
}