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

📄 ctabstrip.cpp

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 CPP
字号:
/***************************************************************************  CTabStrip.cpp  The TabStrip 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 __CTABSTRIP_CPP#include <qapplication.h>#include <qframe.h>#include <qtabwidget.h>#include "gambas.h"#include "CPicture.h"#include "CConst.h"#include "CTabStrip.h"DECLARE_EVENT(EVENT_Click);/***************************************************************************  TabStrip***************************************************************************/static void set_tab_count(void *_object, long new_count){  long count = THIS->stack->count();  QFrame *page;  long i;  long index;  QString label;  CPICTURE *pict;  if (new_count < 1 || new_count > 32)  {    GB.Error(GB_ERR_ARG);    return;  }  if (new_count == count)    return;  if (new_count > count)  {    THIS->stack->resize(new_count);    THIS->icon->resize(new_count);    for (i = count; i < new_count; i++)    {      page = new MyContainer(WIDGET);      CWidget::installFilter(page);      label.sprintf("Tab %ld", i);      WIDGET->insertTab(page, label);      THIS->stack->insert(i, page);      THIS->icon->insert(i, 0);    }    index = new_count - 1;  }  else  {    index = WIDGET->currentPageIndex();    //same = (id == PARAM(index));    for (i = new_count; i < count; i++)    {      if (THIS->stack->at(i)->children() != NULL)      {        GB.Error("Tab is not empty");        return;      }    }    for (i = new_count; i < count; i++)    {      if (i == index)        index = 0;      page = THIS->stack->at(i);      pict = THIS->icon->at(i);            WIDGET->removePage(page);      GB.Unref((void **)&pict);            delete page;    }    THIS->stack->resize(new_count);    THIS->icon->resize(new_count);  }  THIS->container = THIS->stack->at(index);  WIDGET->showPage(THIS->container);}BEGIN_METHOD(CTABSTRIP_new, GB_OBJECT parent)  QTabWidget *wid = new QTabWidget(CONTAINER(VARG(parent))); //, 0, Qt::WNoMousePropagation);  CWIDGET_new(wid, (void *)_object, "TabStrip");  THIS->container = NULL;  THIS->index = -1;  THIS->stack = new QVector<QFrame>;  THIS->icon = new QVector<CPICTURE>;  QObject::connect(wid, SIGNAL(currentChanged(QWidget *)), &CTabStrip::manager, SLOT(currentChanged(QWidget *)));  wid->show();  set_tab_count(THIS, 1);END_METHODBEGIN_METHOD_VOID(CTABSTRIP_free)  uint i;  CPICTURE *pict;  for (i = 0; i < THIS->icon->count(); i++)  {    pict = THIS->icon->at(i);    GB.Unref((void **)&pict);  }    delete OBJECT(CTABSTRIP)->stack;  delete OBJECT(CTABSTRIP)->icon;  //CALL_METHOD_VOID(CWIDGET_delete);END_METHODBEGIN_PROPERTY(CTABSTRIP_tabs)  if (READ_PROPERTY)    GB.ReturnInteger(THIS->stack->count());  else    set_tab_count(THIS, VPROP(GB_INTEGER));END_PROPERTYstatic bool check_index(CTABSTRIP *_object, long index){  if (index < 0 || index >= (long)THIS->stack->count())  {    GB.Error("Bad index");    return true;  }  else    return false;}BEGIN_PROPERTY(CTABSTRIP_index)  if (READ_PROPERTY)    GB.ReturnInteger(WIDGET->currentPageIndex());  else  {    long index = VPROP(GB_INTEGER);    if (check_index(THIS, index))      return;    if (index == WIDGET->currentPageIndex())      return;    WIDGET->showPage(THIS->stack->at(index));  }END_PROPERTYBEGIN_PROPERTY(CTABSTRIP_current)  THIS->index = WIDGET->currentPageIndex();  RETURN_SELF();END_PROPERTYBEGIN_METHOD(CTABSTRIP_get, GB_INTEGER index)  long index = VARG(index);  if (check_index(THIS, index))    return;  THIS->index = index;  RETURN_SELF();END_METHODBEGIN_PROPERTY(CTABSTRIP_orientation)  if (READ_PROPERTY)    GB.ReturnInteger(WIDGET->tabPosition());  else    WIDGET->setTabPosition((QTabWidget::TabPosition)VPROP(GB_INTEGER));END_PROPERTY/***************************************************************************  .Tab***************************************************************************/static QFrame *get_page(CTABSTRIP *_object){  int index = THIS->index;  if (index < 0)    return (QFrame *)WIDGET->currentPage();  THIS->index = (-1);  return THIS->stack->at(index);}BEGIN_PROPERTY(CTAB_text)  QFrame *page = get_page(THIS);  if (READ_PROPERTY)    GB.ReturnNewZeroString(TO_UTF8(WIDGET->tabLabel(page)));  else    WIDGET->changeTab(page, QSTRING_PROP());END_PROPERTYBEGIN_PROPERTY(CTAB_picture)  int index;  QFrame *page;  index = THIS->index;  if (index < 0)    index = WIDGET->currentPageIndex();    page = get_page(THIS);  if (READ_PROPERTY)    GB.ReturnObject(THIS->icon->at(index));  else  {    CPICTURE *pict;        pict = THIS->icon->at(index);    GB.Unref((void **)&pict);    pict = (CPICTURE *)VPROP(GB_OBJECT);    THIS->icon->insert(index, pict);    GB.Ref(pict);        if (pict)      WIDGET->setTabIconSet(page, QIconSet(*(pict->pixmap), QIconSet::Small));    else      WIDGET->setTabIconSet(page, QIconSet());  }END_PROPERTYBEGIN_PROPERTY(CTAB_enabled)  QFrame *page = get_page(THIS);  if (READ_PROPERTY)    GB.ReturnBoolean(WIDGET->isTabEnabled(page));  else    WIDGET->setTabEnabled(page, VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_METHOD_VOID(CTAB_next)  CTABSTRIP_ENUM *iter;  QFrame *page;  QObjectList *list;  unsigned int child;  CWIDGET *widget;    iter = (CTABSTRIP_ENUM *)GB.GetEnum();  if (!iter->init)  {    iter->child = 0;    iter->index = THIS->index;    iter->init = true;  }    //qDebug("CTAB_next: iter = (%d, %d, %d)", iter->init, iter->index, iter->child);    page = THIS->stack->at(iter->index);  list = (QObjectList *)page->children();  for(;;)  {    child = iter->child;    if (list == NULL || child >= list->count())    {      GB.StopEnum();      return;    }    iter->child = child + 1;    widget = CWidget::getReal(list->at(child));    if (widget)    {      GB.ReturnObject(widget);      return;    }  }END_METHODBEGIN_PROPERTY(CTAB_count)  QFrame *page = THIS->stack->at(THIS->index);  if (page->children() == NULL)    GB.ReturnInteger(0);  else    GB.ReturnInteger(page->children()->count());END_PROPERTYBEGIN_PROPERTY(CTABSTRIP_enabled)  uint i;  if (READ_PROPERTY)    GB.ReturnBoolean(WIDGET->isEnabled());  else  {    WIDGET->setEnabled(VPROP(GB_BOOLEAN));    for (i = 0; i < THIS->stack->count(); i++)      WIDGET->setTabEnabled(THIS->stack->at(i), VPROP(GB_BOOLEAN));  }END_PROPERTYBEGIN_PROPERTY(CTABSTRIP_text)  THIS->index = -1;  CTAB_text(_object, _param);  /*if (READ_PROPERTY)    GB.ReturnNewZeroString(TO_UTF8(WIDGET->tabLabel(WIDGET->currentPage())));  else    WIDGET->changeTab(WIDGET->currentPage(), QSTRING_PROP());*/END_PROPERTYBEGIN_PROPERTY(CTABSTRIP_picture)  THIS->index = -1;  CTAB_picture(_object, _param);  /*if (READ_PROPERTY)    GB.ReturnNewZeroString(TO_UTF8(WIDGET->tabLabel(WIDGET->currentPage())));  else    WIDGET->changeTab(WIDGET->currentPage(), QSTRING_PROP());*/END_PROPERTYBEGIN_PROPERTY(CTABSTRIP_client_width)  if (!THIS->geom)  {    qApp->sendEvent(WIDGET, new QShowEvent());    THIS->geom = WIDGET->isVisible();  }      GB.ReturnInteger(THIS->container->width());END_PROPERTYBEGIN_PROPERTY(CTABSTRIP_client_height)  if (!THIS->geom)  {    qApp->sendEvent(WIDGET, new QShowEvent());    THIS->geom = WIDGET->isVisible();  }      GB.ReturnInteger(THIS->container->height());END_PROPERTY/***************************************************************************  Descriptions***************************************************************************/GB_DESC CTabChildrenDesc[] ={  GB_DECLARE(".TabChildren", 0), GB_VIRTUAL_CLASS(),  GB_METHOD("_next", "Control", CTAB_next, NULL),  GB_PROPERTY_READ("Count", "i", CTAB_count),  GB_END_DECLARE};GB_DESC CTabDesc[] ={  GB_DECLARE(".Tab", 0), GB_VIRTUAL_CLASS(),  GB_PROPERTY("Text", "s", CTAB_text),  GB_PROPERTY("Picture", "Picture", CTAB_picture),  GB_PROPERTY("Caption", "s", CTAB_text),  GB_PROPERTY("Enabled", "b", CTAB_enabled),  GB_PROPERTY_SELF("Children", ".TabChildren"),  //GB_PROPERTY_WRITE("Picture", "s", CTABSTRIP_picture),  GB_END_DECLARE};GB_DESC CTabStripDesc[] ={  GB_DECLARE("TabStrip", sizeof(CTABSTRIP)), GB_INHERITS("Container"),  GB_CONSTANT("Top", "i", QTabWidget::Top),  GB_CONSTANT("Bottom", "i", QTabWidget::Bottom),  GB_METHOD("_new", NULL, CTABSTRIP_new, "(Parent)Container;"),  GB_METHOD("_free", NULL, CTABSTRIP_free, NULL),  GB_PROPERTY("Count", "i", CTABSTRIP_tabs),  GB_PROPERTY("Text", "s", CTABSTRIP_text),  GB_PROPERTY("Picture", "Picture", CTABSTRIP_picture),  GB_PROPERTY("Caption", "s", CTABSTRIP_text),  GB_PROPERTY_READ("Current", ".Tab", CTABSTRIP_current),  GB_PROPERTY("Index", "i", CTABSTRIP_index),  GB_PROPERTY("Orientation", "i<TabStrip>", CTABSTRIP_orientation),  GB_PROPERTY("Enabled", "b", CTABSTRIP_enabled),  GB_PROPERTY_READ("ClientW", "i", CTABSTRIP_client_width),  GB_PROPERTY_READ("ClientWidth", "i", CTABSTRIP_client_width),  GB_PROPERTY_READ("ClientH", "i", CTABSTRIP_client_height),  GB_PROPERTY_READ("ClientHeight", "i", CTABSTRIP_client_height),    GB_PROPERTY("Arrangement", "i<Arrange>", CCONTAINER_arrangement),  GB_PROPERTY("AutoResize", "b", CCONTAINER_auto_resize),  GB_PROPERTY("Padding", "i", CCONTAINER_padding),  GB_PROPERTY("Spacing", "i", CCONTAINER_spacing),  GB_METHOD("_get", ".Tab", CTABSTRIP_get, "(Index)i"),  GB_CONSTANT("_Properties", "s", CTABSTRIP_PROPERTIES),  GB_CONSTANT("_DefaultEvent", "s", "Click"),  GB_CONSTANT("_Arrangement", "i", ARRANGE_FILL),  GB_EVENT("Click", NULL, NULL, &EVENT_Click),  GB_END_DECLARE};/***************************************************************************  Class CTabStrip***************************************************************************/CTabStrip CTabStrip::manager;void CTabStrip::currentChanged(QWidget *wid){  GET_SENDER(ob);  ((CTABSTRIP *)ob)->container = wid;    CCONTAINER_arrange((QFrame *)wid);  if (wid->isVisible())    RAISE_EVENT(EVENT_Click);}

⌨️ 快捷键说明

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