diff --git a/data/layout.xml b/data/layout.xml
index f2e635d..dae273b 100644
--- a/data/layout.xml
+++ b/data/layout.xml
@@ -611,7 +611,7 @@
diff --git a/engine/app_cloud.cpp b/engine/app_cloud.cpp
index f9e7081..83ae2ca 100644
--- a/engine/app_cloud.cpp
+++ b/engine/app_cloud.cpp
@@ -10,7 +10,7 @@ void App::cloud_upload()
{
if (!canvas)
return;
- if (doc_name.empty())
+ if (ui::Canvas::I->m_newdoc)
{
auto msgbox = new NodeMessageBox();
msgbox->m_manager = &layout;
@@ -24,7 +24,10 @@ void App::cloud_upload()
{
std::thread([this] {
std::string path = data_path + "/" + doc_name + ".pano";
- Canvas::I->project_save_thread(path);
+ if (ui::Canvas::I->m_unsaved)
+ {
+ Canvas::I->project_save_thread(path);
+ }
async_start();
auto pb = show_progress("Uploading");
diff --git a/engine/app_layout.cpp b/engine/app_layout.cpp
index 93d0d89..8e13fe6 100644
--- a/engine/app_layout.cpp
+++ b/engine/app_layout.cpp
@@ -393,13 +393,13 @@ void App::init_menu_file()
popup->destroy();
};
popup->find("file-save")->on_click = [this](Node*) {
- if (doc_name.empty())
+ if (ui::Canvas::I->m_newdoc)
{
dialog_save();
}
- else
+ else if(ui::Canvas::I->m_unsaved)
{
- canvas->m_canvas->project_save(data_path + "/" + doc_name + ".pano");
+ canvas->m_canvas->project_save();
}
popup->mouse_release();
popup->destroy();
@@ -410,7 +410,7 @@ void App::init_menu_file()
popup->destroy();
};
popup->find("file-save-ver")->on_click = [this](Node*) {
- doc_name.empty() ? dialog_save() : dialog_save_ver();
+ ui::Canvas::I->m_newdoc ? dialog_save() : dialog_save_ver();
popup->mouse_release();
popup->destroy();
};
diff --git a/engine/canvas.cpp b/engine/canvas.cpp
index 2266998..8538278 100644
--- a/engine/canvas.cpp
+++ b/engine/canvas.cpp
@@ -1615,9 +1615,11 @@ void ui::Canvas::project_save_thread(std::string file_path)
App::I.async_start();
pb->destroy();
+ App::I.title_update();
App::I.async_update();
App::I.async_end();
m_unsaved = false;
+ m_newdoc = false;
}
void ui::Canvas::project_open(std::string file_path, std::function on_complete)
@@ -1761,9 +1763,11 @@ void ui::Canvas::project_open_thread(std::string file_path)
gl.save();
App::I.async_update();
gl.restore();
+ App::I.title_update();
App::I.async_end();
}
m_unsaved = false;
+ m_newdoc = false;
}
ui::Image ui::Canvas::thumbnail_generate(int w, int h)
diff --git a/engine/canvas.h b/engine/canvas.h
index 886bc3c..19edad9 100644
--- a/engine/canvas.h
+++ b/engine/canvas.h
@@ -49,6 +49,7 @@ public:
Plane m_plane_brush;
BrushMesh m_mesh;
bool m_unsaved = false;
+ bool m_newdoc = true;
bool m_dirty = false;
bool m_commit_delayed = false;
bool m_dirty_stroke = false;
diff --git a/engine/event.h b/engine/event.h
index a8ccadd..fefb463 100644
--- a/engine/event.h
+++ b/engine/event.h
@@ -8,8 +8,66 @@ enum class kKey : uint8_t
AndroidHome,
AndroidBack,
KeySpacebar,
+ KeyA,
+ KeyB,
+ KeyC,
+ KeyD,
KeyE,
+ KeyF,
+ KeyG,
+ KeyH,
+ KeyI,
+ KeyJ,
+ KeyK,
+ KeyL,
+ KeyM,
+ KeyN,
+ KeyO,
+ KeyP,
+ KeyQ,
+ KeyR,
+ KeyS,
+ KeyT,
+ KeyU,
+ KeyV,
+ KeyW,
+ KeyX,
+ KeyY,
KeyZ,
+ Key0,
+ Key1,
+ Key2,
+ Key3,
+ Key4,
+ Key5,
+ Key6,
+ Key7,
+ Key8,
+ Key9,
+ KeyF1,
+ KeyF2,
+ KeyF3,
+ KeyF4,
+ KeyF5,
+ KeyF6,
+ KeyF7,
+ KeyF8,
+ KeyF9,
+ KeyF10,
+ KeyF11,
+ KeyF12,
+ KeyF13,
+ KeyF14,
+ KeyF15,
+ KeyF16,
+ KeyF17,
+ KeyF18,
+ KeyF19,
+ KeyF20,
+ KeyF21,
+ KeyF22,
+ KeyF23,
+ KeyF24,
KeyAlt,
KeyCtrl,
KeyShift,
diff --git a/engine/keymap.h b/engine/keymap.h
index 4389934..aa8926b 100644
--- a/engine/keymap.h
+++ b/engine/keymap.h
@@ -123,51 +123,51 @@ kKey convert_key(int key)
switch(key)
{
#ifdef __APPLE__
- CASE(kVK_ANSI_A, kKey::Unknown);
- CASE(kVK_ANSI_S, kKey::Unknown);
- CASE(kVK_ANSI_D, kKey::Unknown);
- CASE(kVK_ANSI_F, kKey::Unknown);
- CASE(kVK_ANSI_H, kKey::Unknown);
- CASE(kVK_ANSI_G, kKey::Unknown);
+ CASE(kVK_ANSI_A, kKey::KeyA);
+ CASE(kVK_ANSI_S, kKey::KeyS);
+ CASE(kVK_ANSI_D, kKey::KeyD);
+ CASE(kVK_ANSI_F, kKey::KeyF);
+ CASE(kVK_ANSI_H, kKey::KeyH);
+ CASE(kVK_ANSI_G, kKey::KeyG);
CASE(kVK_ANSI_Z, kKey::KeyZ);
- CASE(kVK_ANSI_X, kKey::Unknown);
- CASE(kVK_ANSI_C, kKey::Unknown);
- CASE(kVK_ANSI_V, kKey::Unknown);
- CASE(kVK_ANSI_B, kKey::Unknown);
- CASE(kVK_ANSI_Q, kKey::Unknown);
- CASE(kVK_ANSI_W, kKey::Unknown);
+ CASE(kVK_ANSI_X, kKey::KeyX);
+ CASE(kVK_ANSI_C, kKey::KeyC);
+ CASE(kVK_ANSI_V, kKey::KeyV);
+ CASE(kVK_ANSI_B, kKey::KeyB);
+ CASE(kVK_ANSI_Q, kKey::KeyQ);
+ CASE(kVK_ANSI_W, kKey::KeyW);
CASE(kVK_ANSI_E, kKey::KeyE);
- CASE(kVK_ANSI_R, kKey::Unknown);
- CASE(kVK_ANSI_Y, kKey::Unknown);
- CASE(kVK_ANSI_T, kKey::Unknown);
- CASE(kVK_ANSI_1, kKey::Unknown);
- CASE(kVK_ANSI_2, kKey::Unknown);
- CASE(kVK_ANSI_3, kKey::Unknown);
- CASE(kVK_ANSI_4, kKey::Unknown);
- CASE(kVK_ANSI_6, kKey::Unknown);
- CASE(kVK_ANSI_5, kKey::Unknown);
+ CASE(kVK_ANSI_R, kKey::KeyR);
+ CASE(kVK_ANSI_Y, kKey::KeyY);
+ CASE(kVK_ANSI_T, kKey::KeyT);
+ CASE(kVK_ANSI_1, kKey::Key1);
+ CASE(kVK_ANSI_2, kKey::Key2);
+ CASE(kVK_ANSI_3, kKey::Key3);
+ CASE(kVK_ANSI_4, kKey::Key4);
+ CASE(kVK_ANSI_6, kKey::Key6);
+ CASE(kVK_ANSI_5, kKey::Key5);
CASE(kVK_ANSI_Equal, kKey::Unknown);
- CASE(kVK_ANSI_9, kKey::Unknown);
- CASE(kVK_ANSI_7, kKey::Unknown);
+ CASE(kVK_ANSI_9, kKey::Key9);
+ CASE(kVK_ANSI_7, kKey::Key7);
CASE(kVK_ANSI_Minus, kKey::Unknown);
- CASE(kVK_ANSI_8, kKey::Unknown);
- CASE(kVK_ANSI_0, kKey::Unknown);
+ CASE(kVK_ANSI_8, kKey::Key8);
+ CASE(kVK_ANSI_0, kKey::Key0);
CASE(kVK_ANSI_RightBracket, kKey::Unknown);
- CASE(kVK_ANSI_O, kKey::Unknown);
- CASE(kVK_ANSI_U, kKey::Unknown);
+ CASE(kVK_ANSI_O, kKey::KeyO);
+ CASE(kVK_ANSI_U, kKey::KeyU);
CASE(kVK_ANSI_LeftBracket, kKey::Unknown);
- CASE(kVK_ANSI_I, kKey::Unknown);
- CASE(kVK_ANSI_P, kKey::Unknown);
- CASE(kVK_ANSI_L, kKey::Unknown);
- CASE(kVK_ANSI_J, kKey::Unknown);
+ CASE(kVK_ANSI_I, kKey::KeyI);
+ CASE(kVK_ANSI_P, kKey::KeyP);
+ CASE(kVK_ANSI_L, kKey::KeyL);
+ CASE(kVK_ANSI_J, kKey::KeyJ);
CASE(kVK_ANSI_Quote, kKey::Unknown);
- CASE(kVK_ANSI_K, kKey::Unknown);
+ CASE(kVK_ANSI_K, kKey::KeyK);
CASE(kVK_ANSI_Semicolon, kKey::Unknown);
CASE(kVK_ANSI_Backslash, kKey::Unknown);
CASE(kVK_ANSI_Comma, kKey::Unknown);
CASE(kVK_ANSI_Slash, kKey::Unknown);
- CASE(kVK_ANSI_N, kKey::Unknown);
- CASE(kVK_ANSI_M, kKey::Unknown);
+ CASE(kVK_ANSI_N, kKey::KeyN);
+ CASE(kVK_ANSI_M, kKey::KeyM);
CASE(kVK_ANSI_Period, kKey::Unknown);
CASE(kVK_ANSI_Grave, kKey::Unknown);
CASE(kVK_ANSI_KeypadDecimal, kKey::Unknown);
@@ -206,22 +206,22 @@ kKey convert_key(int key)
CASE(kVK_VolumeUp, kKey::Unknown);
CASE(kVK_VolumeDown, kKey::Unknown);
CASE(kVK_Mute, kKey::Unknown);
- CASE(kVK_F18, kKey::Unknown);
- CASE(kVK_F19, kKey::Unknown);
- CASE(kVK_F20, kKey::Unknown);
- CASE(kVK_F5, kKey::Unknown);
- CASE(kVK_F6, kKey::Unknown);
- CASE(kVK_F7, kKey::Unknown);
- CASE(kVK_F3, kKey::Unknown);
- CASE(kVK_F8, kKey::Unknown);
- CASE(kVK_F9, kKey::Unknown);
- CASE(kVK_F11, kKey::Unknown);
- CASE(kVK_F13, kKey::Unknown);
- CASE(kVK_F16, kKey::Unknown);
- CASE(kVK_F14, kKey::Unknown);
- CASE(kVK_F10, kKey::Unknown);
- CASE(kVK_F12, kKey::Unknown);
- CASE(kVK_F15, kKey::Unknown);
+ CASE(kVK_F18, kKey::KeyF18);
+ CASE(kVK_F19, kKey::KeyF19);
+ CASE(kVK_F20, kKey::KeyF20);
+ CASE(kVK_F5, kKey::KeyF5);
+ CASE(kVK_F6, kKey::KeyF6);
+ CASE(kVK_F7, kKey::KeyF7);
+ CASE(kVK_F3, kKey::KeyF3);
+ CASE(kVK_F8, kKey::KeyF8);
+ CASE(kVK_F9, kKey::KeyF9);
+ CASE(kVK_F11, kKey::KeyF11);
+ CASE(kVK_F13, kKey::KeyF13);
+ CASE(kVK_F16, kKey::KeyF16);
+ CASE(kVK_F14, kKey::KeyF14);
+ CASE(kVK_F10, kKey::KeyF10);
+ CASE(kVK_F12, kKey::KeyF12);
+ CASE(kVK_F15, kKey::KeyF15);
CASE(kVK_Help, kKey::Unknown);
CASE(kVK_Home, kKey::Unknown);
CASE(kVK_PageUp, kKey::Unknown);
@@ -279,41 +279,41 @@ kKey convert_key(int key)
CASE(VK_INSERT, kKey::Unknown);
CASE(VK_DELETE, kKey::Unknown);
CASE(VK_HELP, kKey::Unknown);
- CASE('0', kKey::Unknown);
- CASE('1', kKey::Unknown);
- CASE('2', kKey::Unknown);
- CASE('3', kKey::Unknown);
- CASE('4', kKey::Unknown);
- CASE('5', kKey::Unknown);
- CASE('6', kKey::Unknown);
- CASE('7', kKey::Unknown);
- CASE('8', kKey::Unknown);
- CASE('9', kKey::Unknown);
- CASE('A', kKey::Unknown);
- CASE('B', kKey::Unknown);
- CASE('C', kKey::Unknown);
- CASE('D', kKey::Unknown);
+ CASE('0', kKey::Key0);
+ CASE('1', kKey::Key1);
+ CASE('2', kKey::Key2);
+ CASE('3', kKey::Key3);
+ CASE('4', kKey::Key4);
+ CASE('5', kKey::Key5);
+ CASE('6', kKey::Key6);
+ CASE('7', kKey::Key7);
+ CASE('8', kKey::Key8);
+ CASE('9', kKey::Key9);
+ CASE('A', kKey::KeyA);
+ CASE('B', kKey::KeyB);
+ CASE('C', kKey::KeyC);
+ CASE('D', kKey::KeyD);
CASE('E', kKey::KeyE);
- CASE('F', kKey::Unknown);
- CASE('G', kKey::Unknown);
- CASE('H', kKey::Unknown);
- CASE('I', kKey::Unknown);
- CASE('J', kKey::Unknown);
- CASE('K', kKey::Unknown);
- CASE('L', kKey::Unknown);
- CASE('M', kKey::Unknown);
- CASE('N', kKey::Unknown);
- CASE('O', kKey::Unknown);
- CASE('P', kKey::Unknown);
- CASE('Q', kKey::Unknown);
- CASE('R', kKey::Unknown);
- CASE('S', kKey::Unknown);
- CASE('T', kKey::Unknown);
- CASE('U', kKey::Unknown);
- CASE('V', kKey::Unknown);
- CASE('W', kKey::Unknown);
- CASE('X', kKey::Unknown);
- CASE('Y', kKey::Unknown);
+ CASE('F', kKey::KeyF);
+ CASE('G', kKey::KeyG);
+ CASE('H', kKey::KeyH);
+ CASE('I', kKey::KeyI);
+ CASE('J', kKey::KeyJ);
+ CASE('K', kKey::KeyK);
+ CASE('L', kKey::KeyL);
+ CASE('M', kKey::KeyM);
+ CASE('N', kKey::KeyN);
+ CASE('O', kKey::KeyO);
+ CASE('P', kKey::KeyP);
+ CASE('Q', kKey::KeyQ);
+ CASE('R', kKey::KeyR);
+ CASE('S', kKey::KeyS);
+ CASE('T', kKey::KeyT);
+ CASE('U', kKey::KeyU);
+ CASE('V', kKey::KeyV);
+ CASE('W', kKey::KeyW);
+ CASE('X', kKey::KeyX);
+ CASE('Y', kKey::KeyY);
CASE('Z', kKey::KeyZ);
CASE(VK_LWIN, kKey::Unknown);
CASE(VK_RWIN, kKey::Unknown);
@@ -335,30 +335,30 @@ kKey convert_key(int key)
CASE(VK_SUBTRACT, kKey::Unknown);
CASE(VK_DECIMAL, kKey::Unknown);
CASE(VK_DIVIDE, kKey::Unknown);
- CASE(VK_F1, kKey::Unknown);
- CASE(VK_F2, kKey::Unknown);
- CASE(VK_F3, kKey::Unknown);
- CASE(VK_F4, kKey::Unknown);
- CASE(VK_F5, kKey::Unknown);
- CASE(VK_F6, kKey::Unknown);
- CASE(VK_F7, kKey::Unknown);
- CASE(VK_F8, kKey::Unknown);
- CASE(VK_F9, kKey::Unknown);
- CASE(VK_F10, kKey::Unknown);
- CASE(VK_F11, kKey::Unknown);
- CASE(VK_F12, kKey::Unknown);
- CASE(VK_F13, kKey::Unknown);
- CASE(VK_F14, kKey::Unknown);
- CASE(VK_F15, kKey::Unknown);
- CASE(VK_F16, kKey::Unknown);
- CASE(VK_F17, kKey::Unknown);
- CASE(VK_F18, kKey::Unknown);
- CASE(VK_F19, kKey::Unknown);
- CASE(VK_F20, kKey::Unknown);
- CASE(VK_F21, kKey::Unknown);
- CASE(VK_F22, kKey::Unknown);
- CASE(VK_F23, kKey::Unknown);
- CASE(VK_F24, kKey::Unknown);
+ CASE(VK_F1, kKey::KeyF1);
+ CASE(VK_F2, kKey::KeyF2);
+ CASE(VK_F3, kKey::KeyF3);
+ CASE(VK_F4, kKey::KeyF4);
+ CASE(VK_F5, kKey::KeyF5);
+ CASE(VK_F6, kKey::KeyF6);
+ CASE(VK_F7, kKey::KeyF7);
+ CASE(VK_F8, kKey::KeyF8);
+ CASE(VK_F9, kKey::KeyF9);
+ CASE(VK_F10, kKey::KeyF10);
+ CASE(VK_F11, kKey::KeyF11);
+ CASE(VK_F12, kKey::KeyF12);
+ CASE(VK_F13, kKey::KeyF13);
+ CASE(VK_F14, kKey::KeyF14);
+ CASE(VK_F15, kKey::KeyF15);
+ CASE(VK_F16, kKey::KeyF16);
+ CASE(VK_F17, kKey::KeyF17);
+ CASE(VK_F18, kKey::KeyF18);
+ CASE(VK_F19, kKey::KeyF19);
+ CASE(VK_F20, kKey::KeyF20);
+ CASE(VK_F21, kKey::KeyF21);
+ CASE(VK_F22, kKey::KeyF22);
+ CASE(VK_F23, kKey::KeyF23);
+ CASE(VK_F24, kKey::KeyF24);
CASE(VK_NUMLOCK, kKey::Unknown);
CASE(VK_SCROLL, kKey::Unknown);
//CASE(VK_OEM_NEC_EQUAL, kKey::Unknown); // same as VK_OEM_FJ_JISHO
diff --git a/engine/main.cpp b/engine/main.cpp
index d4157d3..1c3c51e 100644
--- a/engine/main.cpp
+++ b/engine/main.cpp
@@ -374,8 +374,8 @@ int main(int argc, char** argv)
WGL_COLOR_BITS_ARB, 32,
WGL_DEPTH_BITS_ARB, 24,
WGL_STENCIL_BITS_ARB, 8,
-// WGL_SAMPLE_BUFFERS_ARB, 1, // Number of buffers (must be 1 at time of writing)
-// WGL_SAMPLES_ARB, 4, // Number of samples
+ WGL_SAMPLE_BUFFERS_ARB, 1, // Number of buffers (must be 1 at time of writing)
+ WGL_SAMPLES_ARB, 4, // Number of samples
0
};
UINT numFormat;
diff --git a/engine/node_canvas.cpp b/engine/node_canvas.cpp
index 1ee0279..c1bbbc1 100644
--- a/engine/node_canvas.cpp
+++ b/engine/node_canvas.cpp
@@ -297,7 +297,7 @@ void NodeCanvas::draw()
glm::vec3(App::I.grid->m_groud_value->get_value()),
App::I.grid->m_groud_opacity->get_value()));
ui::ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera
- * glm::translate(glm::vec3(0, (App::I.grid->m_groud_height->get_value() - 0.5f) * 2.f, 0))
+ * glm::translate(glm::vec3(0, glm::pow(App::I.grid->m_groud_height->get_value() - 0.5f, 3), 0))
* glm::eulerAngleX(glm::radians(90.f))
* glm::scale(glm::vec3(grid_scale, grid_scale, 1))
);
@@ -386,12 +386,6 @@ kEventResult NodeCanvas::handle_event(Event* e)
case kEventType::KeyDown:
if (ke->m_key == kKey::KeyE)
ui::Canvas::set_mode(ui::Canvas::kCanvasMode::Erase);
- // if (ke->m_key == kKey::KeySpacebar)
- // m_canvas->m_alpha_lock = true;
- // if (ke->m_key == kKey::AndroidVolumeUp)
- // m_zoom_canvas *= 0.9f;
- // if (ke->m_key == kKey::AndroidVolumeDown)
- // m_zoom_canvas *= 1.1f;
if (ke->m_key == kKey::AndroidBack)
if (!ActionManager::empty())
ActionManager::undo();
@@ -400,12 +394,32 @@ kEventResult NodeCanvas::handle_event(Event* e)
case kEventType::KeyUp:
if (ke->m_key == kKey::KeyE)
ui::Canvas::set_mode(ui::Canvas::kCanvasMode::Draw);
- // if (ke->m_key == kKey::KeySpacebar)
- // m_canvas->m_alpha_lock = false;
if (ke->m_key == kKey::KeyTab)
App::I.toggle_ui();
if (ke->m_key == kKey::KeyZ && App::I.keys[(int)kKey::KeyCtrl])
App::I.keys[(int)kKey::KeyShift] ? ActionManager::redo() : ActionManager::undo();
+ if (ke->m_key == kKey::KeyS && App::I.keys[(int)kKey::KeyCtrl] && !App::I.keys[(int)kKey::KeyShift])
+ {
+ if (ui::Canvas::I->m_newdoc)
+ {
+ App::I.dialog_save();
+ }
+ else if (ui::Canvas::I->m_unsaved)
+ {
+ ui::Canvas::I->project_save();
+ }
+ }
+ if (ke->m_key == kKey::KeyS && App::I.keys[(int)kKey::KeyCtrl] && App::I.keys[(int)kKey::KeyShift])
+ {
+ if (ui::Canvas::I->m_newdoc)
+ {
+ App::I.dialog_save();
+ }
+ else if (ui::Canvas::I->m_unsaved)
+ {
+ App::I.dialog_save_ver();
+ }
+ }
break;
case kEventType::GestureStart:
mouse_capture();