[niepce] workspace: implement folder creation



commit cfdb7908884db3cdd4863fb75dc5cc3eff64fa6c
Author: Hubert Figuière <hub figuiere net>
Date:   Wed Nov 15 11:22:11 2017 -0500

    workspace: implement folder creation

 src/libraryclient/libraryclient.rs    |    7 ++++++
 src/niepce/ui/niepcewindow.cpp        |    5 ++-
 src/niepce/ui/workspacecontroller.cpp |   34 +++++++++++++++++++++++++++++---
 src/niepce/ui/workspacecontroller.hpp |   23 +++++++++++++--------
 4 files changed, 54 insertions(+), 15 deletions(-)
---
diff --git a/src/libraryclient/libraryclient.rs b/src/libraryclient/libraryclient.rs
index ad75808..abd5bfa 100644
--- a/src/libraryclient/libraryclient.rs
+++ b/src/libraryclient/libraryclient.rs
@@ -196,6 +196,13 @@ pub extern "C" fn libraryclient_query_folder_content(client: &mut LibraryClientW
 }
 
 #[no_mangle]
+pub extern "C" fn libraryclient_create_folder_sync(client: &mut LibraryClientWrapper,
+                                                   p: *const c_char) -> LibraryId {
+    let path = unsafe { CStr::from_ptr(p) }.to_string_lossy();
+    client.unwrap_mut().create_folder_sync(String::from(path))
+}
+
+#[no_mangle]
 pub extern "C" fn libraryclient_count_folder(client: &mut LibraryClientWrapper,
                                              folder_id: LibraryId) {
     client.unwrap_mut().count_folder(folder_id)
diff --git a/src/niepce/ui/niepcewindow.cpp b/src/niepce/ui/niepcewindow.cpp
index 1d5e54b..b843612 100644
--- a/src/niepce/ui/niepcewindow.cpp
+++ b/src/niepce/ui/niepcewindow.cpp
@@ -111,7 +111,9 @@ NiepceWindow::_createModuleShell()
 
 
     // workspace treeview
-    m_workspacectrl = WorkspaceController::Ptr( new WorkspaceController() );
+    auto workspace_actions = Gio::SimpleActionGroup::create();
+    gtkWindow().insert_action_group("workspace", workspace_actions);
+    m_workspacectrl = WorkspaceController::Ptr(new WorkspaceController(workspace_actions));
 
     m_notifcenter->signal_lib_notification
         .connect(sigc::mem_fun(*m_workspacectrl,
@@ -191,7 +193,6 @@ void NiepceWindow::init_actions()
     // move to the workspace
     section = Gio::Menu::create();
     submenu->append_section(section);
-    section->append(_("New Folder..."), "action");
     section->append(_("New Project..."), "action");
     fwk::add_action(m_action_group, "Import",
                     sigc::mem_fun(*this,
diff --git a/src/niepce/ui/workspacecontroller.cpp b/src/niepce/ui/workspacecontroller.cpp
index bc4221c..02f0bd9 100644
--- a/src/niepce/ui/workspacecontroller.cpp
+++ b/src/niepce/ui/workspacecontroller.cpp
@@ -25,10 +25,11 @@
 #include <gtkmm/box.h>
 
 #include "fwk/base/debug.hpp"
+#include "fwk/toolkit/application.hpp"
+#include "fwk/toolkit/gtkutils.hpp"
 #include "niepce/notifications.hpp"
 #include "engine/library/notification.hpp"
 #include "libraryclient/libraryclient.hpp"
-#include "fwk/toolkit/application.hpp"
 #include "niepcewindow.hpp"
 #include "workspacecontroller.hpp"
 
@@ -38,8 +39,9 @@ using fwk::Application;
 namespace ui {
 
 
-WorkspaceController::WorkspaceController()
+WorkspaceController::WorkspaceController(const Glib::RefPtr<Gio::SimpleActionGroup>& action_group)
     : fwk::UiController()
+    , m_action_group(action_group)
     , m_vbox(Gtk::ORIENTATION_VERTICAL)
 {
     static struct _Icons {
@@ -80,6 +82,13 @@ fwk::Configuration::Ptr WorkspaceController::getLibraryConfig() const
     return std::dynamic_pointer_cast<NiepceWindow>(m_parent.lock())->getLibraryConfig();
 }
 
+void WorkspaceController::action_new_folder()
+{
+    // XXX get a unique name
+    auto id = ffi::libraryclient_create_folder_sync(getLibraryClient()->client(), "foobar");
+    // select folder in tree
+}
+
 void WorkspaceController::on_lib_notification(const eng::LibNotification &ln)
 {
     DBG_OUT("notification for workspace");
@@ -287,16 +296,33 @@ Gtk::Widget * WorkspaceController::buildWidget()
     col = m_librarytree.get_column(num - 1);
     col->set_alignment(1.0f);
 
+    Gtk::Box* header = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL));
+    header->set_spacing(4);
     // TODO make it a mnemonic
     m_label.set_text_with_mnemonic(Glib::ustring(_("_Workspace")));
     m_label.set_mnemonic_widget(m_librarytree);
-    m_vbox.pack_start(m_label, Gtk::PACK_SHRINK);
+    header->pack_start(m_label, Gtk::PACK_SHRINK);
+    Gtk::MenuButton* add_btn = Gtk::manage(new Gtk::MenuButton);
+    add_btn->set_direction(Gtk::ARROW_NONE);
+
+    auto menu = Gio::Menu::create();
+
+    auto section = Gio::Menu::create();
+    menu->append_section(section);
+    fwk::add_action(m_action_group, "NewFolder",
+                    sigc::mem_fun(*this,
+                                  &WorkspaceController::action_new_folder),
+                    section, _("New Folder..."), "workspace");
+    add_btn->set_menu_model(menu);
+
+    header->pack_end(*add_btn, Gtk::PACK_SHRINK);
+    m_vbox.pack_start(*header, Gtk::PACK_SHRINK);
     Gtk::ScrolledWindow* scrolled = Gtk::manage(new Gtk::ScrolledWindow);
     m_vbox.pack_start(*scrolled);
     scrolled->add(m_librarytree);
 
     m_librarytree.get_selection()->signal_changed().connect (
-        sigc::mem_fun(this, 
+        sigc::mem_fun(this,
                       &WorkspaceController::on_libtree_selection));
     m_librarytree.signal_row_expanded().connect(
         sigc::mem_fun(this,
diff --git a/src/niepce/ui/workspacecontroller.hpp b/src/niepce/ui/workspacecontroller.hpp
index 1b04094..04ee01e 100644
--- a/src/niepce/ui/workspacecontroller.hpp
+++ b/src/niepce/ui/workspacecontroller.hpp
@@ -17,8 +17,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-
-
 #ifndef __UI_WORKSPACECONTROLLER_H__
 #define __UI_WORKSPACECONTROLLER_H__
 
@@ -45,7 +43,7 @@ class WorkspaceController
 {
 public:
     typedef std::shared_ptr<WorkspaceController> Ptr;
-    
+
     enum {
         FOLDERS_ITEM,
         PROJECTS_ITEM,
@@ -54,18 +52,18 @@ public:
         PROJECT_ITEM,
         KEYWORD_ITEM
     };
-    
-    WorkspaceController();
-    class WorkspaceTreeColumns 
+
+    WorkspaceController(const Glib::RefPtr<Gio::SimpleActionGroup>& action_group);
+    class WorkspaceTreeColumns
         : public Gtk::TreeModelColumnRecord
     {
     public:
-        
+
         WorkspaceTreeColumns()
-            { 
+            {
                 add(m_icon);
                 add(m_id);
-                add(m_label);  
+                add(m_label);
                 add(m_type);
                 add(m_count);
                 add(m_count_n);
@@ -86,6 +84,10 @@ public:
     
     virtual Gtk::Widget * buildWidget() override;
 private:
+
+    /** action to create a new folder */
+    void action_new_folder();
+
     void on_row_expanded_collapsed(const Gtk::TreeIter& iter,
                                    const Gtk::TreePath& path, bool expanded);
     void on_row_expanded(const Gtk::TreeIter& iter,
@@ -124,6 +126,9 @@ private:
         ICON_KEYWORD,
         _ICON_SIZE
     };
+
+    Glib::RefPtr<Gio::SimpleActionGroup> m_action_group;
+
     std::array< Glib::RefPtr<Gdk::Pixbuf>, _ICON_SIZE > m_icons;
     WorkspaceTreeColumns           m_librarycolumns;
     Gtk::Box                       m_vbox;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]