Initial commit with sources
103
.gitignore
vendored
@ -1,52 +1,73 @@
|
||||
# C++ objects and libs
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
# This file is used to ignore files which are generated
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
*~
|
||||
*.autosave
|
||||
*.a
|
||||
*.la
|
||||
*.lai
|
||||
*.core
|
||||
*.moc
|
||||
*.o
|
||||
*.obj
|
||||
*.orig
|
||||
*.rej
|
||||
*.so
|
||||
*.so.*
|
||||
*.dll
|
||||
*.dylib
|
||||
|
||||
# Qt-es
|
||||
object_script.*.Release
|
||||
object_script.*.Debug
|
||||
*_plugin_import.cpp
|
||||
*_pch.h.cpp
|
||||
*_resource.rc
|
||||
*.qm
|
||||
.#*
|
||||
*.*#
|
||||
core
|
||||
!core/
|
||||
tags
|
||||
.DS_Store
|
||||
.directory
|
||||
*.debug
|
||||
Makefile*
|
||||
*.prl
|
||||
*.app
|
||||
moc_*.cpp
|
||||
ui_*.h
|
||||
qrc_*.cpp
|
||||
Thumbs.db
|
||||
*.res
|
||||
*.rc
|
||||
/.qmake.cache
|
||||
/.qmake.stash
|
||||
*.pro.user
|
||||
*.pro.user.*
|
||||
*.qbs.user
|
||||
*.qbs.user.*
|
||||
*.moc
|
||||
moc_*.cpp
|
||||
moc_*.h
|
||||
qrc_*.cpp
|
||||
ui_*.h
|
||||
*.qmlc
|
||||
*.jsc
|
||||
Makefile*
|
||||
*build-*
|
||||
*.qm
|
||||
*.prl
|
||||
|
||||
# Qt unit tests
|
||||
target_wrapper.*
|
||||
# qtcreator generated files
|
||||
*.pro.user*
|
||||
|
||||
# QtCreator
|
||||
*.autosave
|
||||
# xemacs temporary files
|
||||
*.flc
|
||||
|
||||
# QtCreator Qml
|
||||
*.qmlproject.user
|
||||
*.qmlproject.user.*
|
||||
# Vim temporary files
|
||||
.*.swp
|
||||
|
||||
# QtCreator CMake
|
||||
CMakeLists.txt.user*
|
||||
# Visual Studio generated files
|
||||
*.ib_pdb_index
|
||||
*.idb
|
||||
*.ilk
|
||||
*.pdb
|
||||
*.sln
|
||||
*.suo
|
||||
*.vcproj
|
||||
*vcproj.*.*.user
|
||||
*.ncb
|
||||
*.sdf
|
||||
*.opensdf
|
||||
*.vcxproj
|
||||
*vcxproj.*
|
||||
|
||||
# QtCreator 4.8< compilation database
|
||||
compile_commands.json
|
||||
# MinGW generated files
|
||||
*.Debug
|
||||
*.Release
|
||||
|
||||
# Python byte code
|
||||
*.pyc
|
||||
|
||||
# Binaries
|
||||
# --------
|
||||
*.dll
|
||||
*.exe
|
||||
|
||||
# QtCreator local machine specific files for imported projects
|
||||
*creator.user*
|
||||
|
60
QtGameMaker.pro
Normal file
@ -0,0 +1,60 @@
|
||||
QT = core gui widgets multimedia
|
||||
|
||||
CONFIG += c++latest
|
||||
QMAKE_CXXFLAGS += -std=c++23
|
||||
|
||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000
|
||||
|
||||
HEADERS += \
|
||||
codeeditorwidget.h \
|
||||
dialogs/fontpropertiesdialog.h \
|
||||
dialogs/pathpropertiesdialog.h \
|
||||
dialogs/scriptpropertiesdialog.h \
|
||||
futurecpp.h \
|
||||
jshighlighter.h \
|
||||
mainwindow.h \
|
||||
projectcontainer.h \
|
||||
projecttreemodel.h \
|
||||
dialogs/backgroundpropertiesdialog.h \
|
||||
dialogs/editspritedialog.h \
|
||||
dialogs/extensionpackagesdialog.h \
|
||||
dialogs/gameinformationdialog.h \
|
||||
dialogs/globalgamesettingsdialog.h \
|
||||
dialogs/preferencesdialog.h \
|
||||
dialogs/soundpropertiesdialog.h \
|
||||
dialogs/spritepropertiesdialog.h
|
||||
|
||||
SOURCES += main.cpp \
|
||||
codeeditorwidget.cpp \
|
||||
dialogs/fontpropertiesdialog.cpp \
|
||||
dialogs/pathpropertiesdialog.cpp \
|
||||
dialogs/scriptpropertiesdialog.cpp \
|
||||
jshighlighter.cpp \
|
||||
mainwindow.cpp \
|
||||
projectcontainer.cpp \
|
||||
projecttreemodel.cpp \
|
||||
dialogs/backgroundpropertiesdialog.cpp \
|
||||
dialogs/editspritedialog.cpp \
|
||||
dialogs/extensionpackagesdialog.cpp \
|
||||
dialogs/gameinformationdialog.cpp \
|
||||
dialogs/globalgamesettingsdialog.cpp \
|
||||
dialogs/preferencesdialog.cpp \
|
||||
dialogs/soundpropertiesdialog.cpp \
|
||||
dialogs/spritepropertiesdialog.cpp
|
||||
|
||||
FORMS += \
|
||||
dialogs/fontpropertiesdialog.ui \
|
||||
dialogs/pathpropertiesdialog.ui \
|
||||
dialogs/scriptpropertiesdialog.ui \
|
||||
mainwindow.ui \
|
||||
dialogs/backgroundpropertiesdialog.ui \
|
||||
dialogs/editspritedialog.ui \
|
||||
dialogs/extensionpackagesdialog.ui \
|
||||
dialogs/gameinformationdialog.ui \
|
||||
dialogs/globalgamesettingsdialog.ui \
|
||||
dialogs/preferencesdialog.ui \
|
||||
dialogs/soundpropertiesdialog.ui \
|
||||
dialogs/spritepropertiesdialog.ui
|
||||
|
||||
RESOURCES += \
|
||||
resources.qrc
|
120
codeeditorwidget.cpp
Normal file
@ -0,0 +1,120 @@
|
||||
#include "codeeditorwidget.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QTextBlock>
|
||||
|
||||
CodeEditorWidget::CodeEditorWidget(QWidget *parent)
|
||||
: QPlainTextEdit{parent}
|
||||
{
|
||||
lineNumberArea = new LineNumberArea(this);
|
||||
|
||||
connect(this, &CodeEditorWidget::blockCountChanged,
|
||||
this, &CodeEditorWidget::updateLineNumberAreaWidth);
|
||||
connect(this, &CodeEditorWidget::updateRequest,
|
||||
this, &CodeEditorWidget::updateLineNumberArea);
|
||||
connect(this, &CodeEditorWidget::cursorPositionChanged,
|
||||
this, &CodeEditorWidget::highlightCurrentLine);
|
||||
|
||||
updateLineNumberAreaWidth(0);
|
||||
highlightCurrentLine();
|
||||
}
|
||||
|
||||
void CodeEditorWidget::updateLineNumberAreaWidth(int newBlockCount)
|
||||
{
|
||||
setViewportMargins(lineNumberAreaWidth(), 0, 0, 0);
|
||||
}
|
||||
|
||||
int CodeEditorWidget::lineNumberAreaWidth()
|
||||
{
|
||||
int digits = 1;
|
||||
int max = qMax(1, blockCount());
|
||||
while (max >= 10)
|
||||
{
|
||||
max /= 10;
|
||||
++digits;
|
||||
}
|
||||
|
||||
int space = 3 + fontMetrics().horizontalAdvance(QLatin1Char('9')) * digits;
|
||||
|
||||
return std::max(space, 40);
|
||||
}
|
||||
|
||||
void CodeEditorWidget::resizeEvent(QResizeEvent *e)
|
||||
{
|
||||
QPlainTextEdit::resizeEvent(e);
|
||||
|
||||
QRect cr = contentsRect();
|
||||
lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height()));
|
||||
}
|
||||
|
||||
void CodeEditorWidget::updateLineNumberArea(const QRect &rect, int dy)
|
||||
{
|
||||
if (dy)
|
||||
lineNumberArea->scroll(0, dy);
|
||||
else
|
||||
lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height());
|
||||
|
||||
if (rect.contains(viewport()->rect()))
|
||||
updateLineNumberAreaWidth(0);
|
||||
}
|
||||
|
||||
void CodeEditorWidget::highlightCurrentLine()
|
||||
{
|
||||
QList<QTextEdit::ExtraSelection> extraSelections;
|
||||
|
||||
if (!isReadOnly())
|
||||
{
|
||||
QTextEdit::ExtraSelection selection;
|
||||
|
||||
QColor lineColor = QColor(Qt::yellow).lighter(160);
|
||||
|
||||
selection.format.setBackground(lineColor);
|
||||
selection.format.setProperty(QTextFormat::FullWidthSelection, true);
|
||||
selection.cursor = textCursor();
|
||||
selection.cursor.clearSelection();
|
||||
extraSelections.append(selection);
|
||||
}
|
||||
|
||||
setExtraSelections(extraSelections);
|
||||
}
|
||||
|
||||
void CodeEditorWidget::lineNumberAreaPaintEvent(QPaintEvent *event)
|
||||
{
|
||||
QPainter painter(lineNumberArea);
|
||||
painter.fillRect(event->rect(), Qt::lightGray);
|
||||
|
||||
QTextBlock block = firstVisibleBlock();
|
||||
int blockNumber = block.blockNumber();
|
||||
int top = qRound(blockBoundingGeometry(block).translated(contentOffset()).top());
|
||||
int bottom = top + qRound(blockBoundingRect(block).height());
|
||||
|
||||
while (block.isValid() && top <= event->rect().bottom())
|
||||
{
|
||||
if (block.isVisible() && bottom >= event->rect().top())
|
||||
{
|
||||
QString number = QString::number(blockNumber + 1);
|
||||
painter.setPen(Qt::black);
|
||||
painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(),
|
||||
Qt::AlignRight, number);
|
||||
}
|
||||
|
||||
block = block.next();
|
||||
top = bottom;
|
||||
bottom = top + qRound(blockBoundingRect(block).height());
|
||||
++blockNumber;
|
||||
}
|
||||
}
|
||||
|
||||
LineNumberArea::LineNumberArea(CodeEditorWidget *editor) : QWidget(editor), codeEditor(editor)
|
||||
{
|
||||
}
|
||||
|
||||
QSize LineNumberArea::sizeHint() const
|
||||
{
|
||||
return QSize(codeEditor->lineNumberAreaWidth(), 0);
|
||||
}
|
||||
|
||||
void LineNumberArea::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
codeEditor->lineNumberAreaPaintEvent(event);
|
||||
}
|
41
codeeditorwidget.h
Normal file
@ -0,0 +1,41 @@
|
||||
#pragma once
|
||||
|
||||
#include <QPlainTextEdit>
|
||||
|
||||
class CodeEditorWidget : public QPlainTextEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CodeEditorWidget(QWidget *parent = nullptr);
|
||||
|
||||
void lineNumberAreaPaintEvent(QPaintEvent *event);
|
||||
int lineNumberAreaWidth();
|
||||
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
|
||||
private slots:
|
||||
void updateLineNumberAreaWidth(int newBlockCount);
|
||||
void highlightCurrentLine();
|
||||
void updateLineNumberArea(const QRect &rect, int dy);
|
||||
|
||||
private:
|
||||
QWidget *lineNumberArea;
|
||||
};
|
||||
|
||||
class LineNumberArea : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
LineNumberArea(CodeEditorWidget *editor);
|
||||
|
||||
QSize sizeHint() const override;
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event) override;
|
||||
|
||||
private:
|
||||
CodeEditorWidget *codeEditor;
|
||||
};
|
104
dialogs/backgroundpropertiesdialog.cpp
Normal file
@ -0,0 +1,104 @@
|
||||
#include "backgroundpropertiesdialog.h"
|
||||
#include "ui_backgroundpropertiesdialog.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
|
||||
BackgroundPropertiesDialog::BackgroundPropertiesDialog(Background &background, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::BackgroundPropertiesDialog>()},
|
||||
m_background{background}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
setWindowTitle(tr("Background Properties: %0").arg(m_background.name));
|
||||
|
||||
m_ui->lineEditName->setText(m_background.name);
|
||||
m_ui->labelWidth->setText(tr("Width: %0").arg(m_background.pixmap.width()));
|
||||
m_ui->labelHeight->setText(tr("Height: %0").arg(m_background.pixmap.height()));
|
||||
m_ui->labelPreview->setPixmap(m_background.pixmap);
|
||||
|
||||
connect(m_ui->pushButtonLoad, &QAbstractButton::pressed,
|
||||
this, &BackgroundPropertiesDialog::loadBackground);
|
||||
connect(m_ui->pushButtonSave, &QAbstractButton::pressed,
|
||||
this, &BackgroundPropertiesDialog::saveBackground);
|
||||
connect(m_ui->pushButtonEdit, &QAbstractButton::pressed,
|
||||
this, &BackgroundPropertiesDialog::editBackground);
|
||||
|
||||
connect(m_ui->lineEditName, &QLineEdit::textChanged,
|
||||
this, &BackgroundPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxTileset, &QCheckBox::stateChanged,
|
||||
this, &BackgroundPropertiesDialog::changed);
|
||||
}
|
||||
|
||||
BackgroundPropertiesDialog::~BackgroundPropertiesDialog() = default;
|
||||
|
||||
void BackgroundPropertiesDialog::accept()
|
||||
{
|
||||
if (m_background.name != m_ui->lineEditName->text())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Not implemented"), tr("Changing the name is not yet implemented!"));
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void BackgroundPropertiesDialog::reject()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
QDialog::reject();
|
||||
return;
|
||||
}
|
||||
|
||||
const auto result = QMessageBox::warning(
|
||||
this,
|
||||
tr("The Background has been modified."),
|
||||
tr("Do you want to save your changes?"),
|
||||
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
|
||||
QMessageBox::Save
|
||||
);
|
||||
switch (result)
|
||||
{
|
||||
case QMessageBox::Save:
|
||||
accept();
|
||||
return;
|
||||
case QMessageBox::Discard:
|
||||
QDialog::reject();
|
||||
return;
|
||||
case QMessageBox::Cancel:
|
||||
return;
|
||||
default:
|
||||
qWarning() << "unexpected dialog result" << result;
|
||||
}
|
||||
}
|
||||
|
||||
void BackgroundPropertiesDialog::loadBackground()
|
||||
{
|
||||
QFileDialog::getOpenFileName(this, tr("Open a Background Image..."));
|
||||
}
|
||||
|
||||
void BackgroundPropertiesDialog::saveBackground()
|
||||
{
|
||||
QFileDialog::getSaveFileName(this, tr("Save a Background Image..."), m_background.name + ".png", tr("PNG Files (*.png)"));
|
||||
}
|
||||
|
||||
void BackgroundPropertiesDialog::editBackground()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void BackgroundPropertiesDialog::changed()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
setWindowTitle(tr("Background Properties: %0*").arg(m_background.name));
|
||||
m_unsavedChanges = true;
|
||||
}
|
||||
}
|
35
dialogs/backgroundpropertiesdialog.h
Normal file
@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
#include <QString>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class BackgroundPropertiesDialog; }
|
||||
struct Background;
|
||||
|
||||
class BackgroundPropertiesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit BackgroundPropertiesDialog(Background &background, QWidget *parent = nullptr);
|
||||
~BackgroundPropertiesDialog();
|
||||
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
|
||||
private slots:
|
||||
void loadBackground();
|
||||
void saveBackground();
|
||||
void editBackground();
|
||||
|
||||
void changed();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::BackgroundPropertiesDialog> m_ui;
|
||||
|
||||
Background &m_background;
|
||||
|
||||
bool m_unsavedChanges{};
|
||||
};
|
197
dialogs/backgroundpropertiesdialog.ui
Normal file
@ -0,0 +1,197 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>BackgroundPropertiesDialog</class>
|
||||
<widget class="QDialog" name="BackgroundPropertiesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>573</width>
|
||||
<height>221</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/dialogs/background-file.png</normaloff>:/qtgameengine/icons/dialogs/background-file.png</iconset>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelName">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>lineEditName</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lineEditName">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonLoad">
|
||||
<property name="text">
|
||||
<string>&Load Background</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/open.png</normaloff>:/qtgameengine/icons/actions/open.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonSave">
|
||||
<property name="text">
|
||||
<string>&Save Background</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/save.png</normaloff>:/qtgameengine/icons/actions/save.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonEdit">
|
||||
<property name="text">
|
||||
<string>&Edit Background</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/buttons/edit.png</normaloff>:/qtgameengine/icons/buttons/edit.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelWidth">
|
||||
<property name="text">
|
||||
<string>Width:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelHeight">
|
||||
<property name="text">
|
||||
<string>Height:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxTileset">
|
||||
<property name="text">
|
||||
<string>&Use as tile set</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Minimum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonOk">
|
||||
<property name="text">
|
||||
<string>&OK</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/buttons/ok.png</normaloff>:/qtgameengine/icons/buttons/ok.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Minimum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QLabel" name="labelPreview">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>371</width>
|
||||
<height>201</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>pushButtonOk</sender>
|
||||
<signal>pressed()</signal>
|
||||
<receiver>BackgroundPropertiesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>124</x>
|
||||
<y>197</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>110</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
22
dialogs/editspritedialog.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
#include "editspritedialog.h"
|
||||
#include "ui_editspritedialog.h"
|
||||
|
||||
#include "projectcontainer.h"
|
||||
|
||||
EditSpriteDialog::EditSpriteDialog(Sprite &sprite, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::EditSpriteDialog>()},
|
||||
m_sprite{sprite}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
setWindowFlags(windowFlags()
|
||||
& ~Qt::Dialog
|
||||
| Qt::Window
|
||||
| Qt::WindowMinimizeButtonHint
|
||||
| Qt::WindowMaximizeButtonHint
|
||||
| Qt::WindowCloseButtonHint);
|
||||
|
||||
setWindowTitle(tr("Sprite editor - %0").arg(m_sprite.name));
|
||||
}
|
||||
|
||||
EditSpriteDialog::~EditSpriteDialog() = default;
|
22
dialogs/editspritedialog.h
Normal file
@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class EditSpriteDialog; }
|
||||
struct Sprite;
|
||||
|
||||
class EditSpriteDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit EditSpriteDialog(Sprite &sprite, QWidget *parent = nullptr);
|
||||
~EditSpriteDialog();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::EditSpriteDialog> m_ui;
|
||||
|
||||
Sprite &m_sprite;
|
||||
};
|
206
dialogs/editspritedialog.ui
Normal file
@ -0,0 +1,206 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>EditSpriteDialog</class>
|
||||
<widget class="QDialog" name="EditSpriteDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>491</width>
|
||||
<height>500</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Sprite Editor</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1,0">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QMenuBar" name="menuBar">
|
||||
<widget class="QMenu" name="menuFile">
|
||||
<property name="title">
|
||||
<string>&File</string>
|
||||
</property>
|
||||
<addaction name="actionNew"/>
|
||||
<addaction name="actionCreateFromFile"/>
|
||||
<addaction name="actionAddFromFile"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionSaveAsPngFile"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionCreateFromStrip"/>
|
||||
<addaction name="actionAddFromStrip"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionCloseSavingChanges"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuEdit">
|
||||
<property name="title">
|
||||
<string>&Edit</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuTransform">
|
||||
<property name="title">
|
||||
<string>&Transform</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuImages">
|
||||
<property name="title">
|
||||
<string>&Images</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuAnimation">
|
||||
<property name="title">
|
||||
<string>&Animation</string>
|
||||
</property>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menuEdit"/>
|
||||
<addaction name="menuTransform"/>
|
||||
<addaction name="menuImages"/>
|
||||
<addaction name="menuAnimation"/>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::Panel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
<property name="movable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="floatable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<addaction name="actionCloseSavingChanges"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionNew"/>
|
||||
<addaction name="actionCreateFromFile"/>
|
||||
<addaction name="actionAddFromFile"/>
|
||||
<addaction name="actionSaveAsPngFile"/>
|
||||
<addaction name="separator"/>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStatusBar" name="statusBar"/>
|
||||
</item>
|
||||
</layout>
|
||||
<action name="actionNew">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/new.png</normaloff>:/qtgameengine/icons/actions/new.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&New...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCreateFromFile">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/open.png</normaloff>:/qtgameengine/icons/actions/open.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Create from file...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAddFromFile">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/create-group.png</normaloff>:/qtgameengine/icons/actions/create-group.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Add from file...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSaveAsPngFile">
|
||||
<property name="text">
|
||||
<string>&Save as PNG File...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCreateFromStrip">
|
||||
<property name="text">
|
||||
<string>Create from Strip...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAddFromStrip">
|
||||
<property name="text">
|
||||
<string>Add from Stri&p...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseSavingChanges">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/ok.png</normaloff>:/qtgameengine/icons/actions/ok.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Close Saving Changes</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>actionCloseSavingChanges</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>EditSpriteDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>245</x>
|
||||
<y>249</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
17
dialogs/extensionpackagesdialog.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "extensionpackagesdialog.h"
|
||||
#include "ui_extensionpackagesdialog.h"
|
||||
|
||||
ExtensionPackagesDialog::ExtensionPackagesDialog(QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::ExtensionPackagesDialog>()}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
setWindowFlags(windowFlags()
|
||||
& ~Qt::Dialog
|
||||
| Qt::Window
|
||||
| Qt::WindowMinimizeButtonHint
|
||||
| Qt::WindowMaximizeButtonHint
|
||||
| Qt::WindowCloseButtonHint);
|
||||
}
|
||||
|
||||
ExtensionPackagesDialog::~ExtensionPackagesDialog() = default;
|
19
dialogs/extensionpackagesdialog.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class ExtensionPackagesDialog; }
|
||||
|
||||
class ExtensionPackagesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ExtensionPackagesDialog(QWidget *parent = nullptr);
|
||||
~ExtensionPackagesDialog();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::ExtensionPackagesDialog> m_ui;
|
||||
};
|
212
dialogs/extensionpackagesdialog.ui
Normal file
@ -0,0 +1,212 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ExtensionPackagesDialog</class>
|
||||
<widget class="QDialog" name="ExtensionPackagesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>461</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Extension Packages</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,1,0">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout" columnminimumwidth="1,0,1">
|
||||
<item row="1" column="0">
|
||||
<widget class="QListView" name="listViewUsedPackages"/>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonLeft">
|
||||
<property name="text">
|
||||
<string>⬅️</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonRight">
|
||||
<property name="text">
|
||||
<string>➡️</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelUsedPackages">
|
||||
<property name="text">
|
||||
<string>Used Packages:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QListView" name="listViewAvailablePackages"/>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="labelAvailablePackages">
|
||||
<property name="text">
|
||||
<string>Available Packages:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxInformation">
|
||||
<property name="title">
|
||||
<string>Information</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelAuthor">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Author:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="labelVersion">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Version:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="labelDate">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Date:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="labelLicense">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>License:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="labelDescription">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Description:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>TextLabel</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Help|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>ExtensionPackagesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>199</x>
|
||||
<y>278</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>199</x>
|
||||
<y>149</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>ExtensionPackagesDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>199</x>
|
||||
<y>278</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>199</x>
|
||||
<y>149</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
144
dialogs/fontpropertiesdialog.cpp
Normal file
@ -0,0 +1,144 @@
|
||||
#include "fontpropertiesdialog.h"
|
||||
#include "ui_fontpropertiesdialog.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
|
||||
FontPropertiesDialog::FontPropertiesDialog(Font &font, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::FontPropertiesDialog>()},
|
||||
m_font{font}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
setWindowTitle(tr("Font Properties: %0").arg(m_font.name));
|
||||
|
||||
m_ui->lineEditName->setText(m_font.name);
|
||||
m_ui->fontComboBox->setCurrentFont(m_font.font);
|
||||
m_ui->spinBoxSize->setValue(m_font.font.pointSize());
|
||||
m_ui->checkBoxBold->setChecked(m_font.font.bold());
|
||||
m_ui->checkBoxItalic->setChecked(m_font.font.italic());
|
||||
m_ui->spinBoxCharRangeFrom->setValue(m_font.range.from);
|
||||
m_ui->spinBoxCharRangeTo->setValue(m_font.range.to);
|
||||
|
||||
m_ui->labelPreview->setFont(currentFont());
|
||||
|
||||
connect(m_ui->pushButtonNormal, &QAbstractButton::pressed,
|
||||
this, &FontPropertiesDialog::normalRange);
|
||||
connect(m_ui->pushButtonDigits, &QAbstractButton::pressed,
|
||||
this, &FontPropertiesDialog::digitsRange);
|
||||
connect(m_ui->pushButtonAll, &QAbstractButton::pressed,
|
||||
this, &FontPropertiesDialog::allRange);
|
||||
connect(m_ui->pushButtonLetters, &QAbstractButton::pressed,
|
||||
this, &FontPropertiesDialog::lettersRange);
|
||||
|
||||
connect(m_ui->lineEditName, &QLineEdit::textChanged,
|
||||
this, &FontPropertiesDialog::changed);
|
||||
connect(m_ui->fontComboBox, &QFontComboBox::currentFontChanged,
|
||||
this, &FontPropertiesDialog::changed);
|
||||
connect(m_ui->spinBoxSize, &QSpinBox::valueChanged,
|
||||
this, &FontPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxBold, &QCheckBox::toggled,
|
||||
this, &FontPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxItalic, &QCheckBox::toggled,
|
||||
this, &FontPropertiesDialog::changed);
|
||||
connect(m_ui->spinBoxCharRangeFrom, &QSpinBox::valueChanged,
|
||||
this, &FontPropertiesDialog::changed);
|
||||
connect(m_ui->spinBoxCharRangeTo, &QSpinBox::valueChanged,
|
||||
this, &FontPropertiesDialog::changed);
|
||||
}
|
||||
|
||||
FontPropertiesDialog::~FontPropertiesDialog() = default;
|
||||
|
||||
void FontPropertiesDialog::accept()
|
||||
{
|
||||
if (m_font.name != m_ui->lineEditName->text())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Not implemented"), tr("Changing the name is not yet implemented!"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_font.font = currentFont();
|
||||
m_font.range = {
|
||||
.from = m_ui->spinBoxCharRangeFrom->value(),
|
||||
.to = m_ui->spinBoxCharRangeTo->value(),
|
||||
};
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void FontPropertiesDialog::reject()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
QDialog::reject();
|
||||
return;
|
||||
}
|
||||
|
||||
const auto result = QMessageBox::warning(
|
||||
this,
|
||||
tr("The Font has been modified."),
|
||||
tr("Do you want to save your changes?"),
|
||||
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
|
||||
QMessageBox::Save
|
||||
);
|
||||
switch (result)
|
||||
{
|
||||
case QMessageBox::Save:
|
||||
accept();
|
||||
return;
|
||||
case QMessageBox::Discard:
|
||||
QDialog::reject();
|
||||
return;
|
||||
case QMessageBox::Cancel:
|
||||
return;
|
||||
default:
|
||||
qWarning() << "unexpected dialog result" << result;
|
||||
}
|
||||
}
|
||||
|
||||
void FontPropertiesDialog::normalRange()
|
||||
{
|
||||
m_ui->spinBoxCharRangeFrom->setValue(32);
|
||||
m_ui->spinBoxCharRangeFrom->setValue(127);
|
||||
}
|
||||
|
||||
void FontPropertiesDialog::digitsRange()
|
||||
{
|
||||
m_ui->spinBoxCharRangeFrom->setValue(48);
|
||||
m_ui->spinBoxCharRangeFrom->setValue(57);
|
||||
}
|
||||
|
||||
void FontPropertiesDialog::allRange()
|
||||
{
|
||||
m_ui->spinBoxCharRangeFrom->setValue(0);
|
||||
m_ui->spinBoxCharRangeFrom->setValue(255);
|
||||
}
|
||||
|
||||
void FontPropertiesDialog::lettersRange()
|
||||
{
|
||||
m_ui->spinBoxCharRangeFrom->setValue(65);
|
||||
m_ui->spinBoxCharRangeFrom->setValue(122);
|
||||
}
|
||||
|
||||
void FontPropertiesDialog::changed()
|
||||
{
|
||||
m_ui->labelPreview->setFont(currentFont());
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
setWindowTitle(tr("Font Properties: %0*").arg(m_font.name));
|
||||
m_unsavedChanges = true;
|
||||
}
|
||||
}
|
||||
|
||||
QFont FontPropertiesDialog::currentFont() const
|
||||
{
|
||||
QFont font;
|
||||
font.setFamily(m_ui->fontComboBox->currentFont().family());
|
||||
font.setPointSize(m_ui->spinBoxSize->value());
|
||||
font.setBold(m_ui->checkBoxBold->isChecked());
|
||||
font.setItalic(m_ui->checkBoxItalic->isChecked());
|
||||
return font;
|
||||
}
|
37
dialogs/fontpropertiesdialog.h
Normal file
@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class FontPropertiesDialog; }
|
||||
struct Font;
|
||||
|
||||
class FontPropertiesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit FontPropertiesDialog(Font &font, QWidget *parent = nullptr);
|
||||
~FontPropertiesDialog();
|
||||
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
|
||||
private slots:
|
||||
void normalRange();
|
||||
void digitsRange();
|
||||
void allRange();
|
||||
void lettersRange();
|
||||
|
||||
void changed();
|
||||
|
||||
private:
|
||||
QFont currentFont() const;
|
||||
|
||||
const std::unique_ptr<Ui::FontPropertiesDialog> m_ui;
|
||||
|
||||
Font &m_font;
|
||||
|
||||
bool m_unsavedChanges{};
|
||||
};
|
258
dialogs/fontpropertiesdialog.ui
Normal file
@ -0,0 +1,258 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>FontPropertiesDialog</class>
|
||||
<widget class="QDialog" name="FontPropertiesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>338</width>
|
||||
<height>451</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Font Properties</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/dialogs/font-file.png</normaloff>:/qtgameengine/icons/dialogs/font-file.png</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelName">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>lineEditName</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lineEditName"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="labelFont">
|
||||
<property name="text">
|
||||
<string>Font:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>fontComboBox</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="labelSize">
|
||||
<property name="text">
|
||||
<string>Size:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>spinBoxSize</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QFontComboBox" name="fontComboBox"/>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="spinBoxSize"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Minimum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxBold">
|
||||
<property name="text">
|
||||
<string>Bold</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxItalic">
|
||||
<property name="text">
|
||||
<string>Italic</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxCharacterRange">
|
||||
<property name="title">
|
||||
<string>Character Range</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="labelTill">
|
||||
<property name="text">
|
||||
<string>till</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QSpinBox" name="spinBoxCharRangeFrom">
|
||||
<property name="maximum">
|
||||
<number>255</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>32</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QSpinBox" name="spinBoxCharRangeTo">
|
||||
<property name="maximum">
|
||||
<number>255</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>127</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="pushButtonNormal">
|
||||
<property name="text">
|
||||
<string>Normal</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QPushButton" name="pushButtonDigits">
|
||||
<property name="text">
|
||||
<string>Digits</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QPushButton" name="pushButtonAll">
|
||||
<property name="text">
|
||||
<string>All</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QPushButton" name="pushButtonLetters">
|
||||
<property name="text">
|
||||
<string>Letters</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelPreview">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>100</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::StyledPanel</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>AaBbCcDd</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</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>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonOk">
|
||||
<property name="text">
|
||||
<string>&OK</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/buttons/ok.png</normaloff>:/qtgameengine/icons/buttons/ok.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>pushButtonOk</sender>
|
||||
<signal>pressed()</signal>
|
||||
<receiver>FontPropertiesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>168</x>
|
||||
<y>428</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>168</x>
|
||||
<y>225</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
17
dialogs/gameinformationdialog.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "gameinformationdialog.h"
|
||||
#include "ui_gameinformationdialog.h"
|
||||
|
||||
GameInformationDialog::GameInformationDialog(QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::GameInformationDialog>()}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
setWindowFlags(windowFlags()
|
||||
& ~Qt::Dialog
|
||||
| Qt::Window
|
||||
| Qt::WindowMinimizeButtonHint
|
||||
| Qt::WindowMaximizeButtonHint
|
||||
| Qt::WindowCloseButtonHint);
|
||||
}
|
||||
|
||||
GameInformationDialog::~GameInformationDialog() = default;
|
19
dialogs/gameinformationdialog.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class GameInformationDialog; }
|
||||
|
||||
class GameInformationDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GameInformationDialog(QWidget *parent = nullptr);
|
||||
~GameInformationDialog();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::GameInformationDialog> m_ui;
|
||||
};
|
19
dialogs/gameinformationdialog.ui
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>GameInformationDialog</class>
|
||||
<widget class="QDialog" name="GameInformationDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Game Information</string>
|
||||
</property>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
17
dialogs/globalgamesettingsdialog.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "globalgamesettingsdialog.h"
|
||||
#include "ui_globalgamesettingsdialog.h"
|
||||
|
||||
GlobalGameSettingsDialog::GlobalGameSettingsDialog(QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::GlobalGameSettingsDialog>()}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
setWindowFlags(windowFlags()
|
||||
& ~Qt::Dialog
|
||||
| Qt::Window
|
||||
| Qt::WindowMinimizeButtonHint
|
||||
| Qt::WindowMaximizeButtonHint
|
||||
| Qt::WindowCloseButtonHint);
|
||||
}
|
||||
|
||||
GlobalGameSettingsDialog::~GlobalGameSettingsDialog() = default;
|
19
dialogs/globalgamesettingsdialog.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class GlobalGameSettingsDialog; }
|
||||
|
||||
class GlobalGameSettingsDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GlobalGameSettingsDialog(QWidget *parent = nullptr);
|
||||
~GlobalGameSettingsDialog();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::GlobalGameSettingsDialog> m_ui;
|
||||
};
|
268
dialogs/globalgamesettingsdialog.ui
Normal file
@ -0,0 +1,268 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>GlobalGameSettingsDialog</class>
|
||||
<widget class="QDialog" name="GlobalGameSettingsDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>370</width>
|
||||
<height>528</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Global Game Settings</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidgetResolution">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tabGraphics">
|
||||
<attribute name="title">
|
||||
<string>Graphics</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxFullscreen">
|
||||
<property name="text">
|
||||
<string>Start in full-screen mode</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="1,1">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxScaling">
|
||||
<property name="title">
|
||||
<string>Scaling</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonFixedScale">
|
||||
<property name="text">
|
||||
<string>Fixed scale (in %)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinBox">
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>100</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonKeepAspectRatio">
|
||||
<property name="text">
|
||||
<string>Keep aspect ratio</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonFullScale">
|
||||
<property name="text">
|
||||
<string>Full scale</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxInterpolateColors">
|
||||
<property name="text">
|
||||
<string>Interpolate colors between pixels</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelColorOutsideRoom">
|
||||
<property name="text">
|
||||
<string>Color outside the room region:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="toolButton">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxAllowResize">
|
||||
<property name="text">
|
||||
<string>Allow the player to resize the game window</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxAlwaysOntop">
|
||||
<property name="text">
|
||||
<string>Let the game window always stay on top</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxNoBorder">
|
||||
<property name="text">
|
||||
<string>Don't draw a border in windowed mode</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxNoWindowButtons">
|
||||
<property name="text">
|
||||
<string>Don't show the buttons in the window caption</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxDisplayCursor">
|
||||
<property name="text">
|
||||
<string>Display the cursor</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxFreezeOnFocusLost">
|
||||
<property name="text">
|
||||
<string>Freeze the game when the form loses focus</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxDisableScreensavers">
|
||||
<property name="text">
|
||||
<string>Disable screensavers and power saving actions</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>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabResolution">
|
||||
<attribute name="title">
|
||||
<string>Resolution</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabOther">
|
||||
<attribute name="title">
|
||||
<string>Other</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabLoading">
|
||||
<attribute name="title">
|
||||
<string>Loading</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabErrors">
|
||||
<attribute name="title">
|
||||
<string>Errors</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabInfo">
|
||||
<attribute name="title">
|
||||
<string>Info</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>GlobalGameSettingsDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>184</x>
|
||||
<y>506</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>184</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>GlobalGameSettingsDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>184</x>
|
||||
<y>506</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>184</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
92
dialogs/pathpropertiesdialog.cpp
Normal file
@ -0,0 +1,92 @@
|
||||
#include "pathpropertiesdialog.h"
|
||||
#include "ui_pathpropertiesdialog.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
|
||||
PathPropertiesDialog::PathPropertiesDialog(Path &path, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::PathPropertiesDialog>()},
|
||||
m_path{path},
|
||||
m_labelX{new QLabel{tr("x: %0").arg(0)}},
|
||||
m_labelY{new QLabel{tr("y: %0").arg(0)}},
|
||||
m_labelArea{new QLabel{tr("Area: (%0,%1)->(%2,%3)").arg(0).arg(0).arg(0).arg(0)}}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
setWindowTitle(tr("Path Properties: %0").arg(m_path.name));
|
||||
|
||||
m_labelX->setFrameStyle(QFrame::Sunken);
|
||||
m_ui->statusbar->addWidget(m_labelX, 1);
|
||||
m_labelY->setFrameStyle(QFrame::Sunken);
|
||||
m_ui->statusbar->addWidget(m_labelY, 1);
|
||||
m_labelArea->setFrameStyle(QFrame::Sunken);
|
||||
m_ui->statusbar->addWidget(m_labelArea, 4);
|
||||
|
||||
{
|
||||
auto frame = new QFrame{this};
|
||||
frame->setFrameStyle(QFrame::Sunken);
|
||||
m_ui->statusbar->addPermanentWidget(frame, 2);
|
||||
}
|
||||
|
||||
m_ui->lineEditName->setText(m_path.name);
|
||||
|
||||
connect(m_ui->lineEditName, &QLineEdit::textChanged,
|
||||
this, &PathPropertiesDialog::changed);
|
||||
}
|
||||
|
||||
PathPropertiesDialog::~PathPropertiesDialog() = default;
|
||||
|
||||
void PathPropertiesDialog::accept()
|
||||
{
|
||||
if (m_path.name != m_ui->lineEditName->text())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Not implemented"), tr("Changing the name is not yet implemented!"));
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void PathPropertiesDialog::reject()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
QDialog::reject();
|
||||
return;
|
||||
}
|
||||
|
||||
const auto result = QMessageBox::warning(
|
||||
this,
|
||||
tr("The Path has been modified."),
|
||||
tr("Do you want to save your changes?"),
|
||||
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
|
||||
QMessageBox::Save
|
||||
);
|
||||
switch (result)
|
||||
{
|
||||
case QMessageBox::Save:
|
||||
accept();
|
||||
return;
|
||||
case QMessageBox::Discard:
|
||||
QDialog::reject();
|
||||
return;
|
||||
case QMessageBox::Cancel:
|
||||
return;
|
||||
default:
|
||||
qWarning() << "unexpected dialog result" << result;
|
||||
}
|
||||
}
|
||||
|
||||
void PathPropertiesDialog::changed()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
setWindowTitle(tr("Path Properties: %0*").arg(m_path.name));
|
||||
m_unsavedChanges = true;
|
||||
}
|
||||
}
|
35
dialogs/pathpropertiesdialog.h
Normal file
@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
class QLabel;
|
||||
namespace Ui { class PathPropertiesDialog; }
|
||||
struct Path;
|
||||
|
||||
class PathPropertiesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PathPropertiesDialog(Path &path, QWidget *parent = nullptr);
|
||||
~PathPropertiesDialog();
|
||||
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
|
||||
private slots:
|
||||
void changed();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::PathPropertiesDialog> m_ui;
|
||||
|
||||
Path &m_path;
|
||||
|
||||
QLabel * const m_labelX;
|
||||
QLabel * const m_labelY;
|
||||
QLabel * const m_labelArea;
|
||||
|
||||
bool m_unsavedChanges{};
|
||||
};
|
333
dialogs/pathpropertiesdialog.ui
Normal file
@ -0,0 +1,333 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>PathPropertiesDialog</class>
|
||||
<widget class="QDialog" name="PathPropertiesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>728</width>
|
||||
<height>449</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Path Properties</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/dialogs/path-file.png</normaloff>:/qtgameengine/icons/dialogs/path-file.png</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::Panel</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
<property name="windowTitle">
|
||||
<string>toolBar</string>
|
||||
</property>
|
||||
<property name="movable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<addaction name="actionOk"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionUndo"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionClear"/>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelName">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>lineEditName</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEditName"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListView" name="listView">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelX">
|
||||
<property name="text">
|
||||
<string>X:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="spinBoxX"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="labelY">
|
||||
<property name="text">
|
||||
<string>Y:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="spinBoxY"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="labelSp">
|
||||
<property name="text">
|
||||
<string>sp:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QSpinBox" name="spinBox_3"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonAdd">
|
||||
<property name="text">
|
||||
<string>Add</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonInsert">
|
||||
<property name="text">
|
||||
<string>Insert</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonDelete">
|
||||
<property name="text">
|
||||
<string>Delete</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxConnectionKind">
|
||||
<property name="title">
|
||||
<string>connection kind</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonStraight">
|
||||
<property name="text">
|
||||
<string>Straight lines</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonSmooth">
|
||||
<property name="text">
|
||||
<string>Smooth curves</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelPrecision">
|
||||
<property name="text">
|
||||
<string>Precision:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="spinBoxPrecision"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxClosed">
|
||||
<property name="text">
|
||||
<string>Closed</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7" stretch="1,0">
|
||||
<item>
|
||||
<widget class="QWidget" name="widget" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStatusBar" name="statusbar"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
<action name="actionOk">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/ok.png</normaloff>:/qtgameengine/icons/actions/ok.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>OK</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Close the form, saving the changes</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionUndo">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/undo.png</normaloff>:/qtgameengine/icons/actions/undo.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Undo</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Undo the last changes in the path</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionClear">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/new.png</normaloff>:/qtgameengine/icons/actions/new.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Clear</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Clear the path</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>actionOk</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>PathPropertiesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>363</x>
|
||||
<y>224</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
17
dialogs/preferencesdialog.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "preferencesdialog.h"
|
||||
#include "ui_preferencesdialog.h"
|
||||
|
||||
PreferencesDialog::PreferencesDialog(QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::PreferencesDialog>()}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
setWindowFlags(windowFlags()
|
||||
& ~Qt::Dialog
|
||||
| Qt::Window
|
||||
| Qt::WindowMinimizeButtonHint
|
||||
| Qt::WindowMaximizeButtonHint
|
||||
| Qt::WindowCloseButtonHint);
|
||||
}
|
||||
|
||||
PreferencesDialog::~PreferencesDialog() = default;
|
19
dialogs/preferencesdialog.h
Normal file
@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class PreferencesDialog; }
|
||||
|
||||
class PreferencesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PreferencesDialog(QWidget *parent = nullptr);
|
||||
~PreferencesDialog();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::PreferencesDialog> m_ui;
|
||||
};
|
85
dialogs/preferencesdialog.ui
Normal file
@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>PreferencesDialog</class>
|
||||
<widget class="QDialog" name="PreferencesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Preferences</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="1,0">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<widget class="QWidget" name="tabGeneral">
|
||||
<attribute name="title">
|
||||
<string>General</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabForms">
|
||||
<attribute name="title">
|
||||
<string>Forms</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabScriptsAndCode">
|
||||
<attribute name="title">
|
||||
<string>Scripts and Code</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabEditors">
|
||||
<attribute name="title">
|
||||
<string>Editors</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>PreferencesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>199</x>
|
||||
<y>278</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>199</x>
|
||||
<y>149</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>PreferencesDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>199</x>
|
||||
<y>278</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>199</x>
|
||||
<y>149</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
158
dialogs/scriptpropertiesdialog.cpp
Normal file
@ -0,0 +1,158 @@
|
||||
#include "scriptpropertiesdialog.h"
|
||||
#include "ui_scriptpropertiesdialog.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QFont>
|
||||
#include <QLineEdit>
|
||||
#include <QLabel>
|
||||
#include <QTextBlock>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
#include "jshighlighter.h"
|
||||
|
||||
ScriptPropertiesDialog::ScriptPropertiesDialog(Script &script, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::ScriptPropertiesDialog>()},
|
||||
m_script{script},
|
||||
m_lineEditName{new QLineEdit{this}},
|
||||
m_labelPosition{new QLabel{this}}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
setWindowTitle(tr("Script Properties: %0").arg(m_script.name));
|
||||
|
||||
{
|
||||
auto label = new QLabel{tr("Name:"), this};
|
||||
label->setBuddy(m_lineEditName);
|
||||
m_ui->toolBar->addWidget(label);
|
||||
}
|
||||
m_lineEditName->setMaximumWidth(100);
|
||||
m_ui->toolBar->addWidget(m_lineEditName);
|
||||
|
||||
m_labelPosition->setFrameStyle(QFrame::Sunken);
|
||||
m_ui->statusbar->addWidget(m_labelPosition);
|
||||
|
||||
{
|
||||
QFont font;
|
||||
font.setFamily("Consolas");
|
||||
font.setFixedPitch(true);
|
||||
font.setPointSize(10);
|
||||
m_ui->codeEdit->setFont(font);
|
||||
}
|
||||
|
||||
new JSHighlighter{m_ui->codeEdit->document()};
|
||||
|
||||
m_lineEditName->setText(m_script.name);
|
||||
m_ui->codeEdit->setPlainText(m_script.script);
|
||||
|
||||
updatePosition();
|
||||
|
||||
connect(m_ui->actionLoad, &QAction::triggered,
|
||||
this, &ScriptPropertiesDialog::load);
|
||||
connect(m_ui->actionSave, &QAction::triggered,
|
||||
this, &ScriptPropertiesDialog::save);
|
||||
connect(m_ui->actionPrint, &QAction::triggered,
|
||||
this, &ScriptPropertiesDialog::print);
|
||||
|
||||
connect(m_lineEditName, &QLineEdit::textChanged,
|
||||
this, &ScriptPropertiesDialog::changed);
|
||||
connect(m_ui->codeEdit, &QPlainTextEdit::textChanged,
|
||||
this, &ScriptPropertiesDialog::changed);
|
||||
connect(m_ui->codeEdit, &QPlainTextEdit::textChanged,
|
||||
this, &ScriptPropertiesDialog::updatePosition);
|
||||
connect(m_ui->codeEdit, &QPlainTextEdit::cursorPositionChanged,
|
||||
this, &ScriptPropertiesDialog::updatePosition);
|
||||
}
|
||||
|
||||
ScriptPropertiesDialog::~ScriptPropertiesDialog() = default;
|
||||
|
||||
void ScriptPropertiesDialog::accept()
|
||||
{
|
||||
if (m_script.name != m_lineEditName->text())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Not implemented"), tr("Changing the name is not yet implemented!"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_script.script = m_ui->codeEdit->toPlainText();
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void ScriptPropertiesDialog::reject()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
QDialog::reject();
|
||||
return;
|
||||
}
|
||||
|
||||
const auto result = QMessageBox::warning(
|
||||
this,
|
||||
tr("The Script has been modified."),
|
||||
tr("Do you want to save your changes?"),
|
||||
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
|
||||
QMessageBox::Save
|
||||
);
|
||||
switch (result)
|
||||
{
|
||||
case QMessageBox::Save:
|
||||
accept();
|
||||
return;
|
||||
case QMessageBox::Discard:
|
||||
QDialog::reject();
|
||||
return;
|
||||
case QMessageBox::Cancel:
|
||||
return;
|
||||
default:
|
||||
qWarning() << "unexpected dialog result" << result;
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptPropertiesDialog::changed()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
setWindowTitle(tr("Script Properties: %0*").arg(m_script.name));
|
||||
m_unsavedChanges = true;
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptPropertiesDialog::load()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ScriptPropertiesDialog::save()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ScriptPropertiesDialog::print()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ScriptPropertiesDialog::updatePosition()
|
||||
{
|
||||
auto cursor = m_ui->codeEdit->textCursor();
|
||||
auto position = cursor.position();
|
||||
cursor.movePosition(QTextCursor::StartOfLine);
|
||||
position -= cursor.position() - 1;
|
||||
|
||||
int lines = 1;
|
||||
while (cursor.positionInBlock() > 0)
|
||||
{
|
||||
cursor.movePosition(QTextCursor::Up);
|
||||
//lines++;
|
||||
}
|
||||
QTextBlock block = cursor.block().previous();
|
||||
while (block.isValid())
|
||||
{
|
||||
lines += 1; //block.lineCount();
|
||||
block = block.previous();
|
||||
}
|
||||
|
||||
m_labelPosition->setText(tr("%0/%1: %2").arg(lines).arg(m_ui->codeEdit->blockCount()).arg(position));
|
||||
}
|
42
dialogs/scriptpropertiesdialog.h
Normal file
@ -0,0 +1,42 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
#include <memory>
|
||||
|
||||
class QLineEdit;
|
||||
class QLabel;
|
||||
namespace Ui { class ScriptPropertiesDialog; }
|
||||
struct Script;
|
||||
|
||||
class ScriptPropertiesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ScriptPropertiesDialog(Script &script, QWidget *parent = nullptr);
|
||||
~ScriptPropertiesDialog();
|
||||
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
|
||||
private slots:
|
||||
void changed();
|
||||
|
||||
void load();
|
||||
void save();
|
||||
void print();
|
||||
|
||||
void updatePosition();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::ScriptPropertiesDialog> m_ui;
|
||||
|
||||
Script &m_script;
|
||||
|
||||
QLineEdit * const m_lineEditName;
|
||||
|
||||
QLabel * const m_labelPosition;
|
||||
|
||||
bool m_unsavedChanges{};
|
||||
};
|
568
dialogs/scriptpropertiesdialog.ui
Normal file
@ -0,0 +1,568 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ScriptPropertiesDialog</class>
|
||||
<widget class="QDialog" name="ScriptPropertiesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>540</width>
|
||||
<height>497</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Script Properties</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/dialogs/script-file.png</normaloff>:/qtgameengine/icons/dialogs/script-file.png</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,1">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
<property name="windowTitle">
|
||||
<string>toolBar</string>
|
||||
</property>
|
||||
<property name="movable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>16</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<addaction name="actionOk"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionLoad"/>
|
||||
<addaction name="actionSave"/>
|
||||
<addaction name="actionPrint"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionUndo"/>
|
||||
<addaction name="actionRedo"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionCut"/>
|
||||
<addaction name="actionCopy"/>
|
||||
<addaction name="actionPaste"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionFind"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionCheck"/>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0">
|
||||
<item>
|
||||
<layout class="QVBoxLayout">
|
||||
<item>
|
||||
<widget class="CodeEditorWidget" name="codeEdit"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QStatusBar" name="statusbar">
|
||||
<property name="sizeGripEnabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="widgetSearch" native="true">
|
||||
<property name="visible">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,0,0">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxFind">
|
||||
<property name="title">
|
||||
<string>Find</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboBoxFind">
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxCaseSensitive">
|
||||
<property name="text">
|
||||
<string>Case Sensitive</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxWholeWord">
|
||||
<property name="text">
|
||||
<string>Whole word only</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="pushButtonFindFirst">
|
||||
<property name="text">
|
||||
<string>First</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="pushButtonFindPrev">
|
||||
<property name="text">
|
||||
<string>Previous</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="pushButtonFindNext">
|
||||
<property name="text">
|
||||
<string>Next</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="pushButtonFindLast">
|
||||
<property name="text">
|
||||
<string>Last</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxReplace">
|
||||
<property name="title">
|
||||
<string>Replace</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboBoxReplace">
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="pushButtonReplaceFirst">
|
||||
<property name="text">
|
||||
<string>First</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="pushButtonReplacePrevious">
|
||||
<property name="text">
|
||||
<string>Previous</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QPushButton" name="pushButtonReplaceNext">
|
||||
<property name="text">
|
||||
<string>Next</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QPushButton" name="pushButtonReplaceLast">
|
||||
<property name="text">
|
||||
<string>Last</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonReplaceAll">
|
||||
<property name="text">
|
||||
<string>Replace All</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<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>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
<action name="actionOk">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/ok.png</normaloff>:/qtgameengine/icons/actions/ok.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>OK</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionLoad">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/open.png</normaloff>:/qtgameengine/icons/actions/open.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Load</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Load the code from a text file</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSave">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/save.png</normaloff>:/qtgameengine/icons/actions/save.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Save the code to a text file</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPrint">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/print.png</normaloff>:/qtgameengine/icons/actions/print.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Print</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Print the code</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionUndo">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/undo.png</normaloff>:/qtgameengine/icons/actions/undo.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Undo</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Undo the last change</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionRedo">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/redo.png</normaloff>:/qtgameengine/icons/actions/redo.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Redo</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Redo the last undo</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCut">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/cut.png</normaloff>:/qtgameengine/icons/actions/cut.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Cut</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Cut the selected text into clipboard</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCopy">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/copy.png</normaloff>:/qtgameengine/icons/actions/copy.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Copy</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Copy the selected text to the clipboard</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPaste">
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/paste.png</normaloff>:/qtgameengine/icons/actions/paste.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Paste</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Paste the text from the clipboard</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFind">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/find.png</normaloff>:/qtgameengine/icons/actions/find.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Find</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Show the find and replace panel</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCheck">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/check.png</normaloff>:/qtgameengine/icons/actions/check.png</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Check</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Check the script for syntax errors</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>CodeEditorWidget</class>
|
||||
<extends>QPlainTextEdit</extends>
|
||||
<header>codeeditorwidget.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>actionOk</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>ScriptPropertiesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>269</x>
|
||||
<y>248</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>actionUndo</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>codeEdit</receiver>
|
||||
<slot>undo()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>actionRedo</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>codeEdit</receiver>
|
||||
<slot>redo()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>codeEdit</sender>
|
||||
<signal>undoAvailable(bool)</signal>
|
||||
<receiver>actionUndo</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>codeEdit</sender>
|
||||
<signal>redoAvailable(bool)</signal>
|
||||
<receiver>actionRedo</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>actionCut</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>codeEdit</receiver>
|
||||
<slot>cut()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>actionCopy</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>codeEdit</receiver>
|
||||
<slot>copy()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>actionPaste</sender>
|
||||
<signal>triggered()</signal>
|
||||
<receiver>codeEdit</receiver>
|
||||
<slot>paste()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>codeEdit</sender>
|
||||
<signal>copyAvailable(bool)</signal>
|
||||
<receiver>actionCut</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>codeEdit</sender>
|
||||
<signal>copyAvailable(bool)</signal>
|
||||
<receiver>actionCopy</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>269</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>actionFind</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>widgetSearch</receiver>
|
||||
<slot>setVisible(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>-1</x>
|
||||
<y>-1</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>499</x>
|
||||
<y>263</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
167
dialogs/soundpropertiesdialog.cpp
Normal file
@ -0,0 +1,167 @@
|
||||
#include "soundpropertiesdialog.h"
|
||||
#include "ui_soundpropertiesdialog.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QFileInfo>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
|
||||
SoundPropertiesDialog::SoundPropertiesDialog(Sound &sound, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::SoundPropertiesDialog>()},
|
||||
m_sound{sound}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
setWindowTitle(tr("Sound Properties: %0").arg(m_sound.name));
|
||||
|
||||
m_ui->lineEditName->setText(m_sound.name);
|
||||
m_ui->labelFilename->setText(tr("Filename: %0").arg(QFileInfo{m_sound.path}.fileName()));
|
||||
m_ui->radioButtonNormal->setChecked(m_sound.type == Sound::Type::Sound);
|
||||
m_ui->radioButtonMusic->setChecked(m_sound.type == Sound::Type::Music);
|
||||
m_ui->checkBoxChorus->setChecked(m_sound.effects.chorus);
|
||||
m_ui->checkBoxFlanger->setChecked(m_sound.effects.flanger);
|
||||
m_ui->checkBoxGargle->setChecked(m_sound.effects.gargle);
|
||||
m_ui->checkBoxEcho->setChecked(m_sound.effects.echo);
|
||||
m_ui->checkBoxReverb->setChecked(m_sound.effects.reverb);
|
||||
m_ui->horizontalSliderVolume->setValue(m_sound.volume);
|
||||
m_ui->horizontalSliderPan->setValue(m_sound.pan);
|
||||
m_ui->checkBoxPreload->setChecked(m_sound.preload);
|
||||
|
||||
connect(m_ui->pushButtonLoad, &QAbstractButton::pressed,
|
||||
this, &SoundPropertiesDialog::loadSound);
|
||||
connect(m_ui->pushButtonPlay, &QAbstractButton::pressed,
|
||||
this, &SoundPropertiesDialog::playSound);
|
||||
connect(m_ui->pushButtonStop, &QAbstractButton::pressed,
|
||||
this, &SoundPropertiesDialog::stopSound);
|
||||
connect(m_ui->pushButtonSave, &QAbstractButton::pressed,
|
||||
this, &SoundPropertiesDialog::saveSound);
|
||||
connect(m_ui->pushButtonEdit, &QAbstractButton::pressed,
|
||||
this, &SoundPropertiesDialog::editSound);
|
||||
|
||||
connect(m_ui->lineEditName, &QLineEdit::textChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->radioButtonNormal, &QRadioButton::toggled,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->radioButtonMusic, &QRadioButton::toggled,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->radioButton3D, &QRadioButton::toggled,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->radioButtonMultimedia, &QRadioButton::toggled,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxChorus, &QCheckBox::stateChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxFlanger, &QCheckBox::stateChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxGargle, &QCheckBox::stateChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxEcho, &QCheckBox::stateChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxReverb, &QCheckBox::stateChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->horizontalSliderVolume, &QSlider::valueChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->horizontalSliderPan, &QSlider::valueChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxPreload, &QCheckBox::stateChanged,
|
||||
this, &SoundPropertiesDialog::changed);
|
||||
}
|
||||
|
||||
SoundPropertiesDialog::~SoundPropertiesDialog() = default;
|
||||
|
||||
void SoundPropertiesDialog::accept()
|
||||
{
|
||||
if (m_sound.name != m_ui->lineEditName->text())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Not implemented"), tr("Changing the name is not yet implemented!"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_ui->radioButtonNormal->isChecked())
|
||||
m_sound.type = Sound::Type::Sound;
|
||||
else if (m_ui->radioButtonMusic->isChecked())
|
||||
m_sound.type = Sound::Type::Music;
|
||||
else
|
||||
{
|
||||
QMessageBox::critical(this, tr("Not implemented"), tr("This kind of sound is not yet supported!"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_sound.effects.chorus = m_ui->checkBoxChorus->isChecked();
|
||||
m_sound.effects.flanger = m_ui->checkBoxFlanger->isChecked();
|
||||
m_sound.effects.gargle = m_ui->checkBoxGargle->isChecked();
|
||||
m_sound.effects.echo = m_ui->checkBoxEcho->isChecked();
|
||||
m_sound.effects.reverb = m_ui->checkBoxReverb->isChecked();
|
||||
m_sound.volume = m_ui->horizontalSliderVolume->value();
|
||||
m_sound.pan = m_ui->horizontalSliderPan->value();
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void SoundPropertiesDialog::reject()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
QDialog::reject();
|
||||
return;
|
||||
}
|
||||
|
||||
const auto result = QMessageBox::warning(
|
||||
this,
|
||||
tr("The Sound has been modified."),
|
||||
tr("Do you want to save your changes?"),
|
||||
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
|
||||
QMessageBox::Save
|
||||
);
|
||||
switch (result)
|
||||
{
|
||||
case QMessageBox::Save:
|
||||
accept();
|
||||
return;
|
||||
case QMessageBox::Discard:
|
||||
QDialog::reject();
|
||||
return;
|
||||
case QMessageBox::Cancel:
|
||||
return;
|
||||
default:
|
||||
qWarning() << "unexpected dialog result" << result;
|
||||
}
|
||||
}
|
||||
|
||||
void SoundPropertiesDialog::loadSound()
|
||||
{
|
||||
QFileDialog::getOpenFileName(this, tr("Open a Sound File..."));
|
||||
}
|
||||
|
||||
void SoundPropertiesDialog::playSound()
|
||||
{
|
||||
m_soundEffect.setSource(QUrl::fromLocalFile(m_sound.path));
|
||||
m_soundEffect.stop();
|
||||
m_soundEffect.play();
|
||||
}
|
||||
|
||||
void SoundPropertiesDialog::stopSound()
|
||||
{
|
||||
m_soundEffect.stop();
|
||||
}
|
||||
|
||||
void SoundPropertiesDialog::saveSound()
|
||||
{
|
||||
QFileDialog::getSaveFileName(this, tr("Save a Sound File..."), m_sound.name + ".wav", tr("WAV Files (*.wav)"));
|
||||
}
|
||||
|
||||
void SoundPropertiesDialog::editSound()
|
||||
{
|
||||
QMessageBox::critical(this, tr("Setup not complete"), tr("No valid external editor has been indicated for this type of sound. You can specify this editor in the Preferences."));
|
||||
}
|
||||
|
||||
void SoundPropertiesDialog::changed()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
setWindowTitle(tr("Sound Properties: %0*").arg(m_sound.name));
|
||||
m_unsavedChanges = true;
|
||||
}
|
||||
}
|
40
dialogs/soundpropertiesdialog.h
Normal file
@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
#include <QString>
|
||||
#include <QSoundEffect>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class SoundPropertiesDialog; }
|
||||
struct Sound;
|
||||
|
||||
class SoundPropertiesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SoundPropertiesDialog(Sound &sound, QWidget *parent = nullptr);
|
||||
~SoundPropertiesDialog();
|
||||
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
|
||||
private slots:
|
||||
void loadSound();
|
||||
void playSound();
|
||||
void stopSound();
|
||||
void saveSound();
|
||||
void editSound();
|
||||
|
||||
void changed();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::SoundPropertiesDialog> m_ui;
|
||||
|
||||
Sound &m_sound;
|
||||
|
||||
bool m_unsavedChanges{};
|
||||
|
||||
QSoundEffect m_soundEffect;
|
||||
};
|
354
dialogs/soundpropertiesdialog.ui
Normal file
@ -0,0 +1,354 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SoundPropertiesDialog</class>
|
||||
<widget class="QDialog" name="SoundPropertiesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>239</width>
|
||||
<height>534</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Sound Properties</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/dialogs/sound-file.png</normaloff>:/qtgameengine/icons/dialogs/sound-file.png</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelName">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>lineEditName</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lineEditName"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,0">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonLoad">
|
||||
<property name="text">
|
||||
<string>&Load Sound</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/open.png</normaloff>:/qtgameengine/icons/actions/open.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonPlay">
|
||||
<property name="toolTip">
|
||||
<string>Play the sound</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/run.png</normaloff>:/qtgameengine/icons/actions/run.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonStop">
|
||||
<property name="toolTip">
|
||||
<string>Stop the sound</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/exit.png</normaloff>:/qtgameengine/icons/actions/exit.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonSave">
|
||||
<property name="text">
|
||||
<string>Sa&ve Sound</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/save.png</normaloff>:/qtgameengine/icons/actions/save.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelFilename">
|
||||
<property name="text">
|
||||
<string>Filename:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxKind">
|
||||
<property name="title">
|
||||
<string>Kind</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonNormal">
|
||||
<property name="text">
|
||||
<string>Normal Sound</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonMusic">
|
||||
<property name="text">
|
||||
<string>Background Music</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButton3D">
|
||||
<property name="text">
|
||||
<string>3D Sound</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioButtonMultimedia">
|
||||
<property name="text">
|
||||
<string>Use multimedia player</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxEffects">
|
||||
<property name="title">
|
||||
<string>Effects</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxFlanger">
|
||||
<property name="text">
|
||||
<string>Flanger</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxChorus">
|
||||
<property name="text">
|
||||
<string>Chorus</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxGargle">
|
||||
<property name="text">
|
||||
<string>Gargle</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="checkBoxEcho">
|
||||
<property name="text">
|
||||
<string>Echo</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="checkBoxReverb">
|
||||
<property name="text">
|
||||
<string>Reverb</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelVolume">
|
||||
<property name="text">
|
||||
<string>Volume:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>horizontalSliderVolume</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSlider" name="horizontalSliderVolume">
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="labelPan">
|
||||
<property name="text">
|
||||
<string>Pan:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>horizontalSliderPan</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSlider" name="horizontalSliderPan">
|
||||
<property name="minimum">
|
||||
<number>-100</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="invertedAppearance">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="invertedControls">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxPreload">
|
||||
<property name="text">
|
||||
<string>&Preload</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonEdit">
|
||||
<property name="text">
|
||||
<string>&Edit Sound</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/sound.png</normaloff>:/qtgameengine/icons/actions/sound.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonOk">
|
||||
<property name="text">
|
||||
<string>&OK</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/buttons/ok.png</normaloff>:/qtgameengine/icons/buttons/ok.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>pushButtonOk</sender>
|
||||
<signal>pressed()</signal>
|
||||
<receiver>SoundPropertiesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>119</x>
|
||||
<y>534</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>119</x>
|
||||
<y>279</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
133
dialogs/spritepropertiesdialog.cpp
Normal file
@ -0,0 +1,133 @@
|
||||
#include "spritepropertiesdialog.h"
|
||||
#include "ui_spritepropertiesdialog.h"
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "projectcontainer.h"
|
||||
#include "editspritedialog.h"
|
||||
|
||||
SpritePropertiesDialog::SpritePropertiesDialog(Sprite &sprite, QWidget *parent) :
|
||||
QDialog{parent},
|
||||
m_ui{std::make_unique<Ui::SpritePropertiesDialog>()},
|
||||
m_sprite{sprite}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
setWindowTitle(tr("Sprite Properties: %0").arg(m_sprite.name));
|
||||
|
||||
m_ui->lineEditName->setText(m_sprite.name);
|
||||
m_ui->labelWidth->setText(tr("Width: %0").arg(m_sprite.pixmaps.empty() ? tr("n/a") : QString::number(m_sprite.pixmaps.front().width())));
|
||||
m_ui->labelHeight->setText(tr("Height: %0").arg(m_sprite.pixmaps.empty() ? tr("n/a") : QString::number(m_sprite.pixmaps.front().height())));
|
||||
m_ui->labelSubimages->setText(tr("Number of subimages: %0").arg(m_sprite.pixmaps.size()));
|
||||
m_ui->spinBoxOriginX->setValue(m_sprite.origin.x);
|
||||
m_ui->spinBoxOriginY->setValue(m_sprite.origin.y);
|
||||
m_ui->checkBoxPreciseCollisionChecking->setChecked(m_sprite.preciseCollisionChecking);
|
||||
m_ui->checkBoxSeparateCollisionMasks->setChecked(m_sprite.separateCollisionMasks);
|
||||
m_ui->labelPreview->setPixmap(m_sprite.pixmaps.empty() ? QPixmap{} : m_sprite.pixmaps.front());
|
||||
|
||||
connect(m_ui->pushButtonLoad, &QAbstractButton::pressed,
|
||||
this, &SpritePropertiesDialog::loadSprite);
|
||||
connect(m_ui->pushButtonSave, &QAbstractButton::pressed,
|
||||
this, &SpritePropertiesDialog::saveSprite);
|
||||
connect(m_ui->pushButtonEdit, &QAbstractButton::pressed,
|
||||
this, &SpritePropertiesDialog::editSprite);
|
||||
connect(m_ui->pushButtonCenterOrigin, &QAbstractButton::pressed,
|
||||
this, &SpritePropertiesDialog::centerOrigin);
|
||||
|
||||
connect(m_ui->lineEditName, &QLineEdit::textChanged,
|
||||
this, &SpritePropertiesDialog::changed);
|
||||
connect(m_ui->spinBoxOriginX, &QSpinBox::valueChanged,
|
||||
this, &SpritePropertiesDialog::changed);
|
||||
connect(m_ui->spinBoxOriginY, &QSpinBox::valueChanged,
|
||||
this, &SpritePropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxPreciseCollisionChecking, &QCheckBox::stateChanged,
|
||||
this, &SpritePropertiesDialog::changed);
|
||||
connect(m_ui->checkBoxSeparateCollisionMasks, &QCheckBox::stateChanged,
|
||||
this, &SpritePropertiesDialog::changed);
|
||||
}
|
||||
|
||||
SpritePropertiesDialog::~SpritePropertiesDialog() = default;
|
||||
|
||||
void SpritePropertiesDialog::accept()
|
||||
{
|
||||
if (m_sprite.name != m_ui->lineEditName->text())
|
||||
{
|
||||
QMessageBox::critical(this, tr("Not implemented"), tr("Changing the name is not yet implemented!"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_sprite.origin.x = m_ui->spinBoxOriginX->value();
|
||||
m_sprite.origin.y = m_ui->spinBoxOriginY->value();
|
||||
m_sprite.preciseCollisionChecking = m_ui->checkBoxPreciseCollisionChecking->isChecked();
|
||||
m_sprite.separateCollisionMasks = m_ui->checkBoxSeparateCollisionMasks->isChecked();
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void SpritePropertiesDialog::reject()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
QDialog::reject();
|
||||
return;
|
||||
}
|
||||
|
||||
const auto result = QMessageBox::warning(
|
||||
this,
|
||||
tr("The Sprite has been modified."),
|
||||
tr("Do you want to save your changes?"),
|
||||
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel,
|
||||
QMessageBox::Save
|
||||
);
|
||||
switch (result)
|
||||
{
|
||||
case QMessageBox::Save:
|
||||
accept();
|
||||
return;
|
||||
case QMessageBox::Discard:
|
||||
QDialog::reject();
|
||||
return;
|
||||
case QMessageBox::Cancel:
|
||||
return;
|
||||
default:
|
||||
qWarning() << "unexpected dialog result" << result;
|
||||
}
|
||||
}
|
||||
|
||||
void SpritePropertiesDialog::loadSprite()
|
||||
{
|
||||
QFileDialog::getOpenFileName(this, tr("Open a Sprite Image..."));
|
||||
}
|
||||
|
||||
void SpritePropertiesDialog::saveSprite()
|
||||
{
|
||||
QFileDialog::getSaveFileName(this, tr("Save a Sprite Image..."), m_sprite.name + ".png", tr("PNG Files (*.png)"));
|
||||
}
|
||||
|
||||
void SpritePropertiesDialog::editSprite()
|
||||
{
|
||||
EditSpriteDialog{m_sprite}.exec();
|
||||
}
|
||||
|
||||
void SpritePropertiesDialog::centerOrigin()
|
||||
{
|
||||
if (m_sprite.pixmaps.empty())
|
||||
{
|
||||
qDebug() << "unexpected empty pixmaps";
|
||||
return;
|
||||
}
|
||||
|
||||
m_ui->spinBoxOriginX->setValue(m_sprite.pixmaps.front().width() / 2);
|
||||
m_ui->spinBoxOriginY->setValue(m_sprite.pixmaps.front().height() / 2);
|
||||
}
|
||||
|
||||
void SpritePropertiesDialog::changed()
|
||||
{
|
||||
if (!m_unsavedChanges)
|
||||
{
|
||||
setWindowTitle(tr("Sprite Properties: %0*").arg(m_sprite.name));
|
||||
m_unsavedChanges = true;
|
||||
}
|
||||
}
|
36
dialogs/spritepropertiesdialog.h
Normal file
@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDialog>
|
||||
#include <QString>
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace Ui { class SpritePropertiesDialog; }
|
||||
struct Sprite;
|
||||
|
||||
class SpritePropertiesDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SpritePropertiesDialog(Sprite &sprite, QWidget *parent = nullptr);
|
||||
~SpritePropertiesDialog();
|
||||
|
||||
void accept() override;
|
||||
void reject() override;
|
||||
|
||||
private slots:
|
||||
void loadSprite();
|
||||
void saveSprite();
|
||||
void editSprite();
|
||||
void centerOrigin();
|
||||
|
||||
void changed();
|
||||
|
||||
private:
|
||||
const std::unique_ptr<Ui::SpritePropertiesDialog> m_ui;
|
||||
|
||||
Sprite &m_sprite;
|
||||
|
||||
bool m_unsavedChanges{};
|
||||
};
|
360
dialogs/spritepropertiesdialog.ui
Normal file
@ -0,0 +1,360 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SpritePropertiesDialog</class>
|
||||
<widget class="QDialog" name="SpritePropertiesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>560</width>
|
||||
<height>344</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Sprite Properties</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/dialogs/sprite-file.png</normaloff>:/qtgameengine/icons/dialogs/sprite-file.png</iconset>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,1">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="labelName">
|
||||
<property name="text">
|
||||
<string>Name:</string>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>lineEditName</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lineEditName"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonLoad">
|
||||
<property name="text">
|
||||
<string>&Load Sprite</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/open.png</normaloff>:/qtgameengine/icons/actions/open.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonSave">
|
||||
<property name="text">
|
||||
<string>&Save Sprite</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/actions/save.png</normaloff>:/qtgameengine/icons/actions/save.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonEdit">
|
||||
<property name="text">
|
||||
<string>&Edit Sprite</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/buttons/edit.png</normaloff>:/qtgameengine/icons/buttons/edit.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelHeight">
|
||||
<property name="text">
|
||||
<string>Height:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelWidth">
|
||||
<property name="text">
|
||||
<string>Width:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelSubimages">
|
||||
<property name="text">
|
||||
<string>Number of subimages:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxOrigin">
|
||||
<property name="title">
|
||||
<string>Origin</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="labelOriginX">
|
||||
<property name="text">
|
||||
<string>X:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>spinBoxOriginX</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinBoxOriginX"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelOriginY">
|
||||
<property name="text">
|
||||
<string>Y:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="buddy">
|
||||
<cstring>spinBoxOriginY</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinBoxOriginY"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_5">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonCenterOrigin">
|
||||
<property name="text">
|
||||
<string>&Center</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_6">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonOk">
|
||||
<property name="text">
|
||||
<string>Ok</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../resources.qrc">
|
||||
<normaloff>:/qtgameengine/icons/buttons/ok.png</normaloff>:/qtgameengine/icons/buttons/ok.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBoxCollisionChecking">
|
||||
<property name="title">
|
||||
<string>Collision Checking</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxPreciseCollisionChecking">
|
||||
<property name="text">
|
||||
<string>&Precise collision checking</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkBoxSeparateCollisionMasks">
|
||||
<property name="text">
|
||||
<string>Separa&te Collision Masks</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButtonModifyCollisionmask">
|
||||
<property name="text">
|
||||
<string>&Modify Mask</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</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>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QLabel" name="labelPreview">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>124</width>
|
||||
<height>324</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
</property>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../resources.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>pushButtonOk</sender>
|
||||
<signal>pressed()</signal>
|
||||
<receiver>SpritePropertiesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>106</x>
|
||||
<y>320</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>279</x>
|
||||
<y>171</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
30
futurecpp.h
Normal file
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
// system includes
|
||||
#include <cstring>
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
|
||||
// C++20 backports (until espressif finally updates their aged compiler suite)
|
||||
|
||||
namespace std {
|
||||
template <class To, class From>
|
||||
typename std::enable_if_t<
|
||||
sizeof(To) == sizeof(From) && std::is_trivially_copyable_v<From> && std::is_trivially_copyable_v<To>,
|
||||
To>
|
||||
// constexpr support needs compiler magic
|
||||
bit_cast(const From& src) noexcept
|
||||
{
|
||||
static_assert(std::is_trivially_constructible_v<To>,
|
||||
"This implementation additionally requires destination type to be trivially constructible");
|
||||
|
||||
To dst;
|
||||
std::memcpy(&dst, &src, sizeof(To));
|
||||
return dst;
|
||||
}
|
||||
|
||||
template <typename EnumT, typename = std::enable_if_t<std::is_enum<EnumT>{}>>
|
||||
constexpr std::underlying_type_t<EnumT> to_underlying(EnumT e) noexcept {
|
||||
return static_cast<std::underlying_type_t<EnumT>>(e);
|
||||
}
|
||||
} // namespace std
|
BIN
icons/actions/background.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
icons/actions/cascade.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
icons/actions/check.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
icons/actions/copy.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
icons/actions/create-executable.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
icons/actions/create-group.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
icons/actions/create.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
icons/actions/cut.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
icons/actions/debug.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/actions/delete.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
icons/actions/duplicate.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
icons/actions/exit.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
icons/actions/export-resources.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
icons/actions/extension-packages.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
icons/actions/find.png
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
icons/actions/font.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
icons/actions/game-information.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
icons/actions/global-game-settings.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
icons/actions/help.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
icons/actions/import-resources.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
icons/actions/new.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
icons/actions/object.png
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
icons/actions/ok.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
icons/actions/open.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
icons/actions/paste.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
icons/actions/path.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
icons/actions/preferences.png
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
icons/actions/print.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
icons/actions/properties.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
icons/actions/publish-game.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
icons/actions/redo.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
icons/actions/rename.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
icons/actions/room.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
icons/actions/run.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
icons/actions/save-as.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
icons/actions/save.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
icons/actions/script.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
icons/actions/sound.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
icons/actions/sprite.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/actions/tile.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/actions/timeline.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
icons/actions/undo.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
icons/buttons/edit.png
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
icons/buttons/ok.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
icons/dialogs/background-file.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/dialogs/font-file.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
icons/dialogs/path-file.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/dialogs/script-file.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
icons/dialogs/sound-file.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
icons/dialogs/sprite-file.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/tree/extension-packages.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
icons/tree/folder.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
icons/tree/font-file.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
icons/tree/game-information.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
icons/tree/global-game-settings.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
icons/tree/music-file.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/tree/path-file.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
icons/tree/script-file.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
icons/tree/sound-file.png
Normal file
After Width: | Height: | Size: 13 KiB |
449
jshighlighter.cpp
Normal file
@ -0,0 +1,449 @@
|
||||
#include "jshighlighter.h"
|
||||
|
||||
class JSBlockData : public QTextBlockUserData
|
||||
{
|
||||
public:
|
||||
QList<int> bracketPositions;
|
||||
};
|
||||
|
||||
JSHighlighter::JSHighlighter(QTextDocument *parent) :
|
||||
QSyntaxHighlighter{parent},
|
||||
m_colors {
|
||||
// default color scheme
|
||||
{ Normal, QColor("#000000") },
|
||||
{ Comment, QColor("#808080") },
|
||||
{ Number, QColor("#008000") },
|
||||
{ String, QColor("#800000") },
|
||||
{ Operator, QColor("#808000") },
|
||||
{ Identifier, QColor("#000020") },
|
||||
{ Keyword, QColor("#000080") },
|
||||
{ BuiltIn, QColor("#008080") },
|
||||
{ Marker, QColor("#ffff00") },
|
||||
},
|
||||
m_keywords {
|
||||
// https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words
|
||||
"break",
|
||||
"case",
|
||||
"catch",
|
||||
"continue",
|
||||
"default",
|
||||
"delete",
|
||||
"do",
|
||||
"else",
|
||||
"finally",
|
||||
"for",
|
||||
"function",
|
||||
"if",
|
||||
"in",
|
||||
"instanceof",
|
||||
"new",
|
||||
"return",
|
||||
"switch",
|
||||
"this",
|
||||
"throw",
|
||||
"try",
|
||||
"typeof",
|
||||
"var",
|
||||
"void",
|
||||
"while",
|
||||
"with",
|
||||
|
||||
"true",
|
||||
"false",
|
||||
"null",
|
||||
},
|
||||
m_knownIds {
|
||||
// built-in and other popular objects + properties
|
||||
"Object",
|
||||
"prototype",
|
||||
"create",
|
||||
"defineProperty",
|
||||
"defineProperties",
|
||||
"getOwnPropertyDescriptor",
|
||||
"keys",
|
||||
"getOwnPropertyNames",
|
||||
"constructor",
|
||||
"__parent__",
|
||||
"__proto__",
|
||||
"__defineGetter__",
|
||||
"__defineSetter__",
|
||||
"eval",
|
||||
"hasOwnProperty",
|
||||
"isPrototypeOf",
|
||||
"__lookupGetter__",
|
||||
"__lookupSetter__",
|
||||
"__noSuchMethod__",
|
||||
"propertyIsEnumerable",
|
||||
"toSource",
|
||||
"toLocaleString",
|
||||
"toString",
|
||||
"unwatch",
|
||||
"valueOf",
|
||||
"watch",
|
||||
|
||||
"Function",
|
||||
"arguments",
|
||||
"arity",
|
||||
"caller",
|
||||
"constructor",
|
||||
"length",
|
||||
"name",
|
||||
"apply",
|
||||
"bind",
|
||||
"call",
|
||||
|
||||
"String",
|
||||
"fromCharCode",
|
||||
"length",
|
||||
"charAt",
|
||||
"charCodeAt",
|
||||
"concat",
|
||||
"indexOf",
|
||||
"lastIndexOf",
|
||||
"localCompare",
|
||||
"match",
|
||||
"quote",
|
||||
"replace",
|
||||
"search",
|
||||
"slice",
|
||||
"split",
|
||||
"substr",
|
||||
"substring",
|
||||
"toLocaleLowerCase",
|
||||
"toLocaleUpperCase",
|
||||
"toLowerCase",
|
||||
"toUpperCase",
|
||||
"trim",
|
||||
"trimLeft",
|
||||
"trimRight",
|
||||
|
||||
"Array",
|
||||
"isArray",
|
||||
"index",
|
||||
"input",
|
||||
"pop",
|
||||
"push",
|
||||
"reverse",
|
||||
"shift",
|
||||
"sort",
|
||||
"splice",
|
||||
"unshift",
|
||||
"concat",
|
||||
"join",
|
||||
"filter",
|
||||
"forEach",
|
||||
"every",
|
||||
"map",
|
||||
"some",
|
||||
"reduce",
|
||||
"reduceRight",
|
||||
|
||||
"RegExp",
|
||||
"global",
|
||||
"ignoreCase",
|
||||
"lastIndex",
|
||||
"multiline",
|
||||
"source",
|
||||
"exec",
|
||||
"test",
|
||||
|
||||
"JSON",
|
||||
"parse",
|
||||
"stringify",
|
||||
|
||||
"decodeURI",
|
||||
"decodeURIComponent",
|
||||
"encodeURI",
|
||||
"encodeURIComponent",
|
||||
"eval",
|
||||
"isFinite",
|
||||
"isNaN",
|
||||
"parseFloat",
|
||||
"parseInt",
|
||||
"Infinity",
|
||||
"NaN",
|
||||
"undefined",
|
||||
|
||||
"Math",
|
||||
"E",
|
||||
"LN2",
|
||||
"LN10",
|
||||
"LOG2E",
|
||||
"LOG10E",
|
||||
"PI",
|
||||
"SQRT1_2",
|
||||
"SQRT2",
|
||||
"abs",
|
||||
"acos",
|
||||
"asin",
|
||||
"atan",
|
||||
"atan2",
|
||||
"ceil",
|
||||
"cos",
|
||||
"exp",
|
||||
"floor",
|
||||
"log",
|
||||
"max",
|
||||
"min",
|
||||
"pow",
|
||||
"random",
|
||||
"round",
|
||||
"sin",
|
||||
"sqrt",
|
||||
"tan",
|
||||
|
||||
"document",
|
||||
"window",
|
||||
"navigator",
|
||||
"userAgent",
|
||||
},
|
||||
m_markCaseSensitivity{Qt::CaseInsensitive}
|
||||
{
|
||||
}
|
||||
|
||||
void JSHighlighter::setColor(ColorComponent component, const QColor &color)
|
||||
{
|
||||
m_colors[component] = color;
|
||||
rehighlight();
|
||||
}
|
||||
|
||||
void JSHighlighter::highlightBlock(const QString &text)
|
||||
{
|
||||
// parsing state
|
||||
enum {
|
||||
Start = 0,
|
||||
Number = 1,
|
||||
Identifier = 2,
|
||||
String = 3,
|
||||
Comment = 4,
|
||||
Regex = 5
|
||||
};
|
||||
|
||||
QList<int> bracketPositions;
|
||||
|
||||
int blockState = previousBlockState();
|
||||
int bracketLevel = blockState >> 4;
|
||||
int state = blockState & 15;
|
||||
if (blockState < 0)
|
||||
{
|
||||
bracketLevel = 0;
|
||||
state = Start;
|
||||
}
|
||||
|
||||
int start = 0;
|
||||
int i = 0;
|
||||
while (i <= text.length())
|
||||
{
|
||||
QChar ch = (i < text.length()) ? text.at(i) : QChar();
|
||||
QChar next = (i < text.length() - 1) ? text.at(i + 1) : QChar();
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case Start:
|
||||
start = i;
|
||||
if (ch.isSpace())
|
||||
{
|
||||
++i;
|
||||
}
|
||||
else if (ch.isDigit())
|
||||
{
|
||||
++i;
|
||||
state = Number;
|
||||
}
|
||||
else if (ch.isLetter() || ch == '_')
|
||||
{
|
||||
++i;
|
||||
state = Identifier;
|
||||
}
|
||||
else if (ch == '\'' || ch == '\"')
|
||||
{
|
||||
++i;
|
||||
state = String;
|
||||
}
|
||||
else if (ch == '/' && next == '*')
|
||||
{
|
||||
++i;
|
||||
++i;
|
||||
state = Comment;
|
||||
}
|
||||
else if (ch == '/' && next == '/')
|
||||
{
|
||||
i = text.length();
|
||||
setFormat(start, text.length(), m_colors[ColorComponent::Comment]);
|
||||
}
|
||||
else if (ch == '/' && next != '*')
|
||||
{
|
||||
++i;
|
||||
state = Regex;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!QString("(){}[]").contains(ch))
|
||||
setFormat(start, 1, m_colors[Operator]);
|
||||
if (ch =='{' || ch == '}')
|
||||
{
|
||||
bracketPositions += i;
|
||||
if (ch == '{')
|
||||
bracketLevel++;
|
||||
else
|
||||
bracketLevel--;
|
||||
}
|
||||
++i;
|
||||
state = Start;
|
||||
}
|
||||
break;
|
||||
|
||||
case Number:
|
||||
if (ch.isSpace() || !ch.isDigit())
|
||||
{
|
||||
setFormat(start, i - start, m_colors[ColorComponent::Number]);
|
||||
state = Start;
|
||||
}
|
||||
else
|
||||
{
|
||||
++i;
|
||||
}
|
||||
break;
|
||||
|
||||
case Identifier:
|
||||
if (ch.isSpace() || !(ch.isDigit() || ch.isLetter() || ch == '_'))
|
||||
{
|
||||
QString token = text.mid(start, i - start).trimmed();
|
||||
if (m_keywords.contains(token))
|
||||
setFormat(start, i - start, m_colors[Keyword]);
|
||||
else if (m_knownIds.contains(token))
|
||||
setFormat(start, i - start, m_colors[BuiltIn]);
|
||||
state = Start;
|
||||
}
|
||||
else
|
||||
{
|
||||
++i;
|
||||
}
|
||||
break;
|
||||
|
||||
case String:
|
||||
if (ch == text.at(start)) {
|
||||
QChar prev = (i > 0) ? text.at(i - 1) : QChar();
|
||||
if (prev != '\\') {
|
||||
++i;
|
||||
setFormat(start, i - start, m_colors[ColorComponent::String]);
|
||||
state = Start;
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
break;
|
||||
|
||||
case Comment:
|
||||
if (ch == '*' && next == '/')
|
||||
{
|
||||
++i;
|
||||
++i;
|
||||
setFormat(start, i - start, m_colors[ColorComponent::Comment]);
|
||||
state = Start;
|
||||
}
|
||||
else
|
||||
{
|
||||
++i;
|
||||
}
|
||||
break;
|
||||
|
||||
case Regex:
|
||||
if (ch == '/')
|
||||
{
|
||||
QChar prev = (i > 0) ? text.at(i - 1) : QChar();
|
||||
if (prev != '\\')
|
||||
{
|
||||
++i;
|
||||
setFormat(start, i - start, m_colors[ColorComponent::String]);
|
||||
state = Start;
|
||||
}
|
||||
else
|
||||
{
|
||||
++i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
++i;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
state = Start;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (state == Comment)
|
||||
setFormat(start, text.length(), m_colors[ColorComponent::Comment]);
|
||||
else
|
||||
state = Start;
|
||||
|
||||
if (!m_markString.isEmpty())
|
||||
{
|
||||
int pos = 0;
|
||||
int len = m_markString.length();
|
||||
QTextCharFormat markerFormat;
|
||||
markerFormat.setBackground(m_colors[Marker]);
|
||||
markerFormat.setForeground(m_colors[Normal]);
|
||||
for (;;)
|
||||
{
|
||||
pos = text.indexOf(m_markString, pos, m_markCaseSensitivity);
|
||||
if (pos < 0)
|
||||
break;
|
||||
setFormat(pos, len, markerFormat);
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bracketPositions.isEmpty())
|
||||
{
|
||||
JSBlockData *blockData = reinterpret_cast<JSBlockData*>(currentBlock().userData());
|
||||
if (!blockData)
|
||||
{
|
||||
blockData = new JSBlockData;
|
||||
currentBlock().setUserData(blockData);
|
||||
}
|
||||
blockData->bracketPositions = bracketPositions;
|
||||
}
|
||||
|
||||
blockState = (state & 15) | (bracketLevel << 4);
|
||||
setCurrentBlockState(blockState);
|
||||
}
|
||||
|
||||
void JSHighlighter::mark(const QString &str, Qt::CaseSensitivity caseSensitivity)
|
||||
{
|
||||
m_markString = str;
|
||||
m_markCaseSensitivity = caseSensitivity;
|
||||
rehighlight();
|
||||
}
|
||||
|
||||
QStringList JSHighlighter::keywords() const
|
||||
{
|
||||
return QStringList{std::begin(m_keywords), std::end(m_keywords)};
|
||||
}
|
||||
|
||||
void JSHighlighter::setKeywords(std::set<QString> &&keywords)
|
||||
{
|
||||
m_keywords = std::move(keywords);
|
||||
rehighlight();
|
||||
}
|
||||
|
||||
void JSHighlighter::setKeywords(const std::set<QString> &keywords)
|
||||
{
|
||||
m_keywords = keywords;
|
||||
rehighlight();
|
||||
}
|
||||
|
||||
struct BlockInfo
|
||||
{
|
||||
int position;
|
||||
int number;
|
||||
bool foldable: 1;
|
||||
bool folded : 1;
|
||||
};
|
||||
|
||||
Q_DECLARE_TYPEINFO(BlockInfo, Q_PRIMITIVE_TYPE);
|
48
jshighlighter.h
Normal file
@ -0,0 +1,48 @@
|
||||
#pragma once
|
||||
|
||||
#include <QSyntaxHighlighter>
|
||||
|
||||
#include <set>
|
||||
#include <unordered_map>
|
||||
|
||||
enum ColorComponent {
|
||||
Background,
|
||||
Normal,
|
||||
Comment,
|
||||
Number,
|
||||
String,
|
||||
Operator,
|
||||
Identifier,
|
||||
Keyword,
|
||||
BuiltIn,
|
||||
Sidebar,
|
||||
LineNumber,
|
||||
Cursor,
|
||||
Marker,
|
||||
BracketMatch,
|
||||
BracketError,
|
||||
FoldIndicator
|
||||
};
|
||||
|
||||
class JSHighlighter : public QSyntaxHighlighter
|
||||
{
|
||||
public:
|
||||
JSHighlighter(QTextDocument *parent = 0);
|
||||
void setColor(ColorComponent component, const QColor &color);
|
||||
void mark(const QString &str, Qt::CaseSensitivity caseSensitivity);
|
||||
|
||||
QStringList keywords() const;
|
||||
void setKeywords(std::set<QString> &&keywords);
|
||||
void setKeywords(const std::set<QString> &keywords);
|
||||
|
||||
protected:
|
||||
void highlightBlock(const QString &text);
|
||||
|
||||
private:
|
||||
std::unordered_map<ColorComponent, QColor> m_colors;
|
||||
std::set<QString> m_keywords;
|
||||
std::set<QString> m_knownIds;
|
||||
|
||||
QString m_markString;
|
||||
Qt::CaseSensitivity m_markCaseSensitivity;
|
||||
};
|
30
main.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
#include <QApplication>
|
||||
#include <QStyleFactory>
|
||||
#include <QDebug>
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
qSetMessagePattern(QStringLiteral("%{time dd.MM.yyyy HH:mm:ss.zzz} "
|
||||
"["
|
||||
"%{if-debug}D%{endif}"
|
||||
"%{if-info}I%{endif}"
|
||||
"%{if-warning}W%{endif}"
|
||||
"%{if-critical}C%{endif}"
|
||||
"%{if-fatal}F%{endif}"
|
||||
"] "
|
||||
"%{function}(): "
|
||||
"%{message}"));
|
||||
|
||||
Q_INIT_RESOURCE(resources);
|
||||
|
||||
QApplication app(argc, argv);
|
||||
|
||||
QApplication::setStyle(QStyleFactory::create("Windows"));
|
||||
|
||||
MainWindow mainWindow;
|
||||
mainWindow.show();
|
||||
|
||||
return app.exec();
|
||||
}
|