1 #pragma once
2 #include <gtkmm.h>
3 #include <memory>
4 
5 #include "item_view.h"
6 #include "search_list.h"
7 
8 class KeychainView : public Gtk::HPaned {
9 public:
KeychainView(const std::shared_ptr<Keychain> & _keychain)10     KeychainView(const std::shared_ptr<Keychain>& _keychain)
11         : Gtk::HPaned(),
12           keychain(_keychain),
13           placeHolderWidget("Select an item...", Gtk::ALIGN_CENTER),
14           scroller() {
15         searchList = std::unique_ptr<SearchList>(new SearchList(
16             [this](const Glib::ustring& uuid) { selectionChangedFn(uuid); }, *keychain));
17 
18         add1(*searchList);
19         add2(scroller);
20         scroller.add(placeHolderWidget);
21 
22         show_all_children();
23     }
~KeychainView()24     virtual ~KeychainView(){};
25 
26 protected:
27     std::shared_ptr<Keychain> keychain;
28     std::unique_ptr<SearchList> searchList = nullptr;
selectionChangedFn(const Glib::ustring & uuid)29     void selectionChangedFn(const Glib::ustring& uuid) {
30         auto newItemIter = keychain->find(uuid);
31         // If this isn't in the keychain (weird!) return early
32         if (newItemIter == keychain->end())
33             return;
34 
35         const KeychainItem& newItem = newItemIter->second;
36         cur_view = std::unique_ptr<ItemView>(new ItemView(newItem));
37         scroller.remove_with_viewport();
38         scroller.add(*cur_view);
39 
40         show_all_children();
41     };
42 
43     Gtk::Label placeHolderWidget;
44     Gtk::ScrolledWindow scroller;
45     std::unique_ptr<ItemView> cur_view = nullptr;
46 };
47