📄 cbutton.cpp
字号:
/*************************************************************************** CButton.cpp The Button and ToggleButton 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 __CBUTTON_CPP#include <qapplication.h>#include <qevent.h>#include <qframe.h>#include <qpushbutton.h>#include <qtoolbutton.h>#include <qsizepolicy.h>#include <qiconset.h>#include <qlayout.h>#include "gambas.h"#include "CWidget.h"#include "CPicture.h"#include "CWindow.h"#include "CButton.h"/*#define DEBUG_CBUTTON*/DECLARE_EVENT(EVENT_Click);DECLARE_EVENT(EVENT_ClickToggle);DECLARE_EVENT(EVENT_ClickTool);BEGIN_METHOD(CBUTTON_new, GB_OBJECT parent) MyPushButton *wid = new MyPushButton(CONTAINER(VARG(parent))); QObject::connect(wid, SIGNAL(clicked()), &CButton::manager, SLOT(clicked())); CWIDGET_new(wid, (void *)_object, "Button"); OBJECT(CBUTTON)->picture = NULL; //wid->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); wid->setAutoDefault(false); wid->show();END_METHODBEGIN_METHOD(CTOGGLEBUTTON_new, GB_OBJECT parent) QPushButton *wid = new MyPushButton(CONTAINER(VARG(parent))); QObject::connect(wid, SIGNAL(toggled(bool)), &CButton::manager, SLOT(clickedToggle())); CWIDGET_new(wid, (void *)_object, "ToggleButton"); OBJECT(CBUTTON)->picture = NULL; //wid->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); wid->setAutoDefault(false); wid->setToggleButton(TRUE); wid->show();END_METHODBEGIN_METHOD(CTOOLBUTTON_new, GB_OBJECT parent) QToolButton *wid = new QToolButton(CONTAINER(VARG(parent))); QObject::connect(wid, SIGNAL(clicked()), &CButton::manager, SLOT(clickedTool())); CWIDGET_new(wid, (void *)_object); //wid->setToggleButton(TRUE); wid->setTextPosition(QToolButton::Right); wid->setAutoRaise(true); wid->show();END_METHOD/*BEGIN_METHOD(CTOOLBUTTON_new, void *parent) QToolButton *wid = new QToolButton(CONTAINER(PARAM(parent))); QObject::connect(wid, SIGNAL(clicked()), &CButton::manager, SLOT(clickedTool())); CWIDGET_new(wid, (void *)_object, "ToolButton"); OBJECT(CBUTTON)->picture = NULL; wid->show();END_METHOD*/BEGIN_METHOD_VOID(CBUTTON_free) CLEAR_PICTURE(&(OBJECT(CBUTTON)->picture)); //CALL_METHOD_VOID(CWIDGET_delete);END_METHODstatic void set_button(CBUTTON *_object, const char *text){ QPixmap p; QString qtext; if (text == NULL) qtext = WIDGET->text(); else qtext = TO_QSTRING(text); if (THIS->picture) { p = *(THIS->picture->pixmap); WIDGET->setText(qtext); if (qtext.length()) { WIDGET->setIconSet(QIconSet(p, QIconSet::Small)); } else { WIDGET->setPixmap(p); if (WIDGET->iconSet()) WIDGET->setIconSet(QIconSet()); } } else { if (WIDGET->pixmap()) WIDGET->setPixmap(QPixmap()); if (WIDGET->iconSet()) WIDGET->setIconSet(QIconSet()); WIDGET->setText(qtext); } WIDGET->calcMinimumHeight();}static void set_tool_button(CBUTTON *_object, const char *text){ QPixmap p; QString qtext; if (text == NULL) qtext = WIDGET_TOOL->textLabel(); else qtext = TO_QSTRING(text); if (THIS->picture) { p = *(THIS->picture->pixmap); WIDGET_TOOL->setTextLabel(qtext); WIDGET_TOOL->setIconSet(QIconSet(p, QIconSet::Small)); WIDGET_TOOL->setUsesTextLabel(qtext.length() > 0); } else { WIDGET_TOOL->setIconSet(QIconSet()); WIDGET_TOOL->setTextLabel(qtext); WIDGET_TOOL->setUsesTextLabel(qtext.length() > 0); } CWidget::resetTooltip((CWIDGET *)_object);}BEGIN_PROPERTY(CBUTTON_text) if (READ_PROPERTY) GB.ReturnNewZeroString(TO_UTF8(WIDGET->text())); else set_button(THIS, GB.ToZeroString(PROP(GB_STRING)));END_PROPERTYBEGIN_PROPERTY(CBUTTON_picture) if (READ_PROPERTY) GB.ReturnObject(THIS->picture); else { GB.StoreObject(PROP(GB_OBJECT), (void **)&(THIS->picture)); set_button(THIS, NULL); }END_PROPERTYBEGIN_PROPERTY(CTOOLBUTTON_text) if (READ_PROPERTY) GB.ReturnNewZeroString(TO_UTF8(WIDGET->text())); else set_tool_button(THIS, GB.ToZeroString(PROP(GB_STRING)));END_PROPERTYBEGIN_PROPERTY(CTOOLBUTTON_picture) if (READ_PROPERTY) GB.ReturnObject(THIS->picture); else { GB.StoreObject(PROP(GB_OBJECT), (void **)&(THIS->picture)); set_tool_button(THIS, NULL); }END_PROPERTY/*BEGIN_PROPERTY(CTOOLBUTTON_picture) QToolButton *wid = QTOOLBUTTON(_object); char **pict = (char **)&(OBJECT(CBUTTON)->picture); if (READ_PROPERTY) GB.ReturnString(*pict, 0); else wid->setIconSet(QIconSet(*PIXMAP_set_widget(PROPERTY(GB_STRING), pict), QIconSet::Small));END_PROPERTY*/BEGIN_PROPERTY(CBUTTON_value) if (READ_PROPERTY) GB.ReturnBoolean(0); else if (VPROP(GB_BOOLEAN)) WIDGET->animateClick();END_PROPERTYBEGIN_PROPERTY(CTOGGLEBUTTON_value) if (READ_PROPERTY) GB.ReturnBoolean(WIDGET->isOn()); else WIDGET->setOn(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTOOLBUTTON_value) if (READ_PROPERTY) GB.ReturnBoolean(WIDGET_TOOL->isOn()); else { WIDGET_TOOL->setOn(VPROP(GB_BOOLEAN)); qApp->postEvent(WIDGET_TOOL, new QEvent(QEvent::Leave)); }END_PROPERTYBEGIN_PROPERTY(CBUTTON_flat) if (READ_PROPERTY) GB.ReturnBoolean(WIDGET->isFlat()); else WIDGET->setFlat(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CBUTTON_border) if (READ_PROPERTY) GB.ReturnBoolean(!WIDGET->isFlat()); else WIDGET->setFlat(!VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTOOLBUTTON_border) if (READ_PROPERTY) GB.ReturnBoolean(!WIDGET_TOOL->autoRaise()); else WIDGET_TOOL->setAutoRaise(!VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CTOOLBUTTON_toggle) if (READ_PROPERTY) GB.ReturnBoolean(WIDGET_TOOL->isToggleButton()); else WIDGET_TOOL->setToggleButton(VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CBUTTON_default) MyMainWindow *top = (MyMainWindow *)WIDGET->topLevelWidget(); if (READ_PROPERTY) GB.ReturnBoolean(top->defaultButton() == WIDGET); else top->setDefaultButton(WIDGET, VPROP(GB_BOOLEAN));END_PROPERTYBEGIN_PROPERTY(CBUTTON_cancel) MyMainWindow *top = (MyMainWindow *)WIDGET->topLevelWidget(); if (READ_PROPERTY) GB.ReturnBoolean(top->cancelButton() == WIDGET); else top->setCancelButton(WIDGET, VPROP(GB_BOOLEAN));END_PROPERTYGB_DESC CButtonDesc[] ={ GB_DECLARE("Button", sizeof(CBUTTON)), GB_INHERITS("Control"), GB_METHOD("_new", NULL, CBUTTON_new, "(Parent)Container;"), GB_METHOD("_free", NULL, CBUTTON_free, NULL), GB_PROPERTY("Text", "s", CBUTTON_text), GB_PROPERTY("Caption", "s", CBUTTON_text), GB_PROPERTY("Picture", "Picture", CBUTTON_picture), //GB_PROPERTY("Flat", "b", CBUTTON_flat), GB_PROPERTY("Border", "b", CBUTTON_border), GB_PROPERTY("Default", "b", CBUTTON_default), GB_PROPERTY("Cancel", "b", CBUTTON_cancel), GB_PROPERTY("Value", "b", CBUTTON_value), GB_CONSTANT("_Properties", "s", CBUTTON_PROPERTIES), GB_CONSTANT("_DefaultEvent", "s", "Click"), GB_EVENT("Click", NULL, NULL, &EVENT_Click), GB_END_DECLARE};GB_DESC CToggleButtonDesc[] ={ GB_DECLARE("ToggleButton", sizeof(CBUTTON)), GB_INHERITS("Control"), GB_METHOD("_new", NULL, CTOGGLEBUTTON_new, "(Parent)Container;"), GB_METHOD("_free", NULL, CBUTTON_free, NULL), GB_PROPERTY("Text", "s", CBUTTON_text), GB_PROPERTY("Caption", "s", CBUTTON_text), GB_PROPERTY("Picture", "Picture", CBUTTON_picture), GB_PROPERTY("Value", "b", CTOGGLEBUTTON_value), //GB_PROPERTY("Flat", "b", CBUTTON_flat), GB_PROPERTY("Border", "b", CBUTTON_border), GB_CONSTANT("_Properties", "s", CTOGGLEBUTTON_PROPERTIES), GB_CONSTANT("_DefaultEvent", "s", "Click"), GB_EVENT("Click", NULL, NULL, &EVENT_ClickToggle), GB_END_DECLARE};GB_DESC CToolButtonDesc[] ={ GB_DECLARE("ToolButton", sizeof(CBUTTON)), GB_INHERITS("Control"), GB_METHOD("_new", NULL, CTOOLBUTTON_new, "(Parent)Container;"), GB_METHOD("_free", NULL, CBUTTON_free, NULL), GB_PROPERTY("Text", "s", CTOOLBUTTON_text), GB_PROPERTY("Caption", "s", CTOOLBUTTON_text), GB_PROPERTY("Picture", "Picture", CTOOLBUTTON_picture), GB_PROPERTY("Value", "b", CTOOLBUTTON_value), GB_PROPERTY("Toggle", "b", CTOOLBUTTON_toggle), GB_PROPERTY("Border", "b", CTOOLBUTTON_border), GB_CONSTANT("_Properties", "s", CTOOLBUTTON_PROPERTIES), GB_CONSTANT("_DefaultEvent", "s", "Click"), GB_EVENT("Click", NULL, NULL, &EVENT_ClickTool), GB_END_DECLARE};/*************************************************************************** class MyPushButton***************************************************************************/MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent){ //if (layout()) // layout()->setResizeMode(QLayout::FreeResize); calcMinimumHeight();}MyPushButton::~MyPushButton(){ MyMainWindow *top = (MyMainWindow *)(this->topLevelWidget()); top->setDefaultButton(this, false); top->setCancelButton(this, false);}/*QSize MyPushButton::sizeHint(void) const{ return QSize(width(), height());}*/void MyPushButton::fontChange(const QFont &font){ QWidget::fontChange(font); calcMinimumHeight();}void MyPushButton::calcMinimumHeight(){ if (text().length()) { QFontMetrics fm = fontMetrics(); setMinimumHeight(fm.lineSpacing() + 4); } else setMinimumHeight(0);}/* Class CButton */CButton CButton::manager;void CButton::clicked(void){ RAISE_EVENT(EVENT_Click);}void CButton::clickedToggle(void){ RAISE_EVENT(EVENT_ClickToggle);}void CButton::clickedTool(void){ RAISE_EVENT(EVENT_ClickTool);}/*GB_DESC CToolButtonDesc[] ={ GB_DECLARE("ToolButton", sizeof(CBUTTON)), GB_INHERITS("Control"), GB_METHOD("_new", NULL, CTOOLBUTTON_new, "Container;"), GB_METHOD("_free", NULL, CBUTTON_delete, NULL), GB_PROPERTY("Text", "s", CBUTTON_text), GB_PROPERTY("Caption", "s", CBUTTON_text), GB_PROPERTY("Picture", "s", CTOOLBUTTON_picture), GB_PROPERTY("Value", "b", CBUTTON_value), GB_PROPERTY("Flat", "b", CBUTTON_flat), GB_EVENT("Click", NULL, NULL, &EVENT_ClickTool), GB_END_DECLARE};*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -