⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccontainer.cpp

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 CPP
字号:
/***************************************************************************  CContainer.cpp  The Container class  (c) 2000-2003 Beno� Minisini <gambas@users.sourceforge.net>  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 1, 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.***************************************************************************/#define __CCONTAINER_CPP#include <qnamespace.h>#include <qapplication.h>#include <qmainwindow.h>#include <qlayout.h>#include <qevent.h>#include "gambas.h"#include "CWidget.h"#include "CWindow.h"#include "CConst.h"#include "CContainer.h"/*#define DEBUG*/static QWidget *get_widget(QObjectList *list){  for(;;)  {    QObject *ob = list->current();    if (!ob)      return NULL;    list->next();    if (ob->isWidgetType())    {      if (((QWidget *)ob)->isVisible() && !((QWidget *)ob)->isA("QSizeGrip"))        return (QWidget *)ob;    }  }}void CCONTAINER_arrange(QFrame *cont){  QWidget *wid;  int x, y, w, h, i;  int xc, yc, wc, hc;  int sexp, nexp;  bool swap, autoresize;  CCONTAINER_ARRANGEMENT *arr;  void *ob;  bool redo;  bool first;  //if (lock)  //  return;  ob = CWidget::get(cont);  if (CWIDGET_test_flag(ob, WF_DESIGN))    return;  arr = (CCONTAINER_ARRANGEMENT *)ob;  if (arr->locked)    return;  if (arr->mode == ARRANGE_NONE)    return;  QObjectList *list = (QObjectList *)cont->children();  if (!list || list->count() == 0)    return;  arr->locked = true;  swap = (arr->mode & 1) == 0;  autoresize = arr->autoresize && !CWIDGET_test_flag(ob, WF_EXPAND);  for (i = 0; i < 3; i++)  {    redo = false;    xc = cont->contentsRect().x() + arr->padding;    yc = cont->contentsRect().y() + arr->padding;    wc = cont->contentsRect().width() - arr->padding * 2;    hc = cont->contentsRect().height() - arr->padding * 2;    if (wc <= 0 || hc <= 0)      break;    x = xc;    y = yc;    w = h = 0;    wid = 0;    list->first();    switch (arr->mode)    {      case ARRANGE_HORIZONTAL:      case ARRANGE_VERTICAL:        sexp = 0;        nexp = 0;        for(;;)        {          wid = get_widget(list);          if (!wid)            break;          ob = CWidget::get(wid);          if (ob && CWIDGET_test_flag(ob, WF_EXPAND))            nexp++;          else            sexp += (swap ? wid->height() : wid->width());          sexp += arr->spacing;        }        sexp -= arr->spacing;        sexp = (swap ? hc : wc) - sexp;        list->first();        wid = 0;        for(;;)        {          first = wid == 0;          wid = get_widget(list);          if (!wid)            break;          if (!first)          {            if (swap)              y += arr->spacing;            else              x += arr->spacing;          }          ob = CWidget::get(wid);          if (swap)          {            if (CWIDGET_test_flag(ob, WF_EXPAND))            {              h = sexp / nexp;              sexp -= h;              nexp--;            }            else              h = wid->height();            if (h > 0)            {              if (wc != wid->width() || h != wid->height())                redo = true;              wid->setGeometry(x, y, wc, h);              y += h;            }          }          else          {            if (CWIDGET_test_flag(ob, WF_EXPAND))            {              w = sexp / nexp;              sexp -= w;              nexp--;            }            else              w = wid->width();            if (w > 0)            {              if (w != wid->width() || hc != wid->height())                redo = true;              wid->setGeometry(x, y, w, hc);              x += w;            }          }        }        break;      case ARRANGE_LEFT_RIGHT:      case ARRANGE_TOP_BOTTOM:        for(;;)        {          wid = get_widget(list);          if (!wid)            break;          if (swap)          {            if ((y > yc) && ((y + wid->height()) > hc))            {              y = yc;              x += w + arr->spacing;              w = 0;            }            wid->move(x, y);            y += wid->height() + arr->spacing;            if (wid->width() > w)              w = wid->width();          }          else          {            if ((x > xc) && ((x + wid->width()) > wc))            {              x = xc;              y += h + arr->spacing;              h = 0;            }            wid->move(x, y);            x += wid->width() + arr->spacing;            if (wid->height() > h)              h = wid->height();          }        }        break;      case ARRANGE_FILL:        for(;;)        {          wid = get_widget(list);          if (!wid)            break;          wid->setGeometry(xc, yc, wc, hc);        }        break;    }    if (autoresize)    {      switch(arr->mode)      {        case ARRANGE_HORIZONTAL:          cont->resize(x + cont->width() - wc - xc, cont->height());          break;        case ARRANGE_TOP_BOTTOM:          cont->resize(x + w + cont->width() - wc - xc, cont->height());          break;        case ARRANGE_VERTICAL:          //qDebug("h = %d  cont->height() = %d  hc = %d  --> %d", h, cont->height(), hc, h + cont->height() - hc);          cont->resize(cont->width(), y + cont->height() - hc - yc);          break;        case ARRANGE_LEFT_RIGHT:          cont->resize(cont->width(), y + h + cont->height() - hc - yc);          break;      }    }    if (!redo)      break;  }  arr->locked = false;}/***************************************************************************  class MyContainer***************************************************************************/MyContainer::MyContainer(QWidget *parent): QFrame(parent){}void MyContainer::frameChanged(void){  QFrame::frameChanged();  CCONTAINER_arrange(this);}void MyContainer::resizeEvent(QResizeEvent *e){  QFrame::resizeEvent(e);  CCONTAINER_arrange(this);}void MyContainer::childEvent(QChildEvent *e){  QFrame::childEvent(e);  if (!e->child()->isWidgetType())    return;  if (e->inserted())  {    e->child()->installEventFilter(this);    //qDebug("inserted");  }  else if (e->removed())  {    e->child()->removeEventFilter(this);    //qDebug("removed");  }  CCONTAINER_arrange(this);}bool MyContainer::eventFilter(QObject *o, QEvent *e){  int type = e->type();  if (type == QEvent::Move || type == QEvent::Resize || type == QEvent::Show || type == QEvent::Hide || type == EVENT_EXPAND)    CCONTAINER_arrange(this);  return QObject::eventFilter(o, e);}/***************************************************************************  CContainer***************************************************************************/BEGIN_METHOD_VOID(CCONTAINER_next)  #ifdef DEBUG  if (!THIS_CONTAINER)    qDebug("Null container");  #endif  QObjectList *list = (QObjectList *)THIS_CONTAINER->children();  unsigned int index;  CWIDGET *widget;  for(;;)  {    index = ENUM(int);    if (list == NULL || index >= list->count())    {      GB.StopEnum();      return;    }    ENUM(int) = index + 1;    widget = CWidget::getReal(list->at(index));    if (widget)    {      GB.ReturnObject(widget);      return;    }  }END_METHODBEGIN_PROPERTY(CCONTAINER_count)  QWidget *wid = THIS_CONTAINER;  QObjectList *list;  QObject *ob;  int n = 0;  if (!wid)  	goto __DONE;	list = (QObjectList *)wid->children();	if (!list || !list->count())		goto __DONE;	list->first();  for(;;)  {    ob = list->current();    if (!ob)      break;    list->next();    if (ob->isWidgetType() && CWidget::getReal(ob))    	n++;  }__DONE:  GB.ReturnInteger(n);END_PROPERTYBEGIN_PROPERTY(CCONTAINER_x)  #ifdef DEBUG  if (!THIS_CONTAINER)    qDebug("Null container");  #endif  QPoint p(0, 0);  /*if (WIDGET->layout())    WIDGET->layout()->activate();*/  GB.ReturnInteger(THIS_CONTAINER->mapTo(WIDGET, p).x());END_PROPERTYBEGIN_PROPERTY(CCONTAINER_y)  #ifdef DEBUG  if (!THIS_CONTAINER)    qDebug("Null container");  #endif  QPoint p(0, 0);  /*if (WIDGET->layout())    WIDGET->layout()->activate();*/  GB.ReturnInteger(THIS_CONTAINER->mapTo(WIDGET, p).y());END_PROPERTYBEGIN_PROPERTY(CCONTAINER_width)  #ifdef DEBUG  if (!THIS_CONTAINER)    qDebug("Null container");  #endif  GB.ReturnInteger(THIS_CONTAINER->width());END_PROPERTYBEGIN_PROPERTY(CCONTAINER_height)  #ifdef DEBUG  if (!THIS_CONTAINER)    qDebug("Null container");  #endif  GB.ReturnInteger(THIS_CONTAINER->height());END_PROPERTYBEGIN_PROPERTY(CCONTAINER_arrangement)  int arr;  if (READ_PROPERTY)    GB.ReturnInteger(THIS_ARRANGEMENT->mode);  else  {    arr = VPROP(GB_INTEGER);    if (arr < 0 || arr > 8)      return;    THIS_ARRANGEMENT->mode = arr;    CCONTAINER_arrange((QFrame *)THIS_CONTAINER);  }END_PROPERTYBEGIN_PROPERTY(CCONTAINER_auto_resize)  if (READ_PROPERTY)    GB.ReturnBoolean(THIS_ARRANGEMENT->autoresize);  else  {    THIS_ARRANGEMENT->autoresize = VPROP(GB_BOOLEAN);    CCONTAINER_arrange((QFrame *)THIS_CONTAINER);  }END_PROPERTYBEGIN_PROPERTY(CCONTAINER_padding)  if (READ_PROPERTY)    GB.ReturnInteger(THIS_ARRANGEMENT->padding);  else  {    int val = VPROP(GB_INTEGER);    if (val >= 0 && val < 32768)    {      THIS_ARRANGEMENT->padding = val;      CCONTAINER_arrange((QFrame *)THIS_CONTAINER);    }  }END_PROPERTYBEGIN_PROPERTY(CCONTAINER_spacing)  if (READ_PROPERTY)    GB.ReturnInteger(THIS_ARRANGEMENT->spacing);  else  {    int val = VPROP(GB_INTEGER);    if (val >= 0 && val < 32768)    {      THIS_ARRANGEMENT->spacing = val;      CCONTAINER_arrange((QFrame *)THIS_CONTAINER);    }  }END_PROPERTYGB_DESC CChildrenDesc[] ={  GB_DECLARE(".ContainerChildren", sizeof(CCONTAINER)), GB_VIRTUAL_CLASS(),  GB_METHOD("_next", "Control", CCONTAINER_next, NULL),  GB_PROPERTY_READ("Count", "i", CCONTAINER_count),  GB_END_DECLARE};GB_DESC CContainerDesc[] ={  GB_DECLARE("Container", sizeof(CCONTAINER)), GB_INHERITS("Control"),  GB_NOT_CREATABLE(),  GB_PROPERTY_SELF("Children", ".ContainerChildren"),  GB_PROPERTY_READ("ClientX", "i", CCONTAINER_x),  GB_PROPERTY_READ("ClientY", "i", CCONTAINER_y),  GB_PROPERTY_READ("ClientW", "i", CCONTAINER_width),  GB_PROPERTY_READ("ClientWidth", "i", CCONTAINER_width),  GB_PROPERTY_READ("ClientH", "i", CCONTAINER_height),  GB_PROPERTY_READ("ClientHeight", "i", CCONTAINER_height),  GB_END_DECLARE};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -