wxExtend/src/framemanager.cpp
Simon Rozman 30f289123f Update Copyright and build year
Signed-off-by: Simon Rozman <simon@rozman.si>
2022-01-07 11:20:53 +01:00

123 lines
4.0 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
Copyright © 2016 GÉANT
*/
#include "pch.h"
bool WXEXTEND_API wxAuiManagerUpdatePerspectiveCaptions(wxAuiManager& mgr, wxString& perspective)
{
wxString input = perspective;
wxString part;
// check layout string version
// 'layout1' = wxAUI 0.9.0 - wxAUI 0.9.2
// 'layout2' = wxAUI 0.9.2 (wxWidgets 2.8)
part = input.BeforeFirst(wxT('|'));
input = input.AfterFirst(wxT('|'));
part.Trim(true);
part.Trim(false);
if (part != wxT("layout2"))
return false;
wxString result;
result.Alloc(500);
result = wxT("layout2|");
// replace escaped characters so we can
// split up the string easily
input.Replace(wxT("\\|"), wxT("\a"));
input.Replace(wxT("\\;"), wxT("\b"));
wxSize ppi = wxClientDC(mgr.GetManagedWindow()).GetPPI();
wxSize ppi_on_save(96, 96);
while (1)
{
wxString pane_part = input.BeforeFirst(wxT('|'));
input = input.AfterFirst(wxT('|'));
pane_part.Trim(true);
// if the string is empty, we're done parsing
if (pane_part.empty())
break;
// Undo our escaping
pane_part.Replace(wxT("\a"), wxT("|"));
pane_part.Replace(wxT("\b"), wxT(";"));
if (pane_part.Left(3) == wxT("ppi"))
{
wxString value = pane_part.AfterFirst(wxT('='));
long ppi_horz, ppi_vert;
value.BeforeFirst(wxT(',')).ToLong(&ppi_horz);
value.AfterFirst(wxT(',')).ToLong(&ppi_vert);
ppi_on_save.x = ppi_horz;
ppi_on_save.y = ppi_vert;
result += wxString::Format(wxT("ppi=%d,%d|"),
ppi.x, ppi.y);
continue;
}
else if (pane_part.Left(9) == wxT("dock_size"))
{
wxString val_name = pane_part.BeforeFirst(wxT('='));
wxString value = pane_part.AfterFirst(wxT('='));
long dir, layer, row, size;
wxString piece = val_name.AfterFirst(wxT('('));
piece = piece.BeforeLast(wxT(')'));
piece.BeforeFirst(wxT(',')).ToLong(&dir);
piece = piece.AfterFirst(wxT(','));
piece.BeforeFirst(wxT(',')).ToLong(&layer);
piece.AfterFirst(wxT(',')).ToLong(&row);
value.ToLong(&size);
wxAuiDockInfo dock;
dock.dock_direction = dir;
dock.dock_layer = layer;
dock.dock_row = row;
dock.size = size == -1 ? -1 :
dock.IsHorizontal() ? wxMulDivInt32(size, ppi.x, ppi_on_save.x) :
wxMulDivInt32(size, ppi.y, ppi_on_save.y);
result += wxString::Format(wxT("dock_size(%d,%d,%d)=%d|"),
dock.dock_direction, dock.dock_layer,
dock.dock_row, dock.size);
continue;
}
wxAuiPaneInfo pane;
mgr.LoadPaneInfo(pane_part, pane, ppi_on_save);
wxAuiPaneInfo& p = mgr.GetPane(pane.name);
if (!p.IsOk())
{
// the pane window couldn't be found
// in the existing layout -- skip it
continue;
}
// Update caption.
pane.caption = p.caption;
// Reset best/min/max sizes to allow resize on GUI changes across different versions.
pane.best_size = p.best_size;
pane.min_size = p.min_size;
pane.max_size = p.max_size;
if ((pane.state & wxAuiPaneInfo::optionResizable) == 0) {
// Reset floating size to allow resize on GUI changes across different versions for non-resizeable panes.
pane.floating_size = p.floating_size;
}
// Re-generate and append pane info.
result += mgr.SavePaneInfo(pane) + wxT('|');
}
perspective = result;
return true;
}