summaryrefslogtreecommitdiff
path: root/shortcuts
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2014-05-14 03:13:57 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2014-05-14 03:13:57 +0200
commit6c4c032050bcf8504e1e3c62ed1c2904575b8909 (patch)
tree0b7a13d362c0d8d7fee9d3bcb263477a98879013 /shortcuts
parent6305d8561ad737a87eb21d0054e861e3c137cb27 (diff)
ShortcutView: adjust column maximum width inside PreLayoutManagement instead that when filling the model
(bzr r3794.8.6)
Diffstat (limited to 'shortcuts')
-rw-r--r--shortcuts/ShortcutView.cpp87
-rw-r--r--shortcuts/ShortcutView.h8
2 files changed, 52 insertions, 43 deletions
diff --git a/shortcuts/ShortcutView.cpp b/shortcuts/ShortcutView.cpp
index 7eea8348e..04ca2dc4f 100644
--- a/shortcuts/ShortcutView.cpp
+++ b/shortcuts/ShortcutView.cpp
@@ -76,7 +76,6 @@ NUX_IMPLEMENT_OBJECT_TYPE(View);
View::View()
: ui::UnityWindowView()
- , queue_render_(false)
{
auto main_layout = new nux::VLayout();
main_layout->SetPadding(MAIN_HORIZONTAL_PADDING.CP(scale), MAIN_VERTICAL_PADDING.CP(scale));
@@ -161,8 +160,15 @@ nux::View* View::CreateShortKeyEntryView(AbstractHint::Ptr const& hint, StaticCa
layout->SetSpaceBetweenChildren(INTER_SPACE_SHORTKEY_DESCRIPTION.CP(scale));
description_layout->SetContentDistribution(nux::MAJOR_POSITION_START);
- view->key_changed_conn_ = hint->shortkey.changed.connect([this] (std::string const&) {
- queue_render_ = true;
+ view->key_changed_conn_ = hint->shortkey.changed.connect([this, view, shortkey_view] (std::string const& key) {
+ std::string escaped = glib::String(g_markup_escape_text(key.c_str(), -1)).Str();
+
+ if (!escaped.empty())
+ escaped = "<b>"+escaped+"</b>";
+
+ shortkey_view->SetText(escaped);
+ shortkey_view->SetVisible(!escaped.empty());
+ view->SetVisible(shortkey_view->IsVisible());
QueueRelayout();
QueueDraw();
});
@@ -204,19 +210,44 @@ nux::Geometry View::GetBackgroundGeometry()
void View::DrawOverlay(nux::GraphicsEngine& GfxContext, bool force_draw, nux::Geometry const& clip)
{
- if (queue_render_)
- RenderColumns();
-
view_layout_->ProcessDraw(GfxContext, force_draw);
}
+void View::PreLayoutManagement()
+{
+ UnityWindowView::PreLayoutManagement();
+
+ for (auto const& column : shortkeys_)
+ {
+ int min_width = SHORTKEY_COLUMN_DEFAULT_WIDTH.CP(scale);
+
+ for (auto* shortkey : column)
+ min_width = std::min(std::max(min_width, shortkey->GetTextExtents().width), shortkey->GetMaximumWidth());
+
+ for (auto* shortkey : column)
+ shortkey->SetMinimumWidth(min_width);
+ }
+
+ for (auto const& column : descriptions_)
+ {
+ int min_width = DESCRIPTION_COLUMN_DEFAULT_WIDTH.CP(scale);
+
+ for (auto* description : column)
+ min_width = std::min(std::max(min_width, description->GetTextExtents().width), description->GetMaximumWidth());
+
+ for (auto* description : column)
+ description->SetMinimumWidth(min_width);
+ }
+}
+
void View::RenderColumns()
{
columns_layout_->Clear();
+ shortkeys_.clear();
+ descriptions_.clear();
if (!model_)
{
- queue_render_ = false;
ComputeContentSize();
QueueRelayout();
return;
@@ -227,37 +258,14 @@ void View::RenderColumns()
auto const& columns = columns_layout_->GetChildren();
auto const& categories = model_->categories();
const int categories_per_column = model_->categories_per_column();
+ const int columns_number = categories.size() / categories_per_column + 1;
const int top_space = (23_em).CP(scale);
const int bottom_space = (20_em).CP(scale);
-
- const int columns_number = categories.size() / categories_per_column + 1;
const int max_shortkeys_width = SHORTKEY_COLUMN_MAX_WIDTH.CP(scale);
const int max_descriptions_width = DESCRIPTION_COLUMN_MAX_WIDTH.CP(scale);
- std::vector<int> shortkeys_width(columns_number, SHORTKEY_COLUMN_DEFAULT_WIDTH.CP(scale));
- std::vector<int> descriptions_width(columns_number, DESCRIPTION_COLUMN_DEFAULT_WIDTH.CP(scale));
- std::unordered_map<AbstractHint::Ptr, StaticCairoText*> shortkeys;
- std::unordered_map<AbstractHint::Ptr, StaticCairoText*> descriptions;
-
- for (auto const& category : categories)
- {
- column_idx = i/categories_per_column;
-
- for (auto const& hint : model_->hints().at(category))
- {
- auto* shortkey = CreateShortcutTextView(hint->shortkey(), true);
- shortkeys_width[column_idx] = std::min(std::max(shortkeys_width[column_idx], shortkey->GetTextExtents().width), max_shortkeys_width);
- shortkeys.insert({hint, shortkey});
-
- auto* description = CreateShortcutTextView(hint->description(), false);
- descriptions_width[column_idx] = std::min(std::max(descriptions_width[column_idx], description->GetTextExtents().width), max_descriptions_width);
- descriptions.insert({hint, description});
- }
-
- ++i;
- }
- i = 0;
- column_idx = 0;
+ shortkeys_.resize(columns_number);
+ descriptions_.resize(columns_number);
for (auto const& category : categories)
{
@@ -270,13 +278,13 @@ void View::RenderColumns()
for (auto const& hint : model_->hints().at(category))
{
- StaticCairoText* shortkey = shortkeys[hint];
- shortkey->SetMinimumWidth(shortkeys_width[column_idx]);
- shortkey->SetMaximumWidth(shortkeys_width[column_idx]);
+ StaticCairoText* shortkey = CreateShortcutTextView(hint->shortkey(), true);
+ shortkey->SetMaximumWidth(max_shortkeys_width);
+ shortkeys_[column_idx].push_back(shortkey);
- StaticCairoText* description = descriptions[hint];
- description->SetMinimumWidth(descriptions_width[column_idx]);
- description->SetMaximumWidth(descriptions_width[column_idx]);
+ StaticCairoText* description = CreateShortcutTextView(hint->description(), false);
+ description->SetMaximumWidth(max_descriptions_width);
+ descriptions_[column_idx].push_back(description);
nux::View* view = CreateShortKeyEntryView(hint, shortkey, description);
intermediate_layout->AddView(view, 0, nux::MINOR_POSITION_START, nux::MINOR_SIZE_FULL);
@@ -311,7 +319,6 @@ void View::RenderColumns()
++i;
}
- queue_render_ = false;
ComputeContentSize();
QueueRelayout();
}
diff --git a/shortcuts/ShortcutView.h b/shortcuts/ShortcutView.h
index a5d17a465..322cbc6ba 100644
--- a/shortcuts/ShortcutView.h
+++ b/shortcuts/ShortcutView.h
@@ -49,8 +49,9 @@ public:
protected:
// Protected methods
- void DrawOverlay(nux::GraphicsEngine& GfxContext, bool force_draw, nux::Geometry const& clip);
- nux::Geometry GetBackgroundGeometry();
+ void DrawOverlay(nux::GraphicsEngine& GfxContext, bool force_draw, nux::Geometry const& clip) override;
+ nux::Geometry GetBackgroundGeometry() override;
+ void PreLayoutManagement() override;
// Introspectable methods
std::string GetName() const;
@@ -67,7 +68,8 @@ private:
// Private members
Model::Ptr model_;
nux::HLayout* columns_layout_;
- bool queue_render_;
+ std::vector<std::vector<StaticCairoText*>> shortkeys_;
+ std::vector<std::vector<StaticCairoText*>> descriptions_;
friend class TestShortcutView;
};