Index: tools/viewer/sk_app/CommandSet.cpp |
diff --git a/tools/viewer/sk_app/CommandSet.cpp b/tools/viewer/sk_app/CommandSet.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e426eaab210dca55e838c2368352bb305bcb36f2 |
--- /dev/null |
+++ b/tools/viewer/sk_app/CommandSet.cpp |
@@ -0,0 +1,157 @@ |
+/* |
+* Copyright 2016 Google Inc. |
+* |
+* Use of this source code is governed by a BSD-style license that can be |
+* found in the LICENSE file. |
+*/ |
+ |
+#include "CommandSet.h" |
+ |
+#include "SkCanvas.h" |
+#include "SkTSort.h" |
+ |
+namespace sk_app { |
+ |
+static bool on_key_handler(Window::Key key, Window::InputState state, uint32_t modifiers, |
+ void* userData) { |
+ CommandSet* cs = reinterpret_cast<CommandSet*>(userData); |
+ return cs->onKey(key, state, modifiers); |
+} |
+ |
+static bool on_char_handler(SkUnichar c, uint32_t modifiers, void* userData) { |
+ CommandSet* cs = reinterpret_cast<CommandSet*>(userData); |
+ return cs->onChar(c, modifiers); |
+} |
+ |
+CommandSet::CommandSet() |
+ : fHelpMode(kNone_HelpMode) { |
+ this->addCommand('h', "Overlays", "Show help screen", [this]() { |
+ switch (this->fHelpMode) { |
+ case kNone_HelpMode: |
+ this->fHelpMode = kGrouped_HelpMode; |
+ break; |
+ case kGrouped_HelpMode: |
+ this->fHelpMode = kAlphabetical_HelpMode; |
+ break; |
+ case kAlphabetical_HelpMode: |
+ this->fHelpMode = kNone_HelpMode; |
+ break; |
+ } |
+ fWindow->inval(); |
+ }); |
+} |
+ |
+void CommandSet::attach(Window* window) { |
+ fWindow = window; |
+ window->registerKeyFunc(on_key_handler, this); |
+ window->registerCharFunc(on_char_handler, this); |
+} |
+ |
+bool CommandSet::onKey(Window::Key key, Window::InputState state, uint32_t modifiers) { |
+ if (Window::kDown_InputState == state) { |
+ for (Command& cmd : fCommands) { |
+ if (Command::kKey_CommandType == cmd.fType && key == cmd.fKey) { |
+ cmd.fFunction(); |
+ return true; |
+ } |
+ } |
+ } |
+ |
+ return false; |
+} |
+ |
+bool CommandSet::onChar(SkUnichar c, uint32_t modifiers) { |
+ for (Command& cmd : fCommands) { |
+ if (Command::kChar_CommandType == cmd.fType && c == cmd.fChar) { |
+ cmd.fFunction(); |
+ return true; |
+ } |
+ } |
+ |
+ return false; |
+} |
+ |
+void CommandSet::addCommand(SkUnichar c, const char* group, const char* description, |
+ std::function<void(void)> function) { |
+ fCommands.push_back(Command(c, group, description, function)); |
+} |
+ |
+void CommandSet::addCommand(Window::Key k, const char* keyName, const char* group, |
+ const char* description, std::function<void(void)> function) { |
+ fCommands.push_back(Command(k, keyName, group, description, function)); |
+} |
+ |
+#if defined(SK_BUILD_FOR_WIN32) |
+ #define SK_strcasecmp _stricmp |
+#else |
+ #define SK_strcasecmp strcasecmp |
+#endif |
+ |
+bool CommandSet::compareCommandKey(const Command& first, const Command& second) { |
+ return SK_strcasecmp(first.fKeyName.c_str(), second.fKeyName.c_str()) < 0; |
+} |
+ |
+bool CommandSet::compareCommandGroup(const Command& first, const Command& second) { |
+ return SK_strcasecmp(first.fGroup.c_str(), second.fGroup.c_str()) < 0; |
+} |
+ |
+void CommandSet::drawHelp(SkCanvas* canvas) { |
+ if (kNone_HelpMode == fHelpMode) { |
+ return; |
+ } |
+ |
+ // Sort commands for current mode: |
+ SkTQSort(fCommands.begin(), fCommands.end() - 1, |
+ kAlphabetical_HelpMode == fHelpMode ? compareCommandKey : compareCommandGroup); |
+ |
+ SkPaint bgPaint; |
+ bgPaint.setColor(0xC0000000); |
+ canvas->drawPaint(bgPaint); |
+ |
+ SkPaint paint; |
+ paint.setTextSize(16); |
+ paint.setAntiAlias(true); |
+ paint.setColor(0xFFFFFFFF); |
+ |
+ SkPaint groupPaint; |
+ groupPaint.setTextSize(18); |
+ groupPaint.setUnderlineText(true); |
+ groupPaint.setAntiAlias(true); |
+ groupPaint.setColor(0xFFFFFFFF); |
+ |
+ SkScalar x = SkIntToScalar(10); |
+ SkScalar y = SkIntToScalar(10); |
+ |
+ // Measure all key strings: |
+ SkScalar keyWidth = 0; |
+ for (Command& cmd : fCommands) { |
+ keyWidth = SkMaxScalar(keyWidth, |
+ paint.measureText(cmd.fKeyName.c_str(), cmd.fKeyName.size())); |
+ } |
+ keyWidth += paint.measureText(" ", 1); |
+ |
+ // If we're grouping by category, we'll be adding text height on every new group (including the |
+ // first), so no need to do that here. Otherwise, skip down so the first line is where we want. |
+ if (kGrouped_HelpMode != fHelpMode) { |
+ y += paint.getTextSize(); |
+ } |
+ |
+ // Print everything: |
+ SkString lastGroup; |
+ for (Command& cmd : fCommands) { |
+ if (kGrouped_HelpMode == fHelpMode && lastGroup != cmd.fGroup) { |
+ // Group change. Advance and print header: |
+ y += paint.getTextSize(); |
+ canvas->drawText(cmd.fGroup.c_str(), cmd.fGroup.size(), x, y, groupPaint); |
+ y += groupPaint.getTextSize() + 2; |
+ lastGroup = cmd.fGroup; |
+ } |
+ |
+ canvas->drawText(cmd.fKeyName.c_str(), cmd.fKeyName.size(), x, y, paint); |
+ SkString text = SkStringPrintf(": %s", cmd.fDescription.c_str()); |
+ canvas->drawText(text.c_str(), text.size(), x + keyWidth, y, paint); |
+ y += paint.getTextSize() + 2; |
+ } |
+} |
+ |
+} // namespace sk_app |