void TBEditField::OnMessageReceived(TBMessage *msg) { if (msg->message == TBIDC("blink")) { m_style_edit.caret.on = !m_style_edit.caret.on; m_style_edit.caret.Invalidate(); // Post another blink message so we blink again. PostMessageDelayed(TBIDC("blink"), nullptr, CARET_BLINK_TIME); } else if (msg->message == TBIDC("selscroll") && captured_widget == this) { // Get scroll speed from where mouse is relative to the padding rect. TBRect padding_rect = GetVisibleRect().Shrink(2, 2); int dx = GetSelectionScrollSpeed(pointer_move_widget_x, padding_rect.x, padding_rect.x + padding_rect.w); int dy = GetSelectionScrollSpeed(pointer_move_widget_y, padding_rect.y, padding_rect.y + padding_rect.h); m_scrollbar_x.SetValue(m_scrollbar_x.GetValue() + dx); m_scrollbar_y.SetValue(m_scrollbar_y.GetValue() + dy); // Handle mouse move at the new scroll position, so selection is updated if (dx || dy) m_style_edit.MouseMove(TBPoint(pointer_move_widget_x, pointer_move_widget_y)); // Post another setscroll message so we continue scrolling if we still should. if (m_style_edit.select_state) PostMessageDelayed(TBIDC("selscroll"), nullptr, SELECTION_SCROLL_DELAY); } }
void TBProgressSpinner::OnMessageReceived(TBMessage *msg) { m_frame++; Invalidate(); // Keep animation running PostMessageDelayed(TBID(1), nullptr, spin_speed); }
bool ScrollContainerWindow::OnEvent(const TBWidgetEvent &ev) { if (ev.type == EVENT_TYPE_CLICK) { if (ev.target->GetID() == TBIDC("add img")) { TBButton *button = TBSafeCast<TBButton>(ev.target); TBSkinImage *skin_image = new TBSkinImage; skin_image->SetSkinBg(TBIDC("Icon16")); button->GetContentRoot()->AddChild(skin_image, WIDGET_Z_BOTTOM); return true; } else if (ev.target->GetID() == TBIDC("new buttons")) { for(int i = 0; i < ev.target->data.GetInt(); i++) { TBStr str; str.SetFormatted("Remove %d", i); TBButton *button = new TBButton; button->SetID(TBIDC("remove button")); button->SetText(str); ev.target->GetParent()->AddChild(button); } return true; } else if (ev.target->GetID() == TBIDC("new buttons delayed")) { for(int i = 0; i < ev.target->data.GetInt(); i++) { TBMessageData *data = new TBMessageData(); data->id1 = ev.target->GetParent()->GetID(); data->v1.SetInt(i); PostMessageDelayed(TBIDC("new button"), data, 100 + i * 500); } return true; } else if (ev.target->GetID() == TBIDC("remove button")) { ev.target->GetParent()->RemoveChild(ev.target); delete ev.target; return true; } else if (ev.target->GetID() == TBIDC("showpopupmenu1")) { if (TBMenuWindow *menu = new TBMenuWindow(ev.target, TBIDC("popupmenu1"))) menu->Show(&popup_menu_source, TBPopupAlignment()); return true; } else if (ev.target->GetID() == TBIDC("popupmenu1")) { TBStr str; str.SetFormatted("Menu event received!\nref_id: %d", (int)ev.ref_id); TBMessageWindow *msg_win = new TBMessageWindow(this, TBIDC("popup_dialog")); msg_win->Show("Info", str); return true; } } return DemoWindow::OnEvent(ev); }
void TBButton::OnCaptureChanged(bool captured) { if (captured && m_auto_repeat_click) PostMessageDelayed(TBIDC("auto_click"), nullptr, auto_click_first_delay); else if (!captured) { if (TBMessage *msg = GetMessageByID(TBIDC("auto_click"))) DeleteMessage(msg); } }
void TBButton::OnMessageReceived(TBMessage *msg) { if (msg->message == TBIDC("auto_click")) { assert(captured_widget == this); if (!cancel_click && GetHitStatus(pointer_move_widget_x, pointer_move_widget_y)) { TBWidgetEvent ev(EVENT_TYPE_CLICK, pointer_move_widget_x, pointer_move_widget_y, true); captured_widget->InvokeEvent(ev); } if (auto_click_repeat_delay) PostMessageDelayed(TBIDC("auto_click"), nullptr, auto_click_repeat_delay); } }
void TBProgressSpinner::SetValue(int value) { assert(value >= 0); // If this happens, you probably have unballanced Begin/End calls. m_value = value; if (value > 0) { // Start animation if (!GetMessageByID(TBID(1))) { m_frame = 0; PostMessageDelayed(TBID(1), nullptr, spin_speed); } } else { // Stop animation if (TBMessage *msg = GetMessageByID(TBID(1))) DeleteMessage(msg); } }
void TBScroller::Scroll(float start_speed_ppms_x, float start_speed_ppms_y) { // Set start values m_scroll_start_ms = TBSystem::GetTimeMS(); GetTargetScrollXY(m_scroll_start_scroll_x, m_scroll_start_scroll_y); m_scroll_start_speed_ppms_x = start_speed_ppms_x; m_scroll_start_speed_ppms_y = start_speed_ppms_y; // Calculate duration for the scroll (each axis independently) m_scroll_duration_x_ms = m_func.GetDurationFromSpeed(m_scroll_start_speed_ppms_x); m_scroll_duration_y_ms = m_func.GetDurationFromSpeed(m_scroll_start_speed_ppms_y); if (StopIfAlmostStill()) return; // Post the pan message if we don't already have one if (!GetMessageByID(TBIDC("scroll"))) { // Update expected translation GetTargetChildTranslation(m_expected_scroll_x, m_expected_scroll_y); PostMessageDelayed(TBIDC("scroll"), nullptr, (uint32)PAN_MSG_DELAY_MS); } }
void TBEditField::CaretBlinkStart() { // Post the delayed blink message if we don't already have one if (!GetMessageByID(TBIDC("blink"))) PostMessageDelayed(TBIDC("blink"), nullptr, CARET_BLINK_TIME); }
bool TBEditField::OnEvent(const TBWidgetEvent &ev) { if (ev.type == EVENT_TYPE_CHANGED && ev.target == &m_scrollbar_x) { m_style_edit.SetScrollPos(m_scrollbar_x.GetValue(), m_style_edit.scroll_y); OnScroll(m_scrollbar_x.GetValue(), m_style_edit.scroll_y); return true; } else if (ev.type == EVENT_TYPE_CHANGED && ev.target == &m_scrollbar_y) { m_style_edit.SetScrollPos(m_style_edit.scroll_x, m_scrollbar_y.GetValue()); OnScroll(m_style_edit.scroll_x, m_scrollbar_y.GetValue()); return true; } else if (ev.type == EVENT_TYPE_WHEEL && ev.modifierkeys == TB_MODIFIER_NONE) { int old_val = m_scrollbar_y.GetValue(); m_scrollbar_y.SetValue(old_val + ev.delta_y * TBSystem::GetPixelsPerLine()); return m_scrollbar_y.GetValue() != old_val; } else if (ev.type == EVENT_TYPE_POINTER_DOWN && ev.target == this) { TBRect padding_rect = GetPaddingRect(); if (m_style_edit.MouseDown( TBPoint(ev.target_x - padding_rect.x, ev.target_y - padding_rect.y), 1, ev.count, TB_MODIFIER_NONE, ev.touch)) { // Post a message to start selection scroll PostMessageDelayed(TBIDC("selscroll"), nullptr, SELECTION_SCROLL_DELAY); return true; } } else if (ev.type == EVENT_TYPE_POINTER_MOVE && ev.target == this) { TBRect padding_rect = GetPaddingRect(); return m_style_edit.MouseMove(TBPoint(ev.target_x - padding_rect.x, ev.target_y - padding_rect.y)); } else if (ev.type == EVENT_TYPE_POINTER_UP && ev.target == this) { TBRect padding_rect = GetPaddingRect(); return m_style_edit.MouseUp(TBPoint(ev.target_x - padding_rect.x, ev.target_y - padding_rect.y), 1, TB_MODIFIER_NONE, ev.touch); } else if (ev.type == EVENT_TYPE_KEY_DOWN) { return m_style_edit.KeyDown(ev.key, ev.special_key, ev.modifierkeys); } else if (ev.type == EVENT_TYPE_KEY_UP) { return true; } else if ((ev.type == EVENT_TYPE_CLICK && ev.target->GetID() == TBIDC("popupmenu")) || (ev.type == EVENT_TYPE_SHORTCUT)) { if (ev.ref_id == TBIDC("cut") && !m_style_edit.packed.read_only) m_style_edit.Cut(); else if (ev.ref_id == TBIDC("copy")) m_style_edit.Copy(); else if (ev.ref_id == TBIDC("paste") && !m_style_edit.packed.read_only) m_style_edit.Paste(); else if (ev.ref_id == TBIDC("delete") && !m_style_edit.packed.read_only) m_style_edit.Delete(); else if (ev.ref_id == TBIDC("undo") && !m_style_edit.packed.read_only) m_style_edit.Undo(); else if (ev.ref_id == TBIDC("redo") && !m_style_edit.packed.read_only) m_style_edit.Redo(); else if (ev.ref_id == TBIDC("selectall")) m_style_edit.selection.SelectAll(); else return false; return true; } else if (ev.type == EVENT_TYPE_CONTEXT_MENU && ev.target == this) { TBPoint pos_in_root(ev.target_x, ev.target_y); ev.target->ConvertToRoot(pos_in_root.x, pos_in_root.y); if (TBMenuWindow *menu = new TBMenuWindow(ev.target, TBIDC("popupmenu"))) { TBGenericStringItemSource *source = menu->GetList()->GetDefaultSource(); source->AddItem(new TBGenericStringItem(g_tb_lng->GetString(TBIDC("cut")), TBIDC("cut"))); source->AddItem(new TBGenericStringItem(g_tb_lng->GetString(TBIDC("copy")), TBIDC("copy"))); source->AddItem(new TBGenericStringItem(g_tb_lng->GetString(TBIDC("paste")), TBIDC("paste"))); source->AddItem(new TBGenericStringItem(g_tb_lng->GetString(TBIDC("delete")), TBIDC("delete"))); source->AddItem(new TBGenericStringItem("-")); source->AddItem(new TBGenericStringItem(g_tb_lng->GetString(TBIDC("selectall")), TBIDC("selectall"))); menu->Show(source, TBPopupAlignment(pos_in_root), -1); } return true; } return false; }
bool MainWindow::OnEvent(const TBWidgetEvent &ev) { if (ev.type == EVENT_TYPE_CLICK) { if (ev.target->GetID() == TBIDC("new")) { new MainWindow(); return true; } if (ev.target->GetID() == TBIDC("msg")) { PostMessage(TBIDC("instantmsg"), nullptr); return true; } else if (ev.target->GetID() == TBIDC("busymsg")) { if (ev.target->GetValue() == 1) { // Post the first "busy" message when we check the checkbox. assert(!GetMessageByID(TBIDC("busy"))); if (!GetMessageByID(TBIDC("busy"))) { PostMessage(TBIDC("busy"), nullptr); TBMessageWindow *msg_win = new TBMessageWindow(this, TBIDC("test_dialog")); msg_win->Show("Message window", "The message loop is now constantly busy with messages to process.\n\n" "The main thread should be working hard, but input & animations should still be running smoothly."); } } else { // Remove any pending "busy" message when we uncheck the checkbox. assert(GetMessageByID(TBIDC("busy"))); if (TBMessage *busymsg = GetMessageByID(TBIDC("busy"))) DeleteMessage(busymsg); } return true; } else if (ev.target->GetID() == TBIDC("delayedmsg")) { PostMessageDelayed(TBIDC("delayedmsg"), nullptr, 2000); return true; } else if (ev.target->GetID() == TBIDC("TBWindow.close")) { // Intercept the TBWindow.close message and stop it from bubbling // to TBWindow (prevent the window from closing) TBMessageWindow *msg_win = new TBMessageWindow(this, TBIDC("confirm_close_dialog")); TBMessageWindowSettings settings(TB_MSG_YES_NO, TBIDC("Icon48")); settings.dimmer = true; settings.styling = true; msg_win->Show("Are you sure?", "Really <color #0794f8>close</color> the window?", &settings); return true; } else if (ev.target->GetID() == TBIDC("confirm_close_dialog")) { if (ev.ref_id == TBIDC("TBMessageWindow.yes")) Close(); return true; } else if (ev.target->GetID() == TBIDC("reload skin bitmaps")) { int reload_count = 10; double t1 = TBSystem::GetTimeMS(); for (int i = 0; i < reload_count; i++) g_tb_skin->ReloadBitmaps(); double t2 = TBSystem::GetTimeMS(); TBStr message; message.SetFormatted("Reloading the skin graphics %d times took %dms", reload_count, (int)(t2 - t1)); TBMessageWindow *msg_win = new TBMessageWindow(ev.target, TBID()); msg_win->Show("GFX load performance", message); return true; } else if (ev.target->GetID() == TBIDC("test context lost")) { g_renderer->InvokeContextLost(); g_renderer->InvokeContextRestored(); TBMessageWindow *msg_win = new TBMessageWindow(ev.target, TBID()); msg_win->Show("Context lost & restore", "Called InvokeContextLost and InvokeContextRestored.\n\n" "Does everything look fine?"); return true; } else if (ev.target->GetID() == TBIDC("test-layout")) { TBStr resource_file("Demo/demo01/ui_resources/"); resource_file.Append(ev.target->data.GetString()); new LayoutWindow(resource_file); return true; } else if (ev.target->GetID() == TBIDC("test-connections")) { new ConnectionWindow(); return true; } else if (ev.target->GetID() == TBIDC("test-list")) { new AdvancedListWindow(&advanced_source); return true; } else if (ev.target->GetID() == TBIDC("test-image")) { new ImageWindow(); return true; } else if (ev.target->GetID() == TBIDC("test-page")) { new PageWindow(); return true; } else if (ev.target->GetID() == TBIDC("test-animations")) { new AnimationsWindow(); return true; } else if (ev.target->GetID() == TBIDC("test-scroll-container")) { new ScrollContainerWindow(); return true; } else if (ev.target->GetID() == TBIDC("test-skin-conditions")) { (new DemoWindow())->LoadResourceFile("Demo/demo01/ui_resources/test_skin_conditions01.tb.txt"); (new DemoWindow())->LoadResourceFile("Demo/demo01/ui_resources/test_skin_conditions02.tb.txt"); return true; } else if (ev.target->GetID() == TBIDC("test-resource-edit")) { ResourceEditWindow *res_edit_win = new ResourceEditWindow(); res_edit_win->Load("Demo/demo01/ui_resources/resource_edit_test.tb.txt"); GetParent()->AddChild(res_edit_win); return true; } else if (ev.type == EVENT_TYPE_CLICK && ev.target->GetID() == TBIDC("debug settings")) { #ifdef TB_RUNTIME_DEBUG_INFO ShowDebugInfoSettingsWindow(GetParentRoot()); #else TBMessageWindow *msg_win = new TBMessageWindow(ev.target, TBID()); msg_win->Show("Debug settings", "Debug settings is only available in builds " "compiled with TB_RUNTIME_DEBUG_INFO defined.\n\n" "Debug builds enable this by default."); #endif return true; } } return DemoWindow::OnEvent(ev); }