diff options
| author | Robert Bieber <robby@bieberphoto.com> | 2010-06-26 07:59:23 +0000 |
|---|---|---|
| committer | Robert Bieber <robby@bieberphoto.com> | 2010-06-26 07:59:23 +0000 |
| commit | be70fd89be787e2b24604f9ba785b87c1f8f1d22 (patch) | |
| tree | 5b7ec98c48d2a5d2dc5078007142d2e92c09a8a2 /utils | |
| parent | 5300c7014d602c57fcae7f6619f5138d83ba33c0 (diff) | |
| download | rockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.zip rockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.tar.gz rockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.tar.bz2 rockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.tar.xz | |
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
Diffstat (limited to 'utils')
| -rw-r--r-- | utils/themeeditor/findreplace/findreplacedialog.cpp | 64 | ||||
| -rw-r--r-- | utils/themeeditor/findreplace/findreplacedialog.h | 80 | ||||
| -rw-r--r-- | utils/themeeditor/findreplace/findreplacedialog.ui | 32 | ||||
| -rw-r--r-- | utils/themeeditor/findreplace/findreplaceform.cpp | 222 | ||||
| -rw-r--r-- | utils/themeeditor/findreplace/findreplaceform.h | 153 | ||||
| -rw-r--r-- | utils/themeeditor/findreplace/findreplaceform.ui | 204 | ||||
| -rw-r--r-- | utils/themeeditor/gui/editorwindow.cpp | 90 | ||||
| -rw-r--r-- | utils/themeeditor/gui/editorwindow.h | 6 | ||||
| -rw-r--r-- | utils/themeeditor/gui/editorwindow.ui | 62 | ||||
| -rw-r--r-- | utils/themeeditor/gui/skindocument.cpp | 6 | ||||
| -rw-r--r-- | utils/themeeditor/gui/skindocument.h | 8 | ||||
| -rw-r--r-- | utils/themeeditor/themeeditor.pro | 13 |
12 files changed, 937 insertions, 3 deletions
diff --git a/utils/themeeditor/findreplace/findreplacedialog.cpp b/utils/themeeditor/findreplace/findreplacedialog.cpp new file mode 100644 index 0000000..547ad23 --- /dev/null +++ b/utils/themeeditor/findreplace/findreplacedialog.cpp @@ -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(); +} diff --git a/utils/themeeditor/findreplace/findreplacedialog.h b/utils/themeeditor/findreplace/findreplacedialog.h new file mode 100644 index 0000000..c3f2539 --- /dev/null +++ b/utils/themeeditor/findreplace/findreplacedialog.h @@ -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 diff --git a/utils/themeeditor/findreplace/findreplacedialog.ui b/utils/themeeditor/findreplace/findreplacedialog.ui new file mode 100644 index 0000000..74984b3 --- /dev/null +++ b/utils/themeeditor/findreplace/findreplacedialog.ui @@ -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>
diff --git a/utils/themeeditor/findreplace/findreplaceform.cpp b/utils/themeeditor/findreplace/findreplaceform.cpp new file mode 100644 index 0000000..cd2700f --- /dev/null +++ b/utils/themeeditor/findreplace/findreplaceform.cpp @@ -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(); +} diff --git a/utils/themeeditor/findreplace/findreplaceform.h b/utils/themeeditor/findreplace/findreplaceform.h new file mode 100644 index 0000000..f18052b --- /dev/null +++ b/utils/themeeditor/findreplace/findreplaceform.h @@ -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 diff --git a/utils/themeeditor/findreplace/findreplaceform.ui b/utils/themeeditor/findreplace/findreplaceform.ui new file mode 100644 index 0000000..acc055c --- /dev/null +++ b/utils/themeeditor/findreplace/findreplaceform.ui @@ -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>
diff --git a/utils/themeeditor/gui/editorwindow.cpp b/utils/themeeditor/gui/editorwindow.cpp index b778a1f..ea6c91f 100644 --- a/utils/themeeditor/gui/editorwindow.cpp +++ b/utils/themeeditor/gui/editorwindow.cpp @@ -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) { diff --git a/utils/themeeditor/gui/editorwindow.h b/utils/themeeditor/gui/editorwindow.h index ab75cc5..6f30249 100644 --- a/utils/themeeditor/gui/editorwindow.h +++ b/utils/themeeditor/gui/editorwindow.h @@ -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 */ diff --git a/utils/themeeditor/gui/editorwindow.ui b/utils/themeeditor/gui/editorwindow.ui index 2f84d38..707e246 100644 --- a/utils/themeeditor/gui/editorwindow.ui +++ b/utils/themeeditor/gui/editorwindow.ui @@ -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> diff --git a/utils/themeeditor/gui/skindocument.cpp b/utils/themeeditor/gui/skindocument.cpp index 6863ff5..f8206e1 100644 --- a/utils/themeeditor/gui/skindocument.cpp +++ b/utils/themeeditor/gui/skindocument.cpp @@ -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(); } diff --git a/utils/themeeditor/gui/skindocument.h b/utils/themeeditor/gui/skindocument.h index c6b3687..1713023 100644 --- a/utils/themeeditor/gui/skindocument.h +++ b/utils/themeeditor/gui/skindocument.h @@ -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 diff --git a/utils/themeeditor/themeeditor.pro b/utils/themeeditor/themeeditor.pro index 50cafe0..329500e 100644 --- a/utils/themeeditor/themeeditor.pro +++ b/utils/themeeditor/themeeditor.pro @@ -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 |