request save on exit wip

This commit is contained in:
2018-07-30 23:35:27 +02:00
parent a66af9abb8
commit 87fcea61b8
7 changed files with 42 additions and 3 deletions

View File

@@ -17,6 +17,7 @@ void android_async_unlock(struct engine* engine);
void async_lock(); void async_lock();
void async_swap(); void async_swap();
void async_unlock(); void async_unlock();
void destroy_window();
#endif #endif
using namespace ui; using namespace ui;
@@ -29,6 +30,30 @@ void App::create()
height = 1080/2; height = 1080/2;
} }
bool App::request_close()
{
static bool dialog_already_opened = false;
if (ui::Canvas::I->m_unsaved && !dialog_already_opened)
{
async_start();
auto* m = layout[main_id]->add_child<NodeMessageBox>();
m->m_title->set_text("Unsaved document");
m->m_message->set_text("Would you like to save before closing?");
m->btn_ok->m_text->set_text("Yes");
m->btn_ok->on_click = [](Node*) {
};
m->btn_cancel->m_text->set_text("No");
m->btn_cancel->on_click = [](Node*) {
destroy_window();
PostQuitMessage(0);
};
async_redraw();
async_end();
dialog_already_opened = true;
}
return false;
}
void App::clear() void App::clear()
{ {
glClearColor(.1f, .1f, .1f, 1.f); glClearColor(.1f, .1f, .1f, 1.f);

View File

@@ -101,6 +101,7 @@ public:
void initAssets(); void initAssets();
void initLayout(); void initLayout();
void create(); void create();
bool request_close();
void terminate(); void terminate();
void clear(); void clear();
void update(float dt); void update(float dt);

View File

@@ -14,7 +14,7 @@ static glm::vec4 color_button_hlight{ 1, .0, .0, 1 };
void App::title_update(std::string name, int resolution) void App::title_update(std::string name, int resolution)
{ {
static char str[256]; static char str[256];
snprintf(str, 256, "Panodoc: %s (%dpx)", doc_name.c_str(), resolution); snprintf(str, 256, "Panodoc: %s%s (%dpx)", doc_name.c_str(), canvas->m_canvas->m_unsaved ? "*" : "", resolution);
if (auto docname = layout[main_id]->find<NodeText>("txt-docname")) if (auto docname = layout[main_id]->find<NodeText>("txt-docname"))
docname->set_text(str); docname->set_text(str);
} }
@@ -661,6 +661,7 @@ void App::initLayout()
layout[main_id]->add_child(butt); layout[main_id]->add_child(butt);
butt->on_click = [this](Node*){ butt->on_click = [this](Node*){
toggle_ui();
}; };
if (auto* slider = layout[main_id]->find<NodeSliderH>("frames-slider")) if (auto* slider = layout[main_id]->find<NodeSliderH>("frames-slider"))

View File

@@ -145,7 +145,7 @@ ui::StrokeSample ui::Stroke::randomize_sample(const glm::vec2& pos, float pressu
s.flow = m_brush.m_tip_flow * (1.f - rnd_nor() * m_brush.m_jitter_flow) * flow_dyn; s.flow = m_brush.m_tip_flow * (1.f - rnd_nor() * m_brush.m_jitter_flow) * flow_dyn;
auto hsv = convert_rgb2hsv(m_brush.m_tip_color); auto hsv = convert_rgb2hsv(m_brush.m_tip_color);
hsv.x = glm::clamp(glm::mix(hsv.x, (pressure - 0.5f) * 2.0f, m_brush.m_tip_hue * (float)m_brush.m_tip_hue_pressure) + (rnd_nor() - 0.5f) * m_brush.m_jitter_hue, 0.f, 1.f); hsv.x = glm::clamp(glm::mix(hsv.x, (pressure - 0.5f) * 2.0f, m_brush.m_tip_hue * (float)m_brush.m_tip_hue_pressure) + (rnd_nor() - 0.5f) * m_brush.m_jitter_hue, 0.f, 1.f);
hsv.y = glm::clamp(glm::mix(hsv.y, (pressure - 0.5f) * 2.0f, m_brush.m_tip_sat * (float)m_brush.m_tip_sat_pressure) + (rnd_nor() - 0.5f) * m_brush.m_jitter_sat, 0.f, 1.f); hsv.y = glm::clamp(glm::mix(hsv.y, (1.f - pressure - 0.5f) * 2.0f, m_brush.m_tip_sat * (float)m_brush.m_tip_sat_pressure) + (rnd_nor() - 0.5f) * m_brush.m_jitter_sat, 0.f, 1.f);
hsv.z = glm::clamp(glm::mix(hsv.z, (pressure - 0.5f) * 2.0f, m_brush.m_tip_val * (float)m_brush.m_tip_val_pressure) + (rnd_nor() - 0.5f) * m_brush.m_jitter_val, 0.f, 1.f); hsv.z = glm::clamp(glm::mix(hsv.z, (pressure - 0.5f) * 2.0f, m_brush.m_tip_val * (float)m_brush.m_tip_val_pressure) + (rnd_nor() - 0.5f) * m_brush.m_jitter_val, 0.f, 1.f);
m_hsv_jitter.add(hsv); m_hsv_jitter.add(hsv);
s.col = convert_hsv2rgb(m_hsv_jitter.average()); s.col = convert_hsv2rgb(m_hsv_jitter.average());

View File

@@ -462,6 +462,7 @@ void ui::Canvas::stroke_commit()
{ {
if (!m_dirty || m_layers.empty()) if (!m_dirty || m_layers.empty())
return; return;
m_unsaved = true;
m_dirty = false; m_dirty = false;
m_dirty_stroke = true; // new stroke ready for timelapse capture m_dirty_stroke = true; // new stroke ready for timelapse capture
App::I.redraw = true; App::I.redraw = true;
@@ -805,6 +806,7 @@ bool ui::Canvas::create(int width, int height)
} }
m_smask.create(width*2, height*2, "mask"); m_smask.create(width*2, height*2, "mask");
m_smask.clear({1, 1, 1, 1}); m_smask.clear({1, 1, 1, 1});
m_unsaved = true;
return true; return true;
} }
@@ -1452,6 +1454,7 @@ void ui::Canvas::project_save_thread(std::string file_path)
pb->destroy(); pb->destroy();
App::I.async_update(); App::I.async_update();
App::I.async_end(); App::I.async_end();
m_unsaved = false;
} }
void ui::Canvas::project_open(std::string file_path, std::function<void()> on_complete) void ui::Canvas::project_open(std::string file_path, std::function<void()> on_complete)
@@ -1597,6 +1600,7 @@ void ui::Canvas::project_open_thread(std::string file_path)
gl.restore(); gl.restore();
App::I.async_end(); App::I.async_end();
} }
m_unsaved = false;
} }
ui::Image ui::Canvas::thumbnail_generate(int w, int h) ui::Image ui::Canvas::thumbnail_generate(int w, int h)

View File

@@ -48,6 +48,7 @@ public:
Plane m_plane; Plane m_plane;
Plane m_plane_brush; Plane m_plane_brush;
BrushMesh m_mesh; BrushMesh m_mesh;
bool m_unsaved = false;
bool m_dirty = false; bool m_dirty = false;
bool m_commit_delayed = false; bool m_commit_delayed = false;
bool m_dirty_stroke = false; bool m_dirty_stroke = false;

View File

@@ -47,6 +47,11 @@ std::string GetLastErrorAsString()
return message; return message;
} }
void destroy_window()
{
DestroyWindow(hWnd);
}
void async_lock() void async_lock()
{ {
//std::lock_guard<std::mutex> _lock(async_mutex); //std::lock_guard<std::mutex> _lock(async_mutex);
@@ -456,7 +461,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
BT_SetTerminate(); BT_SetTerminate();
break; break;
case WM_CLOSE: case WM_CLOSE:
PostQuitMessage(0); if (App::I.request_close())
PostQuitMessage(0);
else return true;
break; break;
case WM_SIZE: case WM_SIZE:
{ {