Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
083dbaded6 | ||
|
|
6927c4cf08 | ||
|
|
2c1626da05 | ||
|
|
ea611827ea | ||
|
|
8231e746c2 |
No files matched your search
@@ -3,7 +3,7 @@
|
||||
One Color Picker to rule them all! No overhelming menus or settings. An easy tool with the features you need.
|
||||
|
||||
Features:
|
||||
* Pick a color
|
||||
* Pick a color with the zoomable Magnifier
|
||||
* Choose between multiple Color Formats
|
||||
* Let the Color History remember your last colors
|
||||
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-3.0+</project_license>
|
||||
<name>Color Picker</name>
|
||||
<summary>The most intuitive Color Picker to speed up your workflow.</summary>
|
||||
<summary>The most intuitive Color Picker to speed up your workflow</summary>
|
||||
<description>
|
||||
<p>One Color Picker to rule them all! No overhelming menus or settings. An easy tool with the features you need.</p>
|
||||
<p>Features:</p>
|
||||
<ul>
|
||||
<li>Pick a color</li>
|
||||
<li>Pick a color with the zoomable Magnifier</li>
|
||||
<li>Choose between multiple Color Formats</li>
|
||||
<li>Let the Color History remember your last colors</li>
|
||||
</ul>
|
||||
@@ -21,8 +21,18 @@
|
||||
<category>Graphics</category>
|
||||
<category>Development</category>
|
||||
</categories>
|
||||
<launchable type="desktop-id">com.github.ronnydo.colorpicker.desktop</launchable>
|
||||
<releases>
|
||||
<release version="1.0.0" date="2017-07-07" urgency="medium">
|
||||
<description>
|
||||
<ul>
|
||||
<li>Main Release!</li>
|
||||
<li>Implement magnifier (issue #12)</li>
|
||||
<li>Use your mousewheel to zoom the magnifier in and out.</li>
|
||||
<li>Invalid AppData file (issue #17)</li>
|
||||
<li>Code cleanup</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="0.9.5" date="2017-06-27" urgency="medium">
|
||||
<description>
|
||||
<ul>
|
||||
|
||||
@@ -3,7 +3,7 @@ Name=Color Picker
|
||||
Comment=An intuitive Color Picker
|
||||
Exec=com.github.ronnydo.colorpicker
|
||||
Icon=com.github.ronnydo.colorpicker
|
||||
Keywords=color;picker;selector;pipette;
|
||||
Keywords=colorpicker;color;picker;selector;pipette;
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=GTK;Utility;Graphics;Development;
|
||||
@@ -23,5 +23,10 @@
|
||||
<summary>Color History</summary>
|
||||
<description>Color History</description>
|
||||
</key>
|
||||
<key name="zoomlevel" type="i">
|
||||
<default>3</default>
|
||||
<summary>Most recent zoomlevel of the picker's magnifier.</summary>
|
||||
<description>Most recent zoomlevel of the picker's magnifier.</description>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
Vendored
+10
@@ -1,3 +1,13 @@
|
||||
om.github.ronnydo.colorpicker (1.0.0) xenial; urgency=medium
|
||||
|
||||
* Main Release!
|
||||
* Implement magnifier (issue #12)
|
||||
* Use your mousewheel to zoom the magnifier in and out.
|
||||
* Invalid AppData file (issue #17)
|
||||
* Code cleanup
|
||||
|
||||
-- Ronny Dobra <ronnydobra at arcor dot de> Thu, 07 Jul 2017 12:00:00 +0100
|
||||
|
||||
com.github.ronnydo.colorpicker (0.9.5) xenial; urgency=medium
|
||||
|
||||
* Fix issue #13
|
||||
|
||||
Vendored
+1
-1
@@ -13,4 +13,4 @@ Package: com.github.ronnydo.colorpicker
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
||||
Description: An intuitive Color Picker
|
||||
The most intuitive Color Picker to speed up your workflow.
|
||||
The most intuitive Color Picker to speed up your workflow
|
||||
@@ -30,7 +30,6 @@ namespace ColorPicker {
|
||||
icon_name: "com.github.ronnydo.colorpicker",
|
||||
title: _("Color Picker"),
|
||||
resizable: false,
|
||||
//height_request: 500,
|
||||
width_request: 500
|
||||
);
|
||||
}
|
||||
@@ -228,10 +227,14 @@ namespace ColorPicker {
|
||||
|
||||
this.present ();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// trigger picker on startup
|
||||
pick_color_button.clicked ();
|
||||
this.show.connect(() => {
|
||||
pick_color_button.clicked ();
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void update_color_format_combobox_text (Gtk.Entry format_entry, int id) {
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace ColorPicker.Services {
|
||||
public int window_y { get; set; }
|
||||
public int color_format_index { get; set; }
|
||||
public string[] color_history { get; set; }
|
||||
public int zoomlevel { get; set; }
|
||||
|
||||
public static Settings get_instance () {
|
||||
if (instance == null) {
|
||||
|
||||
+170
-27
@@ -17,6 +17,7 @@
|
||||
* Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Authored by: Ronny Dobra <ronnydobra at arcor dot de>
|
||||
* Inspired by: https://github.com/stuartlangridge/ColourPicker/
|
||||
*/
|
||||
|
||||
namespace ColorPicker.Widgets {
|
||||
@@ -27,9 +28,22 @@ namespace ColorPicker.Widgets {
|
||||
public signal void cancelled ();
|
||||
public signal void moved (Gdk.RGBA color);
|
||||
|
||||
const string dark_border_color_string = "#333333";
|
||||
private Gdk.RGBA dark_border_color = Gdk.RGBA();
|
||||
|
||||
const string bright_border_color_string = "#FFFFFF";
|
||||
private Gdk.RGBA bright_border_color = Gdk.RGBA();
|
||||
|
||||
int snapsize = 35; // must be odd to have a 1px magnifier center
|
||||
int min_zoomlevel = 2;
|
||||
int max_zoomlevel = 7;
|
||||
int zoomlevel = 3;
|
||||
|
||||
|
||||
construct {
|
||||
type = Gtk.WindowType.POPUP;
|
||||
}
|
||||
|
||||
|
||||
public Picker () {
|
||||
stick ();
|
||||
@@ -38,10 +52,17 @@ namespace ColorPicker.Widgets {
|
||||
set_skip_taskbar_hint (true);
|
||||
set_skip_pager_hint (true);
|
||||
set_keep_above (true);
|
||||
|
||||
dark_border_color.parse (dark_border_color_string);
|
||||
bright_border_color.parse (bright_border_color_string);
|
||||
|
||||
// restore zoomlevel
|
||||
if (settings.zoomlevel >= min_zoomlevel && settings.zoomlevel <= max_zoomlevel) {
|
||||
zoomlevel = settings.zoomlevel;
|
||||
}
|
||||
|
||||
var screen = get_screen ();
|
||||
set_default_size (screen.get_width (), screen.get_height ());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -55,14 +76,152 @@ namespace ColorPicker.Widgets {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public override bool draw (Cairo.Context cr) {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public override bool motion_notify_event (Gdk.EventMotion e) {
|
||||
Gdk.RGBA color = get_color_at ((int) e.x_root, (int) e.y_root);
|
||||
moved (color);
|
||||
|
||||
set_magnifier_cursor ();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public override bool scroll_event (Gdk.EventScroll e) {
|
||||
switch (e.direction) {
|
||||
case Gdk.ScrollDirection.UP:
|
||||
if (zoomlevel < max_zoomlevel) {
|
||||
zoomlevel++;
|
||||
}
|
||||
set_magnifier_cursor ();
|
||||
break;
|
||||
case Gdk.ScrollDirection.DOWN:
|
||||
if (zoomlevel > min_zoomlevel) {
|
||||
zoomlevel--;
|
||||
}
|
||||
set_magnifier_cursor ();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public void set_magnifier_cursor () {
|
||||
// draw cursor
|
||||
int px, py;
|
||||
get_pointer (out px, out py);
|
||||
|
||||
int shadow_width = 15;
|
||||
var radius = snapsize * zoomlevel / 2;
|
||||
|
||||
// take screenshot
|
||||
var latest_pb = snap (px - snapsize / 2, py - snapsize / 2,
|
||||
snapsize, snapsize);
|
||||
|
||||
// Zoom that screenshot up, and grab a snapsize-sized piece from the middle
|
||||
var scaled_pb = latest_pb.scale_simple (snapsize * zoomlevel + shadow_width * 2 , snapsize * zoomlevel + shadow_width * 2 , Gdk.InterpType.NEAREST);
|
||||
|
||||
// Create the base surface for our cursor
|
||||
var base_surface = new Cairo.ImageSurface (Cairo.Format.ARGB32, snapsize * zoomlevel + shadow_width * 2 , snapsize * zoomlevel + shadow_width * 2);
|
||||
var base_context = new Cairo.Context (base_surface);
|
||||
|
||||
// Create the circular path on our base surface
|
||||
base_context.arc (radius + shadow_width, radius + shadow_width, radius, 0, 2 * Math.PI);
|
||||
|
||||
// Paste in the screenshot
|
||||
Gdk.cairo_set_source_pixbuf (base_context, scaled_pb, 0, 0);
|
||||
|
||||
// Clip to that circular path, keeping the path around for later, and paint the pasted screenshot
|
||||
base_context.save ();
|
||||
base_context.clip_preserve ();
|
||||
base_context.paint ();
|
||||
base_context.restore ();
|
||||
|
||||
|
||||
// Draw a shadow as outside magnifier border
|
||||
double shadow_alpha = 0.6;
|
||||
base_context.set_line_width (1);
|
||||
|
||||
for (int i = 0; i <= shadow_width; i++) {
|
||||
base_context.arc (radius + shadow_width, radius + shadow_width, radius + shadow_width- i, 0, 2 * Math.PI);
|
||||
Gdk.RGBA shadow_color = Gdk.RGBA();
|
||||
shadow_color.parse(dark_border_color_string);
|
||||
shadow_color.alpha = shadow_alpha / ((shadow_width - i + 1)*(shadow_width - i + 1));
|
||||
Gdk.cairo_set_source_rgba (base_context, shadow_color);
|
||||
base_context.stroke ();
|
||||
}
|
||||
|
||||
// Draw an outside bright magnifier border
|
||||
Gdk.cairo_set_source_rgba (base_context, bright_border_color);
|
||||
base_context.arc (radius + shadow_width, radius + shadow_width, radius - 1, 0, 2 * Math.PI);
|
||||
base_context.stroke();
|
||||
|
||||
|
||||
// Draw inside square
|
||||
base_context.set_line_width (1);
|
||||
|
||||
Gdk.cairo_set_source_rgba (base_context, dark_border_color);
|
||||
base_context.move_to (radius + shadow_width - zoomlevel, radius + shadow_width - zoomlevel);
|
||||
base_context.line_to (radius + shadow_width + zoomlevel, radius + shadow_width - zoomlevel);
|
||||
base_context.line_to (radius + shadow_width + zoomlevel, radius + shadow_width + zoomlevel);
|
||||
base_context.line_to (radius + shadow_width - zoomlevel, radius + shadow_width + zoomlevel);
|
||||
base_context.close_path ();
|
||||
base_context.stroke ();
|
||||
|
||||
Gdk.cairo_set_source_rgba (base_context, bright_border_color);
|
||||
base_context.move_to (radius + shadow_width - zoomlevel + 1, radius + shadow_width - zoomlevel + 1);
|
||||
base_context.line_to (radius + shadow_width + zoomlevel - 1, radius + shadow_width - zoomlevel + 1);
|
||||
base_context.line_to (radius + shadow_width + zoomlevel - 1, radius + shadow_width + zoomlevel - 1);
|
||||
base_context.line_to (radius + shadow_width - zoomlevel + 1, radius + shadow_width + zoomlevel - 1);
|
||||
base_context.close_path ();
|
||||
base_context.stroke ();
|
||||
|
||||
|
||||
// turn the base surface into a pixbuf and thence a cursor
|
||||
var drawn_pb = Gdk.pixbuf_get_from_surface(base_surface, 0, 0, base_surface.get_width(), base_surface.get_height());
|
||||
var zoom_pb = drawn_pb.scale_simple(
|
||||
snapsize * zoomlevel, snapsize * zoomlevel, Gdk.InterpType.TILES);
|
||||
var magnifier = new Gdk.Cursor.from_pixbuf(
|
||||
get_screen ().get_display (),
|
||||
zoom_pb,
|
||||
zoom_pb.get_width() / 2,
|
||||
zoom_pb.get_height () / 2);
|
||||
|
||||
// Set the cursor
|
||||
var manager = Gdk.Display.get_default ().get_device_manager ();
|
||||
manager.get_client_pointer ().grab(
|
||||
get_window (),
|
||||
Gdk.GrabOwnership.APPLICATION,
|
||||
true,
|
||||
Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.SCROLL_MASK,
|
||||
magnifier,
|
||||
Gdk.CURRENT_TIME);
|
||||
}
|
||||
|
||||
|
||||
public Gdk.Pixbuf? snap (int x, int y, int w, int h) {
|
||||
Gdk.Screen screen;
|
||||
int t_x, t_y;
|
||||
Gdk.ModifierType mask;
|
||||
|
||||
var display=Gdk.Display.get_default();
|
||||
display.get_pointer (out screen, out t_x, out t_y, out mask);
|
||||
|
||||
var root = Gdk.get_default_root_window ();
|
||||
|
||||
var screenshot = Gdk.pixbuf_get_from_window (root, x, y, w, h);
|
||||
return screenshot;
|
||||
}
|
||||
|
||||
|
||||
public override bool key_press_event (Gdk.EventKey e) {
|
||||
@@ -100,6 +259,8 @@ namespace ColorPicker.Widgets {
|
||||
|
||||
public override void show_all () {
|
||||
base.show_all ();
|
||||
|
||||
|
||||
var manager = Gdk.Display.get_default ().get_device_manager ();
|
||||
var pointer = manager.get_client_pointer ();
|
||||
var keyboard = pointer.get_associated_device ();
|
||||
@@ -111,11 +272,14 @@ namespace ColorPicker.Widgets {
|
||||
Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.POINTER_MOTION_MASK,
|
||||
new Gdk.Cursor.for_display (window.get_display (), Gdk.CursorType.CROSSHAIR),
|
||||
Gtk.get_current_event_time ());
|
||||
|
||||
|
||||
if (status != Gdk.GrabStatus.SUCCESS) {
|
||||
pointer.ungrab (Gtk.get_current_event_time ());
|
||||
}
|
||||
|
||||
// show magnifier
|
||||
set_magnifier_cursor ();
|
||||
|
||||
if (keyboard != null) {
|
||||
status = keyboard.grab (window,
|
||||
Gdk.GrabOwnership.NONE,
|
||||
@@ -128,37 +292,16 @@ namespace ColorPicker.Widgets {
|
||||
keyboard.ungrab (Gtk.get_current_event_time ());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public new void close () {
|
||||
// save zoomlevel
|
||||
settings.zoomlevel = zoomlevel;
|
||||
|
||||
get_window ().set_cursor (null);
|
||||
base.close ();
|
||||
}
|
||||
|
||||
/*
|
||||
public override bool draw (Cairo.Context ctx) {
|
||||
if (!dragging) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int w = get_allocated_width ();
|
||||
int h = get_allocated_height ();
|
||||
|
||||
ctx.rectangle (0, 0, w, h);
|
||||
ctx.set_source_rgba (0.1, 0.1, 0.1, 0.2);
|
||||
ctx.fill ();
|
||||
|
||||
ctx.rectangle (0, 0, w, h);
|
||||
ctx.set_source_rgb (0.7, 0.7, 0.7);
|
||||
ctx.set_line_width (1.0);
|
||||
ctx.stroke ();
|
||||
|
||||
return base.draw (ctx);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user