mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
profile: redo eventname handling
The eventname handling code was splattered all over the place. Collect it in a single source file and use C++ idioms to avoid nasty memory management. Provide a C-only interface, however. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
ab7b9329c0
commit
0d3c9954f4
10 changed files with 94 additions and 70 deletions
|
@ -51,6 +51,7 @@ SOURCES += subsurface-mobile-main.cpp \
|
||||||
core/divecomputer.c \
|
core/divecomputer.c \
|
||||||
core/divefilter.cpp \
|
core/divefilter.cpp \
|
||||||
core/event.c \
|
core/event.c \
|
||||||
|
core/eventname.cpp \
|
||||||
core/filterconstraint.cpp \
|
core/filterconstraint.cpp \
|
||||||
core/filterpreset.cpp \
|
core/filterpreset.cpp \
|
||||||
core/divelist.c \
|
core/divelist.c \
|
||||||
|
@ -200,6 +201,7 @@ HEADERS += \
|
||||||
core/dive.h \
|
core/dive.h \
|
||||||
core/divecomputer.h \
|
core/divecomputer.h \
|
||||||
core/event.h \
|
core/event.h \
|
||||||
|
core/eventname.h \
|
||||||
core/extradata.h \
|
core/extradata.h \
|
||||||
core/git-access.h \
|
core/git-access.h \
|
||||||
core/globals.h \
|
core/globals.h \
|
||||||
|
|
|
@ -79,6 +79,8 @@ set(SUBSURFACE_CORE_LIB_SRCS
|
||||||
downloadfromdcthread.h
|
downloadfromdcthread.h
|
||||||
event.c
|
event.c
|
||||||
event.h
|
event.h
|
||||||
|
eventname.cpp
|
||||||
|
eventname.h
|
||||||
equipment.c
|
equipment.c
|
||||||
equipment.h
|
equipment.h
|
||||||
errorhelper.c
|
errorhelper.c
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "divecomputer.h"
|
#include "divecomputer.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
|
#include "eventname.h"
|
||||||
#include "extradata.h"
|
#include "extradata.h"
|
||||||
#include "pref.h"
|
#include "pref.h"
|
||||||
#include "sample.h"
|
#include "sample.h"
|
||||||
|
@ -442,7 +443,7 @@ struct event *add_event(struct divecomputer *dc, unsigned int time, int type, in
|
||||||
|
|
||||||
add_event_to_dc(dc, ev);
|
add_event_to_dc(dc, ev);
|
||||||
|
|
||||||
remember_event(name);
|
remember_event_name(name);
|
||||||
return ev;
|
return ev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "divesite.h"
|
#include "divesite.h"
|
||||||
#include "dive.h"
|
#include "dive.h"
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
|
#include "eventname.h"
|
||||||
#include "filterpreset.h"
|
#include "filterpreset.h"
|
||||||
#include "fulltext.h"
|
#include "fulltext.h"
|
||||||
#include "interpolate.h"
|
#include "interpolate.h"
|
||||||
|
@ -1375,7 +1376,7 @@ void clear_dive_file_data()
|
||||||
|
|
||||||
clear_dive(&displayed_dive);
|
clear_dive(&displayed_dive);
|
||||||
clear_device_table(&device_table);
|
clear_device_table(&device_table);
|
||||||
clear_events();
|
clear_event_names();
|
||||||
clear_filter_presets();
|
clear_filter_presets();
|
||||||
|
|
||||||
reset_min_datafile_version();
|
reset_min_datafile_version();
|
||||||
|
|
35
core/event.c
35
core/event.c
|
@ -99,38 +99,3 @@ bool same_event(const struct event *a, const struct event *b)
|
||||||
return 0;
|
return 0;
|
||||||
return !strcmp(a->name, b->name);
|
return !strcmp(a->name, b->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* collect all event names and whether we display them */
|
|
||||||
struct ev_select *ev_namelist = NULL;
|
|
||||||
int evn_used = 0;
|
|
||||||
static int evn_allocated = 0;
|
|
||||||
|
|
||||||
void clear_events(void)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < evn_used; i++)
|
|
||||||
free(ev_namelist[i].ev_name);
|
|
||||||
evn_used = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void remember_event(const char *eventname)
|
|
||||||
{
|
|
||||||
int i = 0, len;
|
|
||||||
|
|
||||||
if (!eventname || (len = strlen(eventname)) == 0)
|
|
||||||
return;
|
|
||||||
while (i < evn_used) {
|
|
||||||
if (!strncmp(eventname, ev_namelist[i].ev_name, len))
|
|
||||||
return;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (evn_used == evn_allocated) {
|
|
||||||
evn_allocated += 10;
|
|
||||||
ev_namelist = realloc(ev_namelist, evn_allocated * sizeof(struct ev_select));
|
|
||||||
if (!ev_namelist)
|
|
||||||
/* we are screwed, but let's just bail out */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ev_namelist[evn_used].ev_name = strdup(eventname);
|
|
||||||
ev_namelist[evn_used].plot_ev = true;
|
|
||||||
evn_used++;
|
|
||||||
}
|
|
||||||
|
|
11
core/event.h
11
core/event.h
|
@ -39,15 +39,6 @@ struct event {
|
||||||
char name[];
|
char name[];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ev_select {
|
|
||||||
char *ev_name;
|
|
||||||
bool plot_ev;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* collect all event names and whether we display them */
|
|
||||||
extern struct ev_select *ev_namelist;
|
|
||||||
extern int evn_used;
|
|
||||||
|
|
||||||
extern int event_is_gaschange(const struct event *ev);
|
extern int event_is_gaschange(const struct event *ev);
|
||||||
extern bool event_is_divemodechange(const struct event *ev);
|
extern bool event_is_divemodechange(const struct event *ev);
|
||||||
extern struct event *clone_event(const struct event *src_ev);
|
extern struct event *clone_event(const struct event *src_ev);
|
||||||
|
@ -55,8 +46,6 @@ extern void free_events(struct event *ev);
|
||||||
extern struct event *create_event(unsigned int time, int type, int flags, int value, const char *name);
|
extern struct event *create_event(unsigned int time, int type, int flags, int value, const char *name);
|
||||||
extern struct event *clone_event_rename(const struct event *ev, const char *name);
|
extern struct event *clone_event_rename(const struct event *ev, const char *name);
|
||||||
extern bool same_event(const struct event *a, const struct event *b);
|
extern bool same_event(const struct event *a, const struct event *b);
|
||||||
extern void remember_event(const char *eventname);
|
|
||||||
extern void clear_events(void);
|
|
||||||
|
|
||||||
/* Since C doesn't have parameter-based overloading, two versions of get_next_event. */
|
/* Since C doesn't have parameter-based overloading, two versions of get_next_event. */
|
||||||
extern const struct event *get_next_event(const struct event *event, const char *name);
|
extern const struct event *get_next_event(const struct event *event, const char *name);
|
||||||
|
|
59
core/eventname.cpp
Normal file
59
core/eventname.cpp
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
#include "eventname.h"
|
||||||
|
#include "subsurface-string.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
struct event_name {
|
||||||
|
std::string name;
|
||||||
|
bool plot;
|
||||||
|
};
|
||||||
|
|
||||||
|
static std::vector<event_name> event_names;
|
||||||
|
|
||||||
|
// Small helper so that we can compare events to C-strings
|
||||||
|
static bool operator==(const event_name &en, const char *s)
|
||||||
|
{
|
||||||
|
return en.name == s;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void clear_event_names()
|
||||||
|
{
|
||||||
|
event_names.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void remember_event_name(const char *eventname)
|
||||||
|
{
|
||||||
|
if (empty_string(eventname))
|
||||||
|
return;
|
||||||
|
if (std::find(event_names.begin(), event_names.end(), eventname) != event_names.end())
|
||||||
|
return;
|
||||||
|
event_names.push_back({ eventname, true });
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" bool is_event_hidden(const char *eventname)
|
||||||
|
{
|
||||||
|
auto it = std::find(event_names.begin(), event_names.end(), eventname);
|
||||||
|
return it != event_names.end() && !it->plot;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void hide_event(const char *eventname)
|
||||||
|
{
|
||||||
|
auto it = std::find(event_names.begin(), event_names.end(), eventname);
|
||||||
|
if (it != event_names.end())
|
||||||
|
it->plot = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void show_all_events()
|
||||||
|
{
|
||||||
|
for (event_name &en: event_names)
|
||||||
|
en.plot = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" bool any_events_hidden()
|
||||||
|
{
|
||||||
|
return std::any_of(event_names.begin(), event_names.end(),
|
||||||
|
[] (const event_name &en) { return !en.plot; });
|
||||||
|
}
|
21
core/eventname.h
Normal file
21
core/eventname.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// collect all event names and whether we display events of that type
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
#ifndef EVENTNAME_H
|
||||||
|
#define EVENTNAME_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void clear_event_names(void);
|
||||||
|
extern void remember_event_name(const char *eventname);
|
||||||
|
extern bool is_event_hidden(const char *eventname);
|
||||||
|
extern void hide_event(const char *eventname);
|
||||||
|
extern void show_all_events();
|
||||||
|
extern bool any_events_hidden();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -4,6 +4,7 @@
|
||||||
#include "profile-widget/divepixmapcache.h"
|
#include "profile-widget/divepixmapcache.h"
|
||||||
#include "profile-widget/animationfunctions.h"
|
#include "profile-widget/animationfunctions.h"
|
||||||
#include "core/event.h"
|
#include "core/event.h"
|
||||||
|
#include "core/eventname.h"
|
||||||
#include "core/format.h"
|
#include "core/format.h"
|
||||||
#include "core/profile.h"
|
#include "core/profile.h"
|
||||||
#include "core/gettextfromc.h"
|
#include "core/gettextfromc.h"
|
||||||
|
@ -225,11 +226,7 @@ bool DiveEventItem::isInteresting(const struct dive *d, const struct divecompute
|
||||||
|
|
||||||
bool DiveEventItem::shouldBeHidden()
|
bool DiveEventItem::shouldBeHidden()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < evn_used; i++) {
|
return is_event_hidden(ev->name);
|
||||||
if (!strcmp(ev->name, ev_namelist[i].ev_name) && ev_namelist[i].plot_ev == false)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiveEventItem::recalculatePos()
|
void DiveEventItem::recalculatePos()
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "profile-widget/profilescene.h"
|
#include "profile-widget/profilescene.h"
|
||||||
#include "core/device.h"
|
#include "core/device.h"
|
||||||
#include "core/event.h"
|
#include "core/event.h"
|
||||||
|
#include "core/eventname.h"
|
||||||
#include "core/subsurface-string.h"
|
#include "core/subsurface-string.h"
|
||||||
#include "core/qthelper.h"
|
#include "core/qthelper.h"
|
||||||
#include "core/range.h"
|
#include "core/range.h"
|
||||||
|
@ -643,14 +644,7 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
bool some_hidden = false;
|
if (any_events_hidden())
|
||||||
for (int i = 0; i < evn_used; i++) {
|
|
||||||
if (ev_namelist[i].plot_ev == false) {
|
|
||||||
some_hidden = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (some_hidden)
|
|
||||||
m.addAction(tr("Unhide all events"), this, &ProfileWidget2::unhideEvents);
|
m.addAction(tr("Unhide all events"), this, &ProfileWidget2::unhideEvents);
|
||||||
m.exec(event->globalPos());
|
m.exec(event->globalPos());
|
||||||
}
|
}
|
||||||
|
@ -694,12 +688,7 @@ void ProfileWidget2::hideEvents(DiveEventItem *item)
|
||||||
TITLE_OR_TEXT(tr("Hide events"), tr("Hide all %1 events?").arg(event->name)),
|
TITLE_OR_TEXT(tr("Hide events"), tr("Hide all %1 events?").arg(event->name)),
|
||||||
QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
|
QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
|
||||||
if (!empty_string(event->name)) {
|
if (!empty_string(event->name)) {
|
||||||
for (int i = 0; i < evn_used; i++) {
|
hide_event(event->name);
|
||||||
if (same_string(event->name, ev_namelist[i].ev_name)) {
|
|
||||||
ev_namelist[i].plot_ev = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Q_FOREACH (DiveEventItem *evItem, profileScene->eventItems) {
|
Q_FOREACH (DiveEventItem *evItem, profileScene->eventItems) {
|
||||||
if (same_string(evItem->getEvent()->name, event->name))
|
if (same_string(evItem->getEvent()->name, event->name))
|
||||||
evItem->hide();
|
evItem->hide();
|
||||||
|
@ -712,9 +701,7 @@ void ProfileWidget2::hideEvents(DiveEventItem *item)
|
||||||
|
|
||||||
void ProfileWidget2::unhideEvents()
|
void ProfileWidget2::unhideEvents()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < evn_used; i++) {
|
show_all_events();
|
||||||
ev_namelist[i].plot_ev = true;
|
|
||||||
}
|
|
||||||
Q_FOREACH (DiveEventItem *item, profileScene->eventItems)
|
Q_FOREACH (DiveEventItem *item, profileScene->eventItems)
|
||||||
item->show();
|
item->show();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue