mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-10-20 15:21:21 -06:00
NEW:DailyTips
Change-Id: I510e96652c9a0c9fe422546b09b2d035d9e46a23
This commit is contained in:
parent
c9499b7401
commit
81da77d1e0
9 changed files with 1366 additions and 5 deletions
|
@ -211,6 +211,8 @@ set(SLIC3R_GUI_SOURCES
|
|||
GUI/MonitorBasePanel.h
|
||||
GUI/UpgradePanel.cpp
|
||||
GUI/UpgradePanel.hpp
|
||||
GUI/HintNotification.hpp
|
||||
GUI/HintNotification.cpp
|
||||
GUI/HMSPanel.hpp
|
||||
GUI/HMSPanel.cpp
|
||||
GUI/MonitorPage.cpp
|
||||
|
|
|
@ -1050,9 +1050,9 @@ void GUI_App::post_init()
|
|||
}*/
|
||||
|
||||
// BBS: to be checked
|
||||
#if SUPPORT_SHOW_HINTS
|
||||
#if 1
|
||||
// show "Did you know" notification
|
||||
if (app_config->get("show_hints") == "1" && ! is_gcode_viewer())
|
||||
if (app_config->get("show_hints") == "true" && ! is_gcode_viewer())
|
||||
plater_->get_notification_manager()->push_hint_notification(true);
|
||||
#endif
|
||||
|
||||
|
|
1085
src/slic3r/GUI/HintNotification.cpp
Normal file
1085
src/slic3r/GUI/HintNotification.cpp
Normal file
File diff suppressed because it is too large
Load diff
122
src/slic3r/GUI/HintNotification.hpp
Normal file
122
src/slic3r/GUI/HintNotification.hpp
Normal file
|
@ -0,0 +1,122 @@
|
|||
#ifndef slic3r_GUI_HintNotification_hpp_
|
||||
#define slic3r_GUI_HintNotification_hpp_
|
||||
|
||||
#include "NotificationManager.hpp"
|
||||
|
||||
namespace Slic3r {namespace GUI {
|
||||
|
||||
// Database of hints updatable
|
||||
struct HintData
|
||||
{
|
||||
std::string id_string;
|
||||
std::string text;
|
||||
size_t weight;
|
||||
bool was_displayed;
|
||||
std::string hypertext;
|
||||
std::string follow_text;
|
||||
std::string disabled_tags;
|
||||
std::string enabled_tags;
|
||||
bool runtime_disable; // if true - hyperlink will check before every click if not in disabled mode
|
||||
std::string documentation_link;
|
||||
std::function<void(void)> callback{ nullptr };
|
||||
};
|
||||
|
||||
class HintDatabase
|
||||
{
|
||||
public:
|
||||
static HintDatabase& get_instance()
|
||||
{
|
||||
static HintDatabase instance; // Guaranteed to be destroyed.
|
||||
// Instantiated on first use.
|
||||
return instance;
|
||||
}
|
||||
private:
|
||||
HintDatabase()
|
||||
: m_hint_id(0)
|
||||
{}
|
||||
public:
|
||||
~HintDatabase();
|
||||
HintDatabase(HintDatabase const&) = delete;
|
||||
void operator=(HintDatabase const&) = delete;
|
||||
|
||||
// return true if HintData filled;
|
||||
HintData* get_hint(bool new_hint = true);
|
||||
size_t get_count() {
|
||||
if (!m_initialized)
|
||||
return 0;
|
||||
return m_loaded_hints.size();
|
||||
}
|
||||
// resets m_initiailized to false and writes used if was initialized
|
||||
// used when reloading in runtime - like change language
|
||||
void uninit();
|
||||
private:
|
||||
void init();
|
||||
void load_hints_from_file(const boost::filesystem::path& path);
|
||||
bool is_used(const std::string& id);
|
||||
void set_used(const std::string& id);
|
||||
void clear_used();
|
||||
// Returns position in m_loaded_hints with next hint chosed randomly with weights
|
||||
size_t get_next();
|
||||
size_t m_hint_id;
|
||||
bool m_initialized{ false };
|
||||
std::vector<HintData> m_loaded_hints;
|
||||
bool m_sorted_hints{ false };
|
||||
std::vector<std::string> m_used_ids;
|
||||
bool m_used_ids_loaded{ false };
|
||||
};
|
||||
// Notification class - shows current Hint ("Did you know")
|
||||
class NotificationManager::HintNotification : public NotificationManager::PopNotification
|
||||
{
|
||||
public:
|
||||
HintNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, bool new_hint)
|
||||
: PopNotification(n, id_provider, evt_handler)
|
||||
{
|
||||
retrieve_data(new_hint);
|
||||
}
|
||||
virtual void init() override;
|
||||
void open_next() { retrieve_data(); }
|
||||
protected:
|
||||
virtual void set_next_window_size(ImGuiWrapper& imgui) override;
|
||||
virtual void count_spaces() override;
|
||||
virtual void count_lines() override;
|
||||
virtual bool on_text_click() override;
|
||||
virtual void render_text(ImGuiWrapper& imgui,
|
||||
const float win_size_x, const float win_size_y,
|
||||
const float win_pos_x, const float win_pos_y) override;
|
||||
virtual void render_close_button(ImGuiWrapper& imgui,
|
||||
const float win_size_x, const float win_size_y,
|
||||
const float win_pos_x, const float win_pos_y) override;
|
||||
virtual void render_minimize_button(ImGuiWrapper& imgui,
|
||||
const float win_pos_x, const float win_pos_y) override {}
|
||||
void render_preferences_button(ImGuiWrapper& imgui,
|
||||
const float win_pos_x, const float win_pos_y);
|
||||
void render_right_arrow_button(ImGuiWrapper& imgui,
|
||||
const float win_size_x, const float win_size_y,
|
||||
const float win_pos_x, const float win_pos_y);
|
||||
void render_documentation_button(ImGuiWrapper& imgui,
|
||||
const float win_size_x, const float win_size_y,
|
||||
const float win_pos_x, const float win_pos_y);
|
||||
void render_logo(ImGuiWrapper& imgui,
|
||||
const float win_size_x, const float win_size_y,
|
||||
const float win_pos_x, const float win_pos_y);
|
||||
// recursion counter -1 tells to retrieve same hint as last time
|
||||
void retrieve_data(bool new_hint = true);
|
||||
void open_documentation();
|
||||
|
||||
bool m_has_hint_data{ false };
|
||||
std::function<void(void)> m_hypertext_callback;
|
||||
std::string m_disabled_tags;
|
||||
std::string m_enabled_tags;
|
||||
bool m_runtime_disable;
|
||||
std::string m_documentation_link;
|
||||
float m_close_b_y{ 0 };
|
||||
float m_close_b_w{ 0 };
|
||||
// hover of buttons
|
||||
long m_docu_hover_time{ 0 };
|
||||
long m_prefe_hover_time{ 0 };
|
||||
};
|
||||
|
||||
} //namespace Slic3r
|
||||
} //namespace GUI
|
||||
|
||||
#endif //slic3r_GUI_HintNotification_hpp_
|
|
@ -1635,6 +1635,10 @@ static wxMenu* generate_help_menu()
|
|||
append_menu_item(helpMenu, wxID_ANY, about_title, about_title,
|
||||
[](wxCommandEvent&) { Slic3r::GUI::about(); });
|
||||
#endif
|
||||
append_menu_item(helpMenu, wxID_ANY, _L("Show Tip of the Day"), _L("Show Tip of the Day"), [](wxCommandEvent&) {
|
||||
wxGetApp().plater()->get_notification_manager()->push_hint_notification(false);
|
||||
wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
|
||||
});
|
||||
|
||||
append_menu_item(helpMenu, wxID_ANY, _L("Open Network Test"), _L("Open Network Test"), [](wxCommandEvent&) {
|
||||
NetworkTestDialog dlg(wxGetApp().mainframe);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "NotificationManager.hpp"
|
||||
|
||||
#include "HintNotification.hpp"
|
||||
#include "GUI.hpp"
|
||||
#include "ImGuiWrapper.hpp"
|
||||
#include "wxExtensions.hpp"
|
||||
|
@ -1787,7 +1788,27 @@ int NotificationManager::progress_indicator_get_range() const
|
|||
|
||||
void NotificationManager::push_hint_notification(bool open_next)
|
||||
{
|
||||
return;
|
||||
for (std::unique_ptr<PopNotification>& notification : m_pop_notifications) {
|
||||
if (notification->get_type() == NotificationType::DidYouKnowHint) {
|
||||
(dynamic_cast<HintNotification*>(notification.get()))->open_next();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
NotificationData data{ NotificationType::DidYouKnowHint, NotificationLevel::HintNotificationLevel, 300, "" };
|
||||
// from user - open now
|
||||
if (!open_next) {
|
||||
push_notification_data(std::make_unique<NotificationManager::HintNotification>(data, m_id_provider, m_evt_handler, open_next), 0);
|
||||
stop_delayed_notifications_of_type(NotificationType::DidYouKnowHint);
|
||||
// at startup - delay for half a second to let other notification pop up, than try every 30 seconds
|
||||
// show only if no notifications are shown
|
||||
}
|
||||
else {
|
||||
auto condition = [&self = std::as_const(*this)]() {
|
||||
return self.get_notification_count() == 0;
|
||||
};
|
||||
push_delayed_notification_data(std::make_unique<NotificationManager::HintNotification>(data, m_id_provider, m_evt_handler, open_next), condition, 500, 30000);
|
||||
}
|
||||
}
|
||||
|
||||
bool NotificationManager::is_hint_notification_open()
|
||||
|
|
|
@ -688,6 +688,8 @@ wxWindow* PreferencesDialog::create_general_page()
|
|||
std::vector<wxString> Units = {_L("Metric"), _L("Imperial")};
|
||||
auto item_currency = create_item_combobox(_L("Units"), page, _L("Units"), "use_inches", Units);
|
||||
|
||||
auto item_hints = create_item_checkbox(_L("Show \"Tip of the day\" notification after start"), page, _L("If enabled, useful hints are displayed at startup."), 50, "show_hints");
|
||||
|
||||
auto title_sync_settings = create_item_title(_L("User sync"), page, _L("User sync"));
|
||||
auto item_user_sync = create_item_checkbox(_L("Auto sync user presets(Printer/Filament/Process)"), page, _L("User Sync"), 50, "sync_user_preset");
|
||||
|
||||
|
@ -713,6 +715,7 @@ wxWindow* PreferencesDialog::create_general_page()
|
|||
sizer_page->Add(item_language, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(item_region, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(item_currency, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(item_hints, 0, wxTOP, FromDIP(3));
|
||||
sizer_page->Add(title_sync_settings, 0, wxTOP | wxEXPAND, FromDIP(20));
|
||||
sizer_page->Add(item_user_sync, 0, wxTOP, FromDIP(3));
|
||||
#ifdef _WIN32
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue