📄 cwidget.cpp
字号:
/*************************************************************************** CWidget.cpp The Control 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 __CWIDGET_CPP#include "gambas.h"#include <stdio.h>#include "CWidget.h"#include "CFont.h"#include "CMouse.h"#include "CKey.h"#include "CWindow.h"#include "CConst.h"#include "CClipboard.h"#include <qnamespace.h>#include <qapplication.h>#if QT_VERSION >= 0x030200#include <qobjectlist.h>#else#include <qobjcoll.h>#endif#include <qpalette.h>#include <qtooltip.h>#include <qpushbutton.h>#include <qscrollview.h>CWIDGET *CWIDGET_destroy_list = 0;CWIDGET *CWIDGET_destroy_last = 0;static void *CLASS_Container = 0;/* Control class */void CWIDGET_new(QWidget *w, void *object, char *klass /* = NULL */, bool no_filter /* = false */, bool no_tag /* = false */){ if (!CLASS_Container) CLASS_Container = GB.FindClass("Container"); CWidget::add(w, object, no_filter); //qDebug("CWIDGET_new: %p: %p", object, w); ((CWIDGET *)object)->widget = w; ((CWIDGET *)object)->level = MAIN_loop_level; ((CWIDGET *)object)->next = 0; if (!no_tag) ((CWIDGET *)object)->tag.type = GB_T_NULL; if (GB.Is(object, CLASS_Container)) CWIDGET_set_flag(object, WF_NO_EVENT);}int CWIDGET_check(void *object){ return QWIDGET(object) == NULL;}QString CWIDGET_Utf8ToQString(GB_STRING *str){ return QString::fromUtf8((const char *)(str->value.addr + str->value.start), str->value.len);}void CWIDGET_destroy(CWIDGET *object){ if (!object->widget) return; if (CWIDGET_test_flag(object, WF_DELETED)) return; //qDebug("CWIDGET_destroy: %p (%p) :%p:%ld", object, object->widget, object->ob.klass, object->ob.ref); if (!CWIDGET_destroy_list) CWIDGET_destroy_list = object; else { CWIDGET_destroy_last->next = object; object->prev = CWIDGET_destroy_last; } CWIDGET_destroy_last = object; CWIDGET_set_flag(object, WF_DELETED); //GB.Ref(object);}//#if QT_VERSION >= 0x030005// #define COORD(_c) (WIDGET->pos()._c())//#else#define COORD(_c) ((WIDGET->isTopLevel()) ? ((CWINDOW *)_object)->_c : WIDGET->pos()._c())//#define WIDGET_POS(_c) ((WIDGET->isTopLevel()) ? ((CWINDOW *)_object)->_c : WIDGET->pos()._c())#define WIDGET_SIZE(_c) ((WIDGET->isTopLevel()) ? ((CWINDOW *)_object)->_c : WIDGET->pos()._c())//#endifstatic QWidget *get_widget(void *_object){ QWidget *w = THIS->widget; //if (w->isVisible() && CWIDGET_test_flag(THIS, WF_PARENT_GEOMETRY)) // w = w->parentWidget(); return w;}static void move_widget(void *_object, int x, int y){ QWidget *wid = get_widget(THIS); wid->move(x, y); if (WIDGET->isA("MyMainWindow")) { ((CWINDOW *)_object)->x = x; ((CWINDOW *)_object)->y = y; }}static void resize_widget(void *_object, int w, int h){ QWidget *wid = get_widget(THIS); if (w < 0 && h < 0) return; if (w < 0) w = wid->width(); if (h < 0) h = wid->height(); wid->resize(QMAX(0, w), QMAX(0, h)); if (WIDGET->isA("MyMainWindow")) { //qDebug("resize_widget: %d %d", w, h); ((CWINDOW *)_object)->w = w; ((CWINDOW *)_object)->h = h; // menu bar height is ignored ((CWINDOW *)_object)->container->resize(w, h); }}static void move_resize_widget(void *_object, int x, int y, int w, int h){ QWidget *wid = get_widget(THIS); if (w < 0) w = wid->width(); if (h < 0) h = wid->height(); wid->setGeometry(x, y, QMAX(0, w), QMAX(0, h)); if (WIDGET->isA("MyMainWindow")) { ((CWINDOW *)_object)->x = x; ((CWINDOW *)_object)->y = y; ((CWINDOW *)_object)->w = w; ((CWINDOW *)_object)->h = h; ((CWINDOW *)_object)->container->resize(w, h); }}static void set_mouse(QWidget *w, int mouse, void *cursor){ QObjectList *children; QObject *child; if (mouse == CMOUSE_DEFAULT) w->unsetCursor(); else if (mouse == CMOUSE_CUSTOM) { if (cursor) w->setCursor(*((CCURSOR *)cursor)->cursor); else w->unsetCursor(); } else w->setCursor(mouse); children = (QObjectList *)(w->children()); if (!children) return; child = children->first(); while (child) { if (child->isWidgetType() && !CWidget::getReal(child)) set_mouse((QWidget *)child, CMOUSE_DEFAULT, 0); child = children->next(); }}BEGIN_PROPERTY(CWIDGET_x) if (READ_PROPERTY) GB.ReturnInteger(COORD(x)); else { move_widget(_object, VPROP(GB_INTEGER), COORD(y)); /*if (WIDGET->isTopLevel()) qDebug("X: %d ==> X = %d", PROPERTY(long), WIDGET->x());*/ }END_PROPERTYBEGIN_PROPERTY(CWIDGET_screen_x) GB.ReturnInteger(get_widget(THIS)->mapToGlobal(QPoint(0, 0)).x());END_PROPERTYBEGIN_PROPERTY(CWIDGET_y) if (READ_PROPERTY) GB.ReturnInteger(COORD(y)); else move_widget(_object, COORD(x), VPROP(GB_INTEGER));END_PROPERTYBEGIN_PROPERTY(CWIDGET_screen_y) GB.ReturnInteger(get_widget(THIS)->mapToGlobal(QPoint(0, 0)).y());END_PROPERTYBEGIN_PROPERTY(CWIDGET_w) if (READ_PROPERTY) GB.ReturnInteger(get_widget(THIS)->width()); else resize_widget(_object, VPROP(GB_INTEGER), -1);END_PROPERTYBEGIN_PROPERTY(CWIDGET_h) if (READ_PROPERTY) GB.ReturnInteger(get_widget(THIS)->height()); else resize_widget(_object, -1, VPROP(GB_INTEGER));END_PROPERTY/*BEGIN_PROPERTY(CWIDGET_name) if (READ_PROPERTY) GB.ReturnString(QWIDGET(_object)->name(), 0); else CWidget::setName(OBJECT(CWIDGET), GB.ToZeroString(PROPERTY(GB_STRING)));END_PROPERTY*/BEGIN_PROPERTY(CWIDGET_font) CFONT *font; if (READ_PROPERTY) { GB.ReturnObject(CFONT_create_control(THIS)); //else // GB.ReturnNull(); } else { font = (CFONT *)VPROP(GB_OBJECT); if (font == 0) WIDGET->unsetFont(); else WIDGET->setFont(*(font->font)); }END_PROPERTYBEGIN_PROPERTY(CWIDGET_design) if (READ_PROPERTY) { GB.ReturnBoolean(CWIDGET_test_flag(_object, WF_DESIGN)); return; } if (VPROP(GB_BOOLEAN)) { CWIDGET_set_flag(_object, WF_DESIGN); CWidget::removeFocusPolicy(WIDGET); set_mouse(WIDGET, CMOUSE_DEFAULT, 0); //CWidget::installFilter(QWIDGET(_object)); } else if (CWIDGET_test_flag(_object, WF_DESIGN)) GB.Error("Cannot reset Design property"); //else //{ // CWIDGET_clear_flag(_object, WF_DESIGN); // //CWidget::removeFilter(QWIDGET(_object)); //}END_PROPERTYBEGIN_PROPERTY(CWIDGET_visible) if (READ_PROPERTY) GB.ReturnBoolean(!QWIDGET(_object)->isHidden()); else { if (VPROP(GB_BOOLEAN)) QWIDGET(_object)->show(); else QWIDGET(_object)->hide(); }END_PROPERTYBEGIN_PROPERTY(CWIDGET_enabled) if (READ_PROPERTY) GB.ReturnBoolean(QWIDGET(_object)->isEnabled()); else QWIDGET(_object)->setEnabled(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CWIDGET_expand) if (READ_PROPERTY) GB.ReturnBoolean(CWIDGET_test_flag(THIS, WF_EXPAND)); else { QWidget *parent; if (VPROP(GB_BOOLEAN)) CWIDGET_set_flag(THIS, WF_EXPAND); else CWIDGET_clear_flag(THIS, WF_EXPAND); parent = WIDGET->parentWidget(); if (parent) parent = CWidget::get(parent)->widget; if (parent) qApp->postEvent(parent, new QEvent(EVENT_EXPAND)); }END_PROPERTYBEGIN_METHOD(CWIDGET_move, GB_INTEGER x; GB_INTEGER y; GB_INTEGER w; GB_INTEGER h) move_resize_widget(_object, VARG(x), VARG(y), VARGOPT(w, -1), VARGOPT(h, -1));END_METHODBEGIN_METHOD(CWIDGET_resize, GB_INTEGER w; GB_INTEGER h) resize_widget(_object, VARG(w), VARG(h));END_METHODBEGIN_METHOD_VOID(CWIDGET_delete) //if (WIDGET) // qDebug("CWIDGET_delete: %p (%p)", THIS, WIDGET); CWIDGET_destroy(THIS);END_METHODBEGIN_METHOD_VOID(CWIDGET_show) QWIDGET(_object)->show();END_METHODBEGIN_METHOD_VOID(CWIDGET_hide) QWIDGET(_object)->hide();END_METHODBEGIN_METHOD_VOID(CWIDGET_raise) QWIDGET(_object)->raise();END_METHODBEGIN_METHOD_VOID(CWIDGET_lower) QWIDGET(_object)->lower();END_METHODBEGIN_PROPERTY(CWIDGET_next) QWidget *parent; QObjectList *children; QObject *current = NULL; parent = WIDGET->parentWidget(); if (parent) { children = (QObjectList *)WIDGET->parentWidget()->children(); if (children) { children->first(); for(;;) { current = children->current(); if (!current) break; children->next(); if (current == WIDGET) { current = children->current(); break; } } } } if (current) GB.ReturnObject(CWidget::get(current)); else GB.ReturnNull();END_PROPERTYBEGIN_PROPERTY(CWIDGET_previous) QWidget *parent; QObjectList *children; QObject *current = NULL; parent = WIDGET->parentWidget(); if (parent) { children = (QObjectList *)WIDGET->parentWidget()->children(); if (children) { children->first(); for(;;) { current = children->current(); if (!current) break; children->next(); if (children->current() == WIDGET) break; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -