Skip to content

Commit

Permalink
feat(zq): 'Notes' per-screen for editor use
Browse files Browse the repository at this point in the history
  • Loading branch information
EmilyV99 committed Apr 2, 2024
1 parent 88af20a commit 4ed3e71
Show file tree
Hide file tree
Showing 32 changed files with 714 additions and 301 deletions.
1 change: 1 addition & 0 deletions modules/zquest/ZQuestGUI.txt
Expand Up @@ -88,6 +88,7 @@ src/dialog/edit_dmap.cpp
src/dialog/tilesetwizard.cpp
src/dialog/view_script_slots.cpp
src/dialog/object_pages.cpp
src/dialog/screen_notes.cpp


## End of ZQuest GUI module
Expand Down
2 changes: 2 additions & 0 deletions src/base/mapscr.h
Expand Up @@ -140,6 +140,8 @@ struct mapscr
byte hidelayers;
byte hidescriptlayers;

string usr_notes;

void zero_memory();

private:
Expand Down
34 changes: 34 additions & 0 deletions src/base/packfile.h
Expand Up @@ -530,6 +530,8 @@ inline bool p_getcstr(string *str, PACKFILE *f);
inline bool p_putcstr(string const& str, PACKFILE *f);
inline bool p_getwstr(string *str, PACKFILE *f);
inline bool p_putwstr(string const& str, PACKFILE *f);
inline bool p_getlstr(string *str, PACKFILE *f);
inline bool p_putlstr(string const& str, PACKFILE *f);
template<typename T>
inline bool p_getcvec(vector<T> *vec, PACKFILE *f);
template<typename T>
Expand Down Expand Up @@ -920,6 +922,38 @@ inline bool p_putwstr(string const& str, PACKFILE *f)
}
return true;
}
inline bool p_getlstr(string *str, PACKFILE *f)
{
str->clear();
dword sz = 0;
if(!p_igetl(&sz,f))
return false;
if(sz)
{
str->reserve(sz);
auto buf = std::make_unique<char[]>(sz + 1);
buf[sz] = '\0';
if (!pfread(buf.get(), sz, f))
return false;
*str = buf.get();
}
return true;
}
inline bool p_putlstr(string const& str, PACKFILE *f)
{
dword sz = word(zc_min(UINT32_MAX,str.size()));
if(!p_iputl(sz,f))
return false;
if(sz)
{
for(size_t q = 0; q < sz; ++q)
{
if(!p_putc(str.at(q),f))
return false;
}
}
return true;
}

template<typename T>
inline bool p_getcvec(vector<T> *vec, PACKFILE *f)
Expand Down
2 changes: 1 addition & 1 deletion src/base/zdefs.h
Expand Up @@ -209,7 +209,7 @@ enum {ENC_METHOD_192B104=0, ENC_METHOD_192B105, ENC_METHOD_192B185, ENC_METHOD_2
#define V_TILES 3 //2 is a int32_t, max 214500 tiles (ZScript upper limit)
#define V_COMBOS 45
#define V_CSETS 5 //palette data
#define V_MAPS 29
#define V_MAPS 30
#define V_DMAPS 21
#define V_DOORS 1
#define V_ITEMS 59
Expand Down
4 changes: 2 additions & 2 deletions src/dialog/compilezscript.cpp
Expand Up @@ -20,7 +20,7 @@ using std::string;
#include "base/emscripten_utils.h"
#endif

void doEditZScript(int32_t bg,int32_t fg);
void doEditZScript();
void clear_map_states();
void do_script_disassembly(map<string, disassembled_script_data>& scripts, bool fromCompile);
bool do_slots(map<string, disassembled_script_data> &scripts, int assign_mode);
Expand Down Expand Up @@ -586,7 +586,7 @@ bool CompileZScriptDialog::handleMessage(const GUI::DialogMessage<message>& msg)
}

case message::EDIT:
doEditZScript(vc(15),vc(0));
doEditZScript();
updateLabels();
return false;

Expand Down
4 changes: 4 additions & 0 deletions src/dialog/externs.h
Expand Up @@ -3,6 +3,7 @@

#include "base/headers.h"
#include "base/containers.h"
struct mapscr;

void call_cpool_pages(optional<int> val = nullopt);
void call_autoc_pages(optional<int> val = nullopt);
Expand All @@ -18,5 +19,8 @@ void displayinfo(string const& title, vector<string> const& lines, optional<stri

bool call_checklist_dialog(string const& title, vector<string> const& flagnames, bitstring& flags);

void edit_screen_notes(mapscr* scr, int map, int screen);
void browse_screen_notes();

#endif

243 changes: 243 additions & 0 deletions src/dialog/screen_notes.cpp
@@ -0,0 +1,243 @@
#include "screen_notes.h"
#include <gui/builder.h>
#include <base/new_menu.h>
#include "alert.h"
#include "zc_list_data.h"
#include "base/mapscr.h"
#include "zq/zquest.h"
#include "zq/zq_class.h"
#include "gui/editbox.h"
#include "qst.h"
#include <fmt/format.h>
#include <utility>
#include <sstream>

void edit_screen_notes(mapscr* scr, int map, int screen)
{
ScreenNotesInfo(scr,map,screen).edit();
}

void browse_screen_notes()
{
BrowseNotesDialog().show();
}

void ScreenNotesInfo::update_blank()
{
blank = notes().empty() || !scr || !scr->valid;
}

string const& ScreenNotesInfo::notes() const
{
static const string nullstr = "";
return scr ? scr->usr_notes : nullstr;
}

bool ScreenNotesInfo::edit()
{
if(do_box_edit(scr->usr_notes, fmt::format("Notes ({})", title()), true, false, true))
{
update_blank();
scr->valid |= mVALID;
saved = false;
return true;
}
return false;
}

string ScreenNotesInfo::title() const
{
return fmt::format("{},0x{:02X}", map+1, screen);
}
string ScreenNotesInfo::str() const
{
return fmt::format("({}): {}", title(), scr ? notes() : "[NULL]");
}

BrowseNotesDialog::BrowseNotesDialog()
{
selected_val = 0;
infos.reserve(map_count*MAPSCRS);
for(int m = 0; m < map_count; ++m)
for(int s = 0; s < MAPSCRS; ++s)
infos.emplace_back(Map.AbsoluteScr(m,s),m,s);
}

std::shared_ptr<GUI::Widget> BrowseNotesDialog::view()
{
using namespace GUI::Builder;
using namespace GUI::Props;
using namespace GUI::Key;

string lowfilter = filter;
lowerstr(lowfilter);
lister.clear();
size_t indx = 0;
bool nofilter = filter.empty();
bool isblank = true;
bool resel = true;
for(ScreenNotesInfo& inf : infos)
{
if(!inf.isBlank())
{
isblank = false;
bool add = nofilter;
if(!add)
{
string lowernotes = inf.notes();
lowerstr(lowernotes);
add = lowernotes.find(lowfilter) != string::npos;
}
if(add)
{
if(indx == selected_val)
resel = false;
lister.add(inf.str(), indx);
}
}
++indx;
}

if(isblank)
{
InfoDialog("Error","No Notes Found!").show();
return nullptr;
}
if(lister.empty())
{
selected_val = -1;
resel = false;
lister.add("[NO RESULTS]", -1);
}
else if(selected_val < 0)
{
selected_val = lister.getValue(0);
resel = false;
}

window = Window(
title = "Browse Notes",
onClose = message::OK,
hPadding = 0_px,
Column(
hPadding = 0_px,
Row(
widgList = List(data = lister, isABC = true,
selectedValue = selected_val,
fitParent = true,
onSelectFunc = [&](int32_t val)
{
if(selected_val != val)
{
selected_val = val;
if(auto inf = sel_info())
{
prevlbl->setText(inf->notes());
editB->setDisabled(false);
gotoB->setDisabled(inf->map == Map.getCurrMap() && inf->screen == Map.getCurrScr());
}
else
{
prevlbl->setText("");
editB->setDisabled(true);
gotoB->setDisabled(true);
}
}
},
onDClick = message::EDIT),
prevlbl = Label(text = "",
width = 30_em, minheight = 30_em,
fitParent = true)
),
Row(padding = 0_px,
Row(padding = 0_px,
Button(
text = "C", height = 24_px,
rightPadding = 0_px,
onPressFunc = [&]()
{
filter.clear();
refresh_dlg();
}),
TextField(
maxwidth = 15_em, maxLength = 255,
text = filter, focused = true,
onValChangedFunc = [&](GUI::TextField::type,std::string_view str,int32_t)
{
filter = str;
refresh_dlg();
})
),
Button(
text = "OK",
topPadding = 0.5_em,
minwidth = 90_px,
onClick = message::OK),
editB = Button(
text = "Edit",
topPadding = 0.5_em,
minwidth = 90_px,
onClick = message::EDIT),
gotoB = Button(
text = "Goto",
topPadding = 0.5_em,
minwidth = 90_px,
onClick = message::GOTO)
)
)
);

if(resel)
{
widgList->setIndex();
selected_val = widgList->getSelectedValue();
}
editB->setDisabled(true);
gotoB->setDisabled(true);
if(selected_val < 0)
prevlbl->setText("No matching notes found!");
else if(auto inf = sel_info())
{
editB->setDisabled(false);
gotoB->setDisabled(inf->map == Map.getCurrMap() && inf->screen == Map.getCurrScr());
prevlbl->setText(inf->notes());
}

return window;
}

ScreenNotesInfo* BrowseNotesDialog::sel_info()
{
if(selected_val < 0 || selected_val >= infos.size() || lister.empty())
return nullptr;
return &infos[selected_val];
}
ScreenNotesInfo const* BrowseNotesDialog::sel_info() const
{
if(selected_val < 0 || selected_val >= infos.size() || lister.empty())
return nullptr;
return &infos[selected_val];
}
bool BrowseNotesDialog::handleMessage(const GUI::DialogMessage<message>& msg)
{
switch(msg.message)
{
case message::OK:
return true;
case message::EDIT:
if(auto inf = sel_info())
if(inf->edit())
rerun_dlg = true;
return rerun_dlg;
case message::GOTO:
if(auto inf = sel_info())
{
Map.setCurrMap(inf->map);
Map.setCurrScr(inf->screen);
return true;
}
return false;
}
return false;
}

0 comments on commit 4ed3e71

Please sign in to comment.