]> spindle.queued.net Git - midori/commitdiff
Switch to newest tabs with Ctrl+1 and Ctrl+2
authorAndré Stösel <Midori-Plugin@PyIT.de>
Fri, 10 Dec 2010 20:08:09 +0000 (21:08 +0100)
committerChristian Dywan <christian@twotoasts.de>
Sat, 11 Dec 2010 23:36:33 +0000 (00:36 +0100)
extensions/history-list.vala

index 89dd35d00eecda4379c15bb57036416570a7e9cf..3bb1d98edbb96158980179a659f59df104143e9c 100644 (file)
@@ -29,7 +29,7 @@ private abstract class HistoryWindow : Gtk.Window {
                      window_position: Gtk.WindowPosition.CENTER,
                      browser: browser);
     }
-    public void walk (int step) {
+    public virtual void walk (int step) {
         Gtk.TreePath? path;
         Gtk.TreeViewColumn? column;
 
@@ -50,22 +50,9 @@ private abstract class HistoryWindow : Gtk.Window {
 }
 
 private class TabWindow : HistoryWindow {
-    public TabWindow (Midori.Browser browser) {
-        base (browser);
-
-        var hbox = new Gtk.HBox (false, 1);
-        this.add (hbox);
-
-        var sw = new Gtk.ScrolledWindow (null, null);
-        sw.set_policy (PolicyType.NEVER , PolicyType.AUTOMATIC);
-        sw.set_shadow_type (ShadowType.ETCHED_IN);
-        hbox.pack_start (sw, true, true, 0);
-
-        var store = new Gtk.ListStore (TabTreeCells.TREE_CELL_COUNT,
-            typeof (Gdk.Pixbuf), typeof (string), typeof (void*));
-
-        Gtk.TreeIter iter;
-        unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history");
+    protected Gtk.HBox? hbox;
+    protected Gtk.VBox? vbox;
+    protected void store_append_row (GLib.PtrArray list, Gtk.ListStore store, out Gtk.TreeIter iter) {
         for (var i = list.len; i > 0; i--) {
             Midori.View view = list.index (i - 1) as Midori.View;
 
@@ -79,6 +66,33 @@ private class TabWindow : HistoryWindow {
                              TabTreeCells.TREE_CELL_STRING, title,
                              TabTreeCells.TREE_CELL_POINTER, view);
         }
+    }
+    protected virtual void insert_rows (Gtk.ListStore store) {
+        Gtk.TreeIter iter;
+        unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history");
+        unowned GLib.PtrArray list_new = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
+        store_append_row (list, store, out iter);
+        store_append_row (list_new, store, out iter);
+    }
+    public TabWindow (Midori.Browser browser) {
+        base (browser);
+
+        this.vbox = new Gtk.VBox (false, 1);
+        this.add (this.vbox);
+
+        this.hbox = new Gtk.HBox (false, 1);
+
+        var sw = new Gtk.ScrolledWindow (null, null);
+        sw.set_policy (PolicyType.NEVER , PolicyType.AUTOMATIC);
+        sw.set_shadow_type (ShadowType.ETCHED_IN);
+        this.hbox.pack_start (sw, true, true, 0);
+
+        var store = new Gtk.ListStore (TabTreeCells.TREE_CELL_COUNT,
+            typeof (Gdk.Pixbuf), typeof (string), typeof (void*));
+
+        this.insert_rows (store);
+
+        this.vbox.pack_start (this.hbox, true, true, 0);
 
         this.treeview = new Gtk.TreeView.with_model (store);
         this.treeview.set_fixed_height_mode (true);
@@ -98,8 +112,8 @@ private class TabWindow : HistoryWindow {
         int height;
         int max_lines = 10;
         this.treeview.size_request (out requisition);
-        if ((int)list.len > max_lines) {
-            height = requisition.height / (int)list.len * max_lines + 2;
+        if (store.length > max_lines) {
+            height = requisition.height / store.length * max_lines + 2;
         } else {
             height = requisition.height + 2;
         }
@@ -124,6 +138,31 @@ private class TabWindow : HistoryWindow {
     }
 }
 
+private class NewTabWindow : TabWindow {
+    protected bool first_step = true;
+    protected override void insert_rows (Gtk.ListStore store) {
+        Gtk.TreeIter iter;
+        unowned GLib.PtrArray list = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
+        store_append_row (list, store, out iter);
+
+        if ((int)list.len == 0) {
+            var label = new Gtk.Label (_("There are no unvisited tabs"));
+            this.vbox.pack_start (label, true, true, 0);
+            unowned GLib.PtrArray list_old = this.browser.get_data<GLib.PtrArray> ("history-list-tab-history");
+            store_append_row (list_old, store, out iter);
+        }
+    }
+    public override void walk (int step) {
+        if (this.first_step == false || step != 1) {
+            base.walk (step);
+        }
+        this.first_step = false;
+    }
+    public NewTabWindow (Midori.Browser browser) {
+        base (browser);
+    }
+}
+
 private class HistoryList : Midori.Extension {
     protected uint modifier_count;
     protected HistoryWindow? history_window;
@@ -167,6 +206,8 @@ private class HistoryList : Midori.Extension {
             */
             if (type == typeof (TabWindow)) {
                 this.history_window = new TabWindow (browser);
+            } else if (type == typeof (NewTabWindow)) {
+                this.history_window = new NewTabWindow (browser);
             }
         }
         var hw = this.history_window as HistoryWindow;
@@ -199,8 +240,30 @@ private class HistoryList : Midori.Extension {
         action.set_accel_group (acg);
         action.connect_accelerator ();
 
+        action = new Gtk.Action ("HistoryListNextNewTab",
+            _("Next new Tab (History List)"),
+            _("Next new tab from history"), null);
+        action.activate.connect ((a) => {
+            this.walk (a, browser, typeof (NewTabWindow), 1);
+        });
+        action_group.add_action_with_accel (action, "<Ctrl>1");
+        action.set_accel_group (acg);
+        action.connect_accelerator ();
+
+        action = new Gtk.Action ("HistoryListPreviousNewTab",
+            _("Previous new Tab (History List)"),
+            _("Previous new tab from history"), null);
+        action.activate.connect ((a) => {
+            this.walk (a, browser, typeof (NewTabWindow), -1);
+        });
+        action_group.add_action_with_accel (action, "<Ctrl>2");
+        action.set_accel_group (acg);
+        action.connect_accelerator ();
+
         browser.set_data<GLib.PtrArray*> ("history-list-tab-history",
                                           new GLib.PtrArray ());
+        browser.set_data<GLib.PtrArray*> ("history-list-tab-history-new",
+                                          new GLib.PtrArray ());
         foreach (var tab in browser.get_tabs ())
             tab_added (browser, tab);
         browser.add_tab.connect (tab_added);
@@ -223,12 +286,14 @@ private class HistoryList : Midori.Extension {
         browser.notify["tab"].disconnect (this.tab_changed);
     }
     void tab_added (Midori.Browser browser, Midori.View view) {
-        unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history");
+        unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
         list.add (view);
     }
     void tab_removed (Midori.Browser browser, Midori.View view) {
         unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history");
+        unowned GLib.PtrArray list_new = browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
         list.remove (view);
+        list_new.remove (view);
     }
     void tab_changed (GLib.Object window, GLib.ParamSpec pspec) {
         Midori.Browser browser = window as Midori.Browser;
@@ -236,7 +301,9 @@ private class HistoryList : Midori.Extension {
         browser.get ("tab", ref view);
 
         unowned GLib.PtrArray list = browser.get_data<GLib.PtrArray> ("history-list-tab-history");
+        unowned GLib.PtrArray list_new = browser.get_data<GLib.PtrArray> ("history-list-tab-history-new");
         list.remove (view);
+        list_new.remove (view);
         list.add (view);
     }
     void activated (Midori.App app) {