Qt Editor: Add sound property delegate

qteditor
Sven Eberhardt 2016-07-27 22:35:11 -04:00
parent c70ee82068
commit 73510d7fb1
6 changed files with 223 additions and 66 deletions

View File

@ -26,6 +26,8 @@
#include "object/C4Def.h"
#include "script/C4Effect.h"
#include "script/C4AulExec.h"
#include "platform/C4SoundInstance.h"
/* Property path for property setting synchronization */
@ -125,7 +127,7 @@ void C4PropertyPath::DoCall(const char *call_string) const
}
/* Property editing */
/* Property delegate base class */
C4PropertyDelegate::C4PropertyDelegate(const C4PropertyDelegateFactory *factory, C4PropList *props)
: QObject(), factory(factory), set_function_type(C4PropertyPath::PPT_SetFunction)
@ -169,7 +171,6 @@ bool C4PropertyDelegate::GetPropertyValueBase(const C4Value &container, C4String
default:
return false;
}
}
bool C4PropertyDelegate::GetPropertyValue(const C4Value &container, C4String *key, int32_t index, C4Value *out_val) const
@ -231,6 +232,9 @@ C4PropertyPath C4PropertyDelegate::GetPathForProperty(const C4PropertyPath &pare
return subpath;
}
/* Integer delegate */
C4PropertyDelegateInt::C4PropertyDelegateInt(const C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegate(factory, props), min(std::numeric_limits<int32_t>::min()), max(std::numeric_limits<int32_t>::max()), step(1)
{
@ -267,6 +271,9 @@ QWidget *C4PropertyDelegateInt::CreateEditor(const C4PropertyDelegateFactory *pa
return editor;
}
/* String delegate */
C4PropertyDelegateString::C4PropertyDelegateString(const C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegate(factory, props)
{
@ -311,6 +318,9 @@ QString C4PropertyDelegateString::GetDisplayString(const C4Value &v, C4Object *o
return QString(s ? s->GetCStr() : "");
}
/* Delegate editor: Text left and button right */
C4PropertyDelegateLabelAndButtonWidget::C4PropertyDelegateLabelAndButtonWidget(QWidget *parent)
: QWidget(parent), layout(nullptr), label(nullptr), button(nullptr), button_pending(false)
{
@ -331,6 +341,9 @@ C4PropertyDelegateLabelAndButtonWidget::C4PropertyDelegateLabelAndButtonWidget(Q
setAutoFillBackground(true);
}
/* Descend path delegate base class for arrays and proplist */
C4PropertyDelegateDescendPath::C4PropertyDelegateDescendPath(const class C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegate(factory, props), edit_on_selection(true)
{
@ -395,6 +408,9 @@ QWidget *C4PropertyDelegateDescendPath::CreateEditor(const class C4PropertyDeleg
return peditor.release();
}
/* Array descend delegate */
C4PropertyDelegateArray::C4PropertyDelegateArray(const class C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateDescendPath(factory, props), max_array_display(0), element_delegate(nullptr)
{
@ -435,6 +451,9 @@ QString C4PropertyDelegateArray::GetDisplayString(const C4Value &v, C4Object *ob
}
}
/* Proplist descend delegate */
C4PropertyDelegatePropList::C4PropertyDelegatePropList(const class C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateDescendPath(factory, props)
{
@ -444,7 +463,6 @@ C4PropertyDelegatePropList::C4PropertyDelegatePropList(const class C4PropertyDel
}
}
QString C4PropertyDelegatePropList::GetDisplayString(const C4Value &v, C4Object *obj) const
{
C4PropList *data = v.getPropList();
@ -487,6 +505,8 @@ QString C4PropertyDelegatePropList::GetDisplayString(const C4Value &v, C4Object
}
/* Color delegate */
C4PropertyDelegateColor::C4PropertyDelegateColor(const class C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegate(factory, props)
{
@ -555,23 +575,32 @@ QColor C4PropertyDelegateColor::GetDisplayBackgroundColor(const C4Value &val, cl
/* Enum delegate combo box item delegate */
bool C4StyledItemDelegateWithHelpButton::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
bool C4StyledItemDelegateWithButton::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
// Mouse move over a cell: Display tooltip if over help button
if (Config.Developer.ShowHelp)
QEvent::Type trigger_type = (button_type == BT_Help) ? QEvent::MouseMove : QEvent::MouseButtonPress;
if (event->type() == trigger_type)
{
if (event->type() == QEvent::MouseMove)
QVariant btn = model->data(index, Qt::DecorationRole);
if (!btn.isNull())
{
QVariant help_btn = model->data(index, Qt::DecorationRole);
if (!help_btn.isNull())
QMouseEvent *mevent = static_cast<QMouseEvent *>(event);
if (option.rect.contains(mevent->localPos().toPoint()))
{
QMouseEvent *mevent = static_cast<QMouseEvent *>(event);
if (option.rect.contains(mevent->localPos().toPoint()))
if (mevent->localPos().x() >= option.rect.x() + option.rect.width() - option.rect.height())
{
if (mevent->localPos().x() >= option.rect.x() + option.rect.width() - option.rect.height())
switch (button_type)
{
QString tooltip_text = model->data(index, Qt::ToolTipRole).toString();
QToolTip::showText(mevent->globalPos(), tooltip_text);
case BT_Help:
if (Config.Developer.ShowHelp)
{
QString tooltip_text = model->data(index, Qt::ToolTipRole).toString();
QToolTip::showText(mevent->globalPos(), tooltip_text);
}
break;
case BT_PlaySound:
StartSoundEffect(model->data(index, Qt::ToolTipRole).toString().toUtf8());
return true; // handled
}
}
}
@ -580,7 +609,7 @@ bool C4StyledItemDelegateWithHelpButton::editorEvent(QEvent *event, QAbstractIte
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
void C4StyledItemDelegateWithHelpButton::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
void C4StyledItemDelegateWithButton::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
// Paint icon on the right
QStyleOptionViewItem override_option = option;
@ -592,9 +621,10 @@ void C4StyledItemDelegateWithHelpButton::paint(QPainter *painter, const QStyleOp
/* Enum delegate combo box */
C4DeepQComboBox::C4DeepQComboBox(QWidget *parent)
: QComboBox(parent), descending(false), item_clicked(false), last_popup_height(0), item_delegate(new C4StyledItemDelegateWithHelpButton())
C4DeepQComboBox::C4DeepQComboBox(QWidget *parent, C4StyledItemDelegateWithButton::ButtonType button_type)
: QComboBox(parent), last_popup_height(0), is_next_close_blocked(false)
{
item_delegate.reset(new C4StyledItemDelegateWithButton(button_type));
QTreeView *view = new QTreeView(this);
view->setFrameShape(QFrame::NoFrame);
view->setSelectionBehavior(QTreeView::SelectRows);
@ -627,6 +657,20 @@ C4DeepQComboBox::C4DeepQComboBox(QWidget *parent)
if (obj_number) obj = ::Objects.SafeObjectPointer(obj_number);
::Console.EditCursor.SetHighlightedObject(obj);
});
// New item selection through combo box: Update model position
connect(this, static_cast<void(QComboBox::*)(int)>(&QComboBox::activated),
[this](int index)
{
QModelIndex current = this->view()->currentIndex();
QVariant selected_data = this->model()->data(current, OptionIndexRole);
if (selected_data.type() == QVariant::Int)
{
// Finish selection
this->setRootModelIndex(current.parent());
this->setCurrentIndex(current.row());
emit NewItemSelected(selected_data.toInt());
}
});
// Connect view to combobox
setView(view);
view->viewport()->installEventFilter(this);
@ -647,38 +691,10 @@ void C4DeepQComboBox::showPopup()
void C4DeepQComboBox::hidePopup()
{
QModelIndex current = view()->currentIndex();
QVariant selected_data = model()->data(current, OptionIndexRole);
if (item_clicked && (selected_data.type() != QVariant::Int || !descending))
{
// Clicked somewhere into the list box: Avoid closing to allow navigation in the tree
if (descending)
{
// Clicked an item text in the tree: Shortcut to opening that tree
QTreeView *tview = static_cast<QTreeView *>(view());
if (!tview->isExpanded(current))
{
tview->setExpanded(current, true);
int32_t child_row_count = model()->rowCount(current);
tview->scrollTo(model()->index(child_row_count - 1, 0, current), QAbstractItemView::EnsureVisible);
tview->scrollTo(current, QAbstractItemView::EnsureVisible);
}
}
}
else
{
// Otherwise, finish selection
setRootModelIndex(current.parent());
setCurrentIndex(current.row());
::Console.EditCursor.SetHighlightedObject(nullptr);
setIconSize(QSize(0, 0));
QComboBox::hidePopup();
if (selected_data.type() == QVariant::Int)
{
emit NewItemSelected(selected_data.toInt());
}
}
descending = item_clicked = false;
// Cleanup tree combobox
::Console.EditCursor.SetHighlightedObject(nullptr);
setIconSize(QSize(0, 0));
QComboBox::hidePopup();
}
void C4DeepQComboBox::setCurrentModelIndex(QModelIndex new_index)
@ -705,16 +721,64 @@ int32_t C4DeepQComboBox::GetCurrentSelectionIndex()
// event filter for view: Catch mouse clicks to prevent closing from simple mouse clicks
bool C4DeepQComboBox::eventFilter(QObject *obj, QEvent *event)
{
if (obj == view()->viewport() && event->type() == QEvent::MouseButtonPress)
if (obj == view()->viewport())
{
QPoint pos = static_cast<QMouseEvent *>(event)->pos();
QModelIndex pressed_index = view()->indexAt(pos);
item_clicked = true;
descending = view()->visualRect(pressed_index).contains(pos);
if (event->type() == QEvent::MouseButtonPress)
{
QPoint pos = static_cast<QMouseEvent *>(event)->pos();
QModelIndex pressed_index = view()->indexAt(pos);
QRect item_rect = view()->visualRect(pressed_index);
// Check if a group was clicked
bool item_clicked = item_rect.contains(pos);
if (item_clicked)
{
QVariant selected_data = model()->data(pressed_index, OptionIndexRole);
if (selected_data.type() != QVariant::Int)
{
// This is a group. Just expand that entry.
QTreeView *tview = static_cast<QTreeView *>(view());
if (!tview->isExpanded(pressed_index))
{
tview->setExpanded(pressed_index, true);
int32_t child_row_count = model()->rowCount(pressed_index);
tview->scrollTo(model()->index(child_row_count - 1, 0, pressed_index), QAbstractItemView::EnsureVisible);
tview->scrollTo(pressed_index, QAbstractItemView::EnsureVisible);
}
is_next_close_blocked = true;
return true;
}
}
else
{
is_next_close_blocked = true;
return false;
}
// Delegate handling: The forward to delegate screws up for me sometimes and just stops randomly
// Prevent this by calling the event directly
QStyleOptionViewItem option;
option.rect = view()->visualRect(pressed_index);
if (item_delegate->editorEvent(event, model(), option, pressed_index))
{
// If the down event is taken by a music play event, ignore the following button up
is_next_close_blocked = true;
return true;
}
}
else if (event->type() == QEvent::MouseButtonRelease)
{
if (is_next_close_blocked)
{
is_next_close_blocked = false;
return true;
}
}
}
return false;
return QComboBox::eventFilter(obj, event);
}
/* Enumeration delegate editor */
void C4PropertyDelegateEnumEditor::paintEvent(QPaintEvent *ev)
{
// Draw self
@ -731,6 +795,9 @@ void C4PropertyDelegateEnumEditor::paintEvent(QPaintEvent *ev)
}
}
/* Enumeration (dropdown list) delegate */
C4PropertyDelegateEnum::C4PropertyDelegateEnum(const C4PropertyDelegateFactory *factory, C4PropList *props, const C4ValueArray *poptions)
: C4PropertyDelegate(factory, props)
{
@ -812,6 +879,7 @@ QStandardItemModel *C4PropertyDelegateEnum::CreateOptionModel() const
if (item_obj_data) new_item->setData(QVariant(item_obj_data->Number), C4DeepQComboBox::ObjectHighlightRole);
new_item->setData(QString((opt.help ? opt.help : opt.name)->GetCStr()), Qt::ToolTipRole);
if (opt.help) new_item->setData(QIcon(":/editor/res/Help.png"), Qt::DecorationRole);
if (opt.sound_name) new_item->setData(QIcon(":/editor/res/Sound.png"), Qt::DecorationRole);
parent->appendRow(new_item);
++idx;
}
@ -839,13 +907,18 @@ void C4PropertyDelegateEnum::AddTypeOption(C4String *name, C4V_Type type, const
options.push_back(option);
}
void C4PropertyDelegateEnum::AddConstOption(C4String *name, const C4Value &val, C4String *group)
void C4PropertyDelegateEnum::AddConstOption(C4String *name, const C4Value &val, C4String *group, C4String *sound_name)
{
Option option;
option.name = name;
option.group = group;
option.value = val;
option.storage_type = Option::StorageByValue;
if (sound_name)
{
option.sound_name = sound_name;
option.help = sound_name;
}
options.push_back(option);
}
@ -1052,7 +1125,7 @@ QWidget *C4PropertyDelegateEnum::CreateEditor(const C4PropertyDelegateFactory *p
editor->layout->setMargin(0);
editor->layout->setSpacing(0);
editor->updating = true;
editor->option_box = new C4DeepQComboBox(editor);
editor->option_box = new C4DeepQComboBox(editor, GetOptionComboBoxButtonType());
editor->layout->addWidget(editor->option_box);
for (auto &option : options) editor->option_box->addItem(option.name->GetCStr());
connect(editor->option_box, &C4DeepQComboBox::NewItemSelected, editor, [editor, this](int32_t newval) {
@ -1154,6 +1227,9 @@ bool C4PropertyDelegateEnum::Paint(QPainter *painter, const QStyleOptionViewItem
return false;
}
/* Definition delegate */
C4PropertyDelegateDef::C4PropertyDelegateDef(const C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateEnum(factory, props)
{
@ -1201,6 +1277,9 @@ void C4PropertyDelegateDef::AddDefinitions(C4ConsoleQtDefinitionListModel *def_l
}
}
/* Object delegate */
C4PropertyDelegateObject::C4PropertyDelegateObject(const C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateEnum(factory, props), max_nearby_objects(20)
{
@ -1293,6 +1372,41 @@ QString C4PropertyDelegateObject::GetDisplayString(const C4Value &v, class C4Obj
}
}
/* Sound delegate */
C4PropertyDelegateSound::C4PropertyDelegateSound(const C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateEnum(factory, props)
{
// Add none-option
AddConstOption(::Strings.RegString("nil"), C4VNull);
// Add all sounds as options
for (C4SoundEffect *fx = ::Application.SoundSystem.GetFirstSound(); fx; fx = fx->Next)
{
// Extract group name as path to sound, replacing "::" by "/" for enum groups
StdStrBuf full_name_s(fx->GetFullName(), true);
RemoveExtension(&full_name_s);
const char *full_name = full_name_s.getData();
const char *base_name = full_name, *pos;
StdStrBuf group_string;
while ((pos = SSearch(base_name, "::")))
{
if (group_string.getLength()) group_string.AppendChar('/');
group_string.Append(base_name, pos - base_name - 2);
base_name = pos;
}
C4RefCntPointer<C4String> group;
if (group_string.getLength()) group = ::Strings.RegString(group_string);
// Script name: Full name (without extension)
C4RefCntPointer<C4String> sound_string = ::Strings.RegString(full_name_s);
// Add the option
AddConstOption(::Strings.RegString(base_name), C4VString(sound_string.Get()), group.Get(), sound_string.Get());
}
}
/* Boolean delegate */
C4PropertyDelegateBool::C4PropertyDelegateBool(const C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateEnum(factory, props)
{
@ -1310,6 +1424,9 @@ bool C4PropertyDelegateBool::GetPropertyValue(const C4Value &container, C4String
return success;
}
/* Has-effect delegate */
C4PropertyDelegateHasEffect::C4PropertyDelegateHasEffect(const class C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateBool(factory, props)
{
@ -1336,6 +1453,8 @@ bool C4PropertyDelegateHasEffect::GetPropertyValue(const C4Value &container, C4S
}
/* C4Value via an enumeration delegate */
C4PropertyDelegateC4ValueEnum::C4PropertyDelegateC4ValueEnum(const C4PropertyDelegateFactory *factory, C4PropList *props)
: C4PropertyDelegateEnum(factory, props)
{
@ -1353,6 +1472,9 @@ C4PropertyDelegateC4ValueEnum::C4PropertyDelegateC4ValueEnum(const C4PropertyDel
AddTypeOption(::Strings.RegString("proplist"), C4V_PropList, C4VNull, factory->GetDelegateByValue(C4VString("proplist")));
}
/* C4Value via an edit field delegate */
C4PropertyDelegateC4ValueInputEditor::C4PropertyDelegateC4ValueInputEditor(QWidget *parent)
: QWidget(parent), layout(NULL), edit(NULL), extended_button(NULL), commit_pending(false)
{
@ -1481,6 +1603,7 @@ C4PropertyDelegate *C4PropertyDelegateFactory::CreateDelegateByPropList(C4PropLi
if (str->GetData() == "def") return new C4PropertyDelegateDef(this, props);
if (str->GetData() == "object") return new C4PropertyDelegateObject(this, props);
if (str->GetData() == "enum") return new C4PropertyDelegateEnum(this, props);
if (str->GetData() == "sound") return new C4PropertyDelegateSound(this, props);
if (str->GetData() == "bool") return new C4PropertyDelegateBool(this, props);
if (str->GetData() == "has_effect") return new C4PropertyDelegateHasEffect(this, props);
if (str->GetData() == "c4valueenum") return new C4PropertyDelegateC4ValueEnum(this, props);
@ -2189,6 +2312,15 @@ const char *C4ConsoleQtPropListModel::GetTargetPathHelp() const
return desc->GetCStr();
}
const char *C4ConsoleQtPropListModel::GetTargetPathName() const
{
// Name prop of current info.
C4PropList *info_proplist = this->info_proplist.getPropList();
if (!info_proplist) return nullptr;
C4String *name = info_proplist->GetPropertyStr(P_Name);
return name ? name->GetCStr() : nullptr;
}
void C4ConsoleQtPropListModel::AddArrayElement()
{
C4Value new_val;

View File

@ -207,16 +207,22 @@ public:
};
// Display delegate for deep combo box. Handles the help tooltip showing.
class C4StyledItemDelegateWithHelpButton : public QStyledItemDelegate
class C4StyledItemDelegateWithButton : public QStyledItemDelegate
{
Q_OBJECT
public:
C4StyledItemDelegateWithHelpButton() { }
enum ButtonType
{
BT_Help,
BT_PlaySound,
} button_type;
protected:
// Model callbacks forwarded to actual delegates
C4StyledItemDelegateWithButton(ButtonType bt) : button_type(bt) { }
public:
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override;
protected:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
@ -226,9 +232,9 @@ class C4DeepQComboBox : public QComboBox
{
Q_OBJECT
bool descending, item_clicked;
bool is_next_close_blocked;
int last_popup_height;
std::unique_ptr<C4StyledItemDelegateWithHelpButton> item_delegate;
std::unique_ptr<C4StyledItemDelegateWithButton> item_delegate;
QSize default_icon_size;
public:
@ -238,13 +244,14 @@ public:
ObjectHighlightRole = Qt::UserRole + 2,
};
C4DeepQComboBox(QWidget *parent);
C4DeepQComboBox(QWidget *parent, C4StyledItemDelegateWithButton::ButtonType button_type);
void showPopup() override;
void hidePopup() override;
void setCurrentModelIndex(QModelIndex new_index);
int32_t GetCurrentSelectionIndex();
void BlockNextCloseEvent() { is_next_close_blocked = true; }; // after item selection on a "play" button, the combo dropdown should stay open
signals:
void NewItemSelected(int32_t new_item);
@ -292,6 +299,7 @@ public:
C4RefCntPointer<C4String> group; // Grouping in enum dropdown box; nested groups separated by '/'
C4RefCntPointer<C4String> option_key;
C4RefCntPointer<C4String> value_key;
C4RefCntPointer<C4String> sound_name; // Assigned for options that have a play button
C4V_Type type; // Assume this option is set when value is of given type
C4Value value; // Value to set if this entry is selected
C4Value value_function; // Function to be called to set value
@ -308,6 +316,9 @@ public:
Option() : type(C4V_Any), adelegate(NULL), storage_type(StorageNone) {}
};
protected:
virtual C4StyledItemDelegateWithButton::ButtonType GetOptionComboBoxButtonType() const { return C4StyledItemDelegateWithButton::BT_Help; }
private:
std::vector<Option> options;
@ -319,7 +330,7 @@ public:
C4PropertyDelegateEnum(const class C4PropertyDelegateFactory *factory, C4PropList *props, const C4ValueArray *poptions=NULL);
void AddTypeOption(C4String *name, C4V_Type type, const C4Value &val, C4PropertyDelegate *adelegate=NULL);
void AddConstOption(C4String *name, const C4Value &val, C4String *group=nullptr);
void AddConstOption(C4String *name, const C4Value &val, C4String *group=nullptr, C4String *sound_name=nullptr);
void SetEditorData(QWidget *editor, const C4Value &val, const C4PropertyPath &property_path) const override;
void SetModelData(QObject *editor, const C4PropertyPath &property_path, class C4ConsoleQtShape *prop_shape) const override;
@ -366,6 +377,15 @@ public:
QString GetDisplayString(const C4Value &v, class C4Object *obj) const override;
};
// Select a sound
class C4PropertyDelegateSound : public C4PropertyDelegateEnum
{
public:
C4PropertyDelegateSound(const C4PropertyDelegateFactory *factory, C4PropList *props);
protected:
C4StyledItemDelegateWithButton::ButtonType GetOptionComboBoxButtonType() const override { return C4StyledItemDelegateWithButton::BT_PlaySound; }
};
// true or false
class C4PropertyDelegateBool : public C4PropertyDelegateEnum
{
@ -484,14 +504,14 @@ protected:
// Delegate for the name column of the property window
// For now, just use the default + help button
class C4PropertyNameDelegate : public C4StyledItemDelegateWithHelpButton
class C4PropertyNameDelegate : public C4StyledItemDelegateWithButton
{
Q_OBJECT
class C4ConsoleQtPropListModel *property_model;
public:
C4PropertyNameDelegate() : property_model(nullptr) { }
C4PropertyNameDelegate() : C4StyledItemDelegateWithButton(C4StyledItemDelegateWithButton::BT_Help), property_model(nullptr) { }
void SetPropertyModel(class C4ConsoleQtPropListModel *new_property_model) { property_model = new_property_model; }
};
@ -586,6 +606,7 @@ public:
int32_t GetTargetPathStackSize() const { return target_path_stack.size(); }
const char *GetTargetPathText() const { return target_path.GetGetPath(); }
const char *GetTargetPathHelp() const;
const char *GetTargetPathName() const;
bool IsArray() const { return !!target_value.getArray(); }
void AddArrayElement();
void RemoveArrayElement();

View File

@ -1,5 +1,6 @@
<RCC>
<qresource prefix="/editor">
<file>../res/Sound.png</file>
<file>../res/HelpOff.png</file>
<file>../res/Help.png</file>
<file>../res/StaticFlat_Trans.png</file>

View File

@ -47,6 +47,8 @@ public:
void ClearPointers(C4Object *pObj);
int32_t GetStartedInstanceCount(int32_t iX, int32_t iY, int32_t iRad); // local
int32_t GetStartedInstanceCount(); // global
const char *GetFullName() const { return Name; }; // return full name including the path prefix
protected:
void AddInst(C4SoundInstance *pInst);
void RemoveInst(C4SoundInstance *pInst);

View File

@ -49,6 +49,7 @@ public:
C4SoundInstance *GetNextInstance(C4SoundInstance *prev) const;
bool Init();
void ClearPointers(C4Object *pObj);
C4SoundEffect *GetFirstSound() const { return FirstSound; }
C4SoundModifierList Modifiers;
protected:

BIN
src/res/Sound.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB