From e980542150085b65567ffe85c6acb72aa5f6e13a Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 9 Aug 2016 12:10:26 +0200 Subject: gtktiledviewer: fix incorrect undo/redo state Edit state = false disabled undo, then edit state = true enabled the undo button, even the last LOK callback was '.uno:Undo=disabled'. Fix this by storing the LOK state in a map, and using it when edit is enabled. With this, clicking on the Edit button right after loading a document results disabled undo/redo buttons as expected. Change-Id: Id6023f976f135555a43486f71603c823e59d8d60 Reviewed-on: https://gerrit.libreoffice.org/28003 Reviewed-by: Miklos Vajna Tested-by: Jenkins (cherry picked from commit 5cb52cf97d04859c0c730cf03430254041d6388b) --- .../qa/gtktiledviewer/gtktiledviewer.cxx | 47 ++++++++++++++-------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx index 71572aba4f25..5b95e35a79d2 100644 --- a/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx +++ b/libreofficekit/qa/gtktiledviewer/gtktiledviewer.cxx @@ -120,6 +120,9 @@ public: GtkWidget* m_pScrolledWindow; std::map m_aToolItemCommandNames; std::map m_aCommandNameToolItems; + /// Sensitivity (enabled or disabled) or each tool item, ignoring edit + /// state. + std::map m_aToolItemSensitivities; bool m_bToolItemBroadcast; GtkWidget* m_pVBox; GtkComboBoxText* m_pPartSelector; @@ -386,6 +389,7 @@ static void lcl_registerToolItem(TiledWindow& rWindow, GtkToolItem* pItem, const { rWindow.m_aToolItemCommandNames[pItem] = rName; rWindow.m_aCommandNameToolItems[rName] = pItem; + rWindow.m_aToolItemSensitivities[pItem] = true; } const float fZooms[] = { 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, 5.0 }; @@ -958,6 +962,13 @@ static gboolean signalFormulabar(GtkWidget* /*pWidget*/, GdkEventKey* /*pEvent*/ return TRUE; } +/// Set sensitivity based on rWindow.m_aToolItemSensitivities, taking edit +/// state into account. +static void setSensitiveIfInEdit(GtkToolItem* pItem, gboolean bEdit, TiledWindow& rWindow) +{ + gtk_widget_set_sensitive(GTK_WIDGET(pItem), bEdit && rWindow.m_aToolItemSensitivities[pItem]); +} + /// LOKDocView changed edit state -> inform the tool button. static void signalEdit(LOKDocView* pLOKDocView, gboolean bWasEdit, gpointer /*pData*/) { @@ -966,22 +977,22 @@ static void signalEdit(LOKDocView* pLOKDocView, gboolean bWasEdit, gpointer /*pD g_info("signalEdit: %d -> %d", bWasEdit, bEdit); // Set toggle button sensitivity - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pBold), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pItalic), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pUnderline), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pStrikethrough), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pSuperscript), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pSubscript), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pLeftpara), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pCenterpara), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pRightpara), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pJustifypara), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pInsertAnnotation), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pDeleteComment), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pUndo), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pRedo), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pPasteButton), bEdit); - gtk_widget_set_sensitive(GTK_WIDGET(rWindow.m_pSaveButton), bEdit); + setSensitiveIfInEdit(rWindow.m_pBold, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pItalic, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pUnderline, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pStrikethrough, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pSuperscript, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pSubscript, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pLeftpara, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pCenterpara, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pRightpara, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pJustifypara, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pInsertAnnotation, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pDeleteComment, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pUndo, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pRedo, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pPasteButton, bEdit, rWindow); + setSensitiveIfInEdit(rWindow.m_pSaveButton, bEdit, rWindow); } /// LOKDocView changed command state -> inform the tool button. @@ -1010,6 +1021,10 @@ static void signalCommand(LOKDocView* pLOKDocView, char* pPayload, gpointer /*pD } else if (aValue == "enabled" || aValue == "disabled") { gboolean bSensitive = aValue == "enabled"; gtk_widget_set_sensitive(GTK_WIDGET(pItem), bSensitive); + + // Remember state, so in case edit is disable and enabled + // later, the correct sensitivity can be restored. + rWindow.m_aToolItemSensitivities[pItem] = bSensitive; } } } -- cgit