DockAccess: draft code reorganisation (#1144)
This commit is contained in:
parent
8097485dbf
commit
5cac40654f
6 changed files with 794 additions and 28 deletions
371
src/gui/workspace/dock-area.cpp
Normal file
371
src/gui/workspace/dock-area.cpp
Normal file
|
|
@ -0,0 +1,371 @@
|
|||
/*
|
||||
DockArea - maintain a docking area within the WorkspaceWindow
|
||||
|
||||
Copyright (C) Lumiera.org
|
||||
2008, Joel Holdsworth <joel@airwebreathe.org.uk>
|
||||
2018, Hermann Vosseler <Ichthyostega@web.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
* *****************************************************/
|
||||
|
||||
|
||||
/** @file dock-area.cpp
|
||||
** Implementation of dockable UI panels, implemented with the
|
||||
** help of lib GDL (»Gnome Docking Library«, formerly aka »Gnome Design Library«)
|
||||
** @todo will be transformed into a Dock entity as of 6/2018 /////////////////////////////////////////////TICKET #1144 refactor dock handling
|
||||
*/
|
||||
|
||||
|
||||
#include "gui/workspace/dock-area.hpp"
|
||||
|
||||
#include "gui/panel/assets-panel.hpp"
|
||||
#include "gui/panel/viewer-panel.hpp"
|
||||
#include "gui/panel/infobox-panel.hpp"
|
||||
#include "gui/panel/timeline-panel.hpp"
|
||||
#include "gui/panel/timeline-panel-obsolete.hpp"
|
||||
|
||||
#include "include/logging.h"
|
||||
|
||||
using namespace boost; ////////////////////////////////////////////////////////////////////////////////TICKET #1071 no wildcard includes please!
|
||||
using namespace std; ////////////////////////////////////////////////////////////////////////////////TICKET #1071 no wildcard includes please!
|
||||
using namespace Gtk; ////////////////////////////////////////////////////////////////////////////////TICKET #1071 no wildcard includes please!
|
||||
|
||||
namespace gui {
|
||||
namespace workspace {
|
||||
|
||||
const DockArea::PanelDescription
|
||||
DockArea::panelDescriptionList[] = {
|
||||
DockArea::Panel<TimelinePanel>(),
|
||||
DockArea::Panel<TimelinePanelObsolete>(),
|
||||
DockArea::Panel<InfoBoxPanel>(),
|
||||
DockArea::Panel<ViewerPanel>(),
|
||||
DockArea::Panel<AssetsPanel>()
|
||||
};
|
||||
|
||||
unsigned short DockArea::panelID = 0;
|
||||
|
||||
|
||||
|
||||
DockArea::DockArea (WorkspaceWindow& owner)
|
||||
: workspaceWindow_(owner)
|
||||
, dock_()
|
||||
, dockBar_(dock_)
|
||||
, dockLayout_()
|
||||
{
|
||||
/* Create the DockLayout */
|
||||
dockLayout_ = Gdl::DockLayout::create(dock_);
|
||||
|
||||
/* Setup the Switcher Style */
|
||||
Glib::RefPtr<Gdl::DockMaster> dock_master = dock_.property_master();
|
||||
dock_master->property_switcher_style() = Gdl::SWITCHER_STYLE_ICON;
|
||||
|
||||
memset(&dockPlaceholders_, 0, sizeof(dockPlaceholders_));
|
||||
}
|
||||
|
||||
|
||||
|
||||
DockArea::~DockArea()
|
||||
{
|
||||
///////////////////////////////////////////////////////TICKET #195 : violation of policy, dtors must not do any work
|
||||
///////////////////////////////////////////////////////TICKET #172 : observed as a reason for crashes when closing the GUI. It was invoked after end of main, when the GUI as already gone.
|
||||
|
||||
#if false ///////////////////////////////////////////////////TICKET #937 : disabled for GTK-3 transition. TODO investigate why this logic existed...
|
||||
///////////////////////////////////////////////////////TICKET #1027
|
||||
for(int i = 0; i < 4; i++)
|
||||
if(dockPlaceholders_[i])
|
||||
g_object_unref(dockPlaceholders_[i]);
|
||||
|
||||
clearPanels();
|
||||
#endif ///////////////////////////////////////////////////TICKET #937 : (End)disabled for GTK-3 transition.
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
DockArea::setupDock()
|
||||
{
|
||||
///////////////////////////////////////////////////////TICKET #1027 : investigate what would be the proper way to do this with gdlmm (C++ binding). No direct usage of GDL !
|
||||
|
||||
REQUIRE(dockPlaceholders_[0] == NULL && dockPlaceholders_[1] == NULL &&
|
||||
dockPlaceholders_[2] == NULL && dockPlaceholders_[3] == NULL);
|
||||
dockPlaceholders_[0] = GDL_DOCK_PLACEHOLDER(gdl_dock_placeholder_new(
|
||||
"ph1", GDL_DOCK_OBJECT(dock_.gobj()), GDL_DOCK_TOP, FALSE));
|
||||
dockPlaceholders_[1] = GDL_DOCK_PLACEHOLDER(gdl_dock_placeholder_new(
|
||||
"ph2", GDL_DOCK_OBJECT(dock_.gobj()), GDL_DOCK_BOTTOM, FALSE));
|
||||
dockPlaceholders_[2] = GDL_DOCK_PLACEHOLDER(gdl_dock_placeholder_new(
|
||||
"ph3", GDL_DOCK_OBJECT(dock_.gobj()), GDL_DOCK_LEFT, FALSE));
|
||||
dockPlaceholders_[3] = GDL_DOCK_PLACEHOLDER(gdl_dock_placeholder_new(
|
||||
"ph4", GDL_DOCK_OBJECT(dock_.gobj()), GDL_DOCK_RIGHT, FALSE));
|
||||
ENSURE(dockPlaceholders_[0] && dockPlaceholders_[1] &&
|
||||
dockPlaceholders_[2] && dockPlaceholders_[3]);
|
||||
|
||||
createPanels();
|
||||
}
|
||||
|
||||
|
||||
Gdl::Dock&
|
||||
DockArea::getDock()
|
||||
{
|
||||
return dock_;
|
||||
}
|
||||
|
||||
|
||||
Gdl::DockBar&
|
||||
DockArea::getDockBar()
|
||||
{
|
||||
return dockBar_;
|
||||
}
|
||||
|
||||
|
||||
WorkspaceWindow&
|
||||
DockArea::getWorkspaceWindow()
|
||||
{
|
||||
return workspaceWindow_;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DockArea::showPanel (const int description_index)
|
||||
{
|
||||
// Try and find the panel and present it if possible
|
||||
list< panel::Panel* >::iterator i;
|
||||
for(i = panels_.begin(); i != panels_.end(); i++)
|
||||
{
|
||||
panel::Panel* const panel = *i;
|
||||
if (getPanelType(panel) == description_index)
|
||||
{
|
||||
if (!panel->is_shown()) panel->show();
|
||||
|
||||
Gdl::DockItem &dock_item = panel->getDockItem();
|
||||
// ENSURE(dock_item);
|
||||
dock_item.present(dock_);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Create the new panel
|
||||
panel::Panel *new_panel = createPanel_by_index (description_index);
|
||||
|
||||
// Dock the item
|
||||
dock_.add_item(new_panel->getDockItem(), Gdl::DOCK_FLOATING);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DockArea::switchPanel (panel::Panel& old_panel, const int description_index)
|
||||
{
|
||||
REQUIRE (description_index >= 0 &&
|
||||
description_index < getPanelDescriptionCount());
|
||||
|
||||
// Get the dock item
|
||||
Gdl::DockItem &dock_item = old_panel.getDockItem();
|
||||
|
||||
// Release the old panel
|
||||
removePanel (&old_panel);
|
||||
|
||||
// Create the new panel
|
||||
createPanel_by_index (description_index, dock_item);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DockArea::splitPanel (panel::Panel& panel, Gtk::Orientation split_direction)
|
||||
{
|
||||
|
||||
// Create the new panel
|
||||
const int index = getPanelType(&panel);
|
||||
panel::Panel *new_panel = createPanel_by_index(index);
|
||||
|
||||
// Dock the panel
|
||||
Gdl::DockPlacement placement = Gdl::DOCK_NONE;
|
||||
switch(split_direction)
|
||||
{
|
||||
case ORIENTATION_HORIZONTAL:
|
||||
placement = Gdl::DOCK_RIGHT;
|
||||
break;
|
||||
|
||||
case ORIENTATION_VERTICAL:
|
||||
placement = Gdl::DOCK_BOTTOM;
|
||||
break;
|
||||
|
||||
default:
|
||||
ERROR(gui, "Unknown split_direction: %d", split_direction);
|
||||
return;
|
||||
break;
|
||||
}
|
||||
|
||||
panel.getDockItem().dock(
|
||||
new_panel->getDockItem(),placement);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
DockArea::getPanelDescriptionCount()
|
||||
{
|
||||
return sizeof(panelDescriptionList) / sizeof(PanelDescription);
|
||||
}
|
||||
|
||||
|
||||
const gchar*
|
||||
DockArea::getPanelStockID (int index)
|
||||
{
|
||||
REQUIRE (index >= 0 && index < getPanelDescriptionCount());
|
||||
return panelDescriptionList[index].getStockID();
|
||||
}
|
||||
|
||||
|
||||
const char*
|
||||
DockArea::getPanelTitle (int index)
|
||||
{
|
||||
REQUIRE (index >= 0 && index < getPanelDescriptionCount());
|
||||
return panelDescriptionList[index].getTitle();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DockArea::createPanels()
|
||||
{
|
||||
///////////////////////////////TICKET #1026 : code smell, use types directly instead
|
||||
panel::Panel* assetsPanel = createPanel_by_name("AssetsPanel");
|
||||
panel::Panel* viewerPanel = createPanel_by_name("InfoBoxPanel");
|
||||
panel::Panel* timelinePanel = createPanel_by_name("TimelinePanel");
|
||||
|
||||
dock_.add_item(assetsPanel->getDockItem(),Gdl::DOCK_LEFT);
|
||||
dock_.add_item(timelinePanel->getDockItem(),Gdl::DOCK_BOTTOM);
|
||||
dock_.add_item(viewerPanel->getDockItem(),Gdl::DOCK_RIGHT);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
DockArea::findPanelDescription (const char* class_name) const
|
||||
{
|
||||
REQUIRE(class_name);
|
||||
|
||||
const int count = getPanelDescriptionCount();
|
||||
for(int i = 0; i < count; i++)
|
||||
{
|
||||
if (strstr(panelDescriptionList[i].getClassName(), class_name))
|
||||
return i;
|
||||
}
|
||||
|
||||
ERROR (gui, "Unable to find a description with class name %s", class_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
panel::Panel*
|
||||
DockArea::createPanel_by_index (const int index)
|
||||
{
|
||||
REQUIRE(index >= 0 && index < getPanelDescriptionCount());
|
||||
|
||||
// Make a unique name for the panel
|
||||
char name[5];
|
||||
snprintf(name, sizeof(name), "%X", panelID++);
|
||||
|
||||
// Create a dock item
|
||||
return createPanel_by_index(index,
|
||||
*new Gdl::DockItem(name,"",Gdl::DOCK_ITEM_BEH_NORMAL));
|
||||
}
|
||||
|
||||
|
||||
panel::Panel*
|
||||
DockArea::createPanel_by_index (const int index, Gdl::DockItem &dock_item)
|
||||
{
|
||||
// Create the panel object
|
||||
panel::Panel *panel = panelDescriptionList[index].create(*this, dock_item);
|
||||
ENSURE(panel);
|
||||
panel->show_all();
|
||||
|
||||
// Connect event handlers
|
||||
panel->signal_hidePanel().connect(sigc::bind(
|
||||
sigc::mem_fun(*this, &PanelManager::on_panel_shown), panel));
|
||||
|
||||
// Add the panel to the list
|
||||
panels_.push_back(panel);
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
|
||||
panel::Panel*
|
||||
DockArea::createPanel_by_name (const char* class_name)
|
||||
{
|
||||
REQUIRE(class_name);
|
||||
const int index = findPanelDescription(class_name);
|
||||
return createPanel_by_index(index);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
DockArea::getPanelType (panel::Panel* const panel) const
|
||||
{
|
||||
REQUIRE(panel);
|
||||
|
||||
const type_info &info = typeid(*panel);
|
||||
const int count = getPanelDescriptionCount();
|
||||
for(int i = 0; i < count; i++)
|
||||
{
|
||||
if(info == panelDescriptionList[i].getClassInfo())
|
||||
return i;
|
||||
}
|
||||
|
||||
ERROR(gui, "Unable to find a description with with this class type");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DockArea::removePanel (panel::Panel* const panel)
|
||||
{
|
||||
REQUIRE(panel);
|
||||
|
||||
list< panel::Panel* >::iterator i;
|
||||
for(i = panels_.begin(); i != panels_.end(); i++)
|
||||
{
|
||||
if(*i == panel)
|
||||
{
|
||||
delete panel;
|
||||
panels_.erase(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DockArea::clearPanels()
|
||||
{
|
||||
///////////////////////////////////////////////////////TICKET #195 : this whole approach smells like an obsolete "C-style" approach. We should strive to let the runtime system do such stuff for us whenever possible, eg. by using smart pointers
|
||||
|
||||
list< panel::Panel* >::iterator i;
|
||||
for(i = panels_.begin(); i != panels_.end(); i++)
|
||||
delete *i;
|
||||
panels_.clear();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DockArea::on_panel_shown (panel::Panel* panel)
|
||||
{
|
||||
REQUIRE(panel);
|
||||
if(panel->is_shown() || panel->is_iconified()) return;
|
||||
|
||||
removePanel(panel);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}}// namespace gui::workspace
|
||||
339
src/gui/workspace/dock-area.hpp
Normal file
339
src/gui/workspace/dock-area.hpp
Normal file
|
|
@ -0,0 +1,339 @@
|
|||
/*
|
||||
DOCK-AREA.hpp - maintain a docking area within the WorkspaceWindow
|
||||
|
||||
Copyright (C) Lumiera.org
|
||||
2008, Joel Holdsworth <joel@airwebreathe.org.uk>
|
||||
2018, Hermann Vosseler <Ichthyostega@web.de>
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License as
|
||||
published by the Free Software Foundation; either version 2 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/** @file dock-area.hpp
|
||||
** Management of dockable panels within each top-level WorkspaceWindow.
|
||||
**
|
||||
** @todo 2017 need to clarify the intended behaviour of panels
|
||||
** ///////////////////////////////////////////////////////////////////////////TICKET #1097 clarify the role and behaviour of Panels
|
||||
** @todo will be transformed into a Dock entity as of 6/2018 /////////////////////////////////////////////TICKET #1144 refactor dock handling
|
||||
**
|
||||
** @see actions.hpp
|
||||
*/
|
||||
|
||||
#ifndef GUI_WORKSPACE_DOCK_AREA_H
|
||||
#define GUI_WORKSPACE_DOCK_AREA_H
|
||||
|
||||
#include "gui/panel/panel.hpp"
|
||||
|
||||
#include <gdlmm.h>
|
||||
#include <typeinfo>
|
||||
|
||||
|
||||
using namespace gui::panel; ///////////////////////////////////////////////////////////////////////////TICKET #1071 no wildcard includes please!
|
||||
|
||||
namespace gui {
|
||||
namespace workspace {
|
||||
|
||||
|
||||
/**
|
||||
* A class to manage DockItem objects for WorkspaceWindow.
|
||||
* @todo this code is smelly and needs some clean-up ///////////////////////////////TICKET #1026
|
||||
*/
|
||||
class DockArea
|
||||
{
|
||||
/** reference to the owner workspace window object */
|
||||
WorkspaceWindow& workspaceWindow_;
|
||||
|
||||
/** The pointer to GDL dock widget.
|
||||
* @remarks This value is NULL until setup_dock has been called.
|
||||
*/
|
||||
Gdl::Dock dock_;
|
||||
|
||||
/** The pointer to GDL dock bar widget.
|
||||
* @remarks This value is NULL until setup_dock has been called.
|
||||
*/
|
||||
Gdl::DockBar dockBar_;
|
||||
|
||||
/** The pointer to GDL dock layout object.
|
||||
* @remarks This value is NULL until setup_dock has been called.
|
||||
*/
|
||||
Glib::RefPtr<Gdl::DockLayout> dockLayout_;
|
||||
|
||||
/** Pointers to the 4 root place holders.
|
||||
* @remarks All 4 entries are NULL until setup_dock has been called.
|
||||
*/
|
||||
GdlDockPlaceholder *dockPlaceholders_[4];
|
||||
|
||||
/** list of all panels created */
|
||||
std::list<panel::Panel*> panels_;
|
||||
|
||||
/**
|
||||
* An accumulator for the panel id.
|
||||
*/
|
||||
static unsigned short panelID;
|
||||
|
||||
|
||||
public:
|
||||
DockArea (WorkspaceWindow&);
|
||||
~DockArea();
|
||||
|
||||
/**
|
||||
* Initialises this dock manager and creates the dock and all it's widgets.
|
||||
* @remarks This function must be called only once as the first call after construction.
|
||||
*/
|
||||
void setupDock();
|
||||
|
||||
/**
|
||||
* Gets a pointer to the dock object.
|
||||
* @remarks Note that this must not be called before setup_dock. ///////////////////////////////TICKET #1026 : code smell
|
||||
*/
|
||||
Gdl::Dock& getDock();
|
||||
|
||||
/**
|
||||
* Gets a pointer to the dock bar.
|
||||
* @remarks Note that this must not be called before setup_dock.
|
||||
*/
|
||||
Gdl::DockBar& getDockBar();
|
||||
|
||||
/**
|
||||
* Returns a reference to the owner workspace window.
|
||||
*/
|
||||
WorkspaceWindow& getWorkspaceWindow(); ///////////////////////////////TICKET #1026 : code smell, unclear dependency relation
|
||||
|
||||
/**
|
||||
* Shows a panel given a description index.
|
||||
* @param description_index The index of the panel type to show.
|
||||
*/
|
||||
void showPanel (const int description_index);
|
||||
|
||||
/**
|
||||
* Switches a panel from one type to another,
|
||||
* without touching the underlying GdlDockItem.
|
||||
* @param old_panel The panel which will be transformed to a new type.
|
||||
* @param description_index The index of the panel description
|
||||
* that will be instantiated.
|
||||
*/
|
||||
void switchPanel (panel::Panel& old_panel, const int description_index);
|
||||
|
||||
/**
|
||||
* Splits a panel into two panels of the same type.
|
||||
* @param panel The panel to split.
|
||||
* @param split_direction The direction to split the panel in.
|
||||
*/
|
||||
void splitPanel (panel::Panel& panel, Gtk::Orientation split_direction);
|
||||
|
||||
|
||||
public:
|
||||
/** Gets the number of panel descriptions. */
|
||||
static int getPanelDescriptionCount();
|
||||
|
||||
/**
|
||||
* Gets a panel description's stock id.
|
||||
* @param index The index of the panel to retrieve.
|
||||
* @return Returns the stock id of a panel at this index.
|
||||
*/
|
||||
static const gchar* getPanelStockID (const int index);
|
||||
|
||||
/**
|
||||
* Gets a panel description's title.
|
||||
* @param index The index of the panel to retrieve.
|
||||
* @return Returns the title of a panel at this index.
|
||||
*/
|
||||
static const char* getPanelTitle (int index);
|
||||
|
||||
|
||||
private:
|
||||
/** Creates the standard panel layout.*/
|
||||
void createPanels();
|
||||
|
||||
/**
|
||||
* Find the index of a panel description given the class name.
|
||||
* @param class_name The name of the object class to search for.
|
||||
* @return Returns the index of the panel description found, or -1
|
||||
* if no description was found for this type.
|
||||
*/
|
||||
int findPanelDescription (const char* class_name) const;
|
||||
|
||||
/**
|
||||
* Creates a panel by description index.
|
||||
* @param index The index of the description to instantiate.
|
||||
* @return Returns a pointer to the new instantiated panel object.
|
||||
*/
|
||||
panel::Panel* createPanel_by_index (const int index);
|
||||
|
||||
/**
|
||||
* Creates a panel by description index with a given GdlDockItem
|
||||
* @param index The index of the description to instantiate.
|
||||
* @param dock_item The GdlDockItem to attach this panel to
|
||||
* @return Returns a pointer to the new instantiated panel object.
|
||||
*/
|
||||
panel::Panel* createPanel_by_index (const int index, Gdl::DockItem& dock_item);
|
||||
|
||||
/**
|
||||
* Creates a panel by class name.
|
||||
* @param class_name The name of the object class to create.
|
||||
* @return Returns a pointer to the new instantiated panel object.
|
||||
*/
|
||||
panel::Panel* createPanel_by_name (const char* class_name);
|
||||
|
||||
/**
|
||||
* Gets the type of a given panel.
|
||||
* @param panel The Panel to get the type of
|
||||
* @return Returns the index of the panel description found, or -1
|
||||
* if no description was found for this type.
|
||||
*/
|
||||
int getPanelType (panel::Panel* const panel) const;
|
||||
|
||||
/**
|
||||
* Removes a panel from the panel list and deletes it.
|
||||
* @param panel The panel to remove and delete.
|
||||
*/
|
||||
void removePanel (panel::Panel* const panel);
|
||||
|
||||
/** Removes all panels from the panel list and deletes them.*/
|
||||
void clearPanels();
|
||||
|
||||
|
||||
private:
|
||||
/**
|
||||
* An event handler for when the panel is shown or hidden.
|
||||
* @param panel A pointer to the panel that was hidden.
|
||||
*/
|
||||
void on_panel_shown (panel::Panel *panel);
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* A class to describe and instantiate Panel types.
|
||||
*/
|
||||
class PanelDescription
|
||||
{
|
||||
protected:
|
||||
typedef panel::Panel* (*const CreatePanelProc)(PanelManager&, Gdl::DockItem&);
|
||||
///////////////////////////////TICKET #1026 : code smell, why not just using inheritance?
|
||||
private:
|
||||
/** reference to the typeID of this class */
|
||||
const std::type_info& classInfo_;
|
||||
|
||||
/** localised title that will be shown on the panel. */
|
||||
const char* const titleName_;
|
||||
|
||||
/** Stock ID for this type of panel.*/
|
||||
const gchar* const stockID_;
|
||||
|
||||
/**pointer to a function that will instantiate the panel object */
|
||||
CreatePanelProc createPanelProc_;
|
||||
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @param classInfo The typeID of the Panel class
|
||||
* @param title The localised title that will be shown on the panel.
|
||||
* @param stock_id The Stock ID for this type of panel.
|
||||
* @param create_panel_proc A pointer to a function that will instantiate the panel object.
|
||||
*/
|
||||
PanelDescription (std::type_info const& classInfo
|
||||
,const char* title
|
||||
,const gchar* stockID
|
||||
,CreatePanelProc createPanelProc)
|
||||
: classInfo_(classInfo)
|
||||
, titleName_(title)
|
||||
, stockID_(stockID)
|
||||
, createPanelProc_(createPanelProc)
|
||||
{
|
||||
REQUIRE(titleName_);
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
const std::type_info& getClassInfo() const
|
||||
{
|
||||
return classInfo_;
|
||||
}
|
||||
|
||||
const char* getClassName() const
|
||||
{
|
||||
return classInfo_.name();
|
||||
}
|
||||
|
||||
/** the localised title that will be shown on the panel */
|
||||
const char* getTitle() const
|
||||
{
|
||||
ENSURE(titleName_);
|
||||
return titleName_;
|
||||
}
|
||||
|
||||
const gchar* getStockID() const
|
||||
{
|
||||
ENSURE(stockID_);
|
||||
return stockID_;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an instance of this panel.
|
||||
* @param panel_manager The owner panel manager.
|
||||
* @param dock_item The GdlDockItem that will host this panel.
|
||||
* @return Returns a pointer to the panel object.
|
||||
*/
|
||||
panel::Panel*
|
||||
create (PanelManager& panelManager, Gdl::DockItem& dockItem) const
|
||||
{
|
||||
REQUIRE(createPanelProc_);
|
||||
return createPanelProc_ (panelManager, dockItem);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* A helper class that will create PanelDescription objects.
|
||||
* @param P The type of panel::Panel that the PanelDescription will describe.
|
||||
*/
|
||||
template<class P>
|
||||
class Panel
|
||||
: public PanelDescription
|
||||
{
|
||||
public:
|
||||
Panel()
|
||||
: PanelDescription (typeid(P)
|
||||
,P::getTitle()
|
||||
,P::getStockID()
|
||||
,Panel::createPanel)
|
||||
{ }
|
||||
|
||||
private:
|
||||
/**helper function to create a panel of type P
|
||||
* @param panel_manager The owner panel manager.
|
||||
* @param dock_item The Gdl::DockItem that will host this panel.
|
||||
* @return pointer to the created panel object.
|
||||
*/
|
||||
static panel::Panel*
|
||||
createPanel (PanelManager& panelManager, Gdl::DockItem& dockItem)
|
||||
{
|
||||
return new P(panelManager, dockItem);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/** The list of panel descriptions */
|
||||
static const PanelDescription panelDescriptionList[];
|
||||
};
|
||||
|
||||
|
||||
}}// namespace gui::workspace
|
||||
#endif /*GUI_WORKSPACE_DOCK_AREA_H*/
|
||||
|
|
@ -23,7 +23,8 @@
|
|||
|
||||
/** @file panel-manager.cpp
|
||||
** Implementation of dockable UI panels, implemented with the
|
||||
** help of lib GDL (»Gnome Docking Libraray«, formerly aka »Gnome Design Library«)
|
||||
** help of lib GDL (»Gnome Docking Library«, formerly aka »Gnome Design Library«)
|
||||
** @deprecated shall be transformed into a Dock entity as of 6/2018
|
||||
*/
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
**
|
||||
** @todo 2017 need to clarify the intended behaviour of panels
|
||||
** ///////////////////////////////////////////////////////////////////////////TICKET #1097 clarify the role and behaviour of Panels
|
||||
** @deprecated shall be transformed into a Dock entity as of 6/2018 //////////////////////////////////////TICKET #1144 refactor dock handling
|
||||
**
|
||||
** @see actions.hpp
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -3168,7 +3168,7 @@ In order to build a sensible plan for our timeline structure, we need to investi
|
|||
}}}
|
||||
</pre>
|
||||
</div>
|
||||
<div title="GuiDockingPanel" creator="Ichthyostega" modifier="Ichthyostega" created="201708311617" modified="201709021604" tags="design GuiPattern draft" changecount="8">
|
||||
<div title="GuiDockingPanel" creator="Ichthyostega" modifier="Ichthyostega" created="201708311617" modified="201806171308" tags="design GuiPattern draft" changecount="10">
|
||||
<pre>//Management of dockable content panes//
|
||||
Within each top level application window, the usable screen real estate can be split and arranged into a number of standard view building blocks. Each of this //panels// follows a specific preconfigured basic layout -- these are hard coded, yet customisable in detail. There is a finite list of such panel types available:
|
||||
* the [[timeline display|GuiTimelineView]]
|
||||
|
|
@ -3182,6 +3182,13 @@ Please note the distinction between UI component view and panel; in many cases t
|
|||
!Placing and addressing of embedded contents
|
||||
A specific problem arises insofar other parts of the UI need to create, address and control some UI entities, which at the same time exist as part of a docking panel. This is a problem of crosscutting concerns: UI control and interaction structure should not be mingled with the generic concern to maintain a component as part of a screen layout. Unfortunately, the design of standard UI toolkit sets is incredibly naive when it comes to interaction design, and the only available alternative is to rely on frameworks, which come with a hard-wired philosophy.
|
||||
As a result, we're forced to build our UI from components which fall short on the distinction between //ownership and control.//
|
||||
|
||||
!Hierarchy and organisation
|
||||
Each top-level window //holds a single dock,// which in turn might hold several docking panels, in a layout arranged by the user. However, the library ''GDL'', which Lumiera uses to implement docking functionality, introduce the notion of a //dock master.// This is an invisible control component, which maintains a common layout of panels, possibly located within several separated docks. The role of the master can be re-assigned; typically it is automatically attained by the first dock created, and several docks will share the same master, if and only if they are created as dependent, which means to create the second dock by referring to the first one (there is a dedicated function in GDL to achieve that). Only docks managed by the same master may participate in drag-n-drop actions beyond the scope of a single dock. Moreover, all iconified panels of a given master are represented as icons within a single //dock bar.//
|
||||
|
||||
!!!Panel Locator
|
||||
In accordance with this structure, we introduce a central component, the {{{PanelLocator}}} -- to keep track of all {{{DockArea}}} elements within the UI. The latter are responsible for managing the docking panels //within a specific// top-level {{{WorkspaceWindow}}}.
|
||||
|
||||
</pre>
|
||||
</div>
|
||||
<div title="GuiFacade" modifier="Ichthyostega" created="200902080719" modified="201708041501" tags="def spec" changecount="1">
|
||||
|
|
|
|||
|
|
@ -2831,6 +2831,21 @@
|
|||
<linktarget COLOR="#806893" DESTINATION="ID_1020871440" ENDARROW="Default" ENDINCLINATION="-3;460;" ID="Arrow_ID_412107208" SOURCE="ID_1943521361" STARTARROW="Default" STARTINCLINATION="-618;-18;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529235342511" ID="ID_1922506931" MODIFIED="1529235526604">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
<b>Aufgabe</b>: docking panels global
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<arrowlink COLOR="#b0466a" DESTINATION="ID_629544763" ENDARROW="Default" ENDINCLINATION="-849;-1967;" ID="Arrow_ID_1826422316" STARTARROW="None" STARTINCLINATION="690;23;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1485551018975" ID="ID_1865473127" MODIFIED="1518487921060" TEXT="obsoletes Project & Controller">
|
||||
<node CREATED="1485551030086" ID="ID_1052165402" MODIFIED="1518487921060" TEXT="in GtkLumiera definiert"/>
|
||||
|
|
@ -11026,7 +11041,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1517506090553" HGAP="59" ID="ID_1416624438" MODIFIED="1522938364977" TEXT="UILocationSolver" VSHIFT="-20">
|
||||
<node COLOR="#338800" CREATED="1517506090553" FOLDED="true" HGAP="59" ID="ID_1416624438" MODIFIED="1529079782016" TEXT="UILocationSolver" VSHIFT="-20">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1517506104183" ID="ID_798223993" MODIFIED="1522808764330" STYLE="fork" TEXT="ansiedeln im ViewLocator">
|
||||
<node CREATED="1522808738035" ID="ID_1951089115" MODIFIED="1522808764329" TEXT="als Service exportieren"/>
|
||||
|
|
@ -11250,13 +11265,13 @@
|
|||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354443485" ID="ID_1474832227" MODIFIED="1519354447748" TEXT="always create">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354760313" FOLDED="true" ID="ID_321705251" MODIFIED="1525124216344" TEXT="Umgang mit Duplikaten">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354760313" ID="ID_321705251" MODIFIED="1529079765812" TEXT="Umgang mit Duplikaten">
|
||||
<linktarget COLOR="#807e9b" DESTINATION="ID_321705251" ENDARROW="Default" ENDINCLINATION="127;-96;" ID="Arrow_ID_1030149985" SOURCE="ID_1792932496" STARTARROW="None" STARTINCLINATION="390;-188;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1519354813458" ID="ID_168710453" MODIFIED="1519354818789" TEXT="beiseite schieben"/>
|
||||
<node CREATED="1519354819473" ID="ID_996615547" MODIFIED="1519354824572" TEXT="Tab innerhalb erzeugen"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1519354769960" ID="ID_778018274" MODIFIED="1529077174975" TEXT="Festlegung: was sind die Namen?">
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1519354769960" ID="ID_778018274" MODIFIED="1529079925485" TEXT="Festlegung: was sind die Namen?">
|
||||
<linktarget COLOR="#2b4283" DESTINATION="ID_778018274" ENDARROW="Default" ENDINCLINATION="-1752;0;" ID="Arrow_ID_1022345699" SOURCE="ID_377787861" STARTARROW="None" STARTINCLINATION="795;544;"/>
|
||||
<linktarget COLOR="#5260a0" DESTINATION="ID_778018274" ENDARROW="Default" ENDINCLINATION="-1217;51;" ID="Arrow_ID_597388409" SOURCE="ID_266745032" STARTARROW="None" STARTINCLINATION="686;0;"/>
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
|
|
@ -11471,11 +11486,11 @@
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523752547477" ID="ID_1121433532" MODIFIED="1529073662084" TEXT="limitAllocation">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523752559939" ID="ID_597346628" MODIFIED="1529073653822" TEXT="umsetzen auf ElementAccess-API">
|
||||
<node COLOR="#338800" CREATED="1523752559939" ID="ID_597346628" MODIFIED="1529079670933" TEXT="umsetzen auf ElementAccess-API">
|
||||
<linktarget COLOR="#97cad5" DESTINATION="ID_597346628" ENDARROW="Default" ENDINCLINATION="126;9;" ID="Arrow_ID_89575203" SOURCE="ID_1979012219" STARTARROW="None" STARTINCLINATION="567;-16;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1525567190247" ID="ID_42079899" MODIFIED="1529073619928" TEXT="Problem: API noch nicht vollständig">
|
||||
<node COLOR="#338800" CREATED="1525567190247" FOLDED="true" ID="ID_42079899" MODIFIED="1529079663449" TEXT="Problem: API noch nicht vollständig">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1525567207940" HGAP="76" ID="ID_1154047307" MODIFIED="1525567222800" TEXT="wirklich zwei Zugriffe?" VSHIFT="-9">
|
||||
<icon BUILTIN="help"/>
|
||||
|
|
@ -11497,7 +11512,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1525567474513" HGAP="136" ID="ID_492657286" MODIFIED="1529073647301" TEXT="ElementAccess-API umbauen" VSHIFT="5">
|
||||
<node COLOR="#338800" CREATED="1525567474513" FOLDED="true" HGAP="136" ID="ID_492657286" MODIFIED="1529079658284" TEXT="ElementAccess-API umbauen" VSHIFT="5">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1529016810234" ID="ID_190701762" MODIFIED="1529016835751" TEXT="Möglichkeiten">
|
||||
<node CREATED="1528988155980" ID="ID_425314989" MODIFIED="1528988170052" TEXT="Variante-1">
|
||||
|
|
@ -11665,6 +11680,9 @@
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523752571241" ID="ID_1806352950" MODIFIED="1523752593134" TEXT="Anzahl Instanzen herausfinden">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529079675765" ID="ID_1441903624" MODIFIED="1529079695630" TEXT="Limit erzwingen">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -11692,7 +11710,7 @@
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1522940118628" ID="ID_356408235" MODIFIED="1523752865657" TEXT="auf Typ getemplated">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1523750592900" ID="ID_266745032" MODIFIED="1529077174975" TEXT=""viewID" ist erst mal eine Typ-ID">
|
||||
<node CREATED="1523750592900" ID="ID_266745032" MODIFIED="1529079925485" TEXT=""viewID" ist erst mal eine Typ-ID">
|
||||
<arrowlink COLOR="#5260a0" DESTINATION="ID_778018274" ENDARROW="Default" ENDINCLINATION="-1217;51;" ID="Arrow_ID_597388409" STARTARROW="None" STARTINCLINATION="686;0;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
|
|
@ -11720,8 +11738,8 @@
|
|||
</node>
|
||||
<node CREATED="1522940167125" ID="ID_980922327" MODIFIED="1522940174904" TEXT="hält die konkrete ViewSpec-DSL"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1525564232321" ID="ID_46755801" MODIFIED="1525564248456" TEXT="konkrete Allokator-Strategien verdrahten">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1525564232321" ID="ID_46755801" MODIFIED="1529079723225" TEXT="konkrete Allokator-Strategien verdrahten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1525564255702" ID="ID_645519559" MODIFIED="1525564259768" TEXT="hinten rum">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
|
|
@ -11748,6 +11766,9 @@
|
|||
</html></richcontent>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1529079727758" ID="ID_288941017" MODIFIED="1529079742349" TEXT="Lösung gefunden: ElementAccess gibt UICoord zurück">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522940203377" ID="ID_1539937928" MODIFIED="1522940298042" TEXT="Testabdeckung">
|
||||
|
|
@ -11778,7 +11799,7 @@
|
|||
<node COLOR="#338800" CREATED="1506984645745" ID="ID_244163155" MODIFIED="1518487921071" TEXT="verify_simpleUsage">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1506984645747" ID="ID_517262443" MODIFIED="1525124215011" TEXT="verify_backingQuery">
|
||||
<node COLOR="#338800" CREATED="1506984645747" FOLDED="true" ID="ID_517262443" MODIFIED="1529079828882" TEXT="verify_backingQuery">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1508809610790" ID="ID_1860790851" MODIFIED="1512926191814" TEXT="Builder-Syntax war falsch">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -11924,7 +11945,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1506984645748" ID="ID_1254044275" MODIFIED="1525124215013" TEXT="verify_queryAnchor">
|
||||
<node COLOR="#338800" CREATED="1506984645748" FOLDED="true" ID="ID_1254044275" MODIFIED="1529079830658" TEXT="verify_queryAnchor">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1513477632318" ID="ID_1636138355" MODIFIED="1515209155590" TEXT="setzt PathResolution voraus">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -11970,7 +11991,7 @@
|
|||
<node CREATED="1515209280278" ID="ID_959372189" MODIFIED="1518487921071" TEXT="sinnlos, da man das Ergebnis nicht sieht"/>
|
||||
<node CREATED="1515209292804" ID="ID_907780055" MODIFIED="1523750073991" TEXT="ansonsten redundant zur Mutation"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1506984645748" ID="ID_1171284706" MODIFIED="1518487921071" TEXT="verify_mutateAnchor">
|
||||
<node COLOR="#338800" CREATED="1506984645748" FOLDED="true" ID="ID_1171284706" MODIFIED="1529079834427" TEXT="verify_mutateAnchor">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1515287623841" ID="ID_11774693" MODIFIED="1518487921071" TEXT="explizit verankert: ändert sich nix">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12069,7 +12090,7 @@
|
|||
<arrowlink COLOR="#4b5c8d" DESTINATION="ID_1362494392" ENDARROW="Default" ENDINCLINATION="398;572;" ID="Arrow_ID_82261909" STARTARROW="None" STARTINCLINATION="1404;115;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1506984645748" ID="ID_768385613" MODIFIED="1518487921071" TEXT="verify_mutateExtend">
|
||||
<node COLOR="#338800" CREATED="1506984645748" FOLDED="true" ID="ID_768385613" MODIFIED="1529079837418" TEXT="verify_mutateExtend">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1515449655380" ID="ID_1282321814" MODIFIED="1518487921071" TEXT="expliziten Pfad erweitern">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12116,7 +12137,7 @@
|
|||
<node COLOR="#338800" CREATED="1517506256691" ID="ID_360871736" MODIFIED="1518487921071" TEXT="einfaches Anwendungs-Beispiel">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1517506268969" ID="ID_1285475519" MODIFIED="1518762392678" TEXT="theoretische Grenzfälle">
|
||||
<node COLOR="#338800" CREATED="1517506268969" FOLDED="true" ID="ID_1285475519" MODIFIED="1529079862199" TEXT="theoretische Grenzfälle">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1518220727527" ID="ID_935687591" MODIFIED="1518762392404" TEXT="leere Regel">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12136,7 +12157,7 @@
|
|||
<node COLOR="#338800" CREATED="1518220812132" ID="ID_1855700910" MODIFIED="1518762392404" TEXT="zu lange Regel">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1518221033294" ID="ID_379081230" MODIFIED="1518762392404" TEXT="Anfrage auf Window">
|
||||
<node CREATED="1518221033294" FOLDED="true" ID="ID_379081230" MODIFIED="1529079845088" TEXT="Anfrage auf Window">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1518221041493" ID="ID_1938682325" MODIFIED="1518762392404" TEXT="existierend">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12154,7 +12175,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1518221096237" ID="ID_1538354349" MODIFIED="1518762392404" TEXT="Anfrage auf Perspektive">
|
||||
<node CREATED="1518221096237" FOLDED="true" ID="ID_1538354349" MODIFIED="1529079846487" TEXT="Anfrage auf Perspektive">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1518221103372" ID="ID_4661652" MODIFIED="1518762392404" TEXT="existierend">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12171,7 +12192,7 @@
|
|||
</node>
|
||||
<node CREATED="1518221188121" ID="ID_541455871" MODIFIED="1518762392404" TEXT="Anfrage auf (tiefen) Pfad">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1518221206998" ID="ID_1900776687" MODIFIED="1518762392404" TEXT="komplett explizit">
|
||||
<node CREATED="1518221206998" FOLDED="true" ID="ID_1900776687" MODIFIED="1529079850943" TEXT="komplett explizit">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1518221213277" ID="ID_1744618018" MODIFIED="1518762392404" TEXT="covered">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12192,7 +12213,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1518221321054" ID="ID_1884750439" MODIFIED="1518762392404" TEXT="Wildcard">
|
||||
<node CREATED="1518221321054" FOLDED="true" ID="ID_1884750439" MODIFIED="1529079852175" TEXT="Wildcard">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1518221328398" ID="ID_771962346" MODIFIED="1518762392404" TEXT="covered">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -12251,7 +12272,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1517506289222" ID="ID_1250541940" MODIFIED="1518762396012" TEXT="praktische Standard-Fälle">
|
||||
<node COLOR="#338800" CREATED="1517506289222" FOLDED="true" ID="ID_1250541940" MODIFIED="1529079863815" TEXT="praktische Standard-Fälle">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1518575724831" ID="ID_712009155" MODIFIED="1518579539092" TEXT="Idee">
|
||||
<icon BUILTIN="idea"/>
|
||||
|
|
@ -12380,13 +12401,13 @@
|
|||
<node CREATED="1523746796508" ID="ID_1839059733" MODIFIED="1523746796508" TEXT="Aufruf nur nachbauen"/>
|
||||
<node CREATED="1523746798210" ID="ID_1076120435" MODIFIED="1523746818187" TEXT="Fake-DSL-Definitionen verwenden"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523749882439" ID="ID_1150944546" MODIFIED="1523749902400" TEXT="Schritt-1">
|
||||
<node COLOR="#435e98" CREATED="1523749882439" ID="ID_1150944546" MODIFIED="1529079882713" TEXT="Schritt-1">
|
||||
<icon BUILTIN="full-1"/>
|
||||
<node CREATED="1523749910106" ID="ID_542105863" MODIFIED="1523750022741" TEXT="einfache direkte Erzeugung von einem View">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523749925224" ID="ID_1469440140" MODIFIED="1523750019076" TEXT="minimale Verifikation">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1523749925224" ID="ID_1469440140" MODIFIED="1529079888021" TEXT="minimale Verifikation">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523749888005" ID="ID_1904054486" MODIFIED="1523749907772" TEXT="Schritt-2">
|
||||
|
|
@ -12394,8 +12415,8 @@
|
|||
<node CREATED="1523749931480" ID="ID_1388717184" MODIFIED="1523750026436" TEXT="komplexere Fake-DSL">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523749938023" ID="ID_873547886" MODIFIED="1523750017157" TEXT="Alternativen und wirkliche Lösung">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523749938023" ID="ID_873547886" MODIFIED="1529079897790" TEXT="Alternativen und wirkliche Lösung">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1523749952356" ID="ID_1622746609" MODIFIED="1523749963165" TEXT="Schritt-3">
|
||||
|
|
@ -13787,7 +13808,9 @@
|
|||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1504193329508" ID="ID_629544763" MODIFIED="1518487921077" TEXT="Aufgabe: docking panels">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1504193329508" ID="ID_629544763" MODIFIED="1529240085130" TEXT="Aufgabe: docking panels">
|
||||
<linktarget COLOR="#b0466a" DESTINATION="ID_629544763" ENDARROW="Default" ENDINCLINATION="-849;-1967;" ID="Arrow_ID_1826422316" SOURCE="ID_1922506931" STARTARROW="None" STARTINCLINATION="690;23;"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1504193340786" ID="ID_751993082" MODIFIED="1518487921077" TEXT="PanelLocator hier integrieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1504370542909" ID="ID_1318769916" MODIFIED="1518487921077" TEXT="Query-Front-end"/>
|
||||
|
|
@ -13796,6 +13819,30 @@
|
|||
</node>
|
||||
<node CREATED="1504370524687" ID="ID_816760158" MODIFIED="1518487921077" TEXT="PanelManager in den einzelnen Fenstern"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529240056019" HGAP="33" ID="ID_1526164022" MODIFIED="1529240077686" TEXT="#1144 refactor dock handling" VSHIFT="-6">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1529235573383" HGAP="36" ID="ID_1156887553" MODIFIED="1529235603008" TEXT="Aufteilen" VSHIFT="9">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1529235578053" ID="ID_1913662480" MODIFIED="1529235582697" TEXT="lokale UI-Mechanik"/>
|
||||
<node CREATED="1529235583621" ID="ID_627187553" MODIFIED="1529235589904" TEXT="übergreifende Steuerung">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529240710412" HGAP="79" ID="ID_1137103744" MODIFIED="1529240803601" TEXT="Kontroll-Struktur einrichten" VSHIFT="-15">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1529240725545" ID="ID_1633069135" MODIFIED="1529240728445" TEXT="PanelLocator">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529240729817" ID="ID_899357717" MODIFIED="1529240766068" TEXT="hält Kontakt zu allen Docks">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529240757677" ID="ID_1894889790" MODIFIED="1529240766845" TEXT="Lebenszyklus-Signale">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1529240774003" ID="ID_1594029670" MODIFIED="1529240795457" TEXT="Zugriff auf Dock-Master">
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1504193354056" ID="ID_385011645" MODIFIED="1518487921077">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
|
|
|||
Loading…
Reference in a new issue