diff options
Diffstat (limited to 'Stars45/Layout.cpp')
-rw-r--r-- | Stars45/Layout.cpp | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/Stars45/Layout.cpp b/Stars45/Layout.cpp new file mode 100644 index 0000000..05c1eb2 --- /dev/null +++ b/Stars45/Layout.cpp @@ -0,0 +1,275 @@ +/* Starshatter OpenSource Distribution + Copyright (c) 1997-2004, Destroyer Studios LLC. + All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name "Destroyer Studios" nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + SUBSYSTEM: nGenEx.lib + FILE: Layout.cpp + AUTHOR: John DiCamillo + + + OVERVIEW + ======== + Layout Resource class implementation +*/ + +#include "MemDebug.h" +#include "Layout.h" + +// +--------------------------------------------------------------------+ + +Layout::Layout() +{ } + +Layout::~Layout() +{ } + +// +--------------------------------------------------------------------+ + +bool +Layout::DoLayout(ActiveWindow* panel) +{ + if (!panel || panel->GetChildren().size() < 1) + return false; + + if (cols.size() < 1 || rows.size() < 1) + return false; + + std::vector<DWORD> cell_x; + std::vector<DWORD> cell_y; + + ScaleWeights(); + CalcCells(panel->Width(), panel->Height(), cell_x, cell_y); + + ListIter<ActiveWindow> iter = panel->GetChildren(); + while (++iter) { + ActiveWindow* w = iter.value(); + Rect c = w->GetCells(); + Rect r; + Rect rp = panel->GetRect(); + + if (c.x < 0) c.x = 0; + else if (c.x >= (int)cell_x.size()) c.x = cell_x.size() - 1; + if (c.y < 0) c.y = 0; + else if (c.y >= (int)cell_y.size()) c.y = cell_y.size() - 1; + if (c.x+c.w >= (int)cell_x.size()) c.w = cell_x.size() - c.x - 1; + if (c.y+c.h >= (int)cell_y.size()) c.h = cell_y.size() - c.y - 1; + + r.x = cell_x[c.x] + w->GetCellInsets().left; + r.y = cell_y[c.y] + w->GetCellInsets().top; + r.w = cell_x[c.x+c.w] - w->GetCellInsets().right - r.x; + r.h = cell_y[c.y+c.h] - w->GetCellInsets().bottom - r.y; + + r.x += panel->X(); + r.y += panel->Y(); + + if (w->GetFixedWidth() && w->GetFixedWidth() < r.w) + r.w = w->GetFixedWidth(); + + if (w->GetFixedHeight() && w->GetFixedHeight() < r.h) + r.h = w->GetFixedHeight(); + + if (w->GetID() == 330 || w->GetID() == 125) { + int y1 = r.y + r.h; + int y2 = rp.y + rp.h; + } + + if (w->GetHidePartial() && (r.x + r.w > rp.x + rp.w)) { + w->MoveTo(Rect(0,0,0,0)); + } + + else if (w->GetHidePartial() && (r.y + r.h > rp.y + rp.h)) { + w->MoveTo(Rect(0,0,0,0)); + } + + else { + w->MoveTo(r); + } + } + + return true; +} + +// +--------------------------------------------------------------------+ + +void +Layout::ScaleWeights() +{ + float total = 0; + + for (auto cwi = col_weights.begin(); cwi != col_weights.end(); ++cwi) + total += *cwi; + + if (total > 0) { + for (auto cwi = col_weights.begin(); cwi != col_weights.end(); ++cwi) + *cwi = *cwi / total; + } + + total = 0; + for (auto rwi = row_weights.begin(); rwi != row_weights.end(); ++rwi) + total += *rwi; + + if (total > 0) { + for (auto rwi = row_weights.begin(); rwi != row_weights.end(); ++rwi) + *rwi = *rwi / total; + } +} + +// +--------------------------------------------------------------------+ + +void + Layout::CalcCells(DWORD w, DWORD h, std::vector<DWORD>& cell_x, std::vector<DWORD>& cell_y) +{ + DWORD x = 0; + DWORD y = 0; + DWORD min_x = 0; + DWORD min_y = 0; + DWORD ext_x = 0; + DWORD ext_y = 0; + + for (auto cit = cols.begin(); cit != cols.end(); ++cit) + min_x += *cit; + + for (auto rit = rows.begin(); rit != rows.end(); ++rit) + min_y += *rit; + + if (min_x < w) + ext_x = w - min_x; + + if (min_y < h) + ext_y = h - min_y; + + cell_x.push_back(x); + for (auto cit = cols.begin(); cit != cols.end(); ++cit) { + x += *cit + (DWORD) (ext_x * col_weights[cit - cols.begin()]); + cell_x.push_back(x); + } + + cell_y.push_back(y); + for (auto rit = rows.begin(); rit != rows.end(); ++rit) { + y += *rit + (DWORD) (ext_y * row_weights[rit - rows.begin()]); + cell_y.push_back(y); + } +} + +// +--------------------------------------------------------------------+ + +void +Layout::Clear() +{ + cols.clear(); + rows.clear(); + + col_weights.clear(); + row_weights.clear(); +} + +void +Layout::AddCol(DWORD min_width, float col_factor) +{ + cols.push_back(min_width); + col_weights.push_back(col_factor); +} + +void +Layout::AddRow(DWORD min_height, float row_factor) +{ + rows.push_back(min_height); + row_weights.push_back(row_factor); +} + +void +Layout::SetConstraints(const std::vector<DWORD>& min_x, +const std::vector<DWORD>& min_y, +const std::vector<float>& weight_x, +const std::vector<float>& weight_y) +{ + Clear(); + + if (min_x.size() == weight_x.size() && min_y.size() == weight_y.size()) { + for (auto iter = min_x.begin(); iter != min_x.end(); ++iter) + cols.push_back(*iter); + + for (auto iter = min_y.begin(); iter != min_y.end(); ++iter) + rows.push_back(*iter); + + for (auto iter = weight_x.begin(); iter != weight_x.end(); ++iter) + col_weights.push_back(*iter); + + for (auto iter = weight_y.begin(); iter != weight_y.end(); ++iter) + row_weights.push_back(*iter); + } +} + +void +Layout::SetConstraints(const std::vector<float>& min_x, +const std::vector<float>& min_y, +const std::vector<float>& weight_x, +const std::vector<float>& weight_y) +{ + Clear(); + + if (min_x.size() == weight_x.size() && + min_y.size() == weight_y.size()) { + + for (auto iter = min_x.begin(); iter != min_x.end(); ++iter) + cols.push_back((DWORD) *iter); + + for (auto iter = min_y.begin(); iter != min_y.end(); ++iter) + rows.push_back((DWORD) *iter); + + for (auto iter = weight_x.begin(); iter != weight_x.end(); ++iter) + col_weights.push_back(*iter); + + for (auto iter = weight_y.begin(); iter != weight_y.end(); ++iter) + row_weights.push_back(*iter); + } +} + +void +Layout::SetConstraints(int ncols, +int nrows, +const int* min_x, +const int* min_y, +const float* weight_x, +const float* weight_y) +{ + Clear(); + + if (nrows > 0 && ncols > 0) { + int i = 0; + + for (i = 0; i < ncols; i++) { + cols.push_back(min_x[i]); + col_weights.push_back(weight_x[i]); + } + + for (i = 0; i < nrows; i++) { + rows.push_back(min_y[i]); + row_weights.push_back(weight_y[i]); + } + } +} |