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
deepin-ui.changes
Changed
-------------------------------------------------------------------
+Tue Oct 9 21:12:38 CST 2012 - hillwood@linuxfan.org
+
+- add deepin-ui-demo package , it was lost before.
+
+-------------------------------------------------------------------
+Sun Oct 7 01:03:27 CST 2012 - douglarek@outlook.com
+
+- Updated to 1.0.3git20120929
+
+ * Fix menu item clicked bug
+ * Add delete tab feature in TabBox
+ * Add ComboButton
+
+ Also more features and bugs fixed
+
+-------------------------------------------------------------------
+Wed Sep 26 21:05:33 CST 2012 - hillwood@linuxfan.org
+
+- update to 1.0.2git20120911
+- add new Paned widget:new ui and animation
+- TreeView is more powerful
+- Optimize Icon View memory usage
+- and more ....
+
+-------------------------------------------------------------------
+Tue Sep 4 14:46:02 UTC 2012 - cfarrell@suse.com
+
+- license update: GPL-3.0+
+ No indication of GPL-3.0 "only" licenses in the package
+
+-------------------------------------------------------------------
Sun Sep 2 12:48:31 CST 2012 - hillwood@linuxfan.org
- Initial package 1.0git20120817
deepin-ui.spec
Changed
Name: deepin-ui
Summary: UI toolkit for Linux Deepin
-Version: 1.0git20120817
-Release: 7.1
-License: GPL-3.0
-Url: https://github.com/linuxdeepin/deepin-ui
-Group: System/GUI/Other
-Source: %{name}-%{version}.tar.gz
-BuildRequires: pkgconfig(glib-2.0)
-BuildRequires: python-devel python-setuptools python-gtk-devel
-BuildRequires: gcc gcc-c++
+License: GPL-3.0+
+Group: System/GUI/GNOME
+Version: 1.0.3git20120929
+Release: 0
+Url: http://www.linuxdeepin.com
+Source0: %{name}-%{version}.tar.gz
+Source1: %{name}-demo.desktop
+Source2: distributor-logo.png
BuildRequires: cairo-devel
-BuildRequires: libwebkitgtk-devel
BuildRequires: fdupes
+BuildRequires: gcc
+BuildRequires: gcc-c++
+BuildRequires: libwebkitgtk-devel
+BuildRequires: python-devel
+BuildRequires: python-gtk-devel
+BuildRequires: python-setuptools
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: update-desktop-files
+BuildRequires: hicolor-icon-theme
+Requires: python-webkitgtk
Recommends: %{name}-lang = %{version}
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%{py_requires}
%description
-UI toolkit for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin ,
-it is needed by Deepin Music Player.
+UI toolkit libs for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin.
+
+%package demo
+Summary: UI toolkit for Linux Deepin
+Group: Development/Languages/Python
+Requires: %{name} = %{version}
+Recommends: %{name}-lang = %{version}
+Group: System/GUI/Other
+BuildArch: noarch
+
+%description demo
+UI toolkit libs demos for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin.
+
+
%lang_package
%prep
chmod 644 COPYING
export CFLAGS="$RPM_OPT_FLAGS"
python setup.py install --prefix=%{_prefix} --root=$RPM_BUILD_ROOT
+
+# deepin-ui files install
mkdir -p %{buildroot}/%{_datadir}/pyshared
mv %{buildroot}/%{_prefix}/dtk %{buildroot}/%{_datadir}/pyshared
rm -rf %{buildroot}/%{_datadir}/pyshared/dtk/locale/*.po
rm -rf %{buildroot}/%{_datadir}/pyshared/dtk/locale/deepin-ui.pot
mv %{buildroot}/%{_datadir}/pyshared/dtk/locale %{buildroot}/%{_datadir}/locale
+cd %{buildroot}/%{_libdir}/python2.7/site-packages/dtk
+ln -s ../../../../share/pyshared/dtk/theme theme
+cd %{_builddir}/%{buildsubdir}
-%fdupes %{buildroot}
+# deepin-ui-demo files install
+mkdir %{buildroot}/%{_datadir}/applications
+mkdir %{buildroot}/%{_datadir}/deepin-ui-demo
+mkdir %{buildroot}/%{_bindir}/
+mkdir -p %{buildroot}/%{_datadir}/icons/hicolor/48x48/apps
+cp %{S:1} %{buildroot}/%{_datadir}/applications
+cp -R app_theme %{buildroot}/%{_datadir}/deepin-ui-demo
+cp -R skin %{buildroot}/%{_datadir}/deepin-ui-demo
+cp -R cover %{buildroot}/%{_datadir}/deepin-ui-demo
+cp -R demo.py %{buildroot}/%{_datadir}/deepin-ui-demo
+cp %{S:2} %{buildroot}/%{_datadir}/icons/hicolor/48x48/apps
+cd %{buildroot}%{_bindir}
+ln -s ../share/deepin-ui-demo/demo.py %{name}-demo
+cd %{_builddir}/%{buildsubdir}
+%fdupes %{buildroot}
%find_lang %{name}
+%suse_update_desktop_file %{name}-demo
+
+%post demo
+%icon_theme_cache_post
+
+%posttrans demo
+%icon_theme_cache_post
-cd %{buildroot}/%{_libdir}/python2.7/site-packages/dtk
-ln -s ../../../../share/pyshared/dtk/theme theme
%files
%defattr(-,root,root)
%{_libdir}/python2.7/site-packages/dtk-0.1-py2.7.egg-info
%{_libdir}/python2.7/site-packages/dtk_*.so
+%files demo
+%defattr(-,root,root)
+%{_bindir}/%{name}-demo
+%{_datadir}/%{name}-demo
+%{_datadir}/applications/%{name}-demo.desktop
+%{_datadir}/icons/hicolor/48x48/apps/distributor-logo.png
%files lang -f %{name}.lang
%changelog
-
deepin-ui-1.0.3git20120929.tar.gz/.gitignore
Added
+*.pyc
+defaultTheme
+nohup.out
+.#*
+*.~
+build
+dist
+dtk.egg-info
+*.po~
+*.swp
deepin-ui-1.0git20120817.tar.gz/README -> deepin-ui-1.0.3git20120929.tar.gz/README
Changed
first, otherwise, you will got memory leak (this is bug of python-gtk).
* Deepin UI build dependence (Debian):
- 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
+ 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
* Install Deepin UI:
sudo python setup.py install
deepin-ui-1.0.3git20120929.tar.gz/app_theme/blue/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/chartreuse/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/cyan/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_grey/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dark_purple/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/deep_pink/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/dodger_blue/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/gold/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/green_yellow/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/orange/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/purple/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/red/image/button
Added
+(directory)
deepin-ui-1.0.3git20120929.tar.gz/app_theme/yellow/image/button
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/demo.py -> deepin-ui-1.0.3git20120929.tar.gz/demo.py
Changed
# Load other modules.
from dtk.ui.application import Application
from dtk.ui.browser import WebView
-from dtk.ui.button import CheckButton, RadioButton
+from dtk.ui.button import CheckButton, RadioButton, ComboButton
from dtk.ui.button import ImageButton, LinkButton, Button
from dtk.ui.categorybar import Categorybar
from dtk.ui.color_selection import ColorButton
],
True
)
+ menu.set_menu_item_sensitive_by_index(1, False)
application.set_menu_callback(lambda button: menu.show(
get_widget_root_coordinate(button, WIDGET_POS_BOTTOM_LEFT),
(button.get_allocation().width, 0)))
entry_frame = HorizontalFrame(10, 0, 0, 0, 0)
entry_frame.add(entry_box)
tab_1_box.pack_start(entry_frame, False, False)
+
+ # Combo button.
+ combo_menu = Menu(
+ [(None, "选项1", None),
+ (None, "选项2", None),
+ (None, "选项3", None),
+ ],
+ is_root_menu=True,
+ )
+
+ def click_combo_button(widget):
+ print "click combo button"
+
+ def show_combo_menu(widget, x, y, offset_x, offset_y):
+ combo_menu.show((x, y), (offset_x, offset_y))
+
+ combo_button = ComboButton(
+ app_theme.get_pixbuf("button/button_normal.png"),
+ app_theme.get_pixbuf("button/button_hover.png"),
+ app_theme.get_pixbuf("button/button_press.png"),
+ app_theme.get_pixbuf("button/button_normal.png"),
+ app_theme.get_pixbuf("button/arrow_normal.png"),
+ app_theme.get_pixbuf("button/arrow_hover.png"),
+ app_theme.get_pixbuf("button/arrow_press.png"),
+ app_theme.get_pixbuf("button/arrow_normal.png"),
+ )
+ combo_button.connect("button-clicked", click_combo_button)
+ combo_button.connect("arrow-clicked", show_combo_menu)
+
+ tab_1_box.pack_start(combo_button, False, False)
# Add statusbar.
statusbar = Statusbar(36)
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/blue/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/blue/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#c4cedd",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#4D78B3",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#2e5b99",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#F2F8FF", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#0d61d6", 1)),
+ (1, ("#2864b8", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/chartreuse/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/chartreuse/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#c4ddcd",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#4DB373",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#2e992e",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#F2FFF7", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#0dd60d", 1)),
+ (1, ("#28b828", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/cyan/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/cyan/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#c4dddd",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#4DB2B3",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#2e9999",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#F2FFFF", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#0dd6d6", 1)),
+ (1, ("#28b8b8", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_grey/image/paned
Added
+(directory)
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
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#d0d0d0",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#4D4D4D",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#666666",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#F9F9F9", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#999999", 1)),
+ (1, ("#808080", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dark_purple/image/paned
Added
+(directory)
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
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#cec4dd",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#7333CC",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#5b2e99",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#F7F2FF", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#610dd6", 1)),
+ (1, ("#6428b8", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/deep_pink/image/paned
Added
+(directory)
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
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#ddc4d5",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#B34D95",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#992e79",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#FFF2FB", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#d60d9a", 1)),
+ (1, ("#b8288d", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/dodger_blue/image/paned
Added
+(directory)
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
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#c4d4dd",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#0086CC",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#2e7599",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#F2FBFF", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#0d93d6", 1)),
+ (1, ("#2888b8", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/gold/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/gold/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#ddd7c4",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#CC9E00",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#99822e",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#FFFCF2", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#d6ab0d", 1)),
+ (1, ("#b89928", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/green_yellow/image/paned
Added
+(directory)
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
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#d7ddc4",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#9AB34D",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#97992e",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#FCFFF2", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#d3d60d", 1)),
+ (1, ("#b5b828", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/orange/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/orange/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#ddcec4",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#CC7433",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#995b2e",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#FFF8F2", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#d6610d", 1)),
+ (1, ("#b86428", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/purple/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/purple/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#d6c4dd",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#974DB3",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#7e2e99",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#FBF2FF", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#a40dd6", 1)),
+ (1, ("#9428b8", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/red/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/red/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#ddc4c4",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#CC3333",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#992e2e",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#FFF2F2", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#d60d0d", 1)),
+ (1, ("#b82828", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/image/paned
Added
+(directory)
deepin-ui-1.0git20120817.tar.gz/dtk/theme/yellow/theme.txt -> deepin-ui-1.0.3git20120929.tar.gz/dtk/theme/yellow/theme.txt
Changed
"disable_background" : "#f7f7f7",
"disable_text" : "#a6a6a6",
"menu_font" : "#000000",
+ "menu_disable_font" : "#a6a6a6",
"menu_select_font" : "#FFFFFF",
"category_item" : "#333333",
"category_select_item" : "#FFFFFF",
"combo_entry_frame" : "#dcddc4",
"combo_entry_background" : "#FFFFFF",
"combo_entry_select_background" : "#CACC00",
+ "paned_line" : "#a9a9a9",
+ "progressbar_background_frame" : "#b3b3b3",
+ "progressbar_foreground_frame" : "#97992e",
},
"alpha_colors" : {
"color_button_disable_mask" : ("#ffffff", 0.85),
"window_frame_inside_1" : ("#FFFFFF", 0.2),
"window_frame_inside_2" : ("#FFFFFF", 0.6),
"window_shadow_corner" : ("#000000", 0.1),
+ "dragable_tab_active_frame" : ("#333333", 0.8),
+ "dragable_tab_active_background" : ("#FFFFFF", 1),
+ "dragable_tab_inactive_frame" : ("#666666", 0.8),
+ "dragable_tab_inactive_background" : ("#FFFFFF", 0.8),
+ "dragable_tab_top_active_frame" : ("#333333", 0.7),
+ "dragable_tab_top_inactive_frame" : ("#666666", 0.7),
+ "dragable_tab_bottom_active_frame" : ("#333333", 0.7),
},
"shadow_colors" : {
"mask_multiple_page" : [
(1, ("#FFFFF2", 0.0)),
],
"linear_background" : [
- (0, ("#EFEFEF", 0.6)),
- (0.05, ("#EFEFEF", 0.75)),
- (0.95, ("#EFEFEF", 0.75)),
- (1, ("#EFEFEF", 0.6)),
+ (0, ("#EFEFEF", 0.75)),
+ (1, ("#EFEFEF", 0.75)),
],
"category_item_press" : [
(0, ("#53ABDE", 0.8)),
(1, ("#777777", 0))
],
"progressbar_foreground" : [
- (0, ("#EF12AB", 0.7)),
- (0.5, ("#EF12AB", 0.9)),
- (1, ("#EF12AB", 0.7)),
+ (0, ("#d3d60d", 1)),
+ (1, ("#b5b828", 1)),
],
"progressbar_background" : [
- (0, ("#E3A4D0", 0.7)),
- (0.5, ("#E3A4D0", 0.9)),
- (1, ("#E3A4D0", 0.7)),
+ (0, ("#f5f5f5", 1)),
+ (1, ("#d8d8d8", 1)),
],
"progressbar_light" : [
(0, ("#FFFFFF", 0)),
deepin-ui-1.0git20120817.tar.gz/dtk/ui/animation.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/animation.py
Changed
# Copyright (C) 2011 ~ 2012 Deepin, Inc.
# 2011 ~ 2012 Xia Bin
#
-# Author: Xia Bin <xiabin@gmail.com>
-# Maintainer: Xia Bin <xiabin@gmail.com>
+# Author: Xia Bin <xiabin@linuxdeepin.com>
+# Maintainer: Xia Bin <xiabin@linuxdeepin.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
deepin-ui-1.0git20120817.tar.gz/dtk/ui/application.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/application.py
Changed
from titlebar import Titlebar
from utils import container_remove_all, place_center
from window import Window
+from constant import PANED_HANDLE_SIZE
import gtk
class Application(object):
"""
# Init gdk threads, the integrant method for multi-thread GUI application.
gtk.gdk.threads_init()
+
+ # Load customize rc style before any other.
+ gtk.rc_parse_string("style 'my_style' {\n GtkPaned::handle-size = %s\n }\nwidget '*' style 'my_style'" % (PANED_HANDLE_SIZE))
# Init status.
self.menu_button_callback = None
deepin-ui-1.0git20120817.tar.gz/dtk/ui/box.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/box.py
Changed
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from draw import draw_pixbuf, propagate_expose, draw_vlinear, cairo_state
+from theme import ui_theme
from skin_config import skin_config
from utils import get_window_shadow_size
import gobject
@param h: Height of draw area.
'''
draw_vlinear(cr, x, y, w, h,
- [(0, ("#FF0000", 1)),
- (1, ("#FF0000", 1))]
+ ui_theme.get_shadow_color("linear_background").get_color_info()
)
def expose_background_box(self, widget, event):
deepin-ui-1.0git20120817.tar.gz/dtk/ui/browser.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/browser.py
Changed
self.connect("set-scroll-adjustments", self.save_adjustment)
self.connect("scroll-event", self.do_scroll)
+ def enable_inspector(self):
+ import gtk
+ class Inspector (gtk.Window):
+ def __init__ (self, inspector):
+ """initialize the WebInspector class"""
+ gtk.Window.__init__(self)
+ self.set_default_size(600, 480)
+
+ self._web_inspector = inspector
+
+ self._web_inspector.connect("inspect-web-view",
+ self._inspect_web_view_cb)
+ self._web_inspector.connect("show-window",
+ self._show_window_cb)
+ self._web_inspector.connect("attach-window",
+ self._attach_window_cb)
+ self._web_inspector.connect("detach-window",
+ self._detach_window_cb)
+ self._web_inspector.connect("close-window",
+ self._close_window_cb)
+ self._web_inspector.connect("finished",
+ self._finished_cb)
+
+ self.connect("delete-event", self._close_window_cb)
+
+ def _inspect_web_view_cb (self, inspector, web_view):
+ """Called when the 'inspect' menu item is activated"""
+ from scrolled_window import ScrolledWindow
+ scrolled_window = ScrolledWindow()
+ webview = webkit.WebView()
+ scrolled_window.add(webview)
+ scrolled_window.show_all()
+
+ self.add(scrolled_window)
+ return webview
+
+ def _show_window_cb (self, inspector):
+ """Called when the inspector window should be displayed"""
+ self.present()
+ return True
+
+ def _attach_window_cb (self, inspector):
+ """Called when the inspector should displayed in the same
+ window as the WebView being inspected
+ """
+ return False
+
+ def _detach_window_cb (self, inspector):
+ """Called when the inspector should appear in a separate window"""
+ return False
+
+ def _close_window_cb (self, inspector, view):
+ """Called when the inspector window should be closed"""
+ self.hide()
+ return True
+
+ def _finished_cb (self, inspector):
+ """Called when inspection is done"""
+ self._web_inspector = 0
+ self.destroy()
+ return False
+
+ settings = self.get_settings()
+ settings.set_property("enable-default-context-menu", True)
+ settings.set_property("enable-developer-extras", True)
+ Inspector(self.get_web_inspector())
+
def save_adjustment(self, webview, hadj, vadj):
'''
the callback of "set-scroll-adjustmens"
return True
else:
return False
+
deepin-ui-1.0git20120817.tar.gz/dtk/ui/button.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/button.py
Changed
import gtk
import pango
from utils import (get_content_size, color_hex_to_cairo, propagate_expose, set_clickable_cursor,
- window_is_max, get_same_level_widgets, widget_fix_cycle_destroy_bug, run_command)
+ window_is_max, get_same_level_widgets, widget_fix_cycle_destroy_bug, run_command,
+ get_widget_root_coordinate, WIDGET_POS_BOTTOM_LEFT)
__all__ = ["Button", "ImageButton", "ThemeButton",
"MenuButton", "MinButton", "CloseButton",
set_clickable_cursor(self)
gobject.type_register(LinkButton)
+
+class ComboButton(gtk.Button):
+ '''
+ class docs
+ '''
+
+ __gsignals__ = {
+ "button-clicked" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
+ "arrow-clicked" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (int, int, int, int)),
+ }
+
+ def __init__(self,
+ button_normal_dpixbuf,
+ button_hover_dpixbuf,
+ button_press_dpixbuf,
+ button_disable_dpixbuf,
+ arrow_normal_dpixbuf,
+ arrow_hover_dpixbuf,
+ arrow_press_dpixbuf,
+ arrow_disable_dpixbuf,
+ ):
+ '''
+ init docs
+ '''
+ # Init.
+ gtk.Button.__init__(self)
+ self.button_normal_dpixbuf = button_normal_dpixbuf
+ self.button_hover_dpixbuf = button_hover_dpixbuf
+ self.button_press_dpixbuf = button_press_dpixbuf
+ self.button_disable_dpixbuf = button_disable_dpixbuf
+ self.arrow_normal_dpixbuf = arrow_normal_dpixbuf
+ self.arrow_hover_dpixbuf = arrow_hover_dpixbuf
+ self.arrow_press_dpixbuf = arrow_press_dpixbuf
+ self.arrow_disable_dpixbuf = arrow_disable_dpixbuf
+ button_pixbuf = button_normal_dpixbuf.get_pixbuf()
+ arrow_pixbuf = arrow_normal_dpixbuf.get_pixbuf()
+ self.button_width = button_pixbuf.get_width()
+ self.arrow_width = arrow_pixbuf.get_width()
+ self.height = button_pixbuf.get_height()
+ self.set_size_request(self.button_width + self.arrow_width, self.height)
+ self.in_button = True
+
+ self.connect("expose-event", self.expose_combo_button)
+ self.connect("button-press-event", self.button_press_combo_button)
+ self.connect("clicked", self.click_combo_button)
+
+ def expose_combo_button(self, widget, event):
+ # Init.
+ cr = widget.window.cairo_create()
+ rect = widget.allocation
+ x, y, w, h = rect.x, rect.y, rect.width, rect.height
+
+ # Get pixbuf info.
+ if widget.state == gtk.STATE_NORMAL:
+ button_pixbuf = self.button_normal_dpixbuf.get_pixbuf()
+ arrow_pixbuf = self.arrow_normal_dpixbuf.get_pixbuf()
+ elif widget.state == gtk.STATE_PRELIGHT:
+ button_pixbuf = self.button_hover_dpixbuf.get_pixbuf()
+ arrow_pixbuf = self.arrow_hover_dpixbuf.get_pixbuf()
+ elif widget.state == gtk.STATE_ACTIVE:
+ if self.in_button:
+ button_pixbuf = self.button_press_dpixbuf.get_pixbuf()
+ arrow_pixbuf = self.arrow_hover_dpixbuf.get_pixbuf()
+ else:
+ button_pixbuf = self.button_hover_dpixbuf.get_pixbuf()
+ arrow_pixbuf = self.arrow_press_dpixbuf.get_pixbuf()
+ elif widget.state == gtk.STATE_INSENSITIVE:
+ button_pixbuf = self.button_disable_dpixbuf.get_pixbuf()
+ arrow_pixbuf = self.arrow_disable_dpixbuf.get_pixbuf()
+
+ # Draw.
+ draw_pixbuf(cr, button_pixbuf, rect.x, rect.y)
+ draw_pixbuf(cr, arrow_pixbuf, rect.x + self.button_width, rect.y)
+
+ return True
+
+ def button_press_combo_button(self, widget, event):
+ self.in_button = event.x < self.button_width
+
+ def click_combo_button(self, widget):
+ if self.in_button:
+ self.emit("button-clicked")
+ else:
+ (button_x, button_y) = get_widget_root_coordinate(self, WIDGET_POS_BOTTOM_LEFT)
+ self.emit("arrow-clicked",
+ button_x + self.button_width,
+ button_y,
+ self.arrow_width,
+ self.height)
+
+gobject.type_register(ComboButton)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/config.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/config.py
Changed
from ConfigParser import RawConfigParser as ConfigParser
from collections import OrderedDict
import gobject
+import sys
+import traceback
class Config(gobject.GObject):
'''
try:
return self.config_parser.get(section, option)
except Exception, e:
- print "config.get error: %s" % (e)
+ print "function get got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
+
return default
def set(self, section, option, value):
deepin-ui-1.0git20120817.tar.gz/dtk/ui/constant.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/constant.py
Changed
"deep_pink", "purple", "dark_purple", "blue", "dodger_blue", "cyan"]
VERSION = "1.0.1"
+
+PANED_HANDLE_SIZE = 11
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/dragable_tab.py
Added
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
+# 2011 ~ 2012 Wang Yong
+#
+# Author: Wang Yong <lazycat.manatee@gmail.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gtk
+import cairo
+from theme import ui_theme
+import pango
+import gobject
+from skin_config import skin_config
+from utils import (get_content_size, cairo_state, cairo_disable_antialias,
+ alpha_color_hex_to_cairo, get_window_shadow_size)
+from draw import draw_text
+import math
+
+class TabBox(gtk.VBox):
+ '''
+ class docs
+ '''
+
+ def __init__(self):
+ '''
+ init docs
+ '''
+ gtk.VBox.__init__(self)
+
+ self.tabbox = Tabbar()
+ self.tab_content_box = gtk.VBox()
+
+ self.pack_start(self.tabbox, False, False)
+ self.pack_start(self.tab_content_box, True, True)
+
+ self.tab_content_box.connect("expose-event", self.test)
+
+ def test(self, widget, event):
+ '''
+ docs
+ '''
+ # Init.
+ cr = widget.window.cairo_create()
+ rect = widget.allocation
+ x, y, w, h = rect.x, rect.y, rect.width, rect.height
+
+ cr.set_source_rgba(1, 1, 1, 1)
+ cr.rectangle(x, y, w, h)
+ cr.fill()
+
+ def add_tabs(self, tabs):
+ '''
+ docs
+ '''
+ pass
+
+ def remove_tabs(self, tabs):
+ '''
+ docs
+ '''
+ pass
+
+gobject.type_register(TabBox)
+
+class Tabbar(gtk.DrawingArea):
+ '''
+ class docs
+ '''
+
+ def __init__(self):
+ '''
+ init docs
+ '''
+ gtk.DrawingArea.__init__(self)
+ self.add_events(gtk.gdk.ALL_EVENTS_MASK)
+ self.set_can_focus(True) # can focus to response key-press signal
+ self.height = 29
+ self.tab_name_padding_x = 10
+ self.tab_angle = 63
+ self.tab_radious = 4
+ self.tab_radious_offset_x = self.tab_radious * math.cos(math.radians(self.tab_angle))
+ self.tab_radious_offset_y = self.tab_radious * math.sin(math.radians(self.tab_angle))
+ self.triangle_width = int(self.height / math.tan(math.radians(self.tab_angle)))
+ self.set_size_request(-1, self.height)
+ # self.names = ["标签1", "标签2", "标签2", "标签3"]
+ self.names = map(lambda i: "标签%s" % (i), range(1, 10))
+ self.name_widths = map(self.get_tab_width, self.names)
+ self.active_index = 4
+
+ self.connect("expose-event", self.expose_dragable_tabbar)
+
+ def add_items(self, items):
+ '''
+ docs
+ '''
+ pass
+
+ def expose_dragable_tabbar(self, widget, event):
+ '''
+ docs
+ '''
+ # Init.
+ cr = widget.window.cairo_create()
+ rect = widget.allocation
+ x, w, h = rect.x, rect.width, rect.height
+ y = 0
+
+ # Draw background.
+ (offset_x, offset_y) = widget.translate_coordinates(self.get_toplevel(), 0, 0)
+ with cairo_state(cr):
+ cr.translate(-offset_x, -offset_y)
+
+ (shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
+ skin_config.render_background(cr, widget, shadow_x, shadow_y)
+
+ # Draw inactive tab.
+ draw_x_list = []
+ width_offset = 0
+ for (index, tab_name) in enumerate(self.names):
+ draw_x_list.append(x + width_offset)
+ width_offset += (self.name_widths[index] - (self.triangle_width + self.tab_radious * 2))
+
+ for (index, tab_name) in enumerate(reversed(self.names)):
+ tab_index = len(self.names) - index - 1
+ if tab_index != self.active_index:
+ self.draw_tab(cr, draw_x_list[tab_index], y, tab_name, tab_index)
+
+ # Draw active tab.
+ self.draw_tab(cr, draw_x_list[self.active_index], y, self.names[self.active_index], self.active_index)
+
+ # Draw bottom line.
+ frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_bottom_active_frame").get_color_info())
+ cr.set_source_rgba(*frame_color)
+ cr.rectangle(x,
+ y + h - 1,
+ draw_x_list[self.active_index],
+ 1)
+ cr.rectangle(x + draw_x_list[self.active_index] + self.name_widths[self.active_index],
+ y + h - 1,
+ w - draw_x_list[self.active_index] - self.name_widths[self.active_index],
+ 1)
+ cr.fill()
+
+ return True
+
+ def get_tab_width(self, tab_name):
+ '''
+ docs
+ '''
+ (text_width, text_height) = get_content_size(tab_name)
+ tab_height = self.height
+ triangle_width = int(tab_height / math.tan(math.radians(self.tab_angle)))
+ middle_width = text_width + self.tab_name_padding_x * 2
+ return middle_width + self.tab_radious * 4 + triangle_width * 2
+
+ def draw_tab(self, cr, x, y, tab_name, tab_index):
+ # Init.
+ (text_width, text_height) = get_content_size(tab_name)
+ tab_x = x
+ tab_y = y
+ tab_height = self.height
+ triangle_width = int(tab_height / math.tan(math.radians(self.tab_angle)))
+ middle_width = text_width + self.tab_name_padding_x * 2
+ tab_width = middle_width + self.tab_radious * 4 + triangle_width * 2
+ round_radious = self.tab_radious * math.tan(math.radians((180 - self.tab_angle) / 2))
+ round_angle = self.tab_angle
+
+ if tab_index == self.active_index:
+ frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_active_frame").get_color_info())
+ background_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_active_background").get_color_info())
+ top_frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_top_active_frame").get_color_info())
+ else:
+ frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_inactive_frame").get_color_info())
+ background_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_inactive_background").get_color_info())
+ top_frame_color = alpha_color_hex_to_cairo(ui_theme.get_alpha_color("dragable_tab_top_inactive_frame").get_color_info())
+
+ # Init round coordinate.
+ round_left_bottom_x = tab_x
+ round_left_bottom_y = tab_y + tab_height - round_radious
+
+ round_left_up_x = tab_x + self.tab_radious * 2 + triangle_width
+ round_left_up_y = tab_y + round_radious
+
+ round_right_bottom_x = tab_x + tab_width
+ round_right_bottom_y = tab_y + tab_height - round_radious
+
+ round_right_up_x = tab_x + tab_width - (self.tab_radious * 2 + triangle_width)
+ round_right_up_y = tab_y + round_radious
+
+ # Clip.
+ with cairo_state(cr):
+ # Clip.
+ if tab_index != self.active_index and tab_index != 0:
+ clip_offset_x = tab_width - (self.triangle_width + self.tab_radious * 2)
+ cr.move_to(tab_x + tab_width - clip_offset_x, tab_y + tab_height)
+ cr.arc(round_right_bottom_x - clip_offset_x,
+ round_right_bottom_y,
+ round_radious,
+ math.radians(90),
+ math.radians(90 + round_angle),
+ )
+
+ cr.line_to(tab_x + tab_width - self.tab_radious - self.triangle_width + self.tab_radious_offset_x - clip_offset_x,
+ tab_y)
+
+ cr.line_to(tab_x + tab_width, tab_y)
+ cr.line_to(tab_x + tab_width, tab_y + tab_height)
+ cr.line_to(tab_x + tab_width - clip_offset_x, tab_y + tab_height)
+ else:
+ cr.rectangle(tab_x, tab_y, tab_width, tab_height)
+ cr.clip()
+
+ # Draw background.
+ # Draw left area.
+ with cairo_state(cr):
+ cr.move_to(tab_x, tab_y + tab_height)
+ cr.arc_negative(round_left_bottom_x,
+ round_left_bottom_y,
+ round_radious,
+ math.radians(90),
+ math.radians(90 - round_angle),
+ )
+
+ cr.line_to(tab_x + self.tab_radious + self.tab_radious_offset_x,
+ tab_y + tab_height - self.tab_radious_offset_y)
+
+ cr.arc(round_left_up_x,
+ round_left_up_y,
+ round_radious,
+ math.radians(270 - round_angle),
+ math.radians(270))
+
+ # Draw top area.
+ with cairo_disable_antialias(cr):
+ cr.set_source_rgba(*frame_color)
+ cr.set_line_width(1)
+ cr.line_to(tab_x + self.tab_radious * 2 + triangle_width + middle_width, tab_y + 1)
+
+ # Draw right area.
+ with cairo_state(cr):
+ cr.arc(round_right_up_x,
+ round_right_up_y,
+ round_radious,
+ math.radians(270),
+ math.radians(270 + round_angle),
+ )
+
+ cr.line_to(tab_x + tab_width - (self.tab_radious + self.tab_radious_offset_x),
+ tab_y + tab_height - self.tab_radious_offset_y)
+
+ cr.arc_negative(round_right_bottom_x,
+ round_right_bottom_y,
+ round_radious,
+ math.radians(90 + round_angle),
+ math.radians(90))
+
+ cr.line_to(tab_x, tab_y + tab_height)
+
+ cr.set_source_rgba(*background_color)
+ cr.fill()
+
+ # Draw frame.
+ # Draw left area.
+ with cairo_state(cr):
+ cr.move_to(tab_x, tab_y + tab_height)
+ cr.arc_negative(round_left_bottom_x,
+ round_left_bottom_y,
+ round_radious,
+ math.radians(90),
+ math.radians(90 - round_angle),
+ )
+
+ cr.line_to(tab_x + self.tab_radious + self.tab_radious_offset_x,
+ tab_y + tab_height - self.tab_radious_offset_y)
+
+ cr.arc(round_left_up_x,
+ round_left_up_y,
+ round_radious,
+ math.radians(270 - round_angle),
+ math.radians(270))
+
+ cr.set_source_rgba(*frame_color)
+ cr.set_line_width(1)
+ cr.stroke()
+
+ # Draw top area.
+ with cairo_disable_antialias(cr):
+ offset = 1
+ cr.set_source_rgba(*top_frame_color)
+ cr.set_line_width(1)
+ cr.move_to(tab_x + self.tab_radious * 2 + triangle_width - offset, tab_y + 1)
+ cr.line_to(tab_x + self.tab_radious * 2 + triangle_width + middle_width + offset * 2, tab_y + 1)
+ cr.stroke()
+
+ # Draw right area.
+ with cairo_state(cr):
+ cr.move_to(tab_x + tab_width - (self.tab_radious * 2 + triangle_width), tab_y)
+ cr.arc(round_right_up_x,
+ round_right_up_y,
+ round_radious,
+ math.radians(270),
+ math.radians(270 + round_angle),
+ )
+
+ cr.line_to(tab_x + tab_width - (self.tab_radious + self.tab_radious_offset_x),
+ tab_y + tab_height - self.tab_radious_offset_y)
+
+ cr.arc_negative(round_right_bottom_x,
+ round_right_bottom_y,
+ round_radious,
+ math.radians(90 + round_angle),
+ math.radians(90))
+
+ cr.set_source_rgba(*frame_color)
+ cr.set_line_width(1)
+ cr.stroke()
+
+ # Draw text.
+ draw_text(cr, tab_name, tab_x, tab_y, tab_width, tab_height, alignment=pango.ALIGN_CENTER)
+
+gobject.type_register(Tabbar)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/entry.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/entry.py
Changed
from locales import _
from menu import Menu
from theme import ui_theme
+import sys
+import traceback
import gobject
import gtk
import pango
try:
yield
except Exception, e:
- print 'monitor_entry_content error %s' % e
+ print 'function monitor_entry_content got error %s' % e
+ traceback.print_exc(file=sys.stdout)
else:
new_text = self.get_text()
if self.check_text == None or self.check_text(new_text):
self.offset_x = text_width - rect.width + self.padding_x * 2
else:
self.offset_x = 0
+
+ self.im.set_client_window(widget.window)
def key_press_entry(self, widget, event):
'''
'''
if self.grab_focus_flag and self.select_start_index == self.select_end_index:
# Init.
- x, y, w, h = rect.x, rect.y, rect.width, rect.height
- left_str = self.content[0:self.cursor_index]
- left_str_width = self.get_content_width(left_str)
- padding_y = (h - (get_content_size("Height", self.font_size)[-1])) / 2
+ cursor_rect = self.get_cursor_rect()
# Draw cursor.
cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("entry_cursor").get_color()))
- cr.rectangle(x + self.padding_x + left_str_width - self.offset_x,
- y + padding_y,
- 1,
- h - padding_y * 2
- )
+ cr.rectangle(cursor_rect.x, cursor_rect.y, cursor_rect.width, cursor_rect.height)
cr.fill()
+
+ # Tell input method follow cursor position.
+ self.im.set_cursor_location(cursor_rect)
+
+ def get_cursor_rect(self):
+ '''
+ docs
+ '''
+ # Init.
+ rect = self.allocation
+ x, y, w, h = rect.x, rect.y, rect.width, rect.height
+ left_str = self.content[0:self.cursor_index]
+ left_str_width = self.get_content_width(left_str)
+ padding_y = (h - (get_content_size("Height", self.font_size)[-1])) / 2
+
+ # Draw cursor.
+ return gtk.gdk.Rectangle(
+ x + self.padding_x + left_str_width - self.offset_x,
+ y + padding_y,
+ 1,
+ h - padding_y * 2
+ )
def button_press_entry(self, widget, event):
'''
'''
self.grab_focus_flag = True
- # Focus in IMContext.
- self.im.set_client_window(widget.window)
self.im.focus_in()
self.queue_draw()
try:
return list(content.decode('utf-8'))[index].encode('utf-8')
except Exception, e:
- print "get_utf8_string got error: %s" % (e)
+ print "function get_utf8_string got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
return ""
gobject.type_register(Entry)
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/file_treeview.py
Added
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
+# 2011 ~ 2012 Wang Yong
+#
+# Author: Wang Yong <lazycat.manatee@gmail.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from new_treeview import TreeItem
+import collections
+from gio_utils import (get_file_icon_pixbuf, is_directory, get_dir_child_files,
+ get_gfile_modification_time, get_gfile_size,
+ get_gfile_type,get_file_type_dict,
+ get_gfile_name, get_gfile_content_type, sort_file_by_name)
+from draw import draw_pixbuf, draw_text, draw_vlinear
+from threads import post_gui
+from theme import ui_theme
+import pango
+import gobject
+import gio
+import threading as td
+from utils import cairo_disable_antialias, get_content_size, format_file_size
+import traceback
+import sys
+
+ICON_SIZE = 24
+ICON_PADDING_LEFT = ICON_PADDING_RIGHT = 4
+INDICATOR_PADDING_LEFT = INDICATOR_PADDING_RIGHT = 4
+ITEM_PADDING_Y = 2
+ITEM_HEIGHT = ICON_SIZE + ITEM_PADDING_Y * 2
+COLUMN_OFFSET = 32
+MODIFICATION_TIME_PADDING_LEFT = 12
+CONTENT_TYPE_PADDING_LEFT = 12
+SIZE_PADDING_LEFT = 12
+
+def sort_by_key(items, sort_reverse, sort_key):
+ if len(items) == 1 and (isinstance(items[0], EmptyItem) or isinstance(items[0], LoadingItem)):
+ return items
+ else:
+ # Init.
+ item_oreder_dict = collections.OrderedDict(get_file_type_dict())
+
+ # Split item with different file type.
+ for item in items:
+ item_oreder_dict[item.type].append(item)
+
+ # Get sorted item list.
+ item_list = []
+ for (file_type, type_items) in item_oreder_dict.items():
+ item_list += sorted(type_items, key=sort_key, reverse=sort_reverse)
+
+ return item_list
+
+def sort_by_name(items, sort_reverse):
+ return sort_by_key(items, sort_reverse, lambda i: i.name)
+
+def sort_by_size(items, sort_reverse):
+ return sort_by_key(items, sort_reverse, lambda i: i.size)
+
+def sort_by_type(items, sort_reverse):
+ return sort_by_key(items, sort_reverse, lambda i: i.content_type)
+
+def sort_by_mtime(items, sort_reverse):
+ return sort_by_key(items, sort_reverse, lambda i: i.modification_time)
+
+def get_name_width(column_index, name):
+ expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_down.png").get_pixbuf()
+ 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]
+
+def get_modification_time_width(time):
+ return get_content_size(time)[0] + MODIFICATION_TIME_PADDING_LEFT
+
+def get_type_width(file_type):
+ return get_content_size(file_type)[0] + CONTENT_TYPE_PADDING_LEFT
+
+def get_size_width(size):
+ return get_content_size(size)[0] + SIZE_PADDING_LEFT
+
+def render_background(item, cr, rect):
+ if item.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+class LoadingThread(td.Thread):
+
+ def __init__(self, dir_item):
+ td.Thread.__init__(self)
+ self.setDaemon(True) # make thread exit when main program exit
+ self.dir_item = dir_item
+
+ def run(self):
+ try:
+ self.dir_item.load_status = self.dir_item.LOADING_START
+ self.items = get_dir_items(self.dir_item.gfile.get_path(), self.dir_item.column_index + 1)
+ if self.items == []:
+ self.items = [EmptyItem(self.dir_item.column_index + 1)]
+
+ for item in self.items:
+ item.parent_item = self.dir_item
+
+ self.dir_item.load_status = self.dir_item.LOADING_FINSIH
+
+ self.render_items()
+ except Exception, e:
+ print "class LoadingThread got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
+
+ @post_gui
+ def render_items(self):
+ self.dir_item.delete_chlid_item()
+ self.dir_item.child_items = self.items
+ self.dir_item.add_child_item()
+
+class DirItem(TreeItem):
+ '''
+ Directory item.
+ '''
+
+ LOADING_INIT = 0
+ LOADING_START = 1
+ LOADING_FINSIH = 2
+
+ def __init__(self, gfile, column_index=0):
+ '''
+ Initialize DirItem class.
+ '''
+ # Init.
+ TreeItem.__init__(self)
+ self.gfile = gfile
+ self.type = get_gfile_type(self.gfile)
+ self.name = get_gfile_name(self.gfile)
+ self.modification_time = get_gfile_modification_time(self.gfile)
+ self.content_type = get_gfile_content_type(self.gfile)
+ self.size = get_gfile_size(self.gfile)
+ self.size_name = "%s 项" % (self.size)
+ self.directory_path = gfile.get_path()
+ self.pixbuf = get_file_icon_pixbuf(self.directory_path, ICON_SIZE)
+ self.column_index = column_index
+ self.is_expand = False
+ self.load_status = self.LOADING_INIT
+ self.name_width = get_name_width(self.column_index, self.name)
+ self.modification_time_width = get_modification_time_width(self.modification_time)
+ self.content_type_width = get_type_width(self.content_type)
+ self.size_width = get_size_width(self.size_name)
+
+ def render_name(self, cr, rect):
+ '''
+ Render icon and name of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw directory arrow icon.
+ if self.is_expand:
+ expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_down.png").get_pixbuf()
+ else:
+ expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_right.png").get_pixbuf()
+ draw_pixbuf(cr, expand_indicator_pixbuf,
+ rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT,
+ rect.y + (rect.height - expand_indicator_pixbuf.get_height()) / 2,
+ )
+
+ # Draw directory icon.
+ draw_pixbuf(cr, self.pixbuf,
+ rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT + expand_indicator_pixbuf.get_width() + INDICATOR_PADDING_RIGHT + ICON_PADDING_LEFT,
+ rect.y + (rect.height - ICON_SIZE) / 2,
+ )
+
+ # Draw directory name.
+ draw_text(cr, self.name,
+ 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,
+ rect.y,
+ rect.width, rect.height)
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def render_modification_time(self, cr, rect):
+ '''
+ Render type of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw directory type.
+ draw_text(cr, self.modification_time,
+ rect.x + MODIFICATION_TIME_PADDING_LEFT,
+ rect.y,
+ rect.width, rect.height)
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def render_type(self, cr, rect):
+ '''
+ Render type of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw directory type.
+ draw_text(cr, self.content_type,
+ rect.x + CONTENT_TYPE_PADDING_LEFT,
+ rect.y,
+ rect.width, rect.height)
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def render_size(self, cr, rect):
+ '''
+ Render size of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw directory size.
+ draw_text(cr, self.size_name,
+ rect.x,
+ rect.y,
+ rect.width, rect.height,
+ alignment=pango.ALIGN_RIGHT
+ )
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def expand(self):
+ self.is_expand = True
+
+ if self.load_status == self.LOADING_INIT:
+ self.add_loading_item()
+ elif self.load_status == self.LOADING_FINSIH:
+ self.add_child_item()
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def unexpand(self):
+ self.is_expand = False
+
+ self.delete_chlid_item()
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def add_loading_item(self):
+ loading_item = LoadingItem(self.column_index + 1)
+ loading_item.parent_item = self
+ self.child_items = [loading_item]
+
+ self.add_child_item()
+
+ LoadingThread(self).start()
+
+ def add_child_item(self):
+ self.add_items_callback(self.child_items, self.row_index + 1)
+
+ def delete_chlid_item(self):
+ for child_item in self.child_items:
+ if isinstance(child_item, DirItem) and child_item.is_expand:
+ child_item.unexpand()
+
+ self.delete_items_callback(self.child_items)
+
+ def get_height(self):
+ return ITEM_HEIGHT
+
+ def get_column_widths(self):
+ return [self.name_width, self.size_width, self.content_type_width, -1]
+
+ def get_column_renders(self):
+ return [self.render_name,
+ self.render_size,
+ self.render_type,
+ self.render_modification_time,
+ ]
+
+ def unselect(self):
+ self.is_select = False
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def select(self):
+ self.is_select = True
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def double_click(self):
+ if self.is_expand:
+ self.unexpand()
+ else:
+ self.expand()
+
+ def draw_drag_line(self, drag_line, drag_line_at_bottom=False):
+ self.drag_line = drag_line
+ self.drag_line_at_bottom = drag_line_at_bottom
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+gobject.type_register(DirItem)
+
+class FileItem(TreeItem):
+ '''
+ File item.
+ '''
+
+ def __init__(self, gfile, column_index=0):
+ '''
+ Initialize FileItem class.
+ '''
+ TreeItem.__init__(self)
+ self.gfile = gfile
+ self.type = get_gfile_type(self.gfile)
+ self.name = get_gfile_name(self.gfile)
+ self.modification_time = get_gfile_modification_time(self.gfile)
+ self.content_type = get_gfile_content_type(self.gfile)
+ self.size = get_gfile_size(self.gfile)
+ self.size_name = format_file_size(self.size)
+ self.file_path = gfile.get_path()
+ self.pixbuf = get_file_icon_pixbuf(self.file_path, ICON_SIZE)
+ self.column_index = column_index
+ self.name_width = get_name_width(self.column_index, self.name)
+ self.modification_time_width = get_modification_time_width(self.modification_time)
+ self.content_type_width = get_type_width(self.content_type)
+ self.size_width = get_size_width(self.size_name)
+
+ def render_name(self, cr, rect):
+ '''
+ Render icon and name of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Init.
+ expand_indicator_pixbuf = ui_theme.get_pixbuf("treeview/arrow_right.png").get_pixbuf()
+
+ # Draw directory icon.
+ draw_pixbuf(cr, self.pixbuf,
+ rect.x + COLUMN_OFFSET * self.column_index + INDICATOR_PADDING_LEFT + expand_indicator_pixbuf.get_width() + INDICATOR_PADDING_RIGHT + ICON_PADDING_LEFT,
+ rect.y + (rect.height - ICON_SIZE) / 2,
+ )
+
+ # Draw directory name.
+ draw_text(cr, self.name,
+ 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,
+ rect.y,
+ rect.width, rect.height)
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def render_modification_time(self, cr, rect):
+ '''
+ Render type of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw directory type.
+ draw_text(cr, self.modification_time,
+ rect.x + MODIFICATION_TIME_PADDING_LEFT,
+ rect.y,
+ rect.width, rect.height)
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def render_type(self, cr, rect):
+ '''
+ Render type of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw directory type.
+ draw_text(cr, self.content_type,
+ rect.x + CONTENT_TYPE_PADDING_LEFT,
+ rect.y,
+ rect.width, rect.height)
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def render_size(self, cr, rect):
+ '''
+ Render size of DirItem.
+ '''
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw directory size.
+ draw_text(cr, self.size_name,
+ rect.x,
+ rect.y,
+ rect.width,
+ rect.height,
+ alignment=pango.ALIGN_RIGHT,
+ )
+
+ # Draw drag line.
+ if self.drag_line:
+ with cairo_disable_antialias(cr):
+ cr.set_line_width(1)
+ if self.drag_line_at_bottom:
+ cr.rectangle(rect.x, rect.y + rect.height - 1, rect.width, 1)
+ else:
+ cr.rectangle(rect.x, rect.y, rect.width, 1)
+ cr.fill()
+
+ def expand(self):
+ pass
+
+ def unexpand(self):
+ pass
+
+ def get_height(self):
+ return ITEM_HEIGHT
+
+ def get_column_widths(self):
+ return [self.name_width, self.size_width, self.content_type_width, -1]
+
+ def get_column_renders(self):
+ return [self.render_name,
+ self.render_size,
+ self.render_type,
+ self.render_modification_time,
+ ]
+
+ def unselect(self):
+ self.is_select = False
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def select(self):
+ self.is_select = True
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def double_click(self):
+ app_info = gio.app_info_get_default_for_type(self.gfile.query_info("standard::content-type").get_content_type(), False)
+ if app_info:
+ app_info.launch([self.gfile], None)
+ else:
+ print "Don't know how to open file: %s" % (self.name)
+
+ def draw_drag_line(self, drag_line, drag_line_at_bottom=False):
+ self.drag_line = drag_line
+ self.drag_line_at_bottom = drag_line_at_bottom
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+gobject.type_register(DirItem)
+
+class LoadingItem(TreeItem):
+ '''
+ Loadding item.
+ '''
+
+ def __init__(self, column_index=0):
+ '''
+ Initialize LoadingItem class.
+ '''
+ TreeItem.__init__(self)
+ self.column_index = column_index
+
+ def get_height(self):
+ return ITEM_HEIGHT
+
+ def get_column_widths(self):
+ return [200, 1, -1]
+
+ def get_column_renders(self):
+ return [self.render,
+ lambda cr, rect: render_background(self, cr, rect),
+ lambda cr, rect: render_background(self, cr, rect),
+ lambda cr, rect: render_background(self, cr, rect),
+ ]
+
+ def render(self, cr, rect):
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw loading text.
+ draw_text(cr, "正在加载...",
+ rect.x + COLUMN_OFFSET * self.column_index,
+ rect.y,
+ rect.width, rect.height)
+
+ def unselect(self):
+ self.is_select = False
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def select(self):
+ self.is_select = True
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+gobject.type_register(LoadingItem)
+
+class EmptyItem(TreeItem):
+ '''
+ Loadding item.
+ '''
+
+ def __init__(self, column_index=0):
+ '''
+ Initialize EmptyItem class.
+ '''
+ TreeItem.__init__(self)
+ self.column_index = column_index
+
+ def get_height(self):
+ return ITEM_HEIGHT
+
+ def get_column_widths(self):
+ return [200, 1, -1]
+
+ def get_column_renders(self):
+ return [self.render,
+ lambda cr, rect: render_background(self, cr, rect),
+ lambda cr, rect: render_background(self, cr, rect),
+ lambda cr, rect: render_background(self, cr, rect)
+ ]
+
+ def render(self, cr, rect):
+ # Draw select background.
+ if self.is_select:
+ draw_vlinear(cr, rect.x ,rect.y, rect.width, rect.height,
+ ui_theme.get_shadow_color("listview_select").get_color_info())
+
+ # Draw loading text.
+ draw_text(cr, "(空)",
+ rect.x + COLUMN_OFFSET * self.column_index,
+ rect.y,
+ rect.width, rect.height)
+
+ def unselect(self):
+ self.is_select = False
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+ def select(self):
+ self.is_select = True
+
+ if self.redraw_request_callback:
+ self.redraw_request_callback(self)
+
+gobject.type_register(EmptyItem)
+
+def get_dir_items(dir_path, column_index=0):
+ '''
+ Get children items with given directory path.
+ '''
+ items = []
+ for gfile in get_dir_child_files(dir_path, sort_file_by_name):
+ if is_directory(gfile):
+ items.append(DirItem(gfile, column_index))
+ else:
+ items.append(FileItem(gfile, column_index))
+
+ return items
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/gio_utils.py
Added
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
+# 2011 ~ 2012 Wang Yong
+#
+# Author: Wang Yong <lazycat.manatee@gmail.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gio
+import gtk
+import os
+import collections
+import sys
+import traceback
+import time
+
+file_icon_pixbuf_dict = {}
+
+def get_file_type_dict():
+ return ([(gio.FILE_TYPE_DIRECTORY, []),
+ (gio.FILE_TYPE_SYMBOLIC_LINK, []),
+ (gio.FILE_TYPE_MOUNTABLE, []),
+ (gio.FILE_TYPE_REGULAR, []),
+ (gio.FILE_TYPE_SHORTCUT, []),
+ (gio.FILE_TYPE_SPECIAL, []),
+ (gio.FILE_TYPE_UNKNOWN, []),
+ ])
+
+def get_file_icon_pixbuf(filepath, icon_size):
+ '''
+ Get icon pixbuf with given filepath.
+
+ @param filepath: File path.
+ @return: Return icon pixbuf with given filepath.
+ '''
+ gfile = gio.File(filepath)
+ mime_type = gfile.query_info("standard::content-type").get_content_type()
+ if file_icon_pixbuf_dict.has_key(mime_type):
+ return file_icon_pixbuf_dict[mime_type]
+ else:
+ icon_theme = gtk.icon_theme_get_default()
+ icon_info = icon_theme.lookup_by_gicon(
+ gfile.query_info("standard::icon").get_icon(),
+ icon_size,
+ gtk.ICON_LOOKUP_USE_BUILTIN)
+ if icon_info:
+ return icon_info.load_icon()
+ # Return unknown icon when icon_info is None.
+ else:
+ return icon_theme.load_icon("unknown", icon_size, gtk.ICON_LOOKUP_USE_BUILTIN)
+
+def get_dir_child_num(gfile):
+ gfile_enumerator = gfile.enumerate_children("standard::*")
+
+ # Return empty list if enumerator is None.
+ if gfile_enumerator == None:
+ return 0
+ else:
+ child_num = 0
+ while True:
+ if gfile_enumerator.next_file() == None:
+ break
+ else:
+ child_num += 1
+
+ return child_num
+
+def get_dir_child_infos(dir_path, sort=None, reverse=False):
+ '''
+ Get children FileInfos with given directory path.
+
+ @param dir_path: Directory path.
+ @return: Return a list of gio.Fileinfo.
+ '''
+ # Get gio file.
+ gfile = gio.File(dir_path)
+
+ # Return empty list if file not exists.
+ if not gfile.query_exists():
+ return []
+ else:
+ gfile_info = gfile.query_info("standard::type")
+ if gfile_info.get_file_type() == gio.FILE_TYPE_DIRECTORY:
+ try:
+ gfile_enumerator = gfile.enumerate_children("standard::*")
+
+ # Return empty list if enumerator is None.
+ if gfile_enumerator == None:
+ return []
+ else:
+ file_infos = []
+ while True:
+ file_info = gfile_enumerator.next_file()
+ if file_info == None:
+ break
+ else:
+ file_infos.append(file_info)
+
+ if sort:
+ return sort(file_infos, reverse)
+ else:
+ return file_infos
+ # Return empty list if got error when get enumerator of file.
+ except Exception, e:
+ print "function get_dir_children got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
+
+ return []
+ # Return empty list if file is not directory.
+ else:
+ return []
+
+def get_dir_child_names(dir_path):
+ '''
+ Get children names with given directory path.
+
+ @param dir_path: Directory path.
+ @return: Return a list of filepath.
+ '''
+ return map(lambda info: info.get_name(), get_dir_child_infos(dir_path))
+
+def get_dir_child_files(dir_path, sort_files=None, reverse=False):
+ '''
+ Get children gio.File with given directory path.
+
+ @param dir_path: Directory path.
+ @return: Return a list of gio.File.
+ '''
+ gfiles = []
+ file_infos = get_dir_child_infos(dir_path, sort_files, reverse)
+ for (index, file_info) in enumerate(file_infos):
+ gfile = gio.File(os.path.join(dir_path, file_infos[index].get_name()))
+ gfiles.append(gfile)
+
+ return gfiles
+
+def sort_file_by_name(file_infos, reverse):
+ '''
+ Sort file info by name.
+ '''
+ # Init.
+ file_info_oreder_dict = collections.OrderedDict(get_file_type_dict())
+
+ # Split info with different file type.
+ for file_info in file_infos:
+ file_info_oreder_dict[file_info.get_file_type()].append(file_info)
+
+ # Get sorted info list.
+ infos = []
+ for (file_type, file_type_infos) in file_info_oreder_dict.items():
+ infos += sorted(file_type_infos, key=lambda info: info.get_name())
+
+ return infos
+
+def get_gfile_name(gfile):
+ '''
+ Get name of gfile.
+ '''
+ return gfile.query_info("standard::name").get_name()
+
+def get_gfile_content_type(gfile):
+ '''
+ Get type of gfile.
+ '''
+ return gio.content_type_get_description(gfile.query_info("standard::content-type").get_content_type())
+
+def get_gfile_modification_time(gfile):
+ return time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(gfile.query_info("time::modified").get_modification_time()))
+
+def get_gfile_size(gfile):
+ if gfile.query_info("standard::type").get_file_type() == gio.FILE_TYPE_DIRECTORY:
+ return get_dir_child_num(gfile)
+ else:
+ return gfile.query_info("standard::size").get_size()
+
+def get_gfile_type(gfile):
+ return gfile.query_info("standard::type").get_file_type()
+
+def is_directory(gfile):
+ '''
+ Whether gfile is directory.
+
+ @param gfile: gio.File.
+ @return: Return True if gfile is directory, else return False.
+ '''
+ return gfile.query_info("standard::type").get_file_type() == gio.FILE_TYPE_DIRECTORY
+
+if __name__ == "__main__":
+ print get_file_icon_pixbuf("/data/Picture/宝宝/ETB8227272-0003.JPG", 24)
+ print get_dir_child_files("/")
+ print get_dir_child_names("/home/andy")
+
deepin-ui-1.0git20120817.tar.gz/dtk/ui/global_key.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/global_key.py
Changed
import gtk
import gtk.gdk as gdk
import threading
+import sys
+import traceback
global_key_running = True
global_key_lock = Lock()
try:
self.root.grab_key(keycode, int(modifiers), True, X.GrabModeAsync, X.GrabModeSync)
except Exception, e:
- print e
+ print "function grab got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
def ungrab(self):
'''
try:
self.root.ungrab_key(keycode, modifiers, self.root)
except Exception, e:
- print e
+ print "function ungrab got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
def regrab(self):
'''
deepin-ui-1.0git20120817.tar.gz/dtk/ui/iconview.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/iconview.py
Changed
from keymap import get_keyevent_name
from skin_config import skin_config
from theme import ui_theme
+import cairo
import gc
import gobject
import gtk
+import math
from utils import (get_match_parent, cairo_state, get_event_coords,
is_in_rect, is_left_button, is_double_click,
is_single_click, get_window_shadow_size)
"double-click-item" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, int, int)),
}
- def __init__(self, padding_x=0, padding_y=0):
+ def __init__(self,
+ padding_x=0,
+ padding_y=0,
+ mask_bound_height=24,
+ ):
'''
Initialize IconView class.
gtk.DrawingArea.__init__(self)
self.padding_x = padding_x
self.padding_y = padding_y
+ self.mask_bound_height = mask_bound_height
self.add_events(gtk.gdk.ALL_EVENTS_MASK)
self.set_can_focus(True) # can focus to response key-press signal
self.items = []
@param h: Height of draw area.
'''
draw_vlinear(cr, x, y, w, h,
- ui_theme.get_shadow_color("linear_background").get_color_info())
+ ui_theme.get_shadow_color("linear_background").get_color_info()
+ )
def expose_icon_view(self, widget, event):
'''
# Draw mask.
self.draw_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
+
+ # Draw items.
+ self.draw_items(cr, rect, offset_x, offset_y, viewport)
- # Draw item.
+ def draw_items(self, cr, rect, offset_x, offset_y, viewport):
+ # Draw items.
if len(self.items) > 0:
- with cairo_state(cr):
- # Don't draw any item out of viewport area.
- cr.rectangle(offset_x, offset_y,
- viewport.allocation.width,
- viewport.allocation.height)
- cr.clip()
+ # Init.
+ vadjust = get_match_parent(self, ["ScrolledWindow"]).get_vadjustment()
+
+ # Init top surface.
+ if vadjust.get_value() != vadjust.get_lower():
+ top_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
+ top_surface_cr = gtk.gdk.CairoContext(cairo.Context(top_surface))
- # Get item information.
- (item_width, item_height, columns, start_index, end_index) = self.get_render_item_info()
+ clip_y = vadjust.get_value() + self.mask_bound_height
+ else:
+ top_surface = top_surface_cr = None
+ clip_y = vadjust.get_value()
+
+ # Init bottom surface.
+ if vadjust.get_value() + vadjust.get_page_size() != vadjust.get_upper():
+ bottom_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
+ bottom_surface_cr = gtk.gdk.CairoContext(cairo.Context(bottom_surface))
+
+ clip_height = vadjust.get_page_size() - self.mask_bound_height - (clip_y - vadjust.get_value())
+ else:
+ bottom_surface = bottom_surface_cr = None
+
+ clip_height = vadjust.get_page_size() - (clip_y - vadjust.get_value())
+
+ with cairo_state(cr):
+ # Draw on drawing area.
+ (item_width, item_height, columns, start_index, end_index) = self.get_render_item_info()
for (index, item) in enumerate(self.items[start_index:end_index]):
row = int((start_index + index) / columns)
column = (start_index + index) % columns
render_x = rect.x + self.padding_x + column * item_width
render_y = rect.y + self.padding_y + row * item_height
+ render_width = item_width
+ render_height = item_height
+
+ # Draw on top surface.
+ if top_surface_cr:
+ if (not render_y > vadjust.get_value() + self.mask_bound_height) and (not render_y + render_height < vadjust.get_value()):
+ top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ top_surface_cr.clip()
+
+ item.render(
+ top_surface_cr,
+ gtk.gdk.Rectangle(render_x,
+ render_y - int(vadjust.get_value()),
+ render_width,
+ render_height))
+
+ # Draw on bottom surface.
+ if bottom_surface_cr:
+ 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):
+ bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ bottom_surface_cr.clip()
+
+ item.render(
+ bottom_surface_cr,
+ gtk.gdk.Rectangle(render_x,
+ render_y - int(vadjust.get_value()) - int(vadjust.get_page_size() - self.mask_bound_height),
+ render_width,
+ render_height))
+
+ cr.rectangle(offset_x,
+ offset_y + clip_y - vadjust.get_value(),
+ viewport.allocation.width,
+ clip_height + 1)
+ cr.clip()
with cairo_state(cr):
# Don't allow draw out of item area.
item.render(cr, gtk.gdk.Rectangle(render_x, render_y, item_width, item_height))
+ # Draw alpha mask on top surface.
+ if top_surface:
+ i = 0
+ while (i <= self.mask_bound_height):
+ with cairo_state(cr):
+ cr.rectangle(rect.x, vadjust.get_value() + i, rect.width, 1)
+ cr.clip()
+ cr.set_source_surface(top_surface, 0, vadjust.get_value())
+ cr.paint_with_alpha(math.sin(i * math.pi / 2 / self.mask_bound_height))
+
+ i += 1
+
+ # Draw alpha mask on bottom surface.
+ if bottom_surface:
+ i = 0
+ while (i <= self.mask_bound_height):
+ with cairo_state(cr):
+ cr.rectangle(rect.x, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height + i, rect.width, 1)
+ cr.clip()
+ cr.set_source_surface(bottom_surface, 0, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height)
+ cr.paint_with_alpha(1.0 - (math.sin(i * math.pi / 2 / self.mask_bound_height)))
+
+ i += 1
+
def get_render_item_info(self):
'''
Internal function to get information of render items.
deepin-ui-1.0git20120817.tar.gz/dtk/ui/listview.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/listview.py
Changed
from keymap import get_keyevent_name, has_ctrl_mask, has_shift_mask
from skin_config import skin_config
from theme import ui_theme
+import math
+import cairo
import copy
import gobject
import gtk
import pango
import subprocess
import tempfile
+import sys
+import traceback
from utils import (map_value, mix_list_max, get_content_size,
unzip, last_index, set_cursor, get_match_parent,
remove_file, remove_timeout_id,
enable_drag_drop=True,
drag_icon_pixbuf=ui_theme.get_pixbuf("listview/drag_preview.png"),
drag_out_offset=50,
+ mask_bound_height=24,
):
'''
Initialize ListView widget.
self.enable_multiple_select = enable_multiple_select
self.drag_icon_pixbuf = drag_icon_pixbuf
self.drag_out_offset = drag_out_offset
+ self.mask_bound_height = mask_bound_height
self.auto_scroll_id = None
self.auto_scroll_delay = 70 # milliseconds
for (index, item) in enumerate(self.items):
item.set_index(index)
+ def reorder_item(self, item, index):
+ '''
+ Reorder item with given index.
+
+ @param item: Item need reorder.
+ @param index: Reorder index.
+
+ If index < 0, move to begin position of list view, if index > max_index, move to end position of list view.
+ '''
+ if index < 0:
+ index = 0
+ else:
+ index = len(self.items) - 1
+
+ with self.keep_select_status():
+ self.items.remove(item)
+ self.items.insert(index, item)
+
+ self.update_item_index()
+
+ self.queue_draw()
+
def set_title_height(self, title_height):
'''
Set title height.
else:
return (0, 0, viewport)
- def draw_shadow_mask(self, cr, x, y, w, h):
- '''
- Shadow mask interface for overwrite.
-
- @param cr: Cairo context.
- @param x: X coordiante of draw area.
- @param y: Y coordiante of draw area.
- @param w: Width of draw area.
- @param h: Height of draw area.
- '''
- pass
-
def draw_mask(self, cr, x, y, w, h):
'''
Draw mask interface.
# Draw mask.
self.draw_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
- if len(self.items) > 0:
- with cairo_state(cr):
- # Don't draw any item under title area.
- cr.rectangle(offset_x, offset_y + self.title_offset_y,
- viewport.allocation.width, viewport.allocation.height - self.title_offset_y)
- cr.clip()
-
- # Draw hover row.
- highlight_row = None
- if self.highlight_item:
- highlight_row = self.highlight_item.get_index()
-
- if self.hover_row != None and not self.hover_row in self.select_rows and self.hover_row != highlight_row:
- self.draw_item_hover(
- cr, offset_x, self.title_offset_y + self.hover_row * self.item_height,
- viewport.allocation.width, self.item_height)
-
- # Draw select rows.
- for select_row in self.select_rows:
- if select_row != highlight_row:
- self.draw_item_select(
- cr, offset_x, self.title_offset_y + select_row * self.item_height,
- viewport.allocation.width, self.item_height)
-
- # Draw highlight row.
- if self.highlight_item:
- self.draw_item_highlight(
- cr, offset_x, self.title_offset_y + self.highlight_item.get_index() * self.item_height,
- viewport.allocation.width, self.item_height)
-
- # Get viewport index.
- start_y = offset_y - self.title_offset_y
- end_y = offset_y + viewport.allocation.height - self.title_offset_y
- start_index = max(start_y / self.item_height, 0)
- if (end_y - end_y / self.item_height * self.item_height) == 0:
- end_index = min(end_y / self.item_height + 1, len(self.items))
- else:
- end_index = min(end_y / self.item_height + 2, len(self.items))
-
- # Draw list item.
- for (row, item) in enumerate(self.items[start_index:end_index]):
- renders = item.get_renders()
- for (column, render) in enumerate(renders):
- cell_width = cell_widths[column]
- cell_x = sum(cell_widths[0:column])
- render_x = rect.x + cell_x
- render_y = rect.y + (row + start_index) * self.item_height + self.title_offset_y
- render_width = cell_width
- render_height = self.item_height
-
- with cairo_state(cr):
- # Don't allowed list item draw out of cell rectangle.
- cr.rectangle(render_x, render_y, render_width, render_height)
- cr.clip()
-
- # Render cell.
- render(cr, gtk.gdk.Rectangle(render_x, render_y, render_width, render_height),
- (start_index + row) in self.select_rows,
- item == self.highlight_item)
-
+ # Draw items.
+ self.draw_items(cr, rect, offset_x, offset_y, viewport, cell_widths)
# Draw titles.
if self.titles:
cell_offset_x + cell_width - sort_pixbuf.get_width() - self.SORT_PADDING_X,
offset_y + (self.title_height - sort_pixbuf.get_height()) / 2)
- # Draw shadow mask.
- self.draw_shadow_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
-
# Draw drag reference row.
if self.drag_reference_row != None:
drag_pixbuf = ui_theme.get_pixbuf("listview/drag_line.png").get_pixbuf()
return False
+ def draw_items(self, cr, rect, offset_x, offset_y, viewport, cell_widths):
+ if len(self.items) > 0:
+ # Init.
+ vadjust = get_match_parent(self, ["ScrolledWindow"]).get_vadjustment()
+
+ # Init top surface.
+ if vadjust.get_value() != vadjust.get_lower():
+ top_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
+ top_surface_cr = gtk.gdk.CairoContext(cairo.Context(top_surface))
+
+ clip_y = vadjust.get_value() + self.mask_bound_height
+ else:
+ top_surface = top_surface_cr = None
+
+ clip_y = vadjust.get_value()
+
+ # Init bottom surface.
+ if vadjust.get_value() + vadjust.get_page_size() != vadjust.get_upper():
+ bottom_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
+ bottom_surface_cr = gtk.gdk.CairoContext(cairo.Context(bottom_surface))
+
+ clip_height = vadjust.get_page_size() - self.mask_bound_height - (clip_y - vadjust.get_value())
+ else:
+ bottom_surface = bottom_surface_cr = None
+
+ clip_height = vadjust.get_page_size() - (clip_y - vadjust.get_value())
+
+ with cairo_state(cr):
+ if top_surface_cr:
+ top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ top_surface_cr.clip()
+
+ self.draw_items_row(top_surface_cr, offset_x, viewport,
+ int(vadjust.get_value()))
+
+ if bottom_surface_cr:
+ bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ bottom_surface_cr.clip()
+
+ self.draw_items_row(bottom_surface_cr, offset_x, viewport,
+ int(vadjust.get_value()) + int(vadjust.get_page_size()) + self.mask_bound_height)
+
+ # Don't draw any item under title area.
+ cr.rectangle(offset_x,
+ offset_y + self.title_offset_y + clip_y - vadjust.get_value(),
+ viewport.allocation.width,
+ clip_height + 1 - self.title_offset_y
+ )
+ cr.clip()
+
+ self.draw_items_row(cr, offset_x, viewport)
+
+ with cairo_state(cr):
+ # Don't draw any item under title area.
+ cr.rectangle(offset_x,
+ offset_y + self.title_offset_y + clip_y - vadjust.get_value(),
+ viewport.allocation.width,
+ clip_height + 1 - self.title_offset_y
+ )
+ cr.clip()
+
+ # Get viewport index.
+ start_y = offset_y - self.title_offset_y
+ end_y = offset_y + viewport.allocation.height - self.title_offset_y
+ start_index = max(start_y / self.item_height, 0)
+ if (end_y - end_y / self.item_height * self.item_height) == 0:
+ end_index = min(end_y / self.item_height + 1, len(self.items))
+ else:
+ end_index = min(end_y / self.item_height + 2, len(self.items))
+
+ # Draw list item.
+ for (row, item) in enumerate(self.items[start_index:end_index]):
+ renders = item.get_renders()
+ for (column, render) in enumerate(renders):
+ cell_width = cell_widths[column]
+ cell_x = sum(cell_widths[0:column])
+ render_x = rect.x + cell_x
+ render_y = rect.y + (row + start_index) * self.item_height + self.title_offset_y
+ render_width = cell_width
+ render_height = self.item_height
+
+ # Draw on top surface.
+ if top_surface_cr:
+ if (not render_y > vadjust.get_value() + self.mask_bound_height) and (not render_y + render_height < vadjust.get_value()):
+ top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ top_surface_cr.clip()
+
+ render(
+ top_surface_cr,
+ gtk.gdk.Rectangle(render_x,
+ render_y - int(vadjust.get_value()),
+ render_width,
+ render_height),
+ (start_index + row) in self.select_rows,
+ item == self.highlight_item
+ )
+
+ # Draw on bottom surface.
+ if bottom_surface_cr:
+ 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):
+ bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ bottom_surface_cr.clip()
+
+ render(
+ bottom_surface_cr,
+ gtk.gdk.Rectangle(render_x,
+ render_y - int(vadjust.get_value()) - int(vadjust.get_page_size() - self.mask_bound_height),
+ render_width,
+ render_height),
+ (start_index + row) in self.select_rows,
+ item == self.highlight_item
+ )
+
+ with cairo_state(cr):
+ # Don't allowed list item draw out of cell rectangle.
+ cr.rectangle(render_x, render_y, render_width, render_height)
+ cr.clip()
+
+ # Render cell.
+ render(cr, gtk.gdk.Rectangle(render_x, render_y, render_width, render_height),
+ (start_index + row) in self.select_rows,
+ item == self.highlight_item)
+
+ # Draw alpha mask on top surface.
+ if top_surface:
+ i = 0
+ while (i <= self.mask_bound_height):
+ with cairo_state(cr):
+ cr.rectangle(rect.x, vadjust.get_value() + self.title_offset_y + i, rect.width, 1)
+ cr.clip()
+ cr.set_source_surface(
+ top_surface,
+ 0,
+ vadjust.get_value() + self.title_offset_y
+ )
+ cr.paint_with_alpha(math.sin(i * math.pi / 2 / self.mask_bound_height))
+
+ i += 1
+
+ # Draw alpha mask on bottom surface.
+ if bottom_surface:
+ i = 0
+ while (i <= self.mask_bound_height):
+ with cairo_state(cr):
+ cr.rectangle(rect.x, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height + i, rect.width, 1)
+ cr.clip()
+ cr.set_source_surface(
+ bottom_surface,
+ 0,
+ vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height
+ )
+ cr.paint_with_alpha(1.0 - (math.sin(i * math.pi / 2 / self.mask_bound_height)))
+
+ i += 1
+
+ def draw_items_row(self, cr, offset_x, viewport, render_offset_y=0):
+ # Draw hover row.
+ highlight_row = None
+ if self.highlight_item:
+ highlight_row = self.highlight_item.get_index()
+
+ if self.hover_row != None and not self.hover_row in self.select_rows and self.hover_row != highlight_row:
+ self.draw_item_hover(
+ cr,
+ offset_x,
+ self.title_offset_y + self.hover_row * self.item_height - render_offset_y,
+ viewport.allocation.width,
+ self.item_height)
+
+ # Draw select rows.
+ for select_row in self.select_rows:
+ if select_row != highlight_row:
+ self.draw_item_select(
+ cr,
+ offset_x,
+ self.title_offset_y + select_row * self.item_height - render_offset_y,
+ viewport.allocation.width,
+ self.item_height)
+
+ # Draw highlight row.
+ if self.highlight_item:
+ self.draw_item_highlight(
+ cr,
+ offset_x,
+ self.title_offset_y + self.highlight_item.get_index() * self.item_height - render_offset_y,
+ viewport.allocation.width,
+ self.item_height)
+
def motion_list_view(self, widget, event):
'''
Internal callback for `motion-notify-event` signal.
try:
yield
except Exception, e:
- print 'with an cairo error %s' % e
+ print 'function keep_select_status got error %s' % e
+ traceback.print_exc(file=sys.stdout)
+
else:
# Restore select status.
if start_select_item != None or select_items != []:
remove_items = []
for row in self.select_rows:
remove_items.append(self.items[row])
+
+ self.delete_items(remove_items)
- if remove_items != []:
- # Init select row.
- self.start_select_row = None
- self.select_rows = []
- cache_remove_items = []
+ def delete_items(self, remove_items):
+ '''
+ Delete given items.
+
+ @param items: Items need to remove.
+ '''
+ # Init select row.
+ self.start_select_row = None
+ self.select_rows = []
+ cache_remove_items = []
+
+ # Remove select items.
+ for remove_item in remove_items:
+ cache_remove_items.append(remove_item)
+ self.items.remove(remove_item)
- # Remove select items.
- for remove_item in remove_items:
- cache_remove_items.append(remove_item)
- self.items.remove(remove_item)
-
- # Emit remove items signal.
- self.emit("delete-select-items", cache_remove_items)
-
- # Update item index.
- self.update_item_index()
+ # Emit remove items signal.
+ self.emit("delete-select-items", cache_remove_items)
- # Update vertical adjustment.
- self.update_vadjustment()
+ # Update item index.
+ self.update_item_index()
- # Redraw.
- self.queue_draw()
+ # Update vertical adjustment.
+ self.update_vadjustment()
+
+ # Redraw.
+ self.queue_draw()
def update_vadjustment(self):
'''
deepin-ui-1.0git20120817.tar.gz/dtk/ui/locales.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/locales.py
Changed
from utils import get_parent_dir
import gettext
import os
+import sys
+import traceback
LOCALE_DIR=os.path.join(get_parent_dir(__file__, 2), "locale")
if not os.path.exists(LOCALE_DIR):
gettext.textdomain("deepin-ui")
_ = gettext.gettext
except Exception, e:
+ print "module locales got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
_ = lambda i : i
deepin-ui-1.0git20120817.tar.gz/dtk/ui/menu.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/menu.py
Changed
elif isinstance(event_widget, Menu):
menu_item = event_widget.get_menu_item_at_coordinate(event.get_root_coords())
if menu_item:
- menu_item.item_box.event(event)
+ if menu_item.item_box.state != gtk.STATE_INSENSITIVE:
+ menu_item.item_box.event(event)
else:
- event_widget.event(event)
- menu_grab_window_focus_out()
+ if event_widget.state != gtk.STATE_INSENSITIVE:
+ event_widget.event(event)
+ menu_grab_window_focus_out()
def menu_grab_window_motion_notify(widget, event):
global menu_active_item
item_padding_x=6,
item_padding_y=3,
shadow_visible=True,
- menu_min_width=130):
+ menu_min_width=130,
+ menu_item_select_color=None):
'''
Initialize Menu class.
- @param items: A list of item, item format: (item_icon, itemName, item_node).
+ @param items: A list of item, item format: ((item_normal_dpixbuf, item_hover_dpixbuf, item_disable_dpixbuf), item_name, item_node).
@param is_root_menu: Default is False for submenu, you should set it as True if you build root menu.
@param select_scale: Default is False, it will use parant's width if it set True.
@param x_align: Horizontal alignment value.
global root_menus
# Init.
- Window.__init__(self, shadow_visible=shadow_visible, window_type=gtk.WINDOW_POPUP)
+ Window.__init__(self,
+ shadow_visible=shadow_visible,
+ window_type=gtk.WINDOW_POPUP,
+ shadow_radius=6)
self.set_can_focus(True) # can focus to response key-press signal
self.draw_mask = self.draw_menu_mask
self.is_root_menu = is_root_menu
self.item_padding_x = item_padding_x
self.item_padding_y = item_padding_y
self.menu_min_width = menu_min_width
+ self.menu_item_select_color = menu_item_select_color
# Init menu window.
self.set_skip_pager_hint(True)
for item in items:
menu_item = MenuItem(
- item, font_size, self.select_scale, self.show_submenu, self.hide_submenu,
- self.get_root_menu, self.get_menu_items,
- icon_width, icon_height,
- have_submenu, submenu_width, submenu_height,
- padding_x, padding_y,
- item_padding_x, item_padding_y, self.menu_min_width)
+ item,
+ font_size,
+ self.select_scale,
+ self.show_submenu,
+ self.hide_submenu,
+ self.get_root_menu,
+ self.get_menu_items,
+ icon_width,
+ icon_height,
+ have_submenu,
+ submenu_width,
+ submenu_height,
+ padding_x,
+ padding_y,
+ item_padding_x,
+ item_padding_y,
+ self.menu_min_width,
+ self.menu_item_select_color)
self.menu_items.append(menu_item)
self.item_box.pack_start(menu_item.item_box, False, False)
return self.root_menu
else:
return self
+
+ def set_menu_item_sensitive_by_index(self, index, sensitive):
+ '''
+ Set sensitive state of menu item with given index.
+
+ @param index: Menu item index.
+ @return: Return True if set success, else return False, index out of bound will cause return False.
+ '''
+ if 0 <= index < len(self.menu_items):
+ self.menu_items[index].item_box.set_sensitive(sensitive)
+ return True
+ else:
+ return False
+
gobject.type_register(Menu)
class MenuItem(object):
submenu_width,
submenu_height,
menu_padding_x, menu_padding_y,
- item_padding_x, item_padding_y, min_width):
+ item_padding_x, item_padding_y, min_width,
+ menu_item_select_color=None):
'''
Initialize MenuItem class.
- @param item: item format: (item_icon, itemName, item_node).
+ @param item: item format: ((item_normal_dpixbuf, item_hover_dpixbuf, item_disable_dpixbuf), item_name, item_node).
@param font_size: Menu font size.
@param select_scale: Default is False, it will use parant's width if it set True.
@param show_submenu_callback: Callback when show submenus.
self.submenu_active = False
self.min_width = min_width
self.arrow_padding_x = 5
+ self.menu_item_select_color = menu_item_select_color
# Create.
if self.item:
(item_icons, item_content, item_node) = self.item[0:3]
# Draw select effect.
- if self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
+ if widget.state == gtk.STATE_INSENSITIVE:
+ # Set font color.
+ font_color = ui_theme.get_color("menu_disable_font").get_color()
+ elif self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
# Draw background.
+ if self.menu_item_select_color:
+ item_select_color = self.menu_item_select_color
+ else:
+ item_select_color = ui_theme.get_shadow_color("menu_item_select").get_color_info()
draw_vlinear(cr, rect.x, rect.y, rect.width, rect.height,
- ui_theme.get_shadow_color("menu_item_select").get_color_info(),
+ item_select_color,
MENU_ITEM_RADIUS)
# Set font color.
pixbuf = None
pixbuf_width = 0
if item_icons:
- (item_normal_dpixbuf, item_hover_dpixbuf) = item_icons
- if self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
+ (item_normal_dpixbuf, item_hover_dpixbuf, item_disable_dpixbuf) = item_icons
+ if widget.state == gtk.STATE_INSENSITIVE:
+ pixbuf = item_disable_dpixbuf.get_pixbuf()
+ elif self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
if item_hover_dpixbuf == None:
pixbuf = item_normal_dpixbuf.get_pixbuf()
else:
# Draw submenu arrow.
if isinstance(item_node, Menu):
- if self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
+ if widget.state == gtk.STATE_INSENSITIVE:
+ submenu_pixbuf = ui_theme.get_pixbuf("menu/arrow_disable.png").get_pixbuf()
+ elif self.submenu_active or widget.state in [gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE]:
submenu_pixbuf = ui_theme.get_pixbuf("menu/arrow_hover.png").get_pixbuf()
else:
submenu_pixbuf = ui_theme.get_pixbuf("menu/arrow_normal.png").get_pixbuf()
(item_icons, item_content, item_node) = self.item[0:3]
if isinstance(item_node, Menu):
- menu_window = self.item_box.get_toplevel()
- (menu_window_x, menu_window_y) = get_widget_root_coordinate(menu_window, WIDGET_POS_RIGHT_CENTER)
- (item_x, item_y) = get_widget_root_coordinate(self.item_box)
- self.show_submenu_callback(
- item_node,
- (menu_window_x - menu_window.shadow_radius,
- item_y - widget.get_allocation().height - menu_window.shadow_radius),
- self.item_box.allocation.height + menu_window.shadow_radius)
-
- self.submenu_active = True
+ if widget.state != gtk.STATE_INSENSITIVE:
+ menu_window = self.item_box.get_toplevel()
+ (menu_window_x, menu_window_y) = get_widget_root_coordinate(menu_window, WIDGET_POS_RIGHT_CENTER)
+ (item_x, item_y) = get_widget_root_coordinate(self.item_box)
+ self.show_submenu_callback(
+ item_node,
+ (menu_window_x - menu_window.shadow_radius,
+ item_y - widget.get_allocation().height - menu_window.shadow_radius),
+ self.item_box.allocation.height + menu_window.shadow_radius)
+
+ self.submenu_active = True
else:
self.hide_submenu_callback()
deepin-ui-1.0git20120817.tar.gz/dtk/ui/mplayer_window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/mplayer_window.py
Changed
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from constant import EDGE_DICT
from draw import draw_window_shadow, draw_window_frame
from skin_config import skin_config
+from window_base import WindowBase
from theme import ui_theme
import cairo
import gobject
import gtk
-from utils import (cairo_state, propagate_expose, resize_window,
- set_cursor, get_event_root_coords, enable_shadow,
- is_double_click, move_window)
+from utils import (cairo_state, propagate_expose, set_cursor,
+ get_event_root_coords,
+ enable_shadow)
-class MplayerWindow(gtk.Window):
+class MplayerWindow(WindowBase):
"""
Special Window class for mplayer.
@param window_type: A flag of type gtk._gtk.WindowType, which indicates the type of the window. By default, it's gtk.WINDOW_TOPLEVEL.
"""
# Init.
- gtk.Window.__init__(self, window_type)
+ WindowBase.__init__(self, window_type)
+ self.shadow_radius = shadow_radius
+ self.enable_resize = enable_resize
+ self.background_color = (0, 0, 0, 0)
+ # FIXME: Because mplayer don't allowed window redirect colormap to screen.
+ # We build shadow window to emulate it, but shadow's visual effect
+ # is not good enough, so we disable shadow temporary for future fixed.
+ self.shadow_visible = False
+ if enable_shadow(self) and self.shadow_visible:
+ self.window_shadow.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
+
+ self.init()
+
+ def init(self):
skin_config.wrap_skin_window(self)
self.set_decorated(False)
self.add_events(gtk.gdk.ALL_EVENTS_MASK)
- self.shadow_radius = shadow_radius
self.frame_radius = 2
self.shadow_is_visible = True
- self.enable_resize = enable_resize
self.window_frame = gtk.VBox()
self.add(self.window_frame)
self.shape_flag = True
- # FIXME: Because mplayer don't allowed window redirect colormap to screen.
- # We build shadow window to emulate it, but shadow's visual effect
- # is not good enough, so we disable shadow temporary for future fixed.
- self.shadow_visible = False
-
if enable_shadow(self) and self.shadow_visible:
self.shadow_padding = self.shadow_radius - self.frame_radius
else:
self.window_shadow = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window_shadow.add_events(gtk.gdk.ALL_EVENTS_MASK)
self.window_shadow.set_decorated(False)
- self.window_shadow.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
self.window_shadow.set_transient_for(self)
self.window_shadow.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_MENU)
x, y, w, h = rect.x, rect.y, rect.width, rect.height
# Clear color to transparent window.
- cr.set_source_rgba(0.0, 0.0, 0.0, 0.0)
+ cr.set_source_rgba(*self.background_color)
cr.set_operator(cairo.OPERATOR_SOURCE)
cr.paint()
# Draw background.
with cairo_state(cr):
- cr.rectangle(x + 2, y, w - 4, 1)
- cr.rectangle(x + 1, y + 1, w - 2, 1)
- cr.rectangle(x, y + 2, w, h - 4)
- cr.rectangle(x + 2, y + h - 1, w - 4, 1)
- cr.rectangle(x + 1, y + h - 2, w - 2, 1)
-
- cr.clip()
+ if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
+ cr.rectangle(x + 2, y, w - 4, 1)
+ cr.rectangle(x + 1, y + 1, w - 2, 1)
+ cr.rectangle(x, y + 2, w, h - 4)
+ cr.rectangle(x + 2, y + h - 1, w - 4, 1)
+ cr.rectangle(x + 1, y + h - 2, w - 2, 1)
+
+ cr.clip()
skin_config.render_background(cr, self, x, y)
self.draw_mask(cr, x, y, w, h)
# Draw window frame.
- draw_window_frame(cr, x, y, w, h,
- ui_theme.get_alpha_color("window_frame_outside_1"),
- ui_theme.get_alpha_color("window_frame_outside_2"),
- ui_theme.get_alpha_color("window_frame_outside_3"),
- ui_theme.get_alpha_color("window_frame_inside_1"),
- ui_theme.get_alpha_color("window_frame_inside_2"),
- )
+ if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
+ draw_window_frame(cr, x, y, w, h,
+ ui_theme.get_alpha_color("window_frame_outside_1"),
+ ui_theme.get_alpha_color("window_frame_outside_2"),
+ ui_theme.get_alpha_color("window_frame_outside_3"),
+ ui_theme.get_alpha_color("window_frame_inside_1"),
+ ui_theme.get_alpha_color("window_frame_inside_2"),
+ )
# Propagate expose.
propagate_expose(widget, event)
return True
- def draw_mask(self, cr, x, y, w, h):
- '''
- Draw mask interface, you should implement it you own.
-
- @param cr: Cairo context.
- @param x: X coordinate of draw area.
- @param y: Y coordinate of draw area.
- @param w: Width of draw area.
- @param h: Height of draw area.
- '''
- pass
-
def set_window_shape(self, shape_flag):
"""
Enable window shape.
@param widget: A widget of type gtk.Widget.
@param rect: The bounding region of the window.
"""
- if rect.width > 0 and rect.height > 0:
+ if widget.window != None and widget.get_has_window() and rect.width > 0 and rect.height > 0:
# Init.
x, y, w, h = rect.x, rect.y, rect.width, rect.height
bitmap = gtk.gdk.Pixmap(None, w, h, 1)
if not self.shape_flag:
# Don't clip corner when window is fullscreen state.
cr.rectangle(x, y, w, h)
- elif self.window != None and self.window.get_state() == gtk.gdk.WINDOW_STATE_FULLSCREEN:
+ elif self.window.get_state() in [gtk.gdk.WINDOW_STATE_FULLSCREEN, gtk.gdk.WINDOW_STATE_MAXIMIZED]:
# Don't clip corner when window is fullscreen state.
cr.rectangle(x, y, w, h)
else:
# Redraw whole window.
self.queue_draw()
-
+
if enable_shadow(self) and self.shadow_visible:
self.window_shadow.queue_draw()
if enable_shadow(self) and self.shadow_visible:
self.window_shadow.show_all()
- def is_disable_window_maximized(self):
- """
- An interface which indicates whether the window could be maximized, you should implement this function you own.
- @return: Always return False.
- """
- return False
-
def monitor_window_state(self, widget, event):
"""
Monitor window state, add shadow when window at maximized or fullscreen status. Otherwise hide shadow.
@param widget: The window of type gtk.Widget.
@param event: The event of gtk.gdk.Event.
"""
- window_state = self.window.get_state()
- if window_state in [gtk.gdk.WINDOW_STATE_MAXIMIZED, gtk.gdk.WINDOW_STATE_FULLSCREEN]:
- self.hide_shadow()
-
- if self.is_disable_window_maximized():
- self.unmaximize()
- else:
- self.show_shadow()
-
- self.adjust_window_shadow(widget, event)
-
- def min_window(self):
- """
- Minimize the window. Make it iconified.
- """
- self.iconify()
-
- def toggle_max_window(self):
- """
- Toggle the window size between maximized size and normal size.
- """
- window_state = self.window.get_state()
- if window_state == gtk.gdk.WINDOW_STATE_MAXIMIZED:
- self.unmaximize()
- else:
- self.maximize()
-
- def toggle_fullscreen_window(self):
- """
- Toggle the window between fullscreen mode and normal size.
- """
- window_state = self.window.get_state()
- if window_state == gtk.gdk.WINDOW_STATE_FULLSCREEN:
- self.unfullscreen()
- else:
- self.fullscreen()
-
- def close_window(self):
- """
- Close the window. Send the destroy signal to the program.
-
- @return: Always return False.
- """
- # Hide window immediately when user click close button,
- # user will feeling this software very quick, ;p
- self.hide_all()
-
- self.emit("destroy")
-
- return False
-
- def resize_window(self, widget, event):
- """
- Resize the window.
-
- @param widget: The window of type gtk.Widget.
- @param event: A signal of type gtk.gdk.Event.
- """
- if self.enable_resize:
- edge = self.get_edge()
- if edge != None:
- resize_window(self, event, self, edge)
-
- def add_move_event(self, widget):
- """
- Add move event callback.
-
- @param widget: A widget of type gtk.Widget.
- """
- widget.connect("button-press-event", lambda w, e: move_window(w, e, self))
-
- def add_toggle_event(self, widget):
- """
- Add toggle event callback.
-
- @param widget: A widget of type gtk.Widget.
- """
- widget.connect("button-press-event", self.double_click_window)
+ super(MplayerWindow, self).monitor_window_state(widget, event)
- def double_click_window(self, widget, event):
- """
- Internal function to double click event handler of the window. It will maximize the window.
-
- @param widget: A widget of type gtk.Widget.
- @param event: A event of type gtk.gdk.Event.
-
- @return: Always return False.
- """
- if is_double_click(event):
- self.toggle_max_window()
-
- return False
+ self.adjust_window_shadow(widget, event)
def motion_notify(self, widget, event):
"""
self.cursor_type = self.get_cursor_type(event)
set_cursor(self.window_shadow, self.cursor_type)
- def get_edge(self):
- """
- Get the edge which the cursor is on, according to the cursor type.
-
- @return: If there is a corresponding cursor type, return an instance of gtk.gdk.WindowEdge, else return None.
- """
- if EDGE_DICT.has_key(self.cursor_type):
- return EDGE_DICT[self.cursor_type]
- else:
- return None
-
def get_cursor_type(self, event):
"""
Get the cursor position.
wh = rect.height
# Return cursor position.
- if wx <= ex <= wx + self.shadow_padding:
- if wy <= ey <= wy + self.shadow_padding * 2:
- return gtk.gdk.TOP_LEFT_CORNER
- elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
- return gtk.gdk.BOTTOM_LEFT_CORNER
- elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
- return gtk.gdk.LEFT_SIDE
- else:
- return None
- elif wx + ww - self.shadow_padding <= ex <= wx + ww:
- if wy <= ey <= wy + self.shadow_padding * 2:
- return gtk.gdk.TOP_RIGHT_CORNER
- elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
- return gtk.gdk.BOTTOM_RIGHT_CORNER
- elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
- return gtk.gdk.RIGHT_SIDE
- else:
- return None
- elif wx + self.shadow_padding < ex < wx + ww - self.shadow_padding:
- if wy <= ey <= wy + self.shadow_padding:
- return gtk.gdk.TOP_SIDE
- elif wy + wh - self.shadow_padding <= ey <= wy + wh:
- return gtk.gdk.BOTTOM_SIDE
- else:
- return None
- else:
- return None
+ return self.get_cursor_type_with_coordinate(ex, ey, wx, wy, ww, wh)
def get_shadow_size(self):
"""
gobject.type_register(MplayerWindow)
+class EmbedMplayerWindow(gtk.Plug):
+ def __init__(self,
+ enable_resize=False,
+ shadow_radius=6,
+ ):
+ gtk.Plug.__init__(self, 0)
+ self.shadow_radius = shadow_radius
+ self.enable_resize = enable_resize
+ self.background_color = (1, 1, 1, 0.93)
+ # FIXME: Because mplayer don't allowed window redirect colormap to screen.
+ # We build shadow window to emulate it, but shadow's visual effect
+ # is not good enough, so we disable shadow temporary for future fixed.
+ self.shadow_visible = False
+
+ self.init()
+
+# Mix-in MplayerWindow methods (except __init__) to EmbedMplayerWindow
+EmbedMplayerWindow.__bases__ += (MplayerWindow,)
+
+gobject.type_register(EmbedMplayerWindow)
+
if __name__ == "__main__":
window = MplayerWindow()
window.connect("destroy", lambda w: gtk.main_quit())
deepin-ui-1.0git20120817.tar.gz/dtk/ui/new_treeview.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/new_treeview.py
Changed
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+import sys
+import traceback
+from contextlib import contextmanager
import gtk
import gobject
+import cairo
+from threads import post_gui
+from draw import draw_vlinear, draw_pixbuf, draw_text
+from theme import ui_theme
+from keymap import has_ctrl_mask, has_shift_mask, get_keyevent_name
+from cache_pixbuf import CachePixbuf
+from utils import (cairo_state, get_window_shadow_size, get_event_coords,
+ container_remove_all, get_same_level_widgets,
+ is_left_button, is_double_click, is_single_click, remove_timeout_id)
+from skin_config import skin_config
from scrolled_window import ScrolledWindow
+import copy
+import pango
+import math
+import threading as td
-class TreeView(ScrolledWindow):
+class SortThread(td.Thread):
+
+ def __init__(self, sort_action, render_action):
+ td.Thread.__init__(self)
+ self.setDaemon(True)
+ self.sort_action = sort_action
+ self.render_action = render_action
+
+ def run(self):
+ self.render_action(*self.sort_action())
+
+class TitleBox(gtk.Button):
+
+ def __init__(self, title, index, last_one):
+ gtk.Button.__init__(self)
+ self.title = title
+ self.index = index
+ self.last_one = last_one
+ self.cache_pixbuf = CachePixbuf()
+ self.sort_ascending = False
+ self.focus_in = False
+
+ self.connect("expose-event", self.expose_title_box)
+
+ def expose_title_box(self, widget, event):
+ # Init.
+ cr = widget.window.cairo_create()
+ rect = widget.allocation
+ x, y, w, h = rect.x, rect.y, rect.width, rect.height
+
+ # Draw background.
+ if widget.state == gtk.STATE_NORMAL:
+ header_pixbuf = ui_theme.get_pixbuf("listview/header_normal.png").get_pixbuf()
+ elif widget.state == gtk.STATE_PRELIGHT:
+ header_pixbuf = ui_theme.get_pixbuf("listview/header_hover.png").get_pixbuf()
+ elif widget.state == gtk.STATE_ACTIVE:
+ header_pixbuf = ui_theme.get_pixbuf("listview/header_press.png").get_pixbuf()
+
+ self.cache_pixbuf.scale(header_pixbuf, w, h)
+ draw_pixbuf(cr, self.cache_pixbuf.get_cache(), x, y)
+
+ # Draw title.
+ if not self.last_one:
+ split_pixbuf = ui_theme.get_pixbuf("listview/split.png").get_pixbuf()
+ draw_pixbuf(cr,
+ split_pixbuf,
+ x + w - split_pixbuf.get_width() + 1,
+ y)
+
+ # Draw title.
+ draw_text(cr, self.title, x, y, w, h,
+ alignment=pango.ALIGN_CENTER)
+
+ # Draw sort icon.
+ if self.focus_in:
+ if self.sort_ascending:
+ sort_pixbuf = ui_theme.get_pixbuf("listview/sort_ascending.png").get_pixbuf()
+ else:
+ sort_pixbuf = ui_theme.get_pixbuf("listview/sort_descending.png").get_pixbuf()
+
+ draw_pixbuf(cr, sort_pixbuf,
+ x + w - sort_pixbuf.get_width(),
+ y + (h - sort_pixbuf.get_height()) / 2)
+
+ return True
+
+ def toggle_sort(self, sort_action, render_action):
+ self.sort_ascending = not self.sort_ascending
+
+ for title_box in get_same_level_widgets(self):
+ title_box.focus_in = title_box == self
+ title_box.queue_draw()
+
+ SortThread(lambda : sort_action(self.index), render_action).start()
+
+class TreeView(gtk.VBox):
'''
TreeView widget.
'''
+
+ AUTO_SCROLL_HEIGHT = 24
def __init__(self,
items=[],
- sort_methods=[],
- row_normal_height=None,
- row_select_height=None,
drag_data=None,
+ enable_hover=True,
+ enable_highlight=True,
enable_multiple_select=True,
enable_drag_drop=True,
drag_icon_pixbuf=None,
start_drag_offset=50,
- right_space=2,
+ mask_bound_height=24,
+ right_space=0,
top_bottom_space=3
):
'''
Initialize TreeView class.
'''
# Init.
- ScrolledWindow.__init__(self, right_space, top_bottom_space)
+ gtk.VBox.__init__(self)
+ self.visible_items = []
+ self.titles = None
+ self.sort_methods = None
+ self.drag_data = drag_data
+ self.enable_hover = enable_hover
+ self.enable_highlight = enable_highlight
+ self.enable_multiple_select = enable_multiple_select
+ self.enable_drag_drop = enable_drag_drop
+ self.drag_icon_pixbuf = drag_icon_pixbuf
+ self.start_drag_offset = start_drag_offset
+ self.mask_bound_height = mask_bound_height
+ self.start_drag = False
+ self.start_select_row = None
+ self.select_rows = []
+ self.press_item = None
+ self.press_in_select_rows = None
+ self.left_button_press = False
+ self.press_ctrl = False
+ self.press_shift = False
+ self.single_click_row = None
+ self.double_click_row = None
+ self.auto_scroll_id = None
+ self.auto_scroll_delay = 70 # milliseconds
+ self.drag_item = None
+ self.drag_reference_row = None
+ self.column_widths = []
+ self.sort_action_id = 0
+
+ # Init redraw.
+ self.redraw_request_list = []
+ self.redraw_delay = 100 # update redraw item delay, milliseconds
+ gtk.timeout_add(self.redraw_delay, self.update_redraw_request_list)
+
+ # Init widgets.
+ self.title_box = gtk.HBox()
+
self.draw_area = gtk.DrawingArea()
+ self.draw_area.add_events(gtk.gdk.ALL_EVENTS_MASK)
+ self.draw_area.set_can_focus(True)
self.draw_align = gtk.Alignment()
self.draw_align.set(0.5, 0.5, 1, 1)
+ self.scrolled_window = ScrolledWindow(right_space, top_bottom_space)
+
+ # Connect widgets.
self.draw_align.add(self.draw_area)
- self.add_child(self.draw_align)
+ self.scrolled_window.add_child(self.draw_align)
+ self.pack_start(self.title_box, False, False)
+ self.pack_start(self.scrolled_window, True, True)
+
+ # Handle signals.
+ self.draw_area.connect("expose-event", lambda w, e: self.expose_tree_view(w))
+ self.draw_area.connect("button-press-event", self.button_press_tree_view)
+ self.draw_area.connect("button-release-event", self.button_release_tree_view)
+ self.draw_area.connect("motion-notify-event", self.motion_tree_view)
+ self.draw_area.connect("key-press-event", self.key_press_tree_view)
+ self.draw_area.connect("key-release-event", self.key_release_tree_view)
+ self.draw_area.connect("size-allocate", self.size_allocated_tree_view)
+
+ # Add items.
+ self.add_items(items)
+
+ # Init keymap.
+ self.keymap = {
+ "Home" : self.select_first_item,
+ "End" : self.select_last_item,
+ "Page_Up" : self.scroll_page_up,
+ "Page_Down" : self.scroll_page_down,
+ "Up" : self.select_prev_item,
+ "Down" : self.select_next_item,
+ "Left" : self.unexpand_item,
+ "Right" : self.expand_item,
+ "Shift + Up" : self.select_to_prev_item,
+ "Shift + Down" : self.select_to_next_item,
+ "Shift + Home" : self.select_to_first_item,
+ "Shift + End" : self.select_to_last_item,
+ "Ctrl + a" : self.select_all_items,
+ "Delete" : self.delete_select_items,
+ }
+
+ def expand_item(self):
+ if len(self.select_rows) == 1:
+ self.visible_items[self.select_rows[0]].expand()
+
+ def unexpand_item(self):
+ if len(self.select_rows) == 1:
+ select_item = self.visible_items[self.select_rows[0]]
+ if select_item.is_expand:
+ select_item.unexpand()
+ else:
+ if select_item.parent_item != None:
+ new_row = select_item.parent_item.row_index
+ self.start_select_row = new_row
+ self.set_select_rows([new_row])
+
+ # Scroll viewport make sure preview row in visible area.
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ new_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:new_row]))
+ if offset_y > new_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ new_row_height_count - self.visible_items[new_row].get_height()))
+
+
+ def sort_column(self, sort_column_index):
+ # Update sort action id.
+ self.sort_action_id += 1
+
+ # Save current action id to return.
+ sort_action_id = self.sort_action_id
+
+ # Split items with different column index.
+ level_items = []
+ column_index = None
+ for item in self.visible_items:
+ if item.column_index != column_index:
+ level_items.append((item.column_index, item.parent_item, [item]))
+ column_index = item.column_index
+ else:
+ if len(level_items) == 0:
+ level_items.append((item.column_index, item.parent_item, [item]))
+ else:
+ level_items[-1][2].append(item)
+
+ # Connect all toplevel items to sort.
+ toplevel_items = []
+ child_items = []
+ for item in level_items:
+ (column_index, parent_item, items) = item
+ if column_index == 0:
+ toplevel_items += items
+ else:
+ child_items.append(item)
+ level_items = [(0, None, toplevel_items)] + child_items
+
+ # Sort items with different column index to make sure parent item sort before child item.
+ level_items = sorted(level_items, key=lambda (column_index, parent_item, items): column_index)
+
+ # Sort all items.
+ result_items = []
+ for (column_index, parent_item, items) in level_items:
+ # Do sort action.
+ sort_items = self.sort_methods[sort_column_index](
+ items,
+ self.title_box.get_children()[sort_column_index].sort_ascending
+ )
+
+ # If column index is 0, insert at last position.
+ if column_index == 0:
+ result_items += sort_items
+ # Insert after parent item if column index is not 0 (child items).
+ else:
+ split_index = result_items.index(parent_item) + 1
+ result_items = result_items[0:split_index] + sort_items + result_items[split_index::]
+
+ return (result_items, sort_action_id)
+
+ @post_gui
+ def render_sort_column(self, items, sort_action_id):
+ if sort_action_id == self.sort_action_id:
+ self.add_items(items, None, True)
+ else:
+ print "render_sort_column: drop old sort result!"
+
+ def set_column_titles(self, titles, sort_methods):
+ if titles != None and sort_methods != None:
+ self.titles = titles
+ self.sort_methods = sort_methods
+
+ container_remove_all(self.title_box)
+
+ for (index, title) in enumerate(self.titles):
+ title_box = TitleBox(title, index, index == len(self.titles) - 1)
+ title_box.connect("button-press-event", lambda w, e: w.toggle_sort(self.sort_column, self.render_sort_column))
+ self.title_box.pack_start(title_box)
+ else:
+ self.titles = None
+ self.sort_methods = None
+
+ container_remove_all(self.title_box)
+
+ def set_select_rows(self, rows):
+ for select_row in self.select_rows:
+ self.visible_items[select_row].unselect()
+
+ self.select_rows = rows
+
+ if rows == []:
+ self.start_select_row = None
+ else:
+ for select_row in self.select_rows:
+ self.visible_items[select_row].select()
+
+ def select_first_item(self):
+ '''
+ Select first item.
+ '''
+ if len(self.visible_items) > 0:
+ # Update select rows.
+ self.start_select_row = 0
+ self.set_select_rows([0])
+
+ # Scroll to top.
+ vadjust = self.scrolled_window.get_vadjustment()
+ vadjust.set_value(vadjust.get_lower())
+
+ def select_last_item(self):
+ '''
+ Select last item.
+ '''
+ if len(self.visible_items) > 0:
+ # Update select rows.
+ last_row = len(self.visible_items) - 1
+ self.start_select_row = last_row
+ self.set_select_rows([last_row])
+
+ # Scroll to bottom.
+ vadjust = self.scrolled_window.get_vadjustment()
+ vadjust.set_value(vadjust.get_upper() - vadjust.get_page_size())
+
+ def scroll_page_up(self):
+ '''
+ Scroll page up.
+ '''
+ if self.select_rows == []:
+ # Select row.
+ vadjust = self.scrolled_window.get_vadjustment()
+ select_y = max(vadjust.get_value() - vadjust.get_page_size(), 0)
+ select_row = self.get_row_with_coordinate(select_y)
+
+ # Update select row.
+ self.start_select_row = select_row
+ self.set_select_rows([select_row])
+
+ # Scroll viewport make sure preview row in visible area.
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ if select_row == 0:
+ vadjust.set_value(vadjust.get_lower())
+ else:
+ item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:select_row]))
+ if offset_y > item_height_count:
+ vadjust.set_value(max(item_height_count - self.visible_items[select_row].get_height(), vadjust.get_lower()))
+ else:
+ if self.start_select_row != None:
+ # Record offset before scroll.
+ vadjust = self.scrolled_window.get_vadjustment()
+
+ item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:self.start_select_row]))
+ scroll_offset_y = item_height_count - vadjust.get_value()
+
+ # Get select row.
+ select_y = max(item_height_count - vadjust.get_page_size(), 0)
+ select_row = self.get_row_with_coordinate(select_y)
+
+ # Update select row.
+ self.start_select_row = select_row
+ self.set_select_rows([select_row])
+
+ # Scroll viewport make sure preview row in visible area.
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ if select_row == 0:
+ vadjust.set_value(vadjust.get_lower())
+ else:
+ item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:select_row]))
+ if offset_y > item_height_count:
+ vadjust.set_value(max(item_height_count - scroll_offset_y,
+ vadjust.get_lower()))
+ else:
+ print "scroll_page_up : impossible!"
+
+
+ def scroll_page_down(self):
+ '''
+ Scroll page down.
+ '''
+ if self.select_rows == []:
+ # Select row.
+ vadjust = self.scrolled_window.get_vadjustment()
+ select_y = min(vadjust.get_value() + vadjust.get_page_size(), vadjust.get_upper())
+ select_row = self.get_row_with_coordinate(select_y)
+
+ # Update select row.
+ self.start_select_row = select_row
+ self.set_select_rows([select_row])
+
+ # Scroll viewport make sure preview row in visible area.
+ max_y = vadjust.get_upper() - vadjust.get_page_size()
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(self.start_select_row + 1)]))
+ if offset_y + vadjust.get_page_size() < item_height_count:
+ vadjust.set_value(min(max_y, item_height_count))
+ else:
+ if self.start_select_row != None:
+ # Record offset before scroll.
+ vadjust = self.scrolled_window.get_vadjustment()
+ item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(self.start_select_row + 1)]))
+ scroll_offset_y = item_height_count - vadjust.get_value()
+
+ # Get select row.
+ select_y = min(item_height_count + vadjust.get_page_size(), vadjust.get_upper())
+ select_row = self.get_row_with_coordinate(select_y)
+
+ # Update select row.
+ self.start_select_row = select_row
+ self.set_select_rows([select_row])
+
+ # Scroll viewport make sure preview row in visible area.
+ max_y = vadjust.get_upper() - vadjust.get_page_size()
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ item_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(self.start_select_row + 1)]))
+ if offset_y + vadjust.get_page_size() < item_height_count:
+ vadjust.set_value(min(max_y, item_height_count - scroll_offset_y))
+ else:
+ print "scroll_page_down : impossible!"
+
+ def select_prev_item(self):
+ '''
+ Select preview item.
+ '''
+ if self.select_rows == []:
+ self.select_first_item()
+ else:
+ # Get preview row.
+ prev_row = max(0, self.start_select_row - 1)
+
+ # Redraw when preview row is not current row.
+ if prev_row != self.start_select_row:
+ # Select preview row.
+ self.start_select_row = prev_row
+ self.set_select_rows([prev_row])
+
+ # Scroll viewport make sure preview row in visible area.
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row]))
+ if offset_y > prev_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ prev_row_height_count - self.visible_items[prev_row].get_height()))
+ elif offset_y + vadjust.get_page_size() < prev_row_height_count:
+ vadjust.set_value(min(vadjust.get_upper() - vadjust.get_page_size(),
+ prev_row_height_count - self.visible_items[prev_row].get_height()))
+ elif len(self.select_rows) > 1:
+ # Select preview row.
+ self.start_select_row = prev_row
+ self.set_select_rows([prev_row])
+
+ # Scroll viewport make sure preview row in visible area.
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row]))
+ if offset_y > prev_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ prev_row_height_count - self.visible_items[prev_row].get_height()))
+
+ def select_next_item(self):
+ '''
+ Select next item.
+ '''
+ if self.select_rows == []:
+ self.select_first_item()
+ else:
+ # Get next row.
+ next_row = min(len(self.visible_items) - 1, self.start_select_row + 1)
+
+ # Redraw when next row is not current row.
+ if next_row != self.start_select_row:
+ # Select next row.
+ self.start_select_row = next_row
+ self.set_select_rows([next_row])
+
+ # Scroll viewport make sure next row in visible area.
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:next_row]))
+ 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:
+ vadjust.set_value(max(vadjust.get_lower(),
+ next_row_height_count + self.visible_items[next_row].get_height() - vadjust.get_page_size()))
+ elif len(self.select_rows) > 1:
+ # Select next row.
+ self.start_select_row = next_row
+ self.set_select_rows([next_row])
+
+ # Scroll viewport make sure next row in visible area.
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self)
+ vadjust = self.scrolled_window.get_vadjustment()
+ next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(next_row + 1)]))
+ if offset_y + vadjust.get_page_size() < next_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ next_row_height_count - vadjust.get_page_size()))
+
+ def select_to_prev_item(self):
+ '''
+ Select to preview item.
+ '''
+ if self.select_rows == []:
+ self.select_first_item()
+ elif self.start_select_row != None:
+ if self.start_select_row == self.select_rows[-1]:
+ first_row = self.select_rows[0]
+ if first_row > 0:
+ prev_row = first_row - 1
+ self.set_select_rows([prev_row] + self.select_rows)
+
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row]))
+ if offset_y > prev_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ prev_row_height_count - self.visible_items[prev_row].get_height()))
+ elif self.start_select_row == self.select_rows[0]:
+ last_row = self.select_rows[-1]
+ self.set_select_rows(self.select_rows.remove(last_row))
+
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ prev_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:prev_row]))
+ if offset_y > prev_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ prev_row_height_count - self.visible_items[prev_row].get_height()))
+ else:
+ print "select_to_prev_item : impossible!"
+
+ def select_to_next_item(self):
+ '''
+ Select to next item.
+ '''
+ if self.select_rows == []:
+ self.select_first_item()
+ elif self.start_select_row != None:
+ if self.start_select_row == self.select_rows[0]:
+ last_row = self.select_rows[-1]
+ if last_row < len(self.visible_items) - 1:
+ next_row = last_row + 1
+ self.set_select_rows(self.select_rows + [next_row])
+
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(next_row + 1)]))
+ if offset_y + vadjust.get_page_size() < next_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ next_row_height_count + self.visible_items[next_row].get_height() - vadjust.get_page_size()))
+ elif self.start_select_row == self.select_rows[-1]:
+ first_row = self.select_rows[0]
+ self.set_select_rows(self.select_rows.remove(first_row))
+
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ vadjust = self.scrolled_window.get_vadjustment()
+ next_row_height_count = sum(map(lambda i: i.get_height(), self.visible_items[:(next_row + 1)]))
+ if offset_y + vadjust.get_page_size() < next_row_height_count:
+ vadjust.set_value(max(vadjust.get_lower(),
+ next_row_height_count - vadjust.get_page_size()))
+ else:
+ print "select_to_next_item : impossible!"
+
+ def select_to_first_item(self):
+ '''
+ Select to first item.
+ '''
+ if self.select_rows == []:
+ self.select_first_item()
+ elif self.start_select_row != None:
+ if self.start_select_row == self.select_rows[-1]:
+ self.set_select_rows(range(0, self.select_rows[-1] + 1))
+ vadjust = self.scrolled_window.get_vadjustment()
+ vadjust.set_value(vadjust.get_lower())
+ elif self.start_select_row == self.select_rows[0]:
+ self.set_select_rows(range(0, self.select_rows[0] + 1))
+ vadjust = self.scrolled_window.get_vadjustment()
+ vadjust.set_value(vadjust.get_lower())
+ else:
+ print "select_to_first_item : impossible!"
+
+ def select_to_last_item(self):
+ '''
+ Select to last item.
+ '''
+ if self.select_rows == []:
+ self.select_first_item()
+ elif self.start_select_row != None:
+ if self.start_select_row == self.select_rows[0]:
+ self.set_select_rows(range(self.select_rows[0], len(self.visible_items)))
+ vadjust = self.scrolled_window.get_vadjustment()
+ vadjust.set_value(vadjust.get_upper() - vadjust.get_page_size())
+ elif self.start_select_row == self.select_rows[-1]:
+ self.set_select_rows(range(self.select_rows[-1], len(self.visible_items)))
+ vadjust = self.scrolled_window.get_vadjustment()
+ vadjust.set_value(vadjust.get_upper() - vadjust.get_page_size())
+ else:
+ print "select_to_end_item : impossible!"
+
+ def select_all_items(self):
+ '''
+ Select all items.
+ '''
+ if self.select_rows == []:
+ self.start_select_row = 0
+
+ self.set_select_rows(range(0, len(self.visible_items)))
+
+ def delete_select_items(self):
+ delete_items = map(lambda row: self.visible_items[row], self.select_rows)
+ self.start_select_row = None
+ self.select_rows = []
+
+ self.delete_items(delete_items)
+
+ def update_item_index(self):
+ '''
+ Update index of items.
+ '''
+ for (index, item) in enumerate(self.visible_items):
+ item.row_index = index
+
+ def update_item_widths(self):
+ self.column_widths = []
+ for item in self.visible_items:
+ for (index, column_width) in enumerate(item.get_column_widths()):
+ if index < len(self.column_widths):
+ self.column_widths[index] = max(self.column_widths[index], column_width)
+ else:
+ self.column_widths.insert(index, column_width)
+
+ if self.titles != None:
+ title_boxs = self.title_box.get_children()
+ fixed_width_count = sum(filter(lambda w: w != -1, self.column_widths))
+ title_height = ui_theme.get_pixbuf("listview/header_press.png").get_pixbuf().get_height()
+ for (index, column_width) in enumerate(self.column_widths):
+ if column_width == -1:
+ title_boxs[index].set_size_request(self.draw_area.allocation.width - fixed_width_count, title_height)
+ else:
+ title_boxs[index].set_size_request(column_width, title_height)
+
+ def redraw_request(self, item):
+ if not item in self.redraw_request_list:
+ self.redraw_request_list.append(item)
+
+ def update_redraw_request_list(self):
+ if len(self.redraw_request_list) > 0:
+ self.scrolled_window.queue_draw()
+
+ # Clear redraw request list.
+ self.redraw_request_list = []
+
+ return True
+
+
+ def add_items(self, items, insert_pos=None, clear_first=False):
+ '''
+ Add items.
+ '''
+ with self.keep_select_status():
+ if clear_first:
+ self.visible_items = []
+
+ if insert_pos == None:
+ self.visible_items += items
+ else:
+ self.visible_items = self.visible_items[0:insert_pos] + items + self.visible_items[insert_pos::]
+
+ # Update redraw callback.
+ # Callback is better way to avoid perfermance problem than gobject signal.
+ for item in items:
+ item.redraw_request_callback = self.redraw_request
+ item.add_items_callback = self.add_items
+ item.delete_items_callback = self.delete_items
+
+ self.update_item_index()
+
+ self.update_item_widths()
+
+ self.update_vadjustment()
+
+ def delete_items(self, items):
+ with self.keep_select_status():
+ for item in items:
+ if item in self.visible_items:
+ self.visible_items.remove(item)
+
+ self.update_item_index()
+
+ self.update_item_widths()
+
+ self.update_vadjustment()
+
+ def update_vadjustment(self):
+ vadjust_height = sum(map(lambda i: i.get_height(), self.visible_items))
+ self.draw_area.set_size_request(-1, vadjust_height)
+ vadjust = self.scrolled_window.get_vadjustment()
+ vadjust.set_upper(vadjust_height)
+
+ def expose_tree_view(self, widget):
+ '''
+ Internal callback to handle `expose-event` signal.
+ '''
+ # Init.
+ cr = widget.window.cairo_create()
+ rect = widget.allocation
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(widget)
+
+ # Draw background.
+ self.draw_background(widget, cr, offset_x, offset_y)
+
+ # Draw mask.
+ self.draw_mask(cr, offset_x, offset_y, viewport.allocation.width, viewport.allocation.height)
+
+ # Draw items.
+ if len(self.visible_items) > 0:
+ self.draw_items(rect, cr)
+
+ return False
+
+ def draw_background(self, widget, cr, offset_x, offset_y):
+ with cairo_state(cr):
+ cr.translate(-self.scrolled_window.allocation.x, -self.scrolled_window.allocation.y)
+ cr.rectangle(offset_x, offset_y,
+ self.scrolled_window.allocation.x + self.scrolled_window.allocation.width,
+ self.scrolled_window.allocation.y + self.scrolled_window.allocation.height)
+ cr.clip()
+
+ (shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
+ skin_config.render_background(cr, widget, offset_x + shadow_x, offset_y + shadow_y)
+
+ def draw_items(self, rect, cr):
+ # Init.
+ vadjust = self.scrolled_window.get_vadjustment()
+
+ # Init top surface.
+ if vadjust.get_value() != vadjust.get_lower():
+ top_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
+ top_surface_cr = gtk.gdk.CairoContext(cairo.Context(top_surface))
+
+ clip_y = vadjust.get_value() + self.mask_bound_height
+ else:
+ top_surface = top_surface_cr = None
+
+ clip_y = vadjust.get_value()
+
+ # Init bottom surface.
+ if vadjust.get_value() + vadjust.get_page_size() != vadjust.get_upper():
+ bottom_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, rect.width, self.mask_bound_height)
+ bottom_surface_cr = gtk.gdk.CairoContext(cairo.Context(bottom_surface))
+
+ clip_height = vadjust.get_page_size() - self.mask_bound_height - (clip_y - vadjust.get_value())
+ else:
+ bottom_surface = bottom_surface_cr = None
+
+ clip_height = vadjust.get_page_size() - (clip_y - vadjust.get_value())
+
+ # Draw items.
+ (start_row, end_row, item_height_count) = self.get_expose_bound()
+
+ column_widths = []
+ fixed_width_count = sum(filter(lambda w: w != -1, self.column_widths))
+ for column_width in self.column_widths:
+ if column_width == -1:
+ column_widths.append(rect.width - fixed_width_count)
+ else:
+ column_widths.append(column_width)
+
+ for item in self.visible_items[start_row:end_row]:
+ item_width_count = 0
+ for (index, column_width) in enumerate(column_widths):
+ render_x = rect.x + item_width_count
+ render_y = rect.y + item_height_count
+ render_width = column_width
+ render_height = item.get_height()
+
+ # Draw on top surface.
+ if top_surface_cr:
+ if (not render_y > vadjust.get_value() + self.mask_bound_height) and (not render_y + render_height < vadjust.get_value()):
+ top_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ top_surface_cr.clip()
+
+ item.get_column_renders()[index](
+ top_surface_cr,
+ gtk.gdk.Rectangle(render_x,
+ render_y - int(vadjust.get_value()),
+ render_width,
+ render_height))
+
+ # Draw on bottom surface.
+ if bottom_surface_cr:
+ 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):
+ bottom_surface_cr.rectangle(rect.x, 0, rect.width, self.mask_bound_height)
+ bottom_surface_cr.clip()
+
+ item.get_column_renders()[index](
+ bottom_surface_cr,
+ gtk.gdk.Rectangle(render_x,
+ render_y - int(vadjust.get_value()) - int(vadjust.get_page_size() - self.mask_bound_height),
+ render_width,
+ render_height))
+
+ # Draw on drawing area cairo.
+ with cairo_state(cr):
+ cr.rectangle(rect.x, clip_y, rect.width, clip_height)
+ cr.clip()
+
+ with cairo_state(cr):
+ cr.rectangle(render_x, render_y, render_width, render_height)
+ cr.clip()
+
+ item.get_column_renders()[index](cr, gtk.gdk.Rectangle(render_x, render_y, render_width, render_height))
+
+ item_width_count += column_width
+
+ item_height_count += item.get_height()
+
+ # Draw alpha mask on top surface.
+ if top_surface:
+ i = 0
+ while (i <= self.mask_bound_height):
+ with cairo_state(cr):
+ cr.rectangle(rect.x, vadjust.get_value() + i, rect.width, 1)
+ cr.clip()
+ cr.set_source_surface(top_surface, 0, vadjust.get_value())
+ cr.paint_with_alpha(math.sin(i * math.pi / 2 / self.mask_bound_height))
+
+ i += 1
+
+ # Draw alpha mask on bottom surface.
+ if bottom_surface:
+ i = 0
+ while (i < self.mask_bound_height):
+ with cairo_state(cr):
+ cr.rectangle(rect.x, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height + i, rect.width, 1)
+ cr.clip()
+ cr.set_source_surface(bottom_surface, 0, vadjust.get_value() + vadjust.get_page_size() - self.mask_bound_height)
+ cr.paint_with_alpha(1.0 - (math.sin(i * math.pi / 2 / self.mask_bound_height)))
+
+ i += 1
+
+ def get_expose_bound(self):
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ page_size = self.scrolled_window.get_vadjustment().get_page_size()
+
+ start_row = None
+ end_row = None
+ start_y = None
+ item_height_count = 0
+ item_index_count = 0
+ for item in self.visible_items:
+ if start_row == None and start_y == None:
+ if item_height_count <= offset_y <= item_height_count + item.get_height():
+ start_row = item_index_count
+ start_y = item_height_count
+ elif end_row == None:
+ if item_height_count <= offset_y + page_size <= item_height_count + item.get_height():
+ end_row = item_index_count + 1 # add 1 for python list split operation
+ else:
+ break
+
+ item_index_count += 1
+ item_height_count += item.get_height()
+
+ assert(start_row != None and start_y != None)
+
+ # Items' height must smaller than page size if end_row is None after scan all items.
+ # Then we need adjust end_row with last index of visible list.
+ if end_row == None:
+ end_row = len(self.visible_items)
+
+ return (start_row, end_row, start_y)
+
+ def button_press_tree_view(self, widget, event):
+ self.draw_area.grab_focus()
+
+ if is_left_button(event):
+ self.left_button_press = True
+
+ self.click_item(event)
+
+ def click_item(self, event):
+ click_row = self.get_event_row(event)
+
+ if self.left_button_press:
+ if click_row == None:
+ self.unselect_all()
+ else:
+ if self.press_shift:
+ self.shift_click(click_row)
+ elif self.press_ctrl:
+ self.ctrl_click(click_row)
+ else:
+ if self.enable_drag_drop and click_row in self.select_rows:
+ self.start_drag = True
+
+ # Record press_in_select_rows, disable select rows if mouse not move after release button.
+ self.press_in_select_rows = click_row
+ else:
+ self.start_drag = False
+ self.start_select_row = click_row
+ self.set_select_rows([click_row])
+
+ if is_double_click(event):
+ self.double_click_row = copy.deepcopy(click_row)
+ elif is_single_click(event):
+ self.single_click_row = copy.deepcopy(click_row)
+
+ def shift_click(self, click_row):
+ if self.select_rows == [] or self.start_select_row == None:
+ self.start_select_row = click_row
+ select_rows = [click_row]
+ else:
+ if len(self.select_rows) == 1:
+ self.start_select_row = self.select_rows[0]
+
+ if click_row < self.start_select_row:
+ select_rows = range(click_row, self.start_select_row + 1)
+ elif click_row > self.start_select_row:
+ select_rows = range(self.start_select_row, click_row + 1)
+ else:
+ select_rows = [click_row]
+
+ self.set_select_rows(select_rows)
+
+ def ctrl_click(self, click_row):
+ if click_row in self.select_rows:
+ self.select_rows.remove(click_row)
+ self.visible_items[click_row].unselect()
+ else:
+ self.start_select_row = click_row
+ self.select_rows.append(click_row)
+ self.visible_items[click_row].select()
+
+ def unselect_all(self):
+ self.set_select_rows([])
+
+ def button_release_tree_view(self, widget, event):
+ if is_left_button(event):
+ self.left_button_press = False
+ self.release_item(event)
+
+ # Remove auto scroll handler.
+ remove_timeout_id(self.auto_scroll_id)
+
+ def release_item(self, event):
+ if is_left_button(event):
+ release_row = self.get_event_row(event)
+
+ if release_row != None:
+ if self.double_click_row == release_row:
+ self.visible_items[release_row].double_click()
+ elif self.single_click_row == release_row:
+ self.visible_items[release_row].single_click()
+ if self.start_drag and self.is_in_visible_area(event):
+ self.drag_select_items_at_cursor()
+
+ self.double_click_row = None
+ self.single_click_row = None
+ self.start_drag = False
+
+ # Disable select rows when press_in_select_rows valid after button release.
+ if self.press_in_select_rows:
+ self.set_select_rows([self.press_in_select_rows])
+ self.start_select_row = self.press_in_select_rows
+ self.press_in_select_rows = None
+
+ self.set_drag_row(None)
+
+ def is_in_visible_area(self, event):
+ '''
+ Is event coordinate in visible area.
+
+ @param event: gtk.gdk.Event.
+
+ @return: Return True if event coordiante in visible area.
+ '''
+ (event_x, event_y) = get_event_coords(event)
+ vadjust = self.scrolled_window.get_vadjustment()
+ return (-self.start_drag_offset <= event_x <= self.scrolled_window.allocation.width + self.start_drag_offset
+ and vadjust.get_value() - self.start_drag_offset <= event_y <= vadjust.get_value() + vadjust.get_page_size() + self.start_drag_offset)
+
+ def set_drag_row(self, row):
+ if self.drag_reference_row != row:
+ # Clear drag row.
+ if self.drag_item != None:
+ self.drag_item.draw_drag_line(False)
+
+ # Draw new drag row.
+ if row != None:
+ if row < len(self.visible_items):
+ drag_line_at_bottom = False
+ self.drag_item = self.visible_items[row]
+ else:
+ drag_line_at_bottom = True
+ self.drag_item = self.visible_items[-1]
+
+ self.drag_item.draw_drag_line(True, drag_line_at_bottom)
+ else:
+ self.drag_item = None
+
+ # Update drag row.
+ self.drag_reference_row = row
+
+ def drag_select_items_at_cursor(self):
+ '''
+ Internal function to drag select items at cursor position.
+ '''
+ if self.drag_reference_row != None:
+ select_items = map(lambda row: self.visible_items[row], self.select_rows)
+ before_items = self.visible_items[:self.drag_reference_row]
+ after_items = self.visible_items[self.drag_reference_row::]
+
+ for item in select_items:
+ if item in before_items:
+ before_items.remove(item)
+
+ if item in after_items:
+ after_items.remove(item)
+
+ self.visible_items = before_items + select_items + after_items
+
+ self.select_rows = range(len(before_items), len(before_items + select_items))
+
+ self.update_item_index()
+
+ self.queue_draw()
+
+ def motion_tree_view(self, widget, event):
+ self.hover_item(event)
+
+ # Disable press_in_select_rows once move mouse.
+ self.press_in_select_rows = None
+
+ def hover_item(self, event):
+ if self.left_button_press:
+ if self.start_drag:
+ if self.enable_drag_drop:
+ if self.is_in_visible_area(event):
+ self.auto_scroll_tree_view(event)
+
+ self.set_drag_row(self.get_drag_row(get_event_coords(event)[1]))
+ else:
+ # Begin drag is drag_data is not None.
+ if self.drag_data:
+ (targets, actions, button) = self.drag_data
+ self.drag_begin(targets, actions, button, event)
+
+ self.set_drag_row(None)
+ else:
+ if self.enable_multiple_select and (not self.press_ctrl and not self.press_shift):
+ # Get hover row.
+ hover_row = self.get_event_row(event)
+
+ # Highlight drag area.
+ if hover_row != None and self.start_select_row != None:
+ # Update select area.
+ if hover_row > self.start_select_row:
+ select_rows = range(self.start_select_row, hover_row + 1)
+ elif hover_row < self.start_select_row:
+ select_rows = range(hover_row, self.start_select_row + 1)
+ else:
+ select_rows = [hover_row]
+
+ # Scroll viewport when cursor almost reach bound of viewport.
+ self.auto_scroll_tree_view(event)
+
+ self.set_select_rows(select_rows)
+
+ def auto_scroll_tree_view(self, event):
+ '''
+ Internal function to scroll list view automatically.
+ '''
+ # Remove auto scroll handler.
+ remove_timeout_id(self.auto_scroll_id)
+
+ vadjust = self.scrolled_window.get_vadjustment()
+ if event.y > vadjust.get_value() + vadjust.get_page_size() - 2 * self.AUTO_SCROLL_HEIGHT:
+ self.auto_scroll_id = gobject.timeout_add(self.auto_scroll_delay, lambda : self.auto_scroll_tree_view_down(vadjust))
+ elif event.y < vadjust.get_value() + 2 * self.AUTO_SCROLL_HEIGHT:
+ self.auto_scroll_id = gobject.timeout_add(self.auto_scroll_delay, lambda : self.auto_scroll_tree_view_up(vadjust))
+
+ def get_drag_row(self, drag_y):
+ (offset_x, offset_y, viewport) = self.get_offset_coordinate(self.draw_area)
+ if drag_y >= offset_y + self.scrolled_window.get_vadjustment().get_page_size():
+ return len(self.visible_items)
+ else:
+ return self.get_row_with_coordinate(drag_y)
+
+ def auto_scroll_tree_view_down(self, vadjust):
+ '''
+ Internal function to scroll list view down automatically.
+ '''
+ vadjust.set_value(min(vadjust.get_value() + self.AUTO_SCROLL_HEIGHT,
+ vadjust.get_upper() - vadjust.get_page_size()))
+
+ if self.start_drag:
+ self.set_drag_row(self.get_drag_row(self.draw_area.get_pointer()[1]))
+ else:
+ self.update_select_rows(self.get_row_with_coordinate(self.draw_area.get_pointer()[1]))
+
+ return True
+
+ def auto_scroll_tree_view_up(self, vadjust):
+ '''
+ Internal function to scroll list view up automatically.
+ '''
+ vadjust.set_value(max(vadjust.get_value() - self.AUTO_SCROLL_HEIGHT,
+ vadjust.get_lower()))
+
+ if self.start_drag:
+ self.set_drag_row(self.get_drag_row(self.draw_area.get_pointer()[1]))
+ else:
+ self.update_select_rows(self.get_row_with_coordinate(self.draw_area.get_pointer()[1]))
+
+ return True
+
+ def update_select_rows(self, hover_row):
+ '''
+ Internal function to update select rows.
+ '''
+ hover_row = self.get_row_with_coordinate(self.draw_area.get_pointer()[1])
+
+ # Update select area.
+ if hover_row != None and self.start_select_row != None:
+ if hover_row > self.start_select_row:
+ select_rows = range(self.start_select_row, hover_row + 1)
+ elif hover_row < self.start_select_row:
+ select_rows = range(hover_row, self.start_select_row + 1)
+ else:
+ select_rows = [hover_row]
+
+ self.set_select_rows(select_rows)
+
+ def key_press_tree_view(self, widget, event):
+ if has_ctrl_mask(event):
+ self.press_ctrl = True
+
+ if has_shift_mask(event):
+ self.press_shift = True
+
+ key_name = get_keyevent_name(event)
+ if self.keymap.has_key(key_name):
+ self.keymap[key_name]()
+
+ return True
+
+ def key_release_tree_view(self, widget, event):
+ '''
+ Internal callback for `key-release-event` signal.
+
+ @param widget: ListView widget.
+ @param event: Key release event.
+ '''
+ if has_ctrl_mask(event):
+ self.press_ctrl = False
+
+ if has_shift_mask(event):
+ self.press_shift = False
+
+ def size_allocated_tree_view(self, widget, rect):
+ self.update_item_widths()
+
+ def get_event_row(self, event, offset_index=0):
+ '''
+ Get row at event.
+
+ @param event: gtk.gdk.Event instance.
+ @param offset_index: Offset index base on event row.
+ @return: Return row at event coordinate, return None if haven't any row match event coordiante.
+ '''
+ (event_x, event_y) = get_event_coords(event)
+ return self.get_row_with_coordinate(event_y)
+
+ def get_row_with_coordinate(self, y):
+ item_height_count = 0
+ item_index_count = 0
+ for item in self.visible_items:
+ if item_height_count <= y <= item_height_count + item.get_height():
+ return item_index_count
+
+ item_height_count += item.get_height()
+ item_index_count += 1
+
+ return None
+
+ def draw_mask(self, cr, x, y, w, h):
+ '''
+ Draw mask interface.
+
+ @param cr: Cairo context.
+ @param x: X coordiante of draw area.
+ @param y: Y coordiante of draw area.
+ @param w: Width of draw area.
+ @param h: Height of draw area.
+ '''
+ draw_vlinear(cr, x, y, w, h,
+ ui_theme.get_shadow_color("linear_background").get_color_info()
+ )
+
+ def get_offset_coordinate(self, widget):
+ '''
+ Get viewport offset coordinate and viewport.
+
+ @param widget: ListView widget.
+ @return: Return viewport offset and viewport: (offset_x, offset_y, viewport).
+ '''
+ # Init.
+ rect = widget.allocation
+
+ # Get coordinate.
+ viewport = self.scrolled_window.get_child()
+ if viewport:
+ coordinate = widget.translate_coordinates(viewport, rect.x, rect.y)
+ if len(coordinate) == 2:
+ (offset_x, offset_y) = coordinate
+ return (-offset_x, -offset_y, viewport)
+ else:
+ return (0, 0, viewport)
+
+ else:
+ return (0, 0, viewport)
+
+ @contextmanager
+ def keep_select_status(self):
+ '''
+ Handy function that change listview and keep select status not change.
+ '''
+ # Save select items.
+ start_select_item = None
+ if self.start_select_row != None:
+ start_select_item = self.visible_items[self.start_select_row]
+
+ select_items = []
+ for row in self.select_rows:
+ select_items.append(self.visible_items[row])
+
+ try:
+ yield
+ except Exception, e:
+ print 'function keep_select_status got error %s' % e
+ traceback.print_exc(file=sys.stdout)
+
+ else:
+ # Restore select status.
+ if start_select_item != None or select_items != []:
+ # Init start select row.
+ if start_select_item != None:
+ self.start_select_row = None
+
+ # Init select rows.
+ if select_items != []:
+ self.select_rows = []
+
+ for (index, item) in enumerate(self.visible_items):
+ # Try restore select row.
+ if item in select_items:
+ self.select_rows.append(index)
+ select_items.remove(item)
+
+ # Try restore start select row.
+ if item == start_select_item:
+ self.start_select_row = index
+ start_select_item = None
+
+ # Stop loop when finish restore row status.
+ if select_items == [] and start_select_item == None:
+ break
+
gobject.type_register(TreeView)
class TreeItem(gobject.GObject):
gobject.GObject.__init__(self)
self.parent_item = None
self.chlid_items = None
- self.item_row = None
- self.item_column = None
+ self.row_index = None
+ self.column_index = None
+ self.redraw_request_callback = None
+ self.add_items_callback = None
+ self.delete_items_callback = None
+ self.is_select = False
+ self.is_expand = False
+ self.drag_line = False
+ self.drag_line_at_bottom = False
+ def expand(self):
+ pass
+
+ def unexpand(self):
+ pass
+
+ def get_height(self):
+ pass
+
+ def get_column_widths(self):
+ pass
+
+ def get_column_renders(self):
+ pass
+
+ def unselect(self):
+ pass
+
+ def select(self):
+ pass
+
+ def single_click(self):
+ pass
+
+ def double_click(self):
+ pass
+
+ def draw_drag_line(self, drag_line, drag_line_at_bottom=False):
+ pass
+
gobject.type_register(TreeItem)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/paned.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/paned.py
Changed
# Copyright (C) 2011 ~ 2012 Deepin, Inc.
# 2011 ~ 2012 Xia Bin
+# 2011 ~ 2012 Wang Yong
#
-# Author: Xia Bin <xiabin@gmail.com>
-# Maintainer: Xia Bin <xiabin@gmail.com>
+# Author: Xia Bin <xiabin@linuxdeepin.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from utils import is_in_rect
+from draw import draw_pixbuf
+from utils import is_in_rect, color_hex_to_cairo
+from constant import PANED_HANDLE_SIZE
import gobject
import gtk
-
+import math
+from theme import ui_theme
+
class Paned(gtk.Paned):
'''
Paned.
gtk.Paned with custom better apperance.
'''
- def __init__(self):
+ def __init__(self,
+ shrink_first,
+ enable_animation=False):
'''
Initialize Paned class.
'''
gtk.Paned.__init__(self)
- self.bheight = 60 #the button height or width;
+ self.shrink_first = shrink_first
+ self.enable_animation = enable_animation
+ self.bheight = ui_theme.get_pixbuf("paned/paned_up_normal.png").get_pixbuf().get_width()
self.saved_position = -1
- self.handle_size = self.style_get_property('handle-size')
-
+ self.handle_size = PANED_HANDLE_SIZE - 1
+ self.show_button = False
+ self.init_button("normal")
+ self.animation_delay = 20 # milliseconds
+ self.animation_times = 10
+ self.animation_position_frames = []
+ self.press_coordinate = None
+
+ def init_button(self, status):
+ if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
+ if self.shrink_first:
+ self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_left_%s.png" % status).get_pixbuf()
+ else:
+ self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_right_%s.png" % status).get_pixbuf()
+ else:
+ if self.shrink_first:
+ self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_up_%s.png" % status).get_pixbuf()
+ else:
+ self.button_pixbuf = ui_theme.get_pixbuf("paned/paned_down_%s.png" % status).get_pixbuf()
+
def do_expose_event(self, e):
'''
To intercept the default expose event and draw custom handle
after the **gtk.Container** expose evetn.
So the gtk.Paned's expose event callback is ignore.
'''
- #gtk.Paned.do_expose_event(self, e)
gtk.Container.do_expose_event(self, e)
self.draw_handle(e)
handle = self.get_handle_window()
line_width = 1
cr = handle.cairo_create()
- cr.set_source_rgba(1, 0,0, 0.8)
+ cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("paned_line").get_color()))
(width, height) = handle.get_size()
if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
- #draw line
- cr.rectangle(0, 0, line_width, height)
+ if self.shrink_first:
+ cr.rectangle(0, 0, line_width, height)
+ cr.fill()
- #draw_button
- cr.rectangle(0, (height-self.bheight)/2, width, self.bheight)
+ if self.show_button:
+ draw_pixbuf(cr,
+ ui_theme.get_pixbuf("paned/paned_left_normal.png").get_pixbuf(),
+ 0,
+ (height - self.bheight) / 2)
+ else:
+ cr.rectangle(width - line_width, 0, line_width, height)
+ cr.fill()
+
+ if self.show_button:
+ draw_pixbuf(cr,
+ ui_theme.get_pixbuf("paned/paned_right_normal.png").get_pixbuf(),
+ 0,
+ (height - self.bheight) / 2)
else:
- cr.rectangle(0, 0, height, line_width)
- cr.rectangle((width-self.bheight)/2, 0, self.bheight, width)
+ if self.shrink_first:
+ cr.rectangle(0, 0, width, line_width)
+ cr.fill()
+
+ if self.show_button:
+ draw_pixbuf(cr,
+ ui_theme.get_pixbuf("paned/paned_up_normal.png").get_pixbuf(),
+ (width - self.bheight) / 2,
+ 0)
+ else:
+ cr.rectangle(0, height - line_width, width, line_width)
+ cr.fill()
- cr.fill()
- pass
+ if self.show_button:
+ draw_pixbuf(cr,
+ ui_theme.get_pixbuf("paned/paned_down_normal.png").get_pixbuf(),
+ (width - self.bheight) / 2,
+ 0)
def is_in_button(self, x, y):
'''
handle = self.get_handle_window()
(width, height) = handle.get_size()
if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
- rect = (0, (height-self.bheight)/2, width, self.bheight)
+ rect = (0, (height - self.bheight) / 2, width, self.bheight)
else:
- rect = ((width-self.bheight)/2, 0, self.bheight, height)
+ rect = ((width - self.bheight) / 2, 0, self.bheight, height)
- if is_in_rect((x, y), rect):
- return True
- else:
- return False
+ return is_in_rect((x, y), rect)
def do_enter_notify_event(self, e):
+ self.show_button = True
+
+ self.queue_draw()
+
+ def do_leave_notify_event(self, e):
+ self.show_button = False
+ self.init_button("normal")
+
+ self.queue_draw()
+
+ def do_motion_notify_event(self, e):
'''
change the cursor style when move in handler
'''
+ # Reset press coordinate if motion mouse after press event.
+ self.press_coordinate = None
+
handle = self.get_handle_window()
(width, height) = handle.get_size()
if self.is_in_button(e.x, e.y):
handle.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND1))
+
+ self.init_button("hover")
else:
handle.set_cursor(self.cursor_type)
+
+ self.init_button("normal")
self.queue_draw()
+
+ gtk.Paned.do_motion_notify_event(self, e)
def do_button_press_event(self, e):
'''
when press the handler's button change the position.
'''
- if self.is_in_button(e.x, e.y):
- if self.saved_position == -1:
- self.saved_position = self.get_position()
- self.set_position(0)
+ handle = self.get_handle_window()
+ if e.window == handle:
+ if self.is_in_button(e.x, e.y):
+ self.init_button("press")
+
+ self.do_press_actoin()
else:
- self.set_position(self.saved_position)
- self.saved_position = -1
+ (width, height) = handle.get_size()
+ if is_in_rect((e.x, e.y), (0, 0, width, height)):
+ self.press_coordinate = (e.x, e.y)
+
+ gtk.Paned.do_button_press_event(self, e)
else:
gtk.Paned.do_button_press_event(self, e)
+
return True
+
+ def do_button_release_event(self, e):
+ '''
+ docs
+ '''
+ gtk.Paned.do_button_release_event(self, e)
+
+ # Do press event if not in button and finish `click` event.
+ if (not self.is_in_button(e.x, e.y)) and self.press_coordinate == (e.x, e.y):
+ self.do_press_actoin()
+
+ return True
+
+ def do_press_actoin(self):
+ '''
+ docs
+ '''
+ if self.saved_position == -1:
+ self.saved_position = self.get_position()
+ if self.shrink_first:
+ self.change_position(0)
+ else:
+ if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
+ self.change_position(self.allocation.width)
+ else:
+ self.change_position(self.allocation.height)
+ else:
+ self.change_position(self.saved_position)
+ self.saved_position = -1
+
+ def change_position(self, new_position):
+ current_position = self.get_position()
+ if self.enable_animation:
+ if new_position != current_position:
+ for i in range(0, self.animation_times + 1):
+ step = int(math.sin(math.pi * i / 2 / self.animation_times) * (new_position - current_position))
+ self.animation_position_frames.append(current_position + step)
+
+ if self.animation_position_frames[-1] != new_position:
+ self.animation_position_frames.append(new_position)
+
+ gtk.timeout_add(self.animation_delay, self.update_position)
+ else:
+ self.set_position(new_position)
+
+ def update_position(self):
+ self.set_position(self.animation_position_frames.pop(0))
+
+ if self.animation_position_frames == []:
+ return False
+ else:
+ return True
def do_size_allocate(self, e):
gtk.Paned.do_size_allocate(self, e)
- c2 = self.get_child2()
+ if self.shrink_first:
+ child = self.get_child2()
+ else:
+ child = self.get_child1()
- if c2 == None: return
+ if child == None: return
- a2 = c2.allocation
+ rect = child.allocation
+
+ offset = self.handle_size
if self.get_orientation() == gtk.ORIENTATION_HORIZONTAL:
- a2.x -= self.handle_size
- a2.width += self.handle_size
+ if self.shrink_first:
+ rect.x -= offset
+ rect.width += offset
+ else:
+ rect.width += offset
else:
- a2.y -= self.handle_size
- a2.height += self.handle_size
- c2.size_allocate(a2)
+ if self.shrink_first:
+ rect.y -= offset
+ rect.height += offset
+ else:
+ rect.height += offset
+
+ child.size_allocate(rect)
class HPaned(Paned):
- def __init__(self):
- Paned.__init__(self)
+ def __init__(self, shrink_first=True):
+ Paned.__init__(self, shrink_first)
self.set_orientation(gtk.ORIENTATION_HORIZONTAL)
self.cursor_type = gtk.gdk.Cursor(gtk.gdk.SB_H_DOUBLE_ARROW)
class VPaned(Paned):
- def __init__(self):
- Paned.__init__(self)
+ def __init__(self, shrink_first=True):
+ Paned.__init__(self, shrink_first)
self.set_orientation(gtk.ORIENTATION_VERTICAL)
self.cursor_type = gtk.gdk.Cursor(gtk.gdk.SB_V_DOUBLE_ARROW)
-
+
gobject.type_register(Paned)
gobject.type_register(HPaned)
gobject.type_register(VPaned)
-
+
if __name__ == '__main__':
w = gtk.Window()
w.set_size_request(700, 400)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/progressbar.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/progressbar.py
Changed
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from draw import draw_round_rectangle, draw_vlinear, draw_text, draw_radial_round
+from draw import draw_vlinear
from theme import ui_theme
-from utils import alpha_color_hex_to_cairo, cairo_state, propagate_expose
+from utils import cairo_state, propagate_expose, color_hex_to_cairo, cairo_disable_antialias
import cairo
import gobject
import gtk
-import pango
+
+class ProgressBuffer(gobject.GObject):
+
+ def __init__(self):
+ gobject.GObject.__init__(self)
+ self.progress = 0
+
+ def render(self, cr, rect):
+ # Init.
+ x, y, w, h = rect.x, rect.y, rect.width, rect.height
+
+ # Draw background frame.
+ with cairo_state(cr):
+ cr.rectangle(x, y + 1, w, h - 2)
+ cr.rectangle(x + 1, y, w - 2, h)
+ cr.clip()
+
+ cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("progressbar_background_frame").get_color()))
+ cr.rectangle(x, y, w, h)
+ cr.set_line_width(1)
+ cr.stroke()
+
+ # Draw background.
+ with cairo_state(cr):
+ cr.rectangle(x + 1, y + 1, w - 2, h - 2)
+ cr.clip()
+
+ draw_vlinear(cr, x + 1, y + 1, w - 2, h - 2,
+ ui_theme.get_shadow_color("progressbar_background").get_color_info(),
+ )
+
+ if self.progress > 0:
+ # Draw foreground frame.
+ with cairo_state(cr):
+ cr.rectangle(x, y + 1, w, h - 2)
+ cr.rectangle(x + 1, y, w - 2, h)
+ cr.clip()
+
+ cr.set_antialias(cairo.ANTIALIAS_NONE)
+ cr.set_source_rgb(*color_hex_to_cairo(ui_theme.get_color("progressbar_foreground_frame").get_color()))
+ cr.rectangle(x + 1, y + 1, int(w * self.progress / 100) - 1, h - 1)
+ cr.set_line_width(1)
+ cr.stroke()
+
+ # Draw foreground.
+ with cairo_state(cr):
+ cr.rectangle(x + 1, y + 1, w - 2, h - 2)
+ cr.clip()
+
+ draw_vlinear(cr, x + 1, y + 1, int(w * self.progress / 100) - 2, h - 2,
+ ui_theme.get_shadow_color("progressbar_foreground").get_color_info(),
+ )
+
+ # Draw light.
+ with cairo_disable_antialias(cr):
+ cr.set_source_rgba(1, 1, 1, 0.5)
+ cr.rectangle(x + 1, y + 1, w - 2, 1)
+ cr.fill()
+
+gobject.type_register(ProgressBuffer)
class ProgressBar(gtk.Button):
'''
'''
# Init.
gtk.Button.__init__(self)
- self.progress = 0
- self.light_ticker = 0
- self.test_ticker = 0.0
+ self.test_ticker = 0
+ self.progress_buffer = ProgressBuffer()
# Expose callback.
self.connect("expose-event", self.expose_progressbar)
- gtk.timeout_add(20, self.update_light_ticker)
def expose_progressbar(self, widget, event):
'''
cr = widget.window.cairo_create()
rect = widget.allocation
- # Draw frame.
- cr.set_source_rgba(*alpha_color_hex_to_cairo(ui_theme.get_alpha_color("progressbar_frame").get_color_info()))
- cr.set_operator(cairo.OPERATOR_OVER)
- draw_round_rectangle(cr, rect.x, rect.y, rect.width, rect.height, 1)
- cr.stroke()
-
- # Draw background.
- draw_vlinear(cr, rect.x, rect.y, rect.width, rect.height,
- ui_theme.get_shadow_color("progressbar_background").get_color_info(),
- 1)
-
- # Draw foreground.
- draw_vlinear(cr, rect.x, rect.y, rect.width * self.progress / 100.0, rect.height,
- ui_theme.get_shadow_color("progressbar_foreground").get_color_info(),
- 1)
-
- # Draw font.
- draw_text(cr, str(self.progress) + "%",
- rect.x, rect.y, rect.width, rect.height,
- rect.height - 5, "#000000",
- alignment=pango.ALIGN_CENTER)
-
- # Draw light.
- light_radius = rect.height * 4
- light_offset_x = min(self.light_ticker % 150, 100) / 100.0 * (rect.width + light_radius * 2)
- with cairo_state(cr):
- cr.rectangle(rect.x, rect.y, rect.width * self.progress / 100.0, rect.height)
- cr.clip()
- draw_radial_round(cr, rect.x + light_offset_x - light_radius, rect.y - light_radius / 2, light_radius,
- ui_theme.get_shadow_color("progressbar_light").get_color_info())
+ self.progress_buffer.render(cr, rect)
# Propagate expose.
propagate_expose(widget, event)
return True
- def update_light_ticker(self):
- '''
- Internal function to update light ticker.
- '''
- self.light_ticker += 1
- return True
-
+
def test_progressbar(self):
'''Test prorgressbar.'''
self.test_ticker += 1
- self.progress = self.test_ticker % 101
+ self.progress_buffer.progress = self.test_ticker % 101
self.queue_draw()
return True
-
+
gobject.type_register(ProgressBar)
if __name__ == "__main__":
window = gtk.Window()
progressbar = ProgressBar()
- progressbar.set_size_request(200, 14)
+ progressbar.progress_buffer.progress = 100
+ progressbar.set_size_request(112, 12)
progressbar_align = gtk.Alignment()
progressbar_align.set(0.5, 0.5, 0.0, 0.0)
progressbar_align.add(progressbar)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/scrolled_window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/scrolled_window.py
Changed
@undocumented: do_expose_event
'''
- def __init__(self,
- right_space=2,
+ def __init__(self,
+ right_space=2,
top_bottom_space=3):
'''
Init scrolled window.
self.is_inside = False # is pointer in the scrollbar region?
self.in_motion = False # is user is draging scrollbar?
self.policy = gtk.POLICY_AUTOMATIC
+ self.need_update_region = False # update gdk.Window's shape_region when need
self._horizaontal = Record()
self._vertical = Record()
def make_bar_smaller(self, orientation):
if orientation == gtk.ORIENTATION_HORIZONTAL:
- region = gdk.region_rectangle(gdk.Rectangle(0, 0, int(self._horizaontal.bar_len), self.bar_small_width))
+ bar_len = self._horizaontal.bar_len
+ if bar_len == 0:
+ self._horizaontal.need_update_region = True
+ return
+ region = gdk.region_rectangle(gdk.Rectangle(0, 0, int(bar_len), self.bar_small_width))
if self.hallocation.x == 0:
self.hwindow.shape_combine_region(region, self.top_bottom_space, self.bar_width - self.bar_small_width -self.right_space)
else:
self.hwindow.shape_combine_region(region, -self.top_bottom_space, self.bar_width - self.bar_small_width -self.right_space)
elif orientation == gtk.ORIENTATION_VERTICAL:
- region = gdk.region_rectangle(gdk.Rectangle(0, 0, self.bar_small_width, int(self._vertical.bar_len)))
+ bar_len = self._vertical.bar_len
+ if bar_len == 0:
+ self._vertical.need_update_region = True
+ return
+ region = gdk.region_rectangle(gdk.Rectangle(0, 0, self.bar_small_width, int(bar_len)))
if self.vallocation.y == 0:
self.vwindow.shape_combine_region(region, self.bar_width-self.bar_small_width - self.right_space, self.top_bottom_space)
self._vertical.bar_len = max(bar_len, self.bar_min_length)
def calc_vbar_allocation(self):
- self.vallocation = gdk.Rectangle(
- self.allocation.width - self.bar_width, int(self._vertical.bar_pos),
- self.bar_width, int(self._vertical.bar_len))
+ bar_len = int(self._vertical.bar_len)
+ if bar_len == 0:
+ self.vallocation = gdk.Rectangle(0, 0, 0, 0)
+ self.vwindow.hide()
+ else:
+ self.vwindow.show()
+ self.vallocation = gdk.Rectangle(
+ self.allocation.width - self.bar_width, int(self._vertical.bar_pos),
+ self.bar_width, bar_len)
def calc_hbar_length(self):
self._horizaontal.virtual_len = self.allocation.width
#assert 0 <= int(self.hpos) <= self.allocation.width - self.hbar_length,\
# "self.hpos %f self.allocation.width %f self.hbar_lengh %f" % (self.hpos, self.allocation.width,
# self.hbar_length)
- self.hallocation = gdk.Rectangle(
- int(self._horizaontal.bar_pos), self.allocation.height - self.bar_width,
- int(self._horizaontal.bar_len), self.bar_width)
+ bar_len = int(self._horizaontal.bar_len)
+ if bar_len == 0:
+ self.hallocation = gdk.Rectangle(0, 0, 0, 0)
+ self.hwindow.hide()
+ else:
+ self.hwindow.show()
+ self.hallocation = gdk.Rectangle(
+ int(self._horizaontal.bar_pos), self.allocation.height - self.bar_width,
+ bar_len, self.bar_width)
def vadjustment_changed(self, adj):
if self.get_realized():
self.calc_hbar_allocation()
self.hwindow.move_resize(*self.hallocation)
self.queue_draw()
-
-
+
def add_with_viewport(self, child):
'''
Used to add children without native scrolling capabilities.
-
+
If a child has native scrolling, use ScrolledWindow.add() insetad
-
+
of this function.
@param child: the child without native scrolling.
def add_child(self, child):
'''
Add the child to this ScrolledWindow.The child should have
-
+
native scrolling capabilities.
@param child: the child with native scrolling.
self.calc_hbar_length()
self.vadjustment.emit('value-changed')
self.hadjustment.emit('value-changed')
+ if self._horizaontal.need_update_region:
+ self.make_bar_smaller(gtk.ORIENTATION_HORIZONTAL)
+ self._horizaontal.need_update_region = False
+ self.hwindow.show()
+ if self._vertical.need_update_region:
+ self.make_bar_smaller(gtk.ORIENTATION_VERTICAL)
+ self._vertical.need_update_region = False
+ self.vwindow.show()
def do_unrealize(self):
#print "do_unrealize"
def do_map(self):
gtk.Bin.do_map(self) #must before self.xwindow.show(), didn't know the reason.
self.binwindow.show()
- self.hwindow.show()
- self.vwindow.show()
+ #self.hwindow.show() #will show or hide in calc_xbar_allocation()
+ #self.vwindow.show()
if self.child and not self.child.get_mapped() and self.child.get_visible():
self.child.do_map(self.child)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/skin_config.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/skin_config.py
Changed
import os
import tarfile
import uuid
+import sys
+import traceback
class SkinConfig(gobject.GObject):
'''
@undocumented: render_background
@undocumented: export_skin
'''
+
+ __gsignals__ = {
+ "theme-changed" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)),
+ }
def __init__(self):
'''
return True
except Exception, e:
- print "load_skin error: %s" % (e)
+ print "function load_skin got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
+
return False
def save_skin(self, given_filepath=None):
# Redraw application.
for window in self.window_list:
window.queue_draw()
+
+ # Emit `theme-changed` signal.
+ self.emit("theme-changed", self.theme_name)
def add_theme(self, theme):
'''
deepin-ui-1.0git20120817.tar.gz/dtk/ui/slider.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/slider.py
Changed
active_widget = None
_size_cache = None
- def __init__(self, slide_callback=None):
+ def __init__(self,
+ slide_callback=None,
+ default_index=0):
'''
Initialize Slider class.
'''
gtk.Viewport.__init__(self)
self.slide_callback = slide_callback
+ self.default_index = default_index
self.timeouts = dict()
self.set_shadow_type(gtk.SHADOW_NONE)
width = (len(self.layout.get_children()) or 1) * allocation.width
self.content.set_size_request(width, allocation.height)
+
+ if self.default_index > 0:
+ self.set_widget(self.layout.get_children()[self.default_index])
+
+ def set_widget(self, widget):
+ rect = self.allocation
+ self.active_widget = widget
+ adjustment = self.get_hadjustment()
+ adjustment.set_value(rect.width * self.default_index)
def append_widget(self, widget):
'''
deepin-ui-1.0git20120817.tar.gz/dtk/ui/spin.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/spin.py
Changed
button_box.pack_start(arrow_down_button, False, False)
self.value_entry = Entry(str(value))
self.value_entry.check_text = is_float
+ self.value_entry.connect("changed", lambda entry, value_string: self.update_and_emit(int(value_string)))
self.main_align = gtk.Alignment()
self.main_align.set(0.5, 0.5, 0, 0)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/tab_window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/tab_window.py
Changed
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from box import EventBox
from button import Button
from constant import DEFAULT_FONT_SIZE
from dialog import DialogBox, DIALOG_MASK_TAB_PAGE
-from draw import draw_text
-from scrolled_window import ScrolledWindow
+from draw import draw_text, draw_round_rectangle
from skin_config import skin_config
from theme import ui_theme
from locales import _
@undocumented: expose_tab_content_box
'''
- def __init__(self):
+ def __init__(self, can_close_tab=False):
'''
Initialize TabBox class.
'''
self.tab_select_frame_color = ui_theme.get_color("tab_select_frame")
self.tab_unselect_bg_color = ui_theme.get_color("tab_unselect_bg")
self.tab_unselect_frame_color = ui_theme.get_color("tab_unselect_bg")
+ self.can_close_tab = can_close_tab
+ self.close_button_size = 6
+ self.close_button_frame_size = 3
+ self.close_button_padding_x = 4
+ self.close_button_padding_y = 6
+ self.close_button_select_background_color = "#EE0000"
+ self.close_button_select_foreground_color = "#FFFFFF"
+ self.close_button_color = "#666666"
+ self.hover_close_button_index = None
- self.tab_title_box = EventBox()
+ self.tab_title_box = gtk.DrawingArea()
+ self.tab_title_box.add_events(gtk.gdk.ALL_EVENTS_MASK)
self.tab_title_box.set_size_request(-1, self.tab_height)
self.tab_title_align = gtk.Alignment()
self.tab_title_align.set(0.0, 0.0, 1.0, 1.0)
self.tab_title_align.add(self.tab_title_box)
self.tab_content_align = gtk.Alignment()
self.tab_content_align.set(0.0, 0.0, 1.0, 1.0)
- self.tab_content_align.set_padding(0, 1, 0, 0)
- self.tab_content_scrolled_window = ScrolledWindow()
- self.tab_content_align.add(self.tab_content_scrolled_window)
+ self.tab_content_align.set_padding(0, 0, 0, 0)
self.tab_content_box = gtk.VBox()
- self.tab_content_scrolled_window.add_child(self.tab_content_box)
+ self.tab_content_align.add(self.tab_content_box)
self.tab_items = []
self.tab_title_widths = []
self.tab_index = -1
+ self.default_widget = None
+
self.pack_start(self.tab_title_align, False, False)
self.pack_start(self.tab_content_align, True, True)
self.tab_title_box.connect("button-press-event", self.press_tab_title_box)
self.tab_title_box.connect("expose-event", self.expose_tab_title_box)
+ self.tab_title_box.connect("motion-notify-event", self.motion_notify_tab_title_box)
self.tab_content_align.connect("expose-event", self.expose_tab_content_align)
self.tab_content_box.connect("expose-event", self.expose_tab_content_box)
+ def show_default_page(self):
+ if self.default_widget != None and len(self.tab_items) == 0:
+ container_remove_all(self.tab_content_box)
+ self.tab_content_box.add(self.default_widget)
+ self.tab_title_box.queue_draw()
+ self.tab_content_box.queue_draw()
+
+ self.show_all()
+
+ def set_default_widget(self, widget):
+ self.default_widget = widget
+
+ self.show_default_page()
+
def add_items(self, items, default_index=0):
'''
Add items.
self.tab_title_widths.append(get_content_size(item[0], DEFAULT_FONT_SIZE)[0] + self.tab_padding_x * 2)
self.switch_content(default_index)
+
+ def delete_items(self, items):
+ item_indexs = map(lambda item: self.tab_items.index(item), items)
+
+ for item in items:
+ self.tab_items.remove(item)
+
+ for title_width in map(lambda item_index: self.tab_title_widths[item_index], item_indexs):
+ self.tab_title_widths.remove(title_width)
+
+ if len(self.tab_items) == 0:
+ self.show_default_page()
+
+ print self.tab_items
def switch_content(self, index):
'''
'''
Internal callback for `button-press-event` signal.
'''
+ press_index = self.get_close_button_at_event(event)
+
+ if press_index != None:
+ self.delete_items([self.tab_items[press_index]])
+ else:
+ for (index, item) in enumerate(self.tab_items):
+ if is_in_rect((event.x, event.y),
+ (sum(self.tab_title_widths[0:index]),
+ 0,
+ self.tab_title_widths[index],
+ self.tab_height)):
+ self.switch_content(index)
+ break
+
+ def get_close_button_at_event(self, event):
+ hover_index = None
for (index, item) in enumerate(self.tab_items):
- if is_in_rect((event.x, event.y),
- (sum(self.tab_title_widths[0:index]),
- 0,
- self.tab_title_widths[index],
- self.tab_height)):
- self.switch_content(index)
+ button_x = sum(self.tab_title_widths[0:index + 1]) - self.close_button_padding_x - self.close_button_size
+ button_y = self.close_button_padding_y
+ if is_in_rect((event.x, event.y), (button_x, button_y, self.close_button_size, self.close_button_size)):
+ hover_index = index
break
+
+ return hover_index
+
+ def motion_notify_tab_title_box(self, widget, event):
+ hover_index = self.get_close_button_at_event(event)
+
+ if hover_index != self.hover_close_button_index:
+ self.hover_close_button_index = hover_index
+ widget.queue_draw()
def expose_tab_title_box(self, widget, event):
'''
cr = widget.window.cairo_create()
rect = widget.allocation
- # Draw title unselect tab.
- tab_title_width = sum(self.tab_title_widths)
-
+ # Draw background.
+ (offset_x, offset_y) = widget.translate_coordinates(self.get_toplevel(), 0, 0)
with cairo_state(cr):
- with cairo_disable_antialias(cr):
- cr.rectangle(rect.x,
- rect.y,
- sum(self.tab_title_widths[0:self.tab_index]),
- self.tab_height)
- cr.rectangle(rect.x + sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]) + 1,
- rect.y,
- sum(self.tab_title_widths) - sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]),
- self.tab_height)
- cr.clip()
-
- cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_bg_color.get_color(), 0.7)))
- cr.rectangle(rect.x + 1, rect.y + 1, tab_title_width, self.tab_height)
- cr.fill()
-
- cr.set_line_width(1)
- cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
- cr.rectangle(rect.x + 1, rect.y + 1, tab_title_width, self.tab_height)
- cr.stroke()
-
- for (index, width) in enumerate(self.tab_title_widths[:-1]):
- cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
- cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:index]) + width,
- rect.y + 1,
- 1,
- self.tab_height)
- cr.fill()
-
- cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))
- cr.rectangle(rect.x,
- rect.y + rect.height - 1,
- sum(self.tab_title_widths[0:self.tab_index]),
- 1)
- cr.fill()
+ cr.translate(-offset_x, -offset_y)
- cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))
- cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:self.tab_index]),
- rect.y + rect.height - 1,
- rect.width - sum(self.tab_title_widths[0:self.tab_index]),
- 1)
- cr.fill()
-
- for (index, item) in enumerate(self.tab_items):
- # Draw title background.
- title = item[0]
+ (shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
+ skin_config.render_background(cr, widget, shadow_x, shadow_y)
+
+ if len(self.tab_items) > 0:
+ # Draw title unselect tab.
+ tab_title_width = sum(self.tab_title_widths)
- # Draw title tab.
- with cairo_disable_antialias(cr):
- if index == self.tab_index:
- # Draw title select tab.
- cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))
- if index == 0:
- cr.rectangle(rect.x + sum(self.tab_title_widths[0:index]),
- rect.y + 1,
- self.tab_title_widths[index] + 1,
- self.tab_height)
- else:
- cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:index]),
- rect.y + 1,
- self.tab_title_widths[index],
- self.tab_height)
+ with cairo_state(cr):
+ with cairo_disable_antialias(cr):
+ cr.rectangle(0,
+ 0,
+ sum(self.tab_title_widths[0:self.tab_index]),
+ self.tab_height)
+ cr.rectangle(sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]) + 1,
+ 0,
+ sum(self.tab_title_widths) - sum(self.tab_title_widths[0:min(self.tab_index + 1, len(self.tab_items))]),
+ self.tab_height)
+ cr.clip()
+
+ cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_bg_color.get_color(), 0.7)))
+ cr.rectangle(1, 1, tab_title_width, self.tab_height)
cr.fill()
+
+ cr.set_line_width(1)
+ cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
+ cr.rectangle(1, 1, tab_title_width, self.tab_height)
+ cr.stroke()
- if index == 0:
- cr.rectangle(rect.x,
- rect.y,
- rect.width,
+ for (index, width) in enumerate(self.tab_title_widths[:-1]):
+ cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_unselect_frame_color.get_color(), 1.0)))
+ cr.rectangle(1 + sum(self.tab_title_widths[0:index]) + width,
+ 1,
+ 1,
self.tab_height)
- cr.clip()
+ cr.fill()
- cr.set_line_width(1)
cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))
- if index == 0:
- cr.rectangle(rect.x + sum(self.tab_title_widths[0:index]),
- rect.y + 1,
- self.tab_title_widths[index] + 2,
- self.tab_height)
+ cr.rectangle(0,
+ rect.height - 1,
+ sum(self.tab_title_widths[0:self.tab_index]),
+ 1)
+ cr.fill()
+
+ cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))
+ cr.rectangle(1 + sum(self.tab_title_widths[0:self.tab_index]),
+ rect.height - 1,
+ rect.width - sum(self.tab_title_widths[0:self.tab_index]),
+ 1)
+ cr.fill()
+
+ for (index, item) in enumerate(self.tab_items):
+ # Draw title background.
+ title = item[0]
+
+ # Draw title tab.
+ with cairo_disable_antialias(cr):
+ if index == self.tab_index:
+ # Draw title select tab.
+ cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))
+ if index == 0:
+ cr.rectangle(sum(self.tab_title_widths[0:index]),
+ 1,
+ self.tab_title_widths[index] + 1,
+ self.tab_height)
+ else:
+ cr.rectangle(1 + sum(self.tab_title_widths[0:index]),
+ 1,
+ self.tab_title_widths[index],
+ self.tab_height)
+ cr.fill()
+
+ if index == 0:
+ cr.rectangle(0,
+ 0,
+ rect.width,
+ self.tab_height)
+ cr.clip()
+
+ cr.set_line_width(1)
+ cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))
+ if index == 0:
+ cr.rectangle(sum(self.tab_title_widths[0:index]),
+ 1,
+ self.tab_title_widths[index] + 2,
+ self.tab_height)
+ else:
+ cr.rectangle(1 + sum(self.tab_title_widths[0:index]),
+ 1,
+ self.tab_title_widths[index] + 1,
+ self.tab_height)
+ cr.stroke()
+
+ draw_text(cr, title,
+ sum(self.tab_title_widths[0:index]) + self.tab_padding_x,
+ self.tab_padding_y,
+ self.tab_title_widths[index] - self.tab_padding_x * 2,
+ self.tab_height - self.tab_padding_y * 2,
+ )
+
+ # Draw close button.
+ if self.can_close_tab:
+ button_x = sum(self.tab_title_widths[0:index + 1]) - self.close_button_padding_x - self.close_button_size
+ button_y = self.close_button_padding_y
+
+ if self.hover_close_button_index == index:
+ cr.set_source_rgb(*color_hex_to_cairo(self.close_button_select_background_color))
+ draw_round_rectangle(
+ cr,
+ button_x - self.close_button_frame_size,
+ button_y - self.close_button_frame_size,
+ self.close_button_size + self.close_button_frame_size * 2,
+ self.close_button_size + self.close_button_frame_size * 2,
+ 2
+ )
+ cr.fill()
+
+ cr.set_line_width(1.5)
+ if self.hover_close_button_index == index:
+ cr.set_source_rgb(*color_hex_to_cairo(self.close_button_select_foreground_color))
else:
- cr.rectangle(rect.x + 1 + sum(self.tab_title_widths[0:index]),
- rect.y + 1,
- self.tab_title_widths[index] + 1,
- self.tab_height)
+ cr.set_source_rgb(*color_hex_to_cairo(self.close_button_color))
+ cr.move_to(button_x, button_y)
+ cr.line_to(button_x + self.close_button_size, button_y + self.close_button_size)
cr.stroke()
-
- draw_text(cr, title,
- rect.x + sum(self.tab_title_widths[0:index]) + self.tab_padding_x,
- rect.y + self.tab_padding_y,
- self.tab_title_widths[index] - self.tab_padding_x * 2,
- self.tab_height - self.tab_padding_y * 2,
- )
-
+
+ cr.move_to(button_x + self.close_button_size, button_y)
+ cr.line_to(button_x, button_y + self.close_button_size)
+ cr.stroke()
+ else:
+ cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))
+ cr.rectangle(0, 0, rect.width, rect.height)
+ cr.fill()
+
def expose_tab_content_align(self, widget, event):
'''
Internal function to `expose-event` signal.
rect = widget.allocation
with cairo_disable_antialias(cr):
+ cr.rectangle(rect.x, rect.y, sum(self.tab_title_widths[0:self.tab_index]), rect.height)
+ cr.rectangle(rect.x + sum(self.tab_title_widths[0:self.tab_index + 1]),
+ rect.y,
+ rect.width - sum(self.tab_title_widths[0:self.tab_index + 1]),
+ rect.height)
+ cr.clip()
+
cr.set_source_rgb(*color_hex_to_cairo(self.tab_select_frame_color.get_color()))
- cr.rectangle(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2)
+ cr.rectangle(rect.x, rect.y, rect.width, rect.height)
cr.stroke()
def expose_tab_content_box(self, widget, event):
'''
Internal function to `expose-event` signal.
'''
+ # Init.
cr = widget.window.cairo_create()
rect = widget.allocation
# Draw background.
toplevel = widget.get_toplevel()
- coordinate = widget.translate_coordinates(toplevel, rect.x, rect.y)
+ coordinate = widget.translate_coordinates(toplevel, 0, 0)
(offset_x, offset_y) = coordinate
-
+
with cairo_state(cr):
- cr.translate(-offset_x, -offset_y)
- cr.rectangle(offset_x, offset_y, rect.width, rect.height)
+ cr.rectangle(rect.x, rect.y, rect.width, rect.height)
cr.clip()
(shadow_x, shadow_y) = get_window_shadow_size(self.get_toplevel())
- skin_config.render_background(cr, self, rect.x + shadow_x, rect.y + shadow_y)
+ skin_config.render_background(cr, self, shadow_x, shadow_y)
# Draw mask.
cr.set_source_rgba(*alpha_color_hex_to_cairo((self.tab_select_bg_color.get_color(), 0.93)))
deepin-ui-1.0git20120817.tar.gz/dtk/ui/thread_pool.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/thread_pool.py
Changed
import os
import threading as td
import time
+import sys
+import traceback
class MissionThreadPool(td.Thread):
"""
try:
yield
except Exception, e:
- print 'sync error %s' % e
+ print 'function sync got error: %s' % e
+ traceback.print_exc(file=sys.stdout)
else:
self.thread_sync_lock.release()
deepin-ui-1.0git20120817.tar.gz/dtk/ui/threads.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/threads.py
Changed
@param callback: Callback run in thread.
'''
td.Thread.__init__(self)
- self.setDaemon(True) # make thread exit when main program exit
+ self.setDaemon(True) # make thread exit when main program exit
self.callback = callback
deepin-ui-1.0git20120817.tar.gz/dtk/ui/tooltip.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/tooltip.py
Changed
# Copyright (C) 2011 ~ 2012 Deepin, Inc.
# 2011 ~ 2012 Xia Bin
#
-# Author: Xia Bin <xiabin@gmail.com>
-# Maintainer: Xia Bin <xiabin@gmail.com>
+# Author: Xia Bin <xiabin@linuxdeepin.com>
+# Maintainer: Xia Bin <xiabin@linuxdeepin.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
def find_at_coords(gdkwindow, window_x, window_y):
cl = ChildLocation()
- widget = gdkwindow.get_user_data()
- if widget == None:
+ try:
+ widget = gdkwindow.get_user_data()
+ except:
return (None, cl.x, cl.y)
cl.x = window_x
deepin-ui-1.0git20120817.tar.gz/dtk/ui/tooltip_test.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/tooltip_test.py
Changed
# Copyright (C) 2011 ~ 2012 Deepin, Inc.
# 2011 ~ 2012 Xia Bin
#
-# Author: Xia Bin <xiabin@gmail.com>
-# Maintainer: Xia Bin <xiabin@gmail.com>
+# Author: Xia Bin <xiabin@linuxdeepin.com>
+# Maintainer: Xia Bin <xiabin@linuxdeepin.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
deepin-ui-1.0git20120817.tar.gz/dtk/ui/utils.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/utils.py
Changed
import socket
import subprocess
import time
+import traceback
+import sys
from constant import (WIDGET_POS_TOP_LEFT, WIDGET_POS_TOP_RIGHT,
WIDGET_POS_TOP_CENTER, WIDGET_POS_BOTTOM_LEFT,
WIDGET_POS_BOTTOM_CENTER, WIDGET_POS_BOTTOM_RIGHT,
BLACK_COLOR_MAPPED, WHITE_COLOR_MAPPED, SIMILAR_COLOR_SEQUENCE,
DEFAULT_FONT_SIZE)
-def tree_view_get_toplevel_node_count(treeview):
- '''
- Get node count number of TreeView.
-
- @param treeview: Gtk.TreeView instance.
- @return: Return number of node.
-
- Return 0 if treeview haven't model.
- '''
- model = treeview.get_model()
- if model != None:
- return model.iter_n_children(None)
- else:
- return 0
-
-def tree_view_get_selected_path(treeview):
- '''
- Get selected path of TreeView.
-
- @param treeview: Gtk.TreeView instance.
- @return: Return selected path of treeview.
-
- Return None if haven't any path selected.
- '''
- selection = treeview.get_selection()
- (_, tree_paths) = selection.get_selected_rows()
- if len(tree_paths) != 0:
- return (tree_paths[0])[0]
- else:
- return None
-
-def tree_view_focus_first_toplevel_node(treeview):
- '''
- Focus first toplevel node of TreeView.
-
- @param treeview: Gtk.TreeView instance.
- '''
- treeview.set_cursor((0))
-
-def tree_view_focus_last_toplevel_node(treeview):
- '''
- Focus last toplevel node of TreeView.
-
- @param treeview: Gtk.TreeView instance.
- '''
- node_count = tree_view_get_toplevel_node_count(treeview)
- if node_count > 0:
- path = (node_count - 1)
- else:
- path = (0)
- treeview.set_cursor(path)
-
-def tree_view_scroll_vertical(treeview, scroll_up=True):
- '''
- Scroll TreeView vertically.
-
- @param treeview: Gtk.TreeView instance.
- @param scroll_up: Defalut value is True, set as False if you want scroll down.
- '''
- # Init.
- scroll_num = 9
- candidate_count = tree_view_get_toplevel_node_count(treeview)
- cursor = treeview.get_cursor()
- (path, column) = cursor
- max_candidate = candidate_count - 1
-
- # Get candidate at cursor.
- if path == None:
- current_candidate = max_candidate
- else:
- (current_candidate,) = path
-
- # Set cursor to new candidate.
- if scroll_up:
- new_candidate = max(0, current_candidate - scroll_num)
- else:
- new_candidate = min(current_candidate + scroll_num, max_candidate)
-
- treeview.set_cursor((new_candidate))
-
-def tree_view_focus_next_toplevel_node(treeview):
- '''
- Focus next toplevel node of TreeView.
-
- @param treeview: Gtk.TreeView instance.
- '''
- selected_path = tree_view_get_selected_path(treeview)
- if selected_path != None:
- node_count = tree_view_get_toplevel_node_count(treeview)
- if selected_path < node_count - 1:
- treeview.set_cursor((selected_path + 1))
-
-def tree_view_focus_prev_toplevel_node(treeview):
- '''
- Focus previous toplevel node of TreeView.
-
- @param treeview: Gtk.TreeView instance.
- '''
- selected_path = tree_view_get_selected_path(treeview)
- if selected_path != None:
- if selected_path > 0:
- treeview.set_cursor((selected_path - 1))
-
def get_entry_text(entry):
'''
Get text of entry.
layout.set_single_paragraph_mode(True)
else:
layout.set_width(wrap_width * pango.SCALE)
- layout.set_single_paragraph_mode(False)
+ layout.set_single_paragraph_mode(False)
layout.set_wrap(pango.WRAP_WORD)
return layout.get_pixel_size()
return content
except Exception, e:
- print e
+ print "function eval_file got error: %s" % e
+ traceback.print_exc(file=sys.stdout)
return None
if proc != None:
proc.kill()
except Exception, e:
- print "kill_process got error: %s" % (e)
+ print "function kill_process got error: %s" % (e)
+ traceback.print_exc(file=sys.stdout)
def get_command_output_first_line(commands):
'''
'''
bytes = int(bytes)
if bytes is 0:
- return '0B'
+ return '0 B'
else:
log = math.floor(math.log(bytes, 1024))
quotient = 1024 ** log
prec = 0
else:
prec = precision
- return "%.*f%s" % (prec,
- size,
- ['B', 'KB', 'MB', 'GB', 'TB','PB', 'EB', 'ZB', 'YB']
- [int(log)])
+ return "%.*f %s" % (prec,
+ size,
+ ['B', 'KB', 'MB', 'GB', 'TB','PB', 'EB', 'ZB', 'YB']
+ [int(log)])
def add_color_stop_rgba(pat, pos, color_info):
'''
@param unzip_list: List to unzip.
@return: Return new unzip list.
'''
- first_list, second_list = zip(*unzip_list)
- return (list(first_list), list(second_list))
+ return tuple(map(list, zip(*unzip_list)))
def is_seriate_list(test_list):
'''
try:
yield
except Exception, e:
- print 'with an cairo error %s' % e
+ print 'function cairo_state got error: %s' % e
+ traceback.print_exc(file=sys.stdout)
else:
cr.restore()
try:
yield
except Exception, e:
- print 'with an cairo error %s' % e
+ print 'function cairo_disable_antialias got error: %s' % e
+ traceback.print_exc(file=sys.stdout)
else:
# Restore antialias.
cr.set_antialias(antialias)
try:
yield
except Exception, e:
- print 'exec_time error %s' % e
+ print 'function exec_time got error %s' % e
+ traceback.print_exc(file=sys.stdout)
else:
print "time: %f" % (time.time() - start_time)
deepin-ui-1.0git20120817.tar.gz/dtk/ui/window.py -> deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/window.py
Changed
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from constant import EDGE_DICT
from draw import draw_window_shadow, draw_window_frame
from skin_config import skin_config
from theme import ui_theme
+from window_base import WindowBase
import cairo
import gobject
import gtk
from utils import (cairo_state, propagate_expose, set_cursor,
- resize_window, get_event_root_coords,
- enable_shadow, alpha_color_hex_to_cairo,
- is_double_click, move_window)
+ get_event_root_coords,
+ enable_shadow, alpha_color_hex_to_cairo)
-class Window(gtk.Window):
+class Window(WindowBase):
"""
The Window class is a subclass of gtk.Window. It adds some features that deepin-ui have to gtk.Window.
@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.
"""
# Init.
- gtk.Window.__init__(self, window_type)
+ WindowBase.__init__(self, window_type)
+ self.shadow_radius = shadow_radius
+ self.enable_resize = enable_resize
+ self.shadow_visible = shadow_visible
+ self.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
+ self.background_color = (0, 0, 0, 0)
+
+ self.init()
+
+ def init(self):
skin_config.wrap_skin_window(self)
self.set_decorated(False)
- self.set_colormap(gtk.gdk.Screen().get_rgba_colormap())
self.add_events(gtk.gdk.ALL_EVENTS_MASK)
self.window_shadow = gtk.Alignment()
self.window_frame = gtk.VBox()
- self.shadow_radius = shadow_radius
self.frame_radius = 2
self.shadow_is_visible = True
self.cursor_type = None
- self.enable_resize = enable_resize
- self.shadow_visible = shadow_visible
# Shadow setup.
if enable_shadow(self) and self.shadow_visible:
self.connect("window-state-event", self.monitor_window_state)
self.window_frame.connect("expose-event", self.expose_window_frame)
- def show_window(self):
- """
- Show the window.
- """
- self.show_all()
-
def expose_window_background(self, widget, event):
"""
Internal function to expose the window background.
rect = widget.allocation
# Clear color to transparent window.
- cr.set_source_rgba(0.0, 0.0, 0.0, 0.0)
+ cr.set_source_rgba(*self.background_color)
cr.set_operator(cairo.OPERATOR_SOURCE)
cr.paint()
# Draw background.
with cairo_state(cr):
- cr.rectangle(x + 2, y, w - 4, 1)
- cr.rectangle(x + 1, y + 1, w - 2, 1)
- cr.rectangle(x, y + 2, w, h - 4)
- cr.rectangle(x + 2, y + h - 1, w - 4, 1)
- cr.rectangle(x + 1, y + h - 2, w - 2, 1)
-
- cr.clip()
+ if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
+ cr.rectangle(x + 2, y, w - 4, 1)
+ cr.rectangle(x + 1, y + 1, w - 2, 1)
+ cr.rectangle(x, y + 2, w, h - 4)
+ cr.rectangle(x + 2, y + h - 1, w - 4, 1)
+ cr.rectangle(x + 1, y + h - 2, w - 2, 1)
+
+ cr.clip()
skin_config.render_background(cr, self, x, y)
return True
- def draw_mask(self, cr, x, y, w, h):
- '''
- Draw mask interface, you should implement this function own.
-
- @param cr: Cairo context.
- @param x: X coordinate of draw area.
- @param y: Y coordinate of draw area.
- @param w: Width of draw area.
- @param h: Height of draw area.
- '''
- pass
-
def expose_window_shadow(self, widget, event):
"""
Interh function to expose the window shadow.
@param widget: the window of gtk.Widget.
@param event: The expose event of type gtk.gdk.Event.
"""
- # Init.
- cr = widget.window.cairo_create()
- rect = widget.allocation
- x, y, w, h = rect.x, rect.y, rect.width, rect.height
-
- draw_window_frame(cr, x, y, w, h,
- ui_theme.get_alpha_color("window_frame_outside_1"),
- ui_theme.get_alpha_color("window_frame_outside_2"),
- ui_theme.get_alpha_color("window_frame_outside_3"),
- ui_theme.get_alpha_color("window_frame_inside_1"),
- ui_theme.get_alpha_color("window_frame_inside_2"),
- )
+ if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
+ # Init.
+ cr = widget.window.cairo_create()
+ rect = widget.allocation
+ x, y, w, h = rect.x, rect.y, rect.width, rect.height
+
+ draw_window_frame(cr, x, y, w, h,
+ ui_theme.get_alpha_color("window_frame_outside_1"),
+ ui_theme.get_alpha_color("window_frame_outside_2"),
+ ui_theme.get_alpha_color("window_frame_outside_3"),
+ ui_theme.get_alpha_color("window_frame_inside_1"),
+ ui_theme.get_alpha_color("window_frame_inside_2"),
+ )
def shape_window_frame(self, widget, rect):
"""
@param rect: The bounding region of the window.
"""
if widget.window != None and widget.get_has_window() and rect.width > 0 and rect.height > 0:
- # Init.
- x, y, w, h = rect.x, rect.y, rect.width, rect.height
- bitmap = gtk.gdk.Pixmap(None, w, h, 1)
- cr = bitmap.cairo_create()
-
- # Clear the bitmap
- cr.set_source_rgb(0.0, 0.0, 0.0)
- cr.set_operator(cairo.OPERATOR_CLEAR)
- cr.paint()
-
- # Draw our shape into the bitmap using cairo.
- cr.set_source_rgb(1.0, 1.0, 1.0)
- cr.set_operator(cairo.OPERATOR_OVER)
-
- cr.rectangle(x + 1, y, w - 2, 1)
- cr.rectangle(x, y + 1, w, h - 2)
- cr.rectangle(x + 1, y + h - 1, w - 2, 1)
-
- cr.fill()
-
- # Shape with given mask.
- widget.shape_combine_mask(bitmap, 0, 0)
+ if self.window.get_state() != gtk.gdk.WINDOW_STATE_MAXIMIZED:
+ # Init.
+ x, y, w, h = rect.x, rect.y, rect.width, rect.height
+ bitmap = gtk.gdk.Pixmap(None, w, h, 1)
+ cr = bitmap.cairo_create()
+
+ # Clear the bitmap
+ cr.set_source_rgb(0.0, 0.0, 0.0)
+ cr.set_operator(cairo.OPERATOR_CLEAR)
+ cr.paint()
+
+ # Draw our shape into the bitmap using cairo.
+ cr.set_source_rgb(1.0, 1.0, 1.0)
+ cr.set_operator(cairo.OPERATOR_OVER)
+
+ cr.rectangle(x + 1, y, w - 2, 1)
+ cr.rectangle(x, y + 1, w, h - 2)
+ cr.rectangle(x + 1, y + h - 1, w - 2, 1)
+
+ cr.fill()
+
+ # Shape with given mask.
+ widget.shape_combine_mask(bitmap, 0, 0)
def hide_shadow(self):
"""
self.shadow_is_visible = True
self.window_shadow.set_padding(self.shadow_padding, self.shadow_padding, self.shadow_padding, self.shadow_padding)
- def min_window(self):
- """
- Minimize the window. Make it iconified.
- """
- self.iconify()
-
- def toggle_max_window(self):
- """
- Toggle the window size between maximized size and normal size.
- """
- window_state = self.window.get_state()
- if window_state == gtk.gdk.WINDOW_STATE_MAXIMIZED:
- self.unmaximize()
- else:
- self.maximize()
-
- def toggle_fullscreen_window(self):
- """
- Toggle the window between fullscreen mode and normal size.
- """
- window_state = self.window.get_state()
- if window_state == gtk.gdk.WINDOW_STATE_FULLSCREEN:
- self.unfullscreen()
- else:
- self.fullscreen()
-
- def close_window(self):
- """
- Close the window. Send the destroy signal to the program.
-
- @return: Always return False.
- """
- # Hide window immediately when user click close button,
- # user will feeling this software very quick, ;p
- self.hide_all()
-
- self.emit("destroy")
-
- return False
-
def motion_notify(self, widget, event):
"""
Internal callback for `motion-notify` signal.
self.cursor_type = cursor_type
- def resize_window(self, widget, event):
- """
- Resize the window.
-
- @param widget: The window of type gtk.Widget.
- @param event: A signal of type gtk.gdk.Event.
- """
- if self.enable_resize:
- edge = self.get_edge()
- if edge != None:
- resize_window(widget, event, self, edge)
-
- def is_disable_window_maximized(self):
- """
- An interface which indicates whether the window could be maximized, you should implement this function you own.
-
- @return: Always return False.
- """
- return False
-
- def monitor_window_state(self, widget, event):
- """
- Internal function to monitor window state,
-
- add shadow when window at maximized or fullscreen status. Otherwise hide shadow.
-
- @param widget: The window of type gtk.Widget.
- @param event: The event of gtk.gdk.Event.
- """
- window_state = self.window.get_state()
- if window_state in [gtk.gdk.WINDOW_STATE_MAXIMIZED, gtk.gdk.WINDOW_STATE_FULLSCREEN]:
- self.hide_shadow()
-
- if self.is_disable_window_maximized():
- self.unmaximize()
- else:
- self.show_shadow()
-
- def add_move_event(self, widget):
- """
- Add move event callback.
-
- @param widget: A widget of type gtk.Widget.
- """
- widget.connect("button-press-event", lambda w, e: move_window(w, e, self))
-
- def add_toggle_event(self, widget):
- """
- Add toggle event callback.
-
- @param widget: A widget of type gtk.Widget.
- """
- widget.connect("button-press-event", self.double_click_window)
-
- def double_click_window(self, widget, event):
- """
- Double click event handler of the window. It will maximize the window.
-
- @param widget: A widget of type gtk.Widget.
- @param event: A event of type gtk.gdk.Event.
- @return: Always return False.
- """
- if is_double_click(event):
- self.toggle_max_window()
-
- return False
-
- def get_edge(self):
- """
- Get the edge which the cursor is on, according to the cursor type.
-
- @return: If there is a corresponding cursor type, an instance of gtk.gdk.WindowEdge is returned, else None is returned.
- """
- if EDGE_DICT.has_key(self.cursor_type):
- return EDGE_DICT[self.cursor_type]
- else:
- return None
-
def get_cursor_type(self, event):
"""
Get the cursor position.
wh = rect.height
# Return cursor position.
- if wx <= ex <= wx + self.shadow_padding:
- if wy <= ey <= wy + self.shadow_padding * 2:
- return gtk.gdk.TOP_LEFT_CORNER
- elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
- return gtk.gdk.BOTTOM_LEFT_CORNER
- elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
- return gtk.gdk.LEFT_SIDE
- else:
- return None
- elif wx + ww - self.shadow_padding <= ex <= wx + ww:
- if wy <= ey <= wy + self.shadow_padding * 2:
- return gtk.gdk.TOP_RIGHT_CORNER
- elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
- return gtk.gdk.BOTTOM_RIGHT_CORNER
- elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
- return gtk.gdk.RIGHT_SIDE
- else:
- return None
- elif wx + self.shadow_padding < ex < wx + ww - self.shadow_padding:
- if wy <= ey <= wy + self.shadow_padding:
- return gtk.gdk.TOP_SIDE
- elif wy + wh - self.shadow_padding <= ey <= wy + wh:
- return gtk.gdk.BOTTOM_SIDE
- else:
- return None
- else:
- return None
+ return self.get_cursor_type_with_coordinate(ex, ey, wx, wy, ww, wh)
def get_shadow_size(self):
"""
return (0, 0)
gobject.type_register(Window)
+
+class EmbedWindow(gtk.Plug):
+ def __init__(self,
+ enable_resize=False,
+ shadow_radius=6,
+ shadow_visible=True):
+ gtk.Plug.__init__(self, 0)
+ self.shadow_radius = shadow_radius
+ self.enable_resize = enable_resize
+ self.shadow_visible = shadow_visible
+ self.background_color = (1, 1, 1, 0.93)
+
+ self.init()
+
+# Mix-in Window methods (except __init__) to EmbedWindow
+EmbedWindow.__bases__ += (Window,)
+
+gobject.type_register(EmbedWindow)
if __name__ == "__main__":
import pseudo_skin
deepin-ui-1.0.3git20120929.tar.gz/dtk/ui/window_base.py
Added
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
+# 2011 ~ 2012 Wang Yong
+#
+# Author: Wang Yong <lazycat.manatee@gmail.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from constant import EDGE_DICT
+import gtk
+from utils import (resize_window, is_double_click, move_window)
+
+class WindowBase(gtk.Window):
+ '''
+ Window base.
+ '''
+
+ def __init__(self,
+ window_type=gtk.WINDOW_TOPLEVEL,
+ ):
+ '''
+ init docs
+ '''
+ gtk.Window.__init__(self, window_type)
+
+ def show_window(self):
+ """
+ Show the window.
+ """
+ self.show_all()
+
+ def toggle_max_window(self):
+ """
+ Toggle the window size between maximized size and normal size.
+ """
+ window_state = self.window.get_state()
+ if window_state == gtk.gdk.WINDOW_STATE_MAXIMIZED:
+ self.unmaximize()
+ else:
+ self.maximize()
+
+ def toggle_fullscreen_window(self):
+ """
+ Toggle the window between fullscreen mode and normal size.
+ """
+ window_state = self.window.get_state()
+ if window_state == gtk.gdk.WINDOW_STATE_FULLSCREEN:
+ self.unfullscreen()
+ else:
+ self.fullscreen()
+
+ def close_window(self):
+ """
+ Close the window. Send the destroy signal to the program.
+
+ @return: Always return False.
+ """
+ # Hide window immediately when user click close button,
+ # user will feeling this software very quick, ;p
+ self.hide_all()
+
+ self.emit("destroy")
+
+ return False
+
+ def min_window(self):
+ """
+ Minimize the window. Make it iconified.
+ """
+ self.iconify()
+
+ def resize_window(self, widget, event):
+ """
+ Resize the window.
+
+ @param widget: The window of type gtk.Widget.
+ @param event: A signal of type gtk.gdk.Event.
+ """
+ if self.enable_resize:
+ edge = self.get_edge()
+ if edge != None:
+ resize_window(self, event, self, edge)
+
+ def is_disable_window_maximized(self):
+ """
+ An interface which indicates whether the window could be maximized, you should implement this function you own.
+ @return: Always return False.
+ """
+ return False
+
+ def monitor_window_state(self, widget, event):
+ """
+ Internal function to monitor window state,
+
+ add shadow when window at maximized or fullscreen status. Otherwise hide shadow.
+
+ @param widget: The window of type gtk.Widget.
+ @param event: The event of gtk.gdk.Event.
+ """
+ window_state = self.window.get_state()
+ if window_state in [gtk.gdk.WINDOW_STATE_MAXIMIZED, gtk.gdk.WINDOW_STATE_FULLSCREEN]:
+ self.hide_shadow()
+
+ if self.is_disable_window_maximized():
+ self.unmaximize()
+ else:
+ self.show_shadow()
+
+ def add_move_event(self, widget):
+ """
+ Add move event callback.
+
+ @param widget: A widget of type gtk.Widget.
+ """
+ widget.connect("button-press-event", lambda w, e: move_window(w, e, self))
+
+ def add_toggle_event(self, widget):
+ """
+ Add toggle event callback.
+
+ @param widget: A widget of type gtk.Widget.
+ """
+ widget.connect("button-press-event", self.double_click_window)
+
+ def double_click_window(self, widget, event):
+ """
+ Double click event handler of the window. It will maximize the window.
+
+ @param widget: A widget of type gtk.Widget.
+ @param event: A event of type gtk.gdk.Event.
+ @return: Always return False.
+ """
+ if is_double_click(event):
+ self.toggle_max_window()
+
+ return False
+
+ def get_edge(self):
+ """
+ Get the edge which the cursor is on, according to the cursor type.
+
+ @return: If there is a corresponding cursor type, an instance of gtk.gdk.WindowEdge is returned, else None is returned.
+ """
+ if EDGE_DICT.has_key(self.cursor_type):
+ return EDGE_DICT[self.cursor_type]
+ else:
+ return None
+
+ def draw_mask(self, cr, x, y, w, h):
+ '''
+ Draw mask interface, you should implement this function own.
+
+ @param cr: Cairo context.
+ @param x: X coordinate of draw area.
+ @param y: Y coordinate of draw area.
+ @param w: Width of draw area.
+ @param h: Height of draw area.
+ '''
+ pass
+
+ def get_cursor_type_with_coordinate(self, ex, ey, wx, wy, ww, wh):
+ if wx <= ex <= wx + self.shadow_padding:
+ if wy <= ey <= wy + self.shadow_padding * 2:
+ return gtk.gdk.TOP_LEFT_CORNER
+ elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
+ return gtk.gdk.BOTTOM_LEFT_CORNER
+ elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
+ return gtk.gdk.LEFT_SIDE
+ else:
+ return None
+ elif wx + ww - self.shadow_padding <= ex <= wx + ww:
+ if wy <= ey <= wy + self.shadow_padding * 2:
+ return gtk.gdk.TOP_RIGHT_CORNER
+ elif wy + wh - (self.shadow_padding * 2) <= ey <= wy + wh:
+ return gtk.gdk.BOTTOM_RIGHT_CORNER
+ elif wy + self.shadow_padding < ey < wy + wh - self.shadow_padding:
+ return gtk.gdk.RIGHT_SIDE
+ else:
+ return None
+ elif wx + self.shadow_padding < ex < wx + ww - self.shadow_padding:
+ if wy <= ey <= wy + self.shadow_padding:
+ return gtk.gdk.TOP_SIDE
+ elif wy + wh - self.shadow_padding <= ey <= wy + wh:
+ return gtk.gdk.BOTTOM_SIDE
+ else:
+ return None
+ else:
+ return None
+
deepin-ui-1.0.3git20120929.tar.gz/embed_demo.py
Added
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
+# 2011 ~ 2012 Wang Yong
+#
+# Author: Wang Yong <lazycat.manatee@gmail.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from dtk.ui.init_skin import init_skin
+from dtk.ui.utils import get_parent_dir
+import os
+
+app_theme = init_skin(
+ "deepin-ui-demo",
+ "1.0",
+ "01",
+ os.path.join(get_parent_dir(__file__), "skin"),
+ os.path.join(get_parent_dir(__file__), "app_theme"),
+ )
+
+# from dtk.ui.window import EmbedWindow
+from dtk.ui.window import EmbedWindow
+import gtk
+
+if __name__ == "__main__":
+ gtk.gdk.threads_init()
+
+ window = EmbedWindow()
+ window.set_default_size(200, 100)
+
+ window.show_all()
+
+ gtk.main()
deepin-ui-1.0.3git20120929.tar.gz/tab_demo.py
Added
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
+# 2011 ~ 2012 Wang Yong
+#
+# Author: Wang Yong <lazycat.manatee@gmail.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from dtk.ui.init_skin import init_skin
+from dtk.ui.utils import get_parent_dir
+import os
+
+app_theme = init_skin(
+ "deepin-ui-demo",
+ "1.0",
+ "01",
+ os.path.join(get_parent_dir(__file__), "skin"),
+ os.path.join(get_parent_dir(__file__), "app_theme"),
+ )
+
+from dtk.ui.application import Application
+from dtk.ui.dragable_tab import TabBox
+from dtk.ui.constant import DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT
+import gtk
+
+if __name__ == "__main__":
+ # Init application.
+ application = Application()
+
+ # Set application default size.
+ application.set_default_size(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT)
+
+ # Set application icon.
+ application.set_icon(app_theme.get_pixbuf("icon.ico"))
+
+ # Set application preview pixbuf.
+ application.set_skin_preview(app_theme.get_pixbuf("frame.png"))
+
+ # Add titlebar.
+ application.add_titlebar(
+ ["theme", "max", "min", "close"],
+ app_theme.get_pixbuf("logo.png"),
+ "Tab demo",
+ "Tab demo",
+ )
+
+ tabbox = TabBox()
+ align = gtk.Alignment()
+ align.set(0.5, 0.5, 1, 1)
+ align.set_padding(2, 2, 2, 2)
+ align.add(tabbox)
+
+
+ application.main_box.pack_start(align)
+
+ application.run()
deepin-ui-1.0.3git20120929.tar.gz/treeview_demo.py
Added
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2011 ~ 2012 Deepin, Inc.
+# 2011 ~ 2012 Wang Yong
+#
+# Author: Wang Yong <lazycat.manatee@gmail.com>
+# Maintainer: Wang Yong <lazycat.manatee@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from dtk.ui.init_skin import init_skin
+from dtk.ui.utils import get_parent_dir
+import os
+
+app_theme = init_skin(
+ "deepin-ui-demo",
+ "1.0",
+ "01",
+ os.path.join(get_parent_dir(__file__), "skin"),
+ os.path.join(get_parent_dir(__file__), "app_theme"),
+ )
+
+from dtk.ui.application import Application
+from dtk.ui.new_treeview import TreeView
+from dtk.ui.constant import DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT
+from dtk.ui.file_treeview import (get_dir_items, sort_by_name, sort_by_size,
+ sort_by_type, sort_by_mtime)
+import gtk
+
+if __name__ == "__main__":
+ # Init application.
+ application = Application()
+
+ # Set application default size.
+ application.set_default_size(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT)
+
+ # Set application icon.
+ application.set_icon(app_theme.get_pixbuf("icon.ico"))
+
+ # Set application preview pixbuf.
+ application.set_skin_preview(app_theme.get_pixbuf("frame.png"))
+
+ # Add titlebar.
+ application.add_titlebar(
+ ["theme", "max", "min", "close"],
+ app_theme.get_pixbuf("logo.png"),
+ "TreeView demo",
+ "TreeView demo",
+ )
+
+ # Add TreeView.
+ treeview = TreeView(get_dir_items(os.path.expanduser("~")))
+ # treeview = TreeView(get_dir_items("/"))
+ treeview_align = gtk.Alignment()
+ treeview_align.set(0.5, 0.5, 1, 1)
+ treeview_align.set_padding(0, 2, 2, 2)
+
+ treeview.set_column_titles(["文件名", "大小", "类型", "修改时间"],
+ [sort_by_name, sort_by_size, sort_by_type, sort_by_mtime])
+
+ treeview_align.add(treeview)
+ application.main_box.pack_start(treeview_align)
+
+ application.run()
deepin-ui-1.0git20120817.tar.gz/debian
Deleted
-(directory)
deepin-ui-1.0git20120817.tar.gz/debian/changelog
Deleted
-deepin-ui (1+git201208171059) precise; urgency=low
-
- * New upstream udpates.
-
- -- Li Longyu (Ai Kotoba) <leaeasy@gmail.com> Fri, 17 Aug 2012 10:59:17 +0800
-
-deepin-ui (1+git201207161102deepin2) precise; urgency=low
-
- * Non-maintainer upload.
- * remove release note for deepin-software-center to install it.
-
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com> Thu, 26 Jul 2012 10:36:06 +0800
-
-deepin-ui (1+git201207161102deepin1) precise; urgency=low
-
- * add python-xlib depends.
-
- -- Li Longyu (Ai Kotoba) <leaeasy@gmail.com> Mon, 23 Jul 2012 09:01:54 +0800
-
-deepin-ui (1+git201207161102) precise; urgency=low
-
- * Non-maintainer upload.
- * move translation to system dir.
-
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com> Mon, 16 Jul 2012 11:01:57 +0800
-
-deepin-ui (1+git201207131728) precise; urgency=low
-
- * upstream updates.
-
- -- Li Longyu <leaeasy@gmail.com> Fri, 13 Jul 2012 17:29:40 +0800
-
-deepin-ui (1+git201207131504-1) precise; urgency=low
-
- * fix translation display error bug
-
- -- Li Longyu <leaeasy@gmail.com> Fri, 13 Jul 2012 07:06:02 +0800
-
-deepin-ui (1+git201207130915-1) precise; urgency=low
-
- * fix bugs that translation did not work.
-
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com> Fri, 13 Jul 2012 09:15:27 +0800
-
-deepin-ui (1+git20120712-1) precise; urgency=low
-
- * Upstream update.
-
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com> Thu, 12 Jul 2012 20:18:33 +0800
-
-deepin-ui (1+git20120711-1) precise; urgency=low
-
- * Upstream update.
-
- -- Yueqian Zhang <zhangyueqian@linuxdeepin.com> Wed, 11 Jul 2012 11:55:50 +0800
-
-deepin-ui (1+git20120621-1) precise; urgency=low
-
- * Upstream update.
-
- -- Li Longyu <leaeasy@gmail.com> Thu, 21 Jun 2012 15:42:39 +0800
-
-deepin-ui (1+git20120606-2) precise; urgency=low
-
- * Upstream update.
-
- -- Li Longyu <leaeasy@gmail.com> Thu, 21 Jun 2012 15:40:47 +0800
-
-deepin-ui (1+git20120606-1) precise; urgency=low
-
- * add deepin-ui-demo package
- * add debconf file
-
- -- Li Longyu <leaeasy@gmail.com> Wed, 06 Jun 2012 15:39:14 +0800
-
-deepin-ui (1+git20120605-4) precise; urgency=low
-
- * add deepin-ui-demo
- * add debian/NEWS file
-
- -- Li Longyu <leaeasy@gmail.com> Wed, 06 Jun 2012 15:39:12 +0800
-
-deepin-ui (1+git20120605-3) precise; urgency=low
-
- * add python-imaging depends
-
- -- Li Longyu <leaeasy@gmail.com> Tue, 05 Jun 2012 14:38:41 +0800
-
-deepin-ui (1+git20120605-2) precise; urgency=low
-
- * Update treeview.py color.
-
- -- Li Longyu <leaeasy@gmail.com> Tue, 05 Jun 2012 12:51:25 +0800
-
-deepin-ui (1+git20120605-1) precise; urgency=low
-
- * Upstreamer updates.
-
- -- Li Longyu <leaeasy@gmail.com> Tue, 05 Jun 2012 10:08:15 +0800
-
-deepin-ui (1+git20120508-1) precise; urgency=low
-
- * Upstreamer updates.
-
- -- Li Longyu <leaeasy@gmail.com> Tue, 08 May 2012 14:50:57 +0800
-
-deepin-ui (1+git20120503-1) precise; urgency=low
-
- * update menuitem.
-
- -- Li Longyu <leaeasy@gmail.com> Thu, 03 May 2012 12:22:09 +0800
-
-deepin-ui (1+git20120502-1) precise; urgency=low
-
- * Upstreamer updates.
-
- -- Li Longyu <leaeasy@gmail.com> Wed, 02 May 2012 14:35:25 +0800
-
-deepin-ui (1+git8c2442628-1) unstable; urgency=low
-
- * Upstreamer updates.
-
- -- Li Longyu <leaeasy@gmail.com> Fri, 20 Apr 2012 16:50:25 +0800
-
-deepin-ui (1+git7430d0fb-1) unstable; urgency=low
-
- * Initial release
-
- -- Li Longyu <leaeasy@gmail.com> Fri, 06 Apr 2012 12:34:55 +0800
deepin-ui-1.0git20120817.tar.gz/debian/compat
Deleted
-8
deepin-ui-1.0git20120817.tar.gz/debian/control
Deleted
-Source: deepin-ui
-Priority: extra
-Maintainer: Li Longyu <leaeasy@gmail.com>
-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
-Standards-Version: 3.9.2
-Section: libs
-Homepage: http://www.linuxdeepin.com/
-Vcs-Git: git://github.com/manateelazycat/deepin-ui.git
-Vcs-Browser: https://github.com/manateelazycat/deepin-ui.git
-
-Package: deepin-ui
-Section: libdevel
-Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, python ( >=2.7), libgtk2.0-0, libcairo2, python-gtk2, python-imaging,
- python-xlib
-Suggests: deepin-ui-demo
-Description: LinuxDeepin UI libs
- UI toolkit for Linux Deepin,Awesome and Beautiful UI libs with LinuxDeepin
-
-Package: deepin-ui-demo
-Architecture: all
-Depends: deepin-ui, ${misc:Depends}
-Description: LinuxDeepin UI libs demos
- Include Deepin UI demo.
deepin-ui-1.0git20120817.tar.gz/debian/copyright
Deleted
-Format: http://dep.debian.net/deps/dep5
-Upstream-Name: deepin-ui
-Source: <url://example.com>
-
-Files: *
-Copyright: <years> <put author's name and email here>
- <years> <likewise for another author>
-License: <special license>
- <Put the license of the package here indented by 1 space>
- <This follows the format of Description: lines in control file>
- .
- <Including paragraphs>
-
-# If you want to use GPL v2 or later for the /debian/* files use
-# the following clauses, or change it to suit. Delete these two lines
-Files: debian/*
-Copyright: 2012 Li Longyu <leaeasy@gmail.com>
-License: GPL-2+
- This package is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- .
- This package is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>
- .
- On Debian systems, the complete text of the GNU General
- Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
-
-# Please also look if there are files or directories which have a
-# different copyright/license attached and list them here.
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui-demo.desktop
Deleted
-[Desktop Entry]
-Name=Deepin UI Demo
-Comment=UI toolkit for Linux Deepin.
-Icon=distributor-logo-deepin
-Exec=deepin-ui-demo
-Terminal=false
-Type=Application
-Categories=GNOME;GTK;Settings;DesktopSettings;
-
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui-demo.install
Deleted
-debian/deepin-ui-demo.desktop /usr/share/applications
-app_theme /usr/share/deepin-ui-demo
-skin /usr/share/deepin-ui-demo
-demo.py /usr/share/deepin-ui-demo
-cover /usr/share/deepin-ui-demo
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui-demo.links
Deleted
-/usr/share/deepin-ui-demo/demo.py /usr/bin/deepin-ui-demo
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui.install
Deleted
-/usr/share/pyshared/dtk/
-/usr/lib
-/usr/share
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui.links
Deleted
-/usr/share/pyshared/dtk/theme /usr/lib/python2.7/dist-packages/dtk/theme
deepin-ui-1.0git20120817.tar.gz/debian/deepin-ui.postinst
Deleted
-#!/bin/sh
-set -e
-
-# . /usr/share/debconf/confmodule
-# db_version 2.0
-# db_capb backup
-# db_get deepin-ui/release-note
-
-if which pycompile >/dev/null 2>&1;then
- pycompile -p deepin-ui
-fi
-
-
-# db_input high deepin-ui/release-note || true
-# db_go
deepin-ui-1.0git20120817.tar.gz/debian/docs
Deleted
-README
deepin-ui-1.0git20120817.tar.gz/debian/po
Deleted
-(directory)
deepin-ui-1.0git20120817.tar.gz/debian/po/POTFILES.in
Deleted
-[type: gettext/rfc822deb] templates
deepin-ui-1.0git20120817.tar.gz/debian/po/templates.pot
Deleted
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"Report-Msgid-Bugs-To: deepin-ui@packages.debian.org\n"
-"POT-Creation-Date: 2012-06-06 13:57+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid "Deepin-UI(DTK) Release-Note"
-msgstr ""
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid "IMPORTANT READ CAREFULLY:"
-msgstr ""
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid ""
-"Please install the patched python-gtk2 to avoid memery leak.\n"
-" You can download it from\n"
-" http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/"
-msgstr ""
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid ""
-"We have send our patch to upstream:\n"
-" gnome-bugs #674092\n"
-" debbugs #668709\n"
-" lp:981376"
-msgstr ""
deepin-ui-1.0git20120817.tar.gz/debian/po/zh_CN.po
Deleted
-# Chinese translations for deepin-ui package
-# deepin-ui 软件包的简体中文翻译.
-# Copyright (C) 2012 THE deepin-ui'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the deepin-ui package.
-# wzssyqa <wzssyqa@gmail.com>, 2012.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: deepin-ui 1+git20120605\n"
-"Report-Msgid-Bugs-To: deepin-ui@packages.debian.org\n"
-"POT-Creation-Date: 2012-06-06 13:57+0800\n"
-"PO-Revision-Date: 2012-06-06 13:57+0800\n"
-"Last-Translator: wzssyqa <wzssyqa@gmail.com>\n"
-"Language-Team: Chinese (simplified) <translation-team-zh-cn@lists."
-"sourceforge.net>\n"
-"Language: zh_CN\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid "Deepin-UI(DTK) Release-Note"
-msgstr "深度图形库发布指南"
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid "IMPORTANT READ CAREFULLY:"
-msgstr "重要:请仔细阅读"
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid ""
-"Please install the patched python-gtk2 to avoid memery leak.\n"
-" You can download it from\n"
-" http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/"
-msgstr ""
-"下载安装打过补丁的python-gtk2软件包,否则会导致内存泄露.\n"
-" 留意下载地址\n"
-" http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/"
-
-#. Type:note
-#. Description
-#: ../templates:1001
-msgid ""
-"We have send our patch to upstream:\n"
-" gnome-bugs #674092\n"
-" debbugs #668709\n"
-" lp:981376"
-msgstr ""
-"开发团队已经把补丁反馈到上游:\n"
-" gnome-bugs #674092\n"
-" debbugs #668709\n"
-" lp:981376"
deepin-ui-1.0git20120817.tar.gz/debian/rules
Deleted
-#!/usr/bin/make -f
-# -*- makefile -*-
-# Sample debian/rules that uses debhelper.
-# This file was originally written by Joey Hess and Craig Small.
-# As a special exception, when this file is copied by dh-make into a
-# dh-make output file, you may use that output file without restriction.
-# This special exception was added by Craig Small in version 0.37 of dh-make.
-
-# Uncomment this to turn on verbose mode.
-#export DH_VERBOSE=1
-
-%:
- dh $@ --with python2
-
-override_dh_auto_install:
- dh_auto_install
- mkdir -p ./debian/tmp/usr/share/pyshared
- mv ./debian/tmp/usr/dtk/locale ./debian/tmp/usr/share
- mv ./debian/tmp/usr/dtk ./debian/tmp/usr/share/pyshared
deepin-ui-1.0git20120817.tar.gz/debian/source
Deleted
-(directory)
deepin-ui-1.0git20120817.tar.gz/debian/source/format
Deleted
-3.0 (native)
deepin-ui-1.0git20120817.tar.gz/debian/templates
Deleted
-Template:deepin-ui/release-note
-Type:note
-_Description: Deepin-UI(DTK) Release-Note
- IMPORTANT READ CAREFULLY:
- .
- Please install the patched python-gtk2 to avoid memery leak.
- You can download it from
- http://packages.linuxdeepin.com/deepin/pool/main/p/pygtk/
- .
- We have send our patch to upstream:
- gnome-bugs #674092
- debbugs #668709
- lp:981376
deepin-ui-demo.desktop
Added
+[Desktop Entry]
+Name=Deepin UI Demo
+GenericName=Deepin UI Demo
+Comment=UI toolkit for Linux Deepin.
+Icon=distributor-logo
+Exec=deepin-ui-demo
+Terminal=false
+Type=Application
+Categories=GNOME;GTK;Settings;DesktopSettings;
+
No build results available
No rpmlint results available
Request History
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
mrdocs accepted request about 12 years ago
Reviewed OK