mirror of https://gitee.com/openkylin/kxmlgui.git
422 lines
15 KiB
C++
422 lines
15 KiB
C++
#include "kwindowtest.h"
|
|
|
|
#include <QDir>
|
|
#include <QMessageBox>
|
|
#include <QTest>
|
|
#include <QTextEdit>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <KActionMenu>
|
|
#include <KToggleAction>
|
|
#include <QAction>
|
|
#include <QActionGroup>
|
|
#include <QApplication>
|
|
#include <QComboBox>
|
|
#include <QLineEdit>
|
|
#include <kactioncollection.h>
|
|
#include <khelpmenu.h>
|
|
#include <kxmlguifactory.h>
|
|
|
|
TestWindow::TestWindow(QWidget *parent)
|
|
: KXmlGuiWindow(parent)
|
|
{
|
|
ena = false;
|
|
exitB = true; // exit button is shown
|
|
lineL = true; // LineEdit is enabled
|
|
greenF = false; // Frame not inserted
|
|
timer = nullptr;
|
|
|
|
setCaption(QStringLiteral("test window"));
|
|
|
|
// The xmlgui file defines the layout of the menus and toolbars.
|
|
// We only need to create actions with the right name here.
|
|
|
|
// First four buttons
|
|
fileNewAction = new QAction(QIcon::fromTheme(QStringLiteral("document-new")), QStringLiteral("Create.. (toggles upper button)"), this);
|
|
actionCollection()->addAction(QStringLiteral("filenew"), fileNewAction);
|
|
fileNewAction->setCheckable(true);
|
|
connect(fileNewAction, &QAction::triggered, this, &TestWindow::slotNew);
|
|
|
|
QAction *fileOpenAction = new QAction(QIcon::fromTheme(QStringLiteral("document-open")), QStringLiteral("Open"), this);
|
|
actionCollection()->addAction(QStringLiteral("fileopen"), fileOpenAction);
|
|
connect(fileOpenAction, &QAction::triggered, this, &TestWindow::slotOpen);
|
|
|
|
KActionMenu *fileFloppyAction = new KActionMenu(QIcon::fromTheme(QStringLiteral("filefloppy")), QStringLiteral("Save (beep or delayed popup)"), this);
|
|
actionCollection()->addAction(QStringLiteral("filefloppy"), fileFloppyAction);
|
|
connect(fileFloppyAction, &QAction::triggered, this, &TestWindow::slotSave);
|
|
|
|
QAction *filePrintAction = new QAction(QIcon::fromTheme(QStringLiteral("document-print")), QStringLiteral("Print (enables/disables open)"), this);
|
|
actionCollection()->addAction(QStringLiteral("fileprint"), filePrintAction);
|
|
filePrintAction->setToolTip(QStringLiteral("This tooltip does not work for menu items"));
|
|
filePrintAction->setWhatsThis(QStringLiteral("This is the longer explanation of the action"));
|
|
filePrintAction->setStatusTip(QStringLiteral("This action is supposed to print, but in fact enables/disables open"));
|
|
connect(filePrintAction, &QAction::triggered, this, &TestWindow::slotPrint);
|
|
|
|
// And a combobox
|
|
// arguments: text (or strList), ID, writable, signal, object, slot, enabled,
|
|
// tooltiptext, size
|
|
testComboBox = new QComboBox(toolBar());
|
|
// K3WidgetAction* comboAction = new K3WidgetAction(testComboBox, QString(), 0, 0, 0, actionCollection(), "combobox");
|
|
// connect(testComboBox, SIGNAL(activated(QString)), this, SLOT(slotList(QString)));
|
|
|
|
// Then one line editor
|
|
// arguments: text, id, signal, object (this), slot, enabled, tooltiptext, size
|
|
testLineEdit = new QLineEdit(toolBar());
|
|
testLineEdit->setText(QStringLiteral("ftp://ftp.kde.org/pub/kde"));
|
|
// K3WidgetAction* lineEditAction = new K3WidgetAction(testLineEdit, QString(), 0, 0, 0, actionCollection(), "location");
|
|
// connect(testLineEdit, SIGNAL(returnPressed()), this, SLOT(slotReturn()));
|
|
|
|
// Now add another button and align it right
|
|
exitAction = new QAction(QIcon::fromTheme(QStringLiteral("application-exit")), QStringLiteral("Exit"), this);
|
|
actionCollection()->addAction(QStringLiteral("exit"), exitAction);
|
|
connect(exitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
|
|
|
|
// Another toolbar
|
|
|
|
QAction *fileNewAction2 = new QAction(QIcon::fromTheme(QStringLiteral("document-new")), QStringLiteral("Create new file2 (Toggle)"), this);
|
|
actionCollection()->addAction(QStringLiteral("filenew2"), fileNewAction2);
|
|
connect(fileNewAction2, &QAction::toggled, this, &TestWindow::slotToggle);
|
|
fileNewAction2->setToolTip(QStringLiteral("Tooltip"));
|
|
fileNewAction2->setStatusTip(QStringLiteral("Statustip"));
|
|
fileNewAction2->setWhatsThis(QStringLiteral("WhatsThis"));
|
|
|
|
QAction *fileOpenAction2 = new QAction(QIcon::fromTheme(QStringLiteral("document-open")), QStringLiteral("Open (starts progress in sb)"), this);
|
|
actionCollection()->addAction(QStringLiteral("fileopen2"), fileOpenAction2);
|
|
connect(fileOpenAction2, &QAction::triggered, this, &TestWindow::slotOpen);
|
|
fileOpenAction2->setToolTip(QStringLiteral("This action starts a progressbar inside the statusbar"));
|
|
|
|
QAction *fileFloppyAction2 = new QAction(QIcon::fromTheme(QStringLiteral("filefloppy")), QStringLiteral("Save file2 (autorepeat)"), this);
|
|
actionCollection()->addAction(QStringLiteral("filefloppy2"), fileFloppyAction2);
|
|
connect(fileFloppyAction2, &QAction::triggered, this, &TestWindow::slotSave);
|
|
|
|
itemsMenu = new QMenu;
|
|
itemsMenu->addAction(QStringLiteral("delete/insert exit button"), this, &TestWindow::slotExit);
|
|
itemsMenu->addAction(QStringLiteral("enable/disable lineedit"), this, &TestWindow::slotLined);
|
|
itemsMenu->addAction(QStringLiteral("Toggle fileNew"), this, &TestWindow::slotNew);
|
|
itemsMenu->addAction(QStringLiteral("Combo: clear"), this, &TestWindow::slotClearCombo);
|
|
itemsMenu->addAction(QStringLiteral("Combo: insert list"), this, &TestWindow::slotInsertListInCombo);
|
|
itemsMenu->addAction(QStringLiteral("Combo: make item 3 current"), this, &TestWindow::slotMakeItem3Current);
|
|
itemsMenu->addAction(QStringLiteral("Important msg in statusbar"), this, &TestWindow::slotImportant);
|
|
|
|
QAction *filePrintAction2 = new QAction(QIcon::fromTheme(QStringLiteral("document-print")), QStringLiteral("Print (pops menu)"), this);
|
|
actionCollection()->addAction(QStringLiteral("fileprint2"), filePrintAction2);
|
|
filePrintAction2->setMenu(itemsMenu);
|
|
|
|
// *** RADIO BUTTONS
|
|
QActionGroup *radioGroup = new QActionGroup(this);
|
|
radioGroup->setExclusive(true);
|
|
|
|
KToggleAction *radioButton1 = new KToggleAction(QIcon::fromTheme(QStringLiteral("document-new")), QStringLiteral("Radiobutton1"), this);
|
|
actionCollection()->addAction(QStringLiteral("radioButton1"), radioButton1);
|
|
radioButton1->setActionGroup(radioGroup);
|
|
|
|
KToggleAction *radioButton2 = new KToggleAction(QIcon::fromTheme(QStringLiteral("document-open")), QStringLiteral("Radiobutton2"), this);
|
|
actionCollection()->addAction(QStringLiteral("radioButton2"), radioButton2);
|
|
radioButton2->setActionGroup(radioGroup);
|
|
|
|
KToggleAction *radioButton3 = new KToggleAction(QIcon::fromTheme(QStringLiteral("filefloppy")), QStringLiteral("Radiobutton3"), this);
|
|
actionCollection()->addAction(QStringLiteral("radioButton3"), radioButton3);
|
|
radioButton3->setActionGroup(radioGroup);
|
|
|
|
KToggleAction *radioButton4 = new KToggleAction(QIcon::fromTheme(QStringLiteral("document-print")), QStringLiteral("Radiobutton4"), this);
|
|
actionCollection()->addAction(QStringLiteral("radioButton4"), radioButton4);
|
|
radioButton4->setActionGroup(radioGroup);
|
|
|
|
connect(radioGroup, &QActionGroup::triggered, this, &TestWindow::slotToggled);
|
|
|
|
/**************************************************/
|
|
/*Now, we setup statusbar; order is not important. */
|
|
/**************************************************/
|
|
statusBar = new QStatusBar(this);
|
|
// statusBar->insertItem("Hi there! ", 0);
|
|
// statusBar->insertItem("Look for tooltips to see functions", 1);
|
|
setStatusBar(statusBar);
|
|
|
|
// DigitalClock *clk = new DigitalClock (statusBar);
|
|
// clk->setFrameStyle(QFrame::NoFrame);
|
|
// statusBar->insertWidget(clk, 70, 2);
|
|
|
|
// Set main widget. In this example it is Qt's multiline text editor.
|
|
widget = new QTextEdit(this);
|
|
setCentralWidget(widget);
|
|
|
|
// Setup is now complete
|
|
|
|
setAutoSaveSettings();
|
|
|
|
// This is not strictly related to toolbars, menubars or KMainWindow.
|
|
// Setup popup for completions
|
|
completions = new QMenu;
|
|
|
|
completions->addAction(QStringLiteral("/"));
|
|
completions->addAction(QStringLiteral("/usr/"));
|
|
completions->addAction(QStringLiteral("/lib/"));
|
|
completions->addAction(QStringLiteral("/var/"));
|
|
completions->addAction(QStringLiteral("/bin/"));
|
|
completions->addAction(QStringLiteral("/kde/"));
|
|
completions->addAction(QStringLiteral("/home/"));
|
|
completions->addAction(QStringLiteral("/vmlinuz :-)"));
|
|
|
|
connect(completions, &QMenu::triggered, this, &TestWindow::slotCompletionsMenu);
|
|
pr = nullptr;
|
|
|
|
// KXMLGUIClient looks in the "data" resource for the .rc files
|
|
// This line is for test programs only!
|
|
qputenv("XDG_DATA_HOME", QFile::encodeName(QFileInfo(QFINDTESTDATA("kwindowtest.rc")).absolutePath()));
|
|
setupGUI(QSize(400, 500), Default, QStringLiteral("kwindowtest.rc"));
|
|
|
|
tb = toolBar();
|
|
tb1 = toolBar(QStringLiteral("AnotherToolBar"));
|
|
}
|
|
/***********************************/
|
|
/* Now slots for toolbar actions */
|
|
/***********************************/
|
|
void TestWindow::slotToggled(QAction *)
|
|
{
|
|
statusBar->showMessage(QStringLiteral("Button toggled"), 1500);
|
|
}
|
|
|
|
void TestWindow::slotInsertClock()
|
|
{
|
|
// DigitalClock *clock = new DigitalClock(tb1);
|
|
// clock->setFrameStyle(QFrame::NoFrame);
|
|
// tb1->insertWidget(8, 70, clock);
|
|
}
|
|
|
|
void TestWindow::slotNew()
|
|
{
|
|
// tb1->actions()[0]->toggle();
|
|
// toolBar()->removeAction( fileNewAction );
|
|
}
|
|
void TestWindow::slotOpen()
|
|
{
|
|
if (pr == nullptr) {
|
|
pr = new QProgressBar(statusBar);
|
|
pr->show();
|
|
}
|
|
// statusBar->message(pr);
|
|
if (!timer) {
|
|
timer = new QTimer(this);
|
|
connect(timer, &QTimer::timeout, this, &TestWindow::slotGoGoGoo);
|
|
}
|
|
timer->start(100);
|
|
}
|
|
|
|
void TestWindow::slotGoGoGoo()
|
|
{
|
|
pr->setValue(pr->value() + 1);
|
|
if (pr->value() == 100) {
|
|
timer->stop();
|
|
statusBar->clearMessage();
|
|
delete pr;
|
|
pr = nullptr;
|
|
}
|
|
}
|
|
|
|
void TestWindow::slotSave()
|
|
{
|
|
qApp->beep();
|
|
statusBar->showMessage(QStringLiteral("Saving properties..."));
|
|
}
|
|
|
|
void TestWindow::slotPrint()
|
|
{
|
|
statusBar->showMessage(QStringLiteral("Print file pressed"));
|
|
ena = !ena;
|
|
qobject_cast<QAction *>(sender())->setEnabled(ena);
|
|
}
|
|
void TestWindow::slotReturn()
|
|
{
|
|
QString s = QStringLiteral("You entered ");
|
|
s = s + testLineEdit->text();
|
|
statusBar->showMessage(s);
|
|
}
|
|
void TestWindow::slotList(const QString &str)
|
|
{
|
|
QString s = QStringLiteral("You chose ");
|
|
s = s + str;
|
|
statusBar->showMessage(s);
|
|
}
|
|
|
|
void TestWindow::slotCompletion()
|
|
{
|
|
// Now do a completion
|
|
// Call your completing function and set that text in lineedit
|
|
// QString s = tb->getLinedText(/* ID */ 4)
|
|
// QString completed = complete (s);
|
|
// tb->setLinedText(/* ID */ 4, completed.data())
|
|
|
|
// for now this:
|
|
|
|
completions->popup(QCursor::pos()); // This popup should understunf keys up and down
|
|
|
|
/* This is just an example. QLineEdit automatically sets cursor at end of string
|
|
when ctrl-d or ctrl-s is pressed. KToolBar will also put cursor at end of text in LineEdit
|
|
after inserting text with setLinedText (...).
|
|
*/
|
|
}
|
|
|
|
void TestWindow::slotListCompletion()
|
|
{
|
|
/*
|
|
Combo is not behaving good and it is ugly. I will see how it behaves in Qt-1.3,
|
|
and then decide should I make a new combobox.
|
|
*/
|
|
QString s(testComboBox->currentText()); // get text in combo
|
|
s += QStringLiteral("(completing)");
|
|
// tb->getCombo(4)->changeItem(s.data()); // setTextIncombo
|
|
}
|
|
|
|
void TestWindow::slotCompletionsMenu(QAction *action)
|
|
{
|
|
// Now set text in lined
|
|
QString s = action->text();
|
|
testLineEdit->setText(s); // Cursor is automatically at the end of string after this
|
|
}
|
|
|
|
TestWindow::~TestWindow()
|
|
{
|
|
qDebug() << "kwindowtest finished";
|
|
}
|
|
|
|
void TestWindow::beFixed()
|
|
{
|
|
widget->setFixedSize(400, 200);
|
|
}
|
|
|
|
void TestWindow::beYFixed()
|
|
{
|
|
widget->setMinimumSize(400, 200);
|
|
widget->setMaximumSize(9999, 200);
|
|
}
|
|
|
|
void TestWindow::slotImportant()
|
|
{
|
|
statusBar->showMessage(QStringLiteral("This important message will go away in 15 seconds"), 15000);
|
|
}
|
|
|
|
void TestWindow::slotExit()
|
|
{
|
|
if (exitB == true) {
|
|
tb->removeAction(exitAction);
|
|
exitB = false;
|
|
} else {
|
|
if (tb->actions().count() >= 7) {
|
|
tb->insertAction(tb->actions().at(6), exitAction);
|
|
} else {
|
|
tb->addAction(exitAction);
|
|
}
|
|
exitB = true;
|
|
}
|
|
}
|
|
|
|
void TestWindow::slotLined()
|
|
{
|
|
lineL = !lineL;
|
|
testLineEdit->setEnabled(lineL); // enable/disable lined
|
|
}
|
|
|
|
void TestWindow::slotToggle(bool on)
|
|
{
|
|
if (on == true) {
|
|
statusBar->showMessage(QStringLiteral("Toggle is on"));
|
|
} else {
|
|
statusBar->showMessage(QStringLiteral("Toggle is off"));
|
|
}
|
|
}
|
|
|
|
void TestWindow::slotFrame()
|
|
{
|
|
#if 0
|
|
if (greenF == false) {
|
|
tb1->insertFrame(10, 100);
|
|
tb1->alignItemRight(10); // this is pointless 'cause tb1 is not fullwidth
|
|
|
|
QFrame *myFrame = tb1->getFrame(10); // get frame pointer
|
|
|
|
if (myFrame == 0) {
|
|
warning("bad frame ID");
|
|
return;
|
|
}
|
|
|
|
//paint it green
|
|
// Or do whatever you want with it, just don't change its height (height = hardcoded = 24)
|
|
// And don't move it
|
|
// If you want to have something right from your toolbar you can reduce its
|
|
// max_width with setMaxWidth()
|
|
myFrame->setBackgroundColor(QColor("green"));
|
|
|
|
greenF = true;
|
|
} else {
|
|
tb1->removeItem(10);
|
|
greenF = false;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void TestWindow::slotMessage(int, bool boo)
|
|
{
|
|
if (boo) {
|
|
statusBar->showMessage(QStringLiteral("This button does this and that"), 1500);
|
|
} else {
|
|
statusBar->clearMessage();
|
|
}
|
|
}
|
|
// Now few Combo slots, for Torben
|
|
|
|
void TestWindow::slotClearCombo()
|
|
{
|
|
testComboBox->clear();
|
|
}
|
|
|
|
void TestWindow::slotInsertListInCombo()
|
|
{
|
|
QStringList list;
|
|
list.append(QStringLiteral("ListOne"));
|
|
list.append(QStringLiteral("ListTwo"));
|
|
list.append(QStringLiteral("ListThree"));
|
|
list.append(QStringLiteral("ListFour"));
|
|
list.append(QStringLiteral("ListFive"));
|
|
list.append(QStringLiteral("ListSix"));
|
|
list.append(QStringLiteral("ListSeven"));
|
|
list.append(QStringLiteral("ListEight"));
|
|
list.append(QStringLiteral("ListNine"));
|
|
list.append(QStringLiteral("ListTen"));
|
|
list.append(QStringLiteral("ListEleven"));
|
|
list.append(QStringLiteral("ListAndSoOn"));
|
|
testComboBox->addItems(list);
|
|
}
|
|
|
|
void TestWindow::slotMakeItem3Current()
|
|
{
|
|
testComboBox->setCurrentIndex(3);
|
|
}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
QApplication::setApplicationName(QStringLiteral("kwindowtest"));
|
|
|
|
QApplication myApp(argc, argv);
|
|
TestWindow *test = new TestWindow;
|
|
|
|
myApp.setQuitOnLastWindowClosed(false); // don't quit after the messagebox!
|
|
|
|
#if 0
|
|
int i = QMessageBox::information(0, "Select", "Select type of mainwidget",
|
|
"Fixed", "Y-fixed", "Resizable");
|
|
if (i == 0) {
|
|
test->beFixed();
|
|
} else if (i == 1) {
|
|
test->beYFixed();
|
|
}
|
|
#endif
|
|
|
|
test->show();
|
|
myApp.setQuitOnLastWindowClosed(true);
|
|
int ret = myApp.exec();
|
|
|
|
// delete test;
|
|
return ret;
|
|
}
|