[haiku-commits] r43155 - in haiku/trunk/src/apps/debugger/user_interface/gui: inspector_window team_window

  • From: anevilyak@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 3 Nov 2011 11:42:05 +0100 (CET)

Author: anevilyak
Date: 2011-11-03 11:42:05 +0100 (Thu, 03 Nov 2011)
New Revision: 43155
Changeset: https://dev.haiku-os.org/changeset/43155

Modified:
   
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp
   
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h
   haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp
   haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h
Log:
Save and restore the inspector window's frame + mode settings.



Modified: 
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp
===================================================================
--- 
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp
       2011-11-03 10:40:40 UTC (rev 43154)
+++ 
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.cpp
       2011-11-03 10:42:05 UTC (rev 43155)
@@ -19,6 +19,7 @@
 #include <ExpressionParser.h>
 
 #include "Architecture.h"
+#include "GUITeamUISettings.h"
 #include "MemoryView.h"
 #include "MessageCodes.h"
 #include "Team.h"
@@ -265,7 +266,10 @@
 bool
 InspectorWindow::QuitRequested()
 {
-       BMessenger(fTarget).SendMessage(MSG_INSPECTOR_WINDOW_CLOSED);
+       BMessage settings(MSG_INSPECTOR_WINDOW_CLOSED);
+       SaveSettings(&settings);
+
+       BMessenger(fTarget).SendMessage(&settings);
        return true;
 }
 
@@ -281,3 +285,81 @@
                fNextBlockButton->SetEnabled(true);
        }
 }
+
+
+status_t
+InspectorWindow::LoadSettings(const GUITeamUISettings* settings)
+{
+       BVariant value;
+       if (settings->Value("inspectorWindowFrame", value) == B_OK) {
+               BRect frameRect = value.ToRect();
+               ResizeTo(frameRect.Width(), frameRect.Height());
+               MoveTo(frameRect.left, frameRect.top);
+       }
+
+       _LoadMenuFieldMode(fHexMode, "Hex", settings);
+       _LoadMenuFieldMode(fEndianMode, "Endian", settings);
+       _LoadMenuFieldMode(fTextMode, "Text", settings);
+
+       return B_OK;
+}
+
+
+status_t
+InspectorWindow::SaveSettings(BMessage* settings)
+{
+       status_t error = settings->AddRect("inspectorWindowFrame", Frame());
+       if (error != B_OK)
+               return error;
+
+       error = _SaveMenuFieldMode(fHexMode, "Hex", settings);
+       if (error != B_OK)
+               return error;
+
+       error = _SaveMenuFieldMode(fEndianMode, "Endian", settings);
+       if (error != B_OK)
+               return error;
+
+       error = _SaveMenuFieldMode(fTextMode, "Text", settings);
+       if (error != B_OK)
+               return error;
+
+       return B_OK;
+}
+
+
+void
+InspectorWindow::_LoadMenuFieldMode(BMenuField* field, const char* name,
+       const GUITeamUISettings* settings)
+{
+       BVariant value;
+       BString fieldName;
+       fieldName.SetToFormat("inspectorWindow%sMode", name);
+       status_t error = settings->Value(fieldName.String(), value);
+       if (error == B_OK) {
+               BMenu* menu = field->Menu();
+               for (int32 i = 0; i < menu->CountItems(); i++) {
+                       BInvoker* item = menu->ItemAt(i);
+                       if (item->Message()->FindInt32("mode") == 
value.ToInt32()) {
+                               item->Invoke();
+                               break;
+                       }
+               }
+       }
+}
+
+
+status_t
+InspectorWindow::_SaveMenuFieldMode(BMenuField* field, const char* name,
+       BMessage* settings)
+{
+       BMenuItem* item = field->Menu()->FindMarked();
+       if (item && item->Message()) {
+               int32 mode = item->Message()->FindInt32("mode");
+               BString fieldName;
+               fieldName.SetToFormat("inspectorWindow%sMode", name);
+               return settings->AddInt32(fieldName.String(), mode);
+       }
+
+       return B_OK;
+}

Modified: 
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h
===================================================================
--- 
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h
 2011-11-03 10:40:40 UTC (rev 43154)
+++ 
haiku/trunk/src/apps/debugger/user_interface/gui/inspector_window/InspectorWindow.h
 2011-11-03 10:42:05 UTC (rev 43155)
@@ -16,6 +16,7 @@
 class BMenuField;
 class BMessenger;
 class BTextControl;
+class GUITeamUISettings;
 class MemoryView;
 class Team;
 class UserInterfaceListener;
@@ -39,9 +40,20 @@
 
        virtual void                            
MemoryBlockRetrieved(TeamMemoryBlock* block);
 
+                       status_t                        LoadSettings(
+                                                                       const 
GUITeamUISettings* settings);
+                       status_t                        SaveSettings(
+                                                                       
BMessage* settings);
 private:
        void                                            _Init();
 
+       void                                            
_LoadMenuFieldMode(BMenuField* field,
+                                                                       const 
char* name,
+                                                                       const 
GUITeamUISettings* settings);
+       status_t                                        
_SaveMenuFieldMode(BMenuField* field,
+                                                                       const 
char* name,
+                                                                       
BMessage* settings);
+
 private:
        UserInterfaceListener*          fListener;
        BTextControl*                           fAddressInput;

Modified: 
haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp 
2011-11-03 10:40:40 UTC (rev 43154)
+++ haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.cpp 
2011-11-03 10:42:05 UTC (rev 43155)
@@ -219,8 +219,10 @@
                        try {
                                fInspectorWindow = 
InspectorWindow::Create(fTeam, fListener,
                                        this);
-                               if (fInspectorWindow != NULL)
+                               if (fInspectorWindow != NULL) {
+                                       
fInspectorWindow->LoadSettings(&fUISettings);
                                        fInspectorWindow->Show();
+                               }
                } catch (...) {
                        // TODO: notify user
                }
@@ -228,7 +230,9 @@
                }
                case MSG_INSPECTOR_WINDOW_CLOSED:
                {
+                       _SaveInspectorSettings(CurrentMessage());
                        fInspectorWindow = NULL;
+
                }
                case B_REFS_RECEIVED:
                {
@@ -351,6 +355,8 @@
        _LoadSplitSettings(fImageSplitView, "Image", settings);
        _LoadSplitSettings(fThreadSplitView, "Thread", settings);
 
+       fUISettings = *settings;
+
        return B_OK;
 }
 
@@ -358,6 +364,23 @@
 status_t
 TeamWindow::SaveSettings(GUITeamUISettings* settings)
 {
+       // save the settings from the cached copy first,
+       // then overwrite them with our most current set
+       // this is necessary in order to preserve the settings
+       // of things like the inspector in case we haven't actually
+       // invoked them at all in this session
+       const BMessage& values = fUISettings.Values();
+       char *name;
+       type_code type;
+       BVariant value;
+       for (int32 i = 0; values.GetInfo(B_ANY_TYPE, i, &name, &type) == B_OK;
+               i++) {
+               if (value.SetFromMessage(values, name) == B_OK) {
+                       if (!settings->SetValue(name, value))
+                               return B_NO_MEMORY;
+               }
+       }
+
        if (!settings->SetValue("teamWindowFrame", Frame()))
                return B_NO_MEMORY;
 
@@ -1163,3 +1186,22 @@
 
        return B_OK;
 }
+
+
+status_t
+TeamWindow::_SaveInspectorSettings(const BMessage* settings)
+{
+       char *name;
+       type_code type;
+       BVariant value;
+
+       for (int32 i = 0; settings->GetInfo(B_ANY_TYPE, i, &name, &type) == 
B_OK;
+               i++) {
+               if (value.SetFromMessage(*settings, name) == B_OK) {
+                       if (!fUISettings.SetValue(name, value))
+                               return B_NO_MEMORY;
+               }
+       }
+
+       return B_OK;
+}

Modified: 
haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h
===================================================================
--- haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h   
2011-11-03 10:40:40 UTC (rev 43154)
+++ haiku/trunk/src/apps/debugger/user_interface/gui/team_window/TeamWindow.h   
2011-11-03 10:42:05 UTC (rev 43155)
@@ -12,6 +12,7 @@
 
 #include "BreakpointsView.h"
 #include "Function.h"
+#include "GUITeamUISettings.h"
 #include "ImageFunctionsView.h"
 #include "ImageListView.h"
 #include "SourceView.h"
@@ -27,7 +28,6 @@
 class BSplitView;
 class BStringView;
 class BTabView;
-class GUITeamUISettings;
 class Image;
 class InspectorWindow;
 class RegistersView;
@@ -150,6 +150,8 @@
                                                                        const 
char* name,
                                                                        
GUITeamUISettings* settings);
 
+                       status_t                        _SaveInspectorSettings(
+                                                                       const 
BMessage* settings);
 private:
                        ::Team*                         fTeam;
                        ::Thread*                       fActiveThread;
@@ -182,6 +184,7 @@
                        BSplitView*                     fImageSplitView;
                        BSplitView*                     fThreadSplitView;
                        InspectorWindow*        fInspectorWindow;
+                       GUITeamUISettings       fUISettings;
 };
 
 


Other related posts:

  • » [haiku-commits] r43155 - in haiku/trunk/src/apps/debugger/user_interface/gui: inspector_window team_window - anevilyak