Wed, 19 Aug 2015 12:28:22 +0200
improved motif tab look
/* * 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> #include <QStackedWidget> /* -------------------- UiBoxContainer -------------------- */ UiBoxContainer::UiBoxContainer(QBoxLayout* box) { this->current = NULL; this->menu = NULL; 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); current = widget; } 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->current = NULL; this->menu = NULL; 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); current = widget; } /* -------------------- UiTabViewContainer -------------------- */ UiTabViewContainer::UiTabViewContainer(QTabWidget* tabwidget) { this->current = NULL; this->menu = NULL; this->tabwidget = tabwidget; } void UiTabViewContainer::add(QWidget* widget, bool fill) { QString str = QString::fromUtf8(layout.label); tabwidget->addTab(widget, str); } UiStackContainer::UiStackContainer(QStackedWidget *stack) { this->stack = stack; } void UiStackContainer::add(QWidget* widget, bool fill) { stack->addWidget(widget); current = widget; } UIWIDGET ui_tabview(UiObject *obj) { QStackedWidget *tabwidget = new QStackedWidget(); UiContainer *ct = uic_get_current_container(obj); ct->add(tabwidget, true); UiObject *tabviewobj = uic_object_new(obj, tabwidget); tabviewobj->container = new UiStackContainer(tabwidget); uic_obj_add(obj, tabviewobj); return tabwidget; } void ui_tab(UiObject *obj, char *title) { UiContainer *ct = uic_get_current_container(obj); ct->layout.label = title; ui_vbox(obj); } void ui_select_tab(UIWIDGET tabview, int tab) { QStackedWidget *w = (QStackedWidget*)tabview; w->setCurrentIndex(tab); } 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; }