ui/qt/container.cpp

Wed, 07 Jan 2015 20:11:36 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 07 Jan 2015 20:11:36 +0100
changeset 67
f72c4f01bf4a
parent 66
8d490d97aab8
child 68
bd9fb6476b80
permissions
-rw-r--r--

added grid container (Qt)

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 2014 Olaf Wintermann. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *   1. Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *
 *   2. 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.
 *
 * 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.
 */

#include <stdio.h>
#include "container.h"

#include <QSpacerItem>

/* -------------------- UiBoxContainer -------------------- */

UiBoxContainer::UiBoxContainer(QBoxLayout* box) {
    this->box = box;
    box->setContentsMargins(QMargins(0,0,0,0));
    box->setSpacing(0);
    
    ui_reset_layout(layout);
}

void UiBoxContainer::add(QWidget* widget, bool fill) {
    if(layout.fill != UI_LAYOUT_UNDEFINED) {
        fill = ui_lb2bool(layout.fill);
    }
    
    if(hasStretchedWidget && fill) {
        fill = false;
        fprintf(stderr, "UiError: container has 2 filled widgets");
    }
    
    box->addWidget(widget, fill);
    
    if(!hasStretchedWidget) {
        QSpacerItem *newspace = new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
        box->removeItem(space);
        box->addSpacerItem(newspace);
        space = newspace; 
    }
    
    if(fill) {
        hasStretchedWidget = true;
    }
    ui_reset_layout(layout);
}

UIWIDGET ui_box(UiObject *obj, QBoxLayout::Direction dir) {
    UiContainer *ct = uic_get_current_container(obj);
    QWidget *widget = new QWidget();
    QBoxLayout *box = new QBoxLayout(dir);
    widget->setLayout(box);
    ct->add(widget, true);
    
    UiObject *newobj = uic_object_new(obj, widget);
    newobj->container = new UiBoxContainer(box);
    uic_obj_add(obj, newobj);
    
    return widget;
}

UIWIDGET ui_vbox(UiObject *obj) {
    return ui_box(obj, QBoxLayout::TopToBottom);
}

UIWIDGET ui_hbox(UiObject *obj) {
    return ui_box(obj, QBoxLayout::LeftToRight);
}



/* -------------------- UiGridContainer -------------------- */

UiGridContainer::UiGridContainer(QGridLayout* grid) {
    this->grid = grid;
    grid->setContentsMargins(QMargins(0,0,0,0));
    grid->setSpacing(0);
    ui_reset_layout(layout);
}

void UiGridContainer::add(QWidget* widget, bool fill) {
    if(layout.newline) {
        QSpacerItem *s = new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
        grid->addItem(s, y, x);
        x = 0;
        y++;
    }
    if(x == 0) {
        if(space) {
            grid->removeItem(space);
        }
        QSpacerItem *s = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
        grid->addItem(s, y+1, 0);
        space = s;
    }
    
    grid->addWidget(widget, y, x);
    x++;
    
    ui_reset_layout(layout);
}

UIWIDGET ui_grid(UiObject *obj) {
    UiContainer *ct = uic_get_current_container(obj);
    QWidget *widget = new QWidget();
    QGridLayout *grid = new QGridLayout();
    widget->setLayout(grid);
    ct->add(widget, true);
    
    UiObject *newobj = uic_object_new(obj, widget);
    newobj->container = new UiGridContainer(grid);
    uic_obj_add(obj, newobj);
    
    return widget;
}


/* -------------------- layout functions -------------------- */

void ui_layout_fill(UiObject *obj, UiBool fill) {
    UiContainer *ct = uic_get_current_container(obj);
    ct->layout.fill = ui_bool2lb(fill);
}

void ui_newline(UiObject *obj) {
    UiContainer *ct = uic_get_current_container(obj);
    ct->layout.newline = TRUE;
}

mercurial