forked from len0rd/rockbox
Theme Editor: Added an edit menu with a find/replace function (copied from an LGPL library)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27137 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
5300c7014d
commit
be70fd89be
12 changed files with 937 additions and 3 deletions
64
utils/themeeditor/findreplace/findreplacedialog.cpp
Normal file
64
utils/themeeditor/findreplace/findreplacedialog.cpp
Normal file
|
@ -0,0 +1,64 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* This file has been copied from Lorenzo Bettini, with minor modifications
|
||||
* made available under the LGPL version 3, as the original file was licensed
|
||||
*
|
||||
****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
|
||||
* See COPYING file that comes with this distribution
|
||||
*/
|
||||
|
||||
#include "findreplacedialog.h"
|
||||
#include "ui_findreplacedialog.h"
|
||||
|
||||
FindReplaceDialog::FindReplaceDialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
ui(new Ui::FindReplaceDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
FindReplaceDialog::~FindReplaceDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void FindReplaceDialog::changeEvent(QEvent *e)
|
||||
{
|
||||
QDialog::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void FindReplaceDialog::setTextEdit(QPlainTextEdit *textEdit) {
|
||||
ui->findReplaceForm->setTextEdit(textEdit);
|
||||
}
|
||||
|
||||
void FindReplaceDialog::writeSettings(QSettings &settings, const QString &prefix) {
|
||||
ui->findReplaceForm->writeSettings(settings, prefix);
|
||||
}
|
||||
|
||||
void FindReplaceDialog::readSettings(QSettings &settings, const QString &prefix) {
|
||||
ui->findReplaceForm->readSettings(settings, prefix);
|
||||
}
|
||||
|
||||
void FindReplaceDialog::findNext() {
|
||||
ui->findReplaceForm->findNext();
|
||||
}
|
||||
|
||||
void FindReplaceDialog::findPrev() {
|
||||
ui->findReplaceForm->findPrev();
|
||||
}
|
80
utils/themeeditor/findreplace/findreplacedialog.h
Normal file
80
utils/themeeditor/findreplace/findreplacedialog.h
Normal file
|
@ -0,0 +1,80 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* This file has been copied from Lorenzo Bettini, with minor modifications
|
||||
* made available under the LGPL version 3, as the original file was licensed
|
||||
*
|
||||
****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
|
||||
* See COPYING file that comes with this distribution
|
||||
*/
|
||||
|
||||
#ifndef FINDREPLACEDIALOG_H
|
||||
#define FINDREPLACEDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QPlainTextEdit>
|
||||
|
||||
namespace Ui {
|
||||
class FindReplaceDialog;
|
||||
}
|
||||
|
||||
class QTextEdit;
|
||||
class QSettings;
|
||||
|
||||
/**
|
||||
* A find/replace dialog.
|
||||
*
|
||||
* It relies on a FindReplaceForm object (see that class for the functionalities provided).
|
||||
*/
|
||||
class FindReplaceDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
FindReplaceDialog(QWidget *parent = 0);
|
||||
virtual ~FindReplaceDialog();
|
||||
|
||||
/**
|
||||
* Associates the text editor where to perform the search
|
||||
* @param textEdit
|
||||
*/
|
||||
void setTextEdit(QPlainTextEdit *textEdit);
|
||||
|
||||
/**
|
||||
* Writes the state of the form to the passed settings.
|
||||
* @param settings
|
||||
* @param prefix the prefix to insert in the settings
|
||||
*/
|
||||
virtual void writeSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
|
||||
|
||||
/**
|
||||
* Reads the state of the form from the passed settings.
|
||||
* @param settings
|
||||
* @param prefix the prefix to look for in the settings
|
||||
*/
|
||||
virtual void readSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
|
||||
|
||||
public slots:
|
||||
/**
|
||||
* Finds the next occurrence
|
||||
*/
|
||||
void findNext();
|
||||
|
||||
/**
|
||||
* Finds the previous occurrence
|
||||
*/
|
||||
void findPrev();
|
||||
|
||||
protected:
|
||||
void changeEvent(QEvent *e);
|
||||
|
||||
Ui::FindReplaceDialog *ui;
|
||||
};
|
||||
|
||||
#endif // FINDREPLACEDIALOG_H
|
32
utils/themeeditor/findreplace/findreplacedialog.ui
Normal file
32
utils/themeeditor/findreplace/findreplacedialog.ui
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>FindReplaceDialog</class>
|
||||
<widget class="QDialog" name="FindReplaceDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>342</width>
|
||||
<height>140</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Find/Replace</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="FindReplaceForm" name="findReplaceForm" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>FindReplaceForm</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">findreplaceform.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
222
utils/themeeditor/findreplace/findreplaceform.cpp
Normal file
222
utils/themeeditor/findreplace/findreplaceform.cpp
Normal file
|
@ -0,0 +1,222 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* This file has been copied from Lorenzo Bettini, with minor modifications
|
||||
* made available under the LGPL version 3, as the original file was licensed
|
||||
*
|
||||
****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
|
||||
* See COPYING file that comes with this distribution
|
||||
*/
|
||||
|
||||
#include <QtGui>
|
||||
#include <QTextEdit>
|
||||
#include <QRegExp>
|
||||
#include <QSettings>
|
||||
|
||||
#include "findreplaceform.h"
|
||||
#include "ui_findreplaceform.h"
|
||||
|
||||
#define TEXT_TO_FIND "textToFind"
|
||||
#define TEXT_TO_REPLACE "textToReplace"
|
||||
#define DOWN_RADIO "downRadio"
|
||||
#define UP_RADIO "upRadio"
|
||||
#define CASE_CHECK "caseCheck"
|
||||
#define WHOLE_CHECK "wholeCheck"
|
||||
#define REGEXP_CHECK "regexpCheck"
|
||||
|
||||
FindReplaceForm::FindReplaceForm(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::FindReplaceForm), textEdit(0)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->errorLabel->setText("");
|
||||
|
||||
connect(ui->textToFind, SIGNAL(textChanged(QString)), this, SLOT(textToFindChanged()));
|
||||
connect(ui->textToFind, SIGNAL(textChanged(QString)), this, SLOT(validateRegExp(QString)));
|
||||
|
||||
connect(ui->regexCheckBox, SIGNAL(toggled(bool)), this, SLOT(regexpSelected(bool)));
|
||||
|
||||
connect(ui->findButton, SIGNAL(clicked()), this, SLOT(find()));
|
||||
connect(ui->closeButton, SIGNAL(clicked()), parent, SLOT(close()));
|
||||
|
||||
connect(ui->replaceButton, SIGNAL(clicked()), this, SLOT(replace()));
|
||||
connect(ui->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll()));
|
||||
}
|
||||
|
||||
FindReplaceForm::~FindReplaceForm()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void FindReplaceForm::hideReplaceWidgets() {
|
||||
ui->replaceLabel->setVisible(false);
|
||||
ui->textToReplace->setVisible(false);
|
||||
ui->replaceButton->setVisible(false);
|
||||
ui->replaceAllButton->setVisible(false);
|
||||
}
|
||||
|
||||
void FindReplaceForm::setTextEdit(QPlainTextEdit *textEdit_) {
|
||||
textEdit = textEdit_;
|
||||
connect(textEdit, SIGNAL(copyAvailable(bool)), ui->replaceButton, SLOT(setEnabled(bool)));
|
||||
connect(textEdit, SIGNAL(copyAvailable(bool)), ui->replaceAllButton, SLOT(setEnabled(bool)));
|
||||
}
|
||||
|
||||
void FindReplaceForm::changeEvent(QEvent *e)
|
||||
{
|
||||
QWidget::changeEvent(e);
|
||||
switch (e->type()) {
|
||||
case QEvent::LanguageChange:
|
||||
ui->retranslateUi(this);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void FindReplaceForm::textToFindChanged() {
|
||||
ui->findButton->setEnabled(ui->textToFind->text().size() > 0);
|
||||
}
|
||||
|
||||
void FindReplaceForm::regexpSelected(bool sel) {
|
||||
if (sel)
|
||||
validateRegExp(ui->textToFind->text());
|
||||
else
|
||||
validateRegExp("");
|
||||
}
|
||||
|
||||
void FindReplaceForm::validateRegExp(const QString &text) {
|
||||
if (!ui->regexCheckBox->isChecked() || text.size() == 0) {
|
||||
ui->errorLabel->setText("");
|
||||
return; // nothing to validate
|
||||
}
|
||||
|
||||
QRegExp reg(text,
|
||||
(ui->caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive));
|
||||
|
||||
if (reg.isValid()) {
|
||||
showError("");
|
||||
} else {
|
||||
showError(reg.errorString());
|
||||
}
|
||||
}
|
||||
|
||||
void FindReplaceForm::showError(const QString &error) {
|
||||
if (error == "") {
|
||||
ui->errorLabel->setText("");
|
||||
} else {
|
||||
ui->errorLabel->setText("<span style=\" font-weight:600; color:#ff0000;\">" +
|
||||
error +
|
||||
"</span>");
|
||||
}
|
||||
}
|
||||
|
||||
void FindReplaceForm::showMessage(const QString &message) {
|
||||
if (message == "") {
|
||||
ui->errorLabel->setText("");
|
||||
} else {
|
||||
ui->errorLabel->setText("<span style=\" font-weight:600; color:green;\">" +
|
||||
message +
|
||||
"</span>");
|
||||
}
|
||||
}
|
||||
|
||||
void FindReplaceForm::find() {
|
||||
find(ui->downRadioButton->isChecked());
|
||||
}
|
||||
|
||||
void FindReplaceForm::find(bool next) {
|
||||
if (!textEdit)
|
||||
return; // TODO: show some warning?
|
||||
|
||||
// backward search
|
||||
bool back = !next;
|
||||
|
||||
const QString &toSearch = ui->textToFind->text();
|
||||
|
||||
bool result = false;
|
||||
|
||||
QTextDocument::FindFlags flags;
|
||||
|
||||
if (back)
|
||||
flags |= QTextDocument::FindBackward;
|
||||
if (ui->caseCheckBox->isChecked())
|
||||
flags |= QTextDocument::FindCaseSensitively;
|
||||
if (ui->wholeCheckBox->isChecked())
|
||||
flags |= QTextDocument::FindWholeWords;
|
||||
|
||||
if (ui->regexCheckBox->isChecked()) {
|
||||
QRegExp reg(toSearch,
|
||||
(ui->caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive));
|
||||
|
||||
qDebug() << "searching for regexp: " << reg.pattern();
|
||||
|
||||
textCursor = textEdit->document()->find(reg, textCursor, flags);
|
||||
textEdit->setTextCursor(textCursor);
|
||||
result = (!textCursor.isNull());
|
||||
} else {
|
||||
qDebug() << "searching for: " << toSearch;
|
||||
|
||||
result = textEdit->find(toSearch, flags);
|
||||
}
|
||||
|
||||
if (result) {
|
||||
showError("");
|
||||
} else {
|
||||
showError(tr("no match found"));
|
||||
// move to the beginning of the document for the next find
|
||||
textCursor.setPosition(0);
|
||||
textEdit->setTextCursor(textCursor);
|
||||
}
|
||||
}
|
||||
|
||||
void FindReplaceForm::replace() {
|
||||
if (!textEdit->textCursor().hasSelection()) {
|
||||
find();
|
||||
} else {
|
||||
textEdit->textCursor().insertText(ui->textToReplace->text());
|
||||
find();
|
||||
}
|
||||
}
|
||||
|
||||
void FindReplaceForm::replaceAll() {
|
||||
int i=0;
|
||||
while (textEdit->textCursor().hasSelection()){
|
||||
textEdit->textCursor().insertText(ui->textToReplace->text());
|
||||
find();
|
||||
i++;
|
||||
}
|
||||
showMessage(tr("Replaced %1 occurrence(s)").arg(i));
|
||||
}
|
||||
|
||||
void FindReplaceForm::writeSettings(QSettings &settings, const QString &prefix) {
|
||||
settings.beginGroup(prefix);
|
||||
settings.setValue(TEXT_TO_FIND, ui->textToFind->text());
|
||||
settings.setValue(TEXT_TO_REPLACE, ui->textToReplace->text());
|
||||
settings.setValue(DOWN_RADIO, ui->downRadioButton->isChecked());
|
||||
settings.setValue(UP_RADIO, ui->upRadioButton->isChecked());
|
||||
settings.setValue(CASE_CHECK, ui->caseCheckBox->isChecked());
|
||||
settings.setValue(WHOLE_CHECK, ui->wholeCheckBox->isChecked());
|
||||
settings.setValue(REGEXP_CHECK, ui->regexCheckBox->isChecked());
|
||||
settings.endGroup();
|
||||
}
|
||||
|
||||
void FindReplaceForm::readSettings(QSettings &settings, const QString &prefix) {
|
||||
settings.beginGroup(prefix);
|
||||
ui->textToFind->setText(settings.value(TEXT_TO_FIND, "").toString());
|
||||
ui->textToReplace->setText(settings.value(TEXT_TO_REPLACE, "").toString());
|
||||
ui->downRadioButton->setChecked(settings.value(DOWN_RADIO, true).toBool());
|
||||
ui->upRadioButton->setChecked(settings.value(UP_RADIO, false).toBool());
|
||||
ui->caseCheckBox->setChecked(settings.value(CASE_CHECK, false).toBool());
|
||||
ui->wholeCheckBox->setChecked(settings.value(WHOLE_CHECK, false).toBool());
|
||||
ui->regexCheckBox->setChecked(settings.value(REGEXP_CHECK, false).toBool());
|
||||
settings.endGroup();
|
||||
}
|
153
utils/themeeditor/findreplace/findreplaceform.h
Normal file
153
utils/themeeditor/findreplace/findreplaceform.h
Normal file
|
@ -0,0 +1,153 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* This file has been copied from Lorenzo Bettini, with minor modifications
|
||||
* made available under the LGPL version 3, as the original file was licensed
|
||||
*
|
||||
****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
|
||||
* See COPYING file that comes with this distribution
|
||||
*/
|
||||
|
||||
#ifndef FINDREPLACEFORM_H
|
||||
#define FINDREPLACEFORM_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTextCursor>
|
||||
#include <QPlainTextEdit>
|
||||
|
||||
namespace Ui {
|
||||
class FindReplaceForm;
|
||||
}
|
||||
|
||||
class QTextEdit;
|
||||
class QSettings;
|
||||
|
||||
/**
|
||||
* The form for the find/replace dialog. The form presents the typical
|
||||
* widgets you find in standard find/replace dialogs, and it acts on a QTextEdit.
|
||||
*
|
||||
* \image html Screenshot-FindReplace.png
|
||||
*
|
||||
* You need to set the QTextEdit explicitly, using the method setTextEdit(QTextEdit *textEdit).
|
||||
*
|
||||
* For instance
|
||||
* \code
|
||||
* m_findReplaceDialog = new FindReplaceDialog(this);
|
||||
* m_findReplaceDialog->setModal(false);
|
||||
* m_findReplaceDialog->setTextEdit(ui->textEdit);
|
||||
* \endcode
|
||||
*
|
||||
* The find functionalities is available even if the find dialog is not shown: if something
|
||||
* to search for was already specified, the application can call the methods findNext() and
|
||||
* findPrev() (e.g., by connecting them to menu items).
|
||||
*
|
||||
* In case a regular expression is used as the search term, the form also checks whether the
|
||||
* expression is a valid regular expression (You may want to take a look at the syntax of regular expressions:
|
||||
* http://doc.trolltech.com/qregexp.html).
|
||||
*
|
||||
* The form provides also functionalities to save and restore its state using a QSettings object (i.e.,
|
||||
* the last word searched for, the options of the form, etc.) via the methods writeSettings()
|
||||
* and readSettings().
|
||||
*
|
||||
* You can take a look at the \ref examples page.
|
||||
*/
|
||||
class FindReplaceForm : public QWidget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
FindReplaceForm(QWidget *parent = 0);
|
||||
virtual ~FindReplaceForm();
|
||||
|
||||
/**
|
||||
* Associates the text editor where to perform the search
|
||||
* @param textEdit_
|
||||
*/
|
||||
void setTextEdit(QPlainTextEdit *textEdit_);
|
||||
|
||||
/// hides replace widgets from the form
|
||||
void hideReplaceWidgets();
|
||||
|
||||
/**
|
||||
* Writes the state of the form to the passed settings.
|
||||
* @param settings
|
||||
* @param prefix the prefix to insert in the settings
|
||||
*/
|
||||
virtual void writeSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
|
||||
|
||||
/**
|
||||
* Reads the state of the form from the passed settings.
|
||||
* @param settings
|
||||
* @param prefix the prefix to look for in the settings
|
||||
*/
|
||||
virtual void readSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
|
||||
|
||||
public slots:
|
||||
/**
|
||||
* performs the find task
|
||||
* @param down whether to find the next or the previous
|
||||
* occurrence
|
||||
*/
|
||||
void find(bool down);
|
||||
|
||||
/**
|
||||
* Finds the next occurrence
|
||||
*/
|
||||
void find();
|
||||
|
||||
/**
|
||||
* Finds the next occurrence
|
||||
*/
|
||||
void findNext() { find(true); }
|
||||
|
||||
/**
|
||||
* Finds the previous occurrence
|
||||
*/
|
||||
void findPrev() { find(false); }
|
||||
|
||||
/**
|
||||
* Replaces the found occurrences and goes to the next occurrence
|
||||
*/
|
||||
void replace();
|
||||
|
||||
/**
|
||||
* Replaces all the found occurrences
|
||||
*/
|
||||
void replaceAll();
|
||||
|
||||
protected:
|
||||
void changeEvent(QEvent *e);
|
||||
|
||||
/// shows an error in the dialog
|
||||
void showError(const QString &error);
|
||||
|
||||
/// shows a message in the dialog
|
||||
void showMessage(const QString &message);
|
||||
|
||||
protected slots:
|
||||
/// when the text edit contents changed
|
||||
void textToFindChanged();
|
||||
|
||||
/// checks whether the passed text is a valid regexp
|
||||
void validateRegExp(const QString &text);
|
||||
|
||||
/// the regexp checkbox was selected
|
||||
void regexpSelected(bool sel);
|
||||
|
||||
protected:
|
||||
Ui::FindReplaceForm *ui;
|
||||
|
||||
/// for searching into the text
|
||||
QTextCursor textCursor;
|
||||
|
||||
/// the text editor (possibly) associated with this form
|
||||
QPlainTextEdit *textEdit;
|
||||
};
|
||||
|
||||
#endif // FINDREPLACEFORM_H
|
204
utils/themeeditor/findreplace/findreplaceform.ui
Normal file
204
utils/themeeditor/findreplace/findreplaceform.ui
Normal file
|
@ -0,0 +1,204 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>FindReplaceForm</class>
|
||||
<widget class="QWidget" name="FindReplaceForm">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>483</width>
|
||||
<height>288</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>&Find:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>textToFind</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="textToFind"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="replaceLabel">
|
||||
<property name="text">
|
||||
<string>R&eplace with:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>textToReplace</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="textToReplace"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="errorLabel">
|
||||
<property name="text">
|
||||
<string>errorLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>D&irection</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="downRadioButton">
|
||||
<property name="text">
|
||||
<string>&Down</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="upRadioButton">
|
||||
<property name="text">
|
||||
<string>&Up</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>&Options</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="caseCheckBox">
|
||||
<property name="text">
|
||||
<string>&Case sensitive</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="wholeCheckBox">
|
||||
<property name="text">
|
||||
<string>&Whole words only</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="regexCheckBox">
|
||||
<property name="toolTip">
|
||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">whether the text to search should be interpreted as a regular expression.</p>
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You may want to take a look at the syntax of regular expressions:</p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="http://doc.trolltech.com/qregexp.html"><span style=" text-decoration: underline; color:#0000ff;">http://doc.trolltech.com/qregexp.html</span></a></p></body></html></string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>R&egular Expression</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QPushButton" name="findButton">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Find</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="closeButton">
|
||||
<property name="text">
|
||||
<string>&Close</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="replaceButton">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Replace</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="replaceAllButton">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Replace &All</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>textToFind</tabstop>
|
||||
<tabstop>textToReplace</tabstop>
|
||||
<tabstop>downRadioButton</tabstop>
|
||||
<tabstop>upRadioButton</tabstop>
|
||||
<tabstop>caseCheckBox</tabstop>
|
||||
<tabstop>wholeCheckBox</tabstop>
|
||||
<tabstop>regexCheckBox</tabstop>
|
||||
<tabstop>findButton</tabstop>
|
||||
<tabstop>closeButton</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -200,6 +200,20 @@ void EditorWindow::setupMenus()
|
|||
|
||||
QObject::connect(ui->actionOpen_Project, SIGNAL(triggered()),
|
||||
this, SLOT(openProject()));
|
||||
|
||||
/* Connecting the edit menu */
|
||||
QObject::connect(ui->actionUndo, SIGNAL(triggered()),
|
||||
this, SLOT(undo()));
|
||||
QObject::connect(ui->actionRedo, SIGNAL(triggered()),
|
||||
this, SLOT(redo()));
|
||||
QObject::connect(ui->actionCut, SIGNAL(triggered()),
|
||||
this, SLOT(cut()));
|
||||
QObject::connect(ui->actionCopy, SIGNAL(triggered()),
|
||||
this, SLOT(copy()));
|
||||
QObject::connect(ui->actionPaste, SIGNAL(triggered()),
|
||||
this, SLOT(paste()));
|
||||
QObject::connect(ui->actionFind_Replace, SIGNAL(triggered()),
|
||||
this, SLOT(findReplace()));
|
||||
}
|
||||
|
||||
void EditorWindow::addTab(TabContent *doc)
|
||||
|
@ -237,6 +251,12 @@ void EditorWindow::shiftTab(int index)
|
|||
ui->actionClose_Document->setEnabled(false);
|
||||
ui->actionToolbarSave->setEnabled(false);
|
||||
ui->fromTree->setEnabled(false);
|
||||
ui->actionUndo->setEnabled(false);
|
||||
ui->actionRedo->setEnabled(false);
|
||||
ui->actionCut->setEnabled(false);
|
||||
ui->actionCopy->setEnabled(false);
|
||||
ui->actionPaste->setEnabled(false);
|
||||
ui->actionFind_Replace->setEnabled(false);
|
||||
viewer->setScene(0);
|
||||
}
|
||||
else if(widget->type() == TabContent::Config)
|
||||
|
@ -245,6 +265,12 @@ void EditorWindow::shiftTab(int index)
|
|||
ui->actionSave_Document_As->setEnabled(true);
|
||||
ui->actionClose_Document->setEnabled(true);
|
||||
ui->actionToolbarSave->setEnabled(true);
|
||||
ui->actionUndo->setEnabled(false);
|
||||
ui->actionRedo->setEnabled(false);
|
||||
ui->actionCut->setEnabled(false);
|
||||
ui->actionCopy->setEnabled(false);
|
||||
ui->actionPaste->setEnabled(false);
|
||||
ui->actionFind_Replace->setEnabled(false);
|
||||
viewer->setScene(0);
|
||||
}
|
||||
else if(widget->type() == TabContent::Skin)
|
||||
|
@ -260,12 +286,26 @@ void EditorWindow::shiftTab(int index)
|
|||
ui->actionToolbarSave->setEnabled(true);
|
||||
ui->fromTree->setEnabled(true);
|
||||
|
||||
ui->actionUndo->setEnabled(true);
|
||||
ui->actionRedo->setEnabled(true);
|
||||
ui->actionCut->setEnabled(true);
|
||||
ui->actionCopy->setEnabled(true);
|
||||
ui->actionPaste->setEnabled(true);
|
||||
ui->actionFind_Replace->setEnabled(true);
|
||||
|
||||
sizeColumns();
|
||||
|
||||
/* Syncing the preview */
|
||||
viewer->setScene(doc->scene());
|
||||
|
||||
}
|
||||
|
||||
/* Hiding all the find/replace dialogs */
|
||||
for(int i = 0; i < ui->editorTabs->count(); i++)
|
||||
if(dynamic_cast<TabContent*>(ui->editorTabs->widget(i))->type() ==
|
||||
TabContent::Skin)
|
||||
dynamic_cast<SkinDocument*>(ui->editorTabs->widget(i))->hideFind();
|
||||
|
||||
}
|
||||
|
||||
bool EditorWindow::closeTab(int index)
|
||||
|
@ -469,6 +509,56 @@ void EditorWindow::lineChanged(int line)
|
|||
|
||||
}
|
||||
|
||||
void EditorWindow::undo()
|
||||
{
|
||||
TabContent* doc = dynamic_cast<TabContent*>
|
||||
(ui->editorTabs->currentWidget());
|
||||
if(doc->type() == TabContent::Skin)
|
||||
dynamic_cast<SkinDocument*>(doc)->getEditor()->undo();
|
||||
}
|
||||
|
||||
void EditorWindow::redo()
|
||||
{
|
||||
TabContent* doc = dynamic_cast<TabContent*>
|
||||
(ui->editorTabs->currentWidget());
|
||||
if(doc->type() == TabContent::Skin)
|
||||
dynamic_cast<SkinDocument*>(doc)->getEditor()->redo();
|
||||
|
||||
}
|
||||
|
||||
void EditorWindow::cut()
|
||||
{
|
||||
TabContent* doc = dynamic_cast<TabContent*>
|
||||
(ui->editorTabs->currentWidget());
|
||||
if(doc->type() == TabContent::Skin)
|
||||
dynamic_cast<SkinDocument*>(doc)->getEditor()->cut();
|
||||
}
|
||||
|
||||
void EditorWindow::copy()
|
||||
{
|
||||
TabContent* doc = dynamic_cast<TabContent*>
|
||||
(ui->editorTabs->currentWidget());
|
||||
if(doc->type() == TabContent::Skin)
|
||||
dynamic_cast<SkinDocument*>(doc)->getEditor()->copy();
|
||||
}
|
||||
|
||||
void EditorWindow::paste()
|
||||
{
|
||||
TabContent* doc = dynamic_cast<TabContent*>
|
||||
(ui->editorTabs->currentWidget());
|
||||
if(doc->type() == TabContent::Skin)
|
||||
dynamic_cast<SkinDocument*>(doc)->getEditor()->paste();
|
||||
}
|
||||
|
||||
void EditorWindow::findReplace()
|
||||
{
|
||||
TabContent* doc = dynamic_cast<TabContent*>
|
||||
(ui->editorTabs->currentWidget());
|
||||
if(doc->type() == TabContent::Skin)
|
||||
dynamic_cast<SkinDocument*>(doc)->showFind();
|
||||
}
|
||||
|
||||
|
||||
void EditorWindow::expandLine(ParseTreeModel* model, QModelIndex parent,
|
||||
int line)
|
||||
{
|
||||
|
|
|
@ -73,6 +73,12 @@ private slots:
|
|||
void tabTitleChanged(QString title);
|
||||
void updateCurrent(); /* Generates code in the current tab */
|
||||
void lineChanged(int line); /* Used for auto-expand */
|
||||
void undo();
|
||||
void redo();
|
||||
void cut();
|
||||
void copy();
|
||||
void paste();
|
||||
void findReplace();
|
||||
|
||||
private:
|
||||
/* Setup functions */
|
||||
|
|
|
@ -70,7 +70,21 @@
|
|||
<addaction name="separator"/>
|
||||
<addaction name="actionDevice_Configuration"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuEdit">
|
||||
<property name="title">
|
||||
<string>&Edit</string>
|
||||
</property>
|
||||
<addaction name="actionUndo"/>
|
||||
<addaction name="actionRedo"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionCut"/>
|
||||
<addaction name="actionCopy"/>
|
||||
<addaction name="actionPaste"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionFind_Replace"/>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menuEdit"/>
|
||||
<addaction name="menuView"/>
|
||||
</widget>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
|
@ -303,6 +317,54 @@
|
|||
<string>Ctrl+D</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionUndo">
|
||||
<property name="text">
|
||||
<string>&Undo</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Z</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionRedo">
|
||||
<property name="text">
|
||||
<string>&Redo</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Shift+Z</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCut">
|
||||
<property name="text">
|
||||
<string>C&ut</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+X</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCopy">
|
||||
<property name="text">
|
||||
<string>&Copy</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+C</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPaste">
|
||||
<property name="text">
|
||||
<string>&Paste</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+V</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFind_Replace">
|
||||
<property name="text">
|
||||
<string>&Find/Replace</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+F</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>projectTree</tabstop>
|
||||
|
|
|
@ -151,6 +151,12 @@ void SkinDocument::setupUI()
|
|||
QObject::connect(device, SIGNAL(settingsChanged()),
|
||||
this, SLOT(deviceChanged()));
|
||||
|
||||
/* Attaching the find/replace dialog */
|
||||
findReplace = new FindReplaceDialog(this);
|
||||
findReplace->setModal(false);
|
||||
findReplace->setTextEdit(editor);
|
||||
findReplace->hide();
|
||||
|
||||
settingsChanged();
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
#include <QHBoxLayout>
|
||||
#include <QGraphicsScene>
|
||||
|
||||
#include "findreplacedialog.h"
|
||||
|
||||
#include "skinhighlighter.h"
|
||||
#include "parsetreemodel.h"
|
||||
#include "preferencesdialog.h"
|
||||
|
@ -61,6 +63,7 @@ public:
|
|||
QString file() const{ return fileName; }
|
||||
QString title() const{ return titleText; }
|
||||
QString getStatus(){ return parseStatus; }
|
||||
CodeEditor* getEditor(){ return editor; }
|
||||
void genCode(){ editor->document()->setPlainText(model->genCode()); }
|
||||
void setProject(ProjectModel* project){ this->project = project; }
|
||||
|
||||
|
@ -73,6 +76,9 @@ public:
|
|||
|
||||
QGraphicsScene* scene(){ return model->render(project, device, &fileName); }
|
||||
|
||||
void showFind(){ findReplace->show(); }
|
||||
void hideFind(){ findReplace->hide(); }
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
@ -104,6 +110,8 @@ private:
|
|||
|
||||
ProjectModel* project;
|
||||
DeviceState* device;
|
||||
|
||||
FindReplaceDialog* findReplace;
|
||||
};
|
||||
|
||||
#endif // SKINDOCUMENT_H
|
||||
|
|
|
@ -11,6 +11,7 @@ RBBASE_DIR = $$replace(RBBASE_DIR,/utils/themeeditor,)
|
|||
INCLUDEPATH += gui
|
||||
INCLUDEPATH += models
|
||||
INCLUDEPATH += graphics
|
||||
INCLUDEPATH += findreplace
|
||||
|
||||
# Stuff for the parse lib
|
||||
libskin_parser.commands = @$(MAKE) \
|
||||
|
@ -40,7 +41,9 @@ HEADERS += models/parsetreemodel.h \
|
|||
graphics/rbrenderinfo.h \
|
||||
graphics/rbimage.h \
|
||||
graphics/rbfont.h \
|
||||
gui/devicestate.h
|
||||
gui/devicestate.h \
|
||||
findreplace/findreplaceform.h \
|
||||
findreplace/findreplacedialog.h
|
||||
SOURCES += main.cpp \
|
||||
models/parsetreemodel.cpp \
|
||||
models/parsetreenode.cpp \
|
||||
|
@ -57,7 +60,9 @@ SOURCES += main.cpp \
|
|||
graphics/rbrenderinfo.cpp \
|
||||
graphics/rbimage.cpp \
|
||||
graphics/rbfont.cpp \
|
||||
gui/devicestate.cpp
|
||||
gui/devicestate.cpp \
|
||||
findreplace/findreplaceform.cpp \
|
||||
findreplace/findreplacedialog.cpp
|
||||
OTHER_FILES += README \
|
||||
resources/windowicon.png \
|
||||
resources/appicon.xcf \
|
||||
|
@ -69,5 +74,7 @@ OTHER_FILES += README \
|
|||
FORMS += gui/editorwindow.ui \
|
||||
gui/preferencesdialog.ui \
|
||||
gui/configdocument.ui \
|
||||
gui/skinviewer.ui
|
||||
gui/skinviewer.ui \
|
||||
findreplace/findreplaceform.ui \
|
||||
findreplace/findreplacedialog.ui
|
||||
RESOURCES += resources.qrc
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue