click addEventListener

前回なにげに書いたコードを見返してアレ?となった。
addEventListener には click イベントを指定できるのか。
touchend とか mouseup みたいなのでなくていいんだね。

タッチパネルとマウスの両方がこの指定でイケるみたい。
それぞれでどんな感じになるか実験ページを書いてみよう。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>タップとクリック</title>
<!-- for Smart Phone -->
<meta name="viewport" content="
    width=device-width,
    initial-scale=1.0,
    minimum-scale=1.0,
    maximum-scale=1.0,
    user-scalable=no" />
<style>
body {
    -webkit-text-size-adjust: 100%;
    font-size: 24pt;
}
div {
    background-color: #000088;
    border: 1px solid #0000ff;
    color: #ffffff;
}
</style>
<script type="text/javascript"><!--

    var counts = [0, 0, 0];
    var touch, mouse, click = null;

    var init = function() {
        // Touch
        //if (window.TouchEvent) {
            touch = document.getElementById("ID_TAP");
            touch.addEventListener("touchend", function() {
                counts[0] += 1;
                touch.innerHTML = "タップカウント: " + counts[0];
            });
        //}
        // Mouse
        mouse = document.getElementById("ID_MOUSE");
        mouse.addEventListener("mouseup", function() {
            counts[1] += 1;
            mouse.innerHTML = "マウスカウント: " + counts[1];
        });
        // Click
        click = document.getElementById("ID_CLICK");
        click.addEventListener("click", function() {
            counts[2] += 1;
            click.innerHTML = "クリックカウント: " + counts[2];
        });
    }
    //-->
</script>

</head>
<body onLoad="init()">

<div id="ID_TAP">タップカウント: 0</div>
<br />
<div id="ID_MOUSE">マウスカウント: 0</div>
<br />
<div id="ID_CLICK">クリックカウント: 0</div>
<br />
<p><a href=".">Back</a></p>
</body>
</html>

タップとクリック

tap_click

あれ?タッチパネルエミュレートで mouseup イベントが発生するのね。
iPhone Safari で試してもやはり同じ、そういうものなのか。

touchend は当然タッチパネルかエミュレートでしか反応しない。
まあこのイベントは本来マルチタッチ用途ですし使い道が違うかと。

click イベントという名前も直感的だし両対応だし今後はコイツだな。
しかし HTML5 関連サイトでもあまり見かけないような。

a download

Web を回って気になるタグを見つけた。
a 要素には download 属性を付けることができるんですね。

a 要素 – HTML | MDN

Safari は現在未対応か、残念。
Apple はセキュリティ関連で対応しないのかもだけど。

JavaScript – aタグのdownload属性 – Qiita

こんなことができるみたい。
いや、これって通常はダウンロードできないファイルに使えないか?
application/x-php とかね。
PHP が実行される前のファイルのままダウンロードできるかも。

<a href="#" download="index.php">PHP ファイルをダウンロード</a>

とやってみると Chrome は OK だけど Firefox はダメ。
PHP は当然のように実行されてしまった、残念。
うーん、素直に MDN の方法を試してみる。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>a download</title>
<!-- for Smart Phone -->
<meta name="viewport" content="
    width=device-width,
    initial-scale=1.0,
    minimum-scale=1.0,
    maximum-scale=1.0,
    user-scalable=no" />
<script type="text/javascript"><!--
    var init = function() {
        var link = document.createElement('a');
        link.innerHTML = 'download php file';

        link.addEventListener('click', function(ev) {
            link.href = 'index.php';
            link.download = "download.php";
        }, false);
        document.getElementById("ID_DL").appendChild(link);
    }
    //-->
</script>
</head>
<body onLoad="init()">
<div id="ID_DL"></div>

<br />
<p><a href=".">戻る</a></p>
</body>
</html>

a download

a_download

リンクの下線が表示されないしマウスカーソルも矢印のまま。
でもクリックすれば Chrome, Firefox 共ダウンロードできた。
クリックした後は下線が付くのは何故なんだろうな?

PHP はやはり実行された後のファイルしか取得できない。
そういう使い方ではないということでしょう。

でも通常はダウンロードにならない PHP でもダウンロードになるのは確認できた。
iOS 版 Chrome はガン無視されたじゃねーかコノヤロウ。
モバイルで便利そうな仕組みなのにモバイル未対応という…
まあ今後どうなるかはワカンナイZE!

g_file_set_display_name

GFile で g_file_set_display_name すると普通にリネームするんだね。

#!/usr/bin/env python3

import sys
from gi.repository import Gio

f = Gio.File.new_for_path(sys.argv[1])
f.set_display_name("nae_yuki.jpg")

rename

存在しないファイルでこの関数を使うと「存在しないよ!」とエラー。

rename_error

こうなってしまったので気が付いただけですが。
なるほど、メモリ上のデータではなくファイルポインタなのね。

ちなみに、これを利用してリネームツールをとか考えたけど。

mvにサヨナラ!renameコマンドのイケメンぶりが半端ない | techiela

rename コマンドってこんなに便利だったのか…
mv しか使ったことがなかったYO!

GtkPlacesSidebar

あれ、今まで Widget ギャラリーページなんてあったかな?
Widget Gallery: GTK+ 3 Reference Manual

Widget 画像をクリックするとそのページにジャンプできる。
これは微妙に便利。

てか GtkPlacesSidebar というものが 3.10 時からあったのか。
このページのおかげで今頃知ったぞ!

しかしどう見ても Nautilus の左ペインそのまんまだが何だこれ。
試してみるのが一番速いな、ということで。

#!/usr/bin/env python3

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gio, GLib

class SidebarTest(Gtk.Window):
    """
        Nautilus Sidebar
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        # GtkPlacesSidebar
        sidebar = Gtk.PlacesSidebar.new()
        # Select Documents Directory
        doc = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS)
        f = Gio.File.new_for_path(doc)
        sidebar.set_location(f)
        # Add Shortcut
        f = Gio.File.new_for_path("/home/sasakima-nao/doc/html")
        if f.query_exists():
            sidebar.add_shortcut(f)
        # Signal
        sidebar.connect("open-location", self.on_sidebar_open_location)
        # etc...
        #sidebar.set_show_recent(False)
        #sidebar.set_show_other_locations(True)
        #sidebar.set_show_enter_location(True)
        self.add(sidebar)
        self.show_all()

    def do_delete_event(self, event):
        Gtk.main_quit()

    def on_sidebar_open_location(self, sidebar, location, open_flags):
        """
            location @ GFile
        """
        uri = location.get_uri()
        self.set_title(uri)

SidebarTest()
Gtk.main()

sidebar

外付け USB HDD を繋いだら普通に認識までしてくれたぞ。
ブックマークも同じ、本当に Nautilus の左ペインそのまんまじゃないか。
でも何故か 3.18 で「他の場所」部に移動した root が表示される。

ショートカットの追加も可能、ただし実在している必要があるようだ。
一部は非表示にもできるけど基本 Nautilus と同じってことみたい。

うーん、これってどういう場面で使うのだろう?
外部機器の接続監視やサーバーログインを自前でやる必要が無いのはいいが。
オリジナルな「開くダイアログ」以外の使い道が考え付かない DESU。

GtkFlowBox (2)

以前 GtkFlowBox の使い道が解らないとか書いた。
GtkFlowBox | PaePoi

よく考えると Totem のサムネイルに使われていたりする。
そうか、GtkIconView の代わりみたいなものかな。

つまり GtkScrollView を噛ませて画像表示なんかで便利かも。
試しにディレクトリ画像サムネイルを作ってみよう。

#!/usr/bin/env python3

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, GLib, Gio, GdkPixbuf

NAE_PATH = "/home/sasakima-nao/pic/game/gf/nae_yuki_ssr"

class FlowBoxTest(Gtk.Window):
    """
        Easy GtkIconView
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        # GtkFlowBox
        flowbox = Gtk.FlowBox.new()
        flowbox.set_valign(Gtk.Align.START)
        self.get_all_picture(flowbox)
        #flowbox.set_selection_mode(Gtk.SelectionMode.MULTIPLE)
        scroll = Gtk.ScrolledWindow.new()
        scroll.add(flowbox)
        # self
        self.index = 0
        self.add(scroll)
        self.resize(400, 300)
        self.show_all()

    def do_delete_event(self, event):
        Gtk.main_quit()

    def get_all_picture(self, flowbox):
        """
            Thumbnail JPEG File
        """
        d = Gio.file_new_for_path(NAE_PATH);
        # Get GFileEnumerator
        enum = d.enumerate_children(
                Gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
                Gio.FileQueryInfoFlags.NONE)
        for info in enum:
            # info is GFileInfo
            content_type = info.get_content_type()
            if content_type == "image/jpeg":
                name = info.get_name()
                fullpath = "{0}/{1}".format(NAE_PATH, name)
                thumbnail = GdkPixbuf.Pixbuf.new_from_file_at_scale(fullpath, 100, 100, True)
                image = Gtk.Image.new_from_pixbuf(thumbnail)
                flowbox.add(image)

FlowBoxTest()
Gtk.main()

yuki_nae

GtkIconView より圧倒的に簡単だった。
専用のセルレンダラは不要で Widget をそのまま使える。
便利というより簡単で判り易いという使い道みたい。
いや、どんな Widget でも入れられるメリットもある。

でもデータの入れ替えが頻繁な場合は逆に面倒臭くなるなと。
「ドキュメント/ビューアーキテクチャ」とはいったい何だったのか。

ってデータをほとんど入れ替えないならコッチのほうがいいよね。
ということで、優木苗(cv日高里菜)は本当にカワイイです(gf は放置中