~umang/indicator-stickynotes/trunk

« back to all changes in this revision

Viewing changes to stickynotes/gui.py

  • Committer: Umang Varma
  • Date: 2012-06-23 15:22:32 UTC
  • Revision ID: git-v1:8a2acc262a26ec4423079701a1be9e3c429f6ba0
Move backend and gui to sticknotes package

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python3
 
2
 
3
# Copyright © 2012 Umang Varma <umang.me@gmail.com>
 
4
 
5
# This file is part of indicator-stickynotes.
 
6
 
7
# indicator-stickynotes is free software: you can redistribute it and/or
 
8
# modify it under the terms of the GNU General Public License as published by
 
9
# the Free Software Foundation, either version 3 of the License, or (at your
 
10
# option) any later version.
 
11
 
12
# indicator-stickynotes is distributed in the hope that it will be useful, but
 
13
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 
14
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 
15
# more details.
 
16
 
17
# You should have received a copy of the GNU General Public License along with
 
18
# indicator-stickynotes.  If not, see <http://www.gnu.org/licenses/>.
 
19
 
 
20
from datetime import datetime
 
21
 
 
22
from gi.repository import Gtk, Gdk, Gio, GObject, GtkSource
 
23
 
 
24
class StickyNote(object):
 
25
 
 
26
    def __init__(self, note):
 
27
        self.note = note
 
28
        self.locked = self.note.properties.get("locked", False)
 
29
        self.builder = Gtk.Builder()
 
30
        GObject.type_register(GtkSource.View)
 
31
        self.builder.add_from_file("StickyNotes.glade")
 
32
        self.builder.connect_signals(self)
 
33
        # Get necessary objects
 
34
        self.txtNote = self.builder.get_object("txtNote")
 
35
        self.winMain = self.builder.get_object("MainWindow")
 
36
        self.winMain.set_name("main-window")
 
37
        self.bAdd = self.builder.get_object("bAdd")
 
38
        self.imgAdd = self.builder.get_object("imgAdd")
 
39
        self.imgResizeR = self.builder.get_object("imgResizeR")
 
40
        self.eResizeR = self.builder.get_object("eResizeR")
 
41
        self.bLock = self.builder.get_object("bLock")
 
42
        self.imgLock = self.builder.get_object("imgLock")
 
43
        self.imgUnlock = self.builder.get_object("imgUnlock")
 
44
        self.bClose = self.builder.get_object("bClose")
 
45
        self.confirmDelete = self.builder.get_object("confirmDelete")
 
46
        # Run
 
47
        self.run()
 
48
 
 
49
    def run(self, *args):
 
50
        # (Maybe?) Remove this eventually
 
51
        settings = Gtk.Settings.get_default()
 
52
        settings.props.gtk_button_images = True
 
53
        # Load and set CSS
 
54
        css = Gtk.CssProvider()
 
55
        css.load_from_file(Gio.File.new_for_path("style.css"))
 
56
        Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),
 
57
                css, 800)
 
58
        # Set text buffer
 
59
        self.bbody = GtkSource.Buffer()
 
60
        self.bbody.begin_not_undoable_action()
 
61
        self.bbody.set_text(self.note.body)
 
62
        self.bbody.set_highlight_matching_brackets(False)
 
63
        self.bbody.end_not_undoable_action()
 
64
        self.txtNote.set_buffer(self.bbody)
 
65
        #Show
 
66
        self.winMain.show()
 
67
        # Make resize work
 
68
        self.winMain.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
 
69
        self.eResizeR.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
 
70
        # Move Window
 
71
        self.winMain.move(*self.note.properties.get("position", (10,10)))
 
72
        self.winMain.resize(*self.note.properties.get("size", (200,150)))
 
73
        # Mouse over
 
74
        self.eResizeR.get_window().set_cursor(Gdk.Cursor.new_for_display(
 
75
                    self.eResizeR.get_window().get_display(),
 
76
                    Gdk.CursorType.BOTTOM_RIGHT_CORNER))
 
77
        # Set locked state
 
78
        self.set_locked_state(self.locked)
 
79
 
 
80
    def show(self, widget=None, event=None):
 
81
        self.winMain.present()
 
82
        self.winMain.stick()
 
83
        self.winMain.move(*self.note.properties.get("position", (10,10)))
 
84
 
 
85
    def hide(self, *args):
 
86
        self.winMain.hide()
 
87
 
 
88
    def update_note(self):
 
89
        self.note.update(self.bbody.get_text(self.bbody.get_start_iter(),
 
90
            self.bbody.get_end_iter(), True))
 
91
 
 
92
    def move(self, widget, event):
 
93
        self.winMain.begin_move_drag(event.button, event.x_root,
 
94
                event.y_root, event.get_time())
 
95
        return False
 
96
 
 
97
    def resize(self, widget, event, *args):
 
98
        self.winMain.begin_resize_drag(Gdk.WindowEdge.SOUTH_EAST,
 
99
                event.button, event.x_root, event.y_root, event.get_time())
 
100
        return True
 
101
 
 
102
    def properties(self):
 
103
        prop = {"position":self.winMain.get_position(),
 
104
                "size":self.winMain.get_size(), "locked":self.locked}
 
105
        if not self.winMain.get_visible():
 
106
            prop["position"] = self.note.properties.get("position", (10, 10))
 
107
            prop["size"] = self.note.properties.get("size", (200, 200))
 
108
        return prop
 
109
 
 
110
    def save(self, *args):
 
111
        self.note.noteset.save()
 
112
        return False
 
113
 
 
114
    def add(self, *args):
 
115
        self.note.noteset.new()
 
116
        return False
 
117
 
 
118
    def delete(self, *args):
 
119
        confirm = self.confirmDelete.run()
 
120
        self.confirmDelete.hide()
 
121
        if confirm == 1:
 
122
            self.note.delete()
 
123
            self.winMain.hide()
 
124
            return False
 
125
        else:
 
126
            return True
 
127
 
 
128
    def set_locked_state(self, locked):
 
129
        self.locked = locked
 
130
        if not self.bLock.get_active() == self.locked:
 
131
            self.bLock.set_active(self.locked)
 
132
        self.txtNote.set_editable(not self.locked)
 
133
        self.txtNote.set_cursor_visible(not self.locked)
 
134
        self.bLock.set_image({True:self.imgLock,
 
135
            False:self.imgUnlock}[self.locked])
 
136
 
 
137
    def lock_toggled(self, *args):
 
138
        self.set_locked_state(self.bLock.get_active())
 
139
 
 
140
    def quit(self, *args):
 
141
        Gtk.main_quit()
 
142
 
 
143
    def focus_out(self, *args):
 
144
        self.save(*args)
 
145