From 68b4939a15185c38439a38ba8a117532541ef7ab Mon Sep 17 00:00:00 2001 From: Alison Watson Date: Thu, 13 Jun 2019 21:10:33 -0400 Subject: [PATCH] tycho: add model/view test code --- source/tycho/CMakeLists.txt | 3 ++ source/tycho/Cargo.toml | 2 +- source/tycho/bindings.json | 2 +- source/tycho/build.rs | 10 +++- source/tycho/cc_headers/mapprops.h | 6 ++- source/tycho/cc_headers/menu.h | 9 +++- source/tycho/cc_headers/project.h | 41 ++++++++++++++++ source/tycho/cc_headers/tycho.h | 8 ++++ source/tycho/cc_source/mapprops.cc | 5 +- source/tycho/cc_source/menu.cc | 48 ++++++++++++++++--- source/tycho/cc_source/projectmodel.cc | 19 ++++++++ source/tycho/cc_source/projectview.cc | 24 ++++++++++ source/tycho/source/main.rs | 2 +- source/tycho/source/qimpl.rs | 34 +------------- source/tycho/source/qimpl/project.rs | 59 +++++++++++++++++++++++ source/tycho/source/qintr.rs | 2 +- source/tycho/ui/mapprops.ui | 65 +++++++++++++++++++++++++- source/tycho/ui/menu.ui | 20 ++++++++ source/tycho/ui/projectview.ui | 40 ++++++++++++++++ 19 files changed, 347 insertions(+), 52 deletions(-) create mode 100644 source/tycho/cc_headers/project.h create mode 100644 source/tycho/cc_source/projectmodel.cc create mode 100644 source/tycho/cc_source/projectview.cc create mode 100644 source/tycho/source/qimpl/project.rs create mode 100644 source/tycho/ui/projectview.ui diff --git a/source/tycho/CMakeLists.txt b/source/tycho/CMakeLists.txt index 71ea8a0..d905cc5 100644 --- a/source/tycho/CMakeLists.txt +++ b/source/tycho/CMakeLists.txt @@ -24,10 +24,13 @@ add_library( $ENV{OUT_DIR}/bindings.h cc_headers/mapprops.h cc_headers/menu.h + cc_headers/project.h cc_headers/tycho.h cc_source/main.cc cc_source/mapprops.cc cc_source/menu.cc + cc_source/projectmodel.cc + cc_source/projectview.cc resources/resources.qrc ui/about.ui ui/mapprops.ui diff --git a/source/tycho/Cargo.toml b/source/tycho/Cargo.toml index 72b0024..a62ac1f 100644 --- a/source/tycho/Cargo.toml +++ b/source/tycho/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "maraiah-tycho" version = "0.1.0" -authors = ["Alison Watson "] +authors = ["Alison Watson ", "Tae Matous"] description = "Tycho map editor." edition = "2018" build = "build.rs" diff --git a/source/tycho/bindings.json b/source/tycho/bindings.json index 2d97dfa..6a31daf 100644 --- a/source/tycho/bindings.json +++ b/source/tycho/bindings.json @@ -10,7 +10,7 @@ "type": "Object", "functions": { "open": { - "return": "void", + "return": "bool", "mut": true, "arguments": [{ "name": "fname", diff --git a/source/tycho/build.rs b/source/tycho/build.rs index bfaf76a..0071746 100644 --- a/source/tycho/build.rs +++ b/source/tycho/build.rs @@ -13,9 +13,15 @@ fn main() generate_bindings(&config).unwrap(); - let dst = cmake::Config::new(".").build(); + let mut config = cmake::Config::new("."); - println!("cargo:rustc-link-search=native={}/lib", dst.display()); + if cfg!(debug_assertions) { + config.cxxflag("-DTYCHO_DEBUG_PRINT"); + } + + let destination = config.build(); + + println!("cargo:rustc-link-search=native={}/lib", destination.display()); println!("cargo:rustc-link-lib=dylib=maraiah-tycho-hermes"); } diff --git a/source/tycho/cc_headers/mapprops.h b/source/tycho/cc_headers/mapprops.h index 12d12d7..6089a3c 100644 --- a/source/tycho/cc_headers/mapprops.h +++ b/source/tycho/cc_headers/mapprops.h @@ -2,6 +2,8 @@ #include +class ProjectModel; + namespace Ui { class MapProps; @@ -12,10 +14,12 @@ class MapProps : public QDialog Q_OBJECT public: - explicit MapProps(QWidget *parent = nullptr); + explicit MapProps(QSharedPointer proj, + QWidget *parent = nullptr); ~MapProps(); private: + QSharedPointer proj; QSharedPointer ui; }; diff --git a/source/tycho/cc_headers/menu.h b/source/tycho/cc_headers/menu.h index 20a7eff..2b13c3a 100644 --- a/source/tycho/cc_headers/menu.h +++ b/source/tycho/cc_headers/menu.h @@ -3,7 +3,8 @@ #include #include -class Project; +class ProjectView; +class QMdiSubWindow; namespace Ui { @@ -23,10 +24,14 @@ public slots: void mapOpen(); void openAbout(); void openMapProperties(); + void updateActions(); private: + ProjectView *activeProject() const; + QMdiSubWindow *activeSubWindow() const; + void addProject(ProjectView *proj); + QSharedPointer ui; - std::vector> projects; }; // EOF diff --git a/source/tycho/cc_headers/project.h b/source/tycho/cc_headers/project.h new file mode 100644 index 0000000..bce62c6 --- /dev/null +++ b/source/tycho/cc_headers/project.h @@ -0,0 +1,41 @@ +#pragma once + +#include "bindings.h" + +#include + +namespace Ui +{ + class ProjectView; +} + +class ProjectModel : public QObject +{ + Q_OBJECT + +public: + explicit ProjectModel(); + ~ProjectModel(); + + bool open(QString fname); + +private: + Project data; +}; + +class ProjectView : public QWidget +{ + Q_OBJECT + +public: + explicit ProjectView(QWidget *parent = nullptr); + ~ProjectView(); + + QSharedPointer model(); + +private: + QSharedPointer ui; + QSharedPointer proj; +}; + +// EOF diff --git a/source/tycho/cc_headers/tycho.h b/source/tycho/cc_headers/tycho.h index e7381b5..8f372b1 100644 --- a/source/tycho/cc_headers/tycho.h +++ b/source/tycho/cc_headers/tycho.h @@ -12,4 +12,12 @@ #define dbgPrintFunc() dbgPrint("%s", __func__) +constexpr std::uint32_t fourCC(std::uint8_t a, + std::uint8_t b, + std::uint8_t c, + std::uint8_t d) +{ + return (a << 24) | (b << 16) | (c << 8) | d; +} + // EOF diff --git a/source/tycho/cc_source/mapprops.cc b/source/tycho/cc_source/mapprops.cc index f2cf73e..4e37f37 100644 --- a/source/tycho/cc_source/mapprops.cc +++ b/source/tycho/cc_source/mapprops.cc @@ -4,9 +4,10 @@ #include -MapProps::MapProps(QWidget *parent) : +MapProps::MapProps(QSharedPointer _proj, QWidget *parent) : QDialog(parent), - ui(new Ui::MapProps) + ui(new Ui::MapProps), + proj(_proj) { ui->setupUi(this); diff --git a/source/tycho/cc_source/menu.cc b/source/tycho/cc_source/menu.cc index 64e00fa..bb5cca0 100644 --- a/source/tycho/cc_source/menu.cc +++ b/source/tycho/cc_source/menu.cc @@ -1,11 +1,12 @@ #include "tycho.h" #include "mapprops.h" #include "menu.h" +#include "project.h" #include "../ui/ui_menu.h" #include "../ui/ui_about.h" -#include "bindings.h" #include +#include #include Menu::Menu(QWidget *parent) : @@ -23,7 +24,9 @@ Menu::~Menu() void Menu::mapNew() { - auto proj = projects.emplace_back(new Project); + QScopedPointer view{new ProjectView}; + + addProject(view.take()); } void Menu::mapOpen() @@ -35,8 +38,11 @@ void Menu::mapOpen() QString(), tr("Marathon Map files (*.scen *.sceA Map)")); - auto proj = projects.emplace_back(new Project); - proj->open(fname); + QScopedPointer view{new ProjectView}; + + if(view->model()->open(fname)) { + addProject(view.take()); + } } void Menu::openAbout() @@ -46,16 +52,44 @@ void Menu::openAbout() about.setupUi(&dlg); about.labelVer->setText(tr(TYCHO_VERSION)); - about.labelAuthors->setText(tr(TYCHO_AUTHORS)); + about.labelAuthors->setText(tr(TYCHO_AUTHORS).replace(':', '\n')); dlg.exec(); } void Menu::openMapProperties() { - MapProps props{this}; + auto view = activeProject(); - props.exec(); + if(view) { + MapProps props{view->model(), view}; + props.exec(); + } +} + +void Menu::updateActions() +{ + auto view = activeProject(); + bool active = view != nullptr; + + ui->actionMapProps->setEnabled(active); +} + +ProjectView *Menu::activeProject() const +{ + auto win = activeSubWindow(); + return win ? qobject_cast(win->widget()) : nullptr; +} + +QMdiSubWindow *Menu::activeSubWindow() const +{ + return ui->mdiArea->activeSubWindow(); +} + +void Menu::addProject(ProjectView *view) +{ + auto win = ui->mdiArea->addSubWindow(view); + win->showMaximized(); } // EOF diff --git a/source/tycho/cc_source/projectmodel.cc b/source/tycho/cc_source/projectmodel.cc new file mode 100644 index 0000000..26384b2 --- /dev/null +++ b/source/tycho/cc_source/projectmodel.cc @@ -0,0 +1,19 @@ +#include "tycho.h" +#include "project.h" + +ProjectModel::ProjectModel() : + data() +{ +} + +ProjectModel::~ProjectModel() +{ + dbgPrintFunc(); +} + +bool ProjectModel::open(QString fname) +{ + return data.open(fname); +} + +// EOF diff --git a/source/tycho/cc_source/projectview.cc b/source/tycho/cc_source/projectview.cc new file mode 100644 index 0000000..fa6a452 --- /dev/null +++ b/source/tycho/cc_source/projectview.cc @@ -0,0 +1,24 @@ +#include "tycho.h" +#include "project.h" +#include "../ui/ui_projectview.h" + +ProjectView::ProjectView(QWidget *parent) : + QWidget(parent), + ui(new Ui::ProjectView), + proj(new ProjectModel) +{ + ui->setupUi(this); + dbgPrintFunc(); +} + +ProjectView::~ProjectView() +{ + dbgPrintFunc(); +} + +QSharedPointer ProjectView::model() +{ + return proj; +} + +// EOF diff --git a/source/tycho/source/main.rs b/source/tycho/source/main.rs index 401a157..e9de90d 100644 --- a/source/tycho/source/main.rs +++ b/source/tycho/source/main.rs @@ -1,4 +1,4 @@ -use maraiah::durandal::{err::*, ffi}; +use maraiah::{err::*, ffi}; mod qimpl; mod qintr; diff --git a/source/tycho/source/qimpl.rs b/source/tycho/source/qimpl.rs index 977addb..eab3ea9 100644 --- a/source/tycho/source/qimpl.rs +++ b/source/tycho/source/qimpl.rs @@ -1,35 +1,5 @@ -use crate::qintr::*; +mod project; -pub struct Project -{ - emit: ProjectEmitter, -} - -impl Drop for Project -{ - fn drop(&mut self) - { - eprintln!("drop Project"); - } -} - -impl ProjectTrait for Project -{ - fn new(emit: ProjectEmitter) -> Project - { - eprintln!("new Project"); - Project{emit} - } - - fn emit(&mut self) -> &mut ProjectEmitter - { - &mut self.emit - } - - fn open(&mut self, fname: String) - { - println!("opening project: {}", fname); - } -} +pub use self::project::*; // EOF diff --git a/source/tycho/source/qimpl/project.rs b/source/tycho/source/qimpl/project.rs new file mode 100644 index 0000000..f9fbefa --- /dev/null +++ b/source/tycho/source/qimpl/project.rs @@ -0,0 +1,59 @@ +use crate::qintr::*; +use std::{cell::RefCell, fs}; +use memmap::Mmap; +use maraiah::map; + +pub struct Project +{ + emit: ProjectEmitter, + wad: RefCell>, +} + +impl Drop for Project +{ + fn drop(&mut self) + { + if cfg!(debug_assertions) { + eprintln!("drop Project"); + } + } +} + +impl ProjectTrait for Project +{ + fn new(emit: ProjectEmitter) -> Project + { + if cfg!(debug_assertions) { + eprintln!("new Project"); + } + + Project{emit, wad: RefCell::new(None)} + } + + fn emit(&mut self) -> &mut ProjectEmitter + { + &mut self.emit + } + + fn open(&mut self, path: String) -> bool + { + if cfg!(debug_assertions) { + eprintln!("opening project: {}", &path); + } + + let fp = fs::File::open(path); + let fp = if let Ok(fp) = fp {fp} else {return false;}; + + let mm = unsafe {Mmap::map(&fp)}; + let mm = if let Ok(mm) = mm {mm} else {return false;}; + + if let Ok(wad) = map::read(&mm) { + self.wad.replace(Some(wad)); + return true; + } + + false + } +} + +// EOF diff --git a/source/tycho/source/qintr.rs b/source/tycho/source/qintr.rs index 2e45006..06341b8 100644 --- a/source/tycho/source/qintr.rs +++ b/source/tycho/source/qintr.rs @@ -1,7 +1,7 @@ #![allow(unused_imports)] #![allow(dead_code)] -use maraiah::durandal::ffi as libc; +use maraiah::ffi as libc; include!(concat!(env!("OUT_DIR"), "/src/qintr.rs")); diff --git a/source/tycho/ui/mapprops.ui b/source/tycho/ui/mapprops.ui index 5ffb711..f1c11da 100644 --- a/source/tycho/ui/mapprops.ui +++ b/source/tycho/ui/mapprops.ui @@ -12,8 +12,8 @@ 0 0 - 468 - 598 + 466 + 594 @@ -71,6 +71,31 @@ Because of this, the texture sets are named after the liquids primarily.0 + + + Water + + + + + Lava + + + + + Sewage + + + + + Jjaro + + + + + Pfhor + + @@ -91,6 +116,26 @@ Because of this, the texture sets are named after the liquids primarily.0 + + + Lh'owon Day + + + + + Lh'owon Night + + + + + Moon + + + + + Space + + @@ -451,5 +496,21 @@ Some of them also set the "failure" terminal state when the objective + + checkBox_24 + toggled(bool) + comboBox_2 + setDisabled(bool) + + + 361 + 465 + + + 269 + 131 + + + diff --git a/source/tycho/ui/menu.ui b/source/tycho/ui/menu.ui index f4b27dd..fd9582b 100644 --- a/source/tycho/ui/menu.ui +++ b/source/tycho/ui/menu.ui @@ -105,6 +105,9 @@ + + false + .. @@ -223,11 +226,28 @@ + + mdiArea + subWindowActivated(QMdiSubWindow*) + Menu + updateActions() + + + 399 + 301 + + + 399 + 299 + + + openMapProperties() mapNew() mapOpen() openAbout() + updateActions() diff --git a/source/tycho/ui/projectview.ui b/source/tycho/ui/projectview.ui new file mode 100644 index 0000000..222b353 --- /dev/null +++ b/source/tycho/ui/projectview.ui @@ -0,0 +1,40 @@ + + + ProjectView + + + + 0 + 0 + 400 + 300 + + + + Project + + + + + + false + + + gay + + + true + + + true + + + false + + + + + + + +