[Scummvm-cvs-logs] SF.net SVN: scummvm: [28065] scummex/branches/gsoc2007-gameresbrowser
zbychs at users.sourceforge.net
zbychs at users.sourceforge.net
Sat Jul 14 14:35:26 CEST 2007
Revision: 28065
http://scummvm.svn.sourceforge.net/scummvm/?rev=28065&view=rev
Author: zbychs
Date: 2007-07-14 05:35:25 -0700 (Sat, 14 Jul 2007)
Log Message:
-----------
Added detachable panels.
Modified Paths:
--------------
scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp
scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h
scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp
scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h
scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform
scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp
scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h
scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout
Added Paths:
-----------
scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm
scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm
scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp
scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h
Property Changed:
----------------
scummex/branches/gsoc2007-gameresbrowser/
Property changes on: scummex/branches/gsoc2007-gameresbrowser
___________________________________________________________________
Name: svn:ignore
- PinSlot.vcproj
PinSlot.vcproj.ELWOOD.RootBoot.user
Debug
trash
+ PinSlot.vcproj
PinSlot.vcproj.ELWOOD.RootBoot.user
Debug
trash
vc8
Modified: scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.cpp 2007-07-14 12:35:25 UTC (rev 28065)
@@ -8,6 +8,7 @@
#include "DirectoryController.h"
#include "ObjectChain.h"
+#include "PluginUtil.h"
#include <iostream>
@@ -15,6 +16,8 @@
#include <list>
#include <algorithm>
+#include <wx/wx.h>
+
#include "debugmem.h"
namespace Browser {
@@ -23,137 +26,105 @@
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-// private structs
+// PanelInfo
+//
+// Information about a panel registered for a specific node.
+// Normally a panel, when activated, is added into the wxNotebook beside the
+// ExplorationTree. But the panel can be detached into it's own window.
+//
+// It extends wxEvtHandler so that it can listen for window events (when
+// it's detached).
-//information about registered panel
-struct PanelInfo {
- PanelProvider* _panelProvider; //the panel provider it represents
- bool _activated; //wheather it's being displayed now
- wxPanel* _page; //it's panel
- size_t _pageIdx; //it's page index in the wxNotebook
- PanelInfo(PanelProvider* panelProvider)
- : _panelProvider(panelProvider), _activated(false), _page(NULL), _pageIdx(-1) {}
-};
+class PanelInfo : public wxEvtHandler {
+ static const int ID_ATTACH = 1099; //command id
-bool _pinfo_compare(const PanelInfo* left, const PanelInfo* right) {
- return *left->_panelProvider < *right->_panelProvider;
-}
+ VirtualNode* _node; //a node the panel if registered for
+ PanelProvider* _panelProvider; //the panel provider for this panel
+ wxNotebook* _panelNotebook; //reference to the notebook beside the exploration tree
-//collection of registered panels (a multimap VirtualNode -> Panels)
-struct PanelMap {
- typedef std::multimap<VirtualNode*, PanelInfo*> panel_map;
- panel_map _panelInfos;
+ bool _activated; //wheather the panel is being displayed now
+ bool _detached; //wheather the panel is detached from the notebook (has it's own window)
+ wxPanel* _page; //the GUI element: a page in the wxNotebook
+ size_t _pageIdx; //the page's index in the wxNotebook
- ~PanelMap() {
- cleanup();
- }
+public:
+ PanelInfo(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook);
+ virtual ~PanelInfo();
- void cleanup() {
- ExplorationTree::get()->nodeDeactivate();
- panel_map::iterator i;
- for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
- PanelInfo* pinfo = i->second;
- ASSERT(!pinfo->_activated);
- }
- _panelInfos.clear();
- }
+ PanelProvider* getPanelProvider() const;
+ bool isAttached() const;
+ size_t getPageIdx() const;
- std::list<PanelInfo*> getPanelsFor(VirtualNode* node) {
- std::vector<PanelInfo*> pinfos;
+ //create the panel in the notebook
+ void activate();
+ void deactivate();
- VirtualNodeItemData* data = VirtualNodeItemData::getForNode(node->getTreeItem());
- if (!data)
- return std::list<PanelInfo*>();
+ //detach from the notebook into a new window
+ void detach();
- const guid_list_t& parserGUIDs = data->getParsersOrdering();
+private:
+ //attach to the notebook, after being detached
+ void attach();
- panel_map::iterator i;
- i = _panelInfos.find(node);
- for (; i != _panelInfos.end() && i->first == node; ++i) {
- PanelInfo* pinfo = i->second;
- pinfo->_panelProvider->determineIndex(parserGUIDs);
- pinfos.push_back(pinfo);
- }
+ //events from a window when we are detached
+ void OnClose(wxCloseEvent& event);
+ void OnCloseCmd(wxCommandEvent& event);
+ void reattachClicked(wxCommandEvent& event);
- //We've got the panels. Let's sort them now.
- std::sort(pinfos.begin(), pinfos.end(), &_pinfo_compare);
+ //If we are in the Notebook, and want to detach, we have to fix the indexes of
+ //other panels in the Notebook.
+ void removeIdx();
+};
- return std::list<PanelInfo*>(pinfos.begin(), pinfos.end());
- }
+//used for determining the order in which the panels should be displayed
+bool _pinfo_compare(const PanelInfo* left, const PanelInfo* right) {
+ return *left->getPanelProvider() < *right->getPanelProvider();
+}
- void unregisterPanelProvider(PanelProvider* panelProvider) {
- panel_map::iterator i;
- for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
- PanelInfo* pinfo = i->second;
- if (pinfo->_panelProvider != panelProvider)
- continue;
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// Collection of registered panels (a multimap VirtualNode -> PanelInfos)
- if (pinfo->_activated)
- ExplorationTree::get()->nodeDeactivate();
+struct PanelMap {
+ typedef std::multimap<VirtualNode*, PanelInfo*> panel_map;
+ panel_map _panelInfos;
+ std::list<PanelInfo*> _activePanels; //panels currently activated
- delete pinfo;
- _panelInfos.erase(i);
- return;
- }
- }
+ ~PanelMap();
+ void cleanup();
- void registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider) {
- _panelInfos.insert( std::make_pair(node, new PanelInfo(panelProvider)) );
- }
+ std::list<PanelInfo*>& getActivePanels();
+ PanelInfo* getPanelInfo(int pageIdx); //get PanelInfo for a given netobook page
+ std::list<PanelInfo*> getPanelsFor(VirtualNode* node); //get panels for a given node
+
+ void registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook);
+ void unregisterPanelProvider(PanelProvider* panelProvider);
};
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
+// Collection of registered directories (a map VirtualNode -> DirectoryControler)
-//collection of registered directories
struct DirMap {
typedef std::map<VirtualNode*, DirectoryController*> dir_map;
dir_map _dirInfos;
- ~DirMap() {
- cleanup();
- }
+ ~DirMap();
+ void cleanup();
- void cleanup() {
- dir_map::iterator i;
- for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
- DirectoryController* dir = i->second;
- ExplorationTree::get()->dirCollapsed(dir);
- }
- _dirInfos.clear();
- }
+ DirectoryController* getDirFor(VirtualNode* node);
- DirectoryController* getDirFor(VirtualNode* node) {
- dir_map::iterator i;
- i = _dirInfos.find(node);
- if (i != _dirInfos.end())
- return i->second;
-
- return NULL;
- }
-
- void unregisterDirectoryPresenter(DirectoryController* dirPresenter) {
- dir_map::iterator i;
- for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
- DirectoryController* dir = i->second;
- if (dir != dirPresenter)
- continue;
-
- ExplorationTree::get()->dirCollapsed(dir);
-
- _dirInfos.erase(i);
- return;
- }
- }
-
- void registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter) {
- _dirInfos.insert( std::make_pair(node, dirPresenter) );
- }
+ void registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter);
+ void unregisterDirectoryPresenter(DirectoryController* dirPresenter);
};
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
+//TODO: this should be done in a more flexible way
+#define DEFDIR_ICON 61
+#define DEFFILE_ICON 62
+
ExplorationTree::ExplorationTree()
: _explorationTree(NULL), _panelNotebook(NULL), _activeNode(NULL) {
_rootObjectChain = new ObjectChain();
@@ -173,13 +144,13 @@
void ExplorationTree::cleanup() {
nodeDeactivate();
+ _dirMap->cleanup();
+ _panelMap->cleanup();
+
_rootObjectChain->removeAllObjects();
//deleting the root
ExplorationTree::get()->deleteAllItems();
-
- _dirMap->cleanup();
- _panelMap->cleanup();
}
/////////////////////////////////////////////////////////////////////////////
@@ -304,6 +275,8 @@
if (isDirectory)
_explorationTree->AppendItem(item, wxT("Dummy"), -1, -1, NULL); //WORKAROUND: adding Dummies
//_explorationTree->SetItemHasChildren(item);
+ if (iconId == -1)
+ iconId = isDirectory ? DEFDIR_ICON : DEFFILE_ICON;
if (iconId != -1)
setItemIcon(item, iconId);
@@ -313,11 +286,14 @@
void ExplorationTree::deleteItem(const wxTreeItemId& item) {
ASSERT_VALID_TREE_ITEM(item);
VirtualNodeItemData* data = VirtualNodeItemData::getForNode(item);
+ if (data)
+ nodeDeactivate(data->getNode(), true);
_explorationTree->Delete(item);
}
void ExplorationTree::deleteChildren(const wxTreeItemId& parent) {
ASSERT_VALID_TREE_ITEM(parent);
+ //FIXME: does not deactivate panels
_explorationTree->DeleteChildren(parent);
}
@@ -347,8 +323,9 @@
wxTreeItemId ExplorationTree::addRoot(wxString title) {
wxTreeItemId item = _explorationTree->AddRoot(title, -1, -1, NULL);
ASSERT_VALID_TREE_ITEM(item);
- //TODO: set icon
_explorationTree->AppendItem(item, wxT("Dummy"), -1, -1, NULL); //WORKAROUND
+ if (DEFDIR_ICON != -1)
+ setItemIcon(item, DEFDIR_ICON);
return item;
}
@@ -366,28 +343,40 @@
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
-//deactivate currently activated node
-void ExplorationTree::nodeDeactivate() {
- if (_activeNode == NULL)
+//deactivate the specified node's panels
+void ExplorationTree::nodeDeactivate(VirtualNode* node, bool alsoDetached) {
+ if (!node)
return;
- std::list<PanelInfo*> pinfos = _panelMap->getPanelsFor(_activeNode);
+ std::list<PanelInfo*> pinfos = _panelMap->getPanelsFor(node);
std::list<PanelInfo*>::iterator i;
for (i = pinfos.begin(); i != pinfos.end(); ++i) {
PanelInfo* pinfo = *i;
- ASSERT(pinfo->_activated);
- pinfo->_panelProvider->panelDeactivate();
-
- pinfo->_activated = false;
- pinfo->_page = NULL;
- pinfo->_pageIdx = -1;
+ if (alsoDetached || pinfo->isAttached())
+ pinfo->deactivate();
}
- _panelNotebook->DeleteAllPages();
_activeNode = NULL;
}
+//deactivate currently activated node, and all other attached panels
+void ExplorationTree::nodeDeactivate() {
+ nodeDeactivate(_activeNode, false); //don't deactivate detached panels
+ _activeNode = NULL;
+
+ std::list<PanelInfo*>& activePanels = _panelMap->getActivePanels();
+ std::list<PanelInfo*>::iterator i, next;
+ for (i = activePanels.begin(); i != activePanels.end(); i = next) {
+ PanelInfo* pinfo = *i;
+
+ next = i; //deactivate() changes the activePanels list, so be safe
+ ++next;
+ if (pinfo->isAttached())
+ pinfo->deactivate();
+ }
+}
+
void ExplorationTree::nodeActivated(VirtualNode* activatedNode) {
if (activatedNode != _activeNode)
nodeDeactivate();
@@ -399,17 +388,7 @@
std::list<PanelInfo*>::iterator i;
for (i = pinfos.begin(); i != pinfos.end(); ++i) {
PanelInfo* pinfo = *i;
- if (pinfo->_activated)
- continue;
-
- wxPanel* panel = new wxPanel(_panelNotebook);
- _panelNotebook->AddPage(panel, pinfo->_panelProvider->getPanelTitle());
-
- pinfo->_activated = true;
- pinfo->_page = panel;
- pinfo->_pageIdx = _panelNotebook->GetPageCount() - 1;
-
- pinfo->_panelProvider->panelActivate(panel);
+ pinfo->activate();
}
}
@@ -422,6 +401,19 @@
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
+void ExplorationTree::detachPanel() {
+ int pageIdx = _panelNotebook->GetSelection();
+ if (pageIdx == -1)
+ return;
+
+ PanelInfo* pinfo = _panelMap->getPanelInfo(pageIdx);
+ if (pinfo)
+ pinfo->detach();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
void ExplorationTree::dirCollapsed(DirectoryController* dirPresenter) {
//nop
}
@@ -458,7 +450,7 @@
/////////////////////////////////////////////////////////////////////////////
void ExplorationTree::registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider) {
- _panelMap->registerPanelProvider(node, panelProvider);
+ _panelMap->registerPanelProvider(node, panelProvider, _panelNotebook);
}
void ExplorationTree::unregisterPanelProvider(PanelProvider* panelProvider) {
_panelMap->unregisterPanelProvider(panelProvider);
@@ -493,5 +485,260 @@
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
+// PanelInfo implementation
+PanelInfo::PanelInfo(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook)
+ : _node(node), _panelProvider(panelProvider), _panelNotebook(panelNotebook),
+ _activated(false), _detached(false), _page(NULL), _pageIdx(-1) {}
+
+PanelInfo::~PanelInfo() {
+ deactivate();
}
+
+PanelProvider* PanelInfo::getPanelProvider() const {
+ return _panelProvider;
+}
+bool PanelInfo::isAttached() const {
+ return !_detached;
+}
+size_t PanelInfo::getPageIdx() const {
+ return _pageIdx;
+}
+
+//create the panel in the notebook
+void PanelInfo::activate() {
+ if (_activated)
+ return;
+
+ _page = new wxPanel(_panelNotebook);
+ _panelNotebook->AddPage(_page, _panelProvider->getPanelTitle());
+
+ std::list<PanelInfo*>& activePanels = ExplorationTree::get()->_panelMap->getActivePanels();
+ activePanels.push_front(this);
+ _activated = true;
+ _detached = false;
+ _pageIdx = _panelNotebook->GetPageCount() - 1;
+
+ _panelProvider->panelActivate(_page);
+}
+
+//detach from the notebook (insert into it's own window)
+void PanelInfo::detach() {
+ if (!_activated || _detached)
+ return;
+
+ const long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU | wxTHICK_FRAME | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxCLOSE_BOX;
+ wxFrame* frame = new wxFrame(PluginUtil::getMainForm(), wxID_ANY,
+ _panelProvider->getPanelTitle(), wxDefaultPosition, _page->GetSize(), style);
+
+ wxMenu* fileMenu = new wxMenu(0);
+ fileMenu->Append(ID_ATTACH, wxT("Reattach"));
+ fileMenu->AppendSeparator();
+ fileMenu->Append(wxID_CLOSE, wxT("Close"));
+
+ wxMenuBar* menuBar = new wxMenuBar();
+ menuBar->Append(fileMenu, wxT("File"));
+ frame->SetMenuBar(menuBar);
+
+ frame->Connect(ID_ATTACH, wxEVT_COMMAND_MENU_SELECTED,
+ wxCommandEventHandler(PanelInfo::reattachClicked), NULL, this);
+ frame->Connect(wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED,
+ wxCommandEventHandler(PanelInfo::OnCloseCmd), NULL, this);
+ frame->Connect(wxID_ANY, wxEVT_CLOSE_WINDOW,
+ wxCloseEventHandler(PanelInfo::OnClose), NULL, this);
+
+ _page->Reparent(frame);
+ _panelNotebook->RemovePage(_pageIdx);
+ removeIdx();
+ _detached = true;
+
+ frame->Show(true);
+}
+
+void PanelInfo::OnClose(wxCloseEvent& event) {
+ deactivate();
+}
+void PanelInfo::OnCloseCmd(wxCommandEvent& event) {
+ deactivate();
+}
+void PanelInfo::reattachClicked(wxCommandEvent& event) {
+ attach();
+}
+
+//attach to the notebook, after being detached
+void PanelInfo::attach() {
+ if (!_activated || !_detached)
+ return;
+ wxWindow* frame = _page->GetParent();
+ _page->Reparent(_panelNotebook);
+ _panelNotebook->AddPage(_page, _panelProvider->getPanelTitle());
+ _pageIdx = _panelNotebook->GetPageCount() - 1;
+ frame->Destroy();
+ _detached = false;
+}
+
+//If we are in the Notebook, and want to detach, we have to fix the indexes of
+//other panels.
+void PanelInfo::removeIdx() {
+ if (_pageIdx == -1)
+ return;
+
+ //fix the indexes of the other panels
+ std::list<PanelInfo*>& activePanels = ExplorationTree::get()->_panelMap->getActivePanels();
+ std::list<PanelInfo*>::iterator i;
+ for (i = activePanels.begin(); i != activePanels.end(); ++i) {
+ PanelInfo* pinfo = *i;
+ if (pinfo->_pageIdx > this->_pageIdx)
+ pinfo->_pageIdx--;
+ }
+
+ _pageIdx = -1;
+}
+
+void PanelInfo::deactivate() {
+ if (!_activated)
+ return;
+
+ _panelProvider->panelDeactivate();
+ if (!_detached) {
+ _panelNotebook->DeletePage(_pageIdx);
+ removeIdx();
+ } else {
+ wxWindow* frame = _page->GetParent();
+ frame->Destroy();
+ }
+
+ std::list<PanelInfo*>& activePanels = ExplorationTree::get()->_panelMap->getActivePanels();
+ activePanels.remove(this);
+ _activated = false;
+ _detached = false;
+ _page = NULL;
+ _pageIdx = -1;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// PanelMap implementation
+
+PanelMap::~PanelMap() {
+ cleanup();
+}
+
+void PanelMap::cleanup() {
+ panel_map::iterator i;
+ for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
+ PanelInfo* pinfo = i->second;
+ pinfo->deactivate();
+ delete pinfo;
+ }
+ _panelInfos.clear();
+}
+
+std::list<PanelInfo*>& PanelMap::getActivePanels() {
+ return _activePanels;
+}
+
+//get PanelInfo for a given netobook page
+PanelInfo* PanelMap::getPanelInfo(int pageIdx) {
+ if (pageIdx == -1)
+ return NULL;
+
+ std::list<PanelInfo*>::iterator i;
+ for (i = _activePanels.begin(); i != _activePanels.end(); ++i) {
+ PanelInfo* pinfo = *i;
+ if (pinfo->getPageIdx() == pageIdx)
+ return pinfo;
+ }
+ return NULL;
+}
+
+std::list<PanelInfo*> PanelMap::getPanelsFor(VirtualNode* node) {
+ std::vector<PanelInfo*> pinfos;
+
+ VirtualNodeItemData* data = VirtualNodeItemData::getForNode(node->getTreeItem());
+ if (!data)
+ return std::list<PanelInfo*>();
+
+ const guid_list_t& parserGUIDs = data->getParsersOrdering();
+
+ panel_map::iterator i;
+ i = _panelInfos.find(node);
+ for (; i != _panelInfos.end() && i->first == node; ++i) {
+ PanelInfo* pinfo = i->second;
+ pinfo->getPanelProvider()->determineIndex(parserGUIDs);
+ pinfos.push_back(pinfo);
+ }
+
+ //We've got the panels. Let's sort them now.
+ std::sort(pinfos.begin(), pinfos.end(), &_pinfo_compare);
+
+ return std::list<PanelInfo*>(pinfos.begin(), pinfos.end());
+}
+
+void PanelMap::unregisterPanelProvider(PanelProvider* panelProvider) {
+ panel_map::iterator i;
+ for (i = _panelInfos.begin(); i != _panelInfos.end(); ++i) {
+ PanelInfo* pinfo = i->second;
+ if (pinfo->getPanelProvider() != panelProvider)
+ continue;
+
+ pinfo->deactivate();
+
+ delete pinfo;
+ _panelInfos.erase(i);
+ return;
+ }
+}
+
+void PanelMap::registerPanelProvider(VirtualNode* node, PanelProvider* panelProvider, wxNotebook* panelNotebook) {
+ _panelInfos.insert( std::make_pair(node, new PanelInfo(node, panelProvider, panelNotebook)) );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+// DirMap implementation
+
+DirMap::~DirMap() {
+ cleanup();
+}
+
+void DirMap::cleanup() {
+ dir_map::iterator i;
+ for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
+ DirectoryController* dir = i->second;
+ ExplorationTree::get()->dirCollapsed(dir);
+ }
+ _dirInfos.clear();
+}
+
+DirectoryController* DirMap::getDirFor(VirtualNode* node) {
+ dir_map::iterator i;
+ i = _dirInfos.find(node);
+ if (i != _dirInfos.end())
+ return i->second;
+
+ return NULL;
+}
+
+void DirMap::unregisterDirectoryPresenter(DirectoryController* dirPresenter) {
+ dir_map::iterator i;
+ for (i = _dirInfos.begin(); i != _dirInfos.end(); ++i) {
+ DirectoryController* dir = i->second;
+ if (dir != dirPresenter)
+ continue;
+
+ ExplorationTree::get()->dirCollapsed(dir);
+
+ _dirInfos.erase(i);
+ return;
+ }
+}
+
+void DirMap::registerDirectoryPresenter(VirtualNode* node, DirectoryController* dirPresenter) {
+ _dirInfos.insert( std::make_pair(node, dirPresenter) );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+}
Modified: scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browser/ExplorationTree.h 2007-07-14 12:35:25 UTC (rev 28065)
@@ -72,7 +72,7 @@
#define ASSERT_VALID_TREE_ITEM(item) \
ASSERT(item.IsOk())
-struct PanelInfo;
+class PanelInfo;
struct PanelMap;
struct DirMap;
class VirtualNode;
@@ -91,6 +91,8 @@
VirtualNode* _activeNode;
DirMap* _dirMap; //registered DirectoryContolers
+ friend class PanelInfo;
+
private:
ExplorationTree();
~ExplorationTree();
@@ -124,7 +126,9 @@
//activating/deactivating panels
void nodeActivated(VirtualNode* activatedNode);
+ void nodeDeactivate(VirtualNode* node, bool alsoDetached);
void nodeDeactivate();
+ void detachPanel();
void dirCollapsed(DirectoryController* dirPresenter);
void dirExpanded(DirectoryController* dirPresenter);
Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.cpp 2007-07-14 12:35:25 UTC (rev 28065)
@@ -43,6 +43,7 @@
EVT_MENU(ID_TEST1_CLEANUP, MainForm::OnTest1Cleanup)
EVT_MENU(ID_TEST0, MainForm::OnTest0)
EVT_MENU(ID_TEST2, MainForm::OnTest2)
+ EVT_MENU(ID_DETACH, MainForm::OnDetachPanel)
EVT_TREE_ITEM_ACTIVATED(ID_BROWSERTREE,MainForm::browserTreeItemActivated)
EVT_TREE_ITEM_EXPANDED(ID_BROWSERTREE,MainForm::browserTreeItemExpanded)
@@ -119,6 +120,10 @@
ID_TEST_MENU_Mnu_Obj->Append(ID_TEST0, wxT("Test0 - No Scumm Plugins"), wxT(""), wxITEM_NORMAL);
ID_TEST_MENU_Mnu_Obj->Append(ID_TEST2, wxT("Test2 - With Scumm Plugins"), wxT(""), wxITEM_NORMAL);
WxMenuBar1->Append(ID_TEST_MENU_Mnu_Obj, wxT("Tests"));
+
+ wxMenu *ID_DETACHPANEL_Mnu_Obj = new wxMenu(0);
+ ID_DETACHPANEL_Mnu_Obj->Append(ID_DETACH, wxT("Detach"), wxT(""), wxITEM_NORMAL);
+ WxMenuBar1->Append(ID_DETACHPANEL_Mnu_Obj, wxT("Detach panel"));
SetMenuBar(WxMenuBar1);
WxSplitterWindow1->SplitVertically(browserTree,mainPanel,185);
Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.h 2007-07-14 12:35:25 UTC (rev 28065)
@@ -62,6 +62,7 @@
void OnOpen(wxCommandEvent& event);
void MainFormIdle(wxIdleEvent& event);
void OnLoadPlugin(wxCommandEvent& event);
+ void OnDetachPanel(wxCommandEvent& event);
private:
//Do not add custom control declarations between
@@ -98,6 +99,8 @@
ID_TEST1_CLEANUP = 1012,
ID_TEST0 = 1022,
ID_TEST2 = 1024,
+ ID_DETACHPANEL = 1031,
+ ID_DETACH = 1032,
ID_BROWSERNOTEBOOK = 1021,
ID_MAINPANEL = 1017,
Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainForm.wxform 2007-07-14 12:35:25 UTC (rev 28065)
@@ -391,7 +391,29 @@
2057697468205363756D6D20506C7567696E7312436172726965642E57785F43
6865636B65640816436172726965642E57585F4249544D41502E446174610A0C
00000007544269746D61700000000016436172726965642E57785F46696C6548
- 6973746F72790800000000}
+ 6973746F7279080000000011000000545778437573746F6D4D656E754974656D
+ 5450463018547778437573746F6D4D656E754974656D57726170706572001143
+ 6172726965642E49735375624D656E750812436172726965642E57785F456E61
+ 626C65640911436172726965642E57785F48696464656E081143617272696564
+ 2E57785F49444E616D65060E49445F44455441434850414E454C124361727269
+ 65642E57785F494456616C756503070418436172726965642E57785F4D656E75
+ 4974656D5374796C65070F77784D6E7549746D5F4E6F726D616C124361727269
+ 65642E57785F43617074696F6E060C4465746163682070616E656C1243617272
+ 6965642E57785F436865636B65640816436172726965642E57585F4249544D41
+ 502E446174610A0C00000007544269746D61700000000016436172726965642E
+ 57785F46696C65486973746F72790818436172726965642E5778437573746F6D
+ 4D656E754974656D0A5B01000011000000545778437573746F6D4D656E754974
+ 656D5450463018547778437573746F6D4D656E754974656D5772617070657200
+ 11436172726965642E49735375624D656E750810436172726965642E4556545F
+ 4D656E75060D4F6E44657461636850616E656C12436172726965642E57785F45
+ 6E61626C65640911436172726965642E57785F48696464656E08114361727269
+ 65642E57785F49444E616D65060949445F44455441434812436172726965642E
+ 57785F494456616C756503080418436172726965642E57785F4D656E75497465
+ 6D5374796C65070F77784D6E7549746D5F4E6F726D616C12436172726965642E
+ 57785F43617074696F6E060644657461636812436172726965642E57785F4368
+ 65636B65640816436172726965642E57585F4249544D41502E446174610A0C00
+ 000007544269746D61700000000016436172726965642E57785F46696C654869
+ 73746F72790800000000}
Wx_HasHistory = False
end
end
Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/MainFormCommands.cpp 2007-07-14 12:35:25 UTC (rev 28065)
@@ -263,5 +263,13 @@
//ExplorationTree::canGet() && ExplorationTree::get()->onIdle();
}
+/*
+* OnDetachPanel
+*/
+void MainForm::OnDetachPanel(wxCommandEvent& event)
+{
+ ExplorationTree::get()->detachPanel();
+}
+
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
Added: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm 2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,62 @@
+/* XPM */
+static const char * defdir_icon_xpm[] = {
+"16 16 43 1",
+" c None",
+"! c black",
+"# c #CC9933",
+"$ c #CB9832",
+"% c #C99630",
+"& c #C7942E",
+"' c white",
+"( c #C28F29",
+") c #FFFF99",
+"* c #BD8A24",
+"+ c #BA8721",
+", c #B7841E",
+"- c #B5821C",
+". c #B3801A",
+"0 c #B07D17",
+"1 c #FFF791",
+"2 c #FFF48E",
+"3 c #AE7B15",
+"4 c #FFEB85",
+"5 c #FFE680",
+"6 c #C5922C",
+"7 c #C08D27",
+"8 c #BC8923",
+"9 c #B8851F",
+": c #B4811B",
+"; c #FFE07A",
+"< c #A3700A",
+"= c #FFD46E",
+"> c #F8C55F",
+"? c #A06D07",
+"@ c #FFCC66",
+"A c #EFBC56",
+"B c #9E6B05",
+"C c #E6B34D",
+"D c #9C6903",
+"E c #BF8C26",
+"F c #DCA943",
+"G c #9A6701",
+"H c #D3A03A",
+"I c #996600",
+"J c #AB7812",
+"K c #A8750F",
+"L c #A5720C",
+" ",
+" #$%& ",
+" #''''( ",
+"#'))))'*+,-.0 ",
+"$122222'''''3! ",
+"%45666666789:.. ",
+"&;6'''''''''5'<!",
+"6=#)))))))))>)?!",
+"(@$)11111111A)B!",
+"7 at 6)44444444C)D!",
+"*@E);;;;;;;;F)G!",
+"+ at 9)========H)I!",
+" -.03JKL<?BDGI!!",
+" !!!!!!!!!!!!! ",
+" ",
+" "};
\ No newline at end of file
Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/defdir_icon.xpm
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
Added: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm 2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,106 @@
+/* XPM */
+static const char * deffile_icon_xpm[] = {
+"16 16 87 1",
+" c None",
+"! c black",
+"# c #B2C2D8",
+"$ c #AEBED4",
+"% c #A9B9CF",
+"& c #A4B3C9",
+"' c white",
+"( c #FEFFFF",
+") c #9CABC0",
+"* c #354963",
+"+ c #7A8BA2",
+", c #AFBFD5",
+"- c #FEFEFF",
+". c #FBFCFE",
+"0 c #95A4B9",
+"1 c #BAC5D4",
+"2 c #ABBBD1",
+"3 c #FDFEFF",
+"4 c #FBFBFE",
+"5 c #F8F9FD",
+"6 c #93A2B7",
+"7 c #364A64",
+"8 c #A7B6CC",
+"9 c #326AD8",
+": c #3066D0",
+"; c #2D60C4",
+"< c #2A59B7",
+"= c #2852A8",
+"> c #F3F6FC",
+"? c #EFF4FB",
+"@ c #A3B2C8",
+"A c #FCFDFF",
+"B c #F9FBFD",
+"C c #F6F9FD",
+"D c #F2F5FC",
+"E c #EEF2FB",
+"F c #EAEFFB",
+"G c #E6ECF9",
+"H c #9EAEC3",
+"I c #FEFEFE",
+"J c #2E60C4",
+"K c #2B59B7",
+"L c #2752A7",
+"M c #254B99",
+"N c #22458E",
+"O c #DFE8F8",
+"P c #9AA9BE",
+"Q c #F4F7FD",
+"R c #F0F4FC",
+"S c #EDF1FB",
+"T c #E8EEFA",
+"U c #E4EAF8",
+"V c #DFE7F7",
+"W c #DAE2F6",
+"X c #96A5BA",
+"Y c #244B9A",
+"Z c #D3DFF5",
+"[ c #E6EBF9",
+"] c #E1E8F9",
+"^ c #DBE5F7",
+"_ c #D7E1F6",
+"` c #D3DEF4",
+"a c #CDDAF3",
+"b c #EDF2FB",
+"c c #3165D0",
+"d c #2851A7",
+"e c #254B9A",
+"f c #C7D5F3",
+"g c #E8EEF9",
+"h c #E3EAF8",
+"i c #DEE6F8",
+"j c #D9E3F7",
+"k c #D5DFF5",
+"l c #D0DBF5",
+"m c #CBD8F3",
+"n c #C6D5F2",
+"o c #C2D1F1",
+"p c #E2E9F9",
+"q c #DDE6F8",
+"r c #D8E2F7",
+"s c #D3DEF5",
+"t c #CEDBF4",
+"u c #CAD7F3",
+"v c #C5D4F2",
+"w c #C1D0F1",
+"x c #BCCDF0",
+"y c #DCE5F7",
+" ",
+" ######$%&& ",
+" #''''''()*+ ",
+" ,'''''-.01*+ ",
+" 2''''3456777 ",
+" 8'9:;<=>?667 ",
+" @''ABCDEFG6* ",
+" HI9:JKLMNO6* ",
+" P.5QRSTUVW6* ",
+" XC9:;K=YNZ6* ",
+" 6>EF[]^_`a6* ",
+" 6b9c;KdeNf6* ",
+" 6ghijklmno6* ",
+" 6pqrstuvwx6* ",
+" 6y666666666* ",
+" 6*********** "};
\ No newline at end of file
Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons/deffile_icon.xpm
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
Modified: scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/src/browserapp/icons.h 2007-07-14 12:35:25 UTC (rev 28065)
@@ -28,6 +28,9 @@
#include "scummex.xpm"
#endif
+#include "icons/defdir_icon.xpm"
+#include "icons/deffile_icon.xpm"
+
#include "icons/open_icon.xpm"
#include "icons/save_icon.xpm"
#include "icons/exit_icon.xpm"
@@ -163,6 +166,8 @@
#include "icons/xpm_60_big.xpm"
#define NUM_SCUMM_ICONS 61
+#define DEFDIR_ICON 61
+#define DEFFILE_ICON 62
wxImageList* loadScummIcons() {
wxImageList* ImageList = new wxImageList(16, 16, true, NUM_SCUMM_ICONS);
@@ -228,6 +233,8 @@
ImageList->Add(wxBitmap(xpm_58));
ImageList->Add(wxBitmap(xpm_59));
ImageList->Add(wxBitmap(xpm_60));
+ ImageList->Add(wxBitmap(defdir_icon_xpm));
+ ImageList->Add(wxBitmap(deffile_icon_xpm));
return ImageList;
}
Added: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp 2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,70 @@
+/////////////////////////////////////////////////////////////////////////////
+// IconPresenter.cpp
+
+#include "basic_stdafx.h"
+
+#include "IconPresenter.h"
+
+#include "ExplorationTree.h"
+#include "CoreInterfaces.h"
+
+#include <iostream>
+
+#include "debugmem.h"
+
+namespace Browser {
+
+using namespace Core;
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+SLOT_DESCS(IconPresenter)
+ SLOT_DESC(_iconSlot, SLOT_DEFAULT)
+ SLOT_DESC(_nodeSlot, SLOT_DEFAULT)
+END_DESCS
+
+bool IconPresenter::doRealize(ObjectChain* ochain) {
+ bool res = BObject::doRealize(ochain);
+ if (!res)
+ return false;
+
+ IIcon* iicon = _iconSlot->getInterface();
+ if (!iicon) {
+ errout << wxT("IconPresenter::doRealize(): could not get IIcon interface") << std::endl;
+ _realized = false;
+ return false;
+ }
+
+ _icon = iicon->getIcon();
+ _iconSlot->releaseInterface();
+
+ INodeProvider* _inodeprovider = _nodeSlot->getInterface();
+ if (!_inodeprovider) {
+ errout << wxT("IconPresenter::doRealize(): could not get INodeProvider interface") << std::endl;
+ _realized = false;
+ return false;
+ }
+
+ //Change the node's icon
+ VirtualNode* node = _inodeprovider->getNode();
+ ASSERT(node);
+ ExplorationTree::get()->setNodeIcon(node, _icon);
+
+ _nodeSlot->releaseInterface();
+
+ return true;
+}
+
+void IconPresenter::doUnrealize(ObjectChain* ochain) {
+ _icon = -1;
+ /*_inodeprovider = NULL;
+ _nodeSlot->releaseInterface();*/
+
+ BObject::doUnrealize(ochain);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser
Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.cpp
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
Added: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h (rev 0)
+++ scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h 2007-07-14 12:35:25 UTC (rev 28065)
@@ -0,0 +1,55 @@
+/////////////////////////////////////////////////////////////////////////////
+// IconPresenter.h
+
+#ifndef _ICON_PRESENTER_H_
+#define _ICON_PRESENTER_H_
+
+#include <wx/wx.h>
+
+#include "VirtualNode.h"
+#include "CoreInterfaces.h"
+#include "AuxInterfaces.h"
+
+namespace Browser {
+
+using namespace Core;
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+//
+// TextPresenter is a PanelReciever (see PanelProvider.h) that displays
+// text on the recieved panel.
+//
+// It takes the text from the IText pin.
+//
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class BASIC_PLUGIN_API IconPresenter : public BObject {
+ DECLARE_BOBJECT_CLASS(IconPresenter, BObject)
+
+protected:
+ Slot<IIcon>* _iconSlot;
+ Slot<INodeProvider>* _nodeSlot;
+
+ int _icon;
+ //INodeProvider* _inodeprovider;
+
+public:
+ ASSIGN_DESC(0, wxT("CoreObjects"), 1)
+
+ SLOTS_DECL
+
+ IconPresenter()
+ : _icon(-1)/*, _inodeprovider(NULL)*/ {}
+
+ virtual bool doRealize(ObjectChain* ochain);
+ virtual void doUnrealize(ObjectChain* ochain);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+} // namespace Browser
+
+#endif //_ICON_PRESENTER_H_
Property changes on: scummex/branches/gsoc2007-gameresbrowser/src/plugins/basic/IconPresenter.h
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
Modified: scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout
===================================================================
--- scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout 2007-07-14 03:44:47 UTC (rev 28064)
+++ scummex/branches/gsoc2007-gameresbrowser/wxdev/Browser.layout 2007-07-14 12:35:25 UTC (rev 28065)
@@ -24,8 +24,8 @@
CursorRow=1
TopLine=1
LeftChar=1
-Open=0
-Top=0
+Open=1
+Top=1
[Editor_1]
CursorCol=1
CursorRow=1
@@ -35,7 +35,7 @@
Top=0
[Editors]
Focused=-1
-Order=
+Order=-1
[Editor_2]
Open=0
Top=0
@@ -44,7 +44,7 @@
CursorRow=1
TopLine=1
LeftChar=1
-Open=0
+Open=1
Top=0
[Editor_6]
CursorCol=1
@@ -58,5 +58,5 @@
CursorRow=1
TopLine=1
LeftChar=1
-Open=0
+Open=1
Top=0
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list