1#! /usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4# romiq.kh@gmail.com, 2015
5
6import sys, os
7import traceback
8import tkinter
9
10from tkguibrowser import TkBrowser, hlesc, cesc, fmt_hl, fmt_hl_len, fmt_arg, \
11    fmt_dec, fmt_dec_len
12
13APPNAME = "Test tkinter gui browser"
14VERSION = "v0.1 2015-06-20"
15
16class App(TkBrowser):
17    def __init__(self, master):
18        super().__init__(master)
19
20    def init_gui(self):
21        self.master.title(APPNAME)
22        # path
23        if hasattr(sys, 'frozen'):
24            self.app_path = sys.executable
25        else:
26            self.app_path = __file__
27        self.app_path = os.path.abspath(os.path.dirname(self.app_path))
28
29    def create_widgets(self):
30        super().create_widgets()
31
32        self.path_handler["test"] = [self.path_test, "Tests"]
33
34        repath = "/"
35        for cmd, arg in self.start_act:
36            if cmd == "open":
37                repath = ""
38                if not self.open_path(arg):
39                    print("DEBUG: stop opening after " + arg)
40                    repath = ""
41                    break
42        if repath:
43            self.open_path(repath)
44
45
46    def create_menu(self):
47        super().create_menu()
48        self.menufile = tkinter.Menu(self.master, tearoff = 0)
49        self.menubar.add_cascade(menu = self.menufile,
50                label = "File")
51        self.menufile.add_separator()
52        self.menufile.add_command(
53                command = self.on_exit,
54                label = "Quit")
55
56    def path_default(self, path):
57        self.switch_view(0)
58        self.update_gui("Outline")
59        self.clear_info()
60        self.add_info("Open path\n\n" + str(path))
61
62        self.add_info("\n\n")
63        self.add_info("<a href=\"http://example.com/test\">example.com</a>\n")
64        self.add_info("\n\n<b>This is multi-")
65        self.add_info("line\nbold</b> text\n")
66        self.add_info("\n\n<u>This is multi-")
67        self.add_info("line\nunderline</u> text\n")
68        self.add_info("\n\n<font color=\"#ff00FF\">This is multi-")
69        self.add_info("line\ncolor</font> text\n")
70
71        self.add_info("\n<font bg=\"red\" color=\"white\"> <b>White</b> on <i>red</i> </font>\n")
72
73        self.insert_lb_act("Testing", "/test")
74        return True
75
76    def path_test(self, path):
77        if len(path) > 1:
78            return self.path_test_item(path)
79        if self.last_path != ("test",):
80            self.update_gui("Test")
81            self.insert_lb_act("Outline", [])
82            self.insert_lb_act("-", None)
83            self.insert_lb_act("Info", "/test/info")
84            self.insert_lb_act("Image", "/test/image")
85            self.switch_view(0)
86            self.clear_info()
87            self.add_info("Select test from outline")
88        return True
89
90    def path_test_item(self, path):
91        def display_page():
92            item = None
93            path = self.curr_path
94            if len(path) > 2:
95                item = path[2]
96            self.clear_info()
97            sm = self.gl_state.get("test.info.mode", 0)
98            if item is None:
99                sm = -1
100            self.upd_toolgrp(self.curr_state["gbtns"], sm)
101            if item is None:
102                self.switch_view(0)
103                self.add_info("Select item " + path[1])
104            else:
105                if path[1] == "image":
106                    self.switch_view(1)
107                    self.main_image = tkinter.PhotoImage(file = "img/splash.gif")
108                elif path[1] == "info":
109                    self.switch_view(0)
110                    self.add_info("Information panel for {}\n".format(path))
111                    self.add_info("Local mode {}\n".format(
112                        self.curr_state.get("mode", None)))
113                    self.add_info("Global mode {}\n".format(
114                        self.gl_state.get("test.info.mode", None)))
115                    for i in range(100):
116                        self.add_info("  Item {}\n".format(i))
117
118        if self.last_path[:2] != ("test", path[1]):
119            self.update_gui("Test %s" % path[1])
120            self.insert_lb_act("Testing", "/test")
121            self.insert_lb_act("-", None)
122            for i in range(15):
123                self.insert_lb_act("{} #{}".format(path[1], i),
124                    path[:2] + (i,), i)
125            # create mode buttons
126            def sw_mode1():
127                print("Mode 1")
128                self.curr_state["mode"] = 1
129                self.curr_state["btn1"].config(state = tkinter.DISABLED)
130                self.curr_state["btn2"].config(state = tkinter.NORMAL)
131                display_page()
132            def sw_mode2():
133                print("Mode 2")
134                self.curr_state["mode"] = 2
135                self.curr_state["btn1"].config(state = tkinter.NORMAL)
136                self.curr_state["btn2"].config(state = tkinter.DISABLED)
137                display_page()
138            self.curr_state["btn1"] = self.add_toolbtn("Mode 1", sw_mode1)
139            self.curr_state["btn1"].config(state = tkinter.DISABLED)
140            self.curr_state["btn2"] = self.add_toolbtn("Mode 2", sw_mode2)
141            # we store buttons in local state
142            self.curr_state["gbtns"] = self.add_toolgrp(None, "test.info.mode",
143                {0: "mode 1", 1: "mode 2", 2: "mode 3"}, display_page)
144
145        # change
146        item = None
147        if len(path) > 2:
148            # index
149            self.select_lb_item(path[2])
150        else:
151            self.select_lb_item(None)
152        # display
153        display_page()
154        return True
155
156def main():
157    root = tkinter.Tk()
158    app = App(master = root)
159    argv = sys.argv[1:]
160    while len(argv) > 0:
161        if argv[0] == "--nooutline": # open data
162            app.gui_setup["outline"] = False
163            argv = argv[1:]
164        else:
165            app.start_act.append(["open", argv[0]])
166            argv = argv[1:]
167    app.mainloop()
168
169if __name__ == "__main__":
170    main()
171