add more shortcuts and checks

This commit is contained in:
2018-08-10 00:12:35 +02:00
parent 94fa4022f0
commit e4e7719f83
9 changed files with 222 additions and 138 deletions

View File

@@ -611,7 +611,7 @@
<!--file menu-->
<layout id="file-menu">
<popup-menu positioning="absolute" position="100 100" width="150" thickness="1" border-color=".1" color=".4 .4 .4 .8" dir="col">
<popup-menu positioning="absolute" position="100 100" width="200" thickness="1" border-color=".1" color=".4 .4 .4 .8" dir="col">
<!--
<button-custom height="30" align="center" color=".2" pad="0 20 0 10" dir="row">
<checkbox width="20" height="20"/>
@@ -628,51 +628,55 @@
-->
<button-custom id="file-newdoc" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="page_add" width="20"/>
<text text="New Pano" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="New Pano" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Ctrl-N" color=".4" justify="flex-end" margin="0 10 0 10" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-import" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="page_add" width="20"/>
<text text="Import" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Import" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-open" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="page_add" width="20"/>
<text text="Open" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Open" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-browse" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="page_add" width="20"/>
<text text="Browse" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Browse" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Ctrl-O" color=".4" justify="flex-end" margin="0 10 0 10" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-save" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="disk" width="20"/>
<text text="Save" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Save" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Ctrl-S" color=".4" justify="flex-end" margin="0 10 0 10" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-save-as" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="disk" width="20"/>
<text text="Save As.." margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Save As.." grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-save-ver" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="disk" width="20"/>
<text text="Save Version" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Save Version" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Ctrl-Shift-S" color=".4" justify="flex-end" margin="0 10 0 10" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-export" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="disk" width="20"/>
<text text="Export JPG" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Export JPG" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-export-cubes" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="page_white_stack" width="20"/>
<text text="Export Cubes" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Export Cubes" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-cloud-upload" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="weather_clouds" width="20"/>
<text text="Cloud Upload" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Cloud Upload" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
<button-custom id="file-cloud-browse" text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="weather_clouds" width="20"/>
<text text="Cloud Browse" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Cloud Browse" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
<button-custom text="Menu" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon width="20"/>
<text text="Quit" margin="0 0 0 5" font-face="arial" font-size="11"/>
<text text="Quit" grow="1" margin="0 0 0 5" font-face="arial" font-size="11"/>
</button-custom>
</popup-menu>
</layout>

View File

@@ -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");

View File

@@ -393,13 +393,13 @@ void App::init_menu_file()
popup->destroy();
};
popup->find<NodeButtonCustom>("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<NodeButtonCustom>("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();
};

View File

@@ -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<void()> 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)

View File

@@ -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;

View File

@@ -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,

View File

@@ -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

View File

@@ -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;

View File

@@ -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();