Overview

Request 332 (accepted)

- add deepin-ui-demo package , it was lost before.

- Updated to 1.0.3git20120929
* Fix menu item clicked bug
* Add delete tab feature in TabBox
* Add ComboButton
Also more features and bugs fixed

- update to 1.0.2git20120911
- add new Paned widget:new ui and animation
- TreeView is more powerful
- Optimize Icon View memory usage
- and more ....

- license update: GPL-3.0+
No indication of GPL-3.0 "only" licenses in the package

Submit package home:hillwood / deepin-ui to package Multimedia / deepin-ui

deepin-ui.changes Changed
x
 
1
@@ -1,4 +1,35 @@
2
 -------------------------------------------------------------------
3
+Tue Oct  9 21:12:38 CST 2012 - hillwood@linuxfan.org
4
+
5
+- add deepin-ui-demo package , it was lost before.
6
+
7
+-------------------------------------------------------------------
8
+Sun Oct  7 01:03:27 CST 2012 - douglarek@outlook.com
9
+
10
+- Updated to 1.0.3git20120929
11
+
12
+  * Fix menu item clicked bug
13
+  * Add delete tab feature in TabBox
14
+  * Add ComboButton
15
+
16
+  Also more features and bugs fixed
17
+
18
+-------------------------------------------------------------------
19
+Wed Sep 26 21:05:33 CST 2012 - hillwood@linuxfan.org
20
+
21
+- update to 1.0.2git20120911
22
+- add new Paned widget:new ui and animation
23
+- TreeView is more powerful 
24
+- Optimize Icon View memory usage
25
+- and more ....
26
+
27
+-------------------------------------------------------------------
28
+Tue Sep  4 14:46:02 UTC 2012 - cfarrell@suse.com
29
+
30
+- license update: GPL-3.0+
31
+  No indication of GPL-3.0 "only" licenses in the package
32
+
33
+-------------------------------------------------------------------
34
 Sun Sep  2 12:48:31 CST 2012 - hillwood@linuxfan.org
35
 
36
 - Initial package 1.0git20120817
37
deepin-ui.spec Changed
120
 
1
@@ -18,25 +18,45 @@
2
 
3
 Name:           deepin-ui
4
 Summary:        UI toolkit for Linux Deepin
5
-Version:        1.0git20120817
6
-Release:        7.1
7
-License:        GPL-3.0
8
-Url:            https://github.com/linuxdeepin/deepin-ui
9
-Group:          System/GUI/Other
10
-Source:         %{name}-%{version}.tar.gz
11
-BuildRequires:  pkgconfig(glib-2.0)
12
-BuildRequires:  python-devel python-setuptools python-gtk-devel
13
-BuildRequires:  gcc gcc-c++
14
+License:        GPL-3.0+
15
+Group:          System/GUI/GNOME
16
+Version:        1.0.3git20120929
17
+Release:        0
18
+Url:            http://www.linuxdeepin.com
19
+Source0:        %{name}-%{version}.tar.gz
20
+Source1:        %{name}-demo.desktop
21
+Source2:        distributor-logo.png
22
 BuildRequires:  cairo-devel
23
-BuildRequires:  libwebkitgtk-devel
24
 BuildRequires:  fdupes
25
+BuildRequires:  gcc
26
+BuildRequires:  gcc-c++
27
+BuildRequires:  libwebkitgtk-devel
28
+BuildRequires:  python-devel
29
+BuildRequires:  python-gtk-devel
30
+BuildRequires:  python-setuptools
31
+BuildRequires:  pkgconfig(glib-2.0)
32
+BuildRequires:  update-desktop-files
33
+BuildRequires:  hicolor-icon-theme
34
+Requires:       python-webkitgtk
35
 Recommends:     %{name}-lang = %{version}
36
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
37
 %{py_requires}
38
 
39
 %description
40
-UI toolkit for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin ,
41
-it is needed by Deepin Music Player.
42
+UI toolkit libs for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin.
43
+
44
+%package demo
45
+Summary:        UI toolkit for Linux Deepin
46
+Group:          Development/Languages/Python
47
+Requires:      %{name} = %{version}
48
+Recommends:     %{name}-lang = %{version}
49
+Group:          System/GUI/Other
50
+BuildArch:      noarch
51
+
52
+%description demo
53
+UI toolkit libs demos for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin.
54
+
55
+
56
 %lang_package
57
 
58
 %prep
59
@@ -49,18 +69,42 @@
60
 chmod 644 COPYING
61
 export CFLAGS="$RPM_OPT_FLAGS" 
62
 python setup.py install --prefix=%{_prefix} --root=$RPM_BUILD_ROOT
63
+
64
+# deepin-ui files install
65
 mkdir -p %{buildroot}/%{_datadir}/pyshared
66
 mv %{buildroot}/%{_prefix}/dtk %{buildroot}/%{_datadir}/pyshared
67
 rm -rf %{buildroot}/%{_datadir}/pyshared/dtk/locale/*.po
68
 rm -rf %{buildroot}/%{_datadir}/pyshared/dtk/locale/deepin-ui.pot
69
 mv %{buildroot}/%{_datadir}/pyshared/dtk/locale %{buildroot}/%{_datadir}/locale
70
+cd %{buildroot}/%{_libdir}/python2.7/site-packages/dtk
71
+ln -s ../../../../share/pyshared/dtk/theme theme 
72
+cd %{_builddir}/%{buildsubdir}
73
 
74
-%fdupes %{buildroot}
75
+# deepin-ui-demo files install
76
+mkdir %{buildroot}/%{_datadir}/applications
77
+mkdir %{buildroot}/%{_datadir}/deepin-ui-demo
78
+mkdir %{buildroot}/%{_bindir}/
79
+mkdir -p %{buildroot}/%{_datadir}/icons/hicolor/48x48/apps
80
+cp %{S:1} %{buildroot}/%{_datadir}/applications
81
+cp -R app_theme %{buildroot}/%{_datadir}/deepin-ui-demo
82
+cp -R skin %{buildroot}/%{_datadir}/deepin-ui-demo
83
+cp -R cover %{buildroot}/%{_datadir}/deepin-ui-demo
84
+cp -R demo.py %{buildroot}/%{_datadir}/deepin-ui-demo
85
+cp %{S:2} %{buildroot}/%{_datadir}/icons/hicolor/48x48/apps
86
+cd %{buildroot}%{_bindir}
87
+ln -s ../share/deepin-ui-demo/demo.py %{name}-demo
88
+cd %{_builddir}/%{buildsubdir}
89
 
90
+%fdupes %{buildroot}
91
 %find_lang %{name}
92
+%suse_update_desktop_file %{name}-demo
93
+
94
+%post demo
95
+%icon_theme_cache_post
96
+
97
+%posttrans demo
98
+%icon_theme_cache_post
99
 
100
-cd %{buildroot}/%{_libdir}/python2.7/site-packages/dtk
101
-ln -s ../../../../share/pyshared/dtk/theme theme 
102
 
103
 %files 
104
 %defattr(-,root,root)
105
@@ -70,8 +114,13 @@
106
 %{_libdir}/python2.7/site-packages/dtk-0.1-py2.7.egg-info
107
 %{_libdir}/python2.7/site-packages/dtk_*.so
108
 
109
+%files demo
110
+%defattr(-,root,root)
111
+%{_bindir}/%{name}-demo
112
+%{_datadir}/%{name}-demo
113
+%{_datadir}/applications/%{name}-demo.desktop
114
+%{_datadir}/icons/hicolor/48x48/apps/distributor-logo.png
115
 
116
 %files lang -f %{name}.lang
117
 
118
 %changelog
119
-
120
deepin-ui-1.0.3git20120929.tar.gz/.gitignore Added
12
 
1
@@ -0,0 +1,10 @@
2
+*.pyc
3
+defaultTheme
4
+nohup.out
5
+.#*
6
+*.~
7
+build
8
+dist
9
+dtk.egg-info
10
+*.po~
11
+*.swp
12
deepin-ui-1.0git20120817.tar.gz/README -> deepin-ui-1.0.3git20120929.tar.gz/README Changed
10
 
1
@@ -6,7 +6,7 @@
2
 first, otherwise, you will got memory leak (this is bug of python-gtk).
3
 
4
 * Deepin UI build dependence (Debian):
5
-  sudo apt-get install libc6, libcairo2, libglib2.0-0, libsoup2.4-1, libwebkitgtk-1.0-0, debconf, python, libgtk2.0-0, python-gtk2, python-imaging, python-xlib  
6
+  sudo apt-get install libc6 libcairo2 libglib2.0-dev libsoup2.4-1 libwebkitgtk-dev debconf python libgtk2.0-0 python-gtk2-dev python-imaging python-xlib python-scipy python-setuptools python-cairo-dev
7
 
8
 * Install Deepin UI:
9
   sudo python setup.py install
10
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button/button_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button/arrow_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button/arrow_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button/arrow_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button/button_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button/button_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button/button_press.png Added
deepin-ui-1.0git20120817.tar.gz/demo.py -> deepin-ui-1.0.3git20120929.tar.gz/demo.py Changed
55
 
1
@@ -41,7 +41,7 @@
2
 # Load other modules.
3
 from dtk.ui.application import Application
4
 from dtk.ui.browser import WebView
5
-from dtk.ui.button import CheckButton, RadioButton
6
+from dtk.ui.button import CheckButton, RadioButton, ComboButton
7
 from dtk.ui.button import ImageButton, LinkButton, Button
8
 from dtk.ui.categorybar import Categorybar
9
 from dtk.ui.color_selection import ColorButton
10
@@ -214,6 +214,7 @@
11
          ],
12
         True
13
         )
14
+    menu.set_menu_item_sensitive_by_index(1, False)
15
     application.set_menu_callback(lambda button: menu.show(
16
             get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT),
17
             (button.get_allocation().width, 0)))
18
@@ -390,6 +391,36 @@
19
     entry_frame = HorizontalFrame(10, 0, 0, 0, 0)
20
     entry_frame.add(entry_box)
21
     tab_1_box.pack_start(entry_frame, False, False)
22
+
23
+    # Combo button.
24
+    combo_menu = Menu(
25
+        [(None, "选项1", None),
26
+         (None, "选项2", None),
27
+         (None, "选项3", None),
28
+         ],
29
+        is_root_menu=True,
30
+        )
31
+    
32
+    def click_combo_button(widget):
33
+        print "click combo button"
34
+        
35
+    def show_combo_menu(widget, x, y, offset_x, offset_y):
36
+        combo_menu.show((x, y), (offset_x, offset_y))
37
+        
38
+    combo_button = ComboButton(
39
+        app_theme.get_pixbuf("button/button_normal.png"),
40
+        app_theme.get_pixbuf("button/button_hover.png"),
41
+        app_theme.get_pixbuf("button/button_press.png"),
42
+        app_theme.get_pixbuf("button/button_normal.png"),
43
+        app_theme.get_pixbuf("button/arrow_normal.png"),
44
+        app_theme.get_pixbuf("button/arrow_hover.png"),
45
+        app_theme.get_pixbuf("button/arrow_press.png"),
46
+        app_theme.get_pixbuf("button/arrow_normal.png"),
47
+        )
48
+    combo_button.connect("button-clicked", click_combo_button)
49
+    combo_button.connect("arrow-clicked", show_combo_menu)
50
+    
51
+    tab_1_box.pack_start(combo_button, False, False)
52
     
53
     # Add statusbar.
54
     statusbar = Statusbar(36)
55
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/blue/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#c4cedd",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#4D78B3",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#2e5b99",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#F2F8FF", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#0d61d6", 1)),
54
+       (1, ("#2864b8", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/chartreuse/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#c4ddcd",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#4DB373",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#2e992e",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#F2FFF7", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#0dd60d", 1)),
54
+       (1, ("#28b828", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/cyan/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#c4dddd",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#4DB2B3",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#2e9999",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#F2FFFF", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#0dd6d6", 1)),
54
+       (1, ("#28b8b8", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/dark_grey/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#d0d0d0",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#4D4D4D",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#666666",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#F9F9F9", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#999999", 1)),
54
+       (1, ("#808080", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/dark_purple/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#cec4dd",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#7333CC",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#5b2e99",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#F7F2FF", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#610dd6", 1)),
54
+       (1, ("#6428b8", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/deep_pink/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#ddc4d5",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#B34D95",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#992e79",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#FFF2FB", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#d60d9a", 1)),
54
+       (1, ("#b8288d", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/dodger_blue/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#c4d4dd",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#0086CC",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#2e7599",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#F2FBFF", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#0d93d6", 1)),
54
+       (1, ("#2888b8", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/gold/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#ddd7c4",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#CC9E00",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#99822e",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#FFFCF2", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#d6ab0d", 1)),
54
+       (1, ("#b89928", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/green_yellow/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#d7ddc4",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#9AB34D",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#97992e",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#FCFFF2", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#d3d60d", 1)),
54
+       (1, ("#b5b828", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/orange/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#ddcec4",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#CC7433",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#995b2e",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#FFF8F2", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#d6610d", 1)),
54
+       (1, ("#b86428", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/purple/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#d6c4dd",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#974DB3",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#7e2e99",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#FBF2FF", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#a40dd6", 1)),
54
+       (1, ("#9428b8", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/red/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#ddc4c4",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#CC3333",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#992e2e",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#FFF2F2", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#d60d0d", 1)),
54
+       (1, ("#b82828", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/menu/arrow_disable.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned Added
2
 
1
+(directory)
2
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_down_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_down_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_down_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_left_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_left_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_left_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_right_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_right_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_right_press.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_up_hover.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_up_normal.png Added
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned/paned_up_press.png Added
deepin-ui-1.0git20120817.tar.gz/dtk/theme/yellow/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/theme.txt Changed
65
 
1
@@ -13,6 +13,7 @@
2
  "disable_background" : "#f7f7f7",
3
  "disable_text" : "#a6a6a6",
4
  "menu_font" : "#000000",
5
+ "menu_disable_font" : "#a6a6a6",
6
  "menu_select_font" : "#FFFFFF",
7
  "category_item" : "#333333",
8
  "category_select_item" : "#FFFFFF",
9
@@ -44,6 +45,9 @@
10
  "combo_entry_frame" : "#dcddc4",
11
  "combo_entry_background" : "#FFFFFF",
12
  "combo_entry_select_background" : "#CACC00",
13
+ "paned_line" : "#a9a9a9",
14
+ "progressbar_background_frame" : "#b3b3b3",
15
+ "progressbar_foreground_frame" : "#97992e",
16
  },    
17
  "alpha_colors" : {
18
      "color_button_disable_mask" : ("#ffffff", 0.85),
19
@@ -64,6 +68,13 @@
20
     "window_frame_inside_1" : ("#FFFFFF", 0.2),
21
     "window_frame_inside_2" : ("#FFFFFF", 0.6),
22
     "window_shadow_corner" : ("#000000", 0.1),
23
+    "dragable_tab_active_frame" : ("#333333", 0.8),
24
+    "dragable_tab_active_background" : ("#FFFFFF", 1),
25
+    "dragable_tab_inactive_frame" : ("#666666", 0.8),
26
+    "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
27
+    "dragable_tab_top_active_frame" : ("#333333", 0.7),
28
+    "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
29
+    "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
30
  },
31
  "shadow_colors" : {
32
      "mask_multiple_page" : [
33
@@ -97,10 +108,8 @@
34
        (1,     ("#FFFFF2", 0.0)),
35
      ],
36
      "linear_background" : [
37
-       (0,     ("#EFEFEF", 0.6)),
38
-       (0.05,  ("#EFEFEF", 0.75)),
39
-       (0.95,  ("#EFEFEF", 0.75)),
40
-       (1,     ("#EFEFEF", 0.6)),
41
+       (0,     ("#EFEFEF", 0.75)),
42
+       (1,     ("#EFEFEF", 0.75)),
43
     ],
44
     "category_item_press" : [
45
        (0, ("#53ABDE", 0.8)),
46
@@ -134,14 +143,12 @@
47
        (1,     ("#777777", 0))
48
     ],
49
     "progressbar_foreground" : [
50
-       (0, ("#EF12AB", 0.7)),
51
-       (0.5, ("#EF12AB", 0.9)),
52
-       (1, ("#EF12AB", 0.7)),
53
+       (0, ("#d3d60d", 1)),
54
+       (1, ("#b5b828", 1)),
55
     ],
56
     "progressbar_background" : [
57
-       (0, ("#E3A4D0", 0.7)),
58
-       (0.5, ("#E3A4D0", 0.9)),
59
-       (1, ("#E3A4D0", 0.7)),
60
+       (0, ("#f5f5f5", 1)),
61
+       (1, ("#d8d8d8", 1)),
62
     ],
63
     "progressbar_light" : [
64
        (0, ("#FFFFFF", 0)),
65
deepin-ui-1.0git20120817.tar.gz/dtk/ui/animation.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/animation.py Changed
12
 
1
@@ -4,8 +4,8 @@
2
 # Copyright (C) 2011 ~ 2012 Deepin, Inc.
3
 #               2011 ~ 2012 Xia Bin
4
 #
5
-# Author:     Xia Bin <xiabin@gmail.com>
6
-# Maintainer: Xia Bin <xiabin@gmail.com>
7
+# Author:     Xia Bin <xiabin@linuxdeepin.com>
8
+# Maintainer: Xia Bin <xiabin@linuxdeepin.com>
9
 #
10
 # This program is free software: you can redistribute it and/or modify
11
 # it under the terms of the GNU General Public License as published by
12
deepin-ui-1.0git20120817.tar.gz/dtk/ui/application.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/application.py Changed
19
 
1
@@ -27,6 +27,7 @@
2
 from titlebar import Titlebar
3
 from utils import container_remove_all, place_center
4
 from window import Window
5
+from constant import PANED_HANDLE_SIZE
6
 import gtk
7
 
8
 class Application(object):
9
@@ -55,6 +56,9 @@
10
         """
11
         # Init gdk threads, the integrant method for multi-thread GUI application.
12
         gtk.gdk.threads_init()
13
+        
14
+        # Load customize rc style before any other.
15
+        gtk.rc_parse_string("style 'my_style' {\n    GtkPaned::handle-size = %s\n }\nwidget '*' style 'my_style'" % (PANED_HANDLE_SIZE))
16
 
17
         # Init status.
18
         self.menu_button_callback = None
19
deepin-ui-1.0git20120817.tar.gz/dtk/ui/box.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/box.py Changed
19
 
1
@@ -21,6 +21,7 @@
2
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
3
 
4
 from draw import draw_pixbuf, propagate_expose, draw_vlinear, cairo_state
5
+from theme import ui_theme
6
 from skin_config import skin_config
7
 from utils import get_window_shadow_size
8
 import gobject
9
@@ -113,8 +114,7 @@
10
         @param h: Height of draw area.
11
         '''
12
         draw_vlinear(cr, x, y, w, h,
13
-                     [(0, ("#FF0000", 1)),
14
-                      (1, ("#FF0000", 1))]
15
+                     ui_theme.get_shadow_color("linear_background").get_color_info()
16
                      )
17
         
18
     def expose_background_box(self, widget, event):
19
deepin-ui-1.0git20120817.tar.gz/dtk/ui/browser.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/browser.py Changed
80
 
1
@@ -46,6 +46,73 @@
2
         self.connect("set-scroll-adjustments", self.save_adjustment)
3
         self.connect("scroll-event", self.do_scroll)
4
 
5
+    def enable_inspector(self):
6
+        import gtk
7
+        class Inspector (gtk.Window):
8
+            def __init__ (self, inspector):
9
+                """initialize the WebInspector class"""
10
+                gtk.Window.__init__(self)
11
+                self.set_default_size(600, 480)
12
+
13
+                self._web_inspector = inspector
14
+
15
+                self._web_inspector.connect("inspect-web-view",
16
+                                            self._inspect_web_view_cb)
17
+                self._web_inspector.connect("show-window",
18
+                                            self._show_window_cb)
19
+                self._web_inspector.connect("attach-window",
20
+                                            self._attach_window_cb)
21
+                self._web_inspector.connect("detach-window",
22
+                                            self._detach_window_cb)
23
+                self._web_inspector.connect("close-window",
24
+                                            self._close_window_cb)
25
+                self._web_inspector.connect("finished",
26
+                                            self._finished_cb)
27
+
28
+                self.connect("delete-event", self._close_window_cb)
29
+
30
+            def _inspect_web_view_cb (self, inspector, web_view):
31
+                """Called when the 'inspect' menu item is activated"""
32
+                from scrolled_window import ScrolledWindow
33
+                scrolled_window = ScrolledWindow()
34
+                webview = webkit.WebView()
35
+                scrolled_window.add(webview)
36
+                scrolled_window.show_all()
37
+
38
+                self.add(scrolled_window)
39
+                return webview
40
+
41
+            def _show_window_cb (self, inspector):
42
+                """Called when the inspector window should be displayed"""
43
+                self.present()
44
+                return True
45
+
46
+            def _attach_window_cb (self, inspector):
47
+                """Called when the inspector should displayed in the same
48
+                window as the WebView being inspected
49
+                """
50
+                return False
51
+
52
+            def _detach_window_cb (self, inspector):
53
+                """Called when the inspector should appear in a separate window"""
54
+                return False
55
+
56
+            def _close_window_cb (self, inspector, view):
57
+                """Called when the inspector window should be closed"""
58
+                self.hide()
59
+                return True
60
+
61
+            def _finished_cb (self, inspector):
62
+                """Called when inspection is done"""
63
+                self._web_inspector = 0
64
+                self.destroy()
65
+                return False
66
+
67
+        settings = self.get_settings()
68
+        settings.set_property("enable-default-context-menu", True)
69
+        settings.set_property("enable-developer-extras", True)
70
+        Inspector(self.get_web_inspector())
71
+
72
     def save_adjustment(self, webview, hadj, vadj):
73
         '''
74
         the callback of "set-scroll-adjustmens"
75
@@ -67,3 +134,4 @@
76
             return True
77
         else:
78
             return False
79
+
80
deepin-ui-1.0git20120817.tar.gz/dtk/ui/button.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/button.py Changed
106
 
1
@@ -30,7 +30,8 @@
2
 import gtk
3
 import pango
4
 from utils import (get_content_size, color_hex_to_cairo, propagate_expose, set_clickable_cursor,
5
-                   window_is_max, get_same_level_widgets, widget_fix_cycle_destroy_bug, run_command)
6
+                   window_is_max, get_same_level_widgets, widget_fix_cycle_destroy_bug, run_command,
7
+                   get_widget_root_coordinate, WIDGET_POS_BOTTOM_LEFT)
8
 
9
 __all__ = ["Button", "ImageButton", "ThemeButton",
10
            "MenuButton", "MinButton", "CloseButton",
11
@@ -851,3 +852,94 @@
12
         set_clickable_cursor(self)
13
 
14
 gobject.type_register(LinkButton)
15
+
16
+class ComboButton(gtk.Button):
17
+    '''
18
+    class docs
19
+    '''
20
+   
21
+    __gsignals__ = {
22
+        "button-clicked" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
23
+        "arrow-clicked" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (int, int, int, int)),
24
+    }
25
+    
26
+    def __init__(self,
27
+                 button_normal_dpixbuf,
28
+                 button_hover_dpixbuf,
29
+                 button_press_dpixbuf,
30
+                 button_disable_dpixbuf,
31
+                 arrow_normal_dpixbuf,
32
+                 arrow_hover_dpixbuf,
33
+                 arrow_press_dpixbuf,
34
+                 arrow_disable_dpixbuf,
35
+                 ):
36
+        '''
37
+        init docs
38
+        '''
39
+        # Init.
40
+        gtk.Button.__init__(self)
41
+        self.button_normal_dpixbuf = button_normal_dpixbuf
42
+        self.button_hover_dpixbuf = button_hover_dpixbuf
43
+        self.button_press_dpixbuf = button_press_dpixbuf
44
+        self.button_disable_dpixbuf = button_disable_dpixbuf
45
+        self.arrow_normal_dpixbuf = arrow_normal_dpixbuf
46
+        self.arrow_hover_dpixbuf = arrow_hover_dpixbuf
47
+        self.arrow_press_dpixbuf = arrow_press_dpixbuf
48
+        self.arrow_disable_dpixbuf = arrow_disable_dpixbuf
49
+        button_pixbuf = button_normal_dpixbuf.get_pixbuf()
50
+        arrow_pixbuf = arrow_normal_dpixbuf.get_pixbuf()
51
+        self.button_width = button_pixbuf.get_width()
52
+        self.arrow_width = arrow_pixbuf.get_width()
53
+        self.height = button_pixbuf.get_height()
54
+        self.set_size_request(self.button_width + self.arrow_width, self.height)
55
+        self.in_button = True
56
+        
57
+        self.connect("expose-event", self.expose_combo_button)
58
+        self.connect("button-press-event", self.button_press_combo_button)
59
+        self.connect("clicked", self.click_combo_button)
60
+        
61
+    def expose_combo_button(self, widget, event):
62
+        # Init.
63
+        cr = widget.window.cairo_create()
64
+        rect = widget.allocation
65
+        x, y, w, h = rect.x, rect.y, rect.width, rect.height
66
+        
67
+        # Get pixbuf info.
68
+        if widget.state == gtk.STATE_NORMAL:
69
+            button_pixbuf = self.button_normal_dpixbuf.get_pixbuf()
70
+            arrow_pixbuf = self.arrow_normal_dpixbuf.get_pixbuf()
71
+        elif widget.state == gtk.STATE_PRELIGHT:
72
+            button_pixbuf = self.button_hover_dpixbuf.get_pixbuf()
73
+            arrow_pixbuf = self.arrow_hover_dpixbuf.get_pixbuf()
74
+        elif widget.state == gtk.STATE_ACTIVE:
75
+            if self.in_button:
76
+                button_pixbuf = self.button_press_dpixbuf.get_pixbuf()
77
+                arrow_pixbuf = self.arrow_hover_dpixbuf.get_pixbuf()
78
+            else:
79
+                button_pixbuf = self.button_hover_dpixbuf.get_pixbuf()
80
+                arrow_pixbuf = self.arrow_press_dpixbuf.get_pixbuf()
81
+        elif widget.state == gtk.STATE_INSENSITIVE:
82
+            button_pixbuf = self.button_disable_dpixbuf.get_pixbuf()
83
+            arrow_pixbuf = self.arrow_disable_dpixbuf.get_pixbuf()
84
+
85
+        # Draw.
86
+        draw_pixbuf(cr, button_pixbuf, rect.x, rect.y)
87
+        draw_pixbuf(cr, arrow_pixbuf, rect.x + self.button_width, rect.y)
88
+
89
+        return True    
90
+    
91
+    def button_press_combo_button(self, widget, event):
92
+        self.in_button = event.x < self.button_width
93
+        
94
+    def click_combo_button(self, widget):
95
+        if self.in_button:
96
+            self.emit("button-clicked")
97
+        else:
98
+            (button_x, button_y) = get_widget_root_coordinate(self, WIDGET_POS_BOTTOM_LEFT)
99
+            self.emit("arrow-clicked", 
100
+                      button_x + self.button_width,
101
+                      button_y,
102
+                      self.arrow_width,
103
+                      self.height)
104
+
105
+gobject.type_register(ComboButton)
106
deepin-ui-1.0git20120817.tar.gz/dtk/ui/config.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/config.py Changed
21
 
1
@@ -23,6 +23,8 @@
2
 from ConfigParser import RawConfigParser as ConfigParser
3
 from collections import OrderedDict
4
 import gobject    
5
+import sys
6
+import traceback
7
 
8
 class Config(gobject.GObject):
9
     '''
10
@@ -90,7 +92,9 @@
11
         try:
12
             return self.config_parser.get(section, option)
13
         except Exception, e:
14
-            print "config.get error: %s" % (e)
15
+            print "function get got error: %s" % (e)
16
+            traceback.print_exc(file=sys.stdout)
17
+            
18
             return default
19
             
20
     def set(self, section, option, value):  
21
deepin-ui-1.0git20120817.tar.gz/dtk/ui/constant.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/constant.py Changed
7
 
1
@@ -100,3 +100,5 @@
2
                           "deep_pink", "purple", "dark_purple", "blue", "dodger_blue", "cyan"]
3
 
4
 VERSION = "1.0.1"
5
+
6
+PANED_HANDLE_SIZE = 11
7
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/dragable_tab.py Added
338
 
1
@@ -0,0 +1,336 @@
2
+#! /usr/bin/env python
3
+# -*- coding: utf-8 -*-
4
+
5
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
6
+#               2011 ~ 2012 Wang Yong
7
+# 
8
+# Author:     Wang Yong <lazycat.manatee@gmail.com>
9
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
10
+# 
11
+# This program is free software: you can redistribute it and/or modify
12
+# it under the terms of the GNU General Public License as published by
13
+# the Free Software Foundation, either version 3 of the License, or
14
+# any later version.
15
+# 
16
+# This program is distributed in the hope that it will be useful,
17
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+# GNU General Public License for more details.
20
+# 
21
+# You should have received a copy of the GNU General Public License
22
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+
24
+import gtk
25
+import cairo
26
+from theme import ui_theme
27
+import pango
28
+import gobject
29
+from skin_config import skin_config
30
+from utils import (get_content_size, cairo_state, cairo_disable_antialias,
31
+                   alpha_color_hex_to_cairo, get_window_shadow_size)
32
+from draw import draw_text
33
+import math
34
+
35
+class TabBox(gtk.VBox):
36
+    '''
37
+    class docs
38
+    '''
39
+   
40
+    def __init__(self):
41
+        '''
42
+        init docs
43
+        '''
44
+        gtk.VBox.__init__(self)
45
+        
46
+        self.tabbox = Tabbar()
47
+        self.tab_content_box = gtk.VBox()
48
+        
49
+        self.pack_start(self.tabbox, False, False)
50
+        self.pack_start(self.tab_content_box, True, True)
51
+        
52
+        self.tab_content_box.connect("expose-event", self.test)
53
+        
54
+    def test(self, widget, event):
55
+        '''
56
+        docs
57
+        '''
58
+        # Init.
59
+        cr = widget.window.cairo_create()
60
+        rect = widget.allocation
61
+        x, y, w, h = rect.x, rect.y, rect.width, rect.height
62
+
63
+        cr.set_source_rgba(1, 1, 1, 1)
64
+        cr.rectangle(x, y, w, h)
65
+        cr.fill()
66
+        
67
+    def add_tabs(self, tabs):
68
+        '''
69
+        docs
70
+        '''
71
+        pass
72
+    
73
+    def remove_tabs(self, tabs):
74
+        '''
75
+        docs
76
+        '''
77
+        pass
78
+
79
+gobject.type_register(TabBox)               
80
+
81
+class Tabbar(gtk.DrawingArea):
82
+    '''
83
+    class docs
84
+    '''
85
+   
86
+    def __init__(self):
87
+        '''
88
+        init docs
89
+        '''
90
+        gtk.DrawingArea.__init__(self)
91
+        self.add_events(gtk.gdk.ALL_EVENTS_MASK)
92
+        self.set_can_focus(True) # can focus to response key-press signal
93
+        self.height = 29
94
+        self.tab_name_padding_x = 10
95
+        self.tab_angle = 63
96
+        self.tab_radious = 4
97
+        self.tab_radious_offset_x = self.tab_radious * math.cos(math.radians(self.tab_angle))
98
+        self.tab_radious_offset_y = self.tab_radious * math.sin(math.radians(self.tab_angle))
99
+        self.triangle_width = int(self.height / math.tan(math.radians(self.tab_angle)))
100
+        self.set_size_request(-1, self.height)
101
+        # self.names = ["标签1", "标签2", "标签2", "标签3"]
102
+        self.names = map(lambda i: "标签%s" % (i), range(1, 10))
103
+        self.name_widths = map(self.get_tab_width, self.names)
104
+        self.active_index = 4
105
+        
106
+        self.connect("expose-event", self.expose_dragable_tabbar)
107
+        
108
+    def add_items(self, items):
109
+        '''
110
+        docs
111
+        '''
112
+        pass
113
+    
114
+    def expose_dragable_tabbar(self, widget, event):
115
+        '''
116
+        docs
117
+        '''
118
+        # Init.
119
+        cr = widget.window.cairo_create()
120
+        rect = widget.allocation
121
+        x, w, h = rect.x, rect.width, rect.height
122
+        y = 0
123
+        
124
+        # Draw background.
125
+        (offset_x, offset_y) = widget.translate_coordinates(self.get_toplevel(), 0, 0)
126
+        with cairo_state(cr):
127
+            cr.translate(-offset_x, -offset_y)
128
+            
129
+            (shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
130
+            skin_config.render_background(cr, widget, shadow_x, shadow_y)
131
+        
132
+        # Draw inactive tab.
133
+        draw_x_list = []
134
+        width_offset = 0
135
+        for (index, tab_name) in enumerate(self.names):
136
+            draw_x_list.append(x + width_offset)
137
+            width_offset += (self.name_widths[index] - (self.triangle_width + self.tab_radious * 2))
138
+            
139
+        for (index, tab_name) in enumerate(reversed(self.names)):
140
+            tab_index = len(self.names) - index - 1
141
+            if tab_index != self.active_index:
142
+                self.draw_tab(cr, draw_x_list[tab_index], y, tab_name, tab_index)
143
+                
144
+        # Draw active tab.
145
+        self.draw_tab(cr, draw_x_list[self.active_index], y, self.names[self.active_index], self.active_index)        
146
+        
147
+        # Draw bottom line.
148
+        frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_bottom_active_frame").get_color_info())        
149
+        cr.set_source_rgba(*frame_color)
150
+        cr.rectangle(x, 
151
+                     y + h - 1, 
152
+                     draw_x_list[self.active_index],
153
+                     1)
154
+        cr.rectangle(x + draw_x_list[self.active_index] + self.name_widths[self.active_index], 
155
+                     y + h - 1,
156
+                     w - draw_x_list[self.active_index] - self.name_widths[self.active_index],
157
+                     1)
158
+        cr.fill()
159
+        
160
+        return True
161
+    
162
+    def get_tab_width(self, tab_name):
163
+        '''
164
+        docs
165
+        '''
166
+        (text_width, text_height) = get_content_size(tab_name)
167
+        tab_height = self.height
168
+        triangle_width = int(tab_height / math.tan(math.radians(self.tab_angle)))
169
+        middle_width = text_width + self.tab_name_padding_x * 2
170
+        return middle_width + self.tab_radious * 4 + triangle_width * 2
171
+    
172
+    def draw_tab(self, cr, x, y, tab_name, tab_index):
173
+        # Init.
174
+        (text_width, text_height) = get_content_size(tab_name)
175
+        tab_x = x
176
+        tab_y = y
177
+        tab_height = self.height
178
+        triangle_width = int(tab_height / math.tan(math.radians(self.tab_angle)))
179
+        middle_width = text_width + self.tab_name_padding_x * 2
180
+        tab_width = middle_width + self.tab_radious * 4 + triangle_width * 2
181
+        round_radious = self.tab_radious * math.tan(math.radians((180 - self.tab_angle) / 2))
182
+        round_angle = self.tab_angle
183
+        
184
+        if tab_index == self.active_index:
185
+            frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_active_frame").get_color_info())        
186
+            background_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_active_background").get_color_info())        
187
+            top_frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_top_active_frame").get_color_info())        
188
+        else:
189
+            frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_inactive_frame").get_color_info())        
190
+            background_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_inactive_background").get_color_info())        
191
+            top_frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_top_inactive_frame").get_color_info())        
192
+            
193
+        # Init round coordinate.
194
+        round_left_bottom_x = tab_x
195
+        round_left_bottom_y = tab_y + tab_height - round_radious
196
+
197
+        round_left_up_x = tab_x + self.tab_radious * 2 + triangle_width
198
+        round_left_up_y = tab_y + round_radious
199
+
200
+        round_right_bottom_x = tab_x + tab_width
201
+        round_right_bottom_y = tab_y + tab_height - round_radious
202
+
203
+        round_right_up_x = tab_x + tab_width - (self.tab_radious * 2 + triangle_width)
204
+        round_right_up_y = tab_y + round_radious
205
+        
206
+        # Clip.
207
+        with cairo_state(cr):
208
+            # Clip.
209
+            if tab_index != self.active_index and tab_index != 0:
210
+                clip_offset_x = tab_width - (self.triangle_width + self.tab_radious * 2)
211
+                cr.move_to(tab_x + tab_width - clip_offset_x, tab_y + tab_height)
212
+                cr.arc(round_right_bottom_x - clip_offset_x,
213
+                       round_right_bottom_y,
214
+                       round_radious,
215
+                       math.radians(90),
216
+                       math.radians(90 + round_angle),
217
+                       )
218
+                
219
+                cr.line_to(tab_x + tab_width - self.tab_radious - self.triangle_width + self.tab_radious_offset_x - clip_offset_x,
220
+                           tab_y)
221
+                
222
+                cr.line_to(tab_x + tab_width, tab_y)
223
+                cr.line_to(tab_x + tab_width, tab_y + tab_height)
224
+                cr.line_to(tab_x + tab_width - clip_offset_x, tab_y + tab_height)
225
+            else:
226
+                cr.rectangle(tab_x, tab_y, tab_width, tab_height)
227
+            cr.clip()
228
+                
229
+            # Draw background.
230
+            # Draw left area.
231
+            with cairo_state(cr):
232
+                cr.move_to(tab_x, tab_y + tab_height)
233
+                cr.arc_negative(round_left_bottom_x,
234
+                                round_left_bottom_y,
235
+                                round_radious,
236
+                                math.radians(90),
237
+                                math.radians(90 - round_angle),
238
+                                )
239
+                
240
+                cr.line_to(tab_x + self.tab_radious + self.tab_radious_offset_x,
241
+                           tab_y + tab_height - self.tab_radious_offset_y)
242
+                
243
+                cr.arc(round_left_up_x,
244
+                       round_left_up_y,
245
+                       round_radious,
246
+                       math.radians(270 - round_angle),
247
+                       math.radians(270))
248
+            
249
+            # Draw top area.
250
+            with cairo_disable_antialias(cr):    
251
+                cr.set_source_rgba(*frame_color)
252
+                cr.set_line_width(1)
253
+                cr.line_to(tab_x + self.tab_radious * 2 + triangle_width + middle_width, tab_y + 1)
254
+            
255
+            # Draw right area.
256
+            with cairo_state(cr):
257
+                cr.arc(round_right_up_x,
258
+                       round_right_up_y,
259
+                       round_radious,
260
+                       math.radians(270),
261
+                       math.radians(270 + round_angle),
262
+                       )
263
+                
264
+                cr.line_to(tab_x + tab_width - (self.tab_radious + self.tab_radious_offset_x),
265
+                           tab_y + tab_height - self.tab_radious_offset_y)
266
+                
267
+                cr.arc_negative(round_right_bottom_x,
268
+                                round_right_bottom_y,
269
+                                round_radious,
270
+                                math.radians(90 + round_angle),
271
+                                math.radians(90))
272
+                
273
+            cr.line_to(tab_x, tab_y + tab_height)
274
+            
275
+            cr.set_source_rgba(*background_color)
276
+            cr.fill()
277
+            
278
+            # Draw frame.
279
+            # Draw left area.
280
+            with cairo_state(cr):
281
+                cr.move_to(tab_x, tab_y + tab_height)
282
+                cr.arc_negative(round_left_bottom_x,
283
+                                round_left_bottom_y,
284
+                                round_radious,
285
+                                math.radians(90),
286
+                                math.radians(90 - round_angle),
287
+                                )
288
+                
289
+                cr.line_to(tab_x + self.tab_radious + self.tab_radious_offset_x,
290
+                           tab_y + tab_height - self.tab_radious_offset_y)
291
+                
292
+                cr.arc(round_left_up_x,
293
+                       round_left_up_y,
294
+                       round_radious,
295
+                       math.radians(270 - round_angle),
296
+                       math.radians(270))
297
+            
298
+                cr.set_source_rgba(*frame_color)
299
+                cr.set_line_width(1)
300
+                cr.stroke()
301
+                
302
+            # Draw top area.
303
+            with cairo_disable_antialias(cr):    
304
+                offset = 1
305
+                cr.set_source_rgba(*top_frame_color)
306
+                cr.set_line_width(1)
307
+                cr.move_to(tab_x + self.tab_radious * 2 + triangle_width - offset, tab_y + 1)
308
+                cr.line_to(tab_x + self.tab_radious * 2 + triangle_width + middle_width + offset * 2, tab_y + 1)
309
+                cr.stroke()
310
+            
311
+            # Draw right area.
312
+            with cairo_state(cr):
313
+                cr.move_to(tab_x + tab_width - (self.tab_radious * 2 + triangle_width), tab_y)
314
+                cr.arc(round_right_up_x,
315
+                       round_right_up_y,
316
+                       round_radious,
317
+                       math.radians(270),
318
+                       math.radians(270 + round_angle),
319
+                       )
320
+                
321
+                cr.line_to(tab_x + tab_width - (self.tab_radious + self.tab_radious_offset_x),
322
+                           tab_y + tab_height - self.tab_radious_offset_y)
323
+                
324
+                cr.arc_negative(round_right_bottom_x,
325
+                                round_right_bottom_y,
326
+                                round_radious,
327
+                                math.radians(90 + round_angle),
328
+                                math.radians(90))
329
+            
330
+                cr.set_source_rgba(*frame_color)
331
+                cr.set_line_width(1)
332
+                cr.stroke()
333
+            
334
+            # Draw text.
335
+            draw_text(cr, tab_name, tab_x, tab_y, tab_width, tab_height, alignment=pango.ALIGN_CENTER)
336
+            
337
+gobject.type_register(Tabbar)               
338
deepin-ui-1.0git20120817.tar.gz/dtk/ui/entry.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/entry.py Changed
92
 
1
@@ -27,6 +27,8 @@
2
 from locales import _
3
 from menu import Menu
4
 from theme import ui_theme
5
+import sys
6
+import traceback
7
 import gobject
8
 import gtk
9
 import pango
10
@@ -178,7 +180,8 @@
11
         try:  
12
             yield  
13
         except Exception, e:  
14
-            print 'monitor_entry_content error %s' % e  
15
+            print 'function monitor_entry_content got error %s' % e  
16
+            traceback.print_exc(file=sys.stdout)
17
         else:  
18
             new_text = self.get_text()
19
             if self.check_text == None or self.check_text(new_text):
20
@@ -241,6 +244,8 @@
21
             self.offset_x = text_width - rect.width + self.padding_x * 2
22
         else:
23
             self.offset_x = 0
24
+            
25
+        self.im.set_client_window(widget.window)
26
         
27
     def key_press_entry(self, widget, event):
28
         '''
29
@@ -682,19 +687,34 @@
30
         '''
31
         if self.grab_focus_flag and self.select_start_index == self.select_end_index:
32
             # Init.
33
-            x, y, w, h = rect.x, rect.y, rect.width, rect.height
34
-            left_str = self.content[0:self.cursor_index]
35
-            left_str_width = self.get_content_width(left_str)
36
-            padding_y = (h - (get_content_size("Height", self.font_size)[-1])) / 2
37
+            cursor_rect = self.get_cursor_rect()
38
             
39
             # Draw cursor.
40
             cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("entry_cursor").get_color()))
41
-            cr.rectangle(x + self.padding_x + left_str_width - self.offset_x,
42
-                         y + padding_y,
43
-                         1, 
44
-                         h - padding_y * 2
45
-                         )
46
+            cr.rectangle(cursor_rect.x, cursor_rect.y, cursor_rect.width, cursor_rect.height)
47
             cr.fill()
48
+            
49
+            # Tell input method follow cursor position.
50
+            self.im.set_cursor_location(cursor_rect)
51
+            
52
+    def get_cursor_rect(self):
53
+        '''
54
+        docs
55
+        '''
56
+        # Init.
57
+        rect = self.allocation
58
+        x, y, w, h = rect.x, rect.y, rect.width, rect.height
59
+        left_str = self.content[0:self.cursor_index]
60
+        left_str_width = self.get_content_width(left_str)
61
+        padding_y = (h - (get_content_size("Height", self.font_size)[-1])) / 2
62
+        
63
+        # Draw cursor.
64
+        return gtk.gdk.Rectangle(
65
+            x + self.padding_x + left_str_width - self.offset_x,
66
+            y + padding_y,
67
+            1, 
68
+            h - padding_y * 2
69
+            )
70
     
71
     def button_press_entry(self, widget, event):
72
         '''
73
@@ -768,8 +788,6 @@
74
         '''
75
         self.grab_focus_flag = True
76
         
77
-        # Focus in IMContext.
78
-        self.im.set_client_window(widget.window)
79
         self.im.focus_in()
80
         
81
         self.queue_draw()
82
@@ -880,7 +898,8 @@
83
         try:
84
             return list(content.decode('utf-8'))[index].encode('utf-8')
85
         except Exception, e:
86
-            print "get_utf8_string got error: %s" % (e)
87
+            print "function get_utf8_string got error: %s" % (e)
88
+            traceback.print_exc(file=sys.stdout)
89
             return ""
90
     
91
 gobject.type_register(Entry)
92
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/file_treeview.py Added
655
 
1
@@ -0,0 +1,653 @@
2
+#! /usr/bin/env python
3
+# -*- coding: utf-8 -*-
4
+
5
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
6
+#               2011 ~ 2012 Wang Yong
7
+# 
8
+# Author:     Wang Yong <lazycat.manatee@gmail.com>
9
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
10
+# 
11
+# This program is free software: you can redistribute it and/or modify
12
+# it under the terms of the GNU General Public License as published by
13
+# the Free Software Foundation, either version 3 of the License, or
14
+# any later version.
15
+# 
16
+# This program is distributed in the hope that it will be useful,
17
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+# GNU General Public License for more details.
20
+# 
21
+# You should have received a copy of the GNU General Public License
22
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+
24
+from new_treeview import TreeItem
25
+import collections
26
+from gio_utils import (get_file_icon_pixbuf, is_directory, get_dir_child_files, 
27
+                       get_gfile_modification_time, get_gfile_size,
28
+                       get_gfile_type,get_file_type_dict,
29
+                       get_gfile_name, get_gfile_content_type, sort_file_by_name)
30
+from draw import draw_pixbuf, draw_text, draw_vlinear
31
+from threads import post_gui
32
+from theme import ui_theme
33
+import pango
34
+import gobject
35
+import gio
36
+import threading as td
37
+from utils import cairo_disable_antialias, get_content_size, format_file_size
38
+import traceback
39
+import sys
40
+
41
+ICON_SIZE = 24
42
+ICON_PADDING_LEFT = ICON_PADDING_RIGHT = 4
43
+INDICATOR_PADDING_LEFT = INDICATOR_PADDING_RIGHT = 4
44
+ITEM_PADDING_Y = 2
45
+ITEM_HEIGHT = ICON_SIZE + ITEM_PADDING_Y * 2
46
+COLUMN_OFFSET = 32
47
+MODIFICATION_TIME_PADDING_LEFT = 12
48
+CONTENT_TYPE_PADDING_LEFT = 12
49
+SIZE_PADDING_LEFT = 12
50
+
51
+def sort_by_key(items, sort_reverse, sort_key):
52
+    if len(items) == 1 and (isinstance(items[0], EmptyItem) or isinstance(items[0], LoadingItem)):
53
+        return items
54
+    else:
55
+        # Init.
56
+        item_oreder_dict = collections.OrderedDict(get_file_type_dict())
57
+        
58
+        # Split item with different file type.
59
+        for item in items:
60
+            item_oreder_dict[item.type].append(item)
61
+            
62
+        # Get sorted item list.
63
+        item_list = []
64
+        for (file_type, type_items) in item_oreder_dict.items():
65
+            item_list += sorted(type_items, key=sort_key, reverse=sort_reverse)
66
+            
67
+        return item_list    
68
+
69
+def sort_by_name(items, sort_reverse):
70
+    return sort_by_key(items, sort_reverse, lambda i: i.name)
71
+
72
+def sort_by_size(items, sort_reverse):
73
+    return sort_by_key(items, sort_reverse, lambda i: i.size)
74
+
75
+def sort_by_type(items, sort_reverse):
76
+    return sort_by_key(items, sort_reverse, lambda i: i.content_type)
77
+
78
+def sort_by_mtime(items, sort_reverse):
79
+    return sort_by_key(items, sort_reverse, lambda i: i.modification_time)
80
+
81
+def get_name_width(column_index, name):
82
+    expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_down.png").get_pixbuf()
83
+    return COLUMN_OFFSET * column_index + INDICATOR_PADDING_LEFT + expand_indicator_pixbuf.get_width() + INDICATOR_PADDING_RIGHT + ICON_PADDING_LEFT + ICON_SIZE + ICON_PADDING_RIGHT + get_content_size(name)[0]
84
+
85
+def get_modification_time_width(time):
86
+    return get_content_size(time)[0] + MODIFICATION_TIME_PADDING_LEFT
87
+
88
+def get_type_width(file_type):
89
+    return get_content_size(file_type)[0] + CONTENT_TYPE_PADDING_LEFT
90
+
91
+def get_size_width(size):
92
+    return get_content_size(size)[0] + SIZE_PADDING_LEFT
93
+
94
+def render_background(item, cr, rect):
95
+    if item.is_select:
96
+        draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
97
+                     ui_theme.get_shadow_color("listview_select").get_color_info())
98
+
99
+class LoadingThread(td.Thread):
100
+    
101
+    def __init__(self, dir_item):
102
+        td.Thread.__init__(self)
103
+        self.setDaemon(True) # make thread exit when main program exit
104
+        self.dir_item = dir_item
105
+        
106
+    def run(self):
107
+        try:
108
+            self.dir_item.load_status = self.dir_item.LOADING_START
109
+            self.items = get_dir_items(self.dir_item.gfile.get_path(), self.dir_item.column_index + 1)
110
+            if self.items == []:
111
+                self.items = [EmptyItem(self.dir_item.column_index + 1)]
112
+            
113
+            for item in self.items:
114
+                item.parent_item = self.dir_item
115
+                
116
+            self.dir_item.load_status = self.dir_item.LOADING_FINSIH
117
+                
118
+            self.render_items()
119
+        except Exception, e:
120
+            print "class LoadingThread got error: %s" % (e)
121
+            traceback.print_exc(file=sys.stdout)
122
+        
123
+    @post_gui    
124
+    def render_items(self):
125
+        self.dir_item.delete_chlid_item()
126
+        self.dir_item.child_items = self.items    
127
+        self.dir_item.add_child_item()
128
+   
129
+class DirItem(TreeItem):
130
+    '''
131
+    Directory item.
132
+    '''
133
+    
134
+    LOADING_INIT = 0
135
+    LOADING_START = 1
136
+    LOADING_FINSIH = 2
137
+    
138
+    def __init__(self, gfile, column_index=0):
139
+        '''
140
+        Initialize DirItem class.
141
+        '''
142
+        # Init.
143
+        TreeItem.__init__(self)
144
+        self.gfile = gfile
145
+        self.type = get_gfile_type(self.gfile)
146
+        self.name = get_gfile_name(self.gfile)
147
+        self.modification_time = get_gfile_modification_time(self.gfile)
148
+        self.content_type = get_gfile_content_type(self.gfile)
149
+        self.size = get_gfile_size(self.gfile)
150
+        self.size_name = "%s 项" % (self.size)
151
+        self.directory_path = gfile.get_path()
152
+        self.pixbuf = get_file_icon_pixbuf(self.directory_path, ICON_SIZE)
153
+        self.column_index = column_index
154
+        self.is_expand = False
155
+        self.load_status = self.LOADING_INIT
156
+        self.name_width = get_name_width(self.column_index, self.name)
157
+        self.modification_time_width = get_modification_time_width(self.modification_time)
158
+        self.content_type_width = get_type_width(self.content_type)
159
+        self.size_width = get_size_width(self.size_name)
160
+        
161
+    def render_name(self, cr, rect):
162
+        '''
163
+        Render icon and name of DirItem.
164
+        '''
165
+        # Draw select background.
166
+        if self.is_select:
167
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
168
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
169
+        
170
+        # Draw directory arrow icon.
171
+        if self.is_expand:
172
+            expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_down.png").get_pixbuf()
173
+        else:
174
+            expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_right.png").get_pixbuf()
175
+        draw_pixbuf(cr, expand_indicator_pixbuf,
176
+                    rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT,
177
+                    rect.y + (rect.height - expand_indicator_pixbuf.get_height()) / 2,
178
+                    )
179
+        
180
+        # Draw directory icon.
181
+        draw_pixbuf(cr, self.pixbuf, 
182
+                    rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT + expand_indicator_pixbuf.get_width() + INDICATOR_PADDING_RIGHT + ICON_PADDING_LEFT,
183
+                    rect.y + (rect.height - ICON_SIZE) / 2,
184
+                    )
185
+        
186
+        # Draw directory name.
187
+        draw_text(cr, self.name, 
188
+                  rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT + expand_indicator_pixbuf.get_width() + INDICATOR_PADDING_RIGHT + ICON_PADDING_LEFT + ICON_SIZE + ICON_PADDING_RIGHT,
189
+                  rect.y,
190
+                  rect.width, rect.height)
191
+        
192
+        # Draw drag line.
193
+        if self.drag_line:
194
+            with cairo_disable_antialias(cr):
195
+                cr.set_line_width(1)
196
+                if self.drag_line_at_bottom:
197
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
198
+                else:
199
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
200
+                cr.fill()
201
+
202
+    def render_modification_time(self, cr, rect):
203
+        '''
204
+        Render type of DirItem.
205
+        '''
206
+        # Draw select background.
207
+        if self.is_select:
208
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
209
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
210
+        
211
+        # Draw directory type.
212
+        draw_text(cr, self.modification_time, 
213
+                  rect.x + MODIFICATION_TIME_PADDING_LEFT,
214
+                  rect.y,
215
+                  rect.width, rect.height)
216
+        
217
+        # Draw drag line.
218
+        if self.drag_line:
219
+            with cairo_disable_antialias(cr):
220
+                cr.set_line_width(1)
221
+                if self.drag_line_at_bottom:
222
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
223
+                else:
224
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
225
+                cr.fill()
226
+                
227
+    def render_type(self, cr, rect):
228
+        '''
229
+        Render type of DirItem.
230
+        '''
231
+        # Draw select background.
232
+        if self.is_select:
233
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
234
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
235
+        
236
+        # Draw directory type.
237
+        draw_text(cr, self.content_type, 
238
+                  rect.x + CONTENT_TYPE_PADDING_LEFT,
239
+                  rect.y,
240
+                  rect.width, rect.height)
241
+        
242
+        # Draw drag line.
243
+        if self.drag_line:
244
+            with cairo_disable_antialias(cr):
245
+                cr.set_line_width(1)
246
+                if self.drag_line_at_bottom:
247
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
248
+                else:
249
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
250
+                cr.fill()
251
+
252
+    def render_size(self, cr, rect):
253
+        '''
254
+        Render size of DirItem.
255
+        '''
256
+        # Draw select background.
257
+        if self.is_select:
258
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
259
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
260
+        
261
+        # Draw directory size.
262
+        draw_text(cr, self.size_name,
263
+                  rect.x,
264
+                  rect.y,
265
+                  rect.width, rect.height,
266
+                  alignment=pango.ALIGN_RIGHT
267
+                  )
268
+        
269
+        # Draw drag line.
270
+        if self.drag_line:
271
+            with cairo_disable_antialias(cr):
272
+                cr.set_line_width(1)
273
+                if self.drag_line_at_bottom:
274
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
275
+                else:
276
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
277
+                cr.fill()
278
+        
279
+    def expand(self):
280
+        self.is_expand = True
281
+        
282
+        if self.load_status == self.LOADING_INIT:
283
+            self.add_loading_item()
284
+        elif self.load_status == self.LOADING_FINSIH:
285
+            self.add_child_item()
286
+            
287
+        if self.redraw_request_callback:
288
+            self.redraw_request_callback(self)
289
+    
290
+    def unexpand(self):
291
+        self.is_expand = False
292
+        
293
+        self.delete_chlid_item()
294
+    
295
+        if self.redraw_request_callback:
296
+            self.redraw_request_callback(self)
297
+            
298
+    def add_loading_item(self):
299
+        loading_item = LoadingItem(self.column_index + 1)
300
+        loading_item.parent_item = self
301
+        self.child_items = [loading_item]
302
+        
303
+        self.add_child_item()
304
+        
305
+        LoadingThread(self).start()
306
+    
307
+    def add_child_item(self):
308
+        self.add_items_callback(self.child_items, self.row_index + 1)
309
+        
310
+    def delete_chlid_item(self):
311
+        for child_item in self.child_items:
312
+            if isinstance(child_item, DirItem) and child_item.is_expand:
313
+                child_item.unexpand()
314
+
315
+        self.delete_items_callback(self.child_items)
316
+    
317
+    def get_height(self):
318
+        return ITEM_HEIGHT
319
+    
320
+    def get_column_widths(self):
321
+        return [self.name_width, self.size_width, self.content_type_width, -1]
322
+    
323
+    def get_column_renders(self):
324
+        return [self.render_name,
325
+                self.render_size,
326
+                self.render_type,
327
+                self.render_modification_time,
328
+                ]
329
+    
330
+    def unselect(self):
331
+        self.is_select = False
332
+        
333
+        if self.redraw_request_callback:
334
+            self.redraw_request_callback(self)
335
+            
336
+    def select(self):
337
+        self.is_select = True
338
+        
339
+        if self.redraw_request_callback:
340
+            self.redraw_request_callback(self)
341
+    
342
+    def double_click(self):
343
+        if self.is_expand:
344
+            self.unexpand()
345
+        else:
346
+            self.expand()
347
+
348
+    def draw_drag_line(self, drag_line, drag_line_at_bottom=False):
349
+        self.drag_line = drag_line
350
+        self.drag_line_at_bottom = drag_line_at_bottom
351
+
352
+        if self.redraw_request_callback:
353
+            self.redraw_request_callback(self)
354
+    
355
+gobject.type_register(DirItem)
356
+
357
+class FileItem(TreeItem):
358
+    '''
359
+    File item.
360
+    '''
361
+   
362
+    def __init__(self, gfile, column_index=0):
363
+        '''
364
+        Initialize FileItem class.
365
+        '''
366
+        TreeItem.__init__(self)
367
+        self.gfile = gfile
368
+        self.type = get_gfile_type(self.gfile)
369
+        self.name = get_gfile_name(self.gfile)
370
+        self.modification_time = get_gfile_modification_time(self.gfile)
371
+        self.content_type = get_gfile_content_type(self.gfile)
372
+        self.size = get_gfile_size(self.gfile)
373
+        self.size_name = format_file_size(self.size)
374
+        self.file_path = gfile.get_path()
375
+        self.pixbuf = get_file_icon_pixbuf(self.file_path, ICON_SIZE)
376
+        self.column_index = column_index
377
+        self.name_width = get_name_width(self.column_index, self.name)
378
+        self.modification_time_width = get_modification_time_width(self.modification_time)
379
+        self.content_type_width = get_type_width(self.content_type)
380
+        self.size_width = get_size_width(self.size_name)
381
+        
382
+    def render_name(self, cr, rect):
383
+        '''
384
+        Render icon and name of DirItem.
385
+        '''
386
+        # Draw select background.
387
+        if self.is_select:
388
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
389
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
390
+        
391
+        # Init.
392
+        expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_right.png").get_pixbuf()
393
+        
394
+        # Draw directory icon.
395
+        draw_pixbuf(cr, self.pixbuf, 
396
+                    rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT + expand_indicator_pixbuf.get_width() + INDICATOR_PADDING_RIGHT + ICON_PADDING_LEFT,
397
+                    rect.y + (rect.height - ICON_SIZE) / 2,
398
+                    )
399
+        
400
+        # Draw directory name.
401
+        draw_text(cr, self.name, 
402
+                  rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT + expand_indicator_pixbuf.get_width() + INDICATOR_PADDING_RIGHT + ICON_PADDING_LEFT + ICON_SIZE + ICON_PADDING_RIGHT,
403
+                  rect.y,
404
+                  rect.width, rect.height)
405
+        
406
+        # Draw drag line.
407
+        if self.drag_line:
408
+            with cairo_disable_antialias(cr):
409
+                cr.set_line_width(1)
410
+                if self.drag_line_at_bottom:
411
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
412
+                else:
413
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
414
+                cr.fill()
415
+            
416
+    def render_modification_time(self, cr, rect):
417
+        '''
418
+        Render type of DirItem.
419
+        '''
420
+        # Draw select background.
421
+        if self.is_select:
422
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
423
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
424
+        
425
+        # Draw directory type.
426
+        draw_text(cr, self.modification_time, 
427
+                  rect.x + MODIFICATION_TIME_PADDING_LEFT,
428
+                  rect.y,
429
+                  rect.width, rect.height)
430
+        
431
+        # Draw drag line.
432
+        if self.drag_line:
433
+            with cairo_disable_antialias(cr):
434
+                cr.set_line_width(1)
435
+                if self.drag_line_at_bottom:
436
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
437
+                else:
438
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
439
+                cr.fill()
440
+                
441
+    def render_type(self, cr, rect):
442
+        '''
443
+        Render type of DirItem.
444
+        '''
445
+        # Draw select background.
446
+        if self.is_select:
447
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
448
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
449
+        
450
+        # Draw directory type.
451
+        draw_text(cr, self.content_type, 
452
+                  rect.x + CONTENT_TYPE_PADDING_LEFT,
453
+                  rect.y,
454
+                  rect.width, rect.height)
455
+        
456
+        # Draw drag line.
457
+        if self.drag_line:
458
+            with cairo_disable_antialias(cr):
459
+                cr.set_line_width(1)
460
+                if self.drag_line_at_bottom:
461
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
462
+                else:
463
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
464
+                cr.fill()
465
+                
466
+    def render_size(self, cr, rect):
467
+        '''
468
+        Render size of DirItem.
469
+        '''
470
+        # Draw select background.
471
+        if self.is_select:
472
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
473
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
474
+        
475
+        # Draw directory size.
476
+        draw_text(cr, self.size_name,
477
+                  rect.x,
478
+                  rect.y,
479
+                  rect.width, 
480
+                  rect.height,
481
+                  alignment=pango.ALIGN_RIGHT,
482
+                  )
483
+        
484
+        # Draw drag line.
485
+        if self.drag_line:
486
+            with cairo_disable_antialias(cr):
487
+                cr.set_line_width(1)
488
+                if self.drag_line_at_bottom:
489
+                    cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
490
+                else:
491
+                    cr.rectangle(rect.x, rect.y, rect.width, 1)
492
+                cr.fill()
493
+                
494
+    def expand(self):
495
+        pass
496
+    
497
+    def unexpand(self):
498
+        pass
499
+    
500
+    def get_height(self):
501
+        return ITEM_HEIGHT
502
+    
503
+    def get_column_widths(self):
504
+        return [self.name_width, self.size_width, self.content_type_width, -1]
505
+    
506
+    def get_column_renders(self):
507
+        return [self.render_name,
508
+                self.render_size,
509
+                self.render_type,
510
+                self.render_modification_time,
511
+                ]
512
+        
513
+    def unselect(self):
514
+        self.is_select = False
515
+        
516
+        if self.redraw_request_callback:
517
+            self.redraw_request_callback(self)
518
+            
519
+    def select(self):
520
+        self.is_select = True
521
+        
522
+        if self.redraw_request_callback:
523
+            self.redraw_request_callback(self)
524
+            
525
+    def double_click(self):
526
+        app_info = gio.app_info_get_default_for_type(self.gfile.query_info("standard::content-type").get_content_type(), False)
527
+        if app_info:
528
+            app_info.launch([self.gfile], None)
529
+        else:
530
+            print "Don't know how to open file: %s" % (self.name)
531
+    
532
+    def draw_drag_line(self, drag_line, drag_line_at_bottom=False):
533
+        self.drag_line = drag_line
534
+        self.drag_line_at_bottom = drag_line_at_bottom
535
+
536
+        if self.redraw_request_callback:
537
+            self.redraw_request_callback(self)
538
+            
539
+gobject.type_register(DirItem)
540
+
541
+class LoadingItem(TreeItem):
542
+    '''
543
+    Loadding item.
544
+    '''
545
+   
546
+    def __init__(self, column_index=0):
547
+        '''
548
+        Initialize LoadingItem class.
549
+        '''
550
+        TreeItem.__init__(self)
551
+        self.column_index = column_index
552
+        
553
+    def get_height(self):
554
+        return ITEM_HEIGHT
555
+    
556
+    def get_column_widths(self):
557
+        return [200, 1, -1]
558
+    
559
+    def get_column_renders(self):
560
+        return [self.render,
561
+                lambda cr, rect: render_background(self, cr, rect),
562
+                lambda cr, rect: render_background(self, cr, rect),
563
+                lambda cr, rect: render_background(self, cr, rect),
564
+                ]
565
+    
566
+    def render(self, cr, rect):
567
+        # Draw select background.
568
+        if self.is_select:
569
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
570
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
571
+        
572
+        # Draw loading text.
573
+        draw_text(cr, "正在加载...", 
574
+                  rect.x + COLUMN_OFFSET * self.column_index, 
575
+                  rect.y, 
576
+                  rect.width, rect.height)
577
+    
578
+    def unselect(self):
579
+        self.is_select = False
580
+        
581
+        if self.redraw_request_callback:
582
+            self.redraw_request_callback(self)
583
+            
584
+    def select(self):
585
+        self.is_select = True
586
+        
587
+        if self.redraw_request_callback:
588
+            self.redraw_request_callback(self)
589
+    
590
+gobject.type_register(LoadingItem)
591
+
592
+class EmptyItem(TreeItem):
593
+    '''
594
+    Loadding item.
595
+    '''
596
+   
597
+    def __init__(self, column_index=0):
598
+        '''
599
+        Initialize EmptyItem class.
600
+        '''
601
+        TreeItem.__init__(self)
602
+        self.column_index = column_index
603
+        
604
+    def get_height(self):
605
+        return ITEM_HEIGHT
606
+    
607
+    def get_column_widths(self):
608
+        return [200, 1, -1]
609
+    
610
+    def get_column_renders(self):
611
+        return [self.render,
612
+                lambda cr, rect: render_background(self, cr, rect),
613
+                lambda cr, rect: render_background(self, cr, rect),
614
+                lambda cr, rect: render_background(self, cr, rect)
615
+                ]
616
+    
617
+    def render(self, cr, rect):
618
+        # Draw select background.
619
+        if self.is_select:
620
+            draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
621
+                         ui_theme.get_shadow_color("listview_select").get_color_info())
622
+        
623
+        # Draw loading text.
624
+        draw_text(cr, "(空)", 
625
+                  rect.x + COLUMN_OFFSET * self.column_index, 
626
+                  rect.y, 
627
+                  rect.width, rect.height)
628
+    
629
+    def unselect(self):
630
+        self.is_select = False
631
+        
632
+        if self.redraw_request_callback:
633
+            self.redraw_request_callback(self)
634
+            
635
+    def select(self):
636
+        self.is_select = True
637
+        
638
+        if self.redraw_request_callback:
639
+            self.redraw_request_callback(self)
640
+    
641
+gobject.type_register(EmptyItem)
642
+
643
+def get_dir_items(dir_path, column_index=0):
644
+    '''
645
+    Get children items with given directory path.
646
+    '''
647
+    items = []
648
+    for gfile in get_dir_child_files(dir_path, sort_file_by_name):
649
+        if is_directory(gfile):
650
+            items.append(DirItem(gfile, column_index))
651
+        else:
652
+            items.append(FileItem(gfile, column_index))
653
+            
654
+    return items
655
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/gio_utils.py Added
208
 
1
@@ -0,0 +1,206 @@
2
+#! /usr/bin/env python
3
+# -*- coding: utf-8 -*-
4
+
5
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
6
+#               2011 ~ 2012 Wang Yong
7
+# 
8
+# Author:     Wang Yong <lazycat.manatee@gmail.com>
9
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
10
+# 
11
+# This program is free software: you can redistribute it and/or modify
12
+# it under the terms of the GNU General Public License as published by
13
+# the Free Software Foundation, either version 3 of the License, or
14
+# any later version.
15
+# 
16
+# This program is distributed in the hope that it will be useful,
17
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+# GNU General Public License for more details.
20
+# 
21
+# You should have received a copy of the GNU General Public License
22
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+
24
+import gio
25
+import gtk
26
+import os
27
+import collections
28
+import sys
29
+import traceback
30
+import time
31
+
32
+file_icon_pixbuf_dict = {}
33
+
34
+def get_file_type_dict():
35
+    return ([(gio.FILE_TYPE_DIRECTORY, []),
36
+             (gio.FILE_TYPE_SYMBOLIC_LINK, []),
37
+             (gio.FILE_TYPE_MOUNTABLE, []),
38
+             (gio.FILE_TYPE_REGULAR, []),
39
+             (gio.FILE_TYPE_SHORTCUT, []),
40
+             (gio.FILE_TYPE_SPECIAL, []),
41
+             (gio.FILE_TYPE_UNKNOWN, []),
42
+             ])
43
+
44
+def get_file_icon_pixbuf(filepath, icon_size):
45
+    '''
46
+    Get icon pixbuf with given filepath.
47
+
48
+    @param filepath: File path.
49
+    @return: Return icon pixbuf with given filepath.
50
+    '''
51
+    gfile = gio.File(filepath)
52
+    mime_type = gfile.query_info("standard::content-type").get_content_type()
53
+    if file_icon_pixbuf_dict.has_key(mime_type):
54
+        return file_icon_pixbuf_dict[mime_type] 
55
+    else:
56
+        icon_theme = gtk.icon_theme_get_default()
57
+        icon_info = icon_theme.lookup_by_gicon(
58
+            gfile.query_info("standard::icon").get_icon(),
59
+            icon_size, 
60
+            gtk.ICON_LOOKUP_USE_BUILTIN)
61
+        if icon_info:
62
+            return icon_info.load_icon()
63
+        # Return unknown icon when icon_info is None.
64
+        else:
65
+            return icon_theme.load_icon("unknown", icon_size, gtk.ICON_LOOKUP_USE_BUILTIN)
66
+    
67
+def get_dir_child_num(gfile):
68
+    gfile_enumerator = gfile.enumerate_children("standard::*")
69
+    
70
+    # Return empty list if enumerator is None.
71
+    if gfile_enumerator == None:
72
+        return 0
73
+    else:
74
+        child_num = 0
75
+        while True:
76
+            if gfile_enumerator.next_file() == None:
77
+                break
78
+            else:
79
+                child_num += 1
80
+                
81
+        return child_num            
82
+        
83
+def get_dir_child_infos(dir_path, sort=None, reverse=False):
84
+    '''
85
+    Get children FileInfos with given directory path.
86
+    
87
+    @param dir_path: Directory path.
88
+    @return: Return a list of gio.Fileinfo.
89
+    '''
90
+    # Get gio file.
91
+    gfile = gio.File(dir_path)
92
+    
93
+    # Return empty list if file not exists.
94
+    if not gfile.query_exists():    
95
+        return [] 
96
+    else:
97
+        gfile_info = gfile.query_info("standard::type")
98
+        if gfile_info.get_file_type() == gio.FILE_TYPE_DIRECTORY:
99
+            try:
100
+                gfile_enumerator = gfile.enumerate_children("standard::*")
101
+                
102
+                # Return empty list if enumerator is None.
103
+                if gfile_enumerator == None:
104
+                    return []
105
+                else:
106
+                    file_infos = []
107
+                    while True:
108
+                        file_info = gfile_enumerator.next_file()
109
+                        if file_info == None:
110
+                            break
111
+                        else:
112
+                            file_infos.append(file_info)
113
+                            
114
+                    if sort:
115
+                        return sort(file_infos, reverse)
116
+                    else:
117
+                        return file_infos        
118
+            # Return empty list if got error when get enumerator of file.
119
+            except Exception, e:
120
+                print "function get_dir_children got error: %s" % (e)
121
+                traceback.print_exc(file=sys.stdout)
122
+                
123
+                return []
124
+        # Return empty list if file is not directory.
125
+        else:
126
+            return []
127
+        
128
+def get_dir_child_names(dir_path):
129
+    '''
130
+    Get children names with given directory path.
131
+    
132
+    @param dir_path: Directory path.
133
+    @return: Return a list of filepath.
134
+    '''
135
+    return map(lambda info: info.get_name(), get_dir_child_infos(dir_path))
136
+
137
+def get_dir_child_files(dir_path, sort_files=None, reverse=False):
138
+    '''
139
+    Get children gio.File with given directory path.
140
+
141
+    @param dir_path: Directory path.
142
+    @return: Return a list of gio.File.
143
+    '''
144
+    gfiles = []
145
+    file_infos = get_dir_child_infos(dir_path, sort_files, reverse)
146
+    for (index, file_info) in enumerate(file_infos):
147
+        gfile = gio.File(os.path.join(dir_path, file_infos[index].get_name()))
148
+        gfiles.append(gfile)
149
+
150
+    return gfiles    
151
+    
152
+def sort_file_by_name(file_infos, reverse):
153
+    '''
154
+    Sort file info by name.
155
+    '''
156
+    # Init.
157
+    file_info_oreder_dict = collections.OrderedDict(get_file_type_dict())
158
+    
159
+    # Split info with different file type.
160
+    for file_info in file_infos:
161
+        file_info_oreder_dict[file_info.get_file_type()].append(file_info)
162
+    
163
+    # Get sorted info list.
164
+    infos = []    
165
+    for (file_type, file_type_infos) in file_info_oreder_dict.items():
166
+        infos += sorted(file_type_infos, key=lambda info: info.get_name())
167
+        
168
+    return infos    
169
+
170
+def get_gfile_name(gfile):
171
+    '''
172
+    Get name of gfile.
173
+    '''
174
+    return gfile.query_info("standard::name").get_name()
175
+
176
+def get_gfile_content_type(gfile):
177
+    '''
178
+    Get type of gfile.
179
+    '''
180
+    return gio.content_type_get_description(gfile.query_info("standard::content-type").get_content_type())
181
+
182
+def get_gfile_modification_time(gfile):
183
+    return time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(gfile.query_info("time::modified").get_modification_time()))
184
+
185
+def get_gfile_size(gfile):
186
+    if gfile.query_info("standard::type").get_file_type() == gio.FILE_TYPE_DIRECTORY:
187
+        return get_dir_child_num(gfile)
188
+    else:
189
+        return gfile.query_info("standard::size").get_size()
190
+    
191
+def get_gfile_type(gfile):
192
+    return gfile.query_info("standard::type").get_file_type()
193
+
194
+def is_directory(gfile):
195
+    '''
196
+    Whether gfile is directory.
197
+    
198
+    @param gfile: gio.File.
199
+    @return: Return True if gfile is directory, else return False.
200
+    '''
201
+    return gfile.query_info("standard::type").get_file_type() == gio.FILE_TYPE_DIRECTORY
202
+
203
+if __name__ == "__main__":
204
+    print get_file_icon_pixbuf("/data/Picture/宝宝/ETB8227272-0003.JPG", 24)
205
+    print get_dir_child_files("/")
206
+    print get_dir_child_names("/home/andy")
207
+    
208
deepin-ui-1.0git20120817.tar.gz/dtk/ui/global_key.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/global_key.py Changed
30
 
1
@@ -27,6 +27,8 @@
2
 import gtk
3
 import gtk.gdk as gdk
4
 import threading
5
+import sys
6
+import traceback
7
 
8
 global_key_running = True
9
 global_key_lock = Lock()
10
@@ -135,7 +137,8 @@
11
             try:
12
                 self.root.grab_key(keycode, int(modifiers), True, X.GrabModeAsync, X.GrabModeSync)
13
             except Exception, e:
14
-                print e
15
+                print "function grab got error: %s" % (e)
16
+                traceback.print_exc(file=sys.stdout)
17
 
18
     def ungrab(self):
19
         '''
20
@@ -145,7 +148,8 @@
21
             try:
22
                 self.root.ungrab_key(keycode, modifiers, self.root)
23
             except Exception, e:
24
-                print e
25
+                print "function ungrab got error: %s" % (e)
26
+                traceback.print_exc(file=sys.stdout)
27
 
28
     def regrab(self):
29
         '''
30
deepin-ui-1.0git20120817.tar.gz/dtk/ui/iconview.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/iconview.py Changed
165
 
1
@@ -24,9 +24,11 @@
2
 from keymap import get_keyevent_name
3
 from skin_config import skin_config
4
 from theme import ui_theme
5
+import cairo
6
 import gc
7
 import gobject
8
 import gtk
9
+import math
10
 from utils import (get_match_parent, cairo_state, get_event_coords, 
11
                    is_in_rect, is_left_button, is_double_click, 
12
                    is_single_click, get_window_shadow_size)
13
@@ -62,7 +64,11 @@
14
         "double-click-item" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, int, int)),
15
     }
16
 
17
-    def __init__(self, padding_x=0, padding_y=0):
18
+    def __init__(self, 
19
+                 padding_x=0, 
20
+                 padding_y=0,
21
+                 mask_bound_height=24,
22
+                 ):
23
         '''
24
         Initialize IconView class.
25
 
26
@@ -73,6 +79,7 @@
27
         gtk.DrawingArea.__init__(self)
28
         self.padding_x = padding_x
29
         self.padding_y = padding_y
30
+        self.mask_bound_height = mask_bound_height
31
         self.add_events(gtk.gdk.ALL_EVENTS_MASK)
32
         self.set_can_focus(True) # can focus to response key-press signal
33
         self.items = []
34
@@ -401,7 +408,8 @@
35
         @param h: Height of draw area.
36
         '''
37
         draw_vlinear(cr, x, y, w, h,
38
-                     ui_theme.get_shadow_color("linear_background").get_color_info())
39
+                     ui_theme.get_shadow_color("linear_background").get_color_info()
40
+                     )
41
         
42
     def expose_icon_view(self, widget, event):
43
         '''
44
@@ -431,24 +439,80 @@
45
             
46
         # Draw mask.
47
         self.draw_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
48
+        
49
+        # Draw items.
50
+        self.draw_items(cr, rect, offset_x, offset_y, viewport)
51
             
52
-        # Draw item.
53
+    def draw_items(self, cr, rect, offset_x, offset_y, viewport):
54
+        # Draw items.
55
         if len(self.items) > 0:
56
-            with cairo_state(cr):
57
-                # Don't draw any item out of viewport area.
58
-                cr.rectangle(offset_x, offset_y,
59
-                             viewport.allocation.width, 
60
-                             viewport.allocation.height)        
61
-                cr.clip()
62
+            # Init.
63
+            vadjust = get_match_parent(self, ["ScrolledWindow"]).get_vadjustment()
64
+            
65
+            # Init top surface.
66
+            if vadjust.get_value() != vadjust.get_lower():
67
+                top_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
68
+                top_surface_cr = gtk.gdk.CairoContext(cairo.Context(top_surface))
69
                 
70
-                # Get item information.
71
-                (item_width, item_height, columns, start_index, end_index) = self.get_render_item_info()
72
+                clip_y = vadjust.get_value() + self.mask_bound_height
73
+            else:
74
+                top_surface = top_surface_cr = None
75
                 
76
+                clip_y = vadjust.get_value()
77
+                
78
+            # Init bottom surface.
79
+            if vadjust.get_value() + vadjust.get_page_size() != vadjust.get_upper():
80
+                bottom_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
81
+                bottom_surface_cr = gtk.gdk.CairoContext(cairo.Context(bottom_surface))
82
+                
83
+                clip_height = vadjust.get_page_size() - self.mask_bound_height - (clip_y - vadjust.get_value())
84
+            else:
85
+                bottom_surface = bottom_surface_cr = None
86
+                
87
+                clip_height = vadjust.get_page_size() - (clip_y - vadjust.get_value())
88
+            
89
+            with cairo_state(cr):
90
+                # Draw on drawing area.
91
+                (item_width, item_height, columns, start_index, end_index) = self.get_render_item_info()
92
                 for (index, item) in enumerate(self.items[start_index:end_index]):
93
                     row = int((start_index + index) / columns)
94
                     column = (start_index + index) % columns
95
                     render_x = rect.x + self.padding_x + column * item_width
96
                     render_y = rect.y + self.padding_y + row * item_height
97
+                    render_width = item_width
98
+                    render_height = item_height
99
+                    
100
+                    # Draw on top surface.
101
+                    if top_surface_cr:
102
+                        if (not render_y > vadjust.get_value() + self.mask_bound_height) and (not render_y + render_height < vadjust.get_value()):
103
+                            top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
104
+                            top_surface_cr.clip()
105
+                            
106
+                            item.render(
107
+                                top_surface_cr,
108
+                                gtk.gdk.Rectangle(render_x, 
109
+                                                  render_y - int(vadjust.get_value()), 
110
+                                                  render_width, 
111
+                                                  render_height))
112
+                    
113
+                    # Draw on bottom surface.
114
+                    if bottom_surface_cr:
115
+                        if (not render_y > vadjust.get_value() + vadjust.get_page_size()) and (not render_y + render_height < vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height):
116
+                            bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
117
+                            bottom_surface_cr.clip()
118
+                            
119
+                            item.render(
120
+                                bottom_surface_cr,
121
+                                gtk.gdk.Rectangle(render_x, 
122
+                                                  render_y - int(vadjust.get_value()) - int(vadjust.get_page_size() - self.mask_bound_height), 
123
+                                                  render_width, 
124
+                                                  render_height))
125
+
126
+                    cr.rectangle(offset_x, 
127
+                                 offset_y + clip_y - vadjust.get_value(),
128
+                                 viewport.allocation.width,
129
+                                 clip_height + 1)
130
+                    cr.clip()
131
                     
132
                     with cairo_state(cr):
133
                         # Don't allow draw out of item area.
134
@@ -457,6 +521,30 @@
135
                         
136
                         item.render(cr, gtk.gdk.Rectangle(render_x, render_y, item_width, item_height))
137
                         
138
+            # Draw alpha mask on top surface.
139
+            if top_surface:
140
+                i = 0
141
+                while (i <= self.mask_bound_height):
142
+                    with cairo_state(cr):
143
+                        cr.rectangle(rect.x, vadjust.get_value() + i, rect.width, 1)
144
+                        cr.clip()
145
+                        cr.set_source_surface(top_surface, 0, vadjust.get_value())
146
+                        cr.paint_with_alpha(math.sin(i * math.pi / 2 / self.mask_bound_height))
147
+                        
148
+                    i += 1    
149
+                
150
+            # Draw alpha mask on bottom surface.
151
+            if bottom_surface:
152
+                i = 0
153
+                while (i <= self.mask_bound_height):
154
+                    with cairo_state(cr):
155
+                        cr.rectangle(rect.x, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height + i, rect.width, 1)
156
+                        cr.clip()
157
+                        cr.set_source_surface(bottom_surface, 0, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height)
158
+                        cr.paint_with_alpha(1.0 - (math.sin(i * math.pi / 2 / self.mask_bound_height)))
159
+                        
160
+                    i += 1    
161
+                
162
     def get_render_item_info(self):
163
         '''
164
         Internal function to get information of render items.
165
deepin-ui-1.0git20120817.tar.gz/dtk/ui/listview.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/listview.py Changed
424
 
1
@@ -27,6 +27,8 @@
2
 from keymap import get_keyevent_name, has_ctrl_mask, has_shift_mask
3
 from skin_config import skin_config
4
 from theme import ui_theme
5
+import math
6
+import cairo
7
 import copy
8
 import gobject
9
 import gtk
10
@@ -34,6 +36,8 @@
11
 import pango
12
 import subprocess
13
 import tempfile
14
+import sys
15
+import traceback
16
 from utils import (map_value, mix_list_max, get_content_size, 
17
                    unzip, last_index, set_cursor, get_match_parent, 
18
                    remove_file, remove_timeout_id,
19
@@ -86,6 +90,7 @@
20
                  enable_drag_drop=True,
21
                  drag_icon_pixbuf=ui_theme.get_pixbuf("listview/drag_preview.png"),
22
                  drag_out_offset=50,
23
+                 mask_bound_height=24,
24
                  ):
25
         '''
26
         Initialize ListView widget.
27
@@ -134,6 +139,7 @@
28
         self.enable_multiple_select = enable_multiple_select
29
         self.drag_icon_pixbuf = drag_icon_pixbuf
30
         self.drag_out_offset = drag_out_offset
31
+        self.mask_bound_height = mask_bound_height
32
         self.auto_scroll_id = None
33
         self.auto_scroll_delay = 70 # milliseconds
34
         
35
@@ -355,6 +361,28 @@
36
         for (index, item) in enumerate(self.items):
37
             item.set_index(index)
38
             
39
+    def reorder_item(self, item, index):
40
+        '''
41
+        Reorder item with given index.
42
+        
43
+        @param item: Item need reorder.
44
+        @param index: Reorder index.
45
+
46
+        If index < 0, move to begin position of list view, if index > max_index, move to end position of list view. 
47
+        '''
48
+        if index < 0:
49
+            index = 0
50
+        else:
51
+            index = len(self.items) - 1
52
+        
53
+        with self.keep_select_status():
54
+            self.items.remove(item)
55
+            self.items.insert(index, item)
56
+            
57
+        self.update_item_index()
58
+            
59
+        self.queue_draw()    
60
+            
61
     def set_title_height(self, title_height):
62
         '''
63
         Set title height.
64
@@ -441,18 +469,6 @@
65
         else:
66
             return (0, 0, viewport)
67
             
68
-    def draw_shadow_mask(self, cr, x, y, w, h):
69
-        '''
70
-        Shadow mask interface for overwrite.
71
-        
72
-        @param cr: Cairo context.
73
-        @param x: X coordiante of draw area.
74
-        @param y: Y coordiante of draw area.
75
-        @param w: Width of draw area.
76
-        @param h: Height of draw area.
77
-        '''
78
-        pass
79
-        
80
     def draw_mask(self, cr, x, y, w, h):
81
         '''
82
         Draw mask interface.
83
@@ -556,66 +572,8 @@
84
         # Draw mask.
85
         self.draw_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
86
             
87
-        if len(self.items) > 0:
88
-            with cairo_state(cr):
89
-                # Don't draw any item under title area.
90
-                cr.rectangle(offset_x, offset_y + self.title_offset_y,
91
-                             viewport.allocation.width, viewport.allocation.height - self.title_offset_y)        
92
-                cr.clip()
93
-                
94
-                # Draw hover row.
95
-                highlight_row = None
96
-                if self.highlight_item:
97
-                    highlight_row = self.highlight_item.get_index()
98
-                
99
-                if self.hover_row != None and not self.hover_row in self.select_rows and self.hover_row != highlight_row:
100
-                    self.draw_item_hover(
101
-                        cr, offset_x, self.title_offset_y + self.hover_row * self.item_height,
102
-                        viewport.allocation.width, self.item_height)
103
-                
104
-                # Draw select rows.
105
-                for select_row in self.select_rows:
106
-                    if select_row != highlight_row:
107
-                        self.draw_item_select(
108
-                            cr, offset_x, self.title_offset_y + select_row * self.item_height,
109
-                            viewport.allocation.width, self.item_height)
110
-                    
111
-                # Draw highlight row.
112
-                if self.highlight_item:
113
-                    self.draw_item_highlight(
114
-                        cr, offset_x, self.title_offset_y + self.highlight_item.get_index() * self.item_height,
115
-                        viewport.allocation.width, self.item_height)
116
-                    
117
-                # Get viewport index.
118
-                start_y = offset_y - self.title_offset_y
119
-                end_y = offset_y + viewport.allocation.height - self.title_offset_y
120
-                start_index = max(start_y / self.item_height, 0)
121
-                if (end_y - end_y / self.item_height * self.item_height) == 0:
122
-                    end_index = min(end_y / self.item_height + 1, len(self.items))
123
-                else:
124
-                    end_index = min(end_y / self.item_height + 2, len(self.items))        
125
-                    
126
-                # Draw list item.
127
-                for (row, item) in enumerate(self.items[start_index:end_index]):
128
-                    renders = item.get_renders()
129
-                    for (column, render) in enumerate(renders):
130
-                        cell_width = cell_widths[column]
131
-                        cell_x = sum(cell_widths[0:column])
132
-                        render_x = rect.x + cell_x
133
-                        render_y = rect.y + (row + start_index) * self.item_height + self.title_offset_y
134
-                        render_width = cell_width
135
-                        render_height = self.item_height
136
-                        
137
-                        with cairo_state(cr):
138
-                            # Don't allowed list item draw out of cell rectangle.
139
-                            cr.rectangle(render_x, render_y, render_width, render_height)
140
-                            cr.clip()
141
-                            
142
-                            # Render cell.
143
-                            render(cr, gtk.gdk.Rectangle(render_x, render_y, render_width, render_height),
144
-                                   (start_index + row) in self.select_rows,
145
-                                   item == self.highlight_item)
146
-            
147
+        # Draw items.
148
+        self.draw_items(cr, rect, offset_x, offset_y, viewport, cell_widths)
149
                     
150
         # Draw titles.
151
         if self.titles:
152
@@ -671,9 +629,6 @@
153
                                 cell_offset_x + cell_width - sort_pixbuf.get_width() - self.SORT_PADDING_X,
154
                                 offset_y + (self.title_height - sort_pixbuf.get_height()) / 2)    
155
 
156
-        # Draw shadow mask.
157
-        self.draw_shadow_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
158
-        
159
         # Draw drag reference row.
160
         if self.drag_reference_row != None:
161
             drag_pixbuf = ui_theme.get_pixbuf("listview/drag_line.png").get_pixbuf()
162
@@ -689,6 +644,194 @@
163
             
164
         return False
165
     
166
+    def draw_items(self, cr, rect, offset_x, offset_y, viewport, cell_widths):
167
+        if len(self.items) > 0:
168
+            # Init.
169
+            vadjust = get_match_parent(self, ["ScrolledWindow"]).get_vadjustment()
170
+            
171
+            # Init top surface.
172
+            if vadjust.get_value() != vadjust.get_lower():
173
+                top_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
174
+                top_surface_cr = gtk.gdk.CairoContext(cairo.Context(top_surface))
175
+                
176
+                clip_y = vadjust.get_value() + self.mask_bound_height
177
+            else:
178
+                top_surface = top_surface_cr = None
179
+                
180
+                clip_y = vadjust.get_value()
181
+                
182
+            # Init bottom surface.
183
+            if vadjust.get_value() + vadjust.get_page_size() != vadjust.get_upper():
184
+                bottom_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
185
+                bottom_surface_cr = gtk.gdk.CairoContext(cairo.Context(bottom_surface))
186
+                
187
+                clip_height = vadjust.get_page_size() - self.mask_bound_height - (clip_y - vadjust.get_value())
188
+            else:
189
+                bottom_surface = bottom_surface_cr = None
190
+                
191
+                clip_height = vadjust.get_page_size() - (clip_y - vadjust.get_value())
192
+            
193
+            with cairo_state(cr):
194
+                if top_surface_cr:
195
+                    top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
196
+                    top_surface_cr.clip()
197
+                    
198
+                    self.draw_items_row(top_surface_cr, offset_x, viewport, 
199
+                                        int(vadjust.get_value()))
200
+                    
201
+                if bottom_surface_cr:
202
+                    bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
203
+                    bottom_surface_cr.clip()
204
+                    
205
+                    self.draw_items_row(bottom_surface_cr, offset_x, viewport,
206
+                                        int(vadjust.get_value()) + int(vadjust.get_page_size()) + self.mask_bound_height)
207
+                
208
+                # Don't draw any item under title area.
209
+                cr.rectangle(offset_x, 
210
+                             offset_y + self.title_offset_y + clip_y - vadjust.get_value(),
211
+                             viewport.allocation.width, 
212
+                             clip_height + 1 - self.title_offset_y
213
+                             )        
214
+                cr.clip()
215
+                
216
+                self.draw_items_row(cr, offset_x, viewport)
217
+                    
218
+            with cairo_state(cr):
219
+                # Don't draw any item under title area.
220
+                cr.rectangle(offset_x, 
221
+                             offset_y + self.title_offset_y + clip_y - vadjust.get_value(),
222
+                             viewport.allocation.width, 
223
+                             clip_height + 1 - self.title_offset_y
224
+                             )        
225
+                cr.clip()
226
+                
227
+                # Get viewport index.
228
+                start_y = offset_y - self.title_offset_y
229
+                end_y = offset_y + viewport.allocation.height - self.title_offset_y
230
+                start_index = max(start_y / self.item_height, 0)
231
+                if (end_y - end_y / self.item_height * self.item_height) == 0:
232
+                    end_index = min(end_y / self.item_height + 1, len(self.items))
233
+                else:
234
+                    end_index = min(end_y / self.item_height + 2, len(self.items))        
235
+                    
236
+                # Draw list item.
237
+                for (row, item) in enumerate(self.items[start_index:end_index]):
238
+                    renders = item.get_renders()
239
+                    for (column, render) in enumerate(renders):
240
+                        cell_width = cell_widths[column]
241
+                        cell_x = sum(cell_widths[0:column])
242
+                        render_x = rect.x + cell_x
243
+                        render_y = rect.y + (row + start_index) * self.item_height + self.title_offset_y
244
+                        render_width = cell_width
245
+                        render_height = self.item_height
246
+                        
247
+                        # Draw on top surface.
248
+                        if top_surface_cr:
249
+                            if (not render_y > vadjust.get_value() + self.mask_bound_height) and (not render_y + render_height < vadjust.get_value()):
250
+                                top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
251
+                                top_surface_cr.clip()
252
+                                
253
+                                render(
254
+                                    top_surface_cr,
255
+                                    gtk.gdk.Rectangle(render_x, 
256
+                                                      render_y - int(vadjust.get_value()), 
257
+                                                      render_width, 
258
+                                                      render_height),
259
+                                    (start_index + row) in self.select_rows,
260
+                                    item == self.highlight_item
261
+                                    )
262
+                        
263
+                        # Draw on bottom surface.
264
+                        if bottom_surface_cr:
265
+                            if (not render_y > vadjust.get_value() + vadjust.get_page_size()) and (not render_y + render_height < vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height):
266
+                                bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
267
+                                bottom_surface_cr.clip()
268
+                                
269
+                                render(
270
+                                    bottom_surface_cr,
271
+                                    gtk.gdk.Rectangle(render_x, 
272
+                                                      render_y - int(vadjust.get_value()) - int(vadjust.get_page_size() - self.mask_bound_height), 
273
+                                                      render_width, 
274
+                                                      render_height),
275
+                                    (start_index + row) in self.select_rows,
276
+                                    item == self.highlight_item
277
+                                    )
278
+                                
279
+                        with cairo_state(cr):
280
+                            # Don't allowed list item draw out of cell rectangle.
281
+                            cr.rectangle(render_x, render_y, render_width, render_height)
282
+                            cr.clip()
283
+                            
284
+                            # Render cell.
285
+                            render(cr, gtk.gdk.Rectangle(render_x, render_y, render_width, render_height),
286
+                                   (start_index + row) in self.select_rows,
287
+                                   item == self.highlight_item)
288
+            
289
+            # Draw alpha mask on top surface.
290
+            if top_surface:
291
+                i = 0
292
+                while (i <= self.mask_bound_height):
293
+                    with cairo_state(cr):
294
+                        cr.rectangle(rect.x, vadjust.get_value() + self.title_offset_y + i, rect.width, 1)
295
+                        cr.clip()
296
+                        cr.set_source_surface(
297
+                            top_surface, 
298
+                            0, 
299
+                            vadjust.get_value() + self.title_offset_y
300
+                            )
301
+                        cr.paint_with_alpha(math.sin(i * math.pi / 2 / self.mask_bound_height))
302
+                        
303
+                    i += 1    
304
+                
305
+            # Draw alpha mask on bottom surface.
306
+            if bottom_surface:
307
+                i = 0
308
+                while (i <= self.mask_bound_height):
309
+                    with cairo_state(cr):
310
+                        cr.rectangle(rect.x, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height + i, rect.width, 1)
311
+                        cr.clip()
312
+                        cr.set_source_surface(
313
+                            bottom_surface, 
314
+                            0, 
315
+                            vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height
316
+                            )
317
+                        cr.paint_with_alpha(1.0 - (math.sin(i * math.pi / 2 / self.mask_bound_height)))
318
+                        
319
+                    i += 1    
320
+                    
321
+    def draw_items_row(self, cr, offset_x, viewport, render_offset_y=0):
322
+        # Draw hover row.
323
+        highlight_row = None
324
+        if self.highlight_item:
325
+            highlight_row = self.highlight_item.get_index()
326
+        
327
+        if self.hover_row != None and not self.hover_row in self.select_rows and self.hover_row != highlight_row:
328
+            self.draw_item_hover(
329
+                cr, 
330
+                offset_x, 
331
+                self.title_offset_y + self.hover_row * self.item_height - render_offset_y,
332
+                viewport.allocation.width, 
333
+                self.item_height)
334
+        
335
+        # Draw select rows.
336
+        for select_row in self.select_rows:
337
+            if select_row != highlight_row:
338
+                self.draw_item_select(
339
+                    cr, 
340
+                    offset_x, 
341
+                    self.title_offset_y + select_row * self.item_height - render_offset_y,
342
+                    viewport.allocation.width, 
343
+                    self.item_height)
344
+            
345
+        # Draw highlight row.
346
+        if self.highlight_item:
347
+            self.draw_item_highlight(
348
+                cr, 
349
+                offset_x, 
350
+                self.title_offset_y + self.highlight_item.get_index() * self.item_height - render_offset_y,
351
+                viewport.allocation.width, 
352
+                self.item_height)
353
+                    
354
     def motion_list_view(self, widget, event):
355
         '''
356
         Internal callback for `motion-notify-event` signal.
357
@@ -1073,7 +1216,9 @@
358
         try:  
359
             yield  
360
         except Exception, e:  
361
-            print 'with an cairo error %s' % e  
362
+            print 'function keep_select_status got error %s' % e  
363
+            traceback.print_exc(file=sys.stdout)
364
+            
365
         else:  
366
             # Restore select status.
367
             if start_select_item != None or select_items != []:
368
@@ -1655,29 +1800,36 @@
369
         remove_items = []
370
         for row in self.select_rows:
371
             remove_items.append(self.items[row])
372
+        
373
+        self.delete_items(remove_items)    
374
             
375
-        if remove_items != []:
376
-            # Init select row.
377
-            self.start_select_row = None
378
-            self.select_rows = []
379
-            cache_remove_items = []
380
+    def delete_items(self, remove_items):
381
+        '''
382
+        Delete given items.
383
+        
384
+        @param items: Items need to remove.
385
+        '''
386
+        # Init select row.
387
+        self.start_select_row = None
388
+        self.select_rows = []
389
+        cache_remove_items = []
390
+        
391
+        # Remove select items.
392
+        for remove_item in remove_items:
393
+            cache_remove_items.append(remove_item)
394
+            self.items.remove(remove_item)
395
             
396
-            # Remove select items.
397
-            for remove_item in remove_items:
398
-                cache_remove_items.append(remove_item)
399
-                self.items.remove(remove_item)
400
-                
401
-            # Emit remove items signal.     
402
-            self.emit("delete-select-items", cache_remove_items)    
403
-                
404
-            # Update item index.
405
-            self.update_item_index()    
406
+        # Emit remove items signal.     
407
+        self.emit("delete-select-items", cache_remove_items)    
408
             
409
-            # Update vertical adjustment.
410
-            self.update_vadjustment()        
411
+        # Update item index.
412
+        self.update_item_index()    
413
         
414
-            # Redraw.
415
-            self.queue_draw()
416
+        # Update vertical adjustment.
417
+        self.update_vadjustment()        
418
+        
419
+        # Redraw.
420
+        self.queue_draw()
421
             
422
     def update_vadjustment(self):
423
         '''
424
deepin-ui-1.0git20120817.tar.gz/dtk/ui/locales.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/locales.py Changed
17
 
1
@@ -33,6 +33,8 @@
2
 from utils import get_parent_dir
3
 import gettext
4
 import os
5
+import sys
6
+import traceback
7
 
8
 LOCALE_DIR=os.path.join(get_parent_dir(__file__, 2), "locale")
9
 if not os.path.exists(LOCALE_DIR):
10
@@ -44,4 +46,6 @@
11
     gettext.textdomain("deepin-ui")
12
     _ = gettext.gettext
13
 except Exception, e:
14
+    print "module locales got error: %s" % (e)
15
+    traceback.print_exc(file=sys.stdout)
16
     _ = lambda i : i
17
deepin-ui-1.0git20120817.tar.gz/dtk/ui/menu.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/menu.py Changed
199
 
1
@@ -85,10 +85,12 @@
2
         elif isinstance(event_widget, Menu):
3
             menu_item = event_widget.get_menu_item_at_coordinate(event.get_root_coords())
4
             if menu_item:
5
-                menu_item.item_box.event(event)
6
+                if menu_item.item_box.state != gtk.STATE_INSENSITIVE:
7
+                    menu_item.item_box.event(event)
8
         else:
9
-            event_widget.event(event)
10
-            menu_grab_window_focus_out()
11
+            if event_widget.state != gtk.STATE_INSENSITIVE:
12
+                event_widget.event(event)
13
+                menu_grab_window_focus_out()
14
     
15
 def menu_grab_window_motion_notify(widget, event):
16
     global menu_active_item
17
@@ -150,11 +152,12 @@
18
                  item_padding_x=6, 
19
                  item_padding_y=3,
20
                  shadow_visible=True,
21
-                 menu_min_width=130):
22
+                 menu_min_width=130,
23
+                 menu_item_select_color=None):
24
         '''
25
         Initialize Menu class.
26
         
27
-        @param items: A list of item, item format: (item_icon, itemName, item_node).
28
+        @param items: A list of item, item format: ((item_normal_dpixbuf, item_hover_dpixbuf, item_disable_dpixbuf), item_name, item_node).
29
         @param is_root_menu: Default is False for submenu, you should set it as True if you build root menu.
30
         @param select_scale: Default is False, it will use parant's width if it set True.
31
         @param x_align: Horizontal alignment value.
32
@@ -170,7 +173,10 @@
33
         global root_menus
34
         
35
         # Init.
36
-        Window.__init__(self, shadow_visible=shadow_visible, window_type=gtk.WINDOW_POPUP)
37
+        Window.__init__(self, 
38
+                        shadow_visible=shadow_visible, 
39
+                        window_type=gtk.WINDOW_POPUP,
40
+                        shadow_radius=6)
41
         self.set_can_focus(True) # can focus to response key-press signal
42
         self.draw_mask = self.draw_menu_mask
43
         self.is_root_menu = is_root_menu
44
@@ -186,6 +192,7 @@
45
         self.item_padding_x = item_padding_x
46
         self.item_padding_y = item_padding_y
47
         self.menu_min_width = menu_min_width
48
+        self.menu_item_select_color = menu_item_select_color
49
         
50
         # Init menu window.
51
         self.set_skip_pager_hint(True)
52
@@ -205,12 +212,24 @@
53
             
54
             for item in items:
55
                 menu_item = MenuItem(
56
-                    item, font_size, self.select_scale, self.show_submenu, self.hide_submenu, 
57
-                    self.get_root_menu, self.get_menu_items,
58
-                    icon_width, icon_height,
59
-                    have_submenu, submenu_width, submenu_height,
60
-                    padding_x, padding_y,
61
-                    item_padding_x, item_padding_y, self.menu_min_width)
62
+                    item, 
63
+                    font_size, 
64
+                    self.select_scale, 
65
+                    self.show_submenu, 
66
+                    self.hide_submenu, 
67
+                    self.get_root_menu, 
68
+                    self.get_menu_items,
69
+                    icon_width, 
70
+                    icon_height,
71
+                    have_submenu, 
72
+                    submenu_width, 
73
+                    submenu_height,
74
+                    padding_x, 
75
+                    padding_y,
76
+                    item_padding_x, 
77
+                    item_padding_y, 
78
+                    self.menu_min_width,
79
+                    self.menu_item_select_color)
80
                 self.menu_items.append(menu_item)
81
                 self.item_box.pack_start(menu_item.item_box, False, False)
82
                 
83
@@ -430,7 +449,21 @@
84
             return self.root_menu
85
         else:
86
             return self
87
+        
88
+    def set_menu_item_sensitive_by_index(self, index, sensitive):
89
+        '''
90
+        Set sensitive state of menu item with given index.
91
+        
92
+        @param index: Menu item index.
93
+        @return: Return True if set success, else return False, index out of bound will cause return False.
94
+        '''
95
+        if 0 <= index < len(self.menu_items):
96
+            self.menu_items[index].item_box.set_sensitive(sensitive)
97
             
98
+            return True
99
+        else:
100
+            return False
101
+
102
 gobject.type_register(Menu)
103
 
104
 class MenuItem(object):
105
@@ -459,11 +492,12 @@
106
                  submenu_width, 
107
                  submenu_height,
108
                  menu_padding_x, menu_padding_y,
109
-                 item_padding_x, item_padding_y, min_width):
110
+                 item_padding_x, item_padding_y, min_width,
111
+                 menu_item_select_color=None):
112
         '''
113
         Initialize MenuItem class.
114
         
115
-        @param item: item format: (item_icon, itemName, item_node).
116
+        @param item: item format: ((item_normal_dpixbuf, item_hover_dpixbuf, item_disable_dpixbuf), item_name, item_node).
117
         @param font_size: Menu font size.
118
         @param select_scale: Default is False, it will use parant's width if it set True.
119
         @param show_submenu_callback: Callback when show submenus.
120
@@ -501,6 +535,7 @@
121
         self.submenu_active = False
122
         self.min_width = min_width
123
         self.arrow_padding_x = 5
124
+        self.menu_item_select_color = menu_item_select_color
125
 
126
         # Create.
127
         if self.item:
128
@@ -583,10 +618,17 @@
129
         (item_icons, item_content, item_node) = self.item[0:3]
130
         
131
         # Draw select effect.
132
-        if self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
133
+        if widget.state == gtk.STATE_INSENSITIVE:
134
+            # Set font color.
135
+            font_color = ui_theme.get_color("menu_disable_font").get_color()
136
+        elif self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
137
             # Draw background.
138
+            if self.menu_item_select_color:
139
+                item_select_color = self.menu_item_select_color
140
+            else:
141
+                item_select_color = ui_theme.get_shadow_color("menu_item_select").get_color_info()
142
             draw_vlinear(cr, rect.x, rect.y, rect.width, rect.height, 
143
-                         ui_theme.get_shadow_color("menu_item_select").get_color_info(),
144
+                         item_select_color,
145
                          MENU_ITEM_RADIUS)
146
             
147
             # Set font color.
148
@@ -596,8 +638,10 @@
149
         pixbuf = None
150
         pixbuf_width = 0
151
         if item_icons:
152
-            (item_normal_dpixbuf, item_hover_dpixbuf) = item_icons
153
-            if self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
154
+            (item_normal_dpixbuf, item_hover_dpixbuf, item_disable_dpixbuf) = item_icons
155
+            if widget.state == gtk.STATE_INSENSITIVE:
156
+                pixbuf = item_disable_dpixbuf.get_pixbuf()
157
+            elif self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
158
                 if item_hover_dpixbuf == None:
159
                     pixbuf = item_normal_dpixbuf.get_pixbuf()
160
                 else:
161
@@ -618,7 +662,9 @@
162
         
163
         # Draw submenu arrow.
164
         if isinstance(item_node, Menu):
165
-            if self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
166
+            if widget.state == gtk.STATE_INSENSITIVE:
167
+                submenu_pixbuf = ui_theme.get_pixbuf("menu/arrow_disable.png").get_pixbuf()
168
+            elif self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
169
                 submenu_pixbuf = ui_theme.get_pixbuf("menu/arrow_hover.png").get_pixbuf()
170
             else:
171
                 submenu_pixbuf = ui_theme.get_pixbuf("menu/arrow_normal.png").get_pixbuf()
172
@@ -643,15 +689,16 @@
173
         
174
         (item_icons, item_content, item_node) = self.item[0:3]
175
         if isinstance(item_node, Menu):
176
-            menu_window = self.item_box.get_toplevel()
177
-            (menu_window_x, menu_window_y) = get_widget_root_coordinate(menu_window, WIDGET_POS_RIGHT_CENTER)
178
-            (item_x, item_y) = get_widget_root_coordinate(self.item_box)
179
-            self.show_submenu_callback(
180
-                item_node, 
181
-                (menu_window_x - menu_window.shadow_radius, 
182
-                 item_y - widget.get_allocation().height - menu_window.shadow_radius),
183
-                self.item_box.allocation.height + menu_window.shadow_radius)
184
-            
185
-            self.submenu_active = True
186
+            if widget.state != gtk.STATE_INSENSITIVE:
187
+                menu_window = self.item_box.get_toplevel()
188
+                (menu_window_x, menu_window_y) = get_widget_root_coordinate(menu_window, WIDGET_POS_RIGHT_CENTER)
189
+                (item_x, item_y) = get_widget_root_coordinate(self.item_box)
190
+                self.show_submenu_callback(
191
+                    item_node, 
192
+                    (menu_window_x - menu_window.shadow_radius, 
193
+                     item_y - widget.get_allocation().height - menu_window.shadow_radius),
194
+                    self.item_box.allocation.height + menu_window.shadow_radius)
195
+                
196
+                self.submenu_active = True
197
         else:
198
             self.hide_submenu_callback()
199
deepin-ui-1.0git20120817.tar.gz/dtk/ui/mplayer_window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/mplayer_window.py Changed
363
 
1
@@ -20,18 +20,18 @@
2
 # You should have received a copy of the GNU General Public License
3
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
4
 
5
-from constant import EDGE_DICT
6
 from draw import draw_window_shadow, draw_window_frame
7
 from skin_config import skin_config
8
+from window_base import WindowBase
9
 from theme import ui_theme
10
 import cairo
11
 import gobject
12
 import gtk
13
-from utils import (cairo_state, propagate_expose, resize_window, 
14
-                   set_cursor, get_event_root_coords, enable_shadow, 
15
-                   is_double_click, move_window)
16
+from utils import (cairo_state, propagate_expose, set_cursor, 
17
+                   get_event_root_coords, 
18
+                   enable_shadow)
19
 
20
-class MplayerWindow(gtk.Window):
21
+class MplayerWindow(WindowBase):
22
     """
23
     Special Window class for mplayer.
24
 
25
@@ -63,23 +63,29 @@
26
         @param window_type: A flag of type gtk._gtk.WindowType, which indicates the type of the window. By default, it's gtk.WINDOW_TOPLEVEL.
27
         """
28
         # Init.
29
-        gtk.Window.__init__(self, window_type)
30
+        WindowBase.__init__(self, window_type)
31
+        self.shadow_radius = shadow_radius
32
+        self.enable_resize = enable_resize
33
+        self.background_color = (0, 0, 0, 0)
34
+        # FIXME: Because mplayer don't allowed window redirect colormap to screen.
35
+        # We build shadow window to emulate it, but shadow's visual effect 
36
+        # is not good enough, so we disable shadow temporary for future fixed.
37
+        self.shadow_visible = False
38
+        if enable_shadow(self) and self.shadow_visible:    
39
+            self.window_shadow.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
40
+        
41
+        self.init()
42
+        
43
+    def init(self):
44
         skin_config.wrap_skin_window(self)
45
         self.set_decorated(False)
46
         self.add_events(gtk.gdk.ALL_EVENTS_MASK)
47
-        self.shadow_radius = shadow_radius
48
         self.frame_radius = 2
49
         self.shadow_is_visible = True
50
-        self.enable_resize = enable_resize
51
         self.window_frame = gtk.VBox()
52
         self.add(self.window_frame)
53
         self.shape_flag = True
54
         
55
-        # FIXME: Because mplayer don't allowed window redirect colormap to screen.
56
-        # We build shadow window to emulate it, but shadow's visual effect 
57
-        # is not good enough, so we disable shadow temporary for future fixed.
58
-        self.shadow_visible = False
59
-        
60
         if enable_shadow(self) and self.shadow_visible:
61
             self.shadow_padding = self.shadow_radius - self.frame_radius
62
         else:
63
@@ -90,7 +96,6 @@
64
             self.window_shadow = gtk.Window(gtk.WINDOW_TOPLEVEL)
65
             self.window_shadow.add_events(gtk.gdk.ALL_EVENTS_MASK)
66
             self.window_shadow.set_decorated(False)
67
-            self.window_shadow.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
68
             self.window_shadow.set_transient_for(self)
69
             self.window_shadow.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_MENU)
70
 
71
@@ -146,19 +151,20 @@
72
         x, y, w, h = rect.x, rect.y, rect.width, rect.height
73
         
74
         # Clear color to transparent window.
75
-        cr.set_source_rgba(0.0, 0.0, 0.0, 0.0)
76
+        cr.set_source_rgba(*self.background_color)
77
         cr.set_operator(cairo.OPERATOR_SOURCE)
78
         cr.paint()
79
         
80
         # Draw background.
81
         with cairo_state(cr):
82
-            cr.rectangle(x + 2, y, w - 4, 1)
83
-            cr.rectangle(x + 1, y + 1, w - 2, 1)
84
-            cr.rectangle(x, y + 2, w, h - 4)
85
-            cr.rectangle(x + 2, y + h - 1, w - 4, 1)
86
-            cr.rectangle(x + 1, y + h - 2, w - 2, 1)
87
-            
88
-            cr.clip()
89
+            if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
90
+                cr.rectangle(x + 2, y, w - 4, 1)
91
+                cr.rectangle(x + 1, y + 1, w - 2, 1)
92
+                cr.rectangle(x, y + 2, w, h - 4)
93
+                cr.rectangle(x + 2, y + h - 1, w - 4, 1)
94
+                cr.rectangle(x + 1, y + h - 2, w - 2, 1)
95
+                
96
+                cr.clip()
97
             
98
             skin_config.render_background(cr, self, x, y)
99
         
100
@@ -166,31 +172,20 @@
101
             self.draw_mask(cr, x, y, w, h)
102
             
103
         # Draw window frame.
104
-        draw_window_frame(cr, x, y, w, h,
105
-                          ui_theme.get_alpha_color("window_frame_outside_1"),
106
-                          ui_theme.get_alpha_color("window_frame_outside_2"),
107
-                          ui_theme.get_alpha_color("window_frame_outside_3"),
108
-                          ui_theme.get_alpha_color("window_frame_inside_1"),
109
-                          ui_theme.get_alpha_color("window_frame_inside_2"),
110
-                          )
111
+        if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
112
+            draw_window_frame(cr, x, y, w, h,
113
+                              ui_theme.get_alpha_color("window_frame_outside_1"),
114
+                              ui_theme.get_alpha_color("window_frame_outside_2"),
115
+                              ui_theme.get_alpha_color("window_frame_outside_3"),
116
+                              ui_theme.get_alpha_color("window_frame_inside_1"),
117
+                              ui_theme.get_alpha_color("window_frame_inside_2"),
118
+                              )
119
         
120
         # Propagate expose.
121
         propagate_expose(widget, event)
122
         
123
         return True
124
     
125
-    def draw_mask(self, cr, x, y, w, h):
126
-        '''
127
-        Draw mask interface, you should implement it you own.
128
-        
129
-        @param cr: Cairo context.
130
-        @param x: X coordinate of draw area.
131
-        @param y: Y coordinate of draw area.
132
-        @param w: Width of draw area.
133
-        @param h: Height of draw area.
134
-        '''
135
-        pass
136
-    
137
     def set_window_shape(self, shape_flag):
138
         """
139
         Enable window shape.
140
@@ -207,7 +202,7 @@
141
         @param widget: A widget of type gtk.Widget.
142
         @param rect: The bounding region of the window.
143
         """
144
-        if rect.width > 0 and rect.height > 0:
145
+        if widget.window != None and widget.get_has_window() and rect.width > 0 and rect.height > 0:
146
             # Init.
147
             x, y, w, h = rect.x, rect.y, rect.width, rect.height
148
             bitmap = gtk.gdk.Pixmap(None, w, h, 1)
149
@@ -225,7 +220,7 @@
150
             if not self.shape_flag:
151
                 # Don't clip corner when window is fullscreen state.
152
                 cr.rectangle(x, y, w, h)
153
-            elif self.window != None and self.window.get_state() == gtk.gdk.WINDOW_STATE_FULLSCREEN:
154
+            elif self.window.get_state() in [gtk.gdk.WINDOW_STATE_FULLSCREEN, gtk.gdk.WINDOW_STATE_MAXIMIZED]:
155
                 # Don't clip corner when window is fullscreen state.
156
                 cr.rectangle(x, y, w, h)
157
             else:
158
@@ -241,7 +236,7 @@
159
             
160
             # Redraw whole window.
161
             self.queue_draw()
162
-            
163
+                
164
             if enable_shadow(self) and self.shadow_visible:
165
                 self.window_shadow.queue_draw()
166
             
167
@@ -335,13 +330,6 @@
168
         if enable_shadow(self) and self.shadow_visible:
169
             self.window_shadow.show_all()
170
         
171
-    def is_disable_window_maximized(self):
172
-        """
173
-        An interface which indicates whether the window could be maximized, you should implement this function you own.
174
-        @return: Always return False.
175
-        """
176
-        return False                
177
-                
178
     def monitor_window_state(self, widget, event):
179
         """
180
         Monitor window state, add shadow when window at maximized or fullscreen status. Otherwise hide shadow.
181
@@ -349,98 +337,9 @@
182
         @param widget: The window of type gtk.Widget.
183
         @param event: The event of gtk.gdk.Event.
184
         """
185
-        window_state = self.window.get_state()
186
-        if window_state in [gtk.gdk.WINDOW_STATE_MAXIMIZED, gtk.gdk.WINDOW_STATE_FULLSCREEN]:
187
-            self.hide_shadow()
188
-            
189
-            if self.is_disable_window_maximized():
190
-                self.unmaximize()
191
-        else:
192
-            self.show_shadow()
193
-            
194
-        self.adjust_window_shadow(widget, event)    
195
-            
196
-    def min_window(self):
197
-        """
198
-        Minimize the window. Make it iconified.
199
-        """
200
-        self.iconify()
201
-        
202
-    def toggle_max_window(self):
203
-        """
204
-        Toggle the window size between maximized size and normal size.
205
-        """
206
-        window_state = self.window.get_state()
207
-        if window_state == gtk.gdk.WINDOW_STATE_MAXIMIZED:
208
-            self.unmaximize()
209
-        else:
210
-            self.maximize()
211
-            
212
-    def toggle_fullscreen_window(self):
213
-        """
214
-        Toggle the window between fullscreen mode and normal size.
215
-        """
216
-        window_state = self.window.get_state()
217
-        if window_state == gtk.gdk.WINDOW_STATE_FULLSCREEN:
218
-            self.unfullscreen()
219
-        else:
220
-            self.fullscreen()
221
-            
222
-    def close_window(self):
223
-        """
224
-        Close the window. Send the destroy signal to the program.
225
-
226
-        @return: Always return False.
227
-        """
228
-        # Hide window immediately when user click close button,
229
-        # user will feeling this software very quick, ;p
230
-        self.hide_all()
231
-
232
-        self.emit("destroy")
233
-    
234
-        return False
235
-        
236
-    def resize_window(self, widget, event):
237
-        """
238
-        Resize the window.
239
-
240
-        @param widget: The window of type gtk.Widget.
241
-        @param event: A signal of type gtk.gdk.Event.
242
-        """
243
-        if self.enable_resize:
244
-            edge = self.get_edge()            
245
-            if edge != None:
246
-                resize_window(self, event, self, edge)
247
-                
248
-    def add_move_event(self, widget):
249
-        """
250
-        Add move event callback.
251
-
252
-        @param widget: A widget of type gtk.Widget.
253
-        """
254
-        widget.connect("button-press-event", lambda w, e: move_window(w, e, self))            
255
-        
256
-    def add_toggle_event(self, widget):
257
-        """
258
-        Add toggle event callback.
259
-
260
-        @param widget: A widget of type gtk.Widget.
261
-        """
262
-        widget.connect("button-press-event", self.double_click_window)        
263
+        super(MplayerWindow, self).monitor_window_state(widget, event)
264
         
265
-    def double_click_window(self, widget, event):
266
-        """
267
-        Internal function to double click event handler of the window. It will maximize the window.
268
-
269
-        @param widget: A widget of type gtk.Widget.
270
-        @param event: A event of type gtk.gdk.Event.
271
-
272
-        @return: Always return False.
273
-        """
274
-        if is_double_click(event):
275
-            self.toggle_max_window()
276
-            
277
-        return False    
278
+        self.adjust_window_shadow(widget, event)    
279
             
280
     def motion_notify(self, widget, event):
281
         """
282
@@ -453,17 +352,6 @@
283
             self.cursor_type = self.get_cursor_type(event)
284
             set_cursor(self.window_shadow, self.cursor_type)
285
             
286
-    def get_edge(self):
287
-        """
288
-        Get the edge which the cursor is on, according to the cursor type.
289
-
290
-        @return: If there is a corresponding cursor type, return an instance of gtk.gdk.WindowEdge, else return None.
291
-        """
292
-        if EDGE_DICT.has_key(self.cursor_type):
293
-            return EDGE_DICT[self.cursor_type]
294
-        else:
295
-            return None
296
-
297
     def get_cursor_type(self, event):
298
         """
299
         Get the cursor position.
300
@@ -482,33 +370,7 @@
301
         wh = rect.height
302
         
303
         # Return cursor position. 
304
-        if wx <= ex <= wx + self.shadow_padding:
305
-            if wy <= ey <= wy + self.shadow_padding * 2:
306
-                return gtk.gdk.TOP_LEFT_CORNER
307
-            elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
308
-                return gtk.gdk.BOTTOM_LEFT_CORNER
309
-            elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
310
-                return gtk.gdk.LEFT_SIDE
311
-            else:
312
-                return None
313
-        elif wx + ww - self.shadow_padding <= ex <= wx + ww:
314
-            if wy <= ey <= wy + self.shadow_padding * 2:
315
-                return gtk.gdk.TOP_RIGHT_CORNER
316
-            elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
317
-                return gtk.gdk.BOTTOM_RIGHT_CORNER
318
-            elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
319
-                return gtk.gdk.RIGHT_SIDE
320
-            else:
321
-                return None
322
-        elif wx + self.shadow_padding < ex < wx + ww - self.shadow_padding:
323
-            if wy <= ey <= wy + self.shadow_padding:
324
-                return gtk.gdk.TOP_SIDE
325
-            elif wy + wh - self.shadow_padding <= ey <= wy + wh:
326
-                return gtk.gdk.BOTTOM_SIDE
327
-            else: 
328
-                return None
329
-        else:
330
-            return None
331
+        return self.get_cursor_type_with_coordinate(ex, ey, wx, wy, ww, wh)
332
         
333
     def get_shadow_size(self):
334
         """
335
@@ -520,6 +382,27 @@
336
     
337
 gobject.type_register(MplayerWindow)
338
     
339
+class EmbedMplayerWindow(gtk.Plug):
340
+    def __init__(self,
341
+                 enable_resize=False, 
342
+                 shadow_radius=6, 
343
+                 ):
344
+        gtk.Plug.__init__(self, 0)
345
+        self.shadow_radius = shadow_radius
346
+        self.enable_resize = enable_resize
347
+        self.background_color = (1, 1, 1, 0.93)
348
+        # FIXME: Because mplayer don't allowed window redirect colormap to screen.
349
+        # We build shadow window to emulate it, but shadow's visual effect 
350
+        # is not good enough, so we disable shadow temporary for future fixed.
351
+        self.shadow_visible = False
352
+        
353
+        self.init()
354
+
355
+# Mix-in MplayerWindow methods (except __init__) to EmbedMplayerWindow
356
+EmbedMplayerWindow.__bases__ += (MplayerWindow,)        
357
+        
358
+gobject.type_register(EmbedMplayerWindow)
359
+
360
 if __name__ == "__main__":
361
     window = MplayerWindow()
362
     window.connect("destroy", lambda w: gtk.main_quit())
363
deepin-ui-1.0git20120817.tar.gz/dtk/ui/new_treeview.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/new_treeview.py Changed
1344
 
1
@@ -20,40 +20,1288 @@
2
 # You should have received a copy of the GNU General Public License
3
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
4
 
5
+import sys
6
+import traceback
7
+from contextlib import contextmanager 
8
 import gtk
9
 import gobject
10
+import cairo
11
+from threads import post_gui
12
+from draw import draw_vlinear, draw_pixbuf, draw_text
13
+from theme import ui_theme
14
+from keymap import has_ctrl_mask, has_shift_mask, get_keyevent_name
15
+from cache_pixbuf import CachePixbuf
16
+from utils import (cairo_state, get_window_shadow_size, get_event_coords,
17
+                   container_remove_all, get_same_level_widgets,
18
+                   is_left_button, is_double_click, is_single_click, remove_timeout_id)
19
+from skin_config import skin_config
20
 from scrolled_window import ScrolledWindow
21
+import copy
22
+import pango
23
+import math
24
+import threading as td
25
 
26
-class TreeView(ScrolledWindow):
27
+class SortThread(td.Thread):
28
+   
29
+    def __init__(self, sort_action, render_action):
30
+        td.Thread.__init__(self)
31
+        self.setDaemon(True)
32
+        self.sort_action = sort_action
33
+        self.render_action = render_action
34
+        
35
+    def run(self):
36
+        self.render_action(*self.sort_action())
37
+
38
+class TitleBox(gtk.Button):
39
+   
40
+    def __init__(self, title, index, last_one):
41
+        gtk.Button.__init__(self)
42
+        self.title = title
43
+        self.index = index
44
+        self.last_one = last_one
45
+        self.cache_pixbuf = CachePixbuf()
46
+        self.sort_ascending = False
47
+        self.focus_in = False
48
+        
49
+        self.connect("expose-event", self.expose_title_box)
50
+        
51
+    def expose_title_box(self, widget, event):
52
+        # Init.
53
+        cr = widget.window.cairo_create()
54
+        rect = widget.allocation
55
+        x, y, w, h = rect.x, rect.y, rect.width, rect.height
56
+        
57
+        # Draw background.
58
+        if widget.state == gtk.STATE_NORMAL:
59
+            header_pixbuf = ui_theme.get_pixbuf("listview/header_normal.png").get_pixbuf()
60
+        elif widget.state == gtk.STATE_PRELIGHT:
61
+            header_pixbuf = ui_theme.get_pixbuf("listview/header_hover.png").get_pixbuf()
62
+        elif widget.state == gtk.STATE_ACTIVE:
63
+            header_pixbuf = ui_theme.get_pixbuf("listview/header_press.png").get_pixbuf()
64
+
65
+        self.cache_pixbuf.scale(header_pixbuf, w, h)
66
+        draw_pixbuf(cr, self.cache_pixbuf.get_cache(), x, y)
67
+        
68
+        # Draw title.
69
+        if not self.last_one:
70
+            split_pixbuf = ui_theme.get_pixbuf("listview/split.png").get_pixbuf()
71
+            draw_pixbuf(cr, 
72
+                        split_pixbuf,
73
+                        x + w - split_pixbuf.get_width() + 1, 
74
+                        y)
75
+            
76
+        # Draw title.
77
+        draw_text(cr, self.title, x, y, w, h,
78
+                  alignment=pango.ALIGN_CENTER)    
79
+        
80
+        # Draw sort icon.
81
+        if self.focus_in:
82
+            if self.sort_ascending:
83
+                sort_pixbuf = ui_theme.get_pixbuf("listview/sort_ascending.png").get_pixbuf()
84
+            else:
85
+                sort_pixbuf = ui_theme.get_pixbuf("listview/sort_descending.png").get_pixbuf()
86
+            
87
+            draw_pixbuf(cr, sort_pixbuf,
88
+                        x + w - sort_pixbuf.get_width(),
89
+                        y + (h - sort_pixbuf.get_height()) / 2)    
90
+        
91
+        return True
92
+    
93
+    def toggle_sort(self, sort_action, render_action):
94
+        self.sort_ascending = not self.sort_ascending
95
+        
96
+        for title_box in get_same_level_widgets(self):
97
+            title_box.focus_in = title_box == self
98
+            title_box.queue_draw()
99
+            
100
+        SortThread(lambda : sort_action(self.index), render_action).start()
101
+
102
+class TreeView(gtk.VBox):
103
     '''
104
     TreeView widget.
105
     '''
106
+    
107
+    AUTO_SCROLL_HEIGHT = 24
108
    
109
     def __init__(self,
110
                  items=[],
111
-                 sort_methods=[],
112
-                 row_normal_height=None,
113
-                 row_select_height=None,
114
                  drag_data=None,
115
+                 enable_hover=True,
116
+                 enable_highlight=True,
117
                  enable_multiple_select=True,
118
                  enable_drag_drop=True,
119
                  drag_icon_pixbuf=None,
120
                  start_drag_offset=50,
121
-                 right_space=2,
122
+                 mask_bound_height=24,
123
+                 right_space=0,
124
                  top_bottom_space=3
125
                  ):
126
         '''
127
         Initialize TreeView class.
128
         '''
129
         # Init.
130
-        ScrolledWindow.__init__(self, right_space, top_bottom_space)
131
+        gtk.VBox.__init__(self)
132
+        self.visible_items = []
133
+        self.titles = None
134
+        self.sort_methods = None
135
+        self.drag_data = drag_data
136
+        self.enable_hover = enable_hover
137
+        self.enable_highlight = enable_highlight
138
+        self.enable_multiple_select = enable_multiple_select
139
+        self.enable_drag_drop = enable_drag_drop
140
+        self.drag_icon_pixbuf = drag_icon_pixbuf
141
+        self.start_drag_offset = start_drag_offset
142
+        self.mask_bound_height = mask_bound_height
143
+        self.start_drag = False
144
+        self.start_select_row = None
145
+        self.select_rows = []
146
+        self.press_item = None
147
+        self.press_in_select_rows = None
148
+        self.left_button_press = False
149
+        self.press_ctrl = False
150
+        self.press_shift = False
151
+        self.single_click_row = None
152
+        self.double_click_row = None
153
+        self.auto_scroll_id = None
154
+        self.auto_scroll_delay = 70 # milliseconds
155
+        self.drag_item = None
156
+        self.drag_reference_row = None
157
+        self.column_widths = []
158
+        self.sort_action_id = 0
159
+        
160
+        # Init redraw.
161
+        self.redraw_request_list = []
162
+        self.redraw_delay = 100 # update redraw item delay, milliseconds
163
+        gtk.timeout_add(self.redraw_delay, self.update_redraw_request_list)
164
+        
165
+        # Init widgets.
166
+        self.title_box = gtk.HBox()
167
+        
168
         self.draw_area = gtk.DrawingArea()
169
+        self.draw_area.add_events(gtk.gdk.ALL_EVENTS_MASK)
170
+        self.draw_area.set_can_focus(True)
171
         self.draw_align = gtk.Alignment()
172
         self.draw_align.set(0.5, 0.5, 1, 1)
173
         
174
+        self.scrolled_window = ScrolledWindow(right_space, top_bottom_space)
175
+        
176
+        # Connect widgets.
177
         self.draw_align.add(self.draw_area)
178
-        self.add_child(self.draw_align)
179
+        self.scrolled_window.add_child(self.draw_align)
180
+        self.pack_start(self.title_box, False, False)
181
+        self.pack_start(self.scrolled_window, True, True)
182
+        
183
+        # Handle signals.
184
+        self.draw_area.connect("expose-event", lambda w, e: self.expose_tree_view(w))
185
+        self.draw_area.connect("button-press-event", self.button_press_tree_view)
186
+        self.draw_area.connect("button-release-event", self.button_release_tree_view)
187
+        self.draw_area.connect("motion-notify-event", self.motion_tree_view)
188
+        self.draw_area.connect("key-press-event", self.key_press_tree_view)
189
+        self.draw_area.connect("key-release-event", self.key_release_tree_view)
190
+        self.draw_area.connect("size-allocate", self.size_allocated_tree_view)
191
+        
192
+        # Add items.
193
+        self.add_items(items)
194
+        
195
+        # Init keymap.
196
+        self.keymap = {
197
+            "Home" : self.select_first_item,
198
+            "End" : self.select_last_item,
199
+            "Page_Up" : self.scroll_page_up,
200
+            "Page_Down" : self.scroll_page_down,
201
+            "Up" : self.select_prev_item,
202
+            "Down" : self.select_next_item,
203
+            "Left" : self.unexpand_item,
204
+            "Right" : self.expand_item,
205
+            "Shift + Up" : self.select_to_prev_item,
206
+            "Shift + Down" : self.select_to_next_item,
207
+            "Shift + Home" : self.select_to_first_item,
208
+            "Shift + End" : self.select_to_last_item,
209
+            "Ctrl + a" : self.select_all_items,
210
+            "Delete" : self.delete_select_items,
211
+            }
212
+        
213
+    def expand_item(self):
214
+        if len(self.select_rows) == 1:
215
+            self.visible_items[self.select_rows[0]].expand()
216
+            
217
+    def unexpand_item(self):
218
+        if len(self.select_rows) == 1:
219
+            select_item = self.visible_items[self.select_rows[0]]
220
+            if select_item.is_expand:
221
+                select_item.unexpand()
222
+            else:
223
+                if select_item.parent_item != None:
224
+                    new_row = select_item.parent_item.row_index
225
+                    self.start_select_row = new_row
226
+                    self.set_select_rows([new_row])
227
+                    
228
+                    # Scroll viewport make sure preview row in visible area.
229
+                    (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
230
+                    vadjust = self.scrolled_window.get_vadjustment()
231
+                    new_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:new_row])) 
232
+                    if offset_y > new_row_height_count:
233
+                        vadjust.set_value(max(vadjust.get_lower(), 
234
+                                              new_row_height_count - self.visible_items[new_row].get_height()))
235
+                        
236
+        
237
+    def sort_column(self, sort_column_index):
238
+       # Update sort action id.
239
+       self.sort_action_id += 1
240
+       
241
+       # Save current action id to return.
242
+       sort_action_id = self.sort_action_id
243
+       
244
+       # Split items with different column index.
245
+       level_items = []
246
+       column_index = None
247
+       for item in self.visible_items:
248
+           if item.column_index != column_index:
249
+               level_items.append((item.column_index, item.parent_item, [item]))
250
+               column_index = item.column_index
251
+           else:
252
+               if len(level_items) == 0:
253
+                   level_items.append((item.column_index, item.parent_item, [item]))
254
+               else:
255
+                   level_items[-1][2].append(item)
256
+       
257
+       # Connect all toplevel items to sort.
258
+       toplevel_items = []
259
+       child_items = []
260
+       for item in level_items:
261
+           (column_index, parent_item, items) = item
262
+           if column_index == 0:
263
+               toplevel_items += items
264
+           else:
265
+               child_items.append(item)
266
+       level_items = [(0, None, toplevel_items)] + child_items        
267
+       
268
+       # Sort items with different column index to make sure parent item sort before child item.
269
+       level_items = sorted(level_items, key=lambda (column_index, parent_item, items): column_index)            
270
+       
271
+       # Sort all items.
272
+       result_items = []
273
+       for (column_index, parent_item, items) in level_items:
274
+           # Do sort action.
275
+           sort_items = self.sort_methods[sort_column_index](
276
+               items, 
277
+               self.title_box.get_children()[sort_column_index].sort_ascending
278
+               )
279
+           
280
+           # If column index is 0, insert at last position.
281
+           if column_index == 0:
282
+               result_items += sort_items
283
+           # Insert after parent item if column index is not 0 (child items).
284
+           else:
285
+               split_index = result_items.index(parent_item) + 1
286
+               result_items = result_items[0:split_index] + sort_items + result_items[split_index::]
287
+           
288
+       return (result_items, sort_action_id)
289
+    
290
+    @post_gui
291
+    def render_sort_column(self, items, sort_action_id):
292
+        if sort_action_id == self.sort_action_id:
293
+            self.add_items(items, None, True)
294
+        else:
295
+            print "render_sort_column: drop old sort result!"
296
+        
297
+    def set_column_titles(self, titles, sort_methods):
298
+        if titles != None and sort_methods != None:
299
+            self.titles = titles
300
+            self.sort_methods = sort_methods
301
+                
302
+            container_remove_all(self.title_box)
303
+            
304
+            for (index, title) in enumerate(self.titles):
305
+                title_box = TitleBox(title, index, index == len(self.titles) - 1)
306
+                title_box.connect("button-press-event", lambda w, e: w.toggle_sort(self.sort_column, self.render_sort_column))
307
+                self.title_box.pack_start(title_box)
308
+        else:
309
+            self.titles = None
310
+            self.sort_methods = None
311
+            
312
+            container_remove_all(self.title_box)
313
+        
314
+    def set_select_rows(self, rows):
315
+        for select_row in self.select_rows:
316
+            self.visible_items[select_row].unselect()
317
+            
318
+        self.select_rows = rows
319
+        
320
+        if rows == []:
321
+            self.start_select_row = None
322
+        else:
323
+            for select_row in self.select_rows:
324
+                self.visible_items[select_row].select()
325
+        
326
+    def select_first_item(self):
327
+        '''
328
+        Select first item.
329
+        '''
330
+        if len(self.visible_items) > 0:
331
+            # Update select rows.
332
+            self.start_select_row = 0
333
+            self.set_select_rows([0])
334
+            
335
+            # Scroll to top.
336
+            vadjust = self.scrolled_window.get_vadjustment()
337
+            vadjust.set_value(vadjust.get_lower())
338
+            
339
+    def select_last_item(self):
340
+        '''
341
+        Select last item.
342
+        '''
343
+        if len(self.visible_items) > 0:
344
+            # Update select rows.
345
+            last_row = len(self.visible_items) - 1
346
+            self.start_select_row = last_row
347
+            self.set_select_rows([last_row])
348
+            
349
+            # Scroll to bottom.
350
+            vadjust = self.scrolled_window.get_vadjustment()
351
+            vadjust.set_value(vadjust.get_upper() - vadjust.get_page_size())
352
+            
353
+    def scroll_page_up(self):
354
+        '''
355
+        Scroll page up.
356
+        '''
357
+        if self.select_rows == []:
358
+            # Select row.
359
+            vadjust = self.scrolled_window.get_vadjustment()
360
+            select_y = max(vadjust.get_value() - vadjust.get_page_size(), 0)
361
+            select_row = self.get_row_with_coordinate(select_y)
362
+            
363
+            # Update select row.
364
+            self.start_select_row = select_row
365
+            self.set_select_rows([select_row])
366
+            
367
+            # Scroll viewport make sure preview row in visible area.
368
+            (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
369
+            if select_row == 0:
370
+                vadjust.set_value(vadjust.get_lower())
371
+            else:
372
+                item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:select_row]))
373
+                if offset_y > item_height_count:
374
+                    vadjust.set_value(max(item_height_count - self.visible_items[select_row].get_height(), vadjust.get_lower()))
375
+        else:
376
+            if self.start_select_row != None:
377
+                # Record offset before scroll.
378
+                vadjust = self.scrolled_window.get_vadjustment()
379
+                
380
+                item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:self.start_select_row]))
381
+                scroll_offset_y = item_height_count - vadjust.get_value()
382
+                
383
+                # Get select row.
384
+                select_y = max(item_height_count - vadjust.get_page_size(), 0)
385
+                select_row = self.get_row_with_coordinate(select_y)
386
+                
387
+                # Update select row.
388
+                self.start_select_row = select_row
389
+                self.set_select_rows([select_row])
390
+                
391
+                # Scroll viewport make sure preview row in visible area.
392
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
393
+                if select_row == 0:
394
+                    vadjust.set_value(vadjust.get_lower())
395
+                else:
396
+                    item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:select_row]))
397
+                    if offset_y > item_height_count:
398
+                        vadjust.set_value(max(item_height_count - scroll_offset_y, 
399
+                                              vadjust.get_lower()))
400
+            else:
401
+                print "scroll_page_up : impossible!"
402
+            
403
+            
404
+    def scroll_page_down(self):
405
+        '''
406
+        Scroll page down.
407
+        '''
408
+        if self.select_rows == []:
409
+            # Select row.
410
+            vadjust = self.scrolled_window.get_vadjustment()
411
+            select_y = min(vadjust.get_value() + vadjust.get_page_size(), vadjust.get_upper())
412
+            select_row = self.get_row_with_coordinate(select_y)
413
+            
414
+            # Update select row.
415
+            self.start_select_row = select_row
416
+            self.set_select_rows([select_row])
417
+            
418
+            # Scroll viewport make sure preview row in visible area.
419
+            max_y = vadjust.get_upper() - vadjust.get_page_size()
420
+            (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
421
+            item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(self.start_select_row + 1)]))
422
+            if offset_y + vadjust.get_page_size() < item_height_count:
423
+                vadjust.set_value(min(max_y, item_height_count))
424
+        else:
425
+            if self.start_select_row != None:
426
+                # Record offset before scroll.
427
+                vadjust = self.scrolled_window.get_vadjustment()
428
+                item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(self.start_select_row + 1)]))
429
+                scroll_offset_y = item_height_count - vadjust.get_value()
430
+                
431
+                # Get select row.
432
+                select_y = min(item_height_count + vadjust.get_page_size(), vadjust.get_upper())
433
+                select_row = self.get_row_with_coordinate(select_y)
434
+                
435
+                # Update select row.
436
+                self.start_select_row = select_row
437
+                self.set_select_rows([select_row])
438
+                
439
+                # Scroll viewport make sure preview row in visible area.
440
+                max_y = vadjust.get_upper() - vadjust.get_page_size()
441
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
442
+                item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(self.start_select_row + 1)]))
443
+                if offset_y + vadjust.get_page_size() < item_height_count:
444
+                    vadjust.set_value(min(max_y, item_height_count - scroll_offset_y))
445
+            else:
446
+                print "scroll_page_down : impossible!"
447
+        
448
+    def select_prev_item(self):
449
+        '''
450
+        Select preview item.
451
+        '''
452
+        if self.select_rows == []:
453
+            self.select_first_item()
454
+        else:
455
+            # Get preview row.
456
+            prev_row = max(0, self.start_select_row - 1)
457
+            
458
+            # Redraw when preview row is not current row.
459
+            if prev_row != self.start_select_row:
460
+                # Select preview row.
461
+                self.start_select_row = prev_row
462
+                self.set_select_rows([prev_row])
463
+                
464
+                # Scroll viewport make sure preview row in visible area.
465
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
466
+                vadjust = self.scrolled_window.get_vadjustment()
467
+                prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row])) 
468
+                if offset_y > prev_row_height_count:
469
+                    vadjust.set_value(max(vadjust.get_lower(),
470
+                                          prev_row_height_count - self.visible_items[prev_row].get_height()))
471
+                elif offset_y + vadjust.get_page_size() < prev_row_height_count:
472
+                    vadjust.set_value(min(vadjust.get_upper() - vadjust.get_page_size(),
473
+                                          prev_row_height_count - self.visible_items[prev_row].get_height()))
474
+            elif len(self.select_rows) > 1:
475
+                # Select preview row.
476
+                self.start_select_row = prev_row
477
+                self.set_select_rows([prev_row])
478
+                
479
+                # Scroll viewport make sure preview row in visible area.
480
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
481
+                vadjust = self.scrolled_window.get_vadjustment()
482
+                prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row])) 
483
+                if offset_y > prev_row_height_count:
484
+                    vadjust.set_value(max(vadjust.get_lower(), 
485
+                                          prev_row_height_count - self.visible_items[prev_row].get_height()))
486
+                    
487
+    def select_next_item(self):
488
+        '''
489
+        Select next item.
490
+        '''
491
+        if self.select_rows == []:
492
+            self.select_first_item()
493
+        else:
494
+            # Get next row.
495
+            next_row = min(len(self.visible_items) - 1, self.start_select_row + 1)
496
+            
497
+            # Redraw when next row is not current row.
498
+            if next_row != self.start_select_row:
499
+                # Select next row.
500
+                self.start_select_row = next_row
501
+                self.set_select_rows([next_row])
502
+                
503
+                # Scroll viewport make sure next row in visible area.
504
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
505
+                vadjust = self.scrolled_window.get_vadjustment()
506
+                next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:next_row]))
507
+                if offset_y + vadjust.get_page_size() < next_row_height_count + self.visible_items[next_row].get_height() or offset_y > next_row_height_count:
508
+                    vadjust.set_value(max(vadjust.get_lower(),
509
+                                          next_row_height_count + self.visible_items[next_row].get_height() - vadjust.get_page_size()))
510
+            elif len(self.select_rows) > 1:
511
+                # Select next row.
512
+                self.start_select_row = next_row
513
+                self.set_select_rows([next_row])
514
+                
515
+                # Scroll viewport make sure next row in visible area.
516
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self)
517
+                vadjust = self.scrolled_window.get_vadjustment()
518
+                next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(next_row + 1)]))
519
+                if offset_y + vadjust.get_page_size() < next_row_height_count:
520
+                    vadjust.set_value(max(vadjust.get_lower(),
521
+                                          next_row_height_count - vadjust.get_page_size()))
522
+                    
523
+    def select_to_prev_item(self):
524
+        '''
525
+        Select to preview item.
526
+        '''
527
+        if self.select_rows == []:
528
+            self.select_first_item()
529
+        elif self.start_select_row != None:
530
+            if self.start_select_row == self.select_rows[-1]:
531
+                first_row = self.select_rows[0]
532
+                if first_row > 0:
533
+                    prev_row = first_row - 1
534
+                    self.set_select_rows([prev_row] + self.select_rows)
535
+                    
536
+                    (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
537
+                    vadjust = self.scrolled_window.get_vadjustment()
538
+                    prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row])) 
539
+                    if offset_y > prev_row_height_count:
540
+                        vadjust.set_value(max(vadjust.get_lower(), 
541
+                                              prev_row_height_count - self.visible_items[prev_row].get_height()))
542
+            elif self.start_select_row == self.select_rows[0]:
543
+                last_row = self.select_rows[-1]
544
+                self.set_select_rows(self.select_rows.remove(last_row))
545
+                
546
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
547
+                vadjust = self.scrolled_window.get_vadjustment()
548
+                prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row])) 
549
+                if offset_y > prev_row_height_count:
550
+                    vadjust.set_value(max(vadjust.get_lower(), 
551
+                                          prev_row_height_count - self.visible_items[prev_row].get_height()))
552
+        else:
553
+            print "select_to_prev_item : impossible!"
554
+    
555
+    def select_to_next_item(self):
556
+        '''
557
+        Select to next item.
558
+        '''
559
+        if self.select_rows == []:
560
+            self.select_first_item()
561
+        elif self.start_select_row != None:
562
+            if self.start_select_row == self.select_rows[0]:
563
+                last_row = self.select_rows[-1]
564
+                if last_row < len(self.visible_items) - 1:
565
+                    next_row = last_row + 1
566
+                    self.set_select_rows(self.select_rows + [next_row])
567
+                    
568
+                    (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
569
+                    vadjust = self.scrolled_window.get_vadjustment()
570
+                    next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(next_row + 1)])) 
571
+                    if offset_y + vadjust.get_page_size() < next_row_height_count:
572
+                        vadjust.set_value(max(vadjust.get_lower(),
573
+                                              next_row_height_count + self.visible_items[next_row].get_height() - vadjust.get_page_size()))
574
+            elif self.start_select_row == self.select_rows[-1]:
575
+                first_row = self.select_rows[0]
576
+                self.set_select_rows(self.select_rows.remove(first_row))
577
+                
578
+                (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
579
+                vadjust = self.scrolled_window.get_vadjustment()
580
+                next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(next_row + 1)])) 
581
+                if offset_y + vadjust.get_page_size() < next_row_height_count:
582
+                    vadjust.set_value(max(vadjust.get_lower(),
583
+                                          next_row_height_count - vadjust.get_page_size()))
584
+        else:
585
+            print "select_to_next_item : impossible!"
586
+    
587
+    def select_to_first_item(self):
588
+        '''
589
+        Select to first item.
590
+        '''
591
+        if self.select_rows == []:
592
+            self.select_first_item()
593
+        elif self.start_select_row != None:
594
+            if self.start_select_row == self.select_rows[-1]:
595
+                self.set_select_rows(range(0, self.select_rows[-1] + 1))
596
+                vadjust = self.scrolled_window.get_vadjustment()
597
+                vadjust.set_value(vadjust.get_lower())
598
+            elif self.start_select_row == self.select_rows[0]:
599
+                self.set_select_rows(range(0, self.select_rows[0] + 1))
600
+                vadjust = self.scrolled_window.get_vadjustment()
601
+                vadjust.set_value(vadjust.get_lower())
602
+        else:
603
+            print "select_to_first_item : impossible!"
604
+            
605
+    def select_to_last_item(self):
606
+        '''
607
+        Select to last item.
608
+        '''
609
+        if self.select_rows == []:
610
+            self.select_first_item()
611
+        elif self.start_select_row != None:
612
+            if self.start_select_row == self.select_rows[0]:
613
+                self.set_select_rows(range(self.select_rows[0], len(self.visible_items)))
614
+                vadjust = self.scrolled_window.get_vadjustment()
615
+                vadjust.set_value(vadjust.get_upper() - vadjust.get_page_size())
616
+            elif self.start_select_row == self.select_rows[-1]:
617
+                self.set_select_rows(range(self.select_rows[-1], len(self.visible_items)))
618
+                vadjust = self.scrolled_window.get_vadjustment()
619
+                vadjust.set_value(vadjust.get_upper() - vadjust.get_page_size())
620
+        else:
621
+            print "select_to_end_item : impossible!"
622
+    
623
+    def select_all_items(self):
624
+        '''
625
+        Select all items.
626
+        '''
627
+        if self.select_rows == []:
628
+            self.start_select_row = 0
629
+            
630
+        self.set_select_rows(range(0, len(self.visible_items)))    
631
+        
632
+    def delete_select_items(self):
633
+        delete_items = map(lambda row: self.visible_items[row], self.select_rows)
634
+        self.start_select_row = None
635
+        self.select_rows = []
636
+        
637
+        self.delete_items(delete_items)
638
+        
639
+    def update_item_index(self):
640
+        '''
641
+        Update index of items.
642
+        '''
643
+        for (index, item) in enumerate(self.visible_items):
644
+            item.row_index = index
645
+            
646
+    def update_item_widths(self):
647
+        self.column_widths = []
648
+        for item in self.visible_items:
649
+            for (index, column_width) in enumerate(item.get_column_widths()):
650
+                if index < len(self.column_widths):
651
+                    self.column_widths[index] = max(self.column_widths[index], column_width)
652
+                else:
653
+                    self.column_widths.insert(index, column_width)
654
+                    
655
+        if self.titles != None:
656
+            title_boxs = self.title_box.get_children()
657
+            fixed_width_count = sum(filter(lambda w: w != -1, self.column_widths))
658
+            title_height = ui_theme.get_pixbuf("listview/header_press.png").get_pixbuf().get_height()
659
+            for (index, column_width) in enumerate(self.column_widths):
660
+                if column_width == -1:
661
+                    title_boxs[index].set_size_request(self.draw_area.allocation.width - fixed_width_count, title_height)
662
+                else:
663
+                    title_boxs[index].set_size_request(column_width, title_height)
664
+            
665
+    def redraw_request(self, item):
666
+        if not item in self.redraw_request_list:
667
+            self.redraw_request_list.append(item)
668
+    
669
+    def update_redraw_request_list(self):
670
+        if len(self.redraw_request_list) > 0:
671
+            self.scrolled_window.queue_draw()
672
+        
673
+        # Clear redraw request list.
674
+        self.redraw_request_list = []
675
+        
676
+        return True
677
+
678
+    
679
+    def add_items(self, items, insert_pos=None, clear_first=False):
680
+        '''
681
+        Add items.
682
+        '''
683
+        with self.keep_select_status():
684
+            if clear_first:
685
+                self.visible_items = []
686
+            
687
+            if insert_pos == None:
688
+                self.visible_items += items
689
+            else:
690
+                self.visible_items = self.visible_items[0:insert_pos] + items + self.visible_items[insert_pos::]
691
+            
692
+            # Update redraw callback.
693
+            # Callback is better way to avoid perfermance problem than gobject signal.
694
+            for item in items:
695
+                item.redraw_request_callback = self.redraw_request
696
+                item.add_items_callback = self.add_items
697
+                item.delete_items_callback = self.delete_items
698
+            
699
+            self.update_item_index()    
700
+            
701
+            self.update_item_widths()
702
+                
703
+            self.update_vadjustment()
704
+        
705
+    def delete_items(self, items):
706
+        with self.keep_select_status():
707
+            for item in items:
708
+                if item in self.visible_items:
709
+                    self.visible_items.remove(item)
710
+                    
711
+            self.update_item_index()    
712
+            
713
+            self.update_item_widths()
714
+            
715
+            self.update_vadjustment()
716
+        
717
+    def update_vadjustment(self):
718
+        vadjust_height = sum(map(lambda i: i.get_height(), self.visible_items))
719
+        self.draw_area.set_size_request(-1, vadjust_height)
720
+        vadjust = self.scrolled_window.get_vadjustment()
721
+        vadjust.set_upper(vadjust_height)
722
+        
723
+    def expose_tree_view(self, widget):
724
+        '''
725
+        Internal callback to handle `expose-event` signal.
726
+        '''
727
+        # Init.
728
+        cr = widget.window.cairo_create()
729
+        rect = widget.allocation
730
+        (offset_x, offset_y, viewport) = self.get_offset_coordinate(widget)
731
+
732
+        # Draw background.
733
+        self.draw_background(widget, cr, offset_x, offset_y)
734
+            
735
+        # Draw mask.
736
+        self.draw_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
737
+        
738
+        # Draw items.
739
+        if len(self.visible_items) > 0:
740
+            self.draw_items(rect, cr)
741
+        
742
+        return False
743
+    
744
+    def draw_background(self, widget, cr, offset_x, offset_y):
745
+        with cairo_state(cr):
746
+            cr.translate(-self.scrolled_window.allocation.x, -self.scrolled_window.allocation.y)
747
+            cr.rectangle(offset_x, offset_y, 
748
+                         self.scrolled_window.allocation.x + self.scrolled_window.allocation.width, 
749
+                         self.scrolled_window.allocation.y + self.scrolled_window.allocation.height)
750
+            cr.clip()
751
+            
752
+            (shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
753
+            skin_config.render_background(cr, widget, offset_x + shadow_x, offset_y + shadow_y)
754
+            
755
+    def draw_items(self, rect, cr):
756
+        # Init.
757
+        vadjust = self.scrolled_window.get_vadjustment()
758
+        
759
+        # Init top surface.
760
+        if vadjust.get_value() != vadjust.get_lower():
761
+            top_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
762
+            top_surface_cr = gtk.gdk.CairoContext(cairo.Context(top_surface))
763
+            
764
+            clip_y = vadjust.get_value() + self.mask_bound_height
765
+        else:
766
+            top_surface = top_surface_cr = None
767
+            
768
+            clip_y = vadjust.get_value()
769
+        
770
+        # Init bottom surface.
771
+        if vadjust.get_value() + vadjust.get_page_size() != vadjust.get_upper():
772
+            bottom_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
773
+            bottom_surface_cr = gtk.gdk.CairoContext(cairo.Context(bottom_surface))
774
+            
775
+            clip_height = vadjust.get_page_size() - self.mask_bound_height - (clip_y - vadjust.get_value())
776
+        else:
777
+            bottom_surface = bottom_surface_cr = None
778
+            
779
+            clip_height = vadjust.get_page_size() - (clip_y - vadjust.get_value())
780
+        
781
+        # Draw items.
782
+        (start_row, end_row, item_height_count) = self.get_expose_bound()
783
+        
784
+        column_widths = []
785
+        fixed_width_count = sum(filter(lambda w: w != -1, self.column_widths))
786
+        for column_width in self.column_widths:
787
+            if column_width == -1:
788
+                column_widths.append(rect.width - fixed_width_count)
789
+            else:
790
+                column_widths.append(column_width)
791
+            
792
+        for item in self.visible_items[start_row:end_row]:
793
+            item_width_count = 0
794
+            for (index, column_width) in enumerate(column_widths):
795
+                render_x = rect.x + item_width_count
796
+                render_y = rect.y + item_height_count
797
+                render_width = column_width
798
+                render_height = item.get_height()
799
+                
800
+                # Draw on top surface.
801
+                if top_surface_cr:
802
+                    if (not render_y > vadjust.get_value() + self.mask_bound_height) and (not render_y + render_height < vadjust.get_value()):
803
+                        top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
804
+                        top_surface_cr.clip()
805
+                        
806
+                        item.get_column_renders()[index](
807
+                            top_surface_cr,
808
+                            gtk.gdk.Rectangle(render_x, 
809
+                                              render_y - int(vadjust.get_value()), 
810
+                                              render_width, 
811
+                                              render_height))
812
+                
813
+                # Draw on bottom surface.
814
+                if bottom_surface_cr:
815
+                    if (not render_y > vadjust.get_value() + vadjust.get_page_size()) and (not render_y + render_height < vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height):
816
+                        bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
817
+                        bottom_surface_cr.clip()
818
+                        
819
+                        item.get_column_renders()[index](
820
+                            bottom_surface_cr,
821
+                            gtk.gdk.Rectangle(render_x, 
822
+                                              render_y - int(vadjust.get_value()) - int(vadjust.get_page_size() - self.mask_bound_height), 
823
+                                              render_width, 
824
+                                              render_height))
825
+                
826
+                # Draw on drawing area cairo.
827
+                with cairo_state(cr):
828
+                    cr.rectangle(rect.x, clip_y, rect.width, clip_height)
829
+                    cr.clip()
830
+                    
831
+                    with cairo_state(cr):
832
+                        cr.rectangle(render_x, render_y, render_width, render_height)
833
+                        cr.clip()
834
+                
835
+                        item.get_column_renders()[index](cr, gtk.gdk.Rectangle(render_x, render_y, render_width, render_height))
836
+                    
837
+                item_width_count += column_width
838
+                
839
+            item_height_count += item.get_height()    
840
+            
841
+        # Draw alpha mask on top surface.
842
+        if top_surface:
843
+            i = 0
844
+            while (i <= self.mask_bound_height):
845
+                with cairo_state(cr):
846
+                    cr.rectangle(rect.x, vadjust.get_value() + i, rect.width, 1)
847
+                    cr.clip()
848
+                    cr.set_source_surface(top_surface, 0, vadjust.get_value())
849
+                    cr.paint_with_alpha(math.sin(i * math.pi / 2 / self.mask_bound_height))
850
+                    
851
+                i += 1    
852
+            
853
+        # Draw alpha mask on bottom surface.
854
+        if bottom_surface:
855
+            i = 0
856
+            while (i < self.mask_bound_height):
857
+                with cairo_state(cr):
858
+                    cr.rectangle(rect.x, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height + i, rect.width, 1)
859
+                    cr.clip()
860
+                    cr.set_source_surface(bottom_surface, 0, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height)
861
+                    cr.paint_with_alpha(1.0 - (math.sin(i * math.pi / 2 / self.mask_bound_height)))
862
+                    
863
+                i += 1    
864
+    
865
+    def get_expose_bound(self):
866
+        (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
867
+        page_size = self.scrolled_window.get_vadjustment().get_page_size()
868
+        
869
+        start_row = None
870
+        end_row = None
871
+        start_y = None
872
+        item_height_count = 0
873
+        item_index_count = 0
874
+        for item in self.visible_items:
875
+            if start_row == None and start_y == None:
876
+                if item_height_count <= offset_y <= item_height_count + item.get_height():
877
+                    start_row = item_index_count
878
+                    start_y = item_height_count
879
+            elif end_row == None:
880
+                if item_height_count <= offset_y + page_size <= item_height_count + item.get_height():
881
+                    end_row = item_index_count + 1 # add 1 for python list split operation
882
+            else:
883
+                break
884
+            
885
+            item_index_count += 1
886
+            item_height_count += item.get_height()
887
+            
888
+        assert(start_row != None and start_y != None)    
889
+        
890
+        # Items' height must smaller than page size if end_row is None after scan all items.
891
+        # Then we need adjust end_row with last index of visible list.
892
+        if end_row == None:
893
+            end_row = len(self.visible_items)
894
+        
895
+        return (start_row, end_row, start_y)    
896
+    
897
+    def button_press_tree_view(self, widget, event):
898
+        self.draw_area.grab_focus()
899
+        
900
+        if is_left_button(event):
901
+            self.left_button_press = True
902
+            
903
+            self.click_item(event)
904
+            
905
+    def click_item(self, event):
906
+        click_row = self.get_event_row(event)
907
+        
908
+        if self.left_button_press:
909
+            if click_row == None:
910
+                self.unselect_all()
911
+            else:
912
+                if self.press_shift:
913
+                    self.shift_click(click_row)
914
+                elif self.press_ctrl:
915
+                    self.ctrl_click(click_row)
916
+                else:
917
+                    if self.enable_drag_drop and click_row in self.select_rows:
918
+                        self.start_drag = True
919
+                        
920
+                        # Record press_in_select_rows, disable select rows if mouse not move after release button.
921
+                        self.press_in_select_rows = click_row
922
+                    else:
923
+                        self.start_drag = False
924
+                        self.start_select_row = click_row
925
+                        self.set_select_rows([click_row])
926
+                        
927
+            if is_double_click(event):
928
+                self.double_click_row = copy.deepcopy(click_row)
929
+            elif is_single_click(event):
930
+                self.single_click_row = copy.deepcopy(click_row)                
931
+                
932
+    def shift_click(self, click_row):
933
+        if self.select_rows == [] or self.start_select_row == None:
934
+            self.start_select_row = click_row
935
+            select_rows = [click_row]
936
+        else:
937
+            if len(self.select_rows) == 1:
938
+                self.start_select_row = self.select_rows[0]
939
+        
940
+            if click_row < self.start_select_row:
941
+                select_rows = range(click_row, self.start_select_row + 1)
942
+            elif click_row > self.start_select_row:
943
+                select_rows = range(self.start_select_row, click_row + 1)
944
+            else:
945
+                select_rows = [click_row]
946
+                
947
+        self.set_select_rows(select_rows)        
948
+
949
+    def ctrl_click(self, click_row):
950
+        if click_row in self.select_rows:
951
+            self.select_rows.remove(click_row)
952
+            self.visible_items[click_row].unselect()
953
+        else:
954
+            self.start_select_row = click_row
955
+            self.select_rows.append(click_row)
956
+            self.visible_items[click_row].select()
957
+                
958
+    def unselect_all(self):
959
+        self.set_select_rows([])
960
+                
961
+    def button_release_tree_view(self, widget, event):
962
+        if is_left_button(event):
963
+            self.left_button_press = False
964
+            self.release_item(event)
965
+            
966
+        # Remove auto scroll handler.
967
+        remove_timeout_id(self.auto_scroll_id)    
968
+        
969
+    def release_item(self, event):
970
+        if is_left_button(event):
971
+            release_row = self.get_event_row(event)
972
+            
973
+            if release_row != None:
974
+                if self.double_click_row == release_row:
975
+                    self.visible_items[release_row].double_click()
976
+                elif self.single_click_row == release_row:
977
+                    self.visible_items[release_row].single_click()
978
 
979
+            if self.start_drag and self.is_in_visible_area(event):
980
+                self.drag_select_items_at_cursor()
981
+                
982
+            self.double_click_row = None    
983
+            self.single_click_row = None    
984
+            self.start_drag = False
985
+            
986
+            # Disable select rows when press_in_select_rows valid after button release.
987
+            if self.press_in_select_rows:
988
+                self.set_select_rows([self.press_in_select_rows])
989
+                self.start_select_row = self.press_in_select_rows
990
+                self.press_in_select_rows = None
991
+
992
+            self.set_drag_row(None)
993
+            
994
+    def is_in_visible_area(self, event):
995
+        '''
996
+        Is event coordinate in visible area.
997
+        
998
+        @param event: gtk.gdk.Event.
999
+        
1000
+        @return: Return True if event coordiante in visible area.
1001
+        '''
1002
+        (event_x, event_y) = get_event_coords(event)
1003
+        vadjust = self.scrolled_window.get_vadjustment()
1004
+        return (-self.start_drag_offset <= event_x <= self.scrolled_window.allocation.width + self.start_drag_offset
1005
+                and vadjust.get_value() - self.start_drag_offset <= event_y <= vadjust.get_value() + vadjust.get_page_size() + self.start_drag_offset)
1006
+    
1007
+    def set_drag_row(self, row):
1008
+        if self.drag_reference_row != row:
1009
+            # Clear drag row.
1010
+            if self.drag_item != None:
1011
+                self.drag_item.draw_drag_line(False)
1012
+            
1013
+            # Draw new drag row.
1014
+            if row != None:
1015
+                if row < len(self.visible_items):
1016
+                    drag_line_at_bottom = False
1017
+                    self.drag_item = self.visible_items[row]
1018
+                else:
1019
+                    drag_line_at_bottom = True
1020
+                    self.drag_item = self.visible_items[-1]
1021
+                    
1022
+                self.drag_item.draw_drag_line(True, drag_line_at_bottom)
1023
+            else:
1024
+                self.drag_item = None
1025
+                    
1026
+            # Update drag row.
1027
+            self.drag_reference_row = row
1028
+    
1029
+    def drag_select_items_at_cursor(self):
1030
+        '''
1031
+        Internal function to drag select items at cursor position.
1032
+        '''
1033
+        if self.drag_reference_row != None:
1034
+            select_items = map(lambda row: self.visible_items[row], self.select_rows)
1035
+            before_items = self.visible_items[:self.drag_reference_row]
1036
+            after_items = self.visible_items[self.drag_reference_row::]
1037
+            
1038
+            for item in select_items:
1039
+                if item in before_items:
1040
+                    before_items.remove(item)
1041
+                    
1042
+                if item in after_items:
1043
+                    after_items.remove(item)
1044
+                    
1045
+            self.visible_items = before_items + select_items + after_items        
1046
+            
1047
+            self.select_rows = range(len(before_items), len(before_items + select_items))
1048
+            
1049
+            self.update_item_index()
1050
+            
1051
+            self.queue_draw()
1052
+        
1053
+    def motion_tree_view(self, widget, event):
1054
+        self.hover_item(event)
1055
+        
1056
+        # Disable press_in_select_rows once move mouse.
1057
+        self.press_in_select_rows = None
1058
+
1059
+    def hover_item(self, event):
1060
+        if self.left_button_press:
1061
+            if self.start_drag:
1062
+                if self.enable_drag_drop:
1063
+                    if self.is_in_visible_area(event):
1064
+                        self.auto_scroll_tree_view(event)
1065
+                        
1066
+                        self.set_drag_row(self.get_drag_row(get_event_coords(event)[1]))
1067
+                    else:
1068
+                        # Begin drag is drag_data is not None.
1069
+                        if self.drag_data:
1070
+                            (targets, actions, button) = self.drag_data
1071
+                            self.drag_begin(targets, actions, button, event)
1072
+                        
1073
+                        self.set_drag_row(None)
1074
+            else:
1075
+                if self.enable_multiple_select and (not self.press_ctrl and not self.press_shift):
1076
+                    # Get hover row.
1077
+                    hover_row = self.get_event_row(event)
1078
+                    
1079
+                    # Highlight drag area.
1080
+                    if hover_row != None and self.start_select_row != None:
1081
+                        # Update select area.
1082
+                        if hover_row > self.start_select_row:
1083
+                            select_rows = range(self.start_select_row, hover_row + 1)
1084
+                        elif hover_row < self.start_select_row:
1085
+                            select_rows = range(hover_row, self.start_select_row + 1)
1086
+                        else:
1087
+                            select_rows = [hover_row]
1088
+                            
1089
+                        # Scroll viewport when cursor almost reach bound of viewport.
1090
+                        self.auto_scroll_tree_view(event)
1091
+                        
1092
+                        self.set_select_rows(select_rows)
1093
+                            
1094
+    def auto_scroll_tree_view(self, event):
1095
+        '''
1096
+        Internal function to scroll list view automatically.
1097
+        '''
1098
+        # Remove auto scroll handler.
1099
+        remove_timeout_id(self.auto_scroll_id)
1100
+        
1101
+        vadjust = self.scrolled_window.get_vadjustment()
1102
+        if event.y > vadjust.get_value() + vadjust.get_page_size() - 2 * self.AUTO_SCROLL_HEIGHT:
1103
+            self.auto_scroll_id = gobject.timeout_add(self.auto_scroll_delay, lambda : self.auto_scroll_tree_view_down(vadjust))
1104
+        elif event.y < vadjust.get_value() + 2 * self.AUTO_SCROLL_HEIGHT:
1105
+            self.auto_scroll_id = gobject.timeout_add(self.auto_scroll_delay, lambda : self.auto_scroll_tree_view_up(vadjust))
1106
+            
1107
+    def get_drag_row(self, drag_y):
1108
+        (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
1109
+        if drag_y >= offset_y + self.scrolled_window.get_vadjustment().get_page_size():
1110
+            return len(self.visible_items)
1111
+        else:
1112
+            return self.get_row_with_coordinate(drag_y)
1113
+            
1114
+    def auto_scroll_tree_view_down(self, vadjust):
1115
+        '''
1116
+        Internal function to scroll list view down automatically.
1117
+        '''
1118
+        vadjust.set_value(min(vadjust.get_value() + self.AUTO_SCROLL_HEIGHT, 
1119
+                              vadjust.get_upper() - vadjust.get_page_size()))
1120
+        
1121
+        if self.start_drag:
1122
+            self.set_drag_row(self.get_drag_row(self.draw_area.get_pointer()[1]))
1123
+        else:
1124
+            self.update_select_rows(self.get_row_with_coordinate(self.draw_area.get_pointer()[1]))
1125
+        
1126
+        return True
1127
+
1128
+    def auto_scroll_tree_view_up(self, vadjust):
1129
+        '''
1130
+        Internal function to scroll list view up automatically.
1131
+        '''
1132
+        vadjust.set_value(max(vadjust.get_value() - self.AUTO_SCROLL_HEIGHT, 
1133
+                              vadjust.get_lower()))
1134
+            
1135
+        if self.start_drag:
1136
+            self.set_drag_row(self.get_drag_row(self.draw_area.get_pointer()[1]))
1137
+        else:
1138
+            self.update_select_rows(self.get_row_with_coordinate(self.draw_area.get_pointer()[1]))
1139
+            
1140
+        return True
1141
+
1142
+    def update_select_rows(self, hover_row):
1143
+        '''
1144
+        Internal function to update select rows.
1145
+        '''
1146
+        hover_row = self.get_row_with_coordinate(self.draw_area.get_pointer()[1])
1147
+            
1148
+        # Update select area.
1149
+        if hover_row != None and self.start_select_row != None:
1150
+            if hover_row > self.start_select_row:
1151
+                select_rows = range(self.start_select_row, hover_row + 1)
1152
+            elif hover_row < self.start_select_row:
1153
+                select_rows = range(hover_row, self.start_select_row + 1)
1154
+            else:
1155
+                select_rows = [hover_row]
1156
+                
1157
+            self.set_select_rows(select_rows)    
1158
+                
1159
+    def key_press_tree_view(self, widget, event):
1160
+        if has_ctrl_mask(event):
1161
+            self.press_ctrl = True
1162
+            
1163
+        if has_shift_mask(event):
1164
+            self.press_shift = True
1165
+            
1166
+        key_name = get_keyevent_name(event)
1167
+        if self.keymap.has_key(key_name):
1168
+            self.keymap[key_name]()
1169
+            
1170
+        return True    
1171
+            
1172
+    def key_release_tree_view(self, widget, event):
1173
+        '''
1174
+        Internal callback for `key-release-event` signal.
1175
+
1176
+        @param widget: ListView widget.
1177
+        @param event: Key release event.
1178
+        '''
1179
+        if has_ctrl_mask(event):
1180
+            self.press_ctrl = False
1181
+
1182
+        if has_shift_mask(event):
1183
+            self.press_shift = False
1184
+            
1185
+    def size_allocated_tree_view(self, widget, rect):
1186
+        self.update_item_widths()
1187
+            
1188
+    def get_event_row(self, event, offset_index=0):
1189
+        '''
1190
+        Get row at event.
1191
+
1192
+        @param event: gtk.gdk.Event instance.
1193
+        @param offset_index: Offset index base on event row.
1194
+        @return: Return row at event coordinate, return None if haven't any row match event coordiante.
1195
+        '''
1196
+        (event_x, event_y) = get_event_coords(event)
1197
+        return self.get_row_with_coordinate(event_y)
1198
+        
1199
+    def get_row_with_coordinate(self, y):
1200
+        item_height_count = 0
1201
+        item_index_count = 0
1202
+        for item in self.visible_items:
1203
+            if item_height_count <= y <= item_height_count + item.get_height():
1204
+                return item_index_count
1205
+            
1206
+            item_height_count += item.get_height()
1207
+            item_index_count += 1
1208
+            
1209
+        return None    
1210
+
1211
+    def draw_mask(self, cr, x, y, w, h):
1212
+        '''
1213
+        Draw mask interface.
1214
+        
1215
+        @param cr: Cairo context.
1216
+        @param x: X coordiante of draw area.
1217
+        @param y: Y coordiante of draw area.
1218
+        @param w: Width of draw area.
1219
+        @param h: Height of draw area.
1220
+        '''
1221
+        draw_vlinear(cr, x, y, w, h,
1222
+                     ui_theme.get_shadow_color("linear_background").get_color_info()
1223
+                     )
1224
+        
1225
+    def get_offset_coordinate(self, widget):
1226
+        '''
1227
+        Get viewport offset coordinate and viewport.
1228
+
1229
+        @param widget: ListView widget.
1230
+        @return: Return viewport offset and viewport: (offset_x, offset_y, viewport).
1231
+        '''
1232
+        # Init.
1233
+        rect = widget.allocation
1234
+
1235
+        # Get coordinate.
1236
+        viewport = self.scrolled_window.get_child()
1237
+        if viewport: 
1238
+            coordinate = widget.translate_coordinates(viewport, rect.x, rect.y)
1239
+            if len(coordinate) == 2:
1240
+                (offset_x, offset_y) = coordinate
1241
+                return (-offset_x, -offset_y, viewport)
1242
+            else:
1243
+                return (0, 0, viewport)    
1244
+
1245
+        else:
1246
+            return (0, 0, viewport)
1247
+        
1248
+    @contextmanager
1249
+    def keep_select_status(self):
1250
+        '''
1251
+        Handy function that change listview and keep select status not change.
1252
+        '''
1253
+        # Save select items.
1254
+        start_select_item = None
1255
+        if self.start_select_row != None:
1256
+            start_select_item = self.visible_items[self.start_select_row]
1257
+        
1258
+        select_items = []
1259
+        for row in self.select_rows:
1260
+            select_items.append(self.visible_items[row])
1261
+            
1262
+        try:  
1263
+            yield  
1264
+        except Exception, e:  
1265
+            print 'function keep_select_status got error %s' % e  
1266
+            traceback.print_exc(file=sys.stdout)
1267
+            
1268
+        else:  
1269
+            # Restore select status.
1270
+            if start_select_item != None or select_items != []:
1271
+                # Init start select row.
1272
+                if start_select_item != None:
1273
+                    self.start_select_row = None
1274
+                
1275
+                # Init select rows.
1276
+                if select_items != []:
1277
+                    self.select_rows = []
1278
+                
1279
+                for (index, item) in enumerate(self.visible_items):
1280
+                    # Try restore select row.
1281
+                    if item in select_items:
1282
+                        self.select_rows.append(index)
1283
+                        select_items.remove(item)
1284
+                    
1285
+                    # Try restore start select row.
1286
+                    if item == start_select_item:
1287
+                        self.start_select_row = index
1288
+                        start_select_item = None
1289
+                    
1290
+                    # Stop loop when finish restore row status.
1291
+                    if select_items == [] and start_select_item == None:
1292
+                        break
1293
+        
1294
 gobject.type_register(TreeView)
1295
 
1296
 class TreeItem(gobject.GObject):
1297
@@ -68,7 +1316,44 @@
1298
         gobject.GObject.__init__(self)
1299
         self.parent_item = None
1300
         self.chlid_items = None
1301
-        self.item_row = None
1302
-        self.item_column = None
1303
+        self.row_index = None
1304
+        self.column_index = None
1305
+        self.redraw_request_callback = None
1306
+        self.add_items_callback = None
1307
+        self.delete_items_callback = None
1308
+        self.is_select = False
1309
+        self.is_expand = False
1310
+        self.drag_line = False
1311
+        self.drag_line_at_bottom = False
1312
         
1313
+    def expand(self):
1314
+        pass
1315
+    
1316
+    def unexpand(self):
1317
+        pass
1318
+    
1319
+    def get_height(self):
1320
+        pass
1321
+    
1322
+    def get_column_widths(self):
1323
+        pass
1324
+    
1325
+    def get_column_renders(self):
1326
+        pass
1327
+    
1328
+    def unselect(self):
1329
+        pass
1330
+    
1331
+    def select(self):
1332
+        pass
1333
+    
1334
+    def single_click(self):
1335
+        pass        
1336
+
1337
+    def double_click(self):
1338
+        pass        
1339
+    
1340
+    def draw_drag_line(self, drag_line, drag_line_at_bottom=False):
1341
+        pass
1342
+    
1343
 gobject.type_register(TreeItem)
1344
deepin-ui-1.0git20120817.tar.gz/dtk/ui/paned.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/paned.py Changed
326
 
1
@@ -3,9 +3,10 @@
2
 
3
 # Copyright (C) 2011 ~ 2012 Deepin, Inc.
4
 #               2011 ~ 2012 Xia Bin
5
+#               2011 ~ 2012 Wang Yong
6
 #
7
-# Author:     Xia Bin <xiabin@gmail.com>
8
-# Maintainer: Xia Bin <xiabin@gmail.com>
9
+# Author:     Xia Bin <xiabin@linuxdeepin.com>
10
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
11
 #
12
 # This program is free software: you can redistribute it and/or modify
13
 # it under the terms of the GNU General Public License as published by
14
@@ -20,10 +21,14 @@
15
 # You should have received a copy of the GNU General Public License
16
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
 
18
-from utils import is_in_rect
19
+from draw import draw_pixbuf
20
+from utils import is_in_rect, color_hex_to_cairo
21
+from constant import PANED_HANDLE_SIZE
22
 import gobject
23
 import gtk
24
-
25
+import math
26
+from theme import ui_theme
27
+        
28
 class Paned(gtk.Paned):
29
     '''
30
     Paned.
31
@@ -38,22 +43,43 @@
32
 
33
     gtk.Paned with custom better apperance.
34
     '''
35
-    def __init__(self):
36
+    def __init__(self, 
37
+                 shrink_first,
38
+                 enable_animation=False):
39
         '''
40
         Initialize Paned class.
41
         '''
42
         gtk.Paned.__init__(self)
43
-        self.bheight = 60  #the button height or width;
44
+        self.shrink_first = shrink_first
45
+        self.enable_animation = enable_animation
46
+        self.bheight = ui_theme.get_pixbuf("paned/paned_up_normal.png").get_pixbuf().get_width()
47
         self.saved_position = -1
48
-        self.handle_size = self.style_get_property('handle-size')
49
-
50
+        self.handle_size = PANED_HANDLE_SIZE - 1
51
+        self.show_button = False
52
+        self.init_button("normal")
53
+        self.animation_delay = 20 # milliseconds
54
+        self.animation_times = 10
55
+        self.animation_position_frames = []
56
+        self.press_coordinate = None
57
+        
58
+    def init_button(self, status):
59
+        if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
60
+            if self.shrink_first:
61
+                self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_left_%s.png" % status).get_pixbuf()
62
+            else:
63
+                self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_right_%s.png" % status).get_pixbuf()
64
+        else:
65
+            if self.shrink_first:
66
+                self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_up_%s.png" % status).get_pixbuf()
67
+            else:
68
+                self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_down_%s.png" % status).get_pixbuf()
69
+            
70
     def do_expose_event(self, e):
71
         '''
72
         To intercept the default expose event and draw custom handle
73
         after the **gtk.Container** expose evetn.
74
         So the gtk.Paned's expose event callback is ignore.
75
         '''
76
-        #gtk.Paned.do_expose_event(self, e)
77
         gtk.Container.do_expose_event(self, e)
78
         self.draw_handle(e)
79
 
80
@@ -66,20 +92,46 @@
81
         handle = self.get_handle_window()
82
         line_width = 1
83
         cr = handle.cairo_create()
84
-        cr.set_source_rgba(1, 0,0, 0.8)
85
+        cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("paned_line").get_color()))
86
         (width, height) = handle.get_size()
87
         if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
88
-            #draw line
89
-            cr.rectangle(0, 0, line_width, height)
90
+            if self.shrink_first:
91
+                cr.rectangle(0, 0, line_width, height)
92
+                cr.fill()
93
 
94
-            #draw_button
95
-            cr.rectangle(0, (height-self.bheight)/2,  width, self.bheight)
96
+                if self.show_button:
97
+                    draw_pixbuf(cr, 
98
+                                ui_theme.get_pixbuf("paned/paned_left_normal.png").get_pixbuf(),
99
+                                0,
100
+                                (height - self.bheight)  / 2)
101
+            else:
102
+                cr.rectangle(width - line_width, 0, line_width, height)
103
+                cr.fill()
104
+                
105
+                if self.show_button:
106
+                    draw_pixbuf(cr, 
107
+                                ui_theme.get_pixbuf("paned/paned_right_normal.png").get_pixbuf(),
108
+                                0,
109
+                                (height - self.bheight)  / 2)
110
         else:
111
-            cr.rectangle(0, 0, height, line_width)
112
-            cr.rectangle((width-self.bheight)/2, 0, self.bheight, width)
113
+            if self.shrink_first:
114
+                cr.rectangle(0, 0, width, line_width)
115
+                cr.fill()
116
+                
117
+                if self.show_button:
118
+                    draw_pixbuf(cr, 
119
+                                ui_theme.get_pixbuf("paned/paned_up_normal.png").get_pixbuf(),
120
+                                (width - self.bheight) / 2,
121
+                                0)
122
+            else:
123
+                cr.rectangle(0, height - line_width, width, line_width)
124
+                cr.fill()
125
 
126
-        cr.fill()
127
-        pass
128
+                if self.show_button:
129
+                    draw_pixbuf(cr, 
130
+                                ui_theme.get_pixbuf("paned/paned_down_normal.png").get_pixbuf(),
131
+                                (width - self.bheight) / 2,
132
+                                0)
133
 
134
     def is_in_button(self, x, y):
135
         '''
136
@@ -88,76 +140,163 @@
137
         handle = self.get_handle_window()
138
         (width, height) = handle.get_size()
139
         if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
140
-            rect =  (0, (height-self.bheight)/2, width, self.bheight)
141
+            rect =  (0, (height - self.bheight) / 2, width, self.bheight)
142
         else:
143
-            rect =  ((width-self.bheight)/2, 0, self.bheight, height)
144
+            rect =  ((width - self.bheight) / 2, 0, self.bheight, height)
145
 
146
-        if is_in_rect((x, y), rect):
147
-            return True
148
-        else:
149
-            return False
150
+        return is_in_rect((x, y), rect)
151
 
152
     def do_enter_notify_event(self, e):
153
+        self.show_button = True
154
+        
155
+        self.queue_draw()
156
+    
157
+    def do_leave_notify_event(self, e):
158
+        self.show_button = False
159
+        self.init_button("normal")
160
+        
161
+        self.queue_draw()
162
+        
163
+    def do_motion_notify_event(self, e):
164
         '''
165
         change the cursor style  when move in handler
166
         '''
167
+        # Reset press coordinate if motion mouse after press event.
168
+        self.press_coordinate = None
169
+        
170
         handle = self.get_handle_window()
171
         (width, height) = handle.get_size()
172
         if self.is_in_button(e.x, e.y):
173
             handle.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
174
+            
175
+            self.init_button("hover")
176
         else:
177
             handle.set_cursor(self.cursor_type)
178
+            
179
+            self.init_button("normal")
180
 
181
         self.queue_draw()
182
+        
183
+        gtk.Paned.do_motion_notify_event(self, e)
184
 
185
     def do_button_press_event(self, e):
186
         '''
187
         when press the handler's button change the position.
188
         '''
189
-        if self.is_in_button(e.x, e.y):
190
-            if self.saved_position == -1:
191
-                self.saved_position = self.get_position()
192
-                self.set_position(0)
193
+        handle = self.get_handle_window()
194
+        if e.window == handle:
195
+            if self.is_in_button(e.x, e.y):
196
+                self.init_button("press")
197
+            
198
+                self.do_press_actoin()
199
             else:
200
-                self.set_position(self.saved_position)
201
-                self.saved_position = -1
202
+                (width, height) = handle.get_size()
203
+                if is_in_rect((e.x, e.y), (0, 0, width, height)):
204
+                    self.press_coordinate = (e.x, e.y)
205
+            
206
+                gtk.Paned.do_button_press_event(self, e)
207
         else:
208
             gtk.Paned.do_button_press_event(self, e)
209
+            
210
         return True
211
+    
212
+    def do_button_release_event(self, e):
213
+        '''
214
+        docs
215
+        '''
216
+        gtk.Paned.do_button_release_event(self, e)
217
+        
218
+        # Do press event if not in button and finish `click` event.
219
+        if (not self.is_in_button(e.x, e.y)) and self.press_coordinate == (e.x, e.y):
220
+            self.do_press_actoin()
221
+            
222
+        return True    
223
+
224
+    def do_press_actoin(self):
225
+        '''
226
+        docs
227
+        '''
228
+        if self.saved_position == -1:
229
+            self.saved_position = self.get_position()
230
+            if self.shrink_first:
231
+                self.change_position(0)
232
+            else:
233
+                if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
234
+                    self.change_position(self.allocation.width)
235
+                else:
236
+                    self.change_position(self.allocation.height)
237
+        else:
238
+            self.change_position(self.saved_position)
239
+            self.saved_position = -1
240
+    
241
+    def change_position(self, new_position):
242
+        current_position = self.get_position()
243
+        if self.enable_animation:
244
+            if new_position != current_position:
245
+                for i in range(0, self.animation_times + 1):
246
+                    step = int(math.sin(math.pi * i / 2 / self.animation_times) * (new_position - current_position))
247
+                    self.animation_position_frames.append(current_position + step)
248
+                    
249
+                if self.animation_position_frames[-1] != new_position:
250
+                    self.animation_position_frames.append(new_position)
251
+                    
252
+                gtk.timeout_add(self.animation_delay, self.update_position)
253
+        else:
254
+            self.set_position(new_position)
255
+        
256
+    def update_position(self):
257
+        self.set_position(self.animation_position_frames.pop(0))        
258
+        
259
+        if self.animation_position_frames == []:
260
+            return False
261
+        else:
262
+            return True
263
 
264
     def do_size_allocate(self, e):
265
         gtk.Paned.do_size_allocate(self, e)
266
 
267
-        c2 = self.get_child2()
268
+        if self.shrink_first:
269
+            child = self.get_child2()
270
+        else:
271
+            child = self.get_child1()
272
 
273
-        if c2 == None: return
274
+        if child == None: return
275
 
276
-        a2 = c2.allocation
277
+        rect = child.allocation
278
+        
279
+        offset = self.handle_size
280
 
281
         if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
282
-            a2.x -= self.handle_size
283
-            a2.width += self.handle_size
284
+            if self.shrink_first:
285
+                rect.x -= offset
286
+                rect.width += offset
287
+            else:
288
+                rect.width += offset
289
         else:
290
-            a2.y -= self.handle_size
291
-            a2.height += self.handle_size
292
-        c2.size_allocate(a2)
293
+            if self.shrink_first:
294
+                rect.y -= offset
295
+                rect.height += offset
296
+            else:
297
+                rect.height += offset
298
+            
299
+        child.size_allocate(rect)
300
 
301
 class HPaned(Paned):
302
-    def __init__(self):
303
-        Paned.__init__(self)
304
+    def __init__(self, shrink_first=True):
305
+        Paned.__init__(self, shrink_first)
306
         self.set_orientation(gtk.ORIENTATION_HORIZONTAL)
307
         self.cursor_type = gtk.gdk.Cursor(gtk.gdk.SB_H_DOUBLE_ARROW)
308
 
309
 class VPaned(Paned):
310
-    def __init__(self):
311
-        Paned.__init__(self)
312
+    def __init__(self, shrink_first=True):
313
+        Paned.__init__(self, shrink_first)
314
         self.set_orientation(gtk.ORIENTATION_VERTICAL)
315
         self.cursor_type = gtk.gdk.Cursor(gtk.gdk.SB_V_DOUBLE_ARROW)
316
-
317
+        
318
 gobject.type_register(Paned)
319
 gobject.type_register(HPaned)
320
 gobject.type_register(VPaned)
321
-
322
+        
323
 if __name__ == '__main__':
324
     w = gtk.Window()
325
     w.set_size_request(700, 400)
326
deepin-ui-1.0git20120817.tar.gz/dtk/ui/progressbar.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/progressbar.py Changed
164
 
1
@@ -20,13 +20,72 @@
2
 # You should have received a copy of the GNU General Public License
3
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
4
 
5
-from draw import draw_round_rectangle, draw_vlinear, draw_text, draw_radial_round
6
+from draw import draw_vlinear
7
 from theme import ui_theme
8
-from utils import alpha_color_hex_to_cairo, cairo_state, propagate_expose
9
+from utils import cairo_state, propagate_expose, color_hex_to_cairo, cairo_disable_antialias
10
 import cairo
11
 import gobject
12
 import gtk
13
-import pango
14
+
15
+class ProgressBuffer(gobject.GObject):
16
+   
17
+    def __init__(self):
18
+        gobject.GObject.__init__(self)
19
+        self.progress = 0
20
+        
21
+    def render(self, cr, rect):
22
+        # Init.
23
+        x, y, w, h = rect.x, rect.y, rect.width, rect.height
24
+        
25
+        # Draw background frame.
26
+        with cairo_state(cr):
27
+            cr.rectangle(x, y + 1, w, h - 2)
28
+            cr.rectangle(x + 1, y, w - 2, h)
29
+            cr.clip()
30
+            
31
+            cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("progressbar_background_frame").get_color()))
32
+            cr.rectangle(x, y, w, h)
33
+            cr.set_line_width(1)
34
+            cr.stroke()
35
+            
36
+        # Draw background.
37
+        with cairo_state(cr):
38
+            cr.rectangle(x + 1, y + 1, w - 2, h - 2)
39
+            cr.clip()
40
+            
41
+            draw_vlinear(cr, x + 1, y + 1, w - 2, h - 2,
42
+                         ui_theme.get_shadow_color("progressbar_background").get_color_info(), 
43
+                         )
44
+            
45
+        if self.progress > 0:    
46
+            # Draw foreground frame.
47
+            with cairo_state(cr):
48
+                cr.rectangle(x, y + 1, w, h - 2)
49
+                cr.rectangle(x + 1, y, w - 2, h)
50
+                cr.clip()
51
+            
52
+                cr.set_antialias(cairo.ANTIALIAS_NONE)
53
+                cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("progressbar_foreground_frame").get_color()))
54
+                cr.rectangle(x + 1, y + 1, int(w * self.progress / 100) - 1, h - 1)
55
+                cr.set_line_width(1)
56
+                cr.stroke()
57
+                
58
+            # Draw foreground.
59
+            with cairo_state(cr):
60
+                cr.rectangle(x + 1, y + 1, w - 2, h - 2)
61
+                cr.clip()
62
+                
63
+                draw_vlinear(cr, x + 1, y + 1, int(w * self.progress / 100) - 2, h - 2,
64
+                             ui_theme.get_shadow_color("progressbar_foreground").get_color_info(), 
65
+                             )
66
+            
67
+        # Draw light.
68
+        with cairo_disable_antialias(cr):
69
+            cr.set_source_rgba(1, 1, 1, 0.5)
70
+            cr.rectangle(x + 1, y + 1, w - 2, 1)
71
+            cr.fill()
72
+
73
+gobject.type_register(ProgressBuffer)
74
 
75
 class ProgressBar(gtk.Button):
76
     '''
77
@@ -42,13 +101,11 @@
78
         '''
79
         # Init.
80
         gtk.Button.__init__(self)
81
-        self.progress = 0
82
-        self.light_ticker = 0
83
-        self.test_ticker = 0.0
84
+        self.test_ticker = 0
85
+        self.progress_buffer = ProgressBuffer()
86
         
87
         # Expose callback.
88
         self.connect("expose-event", self.expose_progressbar)
89
-        gtk.timeout_add(20, self.update_light_ticker)
90
         
91
     def expose_progressbar(self, widget, event):
92
         '''
93
@@ -58,56 +115,21 @@
94
         cr = widget.window.cairo_create()
95
         rect = widget.allocation
96
         
97
-        # Draw frame.
98
-        cr.set_source_rgba(*alpha_color_hex_to_cairo(ui_theme.get_alpha_color("progressbar_frame").get_color_info()))
99
-        cr.set_operator(cairo.OPERATOR_OVER)
100
-        draw_round_rectangle(cr, rect.x, rect.y, rect.width, rect.height, 1)
101
-        cr.stroke()
102
-        
103
-        # Draw background.
104
-        draw_vlinear(cr, rect.x, rect.y, rect.width, rect.height, 
105
-                     ui_theme.get_shadow_color("progressbar_background").get_color_info(), 
106
-                     1)
107
-    
108
-        # Draw foreground.
109
-        draw_vlinear(cr, rect.x, rect.y, rect.width * self.progress / 100.0, rect.height, 
110
-                     ui_theme.get_shadow_color("progressbar_foreground").get_color_info(), 
111
-                     1)
112
-        
113
-        # Draw font.
114
-        draw_text(cr, str(self.progress) + "%", 
115
-                  rect.x, rect.y, rect.width, rect.height, 
116
-                  rect.height - 5, "#000000",
117
-                  alignment=pango.ALIGN_CENTER)
118
-        
119
-        # Draw light.
120
-        light_radius = rect.height * 4
121
-        light_offset_x = min(self.light_ticker % 150, 100) / 100.0 * (rect.width + light_radius * 2)
122
-        with cairo_state(cr):
123
-            cr.rectangle(rect.x, rect.y, rect.width * self.progress / 100.0, rect.height)
124
-            cr.clip()
125
-            draw_radial_round(cr, rect.x + light_offset_x - light_radius, rect.y - light_radius / 2, light_radius, 
126
-                              ui_theme.get_shadow_color("progressbar_light").get_color_info())
127
+        self.progress_buffer.render(cr, rect)
128
                
129
         # Propagate expose.
130
         propagate_expose(widget, event)
131
         
132
         return True        
133
         
134
-    def update_light_ticker(self):
135
-        '''
136
-        Internal function to update light ticker.
137
-        '''
138
-        self.light_ticker += 1
139
-        return True
140
-            
141
+        
142
     def test_progressbar(self):
143
         '''Test prorgressbar.'''
144
         self.test_ticker += 1
145
-        self.progress = self.test_ticker % 101
146
+        self.progress_buffer.progress = self.test_ticker % 101
147
         self.queue_draw()
148
         return True
149
-        
150
+    
151
 gobject.type_register(ProgressBar)
152
 
153
 if __name__ == "__main__":
154
@@ -115,7 +137,8 @@
155
     
156
     window = gtk.Window()    
157
     progressbar = ProgressBar()
158
-    progressbar.set_size_request(200, 14)
159
+    progressbar.progress_buffer.progress = 100
160
+    progressbar.set_size_request(112, 12)
161
     progressbar_align = gtk.Alignment()
162
     progressbar_align.set(0.5, 0.5, 0.0, 0.0)
163
     progressbar_align.add(progressbar)
164
deepin-ui-1.0git20120817.tar.gz/dtk/ui/scrolled_window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/scrolled_window.py Changed
136
 
1
@@ -82,8 +82,8 @@
2
     @undocumented: do_expose_event
3
     '''
4
 
5
-    def __init__(self, 
6
-                 right_space=2, 
7
+    def __init__(self,
8
+                 right_space=2,
9
                  top_bottom_space=3):
10
         '''
11
         Init scrolled window.
12
@@ -118,6 +118,7 @@
13
                 self.is_inside = False # is pointer in the scrollbar region?
14
                 self.in_motion = False # is user is draging scrollbar?
15
                 self.policy = gtk.POLICY_AUTOMATIC
16
+                self.need_update_region = False # update gdk.Window's shape_region when need
17
 
18
         self._horizaontal = Record()
19
         self._vertical = Record()
20
@@ -168,14 +169,22 @@
21
 
22
     def make_bar_smaller(self, orientation):
23
         if orientation == gtk.ORIENTATION_HORIZONTAL:
24
-            region = gdk.region_rectangle(gdk.Rectangle(0, 0, int(self._horizaontal.bar_len), self.bar_small_width))
25
+            bar_len = self._horizaontal.bar_len
26
+            if bar_len == 0:
27
+                self._horizaontal.need_update_region = True
28
+                return
29
+            region = gdk.region_rectangle(gdk.Rectangle(0, 0, int(bar_len), self.bar_small_width))
30
 
31
             if self.hallocation.x == 0:
32
                 self.hwindow.shape_combine_region(region, self.top_bottom_space, self.bar_width - self.bar_small_width -self.right_space)
33
             else:
34
                 self.hwindow.shape_combine_region(region, -self.top_bottom_space, self.bar_width - self.bar_small_width -self.right_space)
35
         elif orientation == gtk.ORIENTATION_VERTICAL:
36
-            region = gdk.region_rectangle(gdk.Rectangle(0, 0, self.bar_small_width, int(self._vertical.bar_len)))
37
+            bar_len = self._vertical.bar_len
38
+            if bar_len == 0:
39
+                self._vertical.need_update_region = True
40
+                return
41
+            region = gdk.region_rectangle(gdk.Rectangle(0, 0, self.bar_small_width, int(bar_len)))
42
 
43
             if self.vallocation.y == 0:
44
                 self.vwindow.shape_combine_region(region, self.bar_width-self.bar_small_width - self.right_space, self.top_bottom_space)
45
@@ -319,9 +328,15 @@
46
             self._vertical.bar_len = max(bar_len, self.bar_min_length)
47
 
48
     def calc_vbar_allocation(self):
49
-        self.vallocation = gdk.Rectangle(
50
-                self.allocation.width - self.bar_width, int(self._vertical.bar_pos),
51
-                self.bar_width, int(self._vertical.bar_len))
52
+        bar_len = int(self._vertical.bar_len)
53
+        if bar_len == 0:
54
+            self.vallocation = gdk.Rectangle(0, 0, 0, 0)
55
+            self.vwindow.hide()
56
+        else:
57
+            self.vwindow.show()
58
+            self.vallocation = gdk.Rectangle(
59
+                    self.allocation.width - self.bar_width, int(self._vertical.bar_pos),
60
+                    self.bar_width, bar_len)
61
 
62
     def calc_hbar_length(self):
63
         self._horizaontal.virtual_len = self.allocation.width
64
@@ -346,9 +361,15 @@
65
         #assert 0 <= int(self.hpos) <= self.allocation.width - self.hbar_length,\
66
         #        "self.hpos %f   self.allocation.width %f self.hbar_lengh %f" % (self.hpos, self.allocation.width,
67
         #                self.hbar_length)
68
-        self.hallocation = gdk.Rectangle(
69
-                int(self._horizaontal.bar_pos), self.allocation.height - self.bar_width,
70
-                int(self._horizaontal.bar_len), self.bar_width)
71
+        bar_len = int(self._horizaontal.bar_len)
72
+        if bar_len == 0:
73
+            self.hallocation = gdk.Rectangle(0, 0, 0, 0)
74
+            self.hwindow.hide()
75
+        else:
76
+            self.hwindow.show()
77
+            self.hallocation = gdk.Rectangle(
78
+                    int(self._horizaontal.bar_pos), self.allocation.height - self.bar_width,
79
+                    bar_len, self.bar_width)
80
 
81
     def vadjustment_changed(self, adj):
82
         if self.get_realized():
83
@@ -367,14 +388,13 @@
84
             self.calc_hbar_allocation()
85
             self.hwindow.move_resize(*self.hallocation)
86
             self.queue_draw()
87
-
88
-
89
+            
90
     def add_with_viewport(self, child):
91
         '''
92
         Used to add children without native scrolling capabilities.
93
-        
94
+
95
         If a child has native scrolling, use ScrolledWindow.add() insetad
96
-        
97
+
98
         of this function.
99
 
100
         @param child: the child without native scrolling.
101
@@ -388,7 +408,7 @@
102
     def add_child(self, child):
103
         '''
104
         Add the child to this ScrolledWindow.The child should have
105
-        
106
+
107
         native scrolling capabilities.
108
 
109
         @param child: the child with native scrolling.
110
@@ -433,6 +453,14 @@
111
             self.calc_hbar_length()
112
             self.vadjustment.emit('value-changed')
113
             self.hadjustment.emit('value-changed')
114
+            if self._horizaontal.need_update_region:
115
+                self.make_bar_smaller(gtk.ORIENTATION_HORIZONTAL)
116
+                self._horizaontal.need_update_region = False
117
+                self.hwindow.show()
118
+            if self._vertical.need_update_region:
119
+                self.make_bar_smaller(gtk.ORIENTATION_VERTICAL)
120
+                self._vertical.need_update_region = False
121
+                self.vwindow.show()
122
 
123
     def do_unrealize(self):
124
         #print "do_unrealize"
125
@@ -537,8 +565,8 @@
126
     def do_map(self):
127
         gtk.Bin.do_map(self)  #must before self.xwindow.show(), didn't know the reason.
128
         self.binwindow.show()
129
-        self.hwindow.show()
130
-        self.vwindow.show()
131
+        #self.hwindow.show()  #will show or hide in calc_xbar_allocation()
132
+        #self.vwindow.show()
133
         if self.child and not self.child.get_mapped() and self.child.get_visible():
134
             self.child.do_map(self.child)
135
 
136
deepin-ui-1.0git20120817.tar.gz/dtk/ui/skin_config.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/skin_config.py Changed
42
 
1
@@ -30,6 +30,8 @@
2
 import os
3
 import tarfile
4
 import uuid
5
+import sys
6
+import traceback
7
 
8
 class SkinConfig(gobject.GObject):
9
     '''
10
@@ -58,6 +60,10 @@
11
     @undocumented: render_background
12
     @undocumented: export_skin
13
     '''
14
+    
15
+    __gsignals__ = {
16
+        "theme-changed" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)),
17
+    }
18
    
19
     def __init__(self):
20
         '''
21
@@ -253,7 +259,9 @@
22
 
23
             return True
24
         except Exception, e:
25
-            print "load_skin error: %s" % (e)
26
+            print "function load_skin got error: %s" % (e)
27
+            traceback.print_exc(file=sys.stdout)
28
+            
29
             return False
30
     
31
     def save_skin(self, given_filepath=None):
32
@@ -292,6 +300,9 @@
33
         # Redraw application.
34
         for window in self.window_list:
35
             window.queue_draw()
36
+            
37
+        # Emit `theme-changed` signal.
38
+        self.emit("theme-changed", self.theme_name)    
39
     
40
     def add_theme(self, theme):
41
         '''
42
deepin-ui-1.0git20120817.tar.gz/dtk/ui/slider.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/slider.py Changed
36
 
1
@@ -37,7 +37,9 @@
2
     active_widget = None
3
     _size_cache = None
4
 
5
-    def __init__(self, slide_callback=None):
6
+    def __init__(self, 
7
+                 slide_callback=None,
8
+                 default_index=0):
9
         '''
10
         Initialize Slider class.
11
 
12
@@ -45,6 +47,7 @@
13
         '''
14
         gtk.Viewport.__init__(self)
15
         self.slide_callback = slide_callback
16
+        self.default_index = default_index
17
         self.timeouts = dict()
18
 
19
         self.set_shadow_type(gtk.SHADOW_NONE)
20
@@ -95,6 +98,15 @@
21
 
22
         width = (len(self.layout.get_children()) or 1) * allocation.width
23
         self.content.set_size_request(width, allocation.height)
24
+        
25
+        if self.default_index > 0:
26
+            self.set_widget(self.layout.get_children()[self.default_index])
27
+                
28
+    def set_widget(self, widget):
29
+        rect = self.allocation
30
+        self.active_widget = widget
31
+        adjustment = self.get_hadjustment()
32
+        adjustment.set_value(rect.width * self.default_index)
33
 
34
     def append_widget(self, widget):
35
         '''
36
deepin-ui-1.0git20120817.tar.gz/dtk/ui/spin.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/spin.py Changed
9
 
1
@@ -96,6 +96,7 @@
2
         button_box.pack_start(arrow_down_button, False, False)
3
         self.value_entry = Entry(str(value))
4
         self.value_entry.check_text = is_float
5
+        self.value_entry.connect("changed", lambda entry, value_string: self.update_and_emit(int(value_string)))
6
         
7
         self.main_align = gtk.Alignment()
8
         self.main_align.set(0.5, 0.5, 0, 0)
9
deepin-ui-1.0git20120817.tar.gz/dtk/ui/tab_window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/tab_window.py Changed
426
 
1
@@ -20,12 +20,10 @@
2
 # You should have received a copy of the GNU General Public License
3
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
4
 
5
-from box import EventBox
6
 from button import Button
7
 from constant import DEFAULT_FONT_SIZE
8
 from dialog import DialogBox, DIALOG_MASK_TAB_PAGE
9
-from draw import draw_text
10
-from scrolled_window import ScrolledWindow
11
+from draw import draw_text, draw_round_rectangle
12
 from skin_config import skin_config
13
 from theme import ui_theme
14
 from locales import _
15
@@ -46,7 +44,7 @@
16
     @undocumented: expose_tab_content_box
17
     '''
18
    
19
-    def __init__(self):
20
+    def __init__(self, can_close_tab=False):
21
         '''
22
         Initialize TabBox class.
23
         '''
24
@@ -59,8 +57,18 @@
25
         self.tab_select_frame_color = ui_theme.get_color("tab_select_frame")
26
         self.tab_unselect_bg_color = ui_theme.get_color("tab_unselect_bg")
27
         self.tab_unselect_frame_color = ui_theme.get_color("tab_unselect_bg")
28
+        self.can_close_tab = can_close_tab
29
+        self.close_button_size = 6
30
+        self.close_button_frame_size = 3
31
+        self.close_button_padding_x = 4
32
+        self.close_button_padding_y = 6
33
+        self.close_button_select_background_color = "#EE0000"
34
+        self.close_button_select_foreground_color = "#FFFFFF"
35
+        self.close_button_color = "#666666"
36
+        self.hover_close_button_index = None
37
         
38
-        self.tab_title_box = EventBox()
39
+        self.tab_title_box = gtk.DrawingArea()
40
+        self.tab_title_box.add_events(gtk.gdk.ALL_EVENTS_MASK)
41
         self.tab_title_box.set_size_request(-1, self.tab_height)
42
         self.tab_title_align = gtk.Alignment()
43
         self.tab_title_align.set(0.0, 0.0, 1.0, 1.0)
44
@@ -68,24 +76,39 @@
45
         self.tab_title_align.add(self.tab_title_box)
46
         self.tab_content_align = gtk.Alignment()
47
         self.tab_content_align.set(0.0, 0.0, 1.0, 1.0)
48
-        self.tab_content_align.set_padding(0, 1, 0, 0)
49
-        self.tab_content_scrolled_window = ScrolledWindow()
50
-        self.tab_content_align.add(self.tab_content_scrolled_window)
51
+        self.tab_content_align.set_padding(0, 0, 0, 0)
52
         self.tab_content_box = gtk.VBox()
53
-        self.tab_content_scrolled_window.add_child(self.tab_content_box)
54
+        self.tab_content_align.add(self.tab_content_box)
55
         
56
         self.tab_items = []
57
         self.tab_title_widths = []
58
         self.tab_index = -1
59
         
60
+        self.default_widget = None
61
+        
62
         self.pack_start(self.tab_title_align, False, False)
63
         self.pack_start(self.tab_content_align, True, True)
64
         
65
         self.tab_title_box.connect("button-press-event", self.press_tab_title_box)
66
         self.tab_title_box.connect("expose-event", self.expose_tab_title_box)
67
+        self.tab_title_box.connect("motion-notify-event", self.motion_notify_tab_title_box)
68
         self.tab_content_align.connect("expose-event", self.expose_tab_content_align)
69
         self.tab_content_box.connect("expose-event", self.expose_tab_content_box)
70
         
71
+    def show_default_page(self):
72
+        if self.default_widget != None and len(self.tab_items) == 0:
73
+            container_remove_all(self.tab_content_box)
74
+            self.tab_content_box.add(self.default_widget)
75
+            self.tab_title_box.queue_draw()
76
+            self.tab_content_box.queue_draw()
77
+            
78
+            self.show_all()
79
+        
80
+    def set_default_widget(self, widget):
81
+        self.default_widget = widget
82
+        
83
+        self.show_default_page()
84
+        
85
     def add_items(self, items, default_index=0):
86
         '''
87
         Add items.
88
@@ -99,6 +122,20 @@
89
             self.tab_title_widths.append(get_content_size(item[0], DEFAULT_FONT_SIZE)[0] + self.tab_padding_x * 2)
90
             
91
         self.switch_content(default_index)
92
+        
93
+    def delete_items(self, items):
94
+        item_indexs = map(lambda item: self.tab_items.index(item), items)
95
+        
96
+        for item in items:
97
+            self.tab_items.remove(item)
98
+            
99
+        for title_width in map(lambda item_index: self.tab_title_widths[item_index], item_indexs):
100
+            self.tab_title_widths.remove(title_width)
101
+            
102
+        if len(self.tab_items) == 0:
103
+            self.show_default_page()
104
+            
105
+        print self.tab_items    
106
     
107
     def switch_content(self, index):
108
         '''
109
@@ -121,14 +158,37 @@
110
         '''
111
         Internal callback for `button-press-event` signal.
112
         '''
113
+        press_index = self.get_close_button_at_event(event)
114
+        
115
+        if press_index != None:
116
+            self.delete_items([self.tab_items[press_index]])
117
+        else:
118
+            for (index, item) in enumerate(self.tab_items):
119
+                if is_in_rect((event.x, event.y), 
120
+                              (sum(self.tab_title_widths[0:index]),
121
+                               0,
122
+                               self.tab_title_widths[index],
123
+                               self.tab_height)):
124
+                    self.switch_content(index)
125
+                    break
126
+            
127
+    def get_close_button_at_event(self, event):
128
+        hover_index = None
129
         for (index, item) in enumerate(self.tab_items):
130
-            if is_in_rect((event.x, event.y), 
131
-                          (sum(self.tab_title_widths[0:index]),
132
-                           0,
133
-                           self.tab_title_widths[index],
134
-                           self.tab_height)):
135
-                self.switch_content(index)
136
+            button_x = sum(self.tab_title_widths[0:index + 1]) - self.close_button_padding_x - self.close_button_size
137
+            button_y = self.close_button_padding_y
138
+            if is_in_rect((event.x, event.y), (button_x, button_y, self.close_button_size, self.close_button_size)):
139
+                hover_index = index
140
                 break
141
+            
142
+        return hover_index    
143
+            
144
+    def motion_notify_tab_title_box(self, widget, event):
145
+        hover_index = self.get_close_button_at_event(event)
146
+
147
+        if hover_index != self.hover_close_button_index:
148
+            self.hover_close_button_index = hover_index
149
+            widget.queue_draw()
150
 
151
     def expose_tab_title_box(self, widget, event):
152
         '''
153
@@ -137,101 +197,144 @@
154
         cr = widget.window.cairo_create()
155
         rect = widget.allocation
156
         
157
-        # Draw title unselect tab.
158
-        tab_title_width = sum(self.tab_title_widths)
159
-        
160
+        # Draw background.
161
+        (offset_x, offset_y) = widget.translate_coordinates(self.get_toplevel(), 0, 0)
162
         with cairo_state(cr):
163
-            with cairo_disable_antialias(cr):
164
-                cr.rectangle(rect.x,
165
-                             rect.y,
166
-                             sum(self.tab_title_widths[0:self.tab_index]),
167
-                             self.tab_height)
168
-                cr.rectangle(rect.x + sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]) + 1,
169
-                             rect.y,
170
-                             sum(self.tab_title_widths) - sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]),
171
-                             self.tab_height)
172
-                cr.clip()
173
-                
174
-                cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_bg_color.get_color(), 0.7)))
175
-                cr.rectangle(rect.x + 1, rect.y + 1, tab_title_width, self.tab_height)
176
-                cr.fill()
177
-                    
178
-                cr.set_line_width(1)
179
-                cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
180
-                cr.rectangle(rect.x + 1, rect.y + 1, tab_title_width, self.tab_height)
181
-                cr.stroke()
182
-                
183
-                for (index, width) in enumerate(self.tab_title_widths[:-1]):
184
-                    cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
185
-                    cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:index]) + width,
186
-                                 rect.y + 1,
187
-                                 1,
188
-                                 self.tab_height)
189
-                    cr.fill()
190
-                    
191
-                cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))    
192
-                cr.rectangle(rect.x,
193
-                             rect.y + rect.height - 1,
194
-                             sum(self.tab_title_widths[0:self.tab_index]),
195
-                             1)
196
-                cr.fill()
197
+            cr.translate(-offset_x, -offset_y)
198
             
199
-                cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))    
200
-                cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:self.tab_index]),
201
-                             rect.y + rect.height - 1,
202
-                             rect.width - sum(self.tab_title_widths[0:self.tab_index]),
203
-                             1)
204
-                cr.fill()
205
-                        
206
-        for (index, item) in enumerate(self.tab_items):
207
-            # Draw title background.
208
-            title = item[0]
209
+            (shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
210
+            skin_config.render_background(cr, widget, shadow_x, shadow_y)
211
+        
212
+        if len(self.tab_items) > 0:    
213
+            # Draw title unselect tab.
214
+            tab_title_width = sum(self.tab_title_widths)
215
             
216
-            # Draw title tab.
217
-            with cairo_disable_antialias(cr):
218
-                if index == self.tab_index:
219
-                    # Draw title select tab.
220
-                    cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))    
221
-                    if index == 0:
222
-                        cr.rectangle(rect.x + sum(self.tab_title_widths[0:index]),
223
-                                     rect.y + 1,
224
-                                     self.tab_title_widths[index] + 1,
225
-                                     self.tab_height)
226
-                    else:
227
-                        cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:index]),
228
-                                     rect.y + 1,
229
-                                     self.tab_title_widths[index],
230
-                                     self.tab_height)
231
+            with cairo_state(cr):
232
+                with cairo_disable_antialias(cr):
233
+                    cr.rectangle(0,
234
+                                 0,
235
+                                 sum(self.tab_title_widths[0:self.tab_index]),
236
+                                 self.tab_height)
237
+                    cr.rectangle(sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]) + 1,
238
+                                 0,
239
+                                 sum(self.tab_title_widths) - sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]),
240
+                                 self.tab_height)
241
+                    cr.clip()
242
+                    
243
+                    cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_bg_color.get_color(), 0.7)))
244
+                    cr.rectangle(1, 1, tab_title_width, self.tab_height)
245
                     cr.fill()
246
+                        
247
+                    cr.set_line_width(1)
248
+                    cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
249
+                    cr.rectangle(1, 1, tab_title_width, self.tab_height)
250
+                    cr.stroke()
251
                     
252
-                    if index == 0:
253
-                        cr.rectangle(rect.x,
254
-                                     rect.y,
255
-                                     rect.width,
256
+                    for (index, width) in enumerate(self.tab_title_widths[:-1]):
257
+                        cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
258
+                        cr.rectangle(1 + sum(self.tab_title_widths[0:index]) + width,
259
+                                     1,
260
+                                     1,
261
                                      self.tab_height)
262
-                        cr.clip()
263
+                        cr.fill()
264
                         
265
-                    cr.set_line_width(1)
266
                     cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))    
267
-                    if index == 0:
268
-                        cr.rectangle(rect.x + sum(self.tab_title_widths[0:index]),
269
-                                     rect.y + 1,
270
-                                     self.tab_title_widths[index] + 2,
271
-                                     self.tab_height)
272
+                    cr.rectangle(0,
273
+                                 rect.height - 1,
274
+                                 sum(self.tab_title_widths[0:self.tab_index]),
275
+                                 1)
276
+                    cr.fill()
277
+                
278
+                    cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))    
279
+                    cr.rectangle(1 + sum(self.tab_title_widths[0:self.tab_index]),
280
+                                 rect.height - 1,
281
+                                 rect.width - sum(self.tab_title_widths[0:self.tab_index]),
282
+                                 1)
283
+                    cr.fill()
284
+                            
285
+            for (index, item) in enumerate(self.tab_items):
286
+                # Draw title background.
287
+                title = item[0]
288
+                
289
+                # Draw title tab.
290
+                with cairo_disable_antialias(cr):
291
+                    if index == self.tab_index:
292
+                        # Draw title select tab.
293
+                        cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))    
294
+                        if index == 0:
295
+                            cr.rectangle(sum(self.tab_title_widths[0:index]),
296
+                                         1,
297
+                                         self.tab_title_widths[index] + 1,
298
+                                         self.tab_height)
299
+                        else:
300
+                            cr.rectangle(1 + sum(self.tab_title_widths[0:index]),
301
+                                         1,
302
+                                         self.tab_title_widths[index],
303
+                                         self.tab_height)
304
+                        cr.fill()
305
+                        
306
+                        if index == 0:
307
+                            cr.rectangle(0,
308
+                                         0,
309
+                                         rect.width,
310
+                                         self.tab_height)
311
+                            cr.clip()
312
+                            
313
+                        cr.set_line_width(1)
314
+                        cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))    
315
+                        if index == 0:
316
+                            cr.rectangle(sum(self.tab_title_widths[0:index]),
317
+                                         1,
318
+                                         self.tab_title_widths[index] + 2,
319
+                                         self.tab_height)
320
+                        else:
321
+                            cr.rectangle(1 + sum(self.tab_title_widths[0:index]),
322
+                                         1,
323
+                                         self.tab_title_widths[index] + 1,
324
+                                         self.tab_height)
325
+                        cr.stroke()
326
+                        
327
+                draw_text(cr, title, 
328
+                          sum(self.tab_title_widths[0:index]) + self.tab_padding_x,
329
+                          self.tab_padding_y,
330
+                          self.tab_title_widths[index] - self.tab_padding_x * 2,
331
+                          self.tab_height - self.tab_padding_y * 2,
332
+                          )
333
+                
334
+                # Draw close button.
335
+                if self.can_close_tab:
336
+                    button_x = sum(self.tab_title_widths[0:index + 1]) - self.close_button_padding_x - self.close_button_size
337
+                    button_y = self.close_button_padding_y
338
+                    
339
+                    if self.hover_close_button_index == index:
340
+                        cr.set_source_rgb(*color_hex_to_cairo(self.close_button_select_background_color))
341
+                        draw_round_rectangle(
342
+                            cr,
343
+                            button_x - self.close_button_frame_size,
344
+                            button_y - self.close_button_frame_size,
345
+                            self.close_button_size + self.close_button_frame_size * 2,
346
+                            self.close_button_size + self.close_button_frame_size * 2,
347
+                            2
348
+                            )
349
+                        cr.fill()
350
+                    
351
+                    cr.set_line_width(1.5)
352
+                    if self.hover_close_button_index == index:
353
+                        cr.set_source_rgb(*color_hex_to_cairo(self.close_button_select_foreground_color))
354
                     else:
355
-                        cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:index]),
356
-                                     rect.y + 1,
357
-                                     self.tab_title_widths[index] + 1,
358
-                                     self.tab_height)
359
+                        cr.set_source_rgb(*color_hex_to_cairo(self.close_button_color))
360
+                    cr.move_to(button_x, button_y)
361
+                    cr.line_to(button_x + self.close_button_size, button_y + self.close_button_size)
362
                     cr.stroke()
363
-                    
364
-            draw_text(cr, title, 
365
-                        rect.x + sum(self.tab_title_widths[0:index]) + self.tab_padding_x,
366
-                        rect.y + self.tab_padding_y,
367
-                        self.tab_title_widths[index] - self.tab_padding_x * 2,
368
-                        self.tab_height - self.tab_padding_y * 2,
369
-                        )
370
-    
371
+
372
+                    cr.move_to(button_x + self.close_button_size, button_y)
373
+                    cr.line_to(button_x, button_y + self.close_button_size)
374
+                    cr.stroke()
375
+        else:
376
+            cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))
377
+            cr.rectangle(0, 0, rect.width, rect.height)
378
+            cr.fill()
379
+            
380
     def expose_tab_content_align(self, widget, event):
381
         '''
382
         Internal function to `expose-event` signal.
383
@@ -240,29 +343,36 @@
384
         rect = widget.allocation
385
 
386
         with cairo_disable_antialias(cr):
387
+            cr.rectangle(rect.x, rect.y, sum(self.tab_title_widths[0:self.tab_index]), rect.height)
388
+            cr.rectangle(rect.x + sum(self.tab_title_widths[0:self.tab_index + 1]), 
389
+                         rect.y, 
390
+                         rect.width - sum(self.tab_title_widths[0:self.tab_index + 1]), 
391
+                         rect.height)
392
+            cr.clip()
393
+            
394
             cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))
395
-            cr.rectangle(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2)
396
+            cr.rectangle(rect.x, rect.y, rect.width, rect.height)
397
             cr.stroke()
398
 
399
     def expose_tab_content_box(self, widget, event):
400
         '''
401
         Internal function to `expose-event` signal.
402
         '''
403
+        # Init.
404
         cr = widget.window.cairo_create()
405
         rect = widget.allocation
406
         
407
         # Draw background.
408
         toplevel = widget.get_toplevel()
409
-        coordinate = widget.translate_coordinates(toplevel, rect.x, rect.y)
410
+        coordinate = widget.translate_coordinates(toplevel, 0, 0)
411
         (offset_x, offset_y) = coordinate
412
-        
413
+
414
         with cairo_state(cr):
415
-            cr.translate(-offset_x, -offset_y)
416
-            cr.rectangle(offset_x, offset_y, rect.width, rect.height)
417
+            cr.rectangle(rect.x, rect.y, rect.width, rect.height)
418
             cr.clip()
419
             
420
             (shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
421
-            skin_config.render_background(cr, self, rect.x + shadow_x, rect.y + shadow_y)
422
+            skin_config.render_background(cr, self, shadow_x, shadow_y)
423
         
424
         # Draw mask.
425
         cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))
426
deepin-ui-1.0git20120817.tar.gz/dtk/ui/thread_pool.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/thread_pool.py Changed
20
 
1
@@ -27,6 +27,8 @@
2
 import os
3
 import threading as td
4
 import time
5
+import sys
6
+import traceback
7
 
8
 class MissionThreadPool(td.Thread):
9
     """
10
@@ -159,7 +161,8 @@
11
         try:  
12
             yield  
13
         except Exception, e:  
14
-            print 'sync error %s' % e  
15
+            print 'function sync got error: %s' % e  
16
+            traceback.print_exc(file=sys.stdout)
17
         else:  
18
             self.thread_sync_lock.release()
19
         
20
deepin-ui-1.0git20120817.tar.gz/dtk/ui/threads.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/threads.py Changed
10
 
1
@@ -54,7 +54,7 @@
2
         @param callback: Callback run in thread. 
3
         '''
4
         td.Thread.__init__(self)
5
-        self.setDaemon(True) # make thread exit when main program exit
6
+        self.setDaemon(True)    # make thread exit when main program exit
7
 
8
         self.callback = callback
9
         
10
deepin-ui-1.0git20120817.tar.gz/dtk/ui/tooltip.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/tooltip.py Changed
24
 
1
@@ -4,8 +4,8 @@
2
 # Copyright (C) 2011 ~ 2012 Deepin, Inc.
3
 #               2011 ~ 2012 Xia Bin
4
 #
5
-# Author:     Xia Bin <xiabin@gmail.com>
6
-# Maintainer: Xia Bin <xiabin@gmail.com>
7
+# Author:     Xia Bin <xiabin@linuxdeepin.com>
8
+# Maintainer: Xia Bin <xiabin@linuxdeepin.com>
9
 #
10
 # This program is free software: you can redistribute it and/or modify
11
 # it under the terms of the GNU General Public License as published by
12
@@ -81,8 +81,9 @@
13
 def find_at_coords(gdkwindow, window_x, window_y):
14
     cl = ChildLocation()
15
 
16
-    widget = gdkwindow.get_user_data()
17
-    if widget == None:
18
+    try:
19
+        widget = gdkwindow.get_user_data()
20
+    except:
21
         return (None, cl.x, cl.y)
22
 
23
     cl.x = window_x
24
deepin-ui-1.0git20120817.tar.gz/dtk/ui/tooltip_test.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/tooltip_test.py Changed
12
 
1
@@ -4,8 +4,8 @@
2
 # Copyright (C) 2011 ~ 2012 Deepin, Inc.
3
 #               2011 ~ 2012 Xia Bin
4
 # 
5
-# Author:     Xia Bin <xiabin@gmail.com>
6
-# Maintainer: Xia Bin <xiabin@gmail.com>
7
+# Author:     Xia Bin <xiabin@linuxdeepin.com>
8
+# Maintainer: Xia Bin <xiabin@linuxdeepin.com>
9
 # 
10
 # This program is free software: you can redistribute it and/or modify
11
 # it under the terms of the GNU General Public License as published by
12
deepin-ui-1.0git20120817.tar.gz/dtk/ui/utils.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/utils.py Changed
213
 
1
@@ -31,6 +31,8 @@
2
 import socket
3
 import subprocess
4
 import time
5
+import traceback
6
+import sys
7
 from constant import (WIDGET_POS_TOP_LEFT, WIDGET_POS_TOP_RIGHT, 
8
                       WIDGET_POS_TOP_CENTER, WIDGET_POS_BOTTOM_LEFT, 
9
                       WIDGET_POS_BOTTOM_CENTER, WIDGET_POS_BOTTOM_RIGHT, 
10
@@ -39,109 +41,6 @@
11
                       BLACK_COLOR_MAPPED, WHITE_COLOR_MAPPED, SIMILAR_COLOR_SEQUENCE,
12
                       DEFAULT_FONT_SIZE)
13
 
14
-def tree_view_get_toplevel_node_count(treeview):
15
-    '''
16
-    Get node count number of TreeView.
17
-    
18
-    @param treeview: Gtk.TreeView instance.
19
-    @return: Return number of node.
20
-    
21
-    Return 0 if treeview haven't model.
22
-    '''
23
-    model = treeview.get_model()
24
-    if model != None:
25
-        return model.iter_n_children(None)
26
-    else:
27
-        return 0
28
-    
29
-def tree_view_get_selected_path(treeview):
30
-    '''
31
-    Get selected path of TreeView.
32
-    
33
-    @param treeview: Gtk.TreeView instance.
34
-    @return: Return selected path of treeview.
35
-    
36
-    Return None if haven't any path selected.
37
-    '''
38
-    selection = treeview.get_selection()
39
-    (_, tree_paths) = selection.get_selected_rows()
40
-    if len(tree_paths) != 0:
41
-        return (tree_paths[0])[0]
42
-    else:
43
-        return None
44
- 
45
-def tree_view_focus_first_toplevel_node(treeview):
46
-    '''
47
-    Focus first toplevel node of TreeView.
48
-    
49
-    @param treeview: Gtk.TreeView instance.
50
-    '''
51
-    treeview.set_cursor((0))
52
-    
53
-def tree_view_focus_last_toplevel_node(treeview):
54
-    '''
55
-    Focus last toplevel node of TreeView.
56
-
57
-    @param treeview: Gtk.TreeView instance.
58
-    '''
59
-    node_count = tree_view_get_toplevel_node_count(treeview)
60
-    if node_count > 0:
61
-        path = (node_count - 1)
62
-    else:
63
-        path = (0)
64
-    treeview.set_cursor(path)
65
-    
66
-def tree_view_scroll_vertical(treeview, scroll_up=True):
67
-    '''
68
-    Scroll TreeView vertically.
69
-    
70
-    @param treeview: Gtk.TreeView instance.
71
-    @param scroll_up: Defalut value is True, set as False if you want scroll down.
72
-    '''
73
-    # Init.
74
-    scroll_num = 9
75
-    candidate_count = tree_view_get_toplevel_node_count(treeview)
76
-    cursor = treeview.get_cursor()
77
-    (path, column) = cursor
78
-    max_candidate = candidate_count - 1
79
-    
80
-    # Get candidate at cursor.
81
-    if path == None:
82
-        current_candidate = max_candidate
83
-    else:
84
-        (current_candidate,) = path
85
-        
86
-    # Set cursor to new candidate.
87
-    if scroll_up:
88
-        new_candidate = max(0, current_candidate - scroll_num)
89
-    else:
90
-        new_candidate = min(current_candidate + scroll_num, max_candidate)
91
-        
92
-    treeview.set_cursor((new_candidate))
93
-    
94
-def tree_view_focus_next_toplevel_node(treeview):
95
-    '''
96
-    Focus next toplevel node of TreeView.
97
-
98
-    @param treeview: Gtk.TreeView instance.
99
-    '''
100
-    selected_path = tree_view_get_selected_path(treeview)
101
-    if selected_path != None:
102
-        node_count = tree_view_get_toplevel_node_count(treeview)
103
-        if selected_path < node_count - 1:
104
-            treeview.set_cursor((selected_path + 1))
105
-
106
-def tree_view_focus_prev_toplevel_node(treeview):
107
-    '''
108
-    Focus previous toplevel node of TreeView.
109
-    
110
-    @param treeview: Gtk.TreeView instance.
111
-    '''
112
-    selected_path = tree_view_get_selected_path(treeview)
113
-    if selected_path != None:
114
-        if selected_path > 0:
115
-            treeview.set_cursor((selected_path - 1))
116
-
117
 def get_entry_text(entry):
118
     '''
119
     Get text of entry.
120
@@ -488,7 +387,7 @@
121
             layout.set_single_paragraph_mode(True)
122
         else:
123
             layout.set_width(wrap_width * pango.SCALE)
124
-            layout.set_single_paragraph_mode(False)
125
+            layout.set_single_paragraph_mode(False) 
126
             layout.set_wrap(pango.WRAP_WORD)
127
         
128
         return layout.get_pixel_size()
129
@@ -609,7 +508,8 @@
130
             
131
             return content
132
         except Exception, e:
133
-            print e
134
+            print "function eval_file got error: %s" % e
135
+            traceback.print_exc(file=sys.stdout)
136
             
137
             return None
138
 
139
@@ -634,7 +534,8 @@
140
         if proc != None:
141
             proc.kill()
142
     except Exception, e:
143
-        print "kill_process got error: %s" % (e)
144
+        print "function kill_process got error: %s" % (e)
145
+        traceback.print_exc(file=sys.stdout)
146
     
147
 def get_command_output_first_line(commands):
148
     '''
149
@@ -775,7 +676,7 @@
150
     '''
151
     bytes = int(bytes)
152
     if bytes is 0:
153
-        return '0B'
154
+        return '0 B'
155
     else:
156
         log = math.floor(math.log(bytes, 1024))
157
         quotient = 1024 ** log
158
@@ -785,10 +686,10 @@
159
             prec = 0
160
         else:
161
             prec = precision
162
-        return "%.*f%s" % (prec,
163
-                           size,
164
-                           ['B', 'KB', 'MB', 'GB', 'TB','PB', 'EB', 'ZB', 'YB']
165
-                           [int(log)])
166
+        return "%.*f %s" % (prec,
167
+                            size,
168
+                            ['B', 'KB', 'MB', 'GB', 'TB','PB', 'EB', 'ZB', 'YB']
169
+                            [int(log)])
170
 
171
 def add_color_stop_rgba(pat, pos, color_info):
172
     '''
173
@@ -951,8 +852,7 @@
174
     @param unzip_list: List to unzip.
175
     @return: Return new unzip list.
176
     '''
177
-    first_list, second_list = zip(*unzip_list)
178
-    return (list(first_list), list(second_list))
179
+    return tuple(map(list, zip(*unzip_list))) 
180
 
181
 def is_seriate_list(test_list):
182
     '''
183
@@ -1017,7 +917,8 @@
184
     try:  
185
         yield  
186
     except Exception, e:  
187
-        print 'with an cairo error %s' % e  
188
+        print 'function cairo_state got error: %s' % e  
189
+        traceback.print_exc(file=sys.stdout)
190
     else:  
191
         cr.restore()
192
 
193
@@ -1035,7 +936,8 @@
194
     try:  
195
         yield  
196
     except Exception, e:  
197
-        print 'with an cairo error %s' % e  
198
+        print 'function cairo_disable_antialias got error: %s' % e  
199
+        traceback.print_exc(file=sys.stdout)
200
     else:  
201
         # Restore antialias.
202
         cr.set_antialias(antialias)
203
@@ -1055,7 +957,8 @@
204
     try:  
205
         yield  
206
     except Exception, e:  
207
-        print 'exec_time error %s' % e  
208
+        print 'function exec_time got error %s' % e  
209
+        traceback.print_exc(file=sys.stdout)
210
     else:  
211
         print "time: %f" % (time.time() - start_time)
212
 
213
deepin-ui-1.0git20120817.tar.gz/dtk/ui/window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/window.py Changed
394
 
1
@@ -20,19 +20,18 @@
2
 # You should have received a copy of the GNU General Public License
3
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
4
 
5
-from constant import EDGE_DICT
6
 from draw import draw_window_shadow, draw_window_frame
7
 from skin_config import skin_config
8
 from theme import ui_theme
9
+from window_base import WindowBase
10
 import cairo
11
 import gobject
12
 import gtk
13
 from utils import (cairo_state, propagate_expose, set_cursor, 
14
-                   resize_window, get_event_root_coords, 
15
-                   enable_shadow, alpha_color_hex_to_cairo, 
16
-                   is_double_click, move_window)
17
+                   get_event_root_coords, 
18
+                   enable_shadow, alpha_color_hex_to_cairo)
19
 
20
-class Window(gtk.Window):
21
+class Window(WindowBase):
22
     """
23
     The Window class is a subclass of gtk.Window. It adds some features that deepin-ui have to gtk.Window.
24
 
25
@@ -59,19 +58,24 @@
26
         @param shadow_visible: If True, the shadow is visible. By default, it's True, just disable when your program not allow manipulate colormap, such as mplayer. 
27
         """
28
         # Init.
29
-        gtk.Window.__init__(self, window_type)
30
+        WindowBase.__init__(self, window_type)
31
+        self.shadow_radius = shadow_radius
32
+        self.enable_resize = enable_resize
33
+        self.shadow_visible = shadow_visible
34
+        self.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
35
+        self.background_color = (0, 0, 0, 0)
36
+        
37
+        self.init()
38
+        
39
+    def init(self):
40
         skin_config.wrap_skin_window(self)
41
         self.set_decorated(False)
42
-        self.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
43
         self.add_events(gtk.gdk.ALL_EVENTS_MASK)
44
         self.window_shadow = gtk.Alignment()
45
         self.window_frame = gtk.VBox()
46
-        self.shadow_radius = shadow_radius
47
         self.frame_radius = 2
48
         self.shadow_is_visible = True
49
         self.cursor_type = None
50
-        self.enable_resize = enable_resize
51
-        self.shadow_visible = shadow_visible
52
         
53
         # Shadow setup.
54
         if enable_shadow(self) and self.shadow_visible:
55
@@ -99,12 +103,6 @@
56
         self.connect("window-state-event", self.monitor_window_state)
57
         self.window_frame.connect("expose-event", self.expose_window_frame)
58
         
59
-    def show_window(self):
60
-        """
61
-        Show the window.
62
-        """
63
-        self.show_all()
64
-        
65
     def expose_window_background(self, widget, event):
66
         """
67
         Internal function to expose the window background.
68
@@ -118,7 +116,7 @@
69
         rect = widget.allocation
70
         
71
         # Clear color to transparent window.
72
-        cr.set_source_rgba(0.0, 0.0, 0.0, 0.0)
73
+        cr.set_source_rgba(*self.background_color)
74
         cr.set_operator(cairo.OPERATOR_SOURCE)
75
         cr.paint()
76
         
77
@@ -133,13 +131,14 @@
78
             
79
         # Draw background.
80
         with cairo_state(cr):
81
-            cr.rectangle(x + 2, y, w - 4, 1)
82
-            cr.rectangle(x + 1, y + 1, w - 2, 1)
83
-            cr.rectangle(x, y + 2, w, h - 4)
84
-            cr.rectangle(x + 2, y + h - 1, w - 4, 1)
85
-            cr.rectangle(x + 1, y + h - 2, w - 2, 1)
86
-            
87
-            cr.clip()
88
+            if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
89
+                cr.rectangle(x + 2, y, w - 4, 1)
90
+                cr.rectangle(x + 1, y + 1, w - 2, 1)
91
+                cr.rectangle(x, y + 2, w, h - 4)
92
+                cr.rectangle(x + 2, y + h - 1, w - 4, 1)
93
+                cr.rectangle(x + 1, y + h - 2, w - 2, 1)
94
+                
95
+                cr.clip()
96
             
97
             skin_config.render_background(cr, self, x, y)
98
         
99
@@ -187,18 +186,6 @@
100
         
101
         return True
102
         
103
-    def draw_mask(self, cr, x, y, w, h):
104
-        '''
105
-        Draw mask interface, you should implement this function own.
106
-        
107
-        @param cr: Cairo context.
108
-        @param x: X coordinate of draw area.
109
-        @param y: Y coordinate of draw area.
110
-        @param w: Width of draw area.
111
-        @param h: Height of draw area.
112
-        '''
113
-        pass
114
-    
115
     def expose_window_shadow(self, widget, event):
116
         """
117
         Interh function to expose the window shadow.
118
@@ -222,18 +209,19 @@
119
         @param widget: the window of gtk.Widget.
120
         @param event: The expose event of type gtk.gdk.Event.
121
         """
122
-        # Init.
123
-        cr = widget.window.cairo_create()
124
-        rect = widget.allocation
125
-        x, y, w, h = rect.x, rect.y, rect.width, rect.height
126
-        
127
-        draw_window_frame(cr, x, y, w, h,
128
-                          ui_theme.get_alpha_color("window_frame_outside_1"),
129
-                          ui_theme.get_alpha_color("window_frame_outside_2"),
130
-                          ui_theme.get_alpha_color("window_frame_outside_3"),
131
-                          ui_theme.get_alpha_color("window_frame_inside_1"),
132
-                          ui_theme.get_alpha_color("window_frame_inside_2"),
133
-                          )
134
+        if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
135
+            # Init.
136
+            cr = widget.window.cairo_create()
137
+            rect = widget.allocation
138
+            x, y, w, h = rect.x, rect.y, rect.width, rect.height
139
+            
140
+            draw_window_frame(cr, x, y, w, h,
141
+                              ui_theme.get_alpha_color("window_frame_outside_1"),
142
+                              ui_theme.get_alpha_color("window_frame_outside_2"),
143
+                              ui_theme.get_alpha_color("window_frame_outside_3"),
144
+                              ui_theme.get_alpha_color("window_frame_inside_1"),
145
+                              ui_theme.get_alpha_color("window_frame_inside_2"),
146
+                              )
147
 
148
     def shape_window_frame(self, widget, rect):
149
         """
150
@@ -243,28 +231,29 @@
151
         @param rect: The bounding region of the window.
152
         """
153
         if widget.window != None and widget.get_has_window() and rect.width > 0 and rect.height > 0:
154
-            # Init.
155
-            x, y, w, h = rect.x, rect.y, rect.width, rect.height
156
-            bitmap = gtk.gdk.Pixmap(None, w, h, 1)
157
-            cr = bitmap.cairo_create()
158
-            
159
-            # Clear the bitmap
160
-            cr.set_source_rgb(0.0, 0.0, 0.0)
161
-            cr.set_operator(cairo.OPERATOR_CLEAR)
162
-            cr.paint()
163
-            
164
-            # Draw our shape into the bitmap using cairo.
165
-            cr.set_source_rgb(1.0, 1.0, 1.0)
166
-            cr.set_operator(cairo.OPERATOR_OVER)
167
-            
168
-            cr.rectangle(x + 1, y, w - 2, 1)
169
-            cr.rectangle(x, y + 1, w, h - 2)
170
-            cr.rectangle(x + 1, y + h - 1, w - 2, 1)
171
-            
172
-            cr.fill()
173
-            
174
-            # Shape with given mask.
175
-            widget.shape_combine_mask(bitmap, 0, 0)
176
+            if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
177
+                # Init.
178
+                x, y, w, h = rect.x, rect.y, rect.width, rect.height
179
+                bitmap = gtk.gdk.Pixmap(None, w, h, 1)
180
+                cr = bitmap.cairo_create()
181
+                
182
+                # Clear the bitmap
183
+                cr.set_source_rgb(0.0, 0.0, 0.0)
184
+                cr.set_operator(cairo.OPERATOR_CLEAR)
185
+                cr.paint()
186
+                
187
+                # Draw our shape into the bitmap using cairo.
188
+                cr.set_source_rgb(1.0, 1.0, 1.0)
189
+                cr.set_operator(cairo.OPERATOR_OVER)
190
+                
191
+                cr.rectangle(x + 1, y, w - 2, 1)
192
+                cr.rectangle(x, y + 1, w, h - 2)
193
+                cr.rectangle(x + 1, y + h - 1, w - 2, 1)
194
+                
195
+                cr.fill()
196
+                
197
+                # Shape with given mask.
198
+                widget.shape_combine_mask(bitmap, 0, 0)
199
             
200
     def hide_shadow(self):
201
         """
202
@@ -280,46 +269,6 @@
203
         self.shadow_is_visible = True
204
         self.window_shadow.set_padding(self.shadow_padding, self.shadow_padding, self.shadow_padding, self.shadow_padding)
205
         
206
-    def min_window(self):
207
-        """
208
-        Minimize the window. Make it iconified.
209
-        """
210
-        self.iconify()
211
-        
212
-    def toggle_max_window(self):
213
-        """
214
-        Toggle the window size between maximized size and normal size.
215
-        """
216
-        window_state = self.window.get_state()
217
-        if window_state == gtk.gdk.WINDOW_STATE_MAXIMIZED:
218
-            self.unmaximize()
219
-        else:
220
-            self.maximize()
221
-            
222
-    def toggle_fullscreen_window(self):
223
-        """
224
-        Toggle the window between fullscreen mode and normal size.
225
-        """
226
-        window_state = self.window.get_state()
227
-        if window_state == gtk.gdk.WINDOW_STATE_FULLSCREEN:
228
-            self.unfullscreen()
229
-        else:
230
-            self.fullscreen()
231
-            
232
-    def close_window(self):
233
-        """
234
-        Close the window. Send the destroy signal to the program.
235
-        
236
-        @return: Always return False.
237
-        """
238
-        # Hide window immediately when user click close button,
239
-        # user will feeling this software very quick, ;p
240
-        self.hide_all()
241
-
242
-        self.emit("destroy")
243
-    
244
-        return False
245
-        
246
     def motion_notify(self, widget, event):
247
         """
248
         Internal callback for `motion-notify` signal. 
249
@@ -336,84 +285,6 @@
250
                 
251
             self.cursor_type = cursor_type
252
             
253
-    def resize_window(self, widget, event):
254
-        """
255
-        Resize the window.
256
-
257
-        @param widget: The window of type gtk.Widget.
258
-        @param event: A signal of type gtk.gdk.Event.
259
-        """
260
-        if self.enable_resize:
261
-            edge = self.get_edge()            
262
-            if edge != None:
263
-                resize_window(widget, event, self, edge)
264
-                
265
-    def is_disable_window_maximized(self):
266
-        """
267
-        An interface which indicates whether the window could be maximized, you should implement this function you own.
268
-        
269
-        @return: Always return False.
270
-        """
271
-        return False                
272
-                
273
-    def monitor_window_state(self, widget, event):
274
-        """
275
-        Internal function to monitor window state, 
276
-
277
-        add shadow when window at maximized or fullscreen status. Otherwise hide shadow.
278
-
279
-        @param widget: The window of type gtk.Widget.
280
-        @param event: The event of gtk.gdk.Event.
281
-        """
282
-        window_state = self.window.get_state()
283
-        if window_state in [gtk.gdk.WINDOW_STATE_MAXIMIZED, gtk.gdk.WINDOW_STATE_FULLSCREEN]:
284
-            self.hide_shadow()
285
-            
286
-            if self.is_disable_window_maximized():
287
-                self.unmaximize()
288
-        else:
289
-            self.show_shadow()
290
-        
291
-    def add_move_event(self, widget):
292
-        """
293
-        Add move event callback.
294
-
295
-        @param widget: A widget of type gtk.Widget.
296
-        """
297
-        widget.connect("button-press-event", lambda w, e: move_window(w, e, self))            
298
-        
299
-    def add_toggle_event(self, widget):
300
-        """
301
-        Add toggle event callback.
302
-
303
-        @param widget: A widget of type gtk.Widget.
304
-        """
305
-        widget.connect("button-press-event", self.double_click_window)        
306
-        
307
-    def double_click_window(self, widget, event):
308
-        """
309
-        Double click event handler of the window. It will maximize the window.
310
-
311
-        @param widget: A widget of type gtk.Widget.
312
-        @param event: A event of type gtk.gdk.Event.
313
-        @return: Always return False.
314
-        """
315
-        if is_double_click(event):
316
-            self.toggle_max_window()
317
-            
318
-        return False    
319
-            
320
-    def get_edge(self):
321
-        """
322
-        Get the edge which the cursor is on, according to the cursor type.
323
-
324
-        @return: If there is a corresponding cursor type, an instance of gtk.gdk.WindowEdge is returned, else None is returned.
325
-        """
326
-        if EDGE_DICT.has_key(self.cursor_type):
327
-            return EDGE_DICT[self.cursor_type]
328
-        else:
329
-            return None
330
-
331
     def get_cursor_type(self, event):
332
         """
333
         Get the cursor position.
334
@@ -431,33 +302,7 @@
335
         wh = rect.height
336
         
337
         # Return cursor position. 
338
-        if wx <= ex <= wx + self.shadow_padding:
339
-            if wy <= ey <= wy + self.shadow_padding * 2:
340
-                return gtk.gdk.TOP_LEFT_CORNER
341
-            elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
342
-                return gtk.gdk.BOTTOM_LEFT_CORNER
343
-            elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
344
-                return gtk.gdk.LEFT_SIDE
345
-            else:
346
-                return None
347
-        elif wx + ww - self.shadow_padding <= ex <= wx + ww:
348
-            if wy <= ey <= wy + self.shadow_padding * 2:
349
-                return gtk.gdk.TOP_RIGHT_CORNER
350
-            elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
351
-                return gtk.gdk.BOTTOM_RIGHT_CORNER
352
-            elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
353
-                return gtk.gdk.RIGHT_SIDE
354
-            else:
355
-                return None
356
-        elif wx + self.shadow_padding < ex < wx + ww - self.shadow_padding:
357
-            if wy <= ey <= wy + self.shadow_padding:
358
-                return gtk.gdk.TOP_SIDE
359
-            elif wy + wh - self.shadow_padding <= ey <= wy + wh:
360
-                return gtk.gdk.BOTTOM_SIDE
361
-            else: 
362
-                return None
363
-        else:
364
-            return None
365
+        return self.get_cursor_type_with_coordinate(ex, ey, wx, wy, ww, wh)
366
         
367
     def get_shadow_size(self):
368
         """
369
@@ -475,6 +320,24 @@
370
             return (0, 0)
371
         
372
 gobject.type_register(Window)
373
+
374
+class EmbedWindow(gtk.Plug):
375
+    def __init__(self,
376
+                 enable_resize=False, 
377
+                 shadow_radius=6, 
378
+                 shadow_visible=True):
379
+        gtk.Plug.__init__(self, 0)
380
+        self.shadow_radius = shadow_radius
381
+        self.enable_resize = enable_resize
382
+        self.shadow_visible = shadow_visible
383
+        self.background_color = (1, 1, 1, 0.93)
384
+        
385
+        self.init()
386
+
387
+# Mix-in Window methods (except __init__) to EmbedWindow
388
+EmbedWindow.__bases__ += (Window,)        
389
+        
390
+gobject.type_register(EmbedWindow)
391
     
392
 if __name__ == "__main__":
393
     import pseudo_skin
394
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/window_base.py Added
205
 
1
@@ -0,0 +1,203 @@
2
+#! /usr/bin/env python
3
+# -*- coding: utf-8 -*-
4
+
5
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
6
+#               2011 ~ 2012 Wang Yong
7
+# 
8
+# Author:     Wang Yong <lazycat.manatee@gmail.com>
9
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
10
+# 
11
+# This program is free software: you can redistribute it and/or modify
12
+# it under the terms of the GNU General Public License as published by
13
+# the Free Software Foundation, either version 3 of the License, or
14
+# any later version.
15
+# 
16
+# This program is distributed in the hope that it will be useful,
17
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+# GNU General Public License for more details.
20
+# 
21
+# You should have received a copy of the GNU General Public License
22
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+
24
+from constant import EDGE_DICT
25
+import gtk
26
+from utils import (resize_window, is_double_click, move_window)
27
+
28
+class WindowBase(gtk.Window):
29
+    '''
30
+    Window base.
31
+    '''
32
+   
33
+    def __init__(self,
34
+                 window_type=gtk.WINDOW_TOPLEVEL, 
35
+                 ):
36
+        '''
37
+        init docs
38
+        '''
39
+        gtk.Window.__init__(self, window_type)
40
+        
41
+    def show_window(self):
42
+        """
43
+        Show the window.
44
+        """
45
+        self.show_all()
46
+
47
+    def toggle_max_window(self):
48
+        """
49
+        Toggle the window size between maximized size and normal size.
50
+        """
51
+        window_state = self.window.get_state()
52
+        if window_state == gtk.gdk.WINDOW_STATE_MAXIMIZED:
53
+            self.unmaximize()
54
+        else:
55
+            self.maximize()
56
+
57
+    def toggle_fullscreen_window(self):
58
+        """
59
+        Toggle the window between fullscreen mode and normal size.
60
+        """
61
+        window_state = self.window.get_state()
62
+        if window_state == gtk.gdk.WINDOW_STATE_FULLSCREEN:
63
+            self.unfullscreen()
64
+        else:
65
+            self.fullscreen()
66
+            
67
+    def close_window(self):
68
+        """
69
+        Close the window. Send the destroy signal to the program.
70
+
71
+        @return: Always return False.
72
+        """
73
+        # Hide window immediately when user click close button,
74
+        # user will feeling this software very quick, ;p
75
+        self.hide_all()
76
+
77
+        self.emit("destroy")
78
+    
79
+        return False
80
+        
81
+    def min_window(self):
82
+        """
83
+        Minimize the window. Make it iconified.
84
+        """
85
+        self.iconify()
86
+        
87
+    def resize_window(self, widget, event):
88
+        """
89
+        Resize the window.
90
+
91
+        @param widget: The window of type gtk.Widget.
92
+        @param event: A signal of type gtk.gdk.Event.
93
+        """
94
+        if self.enable_resize:
95
+            edge = self.get_edge()            
96
+            if edge != None:
97
+                resize_window(self, event, self, edge)
98
+                
99
+    def is_disable_window_maximized(self):
100
+        """
101
+        An interface which indicates whether the window could be maximized, you should implement this function you own.
102
+        @return: Always return False.
103
+        """
104
+        return False                
105
+                
106
+    def monitor_window_state(self, widget, event):
107
+        """
108
+        Internal function to monitor window state, 
109
+
110
+        add shadow when window at maximized or fullscreen status. Otherwise hide shadow.
111
+
112
+        @param widget: The window of type gtk.Widget.
113
+        @param event: The event of gtk.gdk.Event.
114
+        """
115
+        window_state = self.window.get_state()
116
+        if window_state in [gtk.gdk.WINDOW_STATE_MAXIMIZED, gtk.gdk.WINDOW_STATE_FULLSCREEN]:
117
+            self.hide_shadow()
118
+            
119
+            if self.is_disable_window_maximized():
120
+                self.unmaximize()
121
+        else:
122
+            self.show_shadow()
123
+        
124
+    def add_move_event(self, widget):
125
+        """
126
+        Add move event callback.
127
+
128
+        @param widget: A widget of type gtk.Widget.
129
+        """
130
+        widget.connect("button-press-event", lambda w, e: move_window(w, e, self))            
131
+        
132
+    def add_toggle_event(self, widget):
133
+        """
134
+        Add toggle event callback.
135
+
136
+        @param widget: A widget of type gtk.Widget.
137
+        """
138
+        widget.connect("button-press-event", self.double_click_window)        
139
+        
140
+    def double_click_window(self, widget, event):
141
+        """
142
+        Double click event handler of the window. It will maximize the window.
143
+
144
+        @param widget: A widget of type gtk.Widget.
145
+        @param event: A event of type gtk.gdk.Event.
146
+        @return: Always return False.
147
+        """
148
+        if is_double_click(event):
149
+            self.toggle_max_window()
150
+            
151
+        return False    
152
+            
153
+    def get_edge(self):
154
+        """
155
+        Get the edge which the cursor is on, according to the cursor type.
156
+
157
+        @return: If there is a corresponding cursor type, an instance of gtk.gdk.WindowEdge is returned, else None is returned.
158
+        """
159
+        if EDGE_DICT.has_key(self.cursor_type):
160
+            return EDGE_DICT[self.cursor_type]
161
+        else:
162
+            return None
163
+
164
+    def draw_mask(self, cr, x, y, w, h):
165
+        '''
166
+        Draw mask interface, you should implement this function own.
167
+        
168
+        @param cr: Cairo context.
169
+        @param x: X coordinate of draw area.
170
+        @param y: Y coordinate of draw area.
171
+        @param w: Width of draw area.
172
+        @param h: Height of draw area.
173
+        '''
174
+        pass
175
+    
176
+    def get_cursor_type_with_coordinate(self, ex, ey, wx, wy, ww, wh):
177
+        if wx <= ex <= wx + self.shadow_padding:
178
+            if wy <= ey <= wy + self.shadow_padding * 2:
179
+                return gtk.gdk.TOP_LEFT_CORNER
180
+            elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
181
+                return gtk.gdk.BOTTOM_LEFT_CORNER
182
+            elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
183
+                return gtk.gdk.LEFT_SIDE
184
+            else:
185
+                return None
186
+        elif wx + ww - self.shadow_padding <= ex <= wx + ww:
187
+            if wy <= ey <= wy + self.shadow_padding * 2:
188
+                return gtk.gdk.TOP_RIGHT_CORNER
189
+            elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
190
+                return gtk.gdk.BOTTOM_RIGHT_CORNER
191
+            elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
192
+                return gtk.gdk.RIGHT_SIDE
193
+            else:
194
+                return None
195
+        elif wx + self.shadow_padding < ex < wx + ww - self.shadow_padding:
196
+            if wy <= ey <= wy + self.shadow_padding:
197
+                return gtk.gdk.TOP_SIDE
198
+            elif wy + wh - self.shadow_padding <= ey <= wy + wh:
199
+                return gtk.gdk.BOTTOM_SIDE
200
+            else: 
201
+                return None
202
+        else:
203
+            return None
204
+    
205
deepin-ui-1.0.3git20120929.tar.gz/embed_demo.py Added
49
 
1
@@ -0,0 +1,47 @@
2
+#! /usr/bin/env python
3
+# -*- coding: utf-8 -*-
4
+
5
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
6
+#               2011 ~ 2012 Wang Yong
7
+# 
8
+# Author:     Wang Yong <lazycat.manatee@gmail.com>
9
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
10
+# 
11
+# This program is free software: you can redistribute it and/or modify
12
+# it under the terms of the GNU General Public License as published by
13
+# the Free Software Foundation, either version 3 of the License, or
14
+# any later version.
15
+# 
16
+# This program is distributed in the hope that it will be useful,
17
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+# GNU General Public License for more details.
20
+# 
21
+# You should have received a copy of the GNU General Public License
22
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+
24
+from dtk.ui.init_skin import init_skin
25
+from dtk.ui.utils import get_parent_dir
26
+import os
27
+
28
+app_theme = init_skin(
29
+    "deepin-ui-demo", 
30
+    "1.0",
31
+    "01",
32
+    os.path.join(get_parent_dir(__file__), "skin"),
33
+    os.path.join(get_parent_dir(__file__), "app_theme"),
34
+    )
35
+
36
+# from dtk.ui.window import EmbedWindow
37
+from dtk.ui.window import EmbedWindow
38
+import gtk
39
+
40
+if __name__ == "__main__":
41
+    gtk.gdk.threads_init()
42
+    
43
+    window = EmbedWindow()
44
+    window.set_default_size(200, 100)
45
+    
46
+    window.show_all()
47
+    
48
+    gtk.main()
49
deepin-ui-1.0.3git20120929.tar.gz/tab_demo.py Added
72
 
1
@@ -0,0 +1,70 @@
2
+#! /usr/bin/env python
3
+# -*- coding: utf-8 -*-
4
+
5
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
6
+#               2011 ~ 2012 Wang Yong
7
+# 
8
+# Author:     Wang Yong <lazycat.manatee@gmail.com>
9
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
10
+# 
11
+# This program is free software: you can redistribute it and/or modify
12
+# it under the terms of the GNU General Public License as published by
13
+# the Free Software Foundation, either version 3 of the License, or
14
+# any later version.
15
+# 
16
+# This program is distributed in the hope that it will be useful,
17
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+# GNU General Public License for more details.
20
+# 
21
+# You should have received a copy of the GNU General Public License
22
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+
24
+from dtk.ui.init_skin import init_skin
25
+from dtk.ui.utils import get_parent_dir
26
+import os
27
+
28
+app_theme = init_skin(
29
+    "deepin-ui-demo", 
30
+    "1.0",
31
+    "01",
32
+    os.path.join(get_parent_dir(__file__), "skin"),
33
+    os.path.join(get_parent_dir(__file__), "app_theme"),
34
+    )
35
+
36
+from dtk.ui.application import Application
37
+from dtk.ui.dragable_tab import TabBox
38
+from dtk.ui.constant import DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT
39
+import gtk
40
+
41
+if __name__ == "__main__":
42
+    # Init application.
43
+    application = Application()
44
+
45
+    # Set application default size.
46
+    application.set_default_size(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT)
47
+
48
+    # Set application icon.
49
+    application.set_icon(app_theme.get_pixbuf("icon.ico"))
50
+    
51
+    # Set application preview pixbuf.
52
+    application.set_skin_preview(app_theme.get_pixbuf("frame.png"))
53
+    
54
+    # Add titlebar.
55
+    application.add_titlebar(
56
+        ["theme", "max", "min", "close"], 
57
+        app_theme.get_pixbuf("logo.png"), 
58
+        "Tab demo",
59
+        "Tab demo",
60
+        )
61
+    
62
+    tabbox = TabBox()
63
+    align = gtk.Alignment()
64
+    align.set(0.5, 0.5, 1, 1)
65
+    align.set_padding(2, 2, 2, 2)
66
+    align.add(tabbox)
67
+    
68
+    
69
+    application.main_box.pack_start(align)
70
+
71
+    application.run()
72
deepin-ui-1.0.3git20120929.tar.gz/treeview_demo.py Added
78
 
1
@@ -0,0 +1,76 @@
2
+#! /usr/bin/env python
3
+# -*- coding: utf-8 -*-
4
+
5
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
6
+#               2011 ~ 2012 Wang Yong
7
+# 
8
+# Author:     Wang Yong <lazycat.manatee@gmail.com>
9
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
10
+# 
11
+# This program is free software: you can redistribute it and/or modify
12
+# it under the terms of the GNU General Public License as published by
13
+# the Free Software Foundation, either version 3 of the License, or
14
+# any later version.
15
+# 
16
+# This program is distributed in the hope that it will be useful,
17
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
+# GNU General Public License for more details.
20
+# 
21
+# You should have received a copy of the GNU General Public License
22
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
+
24
+from dtk.ui.init_skin import init_skin
25
+from dtk.ui.utils import get_parent_dir
26
+import os
27
+
28
+app_theme = init_skin(
29
+    "deepin-ui-demo", 
30
+    "1.0",
31
+    "01",
32
+    os.path.join(get_parent_dir(__file__), "skin"),
33
+    os.path.join(get_parent_dir(__file__), "app_theme"),
34
+    )
35
+
36
+from dtk.ui.application import Application
37
+from dtk.ui.new_treeview import TreeView
38
+from dtk.ui.constant import DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT
39
+from dtk.ui.file_treeview import (get_dir_items, sort_by_name, sort_by_size,
40
+                                  sort_by_type, sort_by_mtime)
41
+import gtk
42
+
43
+if __name__ == "__main__":
44
+    # Init application.
45
+    application = Application()
46
+
47
+    # Set application default size.
48
+    application.set_default_size(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT)
49
+
50
+    # Set application icon.
51
+    application.set_icon(app_theme.get_pixbuf("icon.ico"))
52
+    
53
+    # Set application preview pixbuf.
54
+    application.set_skin_preview(app_theme.get_pixbuf("frame.png"))
55
+    
56
+    # Add titlebar.
57
+    application.add_titlebar(
58
+        ["theme", "max", "min", "close"], 
59
+        app_theme.get_pixbuf("logo.png"), 
60
+        "TreeView demo",
61
+        "TreeView demo",
62
+        )
63
+    
64
+    # Add TreeView.
65
+    treeview = TreeView(get_dir_items(os.path.expanduser("~")))
66
+    # treeview = TreeView(get_dir_items("/"))
67
+    treeview_align = gtk.Alignment()
68
+    treeview_align.set(0.5, 0.5, 1, 1)
69
+    treeview_align.set_padding(0, 2, 2, 2)
70
+    
71
+    treeview.set_column_titles(["文件名", "大小", "类型", "修改时间"],
72
+                               [sort_by_name, sort_by_size, sort_by_type, sort_by_mtime])
73
+    
74
+    treeview_align.add(treeview)
75
+    application.main_box.pack_start(treeview_align)
76
+
77
+    application.run()
78
deepin-ui-1.0git20120817.tar.gz/debian Deleted
2
 
1
-(directory)
2
deepin-ui-1.0git20120817.tar.gz/debian/changelog Deleted
131
 
1
@@ -1,129 +0,0 @@
2
-deepin-ui (1+git201208171059) precise; urgency=low
3
-
4
-  * New upstream udpates. 
5
-
6
- -- Li Longyu (Ai Kotoba) <leaeasy@gmail.com>  Fri, 17 Aug 2012 10:59:17 +0800
7
-
8
-deepin-ui (1+git201207161102deepin2) precise; urgency=low
9
-
10
-  * Non-maintainer upload.
11
-  * remove release note for deepin-software-center to install it.
12
-
13
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com>  Thu, 26 Jul 2012 10:36:06 +0800
14
-
15
-deepin-ui (1+git201207161102deepin1) precise; urgency=low
16
-
17
-  * add python-xlib depends. 
18
-
19
- -- Li Longyu (Ai Kotoba) <leaeasy@gmail.com>  Mon, 23 Jul 2012 09:01:54 +0800
20
-
21
-deepin-ui (1+git201207161102) precise; urgency=low
22
-
23
-  * Non-maintainer upload.
24
-  * move translation to system dir.
25
-
26
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com>  Mon, 16 Jul 2012 11:01:57 +0800
27
-
28
-deepin-ui (1+git201207131728) precise; urgency=low
29
-
30
-  * upstream updates. 
31
-
32
- -- Li Longyu <leaeasy@gmail.com>  Fri, 13 Jul 2012 17:29:40 +0800
33
-
34
-deepin-ui (1+git201207131504-1) precise; urgency=low
35
-
36
-  * fix translation display error bug
37
-
38
- -- Li Longyu <leaeasy@gmail.com>  Fri, 13 Jul 2012 07:06:02 +0800
39
-
40
-deepin-ui (1+git201207130915-1) precise; urgency=low
41
-
42
-  * fix bugs that translation did not work.
43
-
44
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com>  Fri, 13 Jul 2012 09:15:27 +0800
45
-
46
-deepin-ui (1+git20120712-1) precise; urgency=low
47
-
48
-  * Upstream update.
49
-
50
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com>  Thu, 12 Jul 2012 20:18:33 +0800
51
-
52
-deepin-ui (1+git20120711-1) precise; urgency=low
53
-
54
-  * Upstream update.
55
-
56
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com>  Wed, 11 Jul 2012 11:55:50 +0800
57
-
58
-deepin-ui (1+git20120621-1) precise; urgency=low
59
-
60
-  * Upstream update.
61
-
62
- -- Li Longyu <leaeasy@gmail.com>  Thu, 21 Jun 2012 15:42:39 +0800
63
-
64
-deepin-ui (1+git20120606-2) precise; urgency=low
65
-
66
-  * Upstream update. 
67
-
68
- -- Li Longyu <leaeasy@gmail.com>  Thu, 21 Jun 2012 15:40:47 +0800
69
-
70
-deepin-ui (1+git20120606-1) precise; urgency=low
71
-
72
-  * add deepin-ui-demo package
73
-  * add debconf file 
74
-
75
- -- Li Longyu <leaeasy@gmail.com>  Wed, 06 Jun 2012 15:39:14 +0800
76
-
77
-deepin-ui (1+git20120605-4) precise; urgency=low
78
-
79
-  * add deepin-ui-demo
80
-  * add debian/NEWS file
81
-
82
- -- Li Longyu <leaeasy@gmail.com>  Wed, 06 Jun 2012 15:39:12 +0800
83
-
84
-deepin-ui (1+git20120605-3) precise; urgency=low
85
-
86
-  * add python-imaging depends  
87
-
88
- -- Li Longyu <leaeasy@gmail.com>  Tue, 05 Jun 2012 14:38:41 +0800
89
-
90
-deepin-ui (1+git20120605-2) precise; urgency=low
91
-
92
-  *  Update treeview.py color. 
93
-
94
- -- Li Longyu <leaeasy@gmail.com>  Tue, 05 Jun 2012 12:51:25 +0800
95
-
96
-deepin-ui (1+git20120605-1) precise; urgency=low
97
-
98
-  * Upstreamer updates.
99
-
100
- -- Li Longyu <leaeasy@gmail.com>  Tue, 05 Jun 2012 10:08:15 +0800
101
-
102
-deepin-ui (1+git20120508-1) precise; urgency=low
103
-
104
-  * Upstreamer updates. 
105
-
106
- -- Li Longyu <leaeasy@gmail.com>  Tue, 08 May 2012 14:50:57 +0800
107
-
108
-deepin-ui (1+git20120503-1) precise; urgency=low
109
-
110
-  * update menuitem. 
111
-
112
- -- Li Longyu <leaeasy@gmail.com>  Thu, 03 May 2012 12:22:09 +0800
113
-
114
-deepin-ui (1+git20120502-1) precise; urgency=low
115
-
116
-  * Upstreamer updates.
117
-
118
- -- Li Longyu <leaeasy@gmail.com>  Wed, 02 May 2012 14:35:25 +0800
119
-
120
-deepin-ui (1+git8c2442628-1) unstable; urgency=low
121
-
122
-  * Upstreamer updates.
123
-
124
- -- Li Longyu <leaeasy@gmail.com>  Fri, 20 Apr 2012 16:50:25 +0800
125
-
126
-deepin-ui (1+git7430d0fb-1) unstable; urgency=low
127
-
128
-  * Initial release
129
-
130
- -- Li Longyu <leaeasy@gmail.com>  Fri, 06 Apr 2012 12:34:55 +0800
131
deepin-ui-1.0git20120817.tar.gz/debian/compat Deleted
3
 
1
@@ -1,1 +0,0 @@
2
-8
3
deepin-ui-1.0git20120817.tar.gz/debian/control Deleted
26
 
1
@@ -1,24 +0,0 @@
2
-Source: deepin-ui
3
-Priority: extra
4
-Maintainer: Li Longyu <leaeasy@gmail.com>
5
-Build-Depends: debhelper (>= 8.0.0), python ( >=2.7), python-dev( >=2.7), python-cairo-dev, libcairo2-dev, libgtk2.0-dev, python-setuptools, python-gtk2-dev, libwebkitgtk-dev
6
-Standards-Version: 3.9.2
7
-Section: libs
8
-Homepage: http://www.linuxdeepin.com/
9
-Vcs-Git: git://github.com/manateelazycat/deepin-ui.git
10
-Vcs-Browser: https://github.com/manateelazycat/deepin-ui.git
11
-
12
-Package: deepin-ui
13
-Section: libdevel
14
-Architecture: any
15
-Depends: ${shlibs:Depends}, ${misc:Depends}, python ( >=2.7), libgtk2.0-0, libcairo2, python-gtk2, python-imaging,
16
- python-xlib
17
-Suggests: deepin-ui-demo
18
-Description: LinuxDeepin UI libs
19
- UI toolkit for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin
20
-
21
-Package: deepin-ui-demo
22
-Architecture: all
23
-Depends: deepin-ui, ${misc:Depends}
24
-Description: LinuxDeepin UI libs demos
25
- Include Deepin UI demo.
26
deepin-ui-1.0git20120817.tar.gz/debian/copyright Deleted
38
 
1
@@ -1,36 +0,0 @@
2
-Format: http://dep.debian.net/deps/dep5
3
-Upstream-Name: deepin-ui
4
-Source: <url://example.com>
5
-
6
-Files: *
7
-Copyright: <years> <put author's name and email here>
8
-           <years> <likewise for another author>
9
-License: <special license>
10
- <Put the license of the package here indented by 1 space>
11
- <This follows the format of Description: lines in control file>
12
- .
13
- <Including paragraphs>
14
-
15
-# If you want to use GPL v2 or later for the /debian/* files use 
16
-# the following clauses, or change it to suit. Delete these two lines
17
-Files: debian/*
18
-Copyright: 2012 Li Longyu <leaeasy@gmail.com>
19
-License: GPL-2+
20
- This package is free software; you can redistribute it and/or modify
21
- it under the terms of the GNU General Public License as published by
22
- the Free Software Foundation; either version 2 of the License, or
23
- (at your option) any later version.
24
- .
25
- This package is distributed in the hope that it will be useful,
26
- but WITHOUT ANY WARRANTY; without even the implied warranty of
27
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28
- GNU General Public License for more details.
29
- .
30
- You should have received a copy of the GNU General Public License
31
- along with this program. If not, see <http://www.gnu.org/licenses/>
32
- .
33
- On Debian systems, the complete text of the GNU General
34
- Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
35
-
36
-# Please also look if there are files or directories which have a
37
-# different copyright/license attached and list them here.
38
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui-demo.desktop Deleted
11
 
1
@@ -1,9 +0,0 @@
2
-[Desktop Entry]
3
-Name=Deepin UI Demo
4
-Comment=UI toolkit for Linux Deepin.
5
-Icon=distributor-logo-deepin
6
-Exec=deepin-ui-demo
7
-Terminal=false
8
-Type=Application
9
-Categories=GNOME;GTK;Settings;DesktopSettings;
10
-
11
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui-demo.install Deleted
7
 
1
@@ -1,5 +0,0 @@
2
-debian/deepin-ui-demo.desktop /usr/share/applications
3
-app_theme /usr/share/deepin-ui-demo
4
-skin /usr/share/deepin-ui-demo
5
-demo.py /usr/share/deepin-ui-demo
6
-cover /usr/share/deepin-ui-demo
7
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui-demo.links Deleted
3
 
1
@@ -1,1 +0,0 @@
2
-/usr/share/deepin-ui-demo/demo.py /usr/bin/deepin-ui-demo
3
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui.install Deleted
5
 
1
@@ -1,3 +0,0 @@
2
-/usr/share/pyshared/dtk/
3
-/usr/lib
4
-/usr/share
5
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui.links Deleted
3
 
1
@@ -1,1 +0,0 @@
2
-/usr/share/pyshared/dtk/theme /usr/lib/python2.7/dist-packages/dtk/theme
3
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui.postinst Deleted
17
 
1
@@ -1,15 +0,0 @@
2
-#!/bin/sh
3
-set -e
4
-
5
-# . /usr/share/debconf/confmodule
6
-# db_version 2.0
7
-# db_capb backup
8
-# db_get deepin-ui/release-note
9
-
10
-if which pycompile >/dev/null 2>&1;then
11
-   pycompile -p deepin-ui
12
-fi
13
-
14
-
15
-# db_input high deepin-ui/release-note || true
16
-# db_go
17
deepin-ui-1.0git20120817.tar.gz/debian/docs Deleted
3
 
1
@@ -1,1 +0,0 @@
2
-README
3
deepin-ui-1.0git20120817.tar.gz/debian/po Deleted
2
 
1
-(directory)
2
deepin-ui-1.0git20120817.tar.gz/debian/po/POTFILES.in Deleted
3
 
1
@@ -1,1 +0,0 @@
2
-[type: gettext/rfc822deb] templates
3
deepin-ui-1.0git20120817.tar.gz/debian/po/templates.pot Deleted
51
 
1
@@ -1,49 +0,0 @@
2
-# SOME DESCRIPTIVE TITLE.
3
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
4
-# This file is distributed under the same license as the PACKAGE package.
5
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
6
-#
7
-#, fuzzy
8
-msgid ""
9
-msgstr ""
10
-"Project-Id-Version: PACKAGE VERSION\n"
11
-"Report-Msgid-Bugs-To: deepin-ui@packages.debian.org\n"
12
-"POT-Creation-Date: 2012-06-06 13:57+0800\n"
13
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
15
-"Language-Team: LANGUAGE <LL@li.org>\n"
16
-"Language: \n"
17
-"MIME-Version: 1.0\n"
18
-"Content-Type: text/plain; charset=CHARSET\n"
19
-"Content-Transfer-Encoding: 8bit\n"
20
-
21
-#. Type:note
22
-#. Description
23
-#: ../templates:1001
24
-msgid "Deepin-UI(DTK) Release-Note"
25
-msgstr ""
26
-
27
-#. Type:note
28
-#. Description
29
-#: ../templates:1001
30
-msgid "IMPORTANT READ CAREFULLY:"
31
-msgstr ""
32
-
33
-#. Type:note
34
-#. Description
35
-#: ../templates:1001
36
-msgid ""
37
-"Please install the patched python-gtk2 to avoid memery leak.\n"
38
-"  You can download it from\n"
39
-"  http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/"
40
-msgstr ""
41
-
42
-#. Type:note
43
-#. Description
44
-#: ../templates:1001
45
-msgid ""
46
-"We have send our patch to upstream:\n"
47
-"  gnome-bugs #674092\n"
48
-"  debbugs #668709\n"
49
-"  lp:981376"
50
-msgstr ""
51
deepin-ui-1.0git20120817.tar.gz/debian/po/zh_CN.po Deleted
59
 
1
@@ -1,57 +0,0 @@
2
-# Chinese translations for deepin-ui package
3
-# deepin-ui 软件包的简体中文翻译.
4
-# Copyright (C) 2012 THE deepin-ui'S COPYRIGHT HOLDER
5
-# This file is distributed under the same license as the deepin-ui package.
6
-# wzssyqa <wzssyqa@gmail.com>, 2012.
7
-#
8
-msgid ""
9
-msgstr ""
10
-"Project-Id-Version: deepin-ui 1+git20120605\n"
11
-"Report-Msgid-Bugs-To: deepin-ui@packages.debian.org\n"
12
-"POT-Creation-Date: 2012-06-06 13:57+0800\n"
13
-"PO-Revision-Date: 2012-06-06 13:57+0800\n"
14
-"Last-Translator: wzssyqa <wzssyqa@gmail.com>\n"
15
-"Language-Team: Chinese (simplified) <translation-team-zh-cn@lists."
16
-"sourceforge.net>\n"
17
-"Language: zh_CN\n"
18
-"MIME-Version: 1.0\n"
19
-"Content-Type: text/plain; charset=UTF-8\n"
20
-"Content-Transfer-Encoding: 8bit\n"
21
-
22
-#. Type:note
23
-#. Description
24
-#: ../templates:1001
25
-msgid "Deepin-UI(DTK) Release-Note"
26
-msgstr "深度图形库发布指南"
27
-
28
-#. Type:note
29
-#. Description
30
-#: ../templates:1001
31
-msgid "IMPORTANT READ CAREFULLY:"
32
-msgstr "重要:请仔细阅读"
33
-
34
-#. Type:note
35
-#. Description
36
-#: ../templates:1001
37
-msgid ""
38
-"Please install the patched python-gtk2 to avoid memery leak.\n"
39
-"  You can download it from\n"
40
-"  http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/"
41
-msgstr "" 
42
-"下载安装打过补丁的python-gtk2软件包,否则会导致内存泄露.\n"
43
-"  留意下载地址\n"
44
-"  http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/"
45
-
46
-#. Type:note
47
-#. Description
48
-#: ../templates:1001
49
-msgid ""
50
-"We have send our patch to upstream:\n"
51
-"  gnome-bugs #674092\n"
52
-"  debbugs #668709\n"
53
-"  lp:981376"
54
-msgstr ""
55
-"开发团队已经把补丁反馈到上游:\n"
56
-"  gnome-bugs #674092\n"
57
-"  debbugs #668709\n"
58
-"  lp:981376"
59
deepin-ui-1.0git20120817.tar.gz/debian/rules Deleted
21
 
1
@@ -1,19 +0,0 @@
2
-#!/usr/bin/make -f
3
-# -*- makefile -*-
4
-# Sample debian/rules that uses debhelper.
5
-# This file was originally written by Joey Hess and Craig Small.
6
-# As a special exception, when this file is copied by dh-make into a
7
-# dh-make output file, you may use that output file without restriction.
8
-# This special exception was added by Craig Small in version 0.37 of dh-make.
9
-
10
-# Uncomment this to turn on verbose mode.
11
-#export DH_VERBOSE=1
12
-
13
-%:
14
-   dh $@ --with python2
15
-
16
-override_dh_auto_install:
17
-   dh_auto_install
18
-   mkdir -p ./debian/tmp/usr/share/pyshared
19
-   mv ./debian/tmp/usr/dtk/locale ./debian/tmp/usr/share
20
-   mv ./debian/tmp/usr/dtk ./debian/tmp/usr/share/pyshared
21
deepin-ui-1.0git20120817.tar.gz/debian/source Deleted
2
 
1
-(directory)
2
deepin-ui-1.0git20120817.tar.gz/debian/source/format Deleted
3
 
1
@@ -1,1 +0,0 @@
2
-3.0 (native)
3
deepin-ui-1.0git20120817.tar.gz/debian/templates Deleted
15
 
1
@@ -1,13 +0,0 @@
2
-Template:deepin-ui/release-note
3
-Type:note
4
-_Description: Deepin-UI(DTK) Release-Note
5
- IMPORTANT READ CAREFULLY:
6
- .
7
- Please install the patched python-gtk2 to avoid memery leak.
8
-   You can download it from
9
-   http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/
10
- .
11
- We have send our patch to upstream:
12
-   gnome-bugs #674092
13
-   debbugs #668709
14
-   lp:981376
15
deepin-ui-demo.desktop Added
12
 
1
@@ -0,0 +1,10 @@
2
+[Desktop Entry]
3
+Name=Deepin UI Demo
4
+GenericName=Deepin UI Demo
5
+Comment=UI toolkit for Linux Deepin.
6
+Icon=distributor-logo
7
+Exec=deepin-ui-demo
8
+Terminal=false
9
+Type=Application
10
+Categories=GNOME;GTK;Settings;DesktopSettings;
11
+
12
distributor-logo.png Added
Refresh

No build results available

Refresh

No rpmlint results available

Request History
Hillwood Yang's avatar

hillwood created request over 11 years ago

- add deepin-ui-demo package , it was lost before.

- Updated to 1.0.3git20120929
* Fix menu item clicked bug
* Add delete tab feature in TabBox
* Add ComboButton
Also more features and bugs fixed

- update to 1.0.2git20120911
- add new Paned widget:new ui and animation
- TreeView is more powerful
- Optimize Icon View memory usage
- and more ....

- license update: GPL-3.0+
No indication of GPL-3.0 "only" licenses in the package


Peter Linnell's avatar

mrdocs accepted request about 12 years ago

Reviewed OK